wxt 0.7.0 → 0.7.1-alpha1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/cli.cjs +73 -29
- package/dist/client.d.ts +132 -4
- package/dist/client.js +131 -12
- package/dist/index.cjs +72 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +72 -28
- package/dist/index.js.map +1 -1
- package/dist/virtual-modules/content-script-entrypoint.js +12 -7
- package/dist/virtual-modules/content-script-entrypoint.js.map +1 -1
- package/package.json +4 -2
package/dist/cli.cjs
CHANGED
|
@@ -868,7 +868,7 @@ var require_merge_stream = __commonJS({
|
|
|
868
868
|
var import_cac = __toESM(require("cac"), 1);
|
|
869
869
|
|
|
870
870
|
// package.json
|
|
871
|
-
var version = "0.7.
|
|
871
|
+
var version = "0.7.1-alpha1";
|
|
872
872
|
|
|
873
873
|
// src/core/utils/getInternalConfig.ts
|
|
874
874
|
var import_c12 = require("c12");
|
|
@@ -2463,6 +2463,7 @@ async function getPackageJson(config) {
|
|
|
2463
2463
|
|
|
2464
2464
|
// src/core/utils/manifest.ts
|
|
2465
2465
|
var import_immer = require("immer");
|
|
2466
|
+
var vite4 = __toESM(require("vite"), 1);
|
|
2466
2467
|
async function writeManifest(manifest, output, config) {
|
|
2467
2468
|
const str = config.mode === "production" ? JSON.stringify(manifest) : JSON.stringify(manifest, null, 2);
|
|
2468
2469
|
await import_fs_extra12.default.ensureDir(config.outDir);
|
|
@@ -2477,18 +2478,20 @@ async function writeManifest(manifest, output, config) {
|
|
|
2477
2478
|
}
|
|
2478
2479
|
async function generateMainfest(entrypoints, buildOutput, config) {
|
|
2479
2480
|
const pkg = await getPackageJson(config);
|
|
2480
|
-
const
|
|
2481
|
-
|
|
2482
|
-
|
|
2483
|
-
|
|
2484
|
-
|
|
2485
|
-
|
|
2486
|
-
|
|
2487
|
-
|
|
2488
|
-
|
|
2489
|
-
|
|
2490
|
-
|
|
2491
|
-
|
|
2481
|
+
const baseManifest = {
|
|
2482
|
+
manifest_version: config.manifestVersion,
|
|
2483
|
+
name: pkg?.name,
|
|
2484
|
+
description: pkg?.description,
|
|
2485
|
+
version: pkg?.version && simplifyVersion(pkg.version),
|
|
2486
|
+
// Only add the version name to chromium and if the user hasn't specified a custom version.
|
|
2487
|
+
version_name: config.browser !== "firefox" && !config.manifest.version ? pkg?.version : void 0,
|
|
2488
|
+
short_name: pkg?.shortName,
|
|
2489
|
+
icons: discoverIcons(buildOutput)
|
|
2490
|
+
};
|
|
2491
|
+
const userManifest = config.manifest;
|
|
2492
|
+
const manifest = vite4.mergeConfig(
|
|
2493
|
+
baseManifest,
|
|
2494
|
+
userManifest
|
|
2492
2495
|
);
|
|
2493
2496
|
addEntrypoints(manifest, entrypoints, buildOutput, config);
|
|
2494
2497
|
if (config.command === "serve")
|
|
@@ -2658,6 +2661,7 @@ function addEntrypoints(manifest, entrypoints, buildOutput, config) {
|
|
|
2658
2661
|
}
|
|
2659
2662
|
}
|
|
2660
2663
|
if (contentScripts?.length) {
|
|
2664
|
+
const cssMap = getContentScriptsCssMap(buildOutput, contentScripts);
|
|
2661
2665
|
if (config.command === "serve" && config.manifestVersion === 3) {
|
|
2662
2666
|
const hostPermissions = new Set(manifest.host_permissions ?? []);
|
|
2663
2667
|
contentScripts.forEach((script) => {
|
|
@@ -2682,7 +2686,7 @@ function addEntrypoints(manifest, entrypoints, buildOutput, config) {
|
|
|
2682
2686
|
...mapWxtOptionsToContentScript(scripts[0].options),
|
|
2683
2687
|
// TOOD: Sorting css and js arrays here so we get consistent test results... but we
|
|
2684
2688
|
// shouldn't have to. Where is the inconsistency coming from?
|
|
2685
|
-
css: getContentScriptCssFiles(scripts,
|
|
2689
|
+
css: getContentScriptCssFiles(scripts, cssMap)?.sort(),
|
|
2686
2690
|
js: scripts.map(
|
|
2687
2691
|
(entry) => getEntrypointBundlePath(entry, config.outDir, ".js")
|
|
2688
2692
|
).sort()
|
|
@@ -2693,6 +2697,15 @@ function addEntrypoints(manifest, entrypoints, buildOutput, config) {
|
|
|
2693
2697
|
manifest.content_scripts.push(...newContentScripts);
|
|
2694
2698
|
}
|
|
2695
2699
|
}
|
|
2700
|
+
const contentScriptCssResources = getContentScriptCssWebAccessibleResources(
|
|
2701
|
+
config,
|
|
2702
|
+
contentScripts,
|
|
2703
|
+
cssMap
|
|
2704
|
+
);
|
|
2705
|
+
if (contentScriptCssResources.length > 0) {
|
|
2706
|
+
manifest.web_accessible_resources ??= [];
|
|
2707
|
+
manifest.web_accessible_resources.push(...contentScriptCssResources);
|
|
2708
|
+
}
|
|
2696
2709
|
}
|
|
2697
2710
|
}
|
|
2698
2711
|
function discoverIcons(buildOutput) {
|
|
@@ -2757,22 +2770,52 @@ function addDevModePermissions(manifest, config) {
|
|
|
2757
2770
|
if (config.manifestVersion === 3)
|
|
2758
2771
|
addPermission(manifest, "scripting");
|
|
2759
2772
|
}
|
|
2760
|
-
function getContentScriptCssFiles(contentScripts,
|
|
2773
|
+
function getContentScriptCssFiles(contentScripts, contentScriptCssMap) {
|
|
2761
2774
|
const css = [];
|
|
2762
|
-
const allChunks = buildOutput.steps.flatMap((step) => step.chunks);
|
|
2763
2775
|
contentScripts.forEach((script) => {
|
|
2764
|
-
if (script.options.cssInjectionMode === "manual")
|
|
2776
|
+
if (script.options.cssInjectionMode === "manual" || script.options.cssInjectionMode === "ui")
|
|
2765
2777
|
return;
|
|
2766
|
-
const
|
|
2767
|
-
|
|
2768
|
-
|
|
2769
|
-
if (
|
|
2770
|
-
css.push(
|
|
2778
|
+
const cssFile = contentScriptCssMap[script.name];
|
|
2779
|
+
if (cssFile == null)
|
|
2780
|
+
return;
|
|
2781
|
+
if (cssFile)
|
|
2782
|
+
css.push(cssFile);
|
|
2771
2783
|
});
|
|
2772
2784
|
if (css.length > 0)
|
|
2773
2785
|
return css;
|
|
2774
2786
|
return void 0;
|
|
2775
2787
|
}
|
|
2788
|
+
function getContentScriptCssWebAccessibleResources(config, contentScripts, contentScriptCssMap) {
|
|
2789
|
+
const resources = [];
|
|
2790
|
+
contentScripts.forEach((script) => {
|
|
2791
|
+
if (script.options.cssInjectionMode !== "ui")
|
|
2792
|
+
return;
|
|
2793
|
+
const cssFile = contentScriptCssMap[script.name];
|
|
2794
|
+
if (cssFile == null)
|
|
2795
|
+
return;
|
|
2796
|
+
if (config.manifestVersion === 2) {
|
|
2797
|
+
resources.push(cssFile);
|
|
2798
|
+
} else {
|
|
2799
|
+
resources.push({
|
|
2800
|
+
resources: [cssFile],
|
|
2801
|
+
matches: script.options.matches
|
|
2802
|
+
});
|
|
2803
|
+
}
|
|
2804
|
+
});
|
|
2805
|
+
return resources;
|
|
2806
|
+
}
|
|
2807
|
+
function getContentScriptsCssMap(buildOutput, scripts) {
|
|
2808
|
+
const map = {};
|
|
2809
|
+
const allChunks = buildOutput.steps.flatMap((step) => step.chunks);
|
|
2810
|
+
scripts.forEach((script) => {
|
|
2811
|
+
const relatedCss = allChunks.find(
|
|
2812
|
+
(chunk) => chunk.fileName === `content-scripts/${script.name}.css`
|
|
2813
|
+
);
|
|
2814
|
+
if (relatedCss != null)
|
|
2815
|
+
map[script.name] = relatedCss.fileName;
|
|
2816
|
+
});
|
|
2817
|
+
return map;
|
|
2818
|
+
}
|
|
2776
2819
|
function addPermission(manifest, permission) {
|
|
2777
2820
|
manifest.permissions ??= [];
|
|
2778
2821
|
if (manifest.permissions.includes(permission))
|
|
@@ -2788,7 +2831,7 @@ function addHostPermission(manifest, hostPermission) {
|
|
|
2788
2831
|
|
|
2789
2832
|
// src/core/build.ts
|
|
2790
2833
|
var import_picocolors3 = __toESM(require("picocolors"), 1);
|
|
2791
|
-
var
|
|
2834
|
+
var vite5 = __toESM(require("vite"), 1);
|
|
2792
2835
|
var import_fs_extra14 = __toESM(require("fs-extra"), 1);
|
|
2793
2836
|
|
|
2794
2837
|
// src/core/utils/groupEntrypoints.ts
|
|
@@ -4092,7 +4135,7 @@ async function buildInternal(config) {
|
|
|
4092
4135
|
const target = `${config.browser}-mv${config.manifestVersion}`;
|
|
4093
4136
|
config.logger.info(
|
|
4094
4137
|
`${verb} ${import_picocolors3.default.cyan(target)} for ${import_picocolors3.default.cyan(config.mode)} with ${import_picocolors3.default.green(
|
|
4095
|
-
`Vite ${
|
|
4138
|
+
`Vite ${vite5.version}`
|
|
4096
4139
|
)}`
|
|
4097
4140
|
);
|
|
4098
4141
|
const startTime = Date.now();
|
|
@@ -4170,7 +4213,7 @@ async function combineAnalysisStats(config) {
|
|
|
4170
4213
|
}
|
|
4171
4214
|
|
|
4172
4215
|
// src/core/server.ts
|
|
4173
|
-
var
|
|
4216
|
+
var vite6 = __toESM(require("vite"), 1);
|
|
4174
4217
|
|
|
4175
4218
|
// src/core/runners/wsl.ts
|
|
4176
4219
|
var import_node_path10 = require("path");
|
|
@@ -4315,8 +4358,8 @@ async function getServerInfo() {
|
|
|
4315
4358
|
}
|
|
4316
4359
|
async function setupServer(serverInfo, config) {
|
|
4317
4360
|
const runner = await createExtensionRunner(config);
|
|
4318
|
-
const viteServer = await
|
|
4319
|
-
|
|
4361
|
+
const viteServer = await vite6.createServer(
|
|
4362
|
+
vite6.mergeConfig(serverInfo, await config.vite(config.env))
|
|
4320
4363
|
);
|
|
4321
4364
|
const start = async () => {
|
|
4322
4365
|
await viteServer.listen(server.port);
|
|
@@ -4361,7 +4404,8 @@ function reloadContentScripts(steps, config, server) {
|
|
|
4361
4404
|
if (Array.isArray(entry) || entry.type !== "content-script")
|
|
4362
4405
|
return;
|
|
4363
4406
|
const js = [getEntrypointBundlePath(entry, config.outDir, ".js")];
|
|
4364
|
-
const
|
|
4407
|
+
const cssMap = getContentScriptsCssMap(server.currentOutput, [entry]);
|
|
4408
|
+
const css = getContentScriptCssFiles([entry], cssMap);
|
|
4365
4409
|
server.reloadContentScript({
|
|
4366
4410
|
allFrames: entry.options.allFrames,
|
|
4367
4411
|
excludeMatches: entry.options.excludeMatches,
|
|
@@ -4788,4 +4832,4 @@ cli.command("clean [root]", "clean generated files and caches").alias("cleanup")
|
|
|
4788
4832
|
cli.command("publish [root]", "publish to stores").action(publish);
|
|
4789
4833
|
cli.command("init [directory]", "initialize a new project").option("-t, --template <template>", "template to use").option("--pm <packageManager>", "which package manager to use").action(init);
|
|
4790
4834
|
cli.parse();
|
|
4791
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2lzZXhlQDIuMC4wL25vZGVfbW9kdWxlcy9pc2V4ZS93aW5kb3dzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9pc2V4ZUAyLjAuMC9ub2RlX21vZHVsZXMvaXNleGUvbW9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vaXNleGVAMi4wLjAvbm9kZV9tb2R1bGVzL2lzZXhlL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS93aGljaEAyLjAuMi9ub2RlX21vZHVsZXMvd2hpY2gvd2hpY2guanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3BhdGgta2V5QDMuMS4xL25vZGVfbW9kdWxlcy9wYXRoLWtleS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY3Jvc3Mtc3Bhd25ANy4wLjMvbm9kZV9tb2R1bGVzL2Nyb3NzLXNwYXduL2xpYi91dGlsL3Jlc29sdmVDb21tYW5kLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jcm9zcy1zcGF3bkA3LjAuMy9ub2RlX21vZHVsZXMvY3Jvc3Mtc3Bhd24vbGliL3V0aWwvZXNjYXBlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9zaGViYW5nLXJlZ2V4QDMuMC4wL25vZGVfbW9kdWxlcy9zaGViYW5nLXJlZ2V4L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9zaGViYW5nLWNvbW1hbmRAMi4wLjAvbm9kZV9tb2R1bGVzL3NoZWJhbmctY29tbWFuZC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY3Jvc3Mtc3Bhd25ANy4wLjMvbm9kZV9tb2R1bGVzL2Nyb3NzLXNwYXduL2xpYi91dGlsL3JlYWRTaGViYW5nLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jcm9zcy1zcGF3bkA3LjAuMy9ub2RlX21vZHVsZXMvY3Jvc3Mtc3Bhd24vbGliL3BhcnNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jcm9zcy1zcGF3bkA3LjAuMy9ub2RlX21vZHVsZXMvY3Jvc3Mtc3Bhd24vbGliL2Vub2VudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY3Jvc3Mtc3Bhd25ANy4wLjMvbm9kZV9tb2R1bGVzL2Nyb3NzLXNwYXduL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9zaWduYWwtZXhpdEAzLjAuNy9ub2RlX21vZHVsZXMvc2lnbmFsLWV4aXQvc2lnbmFscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vc2lnbmFsLWV4aXRAMy4wLjcvbm9kZV9tb2R1bGVzL3NpZ25hbC1leGl0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9nZXQtc3RyZWFtQDYuMC4xL25vZGVfbW9kdWxlcy9nZXQtc3RyZWFtL2J1ZmZlci1zdHJlYW0uanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2dldC1zdHJlYW1ANi4wLjEvbm9kZV9tb2R1bGVzL2dldC1zdHJlYW0vaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21lcmdlLXN0cmVhbUAyLjAuMC9ub2RlX21vZHVsZXMvbWVyZ2Utc3RyZWFtL2luZGV4LmpzIiwgIi4uL3NyYy9jbGkvaW5kZXgudHMiLCAiLi4vcGFja2FnZS5qc29uIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2dldEludGVybmFsQ29uZmlnLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2NyZWF0ZUZzQ2FjaGUudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZnMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZW50cnlwb2ludHMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvcGF0aHMudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL2Rldkh0bWxQcmVyZW5kZXIudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL2RldlNlcnZlckdsb2JhbHMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvbmV0d29yay50cyIsICIuLi9zcmMvY29yZS91dGlscy9wcm9taXNlcy50cyIsICIuLi9zcmMvY29yZS92aXRlLXBsdWdpbnMvZG93bmxvYWQudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL211bHRpcGFnZU1vdmUudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL3VuaW1wb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2F1dG8taW1wb3J0cy50cyIsICIuLi9zcmMvY29yZS92aXRlLXBsdWdpbnMvdmlydHVhbEVudHJ5cG9pbnQudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL3RzY29uZmlnUGF0aHMudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL25vb3BCYWNrZ3JvdW5kLnRzIiwgIi4uL3NyYy9jb3JlL3ZpdGUtcGx1Z2lucy9jc3NFbnRyeXBvaW50cy50cyIsICIuLi9zcmMvY29yZS92aXRlLXBsdWdpbnMvYnVuZGxlQW5hbHlzaXMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZ2xvYmFscy50cyIsICIuLi9zcmMvaW5kZXgudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvYXJyYXlzLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2RldGVjdERldkNoYW5nZXMudHMiLCAiLi4vc3JjL2NvcmUvYnVpbGQvYnVpbGRFbnRyeXBvaW50cy50cyIsICIuLi9zcmMvY29yZS91dGlscy9yZW1vdmVFbXB0eURpcnMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvcHVibGljLnRzIiwgIi4uL3NyYy9jb3JlL2J1aWxkL2ZpbmRFbnRyeXBvaW50cy50cyIsICIuLi9zcmMvY29yZS91dGlscy9pbXBvcnRFbnRyeXBvaW50RmlsZS50cyIsICIuLi9zcmMvY29yZS91dGlscy9zdHJpbmdzLnRzIiwgIi4uL3NyYy9jb3JlL2J1aWxkL2dlbmVyYXRlVHlwZXNEaXIudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvaTE4bi50cyIsICIuLi9zcmMvY29yZS91dGlscy9tYW5pZmVzdC50cyIsICIuLi9zcmMvY29yZS91dGlscy9Db250ZW50U2VjdXJpdHlQb2xpY3kudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvY29udGVudC1zY3JpcHRzLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL3BhY2thZ2UudHMiLCAiLi4vc3JjL2NvcmUvYnVpbGQudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZ3JvdXBFbnRyeXBvaW50cy50cyIsICIuLi9zcmMvY29yZS91dGlscy9mb3JtYXREdXJhdGlvbi50cyIsICIuLi9zcmMvY29yZS9sb2cvcHJpbnRCdWlsZFN1bW1hcnkudHMiLCAiLi4vc3JjL2NvcmUvbG9nL3ByaW50RmlsZUxpc3QudHMiLCAiLi4vc3JjL2NvcmUvbG9nL3ByaW50VGFibGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2V4ZWNhQDcuMi4wL25vZGVfbW9kdWxlcy9leGVjYS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vc3RyaXAtZmluYWwtbmV3bGluZUAzLjAuMC9ub2RlX21vZHVsZXMvc3RyaXAtZmluYWwtbmV3bGluZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbnBtLXJ1bi1wYXRoQDUuMS4wL25vZGVfbW9kdWxlcy9ucG0tcnVuLXBhdGgvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3BhdGgta2V5QDQuMC4wL25vZGVfbW9kdWxlcy9wYXRoLWtleS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbWltaWMtZm5ANC4wLjAvbm9kZV9tb2R1bGVzL21pbWljLWZuL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9vbmV0aW1lQDYuMC4wL25vZGVfbW9kdWxlcy9vbmV0aW1lL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9leGVjYUA3LjIuMC9ub2RlX21vZHVsZXMvZXhlY2EvbGliL2Vycm9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9odW1hbi1zaWduYWxzQDQuMy4xL25vZGVfbW9kdWxlcy9odW1hbi1zaWduYWxzL2J1aWxkL3NyYy9tYWluLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9odW1hbi1zaWduYWxzQDQuMy4xL25vZGVfbW9kdWxlcy9odW1hbi1zaWduYWxzL2J1aWxkL3NyYy9yZWFsdGltZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vaHVtYW4tc2lnbmFsc0A0LjMuMS9ub2RlX21vZHVsZXMvaHVtYW4tc2lnbmFscy9idWlsZC9zcmMvc2lnbmFscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vaHVtYW4tc2lnbmFsc0A0LjMuMS9ub2RlX21vZHVsZXMvaHVtYW4tc2lnbmFscy9idWlsZC9zcmMvY29yZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vZXhlY2FANy4yLjAvbm9kZV9tb2R1bGVzL2V4ZWNhL2xpYi9zdGRpby5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vZXhlY2FANy4yLjAvbm9kZV9tb2R1bGVzL2V4ZWNhL2xpYi9raWxsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9leGVjYUA3LjIuMC9ub2RlX21vZHVsZXMvZXhlY2EvbGliL3BpcGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2lzLXN0cmVhbUAzLjAuMC9ub2RlX21vZHVsZXMvaXMtc3RyZWFtL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9leGVjYUA3LjIuMC9ub2RlX21vZHVsZXMvZXhlY2EvbGliL3N0cmVhbS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vZXhlY2FANy4yLjAvbm9kZV9tb2R1bGVzL2V4ZWNhL2xpYi9wcm9taXNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9leGVjYUA3LjIuMC9ub2RlX21vZHVsZXMvZXhlY2EvbGliL2NvbW1hbmQuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2V4ZWNhQDcuMi4wL25vZGVfbW9kdWxlcy9leGVjYS9saWIvdmVyYm9zZS5qcyIsICIuLi9zcmMvY29yZS9zZXJ2ZXIudHMiLCAiLi4vc3JjL2NvcmUvcnVubmVycy93c2wudHMiLCAiLi4vc3JjL2NvcmUvcnVubmVycy93ZWItZXh0LnRzIiwgIi4uL3NyYy9jb3JlL3J1bm5lcnMvc2FmYXJpLnRzIiwgIi4uL3NyYy9jb3JlL3J1bm5lcnMvbWFudWFsLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL3dzbC50cyIsICIuLi9zcmMvY29yZS9ydW5uZXJzL2luZGV4LnRzIiwgIi4uL3NyYy9jb3JlL2NsZWFuLnRzIiwgIi4uL3NyYy9jbGkvdXRpbHMvZGVmaW5lQ29tbWFuZC50cyIsICIuLi9zcmMvY29yZS9sb2cvcHJpbnRIZWFkZXIudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy9idWlsZC50cyIsICIuLi9zcmMvY2xpL2NvbW1hbmRzL2Rldi50cyIsICIuLi9zcmMvY2xpL2NvbW1hbmRzL2luaXQudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy9wcmVwYXJlLnRzIiwgIi4uL3NyYy9jbGkvY29tbWFuZHMvcHVibGlzaC50cyIsICIuLi9zcmMvY29yZS96aXAudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy96aXAudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy9jbGVhbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsibW9kdWxlLmV4cG9ydHMgPSBpc2V4ZVxuaXNleGUuc3luYyA9IHN5bmNcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKVxuXG5mdW5jdGlvbiBjaGVja1BhdGhFeHQgKHBhdGgsIG9wdGlvbnMpIHtcbiAgdmFyIHBhdGhleHQgPSBvcHRpb25zLnBhdGhFeHQgIT09IHVuZGVmaW5lZCA/XG4gICAgb3B0aW9ucy5wYXRoRXh0IDogcHJvY2Vzcy5lbnYuUEFUSEVYVFxuXG4gIGlmICghcGF0aGV4dCkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBwYXRoZXh0ID0gcGF0aGV4dC5zcGxpdCgnOycpXG4gIGlmIChwYXRoZXh0LmluZGV4T2YoJycpICE9PSAtMSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHAgPSBwYXRoZXh0W2ldLnRvTG93ZXJDYXNlKClcbiAgICBpZiAocCAmJiBwYXRoLnN1YnN0cigtcC5sZW5ndGgpLnRvTG93ZXJDYXNlKCkgPT09IHApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBjaGVja1N0YXQgKHN0YXQsIHBhdGgsIG9wdGlvbnMpIHtcbiAgaWYgKCFzdGF0LmlzU3ltYm9saWNMaW5rKCkgJiYgIXN0YXQuaXNGaWxlKCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gY2hlY2tQYXRoRXh0KHBhdGgsIG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIGlzZXhlIChwYXRoLCBvcHRpb25zLCBjYikge1xuICBmcy5zdGF0KHBhdGgsIGZ1bmN0aW9uIChlciwgc3RhdCkge1xuICAgIGNiKGVyLCBlciA/IGZhbHNlIDogY2hlY2tTdGF0KHN0YXQsIHBhdGgsIG9wdGlvbnMpKVxuICB9KVxufVxuXG5mdW5jdGlvbiBzeW5jIChwYXRoLCBvcHRpb25zKSB7XG4gIHJldHVybiBjaGVja1N0YXQoZnMuc3RhdFN5bmMocGF0aCksIHBhdGgsIG9wdGlvbnMpXG59XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBpc2V4ZVxuaXNleGUuc3luYyA9IHN5bmNcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKVxuXG5mdW5jdGlvbiBpc2V4ZSAocGF0aCwgb3B0aW9ucywgY2IpIHtcbiAgZnMuc3RhdChwYXRoLCBmdW5jdGlvbiAoZXIsIHN0YXQpIHtcbiAgICBjYihlciwgZXIgPyBmYWxzZSA6IGNoZWNrU3RhdChzdGF0LCBvcHRpb25zKSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gc3luYyAocGF0aCwgb3B0aW9ucykge1xuICByZXR1cm4gY2hlY2tTdGF0KGZzLnN0YXRTeW5jKHBhdGgpLCBvcHRpb25zKVxufVxuXG5mdW5jdGlvbiBjaGVja1N0YXQgKHN0YXQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHN0YXQuaXNGaWxlKCkgJiYgY2hlY2tNb2RlKHN0YXQsIG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIGNoZWNrTW9kZSAoc3RhdCwgb3B0aW9ucykge1xuICB2YXIgbW9kID0gc3RhdC5tb2RlXG4gIHZhciB1aWQgPSBzdGF0LnVpZFxuICB2YXIgZ2lkID0gc3RhdC5naWRcblxuICB2YXIgbXlVaWQgPSBvcHRpb25zLnVpZCAhPT0gdW5kZWZpbmVkID9cbiAgICBvcHRpb25zLnVpZCA6IHByb2Nlc3MuZ2V0dWlkICYmIHByb2Nlc3MuZ2V0dWlkKClcbiAgdmFyIG15R2lkID0gb3B0aW9ucy5naWQgIT09IHVuZGVmaW5lZCA/XG4gICAgb3B0aW9ucy5naWQgOiBwcm9jZXNzLmdldGdpZCAmJiBwcm9jZXNzLmdldGdpZCgpXG5cbiAgdmFyIHUgPSBwYXJzZUludCgnMTAwJywgOClcbiAgdmFyIGcgPSBwYXJzZUludCgnMDEwJywgOClcbiAgdmFyIG8gPSBwYXJzZUludCgnMDAxJywgOClcbiAgdmFyIHVnID0gdSB8IGdcblxuICB2YXIgcmV0ID0gKG1vZCAmIG8pIHx8XG4gICAgKG1vZCAmIGcpICYmIGdpZCA9PT0gbXlHaWQgfHxcbiAgICAobW9kICYgdSkgJiYgdWlkID09PSBteVVpZCB8fFxuICAgIChtb2QgJiB1ZykgJiYgbXlVaWQgPT09IDBcblxuICByZXR1cm4gcmV0XG59XG4iLCAidmFyIGZzID0gcmVxdWlyZSgnZnMnKVxudmFyIGNvcmVcbmlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInIHx8IGdsb2JhbC5URVNUSU5HX1dJTkRPV1MpIHtcbiAgY29yZSA9IHJlcXVpcmUoJy4vd2luZG93cy5qcycpXG59IGVsc2Uge1xuICBjb3JlID0gcmVxdWlyZSgnLi9tb2RlLmpzJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc2V4ZVxuaXNleGUuc3luYyA9IHN5bmNcblxuZnVuY3Rpb24gaXNleGUgKHBhdGgsIG9wdGlvbnMsIGNiKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSB7fVxuICB9XG5cbiAgaWYgKCFjYikge1xuICAgIGlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgbm90IHByb3ZpZGVkJylcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgaXNleGUocGF0aCwgb3B0aW9ucyB8fCB7fSwgZnVuY3Rpb24gKGVyLCBpcykge1xuICAgICAgICBpZiAoZXIpIHtcbiAgICAgICAgICByZWplY3QoZXIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZShpcylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgY29yZShwYXRoLCBvcHRpb25zIHx8IHt9LCBmdW5jdGlvbiAoZXIsIGlzKSB7XG4gICAgLy8gaWdub3JlIEVBQ0NFUyBiZWNhdXNlIHRoYXQganVzdCBtZWFucyB3ZSBhcmVuJ3QgYWxsb3dlZCB0byBydW4gaXRcbiAgICBpZiAoZXIpIHtcbiAgICAgIGlmIChlci5jb2RlID09PSAnRUFDQ0VTJyB8fCBvcHRpb25zICYmIG9wdGlvbnMuaWdub3JlRXJyb3JzKSB7XG4gICAgICAgIGVyID0gbnVsbFxuICAgICAgICBpcyA9IGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIGNiKGVyLCBpcylcbiAgfSlcbn1cblxuZnVuY3Rpb24gc3luYyAocGF0aCwgb3B0aW9ucykge1xuICAvLyBteSBraW5nZG9tIGZvciBhIGZpbHRlcmVkIGNhdGNoXG4gIHRyeSB7XG4gICAgcmV0dXJuIGNvcmUuc3luYyhwYXRoLCBvcHRpb25zIHx8IHt9KVxuICB9IGNhdGNoIChlcikge1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaWdub3JlRXJyb3JzIHx8IGVyLmNvZGUgPT09ICdFQUNDRVMnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJcbiAgICB9XG4gIH1cbn1cbiIsICJjb25zdCBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInIHx8XG4gICAgcHJvY2Vzcy5lbnYuT1NUWVBFID09PSAnY3lnd2luJyB8fFxuICAgIHByb2Nlc3MuZW52Lk9TVFlQRSA9PT0gJ21zeXMnXG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IENPTE9OID0gaXNXaW5kb3dzID8gJzsnIDogJzonXG5jb25zdCBpc2V4ZSA9IHJlcXVpcmUoJ2lzZXhlJylcblxuY29uc3QgZ2V0Tm90Rm91bmRFcnJvciA9IChjbWQpID0+XG4gIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBub3QgZm91bmQ6ICR7Y21kfWApLCB7IGNvZGU6ICdFTk9FTlQnIH0pXG5cbmNvbnN0IGdldFBhdGhJbmZvID0gKGNtZCwgb3B0KSA9PiB7XG4gIGNvbnN0IGNvbG9uID0gb3B0LmNvbG9uIHx8IENPTE9OXG5cbiAgLy8gSWYgaXQgaGFzIGEgc2xhc2gsIHRoZW4gd2UgZG9uJ3QgYm90aGVyIHNlYXJjaGluZyB0aGUgcGF0aGVudi5cbiAgLy8ganVzdCBjaGVjayB0aGUgZmlsZSBpdHNlbGYsIGFuZCB0aGF0J3MgaXQuXG4gIGNvbnN0IHBhdGhFbnYgPSBjbWQubWF0Y2goL1xcLy8pIHx8IGlzV2luZG93cyAmJiBjbWQubWF0Y2goL1xcXFwvKSA/IFsnJ11cbiAgICA6IChcbiAgICAgIFtcbiAgICAgICAgLy8gd2luZG93cyBhbHdheXMgY2hlY2tzIHRoZSBjd2QgZmlyc3RcbiAgICAgICAgLi4uKGlzV2luZG93cyA/IFtwcm9jZXNzLmN3ZCgpXSA6IFtdKSxcbiAgICAgICAgLi4uKG9wdC5wYXRoIHx8IHByb2Nlc3MuZW52LlBBVEggfHxcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogdmVyeSB1bnVzdWFsICovICcnKS5zcGxpdChjb2xvbiksXG4gICAgICBdXG4gICAgKVxuICBjb25zdCBwYXRoRXh0RXhlID0gaXNXaW5kb3dzXG4gICAgPyBvcHQucGF0aEV4dCB8fCBwcm9jZXNzLmVudi5QQVRIRVhUIHx8ICcuRVhFOy5DTUQ7LkJBVDsuQ09NJ1xuICAgIDogJydcbiAgY29uc3QgcGF0aEV4dCA9IGlzV2luZG93cyA/IHBhdGhFeHRFeGUuc3BsaXQoY29sb24pIDogWycnXVxuXG4gIGlmIChpc1dpbmRvd3MpIHtcbiAgICBpZiAoY21kLmluZGV4T2YoJy4nKSAhPT0gLTEgJiYgcGF0aEV4dFswXSAhPT0gJycpXG4gICAgICBwYXRoRXh0LnVuc2hpZnQoJycpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhdGhFbnYsXG4gICAgcGF0aEV4dCxcbiAgICBwYXRoRXh0RXhlLFxuICB9XG59XG5cbmNvbnN0IHdoaWNoID0gKGNtZCwgb3B0LCBjYikgPT4ge1xuICBpZiAodHlwZW9mIG9wdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gb3B0XG4gICAgb3B0ID0ge31cbiAgfVxuICBpZiAoIW9wdClcbiAgICBvcHQgPSB7fVxuXG4gIGNvbnN0IHsgcGF0aEVudiwgcGF0aEV4dCwgcGF0aEV4dEV4ZSB9ID0gZ2V0UGF0aEluZm8oY21kLCBvcHQpXG4gIGNvbnN0IGZvdW5kID0gW11cblxuICBjb25zdCBzdGVwID0gaSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaWYgKGkgPT09IHBhdGhFbnYubGVuZ3RoKVxuICAgICAgcmV0dXJuIG9wdC5hbGwgJiYgZm91bmQubGVuZ3RoID8gcmVzb2x2ZShmb3VuZClcbiAgICAgICAgOiByZWplY3QoZ2V0Tm90Rm91bmRFcnJvcihjbWQpKVxuXG4gICAgY29uc3QgcHBSYXcgPSBwYXRoRW52W2ldXG4gICAgY29uc3QgcGF0aFBhcnQgPSAvXlwiLipcIiQvLnRlc3QocHBSYXcpID8gcHBSYXcuc2xpY2UoMSwgLTEpIDogcHBSYXdcblxuICAgIGNvbnN0IHBDbWQgPSBwYXRoLmpvaW4ocGF0aFBhcnQsIGNtZClcbiAgICBjb25zdCBwID0gIXBhdGhQYXJ0ICYmIC9eXFwuW1xcXFxcXC9dLy50ZXN0KGNtZCkgPyBjbWQuc2xpY2UoMCwgMikgKyBwQ21kXG4gICAgICA6IHBDbWRcblxuICAgIHJlc29sdmUoc3ViU3RlcChwLCBpLCAwKSlcbiAgfSlcblxuICBjb25zdCBzdWJTdGVwID0gKHAsIGksIGlpKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaWYgKGlpID09PSBwYXRoRXh0Lmxlbmd0aClcbiAgICAgIHJldHVybiByZXNvbHZlKHN0ZXAoaSArIDEpKVxuICAgIGNvbnN0IGV4dCA9IHBhdGhFeHRbaWldXG4gICAgaXNleGUocCArIGV4dCwgeyBwYXRoRXh0OiBwYXRoRXh0RXhlIH0sIChlciwgaXMpID0+IHtcbiAgICAgIGlmICghZXIgJiYgaXMpIHtcbiAgICAgICAgaWYgKG9wdC5hbGwpXG4gICAgICAgICAgZm91bmQucHVzaChwICsgZXh0KVxuICAgICAgICBlbHNlXG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUocCArIGV4dClcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNvbHZlKHN1YlN0ZXAocCwgaSwgaWkgKyAxKSlcbiAgICB9KVxuICB9KVxuXG4gIHJldHVybiBjYiA/IHN0ZXAoMCkudGhlbihyZXMgPT4gY2IobnVsbCwgcmVzKSwgY2IpIDogc3RlcCgwKVxufVxuXG5jb25zdCB3aGljaFN5bmMgPSAoY21kLCBvcHQpID0+IHtcbiAgb3B0ID0gb3B0IHx8IHt9XG5cbiAgY29uc3QgeyBwYXRoRW52LCBwYXRoRXh0LCBwYXRoRXh0RXhlIH0gPSBnZXRQYXRoSW5mbyhjbWQsIG9wdClcbiAgY29uc3QgZm91bmQgPSBbXVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aEVudi5sZW5ndGg7IGkgKyspIHtcbiAgICBjb25zdCBwcFJhdyA9IHBhdGhFbnZbaV1cbiAgICBjb25zdCBwYXRoUGFydCA9IC9eXCIuKlwiJC8udGVzdChwcFJhdykgPyBwcFJhdy5zbGljZSgxLCAtMSkgOiBwcFJhd1xuXG4gICAgY29uc3QgcENtZCA9IHBhdGguam9pbihwYXRoUGFydCwgY21kKVxuICAgIGNvbnN0IHAgPSAhcGF0aFBhcnQgJiYgL15cXC5bXFxcXFxcL10vLnRlc3QoY21kKSA/IGNtZC5zbGljZSgwLCAyKSArIHBDbWRcbiAgICAgIDogcENtZFxuXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBwYXRoRXh0Lmxlbmd0aDsgaiArKykge1xuICAgICAgY29uc3QgY3VyID0gcCArIHBhdGhFeHRbal1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGlzID0gaXNleGUuc3luYyhjdXIsIHsgcGF0aEV4dDogcGF0aEV4dEV4ZSB9KVxuICAgICAgICBpZiAoaXMpIHtcbiAgICAgICAgICBpZiAob3B0LmFsbClcbiAgICAgICAgICAgIGZvdW5kLnB1c2goY3VyKVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBjdXJcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXgpIHt9XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdC5hbGwgJiYgZm91bmQubGVuZ3RoKVxuICAgIHJldHVybiBmb3VuZFxuXG4gIGlmIChvcHQubm90aHJvdylcbiAgICByZXR1cm4gbnVsbFxuXG4gIHRocm93IGdldE5vdEZvdW5kRXJyb3IoY21kKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdoaWNoXG53aGljaC5zeW5jID0gd2hpY2hTeW5jXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXRoS2V5ID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuXHRjb25zdCBlbnZpcm9ubWVudCA9IG9wdGlvbnMuZW52IHx8IHByb2Nlc3MuZW52O1xuXHRjb25zdCBwbGF0Zm9ybSA9IG9wdGlvbnMucGxhdGZvcm0gfHwgcHJvY2Vzcy5wbGF0Zm9ybTtcblxuXHRpZiAocGxhdGZvcm0gIT09ICd3aW4zMicpIHtcblx0XHRyZXR1cm4gJ1BBVEgnO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdC5rZXlzKGVudmlyb25tZW50KS5yZXZlcnNlKCkuZmluZChrZXkgPT4ga2V5LnRvVXBwZXJDYXNlKCkgPT09ICdQQVRIJykgfHwgJ1BhdGgnO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoS2V5O1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgZm9yIHRoZSBuZXh0IG1ham9yIHJlbGVhc2Vcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBwYXRoS2V5O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IHdoaWNoID0gcmVxdWlyZSgnd2hpY2gnKTtcbmNvbnN0IGdldFBhdGhLZXkgPSByZXF1aXJlKCdwYXRoLWtleScpO1xuXG5mdW5jdGlvbiByZXNvbHZlQ29tbWFuZEF0dGVtcHQocGFyc2VkLCB3aXRob3V0UGF0aEV4dCkge1xuICAgIGNvbnN0IGVudiA9IHBhcnNlZC5vcHRpb25zLmVudiB8fCBwcm9jZXNzLmVudjtcbiAgICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IGhhc0N1c3RvbUN3ZCA9IHBhcnNlZC5vcHRpb25zLmN3ZCAhPSBudWxsO1xuICAgIC8vIFdvcmtlciB0aHJlYWRzIGRvIG5vdCBoYXZlIHByb2Nlc3MuY2hkaXIoKVxuICAgIGNvbnN0IHNob3VsZFN3aXRjaEN3ZCA9IGhhc0N1c3RvbUN3ZCAmJiBwcm9jZXNzLmNoZGlyICE9PSB1bmRlZmluZWQgJiYgIXByb2Nlc3MuY2hkaXIuZGlzYWJsZWQ7XG5cbiAgICAvLyBJZiBhIGN1c3RvbSBgY3dkYCB3YXMgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgcHJvY2VzcyBjd2RcbiAgICAvLyBiZWNhdXNlIGB3aGljaGAgd2lsbCBkbyBzdGF0IGNhbGxzIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IGEgY3VzdG9tIGN3ZFxuICAgIGlmIChzaG91bGRTd2l0Y2hDd2QpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb2Nlc3MuY2hkaXIocGFyc2VkLm9wdGlvbnMuY3dkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvKiBFbXB0eSAqL1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHJlc29sdmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgcmVzb2x2ZWQgPSB3aGljaC5zeW5jKHBhcnNlZC5jb21tYW5kLCB7XG4gICAgICAgICAgICBwYXRoOiBlbnZbZ2V0UGF0aEtleSh7IGVudiB9KV0sXG4gICAgICAgICAgICBwYXRoRXh0OiB3aXRob3V0UGF0aEV4dCA/IHBhdGguZGVsaW1pdGVyIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8qIEVtcHR5ICovXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHNob3VsZFN3aXRjaEN3ZCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5jaGRpcihjd2QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgd2Ugc3VjY2Vzc2Z1bGx5IHJlc29sdmVkLCBlbnN1cmUgdGhhdCBhbiBhYnNvbHV0ZSBwYXRoIGlzIHJldHVybmVkXG4gICAgLy8gTm90ZSB0aGF0IHdoZW4gYSBjdXN0b20gYGN3ZGAgd2FzIHVzZWQsIHdlIG5lZWQgdG8gcmVzb2x2ZSB0byBhbiBhYnNvbHV0ZSBwYXRoIGJhc2VkIG9uIGl0XG4gICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICAgIHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKGhhc0N1c3RvbUN3ZCA/IHBhcnNlZC5vcHRpb25zLmN3ZCA6ICcnLCByZXNvbHZlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQ29tbWFuZChwYXJzZWQpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUNvbW1hbmRBdHRlbXB0KHBhcnNlZCkgfHwgcmVzb2x2ZUNvbW1hbmRBdHRlbXB0KHBhcnNlZCwgdHJ1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVzb2x2ZUNvbW1hbmQ7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vLyBTZWUgaHR0cDovL3d3dy5yb2J2YW5kZXJ3b3VkZS5jb20vZXNjYXBlY2hhcnMucGhwXG5jb25zdCBtZXRhQ2hhcnNSZWdFeHAgPSAvKFsoKVxcXVslIV5cImA8PiZ8OywgKj9dKS9nO1xuXG5mdW5jdGlvbiBlc2NhcGVDb21tYW5kKGFyZykge1xuICAgIC8vIEVzY2FwZSBtZXRhIGNoYXJzXG4gICAgYXJnID0gYXJnLnJlcGxhY2UobWV0YUNoYXJzUmVnRXhwLCAnXiQxJyk7XG5cbiAgICByZXR1cm4gYXJnO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVBcmd1bWVudChhcmcsIGRvdWJsZUVzY2FwZU1ldGFDaGFycykge1xuICAgIC8vIENvbnZlcnQgdG8gc3RyaW5nXG4gICAgYXJnID0gYCR7YXJnfWA7XG5cbiAgICAvLyBBbGdvcml0aG0gYmVsb3cgaXMgYmFzZWQgb24gaHR0cHM6Ly9xbnRtLm9yZy9jbWRcblxuICAgIC8vIFNlcXVlbmNlIG9mIGJhY2tzbGFzaGVzIGZvbGxvd2VkIGJ5IGEgZG91YmxlIHF1b3RlOlxuICAgIC8vIGRvdWJsZSB1cCBhbGwgdGhlIGJhY2tzbGFzaGVzIGFuZCBlc2NhcGUgdGhlIGRvdWJsZSBxdW90ZVxuICAgIGFyZyA9IGFyZy5yZXBsYWNlKC8oXFxcXCopXCIvZywgJyQxJDFcXFxcXCInKTtcblxuICAgIC8vIFNlcXVlbmNlIG9mIGJhY2tzbGFzaGVzIGZvbGxvd2VkIGJ5IHRoZSBlbmQgb2YgdGhlIHN0cmluZ1xuICAgIC8vICh3aGljaCB3aWxsIGJlY29tZSBhIGRvdWJsZSBxdW90ZSBsYXRlcik6XG4gICAgLy8gZG91YmxlIHVwIGFsbCB0aGUgYmFja3NsYXNoZXNcbiAgICBhcmcgPSBhcmcucmVwbGFjZSgvKFxcXFwqKSQvLCAnJDEkMScpO1xuXG4gICAgLy8gQWxsIG90aGVyIGJhY2tzbGFzaGVzIG9jY3VyIGxpdGVyYWxseVxuXG4gICAgLy8gUXVvdGUgdGhlIHdob2xlIHRoaW5nOlxuICAgIGFyZyA9IGBcIiR7YXJnfVwiYDtcblxuICAgIC8vIEVzY2FwZSBtZXRhIGNoYXJzXG4gICAgYXJnID0gYXJnLnJlcGxhY2UobWV0YUNoYXJzUmVnRXhwLCAnXiQxJyk7XG5cbiAgICAvLyBEb3VibGUgZXNjYXBlIG1ldGEgY2hhcnMgaWYgbmVjZXNzYXJ5XG4gICAgaWYgKGRvdWJsZUVzY2FwZU1ldGFDaGFycykge1xuICAgICAgICBhcmcgPSBhcmcucmVwbGFjZShtZXRhQ2hhcnNSZWdFeHAsICdeJDEnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJnO1xufVxuXG5tb2R1bGUuZXhwb3J0cy5jb21tYW5kID0gZXNjYXBlQ29tbWFuZDtcbm1vZHVsZS5leHBvcnRzLmFyZ3VtZW50ID0gZXNjYXBlQXJndW1lbnQ7XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSAvXiMhKC4qKS87XG4iLCAiJ3VzZSBzdHJpY3QnO1xuY29uc3Qgc2hlYmFuZ1JlZ2V4ID0gcmVxdWlyZSgnc2hlYmFuZy1yZWdleCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChzdHJpbmcgPSAnJykgPT4ge1xuXHRjb25zdCBtYXRjaCA9IHN0cmluZy5tYXRjaChzaGViYW5nUmVnZXgpO1xuXG5cdGlmICghbWF0Y2gpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGNvbnN0IFtwYXRoLCBhcmd1bWVudF0gPSBtYXRjaFswXS5yZXBsYWNlKC8jISA/LywgJycpLnNwbGl0KCcgJyk7XG5cdGNvbnN0IGJpbmFyeSA9IHBhdGguc3BsaXQoJy8nKS5wb3AoKTtcblxuXHRpZiAoYmluYXJ5ID09PSAnZW52Jykge1xuXHRcdHJldHVybiBhcmd1bWVudDtcblx0fVxuXG5cdHJldHVybiBhcmd1bWVudCA/IGAke2JpbmFyeX0gJHthcmd1bWVudH1gIDogYmluYXJ5O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHNoZWJhbmdDb21tYW5kID0gcmVxdWlyZSgnc2hlYmFuZy1jb21tYW5kJyk7XG5cbmZ1bmN0aW9uIHJlYWRTaGViYW5nKGNvbW1hbmQpIHtcbiAgICAvLyBSZWFkIHRoZSBmaXJzdCAxNTAgYnl0ZXMgZnJvbSB0aGUgZmlsZVxuICAgIGNvbnN0IHNpemUgPSAxNTA7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuXG4gICAgbGV0IGZkO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgZmQgPSBmcy5vcGVuU3luYyhjb21tYW5kLCAncicpO1xuICAgICAgICBmcy5yZWFkU3luYyhmZCwgYnVmZmVyLCAwLCBzaXplLCAwKTtcbiAgICAgICAgZnMuY2xvc2VTeW5jKGZkKTtcbiAgICB9IGNhdGNoIChlKSB7IC8qIEVtcHR5ICovIH1cblxuICAgIC8vIEF0dGVtcHQgdG8gZXh0cmFjdCBzaGViYW5nIChudWxsIGlzIHJldHVybmVkIGlmIG5vdCBhIHNoZWJhbmcpXG4gICAgcmV0dXJuIHNoZWJhbmdDb21tYW5kKGJ1ZmZlci50b1N0cmluZygpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWFkU2hlYmFuZztcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCByZXNvbHZlQ29tbWFuZCA9IHJlcXVpcmUoJy4vdXRpbC9yZXNvbHZlQ29tbWFuZCcpO1xuY29uc3QgZXNjYXBlID0gcmVxdWlyZSgnLi91dGlsL2VzY2FwZScpO1xuY29uc3QgcmVhZFNoZWJhbmcgPSByZXF1aXJlKCcuL3V0aWwvcmVhZFNoZWJhbmcnKTtcblxuY29uc3QgaXNXaW4gPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuY29uc3QgaXNFeGVjdXRhYmxlUmVnRXhwID0gL1xcLig/OmNvbXxleGUpJC9pO1xuY29uc3QgaXNDbWRTaGltUmVnRXhwID0gL25vZGVfbW9kdWxlc1tcXFxcL10uYmluW1xcXFwvXVteXFxcXC9dK1xcLmNtZCQvaTtcblxuZnVuY3Rpb24gZGV0ZWN0U2hlYmFuZyhwYXJzZWQpIHtcbiAgICBwYXJzZWQuZmlsZSA9IHJlc29sdmVDb21tYW5kKHBhcnNlZCk7XG5cbiAgICBjb25zdCBzaGViYW5nID0gcGFyc2VkLmZpbGUgJiYgcmVhZFNoZWJhbmcocGFyc2VkLmZpbGUpO1xuXG4gICAgaWYgKHNoZWJhbmcpIHtcbiAgICAgICAgcGFyc2VkLmFyZ3MudW5zaGlmdChwYXJzZWQuZmlsZSk7XG4gICAgICAgIHBhcnNlZC5jb21tYW5kID0gc2hlYmFuZztcblxuICAgICAgICByZXR1cm4gcmVzb2x2ZUNvbW1hbmQocGFyc2VkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkLmZpbGU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTm9uU2hlbGwocGFyc2VkKSB7XG4gICAgaWYgKCFpc1dpbikge1xuICAgICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cblxuICAgIC8vIERldGVjdCAmIGFkZCBzdXBwb3J0IGZvciBzaGViYW5nc1xuICAgIGNvbnN0IGNvbW1hbmRGaWxlID0gZGV0ZWN0U2hlYmFuZyhwYXJzZWQpO1xuXG4gICAgLy8gV2UgZG9uJ3QgbmVlZCBhIHNoZWxsIGlmIHRoZSBjb21tYW5kIGZpbGVuYW1lIGlzIGFuIGV4ZWN1dGFibGVcbiAgICBjb25zdCBuZWVkc1NoZWxsID0gIWlzRXhlY3V0YWJsZVJlZ0V4cC50ZXN0KGNvbW1hbmRGaWxlKTtcblxuICAgIC8vIElmIGEgc2hlbGwgaXMgcmVxdWlyZWQsIHVzZSBjbWQuZXhlIGFuZCB0YWtlIGNhcmUgb2YgZXNjYXBpbmcgZXZlcnl0aGluZyBjb3JyZWN0bHlcbiAgICAvLyBOb3RlIHRoYXQgYGZvcmNlU2hlbGxgIGlzIGFuIGhpZGRlbiBvcHRpb24gdXNlZCBvbmx5IGluIHRlc3RzXG4gICAgaWYgKHBhcnNlZC5vcHRpb25zLmZvcmNlU2hlbGwgfHwgbmVlZHNTaGVsbCkge1xuICAgICAgICAvLyBOZWVkIHRvIGRvdWJsZSBlc2NhcGUgbWV0YSBjaGFycyBpZiB0aGUgY29tbWFuZCBpcyBhIGNtZC1zaGltIGxvY2F0ZWQgaW4gYG5vZGVfbW9kdWxlcy8uYmluL2BcbiAgICAgICAgLy8gVGhlIGNtZC1zaGltIHNpbXBseSBjYWxscyBleGVjdXRlIHRoZSBwYWNrYWdlIGJpbiBmaWxlIHdpdGggTm9kZUpTLCBwcm94eWluZyBhbnkgYXJndW1lbnRcbiAgICAgICAgLy8gQmVjYXVzZSB0aGUgZXNjYXBlIG9mIG1ldGFjaGFycyB3aXRoIF4gZ2V0cyBpbnRlcnByZXRlZCB3aGVuIHRoZSBjbWQuZXhlIGlzIGZpcnN0IGNhbGxlZCxcbiAgICAgICAgLy8gd2UgbmVlZCB0byBkb3VibGUgZXNjYXBlIHRoZW1cbiAgICAgICAgY29uc3QgbmVlZHNEb3VibGVFc2NhcGVNZXRhQ2hhcnMgPSBpc0NtZFNoaW1SZWdFeHAudGVzdChjb21tYW5kRmlsZSk7XG5cbiAgICAgICAgLy8gTm9ybWFsaXplIHBvc2l4IHBhdGhzIGludG8gT1MgY29tcGF0aWJsZSBwYXRocyAoZS5nLjogZm9vL2JhciAtPiBmb29cXGJhcilcbiAgICAgICAgLy8gVGhpcyBpcyBuZWNlc3Nhcnkgb3RoZXJ3aXNlIGl0IHdpbGwgYWx3YXlzIGZhaWwgd2l0aCBFTk9FTlQgaW4gdGhvc2UgY2FzZXNcbiAgICAgICAgcGFyc2VkLmNvbW1hbmQgPSBwYXRoLm5vcm1hbGl6ZShwYXJzZWQuY29tbWFuZCk7XG5cbiAgICAgICAgLy8gRXNjYXBlIGNvbW1hbmQgJiBhcmd1bWVudHNcbiAgICAgICAgcGFyc2VkLmNvbW1hbmQgPSBlc2NhcGUuY29tbWFuZChwYXJzZWQuY29tbWFuZCk7XG4gICAgICAgIHBhcnNlZC5hcmdzID0gcGFyc2VkLmFyZ3MubWFwKChhcmcpID0+IGVzY2FwZS5hcmd1bWVudChhcmcsIG5lZWRzRG91YmxlRXNjYXBlTWV0YUNoYXJzKSk7XG5cbiAgICAgICAgY29uc3Qgc2hlbGxDb21tYW5kID0gW3BhcnNlZC5jb21tYW5kXS5jb25jYXQocGFyc2VkLmFyZ3MpLmpvaW4oJyAnKTtcblxuICAgICAgICBwYXJzZWQuYXJncyA9IFsnL2QnLCAnL3MnLCAnL2MnLCBgXCIke3NoZWxsQ29tbWFuZH1cImBdO1xuICAgICAgICBwYXJzZWQuY29tbWFuZCA9IHByb2Nlc3MuZW52LmNvbXNwZWMgfHwgJ2NtZC5leGUnO1xuICAgICAgICBwYXJzZWQub3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHMgPSB0cnVlOyAvLyBUZWxsIG5vZGUncyBzcGF3biB0aGF0IHRoZSBhcmd1bWVudHMgYXJlIGFscmVhZHkgZXNjYXBlZFxuICAgIH1cblxuICAgIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlKGNvbW1hbmQsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICAvLyBOb3JtYWxpemUgYXJndW1lbnRzLCBzaW1pbGFyIHRvIG5vZGVqc1xuICAgIGlmIChhcmdzICYmICFBcnJheS5pc0FycmF5KGFyZ3MpKSB7XG4gICAgICAgIG9wdGlvbnMgPSBhcmdzO1xuICAgICAgICBhcmdzID0gbnVsbDtcbiAgICB9XG5cbiAgICBhcmdzID0gYXJncyA/IGFyZ3Muc2xpY2UoMCkgOiBbXTsgLy8gQ2xvbmUgYXJyYXkgdG8gYXZvaWQgY2hhbmdpbmcgdGhlIG9yaWdpbmFsXG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpOyAvLyBDbG9uZSBvYmplY3QgdG8gYXZvaWQgY2hhbmdpbmcgdGhlIG9yaWdpbmFsXG5cbiAgICAvLyBCdWlsZCBvdXIgcGFyc2VkIG9iamVjdFxuICAgIGNvbnN0IHBhcnNlZCA9IHtcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgYXJncyxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgZmlsZTogdW5kZWZpbmVkLFxuICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIERlbGVnYXRlIGZ1cnRoZXIgcGFyc2luZyB0byBzaGVsbCBvciBub24tc2hlbGxcbiAgICByZXR1cm4gb3B0aW9ucy5zaGVsbCA/IHBhcnNlZCA6IHBhcnNlTm9uU2hlbGwocGFyc2VkKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzV2luID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcblxuZnVuY3Rpb24gbm90Rm91bmRFcnJvcihvcmlnaW5hbCwgc3lzY2FsbCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgJHtzeXNjYWxsfSAke29yaWdpbmFsLmNvbW1hbmR9IEVOT0VOVGApLCB7XG4gICAgICAgIGNvZGU6ICdFTk9FTlQnLFxuICAgICAgICBlcnJubzogJ0VOT0VOVCcsXG4gICAgICAgIHN5c2NhbGw6IGAke3N5c2NhbGx9ICR7b3JpZ2luYWwuY29tbWFuZH1gLFxuICAgICAgICBwYXRoOiBvcmlnaW5hbC5jb21tYW5kLFxuICAgICAgICBzcGF3bmFyZ3M6IG9yaWdpbmFsLmFyZ3MsXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGhvb2tDaGlsZFByb2Nlc3MoY3AsIHBhcnNlZCkge1xuICAgIGlmICghaXNXaW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsRW1pdCA9IGNwLmVtaXQ7XG5cbiAgICBjcC5lbWl0ID0gZnVuY3Rpb24gKG5hbWUsIGFyZzEpIHtcbiAgICAgICAgLy8gSWYgZW1pdHRpbmcgXCJleGl0XCIgZXZlbnQgYW5kIGV4aXQgY29kZSBpcyAxLCB3ZSBuZWVkIHRvIGNoZWNrIGlmXG4gICAgICAgIC8vIHRoZSBjb21tYW5kIGV4aXN0cyBhbmQgZW1pdCBhbiBcImVycm9yXCIgaW5zdGVhZFxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0luZGlnb1VuaXRlZC9ub2RlLWNyb3NzLXNwYXduL2lzc3Vlcy8xNlxuICAgICAgICBpZiAobmFtZSA9PT0gJ2V4aXQnKSB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSB2ZXJpZnlFTk9FTlQoYXJnMSwgcGFyc2VkLCAnc3Bhd24nKTtcblxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEVtaXQuY2FsbChjcCwgJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcmlnaW5hbEVtaXQuYXBwbHkoY3AsIGFyZ3VtZW50cyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5RU5PRU5UKHN0YXR1cywgcGFyc2VkKSB7XG4gICAgaWYgKGlzV2luICYmIHN0YXR1cyA9PT0gMSAmJiAhcGFyc2VkLmZpbGUpIHtcbiAgICAgICAgcmV0dXJuIG5vdEZvdW5kRXJyb3IocGFyc2VkLm9yaWdpbmFsLCAnc3Bhd24nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5RU5PRU5UU3luYyhzdGF0dXMsIHBhcnNlZCkge1xuICAgIGlmIChpc1dpbiAmJiBzdGF0dXMgPT09IDEgJiYgIXBhcnNlZC5maWxlKSB7XG4gICAgICAgIHJldHVybiBub3RGb3VuZEVycm9yKHBhcnNlZC5vcmlnaW5hbCwgJ3NwYXduU3luYycpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBob29rQ2hpbGRQcm9jZXNzLFxuICAgIHZlcmlmeUVOT0VOVCxcbiAgICB2ZXJpZnlFTk9FTlRTeW5jLFxuICAgIG5vdEZvdW5kRXJyb3IsXG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgY3AgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7XG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vbGliL3BhcnNlJyk7XG5jb25zdCBlbm9lbnQgPSByZXF1aXJlKCcuL2xpYi9lbm9lbnQnKTtcblxuZnVuY3Rpb24gc3Bhd24oY29tbWFuZCwgYXJncywgb3B0aW9ucykge1xuICAgIC8vIFBhcnNlIHRoZSBhcmd1bWVudHNcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZShjb21tYW5kLCBhcmdzLCBvcHRpb25zKTtcblxuICAgIC8vIFNwYXduIHRoZSBjaGlsZCBwcm9jZXNzXG4gICAgY29uc3Qgc3Bhd25lZCA9IGNwLnNwYXduKHBhcnNlZC5jb21tYW5kLCBwYXJzZWQuYXJncywgcGFyc2VkLm9wdGlvbnMpO1xuXG4gICAgLy8gSG9vayBpbnRvIGNoaWxkIHByb2Nlc3MgXCJleGl0XCIgZXZlbnQgdG8gZW1pdCBhbiBlcnJvciBpZiB0aGUgY29tbWFuZFxuICAgIC8vIGRvZXMgbm90IGV4aXN0cywgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vSW5kaWdvVW5pdGVkL25vZGUtY3Jvc3Mtc3Bhd24vaXNzdWVzLzE2XG4gICAgZW5vZW50Lmhvb2tDaGlsZFByb2Nlc3Moc3Bhd25lZCwgcGFyc2VkKTtcblxuICAgIHJldHVybiBzcGF3bmVkO1xufVxuXG5mdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZCwgYXJncywgb3B0aW9ucykge1xuICAgIC8vIFBhcnNlIHRoZSBhcmd1bWVudHNcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZShjb21tYW5kLCBhcmdzLCBvcHRpb25zKTtcblxuICAgIC8vIFNwYXduIHRoZSBjaGlsZCBwcm9jZXNzXG4gICAgY29uc3QgcmVzdWx0ID0gY3Auc3Bhd25TeW5jKHBhcnNlZC5jb21tYW5kLCBwYXJzZWQuYXJncywgcGFyc2VkLm9wdGlvbnMpO1xuXG4gICAgLy8gQW5hbHl6ZSBpZiB0aGUgY29tbWFuZCBkb2VzIG5vdCBleGlzdCwgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vSW5kaWdvVW5pdGVkL25vZGUtY3Jvc3Mtc3Bhd24vaXNzdWVzLzE2XG4gICAgcmVzdWx0LmVycm9yID0gcmVzdWx0LmVycm9yIHx8IGVub2VudC52ZXJpZnlFTk9FTlRTeW5jKHJlc3VsdC5zdGF0dXMsIHBhcnNlZCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNwYXduO1xubW9kdWxlLmV4cG9ydHMuc3Bhd24gPSBzcGF3bjtcbm1vZHVsZS5leHBvcnRzLnN5bmMgPSBzcGF3blN5bmM7XG5cbm1vZHVsZS5leHBvcnRzLl9wYXJzZSA9IHBhcnNlO1xubW9kdWxlLmV4cG9ydHMuX2Vub2VudCA9IGVub2VudDtcbiIsICIvLyBUaGlzIGlzIG5vdCB0aGUgc2V0IG9mIGFsbCBwb3NzaWJsZSBzaWduYWxzLlxuLy9cbi8vIEl0IElTLCBob3dldmVyLCB0aGUgc2V0IG9mIGFsbCBzaWduYWxzIHRoYXQgdHJpZ2dlclxuLy8gYW4gZXhpdCBvbiBlaXRoZXIgTGludXggb3IgQlNEIHN5c3RlbXMuICBMaW51eCBpcyBhXG4vLyBzdXBlcnNldCBvZiB0aGUgc2lnbmFsIG5hbWVzIHN1cHBvcnRlZCBvbiBCU0QsIGFuZFxuLy8gdGhlIHVua25vd24gc2lnbmFscyBqdXN0IGZhaWwgdG8gcmVnaXN0ZXIsIHNvIHdlIGNhblxuLy8gY2F0Y2ggdGhhdCBlYXNpbHkgZW5vdWdoLlxuLy9cbi8vIERvbid0IGJvdGhlciB3aXRoIFNJR0tJTEwuICBJdCdzIHVuY2F0Y2hhYmxlLCB3aGljaFxuLy8gbWVhbnMgdGhhdCB3ZSBjYW4ndCBmaXJlIGFueSBjYWxsYmFja3MgYW55d2F5LlxuLy9cbi8vIElmIGEgdXNlciBkb2VzIGhhcHBlbiB0byByZWdpc3RlciBhIGhhbmRsZXIgb24gYSBub24tXG4vLyBmYXRhbCBzaWduYWwgbGlrZSBTSUdXSU5DSCBvciBzb21ldGhpbmcsIGFuZCB0aGVuXG4vLyBleGl0LCBpdCdsbCBlbmQgdXAgZmlyaW5nIGBwcm9jZXNzLmVtaXQoJ2V4aXQnKWAsIHNvXG4vLyB0aGUgaGFuZGxlciB3aWxsIGJlIGZpcmVkIGFueXdheS5cbi8vXG4vLyBTSUdCVVMsIFNJR0ZQRSwgU0lHU0VHViBhbmQgU0lHSUxMLCB3aGVuIG5vdCByYWlzZWRcbi8vIGFydGlmaWNpYWxseSwgaW5oZXJlbnRseSBsZWF2ZSB0aGUgcHJvY2VzcyBpbiBhXG4vLyBzdGF0ZSBmcm9tIHdoaWNoIGl0IGlzIG5vdCBzYWZlIHRvIHRyeSBhbmQgZW50ZXIgSlNcbi8vIGxpc3RlbmVycy5cbm1vZHVsZS5leHBvcnRzID0gW1xuICAnU0lHQUJSVCcsXG4gICdTSUdBTFJNJyxcbiAgJ1NJR0hVUCcsXG4gICdTSUdJTlQnLFxuICAnU0lHVEVSTSdcbl1cblxuaWYgKHByb2Nlc3MucGxhdGZvcm0gIT09ICd3aW4zMicpIHtcbiAgbW9kdWxlLmV4cG9ydHMucHVzaChcbiAgICAnU0lHVlRBTFJNJyxcbiAgICAnU0lHWENQVScsXG4gICAgJ1NJR1hGU1onLFxuICAgICdTSUdVU1IyJyxcbiAgICAnU0lHVFJBUCcsXG4gICAgJ1NJR1NZUycsXG4gICAgJ1NJR1FVSVQnLFxuICAgICdTSUdJT1QnXG4gICAgLy8gc2hvdWxkIGRldGVjdCBwcm9maWxlciBhbmQgZW5hYmxlL2Rpc2FibGUgYWNjb3JkaW5nbHkuXG4gICAgLy8gc2VlICMyMVxuICAgIC8vICdTSUdQUk9GJ1xuICApXG59XG5cbmlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnKSB7XG4gIG1vZHVsZS5leHBvcnRzLnB1c2goXG4gICAgJ1NJR0lPJyxcbiAgICAnU0lHUE9MTCcsXG4gICAgJ1NJR1BXUicsXG4gICAgJ1NJR1NUS0ZMVCcsXG4gICAgJ1NJR1VOVVNFRCdcbiAgKVxufVxuIiwgIi8vIE5vdGU6IHNpbmNlIG55YyB1c2VzIHRoaXMgbW9kdWxlIHRvIG91dHB1dCBjb3ZlcmFnZSwgYW55IGxpbmVzXG4vLyB0aGF0IGFyZSBpbiB0aGUgZGlyZWN0IHN5bmMgZmxvdyBvZiBueWMncyBvdXRwdXRDb3ZlcmFnZSBhcmVcbi8vIGlnbm9yZWQsIHNpbmNlIHdlIGNhbiBuZXZlciBnZXQgY292ZXJhZ2UgZm9yIHRoZW0uXG4vLyBncmFiIGEgcmVmZXJlbmNlIHRvIG5vZGUncyByZWFsIHByb2Nlc3Mgb2JqZWN0IHJpZ2h0IGF3YXlcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3NcblxuY29uc3QgcHJvY2Vzc09rID0gZnVuY3Rpb24gKHByb2Nlc3MpIHtcbiAgcmV0dXJuIHByb2Nlc3MgJiZcbiAgICB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBwcm9jZXNzLmVtaXQgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgcHJvY2Vzcy5yZWFsbHlFeGl0ID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIHByb2Nlc3MubGlzdGVuZXJzID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIHByb2Nlc3Mua2lsbCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBwcm9jZXNzLnBpZCA9PT0gJ251bWJlcicgJiZcbiAgICB0eXBlb2YgcHJvY2Vzcy5vbiA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG4vLyBzb21lIGtpbmQgb2Ygbm9uLW5vZGUgZW52aXJvbm1lbnQsIGp1c3Qgbm8tb3Bcbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKCFwcm9jZXNzT2socHJvY2VzcykpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHt9XG4gIH1cbn0gZWxzZSB7XG4gIHZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuICB2YXIgc2lnbmFscyA9IHJlcXVpcmUoJy4vc2lnbmFscy5qcycpXG4gIHZhciBpc1dpbiA9IC9ed2luL2kudGVzdChwcm9jZXNzLnBsYXRmb3JtKVxuXG4gIHZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZW9mIEVFICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgRUUgPSBFRS5FdmVudEVtaXR0ZXJcbiAgfVxuXG4gIHZhciBlbWl0dGVyXG4gIGlmIChwcm9jZXNzLl9fc2lnbmFsX2V4aXRfZW1pdHRlcl9fKSB7XG4gICAgZW1pdHRlciA9IHByb2Nlc3MuX19zaWduYWxfZXhpdF9lbWl0dGVyX19cbiAgfSBlbHNlIHtcbiAgICBlbWl0dGVyID0gcHJvY2Vzcy5fX3NpZ25hbF9leGl0X2VtaXR0ZXJfXyA9IG5ldyBFRSgpXG4gICAgZW1pdHRlci5jb3VudCA9IDBcbiAgICBlbWl0dGVyLmVtaXR0ZWQgPSB7fVxuICB9XG5cbiAgLy8gQmVjYXVzZSB0aGlzIGVtaXR0ZXIgaXMgYSBnbG9iYWwsIHdlIGhhdmUgdG8gY2hlY2sgdG8gc2VlIGlmIGFcbiAgLy8gcHJldmlvdXMgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnkgZmFpbGVkIHRvIGVuYWJsZSBpbmZpbml0ZSBsaXN0ZW5lcnMuXG4gIC8vIEkga25vdyB3aGF0IHlvdSdyZSBhYm91dCB0byBzYXkuICBCdXQgbGl0ZXJhbGx5IGV2ZXJ5dGhpbmcgYWJvdXRcbiAgLy8gc2lnbmFsLWV4aXQgaXMgYSBjb21wcm9taXNlIHdpdGggZXZpbC4gIEdldCB1c2VkIHRvIGl0LlxuICBpZiAoIWVtaXR0ZXIuaW5maW5pdGUpIHtcbiAgICBlbWl0dGVyLnNldE1heExpc3RlbmVycyhJbmZpbml0eSlcbiAgICBlbWl0dGVyLmluZmluaXRlID0gdHJ1ZVxuICB9XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY2IsIG9wdHMpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIXByb2Nlc3NPayhnbG9iYWwucHJvY2VzcykpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7fVxuICAgIH1cbiAgICBhc3NlcnQuZXF1YWwodHlwZW9mIGNiLCAnZnVuY3Rpb24nLCAnYSBjYWxsYmFjayBtdXN0IGJlIHByb3ZpZGVkIGZvciBleGl0IGhhbmRsZXInKVxuXG4gICAgaWYgKGxvYWRlZCA9PT0gZmFsc2UpIHtcbiAgICAgIGxvYWQoKVxuICAgIH1cblxuICAgIHZhciBldiA9ICdleGl0J1xuICAgIGlmIChvcHRzICYmIG9wdHMuYWx3YXlzTGFzdCkge1xuICAgICAgZXYgPSAnYWZ0ZXJleGl0J1xuICAgIH1cblxuICAgIHZhciByZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKGV2LCBjYilcbiAgICAgIGlmIChlbWl0dGVyLmxpc3RlbmVycygnZXhpdCcpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgIGVtaXR0ZXIubGlzdGVuZXJzKCdhZnRlcmV4aXQnKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdW5sb2FkKClcbiAgICAgIH1cbiAgICB9XG4gICAgZW1pdHRlci5vbihldiwgY2IpXG5cbiAgICByZXR1cm4gcmVtb3ZlXG4gIH1cblxuICB2YXIgdW5sb2FkID0gZnVuY3Rpb24gdW5sb2FkICgpIHtcbiAgICBpZiAoIWxvYWRlZCB8fCAhcHJvY2Vzc09rKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGxvYWRlZCA9IGZhbHNlXG5cbiAgICBzaWduYWxzLmZvckVhY2goZnVuY3Rpb24gKHNpZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihzaWcsIHNpZ0xpc3RlbmVyc1tzaWddKVxuICAgICAgfSBjYXRjaCAoZXIpIHt9XG4gICAgfSlcbiAgICBwcm9jZXNzLmVtaXQgPSBvcmlnaW5hbFByb2Nlc3NFbWl0XG4gICAgcHJvY2Vzcy5yZWFsbHlFeGl0ID0gb3JpZ2luYWxQcm9jZXNzUmVhbGx5RXhpdFxuICAgIGVtaXR0ZXIuY291bnQgLT0gMVxuICB9XG4gIG1vZHVsZS5leHBvcnRzLnVubG9hZCA9IHVubG9hZFxuXG4gIHZhciBlbWl0ID0gZnVuY3Rpb24gZW1pdCAoZXZlbnQsIGNvZGUsIHNpZ25hbCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChlbWl0dGVyLmVtaXR0ZWRbZXZlbnRdKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgZW1pdHRlci5lbWl0dGVkW2V2ZW50XSA9IHRydWVcbiAgICBlbWl0dGVyLmVtaXQoZXZlbnQsIGNvZGUsIHNpZ25hbClcbiAgfVxuXG4gIC8vIHsgPHNpZ25hbD46IDxsaXN0ZW5lciBmbj4sIC4uLiB9XG4gIHZhciBzaWdMaXN0ZW5lcnMgPSB7fVxuICBzaWduYWxzLmZvckVhY2goZnVuY3Rpb24gKHNpZykge1xuICAgIHNpZ0xpc3RlbmVyc1tzaWddID0gZnVuY3Rpb24gbGlzdGVuZXIgKCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoIXByb2Nlc3NPayhnbG9iYWwucHJvY2VzcykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gb3RoZXIgbGlzdGVuZXJzLCBhbiBleGl0IGlzIGNvbWluZyFcbiAgICAgIC8vIFNpbXBsZXN0IHdheTogcmVtb3ZlIHVzIGFuZCB0aGVuIHJlLXNlbmQgdGhlIHNpZ25hbC5cbiAgICAgIC8vIFdlIGtub3cgdGhhdCB0aGlzIHdpbGwga2lsbCB0aGUgcHJvY2Vzcywgc28gd2UgY2FuXG4gICAgICAvLyBzYWZlbHkgZW1pdCBub3cuXG4gICAgICB2YXIgbGlzdGVuZXJzID0gcHJvY2Vzcy5saXN0ZW5lcnMoc2lnKVxuICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IGVtaXR0ZXIuY291bnQpIHtcbiAgICAgICAgdW5sb2FkKClcbiAgICAgICAgZW1pdCgnZXhpdCcsIG51bGwsIHNpZylcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZW1pdCgnYWZ0ZXJleGl0JywgbnVsbCwgc2lnKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBpZiAoaXNXaW4gJiYgc2lnID09PSAnU0lHSFVQJykge1xuICAgICAgICAgIC8vIFwiU0lHSFVQXCIgdGhyb3dzIGFuIGBFTk9TWVNgIGVycm9yIG9uIFdpbmRvd3MsXG4gICAgICAgICAgLy8gc28gdXNlIGEgc3VwcG9ydGVkIHNpZ25hbCBpbnN0ZWFkXG4gICAgICAgICAgc2lnID0gJ1NJR0lOVCdcbiAgICAgICAgfVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgbW9kdWxlLmV4cG9ydHMuc2lnbmFscyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2lnbmFsc1xuICB9XG5cbiAgdmFyIGxvYWRlZCA9IGZhbHNlXG5cbiAgdmFyIGxvYWQgPSBmdW5jdGlvbiBsb2FkICgpIHtcbiAgICBpZiAobG9hZGVkIHx8ICFwcm9jZXNzT2soZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgbG9hZGVkID0gdHJ1ZVxuXG4gICAgLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIG9uU2lnbmFsRXhpdCdzIHRoYXQgYXJlIGluIHBsYXkuXG4gICAgLy8gSXQncyBpbXBvcnRhbnQgc28gdGhhdCB3ZSBjYW4gY291bnQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mXG4gICAgLy8gbGlzdGVuZXJzIG9uIHNpZ25hbHMsIGFuZCBkb24ndCB3YWl0IGZvciB0aGUgb3RoZXIgb25lIHRvXG4gICAgLy8gaGFuZGxlIGl0IGluc3RlYWQgb2YgdXMuXG4gICAgZW1pdHRlci5jb3VudCArPSAxXG5cbiAgICBzaWduYWxzID0gc2lnbmFscy5maWx0ZXIoZnVuY3Rpb24gKHNpZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcHJvY2Vzcy5vbihzaWcsIHNpZ0xpc3RlbmVyc1tzaWddKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSlcblxuICAgIHByb2Nlc3MuZW1pdCA9IHByb2Nlc3NFbWl0XG4gICAgcHJvY2Vzcy5yZWFsbHlFeGl0ID0gcHJvY2Vzc1JlYWxseUV4aXRcbiAgfVxuICBtb2R1bGUuZXhwb3J0cy5sb2FkID0gbG9hZFxuXG4gIHZhciBvcmlnaW5hbFByb2Nlc3NSZWFsbHlFeGl0ID0gcHJvY2Vzcy5yZWFsbHlFeGl0XG4gIHZhciBwcm9jZXNzUmVhbGx5RXhpdCA9IGZ1bmN0aW9uIHByb2Nlc3NSZWFsbHlFeGl0IChjb2RlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCFwcm9jZXNzT2soZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IGNvZGUgfHwgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gMFxuICAgIGVtaXQoJ2V4aXQnLCBwcm9jZXNzLmV4aXRDb2RlLCBudWxsKVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZW1pdCgnYWZ0ZXJleGl0JywgcHJvY2Vzcy5leGl0Q29kZSwgbnVsbClcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIG9yaWdpbmFsUHJvY2Vzc1JlYWxseUV4aXQuY2FsbChwcm9jZXNzLCBwcm9jZXNzLmV4aXRDb2RlKVxuICB9XG5cbiAgdmFyIG9yaWdpbmFsUHJvY2Vzc0VtaXQgPSBwcm9jZXNzLmVtaXRcbiAgdmFyIHByb2Nlc3NFbWl0ID0gZnVuY3Rpb24gcHJvY2Vzc0VtaXQgKGV2LCBhcmcpIHtcbiAgICBpZiAoZXYgPT09ICdleGl0JyAmJiBwcm9jZXNzT2soZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGFyZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhcmdcbiAgICAgIH1cbiAgICAgIHZhciByZXQgPSBvcmlnaW5hbFByb2Nlc3NFbWl0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBlbWl0KCdleGl0JywgcHJvY2Vzcy5leGl0Q29kZSwgbnVsbClcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBlbWl0KCdhZnRlcmV4aXQnLCBwcm9jZXNzLmV4aXRDb2RlLCBudWxsKVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiByZXRcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsUHJvY2Vzc0VtaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgIH1cbiAgfVxufVxuIiwgIid1c2Ugc3RyaWN0JztcbmNvbnN0IHtQYXNzVGhyb3VnaDogUGFzc1Rocm91Z2hTdHJlYW19ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gb3B0aW9ucyA9PiB7XG5cdG9wdGlvbnMgPSB7Li4ub3B0aW9uc307XG5cblx0Y29uc3Qge2FycmF5fSA9IG9wdGlvbnM7XG5cdGxldCB7ZW5jb2Rpbmd9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNCdWZmZXIgPSBlbmNvZGluZyA9PT0gJ2J1ZmZlcic7XG5cdGxldCBvYmplY3RNb2RlID0gZmFsc2U7XG5cblx0aWYgKGFycmF5KSB7XG5cdFx0b2JqZWN0TW9kZSA9ICEoZW5jb2RpbmcgfHwgaXNCdWZmZXIpO1xuXHR9IGVsc2Uge1xuXHRcdGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXHR9XG5cblx0aWYgKGlzQnVmZmVyKSB7XG5cdFx0ZW5jb2RpbmcgPSBudWxsO1xuXHR9XG5cblx0Y29uc3Qgc3RyZWFtID0gbmV3IFBhc3NUaHJvdWdoU3RyZWFtKHtvYmplY3RNb2RlfSk7XG5cblx0aWYgKGVuY29kaW5nKSB7XG5cdFx0c3RyZWFtLnNldEVuY29kaW5nKGVuY29kaW5nKTtcblx0fVxuXG5cdGxldCBsZW5ndGggPSAwO1xuXHRjb25zdCBjaHVua3MgPSBbXTtcblxuXHRzdHJlYW0ub24oJ2RhdGEnLCBjaHVuayA9PiB7XG5cdFx0Y2h1bmtzLnB1c2goY2h1bmspO1xuXG5cdFx0aWYgKG9iamVjdE1vZGUpIHtcblx0XHRcdGxlbmd0aCA9IGNodW5rcy5sZW5ndGg7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxlbmd0aCArPSBjaHVuay5sZW5ndGg7XG5cdFx0fVxuXHR9KTtcblxuXHRzdHJlYW0uZ2V0QnVmZmVyZWRWYWx1ZSA9ICgpID0+IHtcblx0XHRpZiAoYXJyYXkpIHtcblx0XHRcdHJldHVybiBjaHVua3M7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGlzQnVmZmVyID8gQnVmZmVyLmNvbmNhdChjaHVua3MsIGxlbmd0aCkgOiBjaHVua3Muam9pbignJyk7XG5cdH07XG5cblx0c3RyZWFtLmdldEJ1ZmZlcmVkTGVuZ3RoID0gKCkgPT4gbGVuZ3RoO1xuXG5cdHJldHVybiBzdHJlYW07XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbmNvbnN0IHtjb25zdGFudHM6IEJ1ZmZlckNvbnN0YW50c30gPSByZXF1aXJlKCdidWZmZXInKTtcbmNvbnN0IHN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuY29uc3Qge3Byb21pc2lmeX0gPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCBidWZmZXJTdHJlYW0gPSByZXF1aXJlKCcuL2J1ZmZlci1zdHJlYW0nKTtcblxuY29uc3Qgc3RyZWFtUGlwZWxpbmVQcm9taXNpZmllZCA9IHByb21pc2lmeShzdHJlYW0ucGlwZWxpbmUpO1xuXG5jbGFzcyBNYXhCdWZmZXJFcnJvciBleHRlbmRzIEVycm9yIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoJ21heEJ1ZmZlciBleGNlZWRlZCcpO1xuXHRcdHRoaXMubmFtZSA9ICdNYXhCdWZmZXJFcnJvcic7XG5cdH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0U3RyZWFtKGlucHV0U3RyZWFtLCBvcHRpb25zKSB7XG5cdGlmICghaW5wdXRTdHJlYW0pIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgc3RyZWFtJyk7XG5cdH1cblxuXHRvcHRpb25zID0ge1xuXHRcdG1heEJ1ZmZlcjogSW5maW5pdHksXG5cdFx0Li4ub3B0aW9uc1xuXHR9O1xuXG5cdGNvbnN0IHttYXhCdWZmZXJ9ID0gb3B0aW9ucztcblx0Y29uc3Qgc3RyZWFtID0gYnVmZmVyU3RyZWFtKG9wdGlvbnMpO1xuXG5cdGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCByZWplY3RQcm9taXNlID0gZXJyb3IgPT4ge1xuXHRcdFx0Ly8gRG9uJ3QgcmV0cmlldmUgYW4gb3ZlcnNpemVkIGJ1ZmZlci5cblx0XHRcdGlmIChlcnJvciAmJiBzdHJlYW0uZ2V0QnVmZmVyZWRMZW5ndGgoKSA8PSBCdWZmZXJDb25zdGFudHMuTUFYX0xFTkdUSCkge1xuXHRcdFx0XHRlcnJvci5idWZmZXJlZERhdGEgPSBzdHJlYW0uZ2V0QnVmZmVyZWRWYWx1ZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdH07XG5cblx0XHQoYXN5bmMgKCkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgc3RyZWFtUGlwZWxpbmVQcm9taXNpZmllZChpbnB1dFN0cmVhbSwgc3RyZWFtKTtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0cmVqZWN0UHJvbWlzZShlcnJvcik7XG5cdFx0XHR9XG5cdFx0fSkoKTtcblxuXHRcdHN0cmVhbS5vbignZGF0YScsICgpID0+IHtcblx0XHRcdGlmIChzdHJlYW0uZ2V0QnVmZmVyZWRMZW5ndGgoKSA+IG1heEJ1ZmZlcikge1xuXHRcdFx0XHRyZWplY3RQcm9taXNlKG5ldyBNYXhCdWZmZXJFcnJvcigpKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG5cblx0cmV0dXJuIHN0cmVhbS5nZXRCdWZmZXJlZFZhbHVlKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U3RyZWFtO1xubW9kdWxlLmV4cG9ydHMuYnVmZmVyID0gKHN0cmVhbSwgb3B0aW9ucykgPT4gZ2V0U3RyZWFtKHN0cmVhbSwgey4uLm9wdGlvbnMsIGVuY29kaW5nOiAnYnVmZmVyJ30pO1xubW9kdWxlLmV4cG9ydHMuYXJyYXkgPSAoc3RyZWFtLCBvcHRpb25zKSA9PiBnZXRTdHJlYW0oc3RyZWFtLCB7Li4ub3B0aW9ucywgYXJyYXk6IHRydWV9KTtcbm1vZHVsZS5leHBvcnRzLk1heEJ1ZmZlckVycm9yID0gTWF4QnVmZmVyRXJyb3I7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IFBhc3NUaHJvdWdoIH0gPSByZXF1aXJlKCdzdHJlYW0nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoLypzdHJlYW1zLi4uKi8pIHtcbiAgdmFyIHNvdXJjZXMgPSBbXVxuICB2YXIgb3V0cHV0ICA9IG5ldyBQYXNzVGhyb3VnaCh7b2JqZWN0TW9kZTogdHJ1ZX0pXG5cbiAgb3V0cHV0LnNldE1heExpc3RlbmVycygwKVxuXG4gIG91dHB1dC5hZGQgPSBhZGRcbiAgb3V0cHV0LmlzRW1wdHkgPSBpc0VtcHR5XG5cbiAgb3V0cHV0Lm9uKCd1bnBpcGUnLCByZW1vdmUpXG5cbiAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5mb3JFYWNoKGFkZClcblxuICByZXR1cm4gb3V0cHV0XG5cbiAgZnVuY3Rpb24gYWRkIChzb3VyY2UpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UuZm9yRWFjaChhZGQpXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgIHNvdXJjZS5vbmNlKCdlbmQnLCByZW1vdmUuYmluZChudWxsLCBzb3VyY2UpKVxuICAgIHNvdXJjZS5vbmNlKCdlcnJvcicsIG91dHB1dC5lbWl0LmJpbmQob3V0cHV0LCAnZXJyb3InKSlcbiAgICBzb3VyY2UucGlwZShvdXRwdXQsIHtlbmQ6IGZhbHNlfSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgZnVuY3Rpb24gaXNFbXB0eSAoKSB7XG4gICAgcmV0dXJuIHNvdXJjZXMubGVuZ3RoID09IDA7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmUgKHNvdXJjZSkge1xuICAgIHNvdXJjZXMgPSBzb3VyY2VzLmZpbHRlcihmdW5jdGlvbiAoaXQpIHsgcmV0dXJuIGl0ICE9PSBzb3VyY2UgfSlcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoICYmIG91dHB1dC5yZWFkYWJsZSkgeyBvdXRwdXQuZW5kKCkgfVxuICB9XG59XG4iLCAiaW1wb3J0IGNhYyBmcm9tICdjYWMnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uLy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgKiBhcyBjb21tYW5kcyBmcm9tICcuL2NvbW1hbmRzJztcblxuY29uc3QgY2xpID0gY2FjKCd3eHQnKTtcbmNsaS5oZWxwKCk7XG5jbGkudmVyc2lvbih2ZXJzaW9uKTtcblxuY2xpLm9wdGlvbignLS1kZWJ1ZycsICdlbmFibGUgZGVidWcgbW9kZScpO1xuXG4vLyBERVZcbmNsaVxuICAuY29tbWFuZCgnW3Jvb3RdJywgJ3N0YXJ0IGRldiBzZXJ2ZXInKVxuICAub3B0aW9uKCctYywgLS1jb25maWcgPGZpbGU+JywgJ3VzZSBzcGVjaWZpZWQgY29uZmlnIGZpbGUnKVxuICAub3B0aW9uKCctbSwgLS1tb2RlIDxtb2RlPicsICdzZXQgZW52IG1vZGUnKVxuICAub3B0aW9uKCctYiwgLS1icm93c2VyIDxicm93c2VyPicsICdzcGVjaWZ5IGEgYnJvd3NlcicpXG4gIC5vcHRpb24oJy0tbXYzJywgJ3RhcmdldCBtYW5pZmVzdCB2MycpXG4gIC5vcHRpb24oJy0tbXYyJywgJ3RhcmdldCBtYW5pZmVzdCB2MicpXG4gIC5hY3Rpb24oY29tbWFuZHMuZGV2KTtcblxuLy8gQlVJTERcbmNsaVxuICAuY29tbWFuZCgnYnVpbGQgW3Jvb3RdJywgJ2J1aWxkIGZvciBwcm9kdWN0aW9uJylcbiAgLm9wdGlvbignLWMsIC0tY29uZmlnIDxmaWxlPicsICd1c2Ugc3BlY2lmaWVkIGNvbmZpZyBmaWxlJylcbiAgLm9wdGlvbignLW0sIC0tbW9kZSA8bW9kZT4nLCAnc2V0IGVudiBtb2RlJylcbiAgLm9wdGlvbignLWIsIC0tYnJvd3NlciA8YnJvd3Nlcj4nLCAnc3BlY2lmeSBhIGJyb3dzZXInKVxuICAub3B0aW9uKCctLW12MycsICd0YXJnZXQgbWFuaWZlc3QgdjMnKVxuICAub3B0aW9uKCctLW12MicsICd0YXJnZXQgbWFuaWZlc3QgdjInKVxuICAub3B0aW9uKCctLWFuYWx5emUnLCAndmlzdWFsaXplIGV4dGVuc2lvbiBidW5kbGUnKVxuICAuYWN0aW9uKGNvbW1hbmRzLmJ1aWxkKTtcblxuLy8gWklQXG5jbGlcbiAgLmNvbW1hbmQoJ3ppcCBbcm9vdF0nLCAnYnVpbGQgZm9yIHByb2R1Y3Rpb24gYW5kIHppcCBvdXRwdXQnKVxuICAub3B0aW9uKCctYywgLS1jb25maWcgPGZpbGU+JywgJ3VzZSBzcGVjaWZpZWQgY29uZmlnIGZpbGUnKVxuICAub3B0aW9uKCctbSwgLS1tb2RlIDxtb2RlPicsICdzZXQgZW52IG1vZGUnKVxuICAub3B0aW9uKCctYiwgLS1icm93c2VyIDxicm93c2VyPicsICdzcGVjaWZ5IGEgYnJvd3NlcicpXG4gIC5vcHRpb24oJy0tbXYzJywgJ3RhcmdldCBtYW5pZmVzdCB2MycpXG4gIC5vcHRpb24oJy0tbXYyJywgJ3RhcmdldCBtYW5pZmVzdCB2MicpXG4gIC5hY3Rpb24oY29tbWFuZHMuemlwKTtcblxuLy8gUFJFUEFSRVxuY2xpXG4gIC5jb21tYW5kKCdwcmVwYXJlIFtyb290XScsICdwcmVwYXJlIHR5cGVzY3JpcHQgcHJvamVjdCcpXG4gIC5vcHRpb24oJy1jLCAtLWNvbmZpZyA8ZmlsZT4nLCAndXNlIHNwZWNpZmllZCBjb25maWcgZmlsZScpXG4gIC5hY3Rpb24oY29tbWFuZHMucHJlcGFyZSk7XG5cbi8vIENMRUFOXG5jbGlcbiAgLmNvbW1hbmQoJ2NsZWFuIFtyb290XScsICdjbGVhbiBnZW5lcmF0ZWQgZmlsZXMgYW5kIGNhY2hlcycpXG4gIC5hbGlhcygnY2xlYW51cCcpXG4gIC5hY3Rpb24oY29tbWFuZHMuY2xlYW4pO1xuXG4vLyBQVUJMSVNIXG5jbGkuY29tbWFuZCgncHVibGlzaCBbcm9vdF0nLCAncHVibGlzaCB0byBzdG9yZXMnKS5hY3Rpb24oY29tbWFuZHMucHVibGlzaCk7XG5cbi8vIElOSVRcbmNsaVxuICAuY29tbWFuZCgnaW5pdCBbZGlyZWN0b3J5XScsICdpbml0aWFsaXplIGEgbmV3IHByb2plY3QnKVxuICAub3B0aW9uKCctdCwgLS10ZW1wbGF0ZSA8dGVtcGxhdGU+JywgJ3RlbXBsYXRlIHRvIHVzZScpXG4gIC5vcHRpb24oJy0tcG0gPHBhY2thZ2VNYW5hZ2VyPicsICd3aGljaCBwYWNrYWdlIG1hbmFnZXIgdG8gdXNlJylcbiAgLmFjdGlvbihjb21tYW5kcy5pbml0KTtcblxuY2xpLnBhcnNlKCk7XG4iLCAie1xuICBcIm5hbWVcIjogXCJ3eHRcIixcbiAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gIFwidmVyc2lvblwiOiBcIjAuNy4wXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJOZXh0IGdlbiBmcmFtZXdvcmsgZm9yIGRldmVsb3Bpbmcgd2ViIGV4dGVuc2lvbnNcIixcbiAgXCJlbmdpbmVzXCI6IHtcbiAgICBcIm5vZGVcIjogXCI+PTE4LjE2LjBcIixcbiAgICBcInBucG1cIjogXCI+PThcIlxuICB9LFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL3d4dC1kZXYvd3h0XCJcbiAgfSxcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vd3h0LmRldlwiLFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcInZpdGVcIixcbiAgICBcImNocm9tZVwiLFxuICAgIFwid2ViXCIsXG4gICAgXCJleHRlbnNpb25cIixcbiAgICBcImJyb3dzZXJcIixcbiAgICBcImJ1bmRsZXJcIixcbiAgICBcImZyYW1ld29ya1wiXG4gIF0sXG4gIFwiYXV0aG9yXCI6IHtcbiAgICBcIm5hbWVcIjogXCJBYXJvbiBLbGlua2VyXCIsXG4gICAgXCJlbWFpbFwiOiBcImFhcm9ua2xpbmtlcjErd3h0QGdtYWlsLmNvbVwiXG4gIH0sXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImJpblwiLFxuICAgIFwiZGlzdFwiXG4gIF0sXG4gIFwiYmluXCI6IFwiLi9iaW4vd3h0LmNqc1wiLFxuICBcIm1haW5cIjogXCIuL2Rpc3QvaW5kZXguY2pzXCIsXG4gIFwibW9kdWxlXCI6IFwiLi9kaXN0L2luZGV4LmpzXCIsXG4gIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3QvaW5kZXguY2pzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9pbmRleC5qc1wiLFxuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9pbmRleC5kLnRzXCJcbiAgICB9LFxuICAgIFwiLi9jbGllbnRcIjoge1xuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvY2xpZW50LmpzXCIsXG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2NsaWVudC5kLnRzXCJcbiAgICB9LFxuICAgIFwiLi9icm93c2VyXCI6IHtcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2Jyb3dzZXIuanNcIixcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvYnJvd3Nlci5kLnRzXCJcbiAgICB9XG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJ3eHRcIjogXCJ0c3ggc3JjL2NsaS9pbmRleC50c1wiLFxuICAgIFwiYnVpbGRcIjogXCJ0c3ggc2NyaXB0cy9idWlsZC50c1wiLFxuICAgIFwiZm9ybWF0XCI6IFwicHJldHRpZXIgLS13cml0ZSAuXCIsXG4gICAgXCJmb3JtYXQ6Y2hlY2tcIjogXCJwcmV0dGllciAtLXdyaXRlIC5cIixcbiAgICBcImNvbXBpbGVcIjogXCJ0c2MgLS1ub0VtaXRcIixcbiAgICBcInRlc3RcIjogXCJ2aXRlc3RcIixcbiAgICBcInRlc3Q6Y292ZXJhZ2VcIjogXCJ2aXRlc3QgcnVuIC0tY292ZXJhZ2UuZW5hYmxlZCAtLWNvdmVyYWdlLmV4Y2x1ZGU9ZTJlIC0tY292ZXJhZ2UuZXhjbHVkZT1zcmMvdGVzdGluZ1wiLFxuICAgIFwicHJlcGFyZVwiOiBcInNpbXBsZS1naXQtaG9va3NcIixcbiAgICBcInByZXB1Ymxpc2hcIjogXCJwbnBtIC1zIGJ1aWxkXCIsXG4gICAgXCJkb2NzOmRldlwiOiBcInZpdGVwcmVzcyBkZXYgZG9jc1wiLFxuICAgIFwiZG9jczpidWlsZFwiOiBcInZpdGVwcmVzcyBidWlsZCBkb2NzXCIsXG4gICAgXCJkb2NzOnByZXZpZXdcIjogXCJ2aXRlcHJlc3MgcHJldmlldyBkb2NzXCIsXG4gICAgXCJzeW5jLXJlbGVhc2VzXCI6IFwicG5weCBjaGFuZ2Vsb2dlbkBsYXRlc3QgZ2ggcmVsZWFzZSBhbGxcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAdHlwZXMvd2ViZXh0ZW5zaW9uLXBvbHlmaWxsXCI6IFwiXjAuMTAuMVwiLFxuICAgIFwiQHdlYmV4dC1jb3JlL2Zha2UtYnJvd3NlclwiOiBcIl4xLjIuMlwiLFxuICAgIFwiQHdlYmV4dC1jb3JlL21hdGNoLXBhdHRlcm5zXCI6IFwiXjEuMC4yXCIsXG4gICAgXCJhc3luYy1tdXRleFwiOiBcIl4wLjQuMFwiLFxuICAgIFwiYzEyXCI6IFwiXjEuNC4yXCIsXG4gICAgXCJjYWNcIjogXCJeNi43LjE0XCIsXG4gICAgXCJjb25zb2xhXCI6IFwiXjMuMi4zXCIsXG4gICAgXCJlc2J1aWxkXCI6IFwiXjAuMTkuNFwiLFxuICAgIFwiZmFzdC1nbG9iXCI6IFwiXjMuMy4xXCIsXG4gICAgXCJmaWxlc2l6ZVwiOiBcIl4xMC4wLjhcIixcbiAgICBcImZzLWV4dHJhXCI6IFwiXjExLjEuMVwiLFxuICAgIFwiZ2V0LXBvcnRcIjogXCJeNy4wLjBcIixcbiAgICBcImdpZ2V0XCI6IFwiXjEuMS4yXCIsXG4gICAgXCJpbW1lclwiOiBcIl4xMC4wLjJcIixcbiAgICBcImlzLXdzbFwiOiBcIl4zLjAuMFwiLFxuICAgIFwiaml0aVwiOiBcIl4xLjE5LjFcIixcbiAgICBcImpzb241XCI6IFwiXjIuMi4zXCIsXG4gICAgXCJsaW5rZWRvbVwiOiBcIl4wLjE1LjFcIixcbiAgICBcIm1pbmltYXRjaFwiOiBcIl45LjAuM1wiLFxuICAgIFwib3JhXCI6IFwiXjcuMC4xXCIsXG4gICAgXCJwaWNvY29sb3JzXCI6IFwiXjEuMC4wXCIsXG4gICAgXCJwcm9tcHRzXCI6IFwiXjIuNC4yXCIsXG4gICAgXCJyb2xsdXAtcGx1Z2luLXZpc3VhbGl6ZXJcIjogXCJeNS45LjJcIixcbiAgICBcInVuaW1wb3J0XCI6IFwiXjMuMS4wXCIsXG4gICAgXCJ2aXRlXCI6IFwiXjQuNC43XCIsXG4gICAgXCJ3ZWItZXh0LXJ1blwiOiBcIl4wLjEuMFwiLFxuICAgIFwid2ViZXh0ZW5zaW9uLXBvbHlmaWxsXCI6IFwiXjAuMTAuMFwiLFxuICAgIFwiemlwLWRpclwiOiBcIl4yLjAuMFwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBmYWtlci1qcy9mYWtlclwiOiBcIl44LjAuMlwiLFxuICAgIFwiQHR5cGVzL2ZzLWV4dHJhXCI6IFwiXjExLjAuMVwiLFxuICAgIFwiQHR5cGVzL2xvZGFzaC5tZXJnZVwiOiBcIl40LjYuN1wiLFxuICAgIFwiQHR5cGVzL25vZGVcIjogXCJeMjAuNC41XCIsXG4gICAgXCJAdHlwZXMvcHJvbXB0c1wiOiBcIl4yLjQuNFwiLFxuICAgIFwiQHZpdGVzdC9jb3ZlcmFnZS12OFwiOiBcIl4wLjM0LjFcIixcbiAgICBcImV4ZWNhXCI6IFwiXjcuMi4wXCIsXG4gICAgXCJsaW50LXN0YWdlZFwiOiBcIl4xNC4wLjBcIixcbiAgICBcImxvZGFzaC5tZXJnZVwiOiBcIl40LjYuMlwiLFxuICAgIFwibnBtLXJ1bi1hbGxcIjogXCJeNC4xLjVcIixcbiAgICBcInByZXR0aWVyXCI6IFwiXjMuMC4xXCIsXG4gICAgXCJzaW1wbGUtZ2l0LWhvb2tzXCI6IFwiXjIuOS4wXCIsXG4gICAgXCJ0cy1tb3JwaFwiOiBcIl4xOS4wLjBcIixcbiAgICBcInRzdXBcIjogXCJeNy4xLjBcIixcbiAgICBcInRzeFwiOiBcIl4zLjEyLjdcIixcbiAgICBcInR5cGVzY3JpcHRcIjogXCJeNS4xLjZcIixcbiAgICBcInZpdGVwcmVzc1wiOiBcIjEuMC4wLXJjLjEwXCIsXG4gICAgXCJ2aXRlc3RcIjogXCJeMC4zNC4xXCIsXG4gICAgXCJ2aXRlc3QtbW9jay1leHRlbmRlZFwiOiBcIl4xLjEuNFwiLFxuICAgIFwidnVlXCI6IFwiXjMuMy40XCIsXG4gICAgXCJ3ZWJleHRlbnNpb24tcG9seWZpbGxcIjogXCJeMC4xMC4wXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIndlYmV4dGVuc2lvbi1wb2x5ZmlsbFwiOiBcIj49MC4xMC4wXCJcbiAgfSxcbiAgXCJwYWNrYWdlTWFuYWdlclwiOiBcInBucG1AOC42LjNcIixcbiAgXCJzaW1wbGUtZ2l0LWhvb2tzXCI6IHtcbiAgICBcInByZS1jb21taXRcIjogXCJwbnBtIGxpbnQtc3RhZ2VkXCJcbiAgfSxcbiAgXCJsaW50LXN0YWdlZFwiOiB7XG4gICAgXCIqXCI6IFwicHJldHRpZXIgLS13cml0ZVwiXG4gIH0sXG4gIFwiY2hhbmdlbG9nXCI6IHtcbiAgICBcImV4Y2x1ZGVBdXRob3JzXCI6IFtcbiAgICAgIFwiYWFyb25rbGlua2VyMUBnbWFpbC5jb21cIlxuICAgIF1cbiAgfSxcbiAgXCJwbnBtXCI6IHtcbiAgICBcInBlZXJEZXBlbmRlbmN5UnVsZXNcIjoge1xuICAgICAgXCJpZ25vcmVNaXNzaW5nXCI6IFtcbiAgICAgICAgXCJAYWxnb2xpYS9jbGllbnQtc2VhcmNoXCIsXG4gICAgICAgIFwic2VhcmNoLWluc2lnaHRzXCJcbiAgICAgIF1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSAnYzEyJztcbmltcG9ydCB7XG4gIElubGluZUNvbmZpZyxcbiAgSW50ZXJuYWxDb25maWcsXG4gIFVzZXJDb25maWcsXG4gIENvbmZpZ0VudixcbiAgVXNlck1hbmlmZXN0Rm4sXG4gIFVzZXJNYW5pZmVzdCxcbiAgV3h0Vml0ZUNvbmZpZyxcbiAgRXh0ZW5zaW9uUnVubmVyQ29uZmlnLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7IGNyZWF0ZUZzQ2FjaGUgfSBmcm9tICcuL2NyZWF0ZUZzQ2FjaGUnO1xuaW1wb3J0IGNvbnNvbGEsIHsgTG9nTGV2ZWxzIH0gZnJvbSAnY29uc29sYSc7XG5pbXBvcnQgKiBhcyBwbHVnaW5zIGZyb20gJy4uL3ZpdGUtcGx1Z2lucyc7XG5pbXBvcnQgeyBnZXRHbG9iYWxzIH0gZnJvbSAnLi9nbG9iYWxzJztcblxuLyoqXG4gKiBHaXZlbiBhbiBpbmxpbmUgY29uZmlnLCBkaXNjb3ZlciB0aGUgY29uZmlnIGZpbGUgaWYgbmVjZXNzYXJ5LCBtZXJnZSB0aGUgcmVzdWx0cywgcmVzb2x2ZSBhbnlcbiAqIHJlbGF0aXZlIHBhdGhzLCBhbmQgYXBwbHkgYW55IGRlZmF1bHRzLlxuICpcbiAqIElubGluZSBjb25maWcgYWx3YXlzIGhhcyBwcmlvcml0eSBvdmVyIHVzZXIgY29uZmlnLiBDbGkgZmxhZ3MgYXJlIHBhc3NlZCBhcyBpbmxpbmUgY29uZmlnIGlmIHNldC5cbiAqIElmIHVuc2V0LCB1bmRlZmluZWQgaXMgcGFzc2VkIGluLCBsZXR0aW5nIHRoaXMgZnVuY3Rpb24gZGVjaWRlIGRlZmF1bHQgdmFsdWVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SW50ZXJuYWxDb25maWcoXG4gIGlubGluZUNvbmZpZzogSW5saW5lQ29uZmlnLFxuICBjb21tYW5kOiAnYnVpbGQnIHwgJ3NlcnZlJyxcbik6IFByb21pc2U8SW50ZXJuYWxDb25maWc+IHtcbiAgLy8gTG9hZCB1c2VyIGNvbmZpZ1xuXG4gIGxldCB1c2VyQ29uZmlnOiBVc2VyQ29uZmlnID0ge307XG4gIGxldCB1c2VyQ29uZmlnTWV0YWRhdGE6IEludGVybmFsQ29uZmlnWyd1c2VyQ29uZmlnTWV0YWRhdGEnXSB8IHVuZGVmaW5lZDtcbiAgaWYgKGlubGluZUNvbmZpZy5jb25maWdGaWxlICE9PSBmYWxzZSkge1xuICAgIGNvbnN0IHsgY29uZmlnOiBsb2FkZWRDb25maWcsIC4uLm1ldGFkYXRhIH0gPSBhd2FpdCBsb2FkQ29uZmlnPFVzZXJDb25maWc+KHtcbiAgICAgIG5hbWU6ICd3eHQnLFxuICAgICAgY3dkOiBpbmxpbmVDb25maWcucm9vdCA/PyBwcm9jZXNzLmN3ZCgpLFxuICAgICAgcmNGaWxlOiBmYWxzZSxcbiAgICB9KTtcbiAgICB1c2VyQ29uZmlnID0gbG9hZGVkQ29uZmlnID8/IHt9O1xuICAgIHVzZXJDb25maWdNZXRhZGF0YSA9IG1ldGFkYXRhO1xuICB9XG5cbiAgLy8gTWVyZ2UgaXQgaW50byB0aGUgaW5saW5lIGNvbmZpZ1xuXG4gIGNvbnN0IG1lcmdlZENvbmZpZyA9IG1lcmdlSW5saW5lQ29uZmlnKGlubGluZUNvbmZpZywgdXNlckNvbmZpZyk7XG5cbiAgLy8gQXBwbHkgZGVmYXVsdHMgdG8gbWFrZSBpbnRlcm5hbCBjb25maWcuXG5cbiAgY29uc3QgZGVidWcgPSBtZXJnZWRDb25maWcuZGVidWcgPz8gZmFsc2U7XG4gIGNvbnN0IGxvZ2dlciA9IG1lcmdlZENvbmZpZy5sb2dnZXIgPz8gY29uc29sYTtcbiAgaWYgKGRlYnVnKSBsb2dnZXIubGV2ZWwgPSBMb2dMZXZlbHMuZGVidWc7XG5cbiAgY29uc3QgYnJvd3NlciA9IG1lcmdlZENvbmZpZy5icm93c2VyID8/ICdjaHJvbWUnO1xuICBjb25zdCBtYW5pZmVzdFZlcnNpb24gPVxuICAgIG1lcmdlZENvbmZpZy5tYW5pZmVzdFZlcnNpb24gPz8gKGJyb3dzZXIgPT0gJ2ZpcmVmb3gnID8gMiA6IDMpO1xuICBjb25zdCBtb2RlID1cbiAgICBtZXJnZWRDb25maWcubW9kZSA/PyAoY29tbWFuZCA9PT0gJ2J1aWxkJyA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCcpO1xuICBjb25zdCBlbnY6IENvbmZpZ0VudiA9IHsgYnJvd3NlciwgY29tbWFuZCwgbWFuaWZlc3RWZXJzaW9uLCBtb2RlIH07XG5cbiAgY29uc3Qgcm9vdCA9IHBhdGgucmVzb2x2ZShcbiAgICBpbmxpbmVDb25maWcucm9vdCA/PyB1c2VyQ29uZmlnLnJvb3QgPz8gcHJvY2Vzcy5jd2QoKSxcbiAgKTtcbiAgY29uc3Qgd3h0RGlyID0gcGF0aC5yZXNvbHZlKHJvb3QsICcud3h0Jyk7XG4gIGNvbnN0IHNyY0RpciA9IHBhdGgucmVzb2x2ZShyb290LCBtZXJnZWRDb25maWcuc3JjRGlyID8/IHJvb3QpO1xuICBjb25zdCBlbnRyeXBvaW50c0RpciA9IHBhdGgucmVzb2x2ZShcbiAgICBzcmNEaXIsXG4gICAgbWVyZ2VkQ29uZmlnLmVudHJ5cG9pbnRzRGlyID8/ICdlbnRyeXBvaW50cycsXG4gICk7XG4gIGNvbnN0IHB1YmxpY0RpciA9IHBhdGgucmVzb2x2ZShzcmNEaXIsIG1lcmdlZENvbmZpZy5wdWJsaWNEaXIgPz8gJ3B1YmxpYycpO1xuICBjb25zdCB0eXBlc0RpciA9IHBhdGgucmVzb2x2ZSh3eHREaXIsICd0eXBlcycpO1xuICBjb25zdCBvdXRCYXNlRGlyID0gcGF0aC5yZXNvbHZlKHJvb3QsICcub3V0cHV0Jyk7XG4gIGNvbnN0IG91dERpciA9IHBhdGgucmVzb2x2ZShvdXRCYXNlRGlyLCBgJHticm93c2VyfS1tdiR7bWFuaWZlc3RWZXJzaW9ufWApO1xuXG4gIGNvbnN0IHJ1bm5lckNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWc8RXh0ZW5zaW9uUnVubmVyQ29uZmlnPih7XG4gICAgbmFtZTogJ3dlYi1leHQnLFxuICAgIGN3ZDogcm9vdCxcbiAgICBnbG9iYWxSYzogdHJ1ZSxcbiAgICByY0ZpbGU6ICcud2ViZXh0cmMnLFxuICAgIG92ZXJyaWRlczogaW5saW5lQ29uZmlnLnJ1bm5lcixcbiAgICBkZWZhdWx0czogdXNlckNvbmZpZy5ydW5uZXIsXG4gIH0pO1xuXG4gIGNvbnN0IGZpbmFsQ29uZmlnOiBJbnRlcm5hbENvbmZpZyA9IHtcbiAgICBicm93c2VyLFxuICAgIGNvbW1hbmQsXG4gICAgZGVidWcsXG4gICAgZW50cnlwb2ludHNEaXIsXG4gICAgZW52LFxuICAgIGZzQ2FjaGU6IGNyZWF0ZUZzQ2FjaGUod3h0RGlyKSxcbiAgICBpbXBvcnRzOiBtZXJnZWRDb25maWcuaW1wb3J0cyA/PyB7fSxcbiAgICBsb2dnZXIsXG4gICAgbWFuaWZlc3Q6IGF3YWl0IHJlc29sdmVNYW5pZmVzdENvbmZpZyhlbnYsIG1lcmdlZENvbmZpZy5tYW5pZmVzdCksXG4gICAgbWFuaWZlc3RWZXJzaW9uLFxuICAgIG1vZGUsXG4gICAgb3V0QmFzZURpcixcbiAgICBvdXREaXIsXG4gICAgcHVibGljRGlyLFxuICAgIHJvb3QsXG4gICAgcnVubmVyQ29uZmlnLFxuICAgIHNyY0RpcixcbiAgICB0eXBlc0RpcixcbiAgICB2aXRlOiAoKSA9PiAoe30pLCAvLyBSZWFsIHZhbHVlIGFkZGVkIGFmdGVyIHRoaXMgb2JqZWN0IGlzIGluaXRpYWxpemVkLlxuICAgIHd4dERpcixcbiAgICB6aXA6IHJlc29sdmVJbnRlcm5hbFppcENvbmZpZyhyb290LCBtZXJnZWRDb25maWcpLFxuICAgIHRyYW5zZm9ybU1hbmlmZXN0KG1hbmlmZXN0KSB7XG4gICAgICB1c2VyQ29uZmlnLnRyYW5zZm9ybU1hbmlmZXN0Py4obWFuaWZlc3QpO1xuICAgICAgaW5saW5lQ29uZmlnLnRyYW5zZm9ybU1hbmlmZXN0Py4obWFuaWZlc3QpO1xuICAgIH0sXG4gICAgYW5hbHlzaXM6IHtcbiAgICAgIGVuYWJsZWQ6IG1lcmdlZENvbmZpZy5hbmFseXNpcz8uZW5hYmxlZCA/PyBmYWxzZSxcbiAgICAgIHRlbXBsYXRlOiBtZXJnZWRDb25maWcuYW5hbHlzaXM/LnRlbXBsYXRlID8/ICd0cmVlbWFwJyxcbiAgICB9LFxuICAgIHVzZXJDb25maWdNZXRhZGF0YTogdXNlckNvbmZpZ01ldGFkYXRhID8/IHt9LFxuICB9O1xuXG4gIGZpbmFsQ29uZmlnLnZpdGUgPSAoZW52KSA9PlxuICAgIHJlc29sdmVJbnRlcm5hbFZpdGVDb25maWcoZW52LCBtZXJnZWRDb25maWcsIGZpbmFsQ29uZmlnKTtcblxuICByZXR1cm4gZmluYWxDb25maWc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVNYW5pZmVzdENvbmZpZyhcbiAgZW52OiBDb25maWdFbnYsXG4gIG1hbmlmZXN0OiBVc2VyTWFuaWZlc3QgfCBQcm9taXNlPFVzZXJNYW5pZmVzdD4gfCBVc2VyTWFuaWZlc3RGbiB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8VXNlck1hbmlmZXN0PiB7XG4gIHJldHVybiBhd2FpdCAodHlwZW9mIG1hbmlmZXN0ID09PSAnZnVuY3Rpb24nXG4gICAgPyBtYW5pZmVzdChlbnYpXG4gICAgOiBtYW5pZmVzdCA/PyB7fSk7XG59XG5cbi8qKlxuICogTWVyZ2UgdGhlIGlubGluZSBjb25maWcgYW5kIHVzZXIgY29uZmlnLiBJbmxpbmUgY29uZmlnIGlzIGdpdmVuIHByaW9yaXR5LiBEZWZhdWx0cyBhcmUgbm90IGFwcGxpZWQgaGVyZS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VJbmxpbmVDb25maWcoXG4gIGlubGluZUNvbmZpZzogSW5saW5lQ29uZmlnLFxuICB1c2VyQ29uZmlnOiBVc2VyQ29uZmlnLFxuKTogSW5saW5lQ29uZmlnIHtcbiAgbGV0IGltcG9ydHM6IElubGluZUNvbmZpZ1snaW1wb3J0cyddO1xuICBpZiAoaW5saW5lQ29uZmlnLmltcG9ydHMgPT09IGZhbHNlIHx8IHVzZXJDb25maWcuaW1wb3J0cyA9PT0gZmFsc2UpIHtcbiAgICBpbXBvcnRzID0gZmFsc2U7XG4gIH0gZWxzZSBpZiAodXNlckNvbmZpZy5pbXBvcnRzID09IG51bGwgJiYgaW5saW5lQ29uZmlnLmltcG9ydHMgPT0gbnVsbCkge1xuICAgIGltcG9ydHMgPSB1bmRlZmluZWQ7XG4gIH0gZWxzZSB7XG4gICAgaW1wb3J0cyA9IHZpdGUubWVyZ2VDb25maWcoXG4gICAgICB1c2VyQ29uZmlnLmltcG9ydHMgPz8ge30sXG4gICAgICBpbmxpbmVDb25maWcuaW1wb3J0cyA/PyB7fSxcbiAgICApO1xuICB9XG4gIGNvbnN0IG1hbmlmZXN0OiBVc2VyTWFuaWZlc3RGbiA9IGFzeW5jIChlbnYpID0+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgcmVzb2x2ZU1hbmlmZXN0Q29uZmlnKGVudiwgdXNlckNvbmZpZy5tYW5pZmVzdCk7XG4gICAgY29uc3QgaW5saW5lID0gYXdhaXQgcmVzb2x2ZU1hbmlmZXN0Q29uZmlnKGVudiwgaW5saW5lQ29uZmlnLm1hbmlmZXN0KTtcbiAgICByZXR1cm4gdml0ZS5tZXJnZUNvbmZpZyh1c2VyLCBpbmxpbmUpO1xuICB9O1xuICBjb25zdCB2aXRlQ29uZmlnID0gYXN5bmMgKGVudjogQ29uZmlnRW52KTogUHJvbWlzZTxXeHRWaXRlQ29uZmlnPiA9PiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHVzZXJDb25maWcudml0ZT8uKGVudik7XG4gICAgY29uc3QgaW5saW5lID0gYXdhaXQgaW5saW5lQ29uZmlnLnZpdGU/LihlbnYpO1xuICAgIHJldHVybiB2aXRlLm1lcmdlQ29uZmlnKHVzZXIgPz8ge30sIGlubGluZSA/PyB7fSk7XG4gIH07XG4gIGNvbnN0IHJ1bm5lcjogSW5saW5lQ29uZmlnWydydW5uZXInXSA9IHZpdGUubWVyZ2VDb25maWcoXG4gICAgdXNlckNvbmZpZy5ydW5uZXIgPz8ge30sXG4gICAgaW5saW5lQ29uZmlnLnJ1bm5lciA/PyB7fSxcbiAgKTtcbiAgY29uc3QgemlwOiBJbmxpbmVDb25maWdbJ3ppcCddID0gdml0ZS5tZXJnZUNvbmZpZyhcbiAgICB1c2VyQ29uZmlnLnppcCA/PyB7fSxcbiAgICBpbmxpbmVDb25maWcuemlwID8/IHt9LFxuICApO1xuXG4gIHJldHVybiB7XG4gICAgcm9vdDogaW5saW5lQ29uZmlnLnJvb3QgPz8gdXNlckNvbmZpZy5yb290LFxuICAgIGJyb3dzZXI6IGlubGluZUNvbmZpZy5icm93c2VyID8/IHVzZXJDb25maWcuYnJvd3NlcixcbiAgICBtYW5pZmVzdFZlcnNpb246IGlubGluZUNvbmZpZy5tYW5pZmVzdFZlcnNpb24gPz8gdXNlckNvbmZpZy5tYW5pZmVzdFZlcnNpb24sXG4gICAgY29uZmlnRmlsZTogaW5saW5lQ29uZmlnLmNvbmZpZ0ZpbGUsXG4gICAgZGVidWc6IGlubGluZUNvbmZpZy5kZWJ1ZyA/PyB1c2VyQ29uZmlnLmRlYnVnLFxuICAgIGVudHJ5cG9pbnRzRGlyOiBpbmxpbmVDb25maWcuZW50cnlwb2ludHNEaXIgPz8gdXNlckNvbmZpZy5lbnRyeXBvaW50c0RpcixcbiAgICBpbXBvcnRzLFxuICAgIGxvZ2dlcjogaW5saW5lQ29uZmlnLmxvZ2dlciA/PyB1c2VyQ29uZmlnLmxvZ2dlcixcbiAgICBtYW5pZmVzdCxcbiAgICBtb2RlOiBpbmxpbmVDb25maWcubW9kZSA/PyB1c2VyQ29uZmlnLm1vZGUsXG4gICAgcHVibGljRGlyOiBpbmxpbmVDb25maWcucHVibGljRGlyID8/IHVzZXJDb25maWcucHVibGljRGlyLFxuICAgIHJ1bm5lcixcbiAgICBzcmNEaXI6IGlubGluZUNvbmZpZy5zcmNEaXIgPz8gdXNlckNvbmZpZy5zcmNEaXIsXG4gICAgdml0ZTogdml0ZUNvbmZpZyxcbiAgICB6aXAsXG4gICAgYW5hbHlzaXM6IHtcbiAgICAgIGVuYWJsZWQ6IGlubGluZUNvbmZpZy5hbmFseXNpcz8uZW5hYmxlZCA/PyB1c2VyQ29uZmlnLmFuYWx5c2lzPy5lbmFibGVkLFxuICAgICAgdGVtcGxhdGU6XG4gICAgICAgIGlubGluZUNvbmZpZy5hbmFseXNpcz8udGVtcGxhdGUgPz8gdXNlckNvbmZpZy5hbmFseXNpcz8udGVtcGxhdGUsXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUludGVybmFsWmlwQ29uZmlnKFxuICByb290OiBzdHJpbmcsXG4gIG1lcmdlZENvbmZpZzogSW5saW5lQ29uZmlnLFxuKTogSW50ZXJuYWxDb25maWdbJ3ppcCddIHtcbiAgcmV0dXJuIHtcbiAgICBzb3VyY2VzVGVtcGxhdGU6ICd7e25hbWV9fS17e3ZlcnNpb259fS1zb3VyY2VzLnppcCcsXG4gICAgYXJ0aWZhY3RUZW1wbGF0ZTogJ3t7bmFtZX19LXt7dmVyc2lvbn19LXt7YnJvd3Nlcn19LnppcCcsXG4gICAgc291cmNlc1Jvb3Q6IHJvb3QsXG4gICAgLi4ubWVyZ2VkQ29uZmlnLnppcCxcbiAgICBpZ25vcmVkU291cmNlczogW1xuICAgICAgJyoqL25vZGVfbW9kdWxlcycsXG4gICAgICAvLyBXWFQgZmlsZXNcbiAgICAgICcqKi93ZWItZXh0LmNvbmZpZy50cycsXG4gICAgICAvLyBIaWRkZW4gZmlsZXNcbiAgICAgICcqKi8uKicsXG4gICAgICAvLyBUZXN0c1xuICAgICAgJyoqL19fdGVzdHNfXy8qKicsXG4gICAgICAnKiovKi4rKHRlc3R8c3BlYykuPyhjfG0pKyhqfHQpcz8oeCknLFxuICAgICAgLy8gRnJvbSB1c2VyXG4gICAgICAuLi4obWVyZ2VkQ29uZmlnLnppcD8uaWdub3JlZFNvdXJjZXMgPz8gW10pLFxuICAgIF0sXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVJbnRlcm5hbFZpdGVDb25maWcoXG4gIGVudjogQ29uZmlnRW52LFxuICBtZXJnZWRDb25maWc6IElubGluZUNvbmZpZyxcbiAgZmluYWxDb25maWc6IEludGVybmFsQ29uZmlnLFxuKSB7XG4gIGNvbnN0IGludGVybmFsVml0ZTogdml0ZS5JbmxpbmVDb25maWcgPVxuICAgIChhd2FpdCBtZXJnZWRDb25maWcudml0ZT8uKGVudikpID8/IHt9O1xuXG4gIGludGVybmFsVml0ZS5yb290ID0gZmluYWxDb25maWcucm9vdDtcbiAgaW50ZXJuYWxWaXRlLmNvbmZpZ0ZpbGUgPSBmYWxzZTtcbiAgaW50ZXJuYWxWaXRlLmxvZ0xldmVsID0gJ3dhcm4nO1xuICBpbnRlcm5hbFZpdGUubW9kZSA9IGVudi5tb2RlO1xuXG4gIGludGVybmFsVml0ZS5idWlsZCA/Pz0ge307XG4gIGludGVybmFsVml0ZS5idWlsZC5vdXREaXIgPSBmaW5hbENvbmZpZy5vdXREaXI7XG4gIGludGVybmFsVml0ZS5idWlsZC5lbXB0eU91dERpciA9IGZhbHNlO1xuXG4gIGludGVybmFsVml0ZS5wbHVnaW5zID8/PSBbXTtcbiAgaW50ZXJuYWxWaXRlLnBsdWdpbnMucHVzaChwbHVnaW5zLmRvd25sb2FkKGZpbmFsQ29uZmlnKSk7XG4gIGludGVybmFsVml0ZS5wbHVnaW5zLnB1c2gocGx1Z2lucy5kZXZIdG1sUHJlcmVuZGVyKGZpbmFsQ29uZmlnKSk7XG4gIGludGVybmFsVml0ZS5wbHVnaW5zLnB1c2gocGx1Z2lucy51bmltcG9ydChmaW5hbENvbmZpZykpO1xuICBpbnRlcm5hbFZpdGUucGx1Z2lucy5wdXNoKFxuICAgIHBsdWdpbnMudmlydHVhbEVudHJ5cG9pbignYmFja2dyb3VuZCcsIGZpbmFsQ29uZmlnKSxcbiAgKTtcbiAgaW50ZXJuYWxWaXRlLnBsdWdpbnMucHVzaChcbiAgICBwbHVnaW5zLnZpcnR1YWxFbnRyeXBvaW4oJ2NvbnRlbnQtc2NyaXB0JywgZmluYWxDb25maWcpLFxuICApO1xuICBpbnRlcm5hbFZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMuZGV2U2VydmVyR2xvYmFscyhmaW5hbENvbmZpZykpO1xuICBpbnRlcm5hbFZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMudHNjb25maWdQYXRocyhmaW5hbENvbmZpZykpO1xuICBpbnRlcm5hbFZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMubm9vcEJhY2tncm91bmQoKSk7XG4gIGlmIChmaW5hbENvbmZpZy5hbmFseXNpcy5lbmFibGVkKSB7XG4gICAgaW50ZXJuYWxWaXRlLnBsdWdpbnMucHVzaChwbHVnaW5zLmJ1bmRsZUFuYWx5c2lzKCkpO1xuICB9XG5cbiAgaW50ZXJuYWxWaXRlLmRlZmluZSA/Pz0ge307XG4gIGZvciAoY29uc3QgZ2xvYmFsIG9mIGdldEdsb2JhbHMoZmluYWxDb25maWcpKSB7XG4gICAgaW50ZXJuYWxWaXRlLmRlZmluZVtnbG9iYWwubmFtZV0gPSBKU09OLnN0cmluZ2lmeShnbG9iYWwudmFsdWUpO1xuICB9XG4gIHJldHVybiBpbnRlcm5hbFZpdGU7XG59XG4iLCAiaW1wb3J0IGZzLCB7IGVuc3VyZURpciB9IGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IEZzQ2FjaGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyB3cml0ZUZpbGVJZkRpZmZlcmVudCB9IGZyb20gJy4vZnMnO1xuXG4vKipcbiAqIEEgYmFzaWMgZmlsZSBzeXN0ZW0gY2FjaGUgc3RvcmVkIGF0IGA8c3JjRGlyPi8ud3h0L2NhY2hlLzxrZXk+YC4gSnVzdCBjYWNoZXMgYSBzdHJpbmcgaW4gYVxuICogZmlsZSBmb3IgdGhlIGdpdmVuIGtleS5cbiAqXG4gKiBAcGFyYW0gc3JjRGlyIEFic29sdXRlIHBhdGggdG8gc291cmNlIGRpcmVjdG9yeS4gU2VlIGBJbnRlcm5hbENvbmZpZy5zcmNEaXJgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGc0NhY2hlKHd4dERpcjogc3RyaW5nKTogRnNDYWNoZSB7XG4gIGNvbnN0IGdldFBhdGggPSAoa2V5OiBzdHJpbmcpID0+XG4gICAgcmVzb2x2ZSh3eHREaXIsICdjYWNoZScsIGVuY29kZVVSSUNvbXBvbmVudChrZXkpKTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGdldFBhdGgoa2V5KTtcbiAgICAgIGF3YWl0IGVuc3VyZURpcihkaXJuYW1lKHBhdGgpKTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZUlmRGlmZmVyZW50KHBhdGgsIHZhbHVlKTtcbiAgICB9LFxuICAgIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChrZXkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuXG4vKipcbiAqIE9ubHkgd3JpdGUgdGhlIGNvbnRlbnRzIHRvIGEgZmlsZSBpZiBpdCByZXN1bHRzIGluIGEgY2hhbmdlLiBUaGlzIHByZXZlbnRzIHVubmVjZXNzYXJ5IGZpbGVcbiAqIHdhdGNoZXJzIGZyb20gYmVpbmcgdHJpZ2dlcmVkLCBsaWtlIFdYVCdzIGRldiBzZXJ2ZXIgb3IgdGhlIFRTIGxhbmd1YWdlIHNlcnZlciBpbiBlZGl0b3JzLlxuICpcbiAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIHdyaXRlIHRvLlxuICogQHBhcmFtIG5ld0NvbnRlbnRzIFRoZSBuZXcgdGV4dCBjb250ZW50IHRvIHdyaXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWxlSWZEaWZmZXJlbnQoXG4gIGZpbGU6IHN0cmluZyxcbiAgbmV3Q29udGVudHM6IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnRzID0gYXdhaXQgZnNcbiAgICAucmVhZEZpbGUoZmlsZSwgJ3V0Zi04JylcbiAgICAuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcblxuICBpZiAoZXhpc3RpbmdDb250ZW50cyAhPT0gbmV3Q29udGVudHMpIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZSwgbmV3Q29udGVudHMpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRW50cnlwb2ludCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBwYXRoLCB7IHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tICcuL3BhdGhzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudHJ5cG9pbnROYW1lKFxuICBlbnRyeXBvaW50c0Rpcjogc3RyaW5nLFxuICBpbnB1dFBhdGg6IHN0cmluZyxcbiAgLy8gdHlwZTogRW50cnlwb2ludFsndHlwZSddLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShlbnRyeXBvaW50c0RpciwgaW5wdXRQYXRoKTtcbiAgLy8gR3JhYiB0aGUgc3RyaW5nIHVwIHRvIHRoZSBmaXJzdCAuIG9yIC8gb3IgXFxcXFxuICBjb25zdCBuYW1lID0gcmVsYXRpdmVQYXRoLnNwbGl0KC9bXFwuXFwvXFxcXF0vLCAyKVswXTtcblxuICByZXR1cm4gbmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudHJ5cG9pbnRPdXRwdXRGaWxlKFxuICBlbnRyeXBvaW50OiBFbnRyeXBvaW50LFxuICBleHQ6IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIHJldHVybiByZXNvbHZlKGVudHJ5cG9pbnQub3V0cHV0RGlyLCBgJHtlbnRyeXBvaW50Lm5hbWV9JHtleHR9YCk7XG59XG5cbi8qKlxuICogUmV0dXJuJ3MgdGhlIGVudHJ5cG9pbnQncyBvdXRwdXQgcGF0aCByZWxhdGl2ZSB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gVXNlZCBmb3IgcGF0aHMgaW4gdGhlXG4gKiBtYW5pZmVzdCBhbmQgcm9sbHVwJ3MgYnVuZGxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gIGVudHJ5cG9pbnQ6IEVudHJ5cG9pbnQsXG4gIG91dERpcjogc3RyaW5nLFxuICBleHQ6IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIHJldHVybiBub3JtYWxpemVQYXRoKFxuICAgIHJlbGF0aXZlKG91dERpciwgZ2V0RW50cnlwb2ludE91dHB1dEZpbGUoZW50cnlwb2ludCwgZXh0KSksXG4gICk7XG59XG4iLCAiaW1wb3J0IG5vZGVQYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgKiBhcyB2aXRlIGZyb20gJ3ZpdGUnO1xuXG4vKipcbiAqIENvbnZlcnRzIHN5c3RlbSBwYXRocyB0byBub3JtYWxpemVkIGJ1bmRsZXIgcGF0aC4gT24gd2luZG93cyBhbmQgdW5peCwgdGhpcyByZXR1cm5zIHBhdGhzIHdpdGggL1xuICogaW5zdGVhZCBvZiBcXC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZpdGUubm9ybWFsaXplUGF0aChwYXRoKTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIG5vcm1hbGl6ZWQgcGF0aCwgY29udmVydCBpdCB0byB0aGUgc3lzdGVtIHBhdGggc3R5bGUuIE9uIFdpbmRvd3MsIHN3aXRjaCB0byBcXCwgb3RoZXJ3aXNlIHVzZSAvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5ub3JtYWxpemVQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBub2RlUGF0aC5ub3JtYWxpemUocGF0aCk7XG59XG5cbmV4cG9ydCBjb25zdCBDU1NfRVhURU5TSU9OUyA9IFsnY3NzJywgJ3Njc3MnLCAnc2FzcycsICdsZXNzJywgJ3N0eWwnLCAnc3R5bHVzJ107XG5cbi8vIC5tb2R1bGUuY3NzIGZpbGVzIGFyZSBub3Qgc3VwcG9ydGVkIGJlY2F1c2UgdGhlc2UgYXJlIGdsb2JhbCBDU1MgZmlsZXMsIHNvIHVzaW5nIENTUyBtb2R1bGVzIGRvZXNuJ3QgbWFrZSBzZW5zZS5cbmV4cG9ydCBjb25zdCBDU1NfRVhURU5TSU9OU19QQVRURVJOID0gYCsoJHtDU1NfRVhURU5TSU9OUy5qb2luKCd8Jyl9KWA7XG4iLCAiaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludE5hbWUgfSBmcm9tICcuLi91dGlscy9lbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBwYXJzZUhUTUwgfSBmcm9tICdsaW5rZWRvbSc7XG5pbXBvcnQgeyBkaXJuYW1lLCBpc0Fic29sdXRlLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuXG4vKipcbiAqIFByZS1yZW5kZXJzIHRoZSBIVE1MIGVudHJ5cG9pbnRzIHdoZW4gYnVpbGRpbmcgdGhlIGV4dGVuc2lvbiB0byBjb25uZWN0IHRvIHRoZSBkZXYgc2VydmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV2SHRtbFByZXJlbmRlcihjb25maWc6IEludGVybmFsQ29uZmlnKTogdml0ZS5QbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIGFwcGx5OiAnYnVpbGQnLFxuICAgIG5hbWU6ICd3eHQ6ZGV2LWh0bWwtcHJlcmVuZGVyJyxcbiAgICBjb25maWcoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXNvbHZlOiB7XG4gICAgICAgICAgYWxpYXM6IHtcbiAgICAgICAgICAgICdAd3h0L3JlbG9hZC1odG1sJzogcmVzb2x2ZShcbiAgICAgICAgICAgICAgY29uZmlnLnJvb3QsXG4gICAgICAgICAgICAgICdub2RlX21vZHVsZXMvd3h0L2Rpc3QvdmlydHVhbC1tb2R1bGVzL3JlbG9hZC1odG1sLmpzJyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBhc3luYyB0cmFuc2Zvcm0oaHRtbCwgaWQpIHtcbiAgICAgIGNvbnN0IHNlcnZlciA9IGNvbmZpZy5zZXJ2ZXI7XG4gICAgICBpZiAoY29uZmlnLmNvbW1hbmQgIT09ICdzZXJ2ZScgfHwgc2VydmVyID09IG51bGwgfHwgIWlkLmVuZHNXaXRoKCcuaHRtbCcpKVxuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsVXJsID0gYCR7c2VydmVyLm9yaWdpbn0ke2lkfWA7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0RW50cnlwb2ludE5hbWUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCBpZCk7XG4gICAgICBjb25zdCB1cmwgPSBgJHtzZXJ2ZXIub3JpZ2lufS8ke25hbWV9Lmh0bWxgO1xuICAgICAgY29uc3Qgc2VydmVySHRtbCA9IGF3YWl0IHNlcnZlci50cmFuc2Zvcm1JbmRleEh0bWwoXG4gICAgICAgIHVybCxcbiAgICAgICAgaHRtbCxcbiAgICAgICAgb3JpZ2luYWxVcmwsXG4gICAgICApO1xuICAgICAgY29uc3QgeyBkb2N1bWVudCB9ID0gcGFyc2VIVE1MKHNlcnZlckh0bWwpO1xuXG4gICAgICBjb25zdCBwb2ludFRvRGV2U2VydmVyID0gKHF1ZXJ5U2VsZWN0b3I6IHN0cmluZywgYXR0cjogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnlTZWxlY3RvcikuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNyYyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHIpO1xuICAgICAgICAgIGlmICghc3JjKSByZXR1cm47XG5cbiAgICAgICAgICBpZiAoaXNBYnNvbHV0ZShzcmMpKSB7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLCBzZXJ2ZXIub3JpZ2luICsgc3JjKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNyYy5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGFicyA9IHJlc29sdmUoZGlybmFtZShpZCksIHNyYyk7XG4gICAgICAgICAgICBjb25zdCBwYXRobmFtZSA9IHJlbGF0aXZlKGNvbmZpZy5yb290LCBhYnMpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ciwgYCR7c2VydmVyLm9yaWdpbn0vJHtwYXRobmFtZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHBvaW50VG9EZXZTZXJ2ZXIoJ3NjcmlwdFt0eXBlPW1vZHVsZV0nLCAnc3JjJyk7XG4gICAgICBwb2ludFRvRGV2U2VydmVyKCdsaW5rW3JlbD1zdHlsZXNoZWV0XScsICdocmVmJyk7XG5cbiAgICAgIC8vIEFkZCBhIHNjcmlwdCB0byBhZGQgcGFnZSByZWxvYWRpbmdcbiAgICAgIGNvbnN0IHJlbG9hZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICByZWxvYWRlci5zcmMgPSAnQHd4dC9yZWxvYWQtaHRtbCc7XG4gICAgICByZWxvYWRlci50eXBlID0gJ21vZHVsZSc7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHJlbG9hZGVyKTtcblxuICAgICAgY29uc3QgbmV3SHRtbCA9IGRvY3VtZW50LnRvU3RyaW5nKCk7XG4gICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCdUcmFuc2Zvcm1lZCAnICsgaWQpO1xuICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnT2xkIEhUTUw6XFxuJyArIGh0bWwpO1xuICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnTmV3IEhUTUw6XFxuJyArIG5ld0h0bWwpO1xuICAgICAgcmV0dXJuIG5ld0h0bWw7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIERlZmluZXMgZ2xvYmFsIGNvbnN0YW50cyBhYm91dCB0aGUgZGV2IHNlcnZlci4gSGVscHMgc2NyaXB0cyBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIncyB3ZWIgc29ja2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV2U2VydmVyR2xvYmFscyhpbnRlcm5hbENvbmZpZzogSW50ZXJuYWxDb25maWcpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6ZGV2LXNlcnZlci1nbG9iYWxzJyxcbiAgICBjb25maWcoKSB7XG4gICAgICBpZiAoaW50ZXJuYWxDb25maWcuc2VydmVyID09IG51bGwgfHwgaW50ZXJuYWxDb25maWcuY29tbWFuZCA9PSAnYnVpbGQnKVxuICAgICAgICByZXR1cm47XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRlZmluZToge1xuICAgICAgICAgIF9fREVWX1NFUlZFUl9QUk9UT0NPTF9fOiBKU09OLnN0cmluZ2lmeSgnd3M6JyksXG4gICAgICAgICAgX19ERVZfU0VSVkVSX0hPU1ROQU1FX186IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgaW50ZXJuYWxDb25maWcuc2VydmVyLmhvc3RuYW1lLFxuICAgICAgICAgICksXG4gICAgICAgICAgX19ERVZfU0VSVkVSX1BPUlRfXzogSlNPTi5zdHJpbmdpZnkoaW50ZXJuYWxDb25maWcuc2VydmVyLnBvcnQpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCBkbnMgZnJvbSAnbm9kZTpkbnMnO1xuaW1wb3J0IHsgd2l0aFRpbWVvdXQgfSBmcm9tICcuL3Byb21pc2VzJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5mdW5jdGlvbiBpc09mZmxpbmUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGlzT2ZmbGluZSA9IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXMpID0+IHtcbiAgICBkbnMucmVzb2x2ZSgnZ29vZ2xlLmNvbScsIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIgPT0gbnVsbCkge1xuICAgICAgICByZXMoZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzKHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHdpdGhUaW1lb3V0KGlzT2ZmbGluZSwgMWUzKS5jYXRjaCgoKSA9PiB0cnVlKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzT25saW5lKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBvZmZsaW5lID0gYXdhaXQgaXNPZmZsaW5lKCk7XG4gIHJldHVybiAhb2ZmbGluZTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIGEgVVJMIHdpdGggYSBzaW1wbGUgR0VUIHJlcXVlc3QuIEdyYWJzIGl0IGZyb20gY2FjaGUgaWYgaXQgZG9lc24ndCBleGlzdCwgb3IgdGhyb3dzIGFuXG4gKiBlcnJvciBpZiBpdCBjYW4ndCBiZSByZXNvbHZlZCB2aWEgdGhlIG5ldHdvcmsgb3IgY2FjaGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaENhY2hlZChcbiAgdXJsOiBzdHJpbmcsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBsZXQgY29udGVudDogc3RyaW5nID0gJyc7XG5cbiAgaWYgKGF3YWl0IGlzT25saW5lKCkpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIGlmIChyZXMuc3RhdHVzIDwgMzAwKSB7XG4gICAgICBjb250ZW50ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgIGF3YWl0IGNvbmZpZy5mc0NhY2hlLnNldCh1cmwsIGNvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgRmFpbGVkIHRvIGRvd25sb2FkIFwiJHt1cmx9XCIsIGZhbGxpbmcgYmFjayB0byBjYWNoZS4uLmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29udGVudCkgY29udGVudCA9IChhd2FpdCBjb25maWcuZnNDYWNoZS5nZXQodXJsKSkgPz8gJyc7XG4gIGlmICghY29udGVudClcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBPZmZsaW5lIGFuZCBcIiR7dXJsfVwiIGhhcyBub3QgYmVlbiBjYWNoZWQuIFRyeSBhZ2FpbiB3aGVuIG9ubGluZS5gLFxuICAgICk7XG5cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG4iLCAiLyoqXG4gKiBBZGQgYSB0aW1lb3V0IHRvIGEgcHJvbWlzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhUaW1lb3V0PFQ+KFxuICBwcm9taXNlOiBQcm9taXNlPFQ+LFxuICBkdXJhdGlvbjogbnVtYmVyLFxuKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICByZWooYFByb21pc2UgdGltZWQgb3V0IGFmdGVyICR7ZHVyYXRpb259bXNgKTtcbiAgICB9LCBkdXJhdGlvbik7XG4gICAgcHJvbWlzZVxuICAgICAgLnRoZW4ocmVzKVxuICAgICAgLmNhdGNoKHJlailcbiAgICAgIC5maW5hbGx5KCgpID0+IGNsZWFyVGltZW91dCh0aW1lb3V0KSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIERvbid0IHVzZSBpbiBwcm9kdWN0aW9uLCBqdXN0IGZvciB0ZXN0aW5nIGFuZCBzbG93aW5nIHRoaW5ncyBkb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlcykgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG59XG4iLCAiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGZldGNoQ2FjaGVkIH0gZnJvbSAnLi4vdXRpbHMvbmV0d29yayc7XG5cbi8qKlxuICogRG93bmxvYWRzIGFueSBVUkwgaW1wb3J0cywgbGlrZSBHb29nbGUgQW5hbHl0aWNzLCBpbnRvIHZpcnR1YWwgbW9kdWxlcyBzbyB0aGV5IGFyZSBidW5kbGVkIHdpdGhcbiAqIHRoZSBleHRlbnNpb24gaW5zdGVhZCBvZiBkZXBlbmRpbmcgb24gcmVtb3RlIGNvZGUgYXQgcnVudGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IFwidXJsOmh0dHBzOi8vZ29vZ2xlLXRhZ21hbmFnZXIuY29tL2d0YWc/aWQ9WFlaXCI7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZChjb25maWc6IEludGVybmFsQ29uZmlnKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd3h0OmRvd25sb2FkJyxcbiAgICByZXNvbHZlSWQoaWQpIHtcbiAgICAgIGlmIChpZC5zdGFydHNXaXRoKCd1cmw6JykpIHJldHVybiAnXFwwJyArIGlkO1xuICAgIH0sXG4gICAgYXN5bmMgbG9hZChpZCkge1xuICAgICAgaWYgKCFpZC5zdGFydHNXaXRoKCdcXDB1cmw6JykpIHJldHVybjtcblxuICAgICAgLy8gTG9hZCBmaWxlIGZyb20gbmV0d29yayBvciBjYWNoZVxuICAgICAgY29uc3QgdXJsID0gaWQucmVwbGFjZSgnXFwwdXJsOicsICcnKTtcbiAgICAgIHJldHVybiBhd2FpdCBmZXRjaENhY2hlZCh1cmwsIGNvbmZpZyk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgKiBhcyB2aXRlIGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgRW50cnlwb2ludCwgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBleHRuYW1lLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IGZzLCB7IGVuc3VyZURpciB9IGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tICcuLi91dGlscy9wYXRocyc7XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgSFRNTCBmaWxlcyBvdXRwdXQgYnkgYSBtdWx0aXBhZ2UgYnVpbGQgYXJlIGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uLiBUaGlzIGRvZXMgdHdvXG4gKiB0aGluZ3M6XG4gKlxuICogMS4gTW92ZXMgdGhlIEhNVEwgZmlsZXMgdG8gdGhlaXIgZmluYWwgbG9jYXRpb24gYXQgYDxvdXREaXI+LzxlbnRyeXBvaW50Lm5hbWU+Lmh0bWxgLlxuICogMi4gVXBkYXRlcyB0aGUgYnVuZGxlIHNvIGl0IHN1bW1hcml6ZXMgdGhlIGZpbGVzIGNvcnJlY3RseSBpbiB0aGUgcmV0dXJuZWQgYnVpbGQgb3V0cHV0LlxuICpcbiAqIEFzc2V0cyAoSlMgYW5kIENTUykgYXJlIG91dHB1dCB0byB0aGUgYDxvdXREaXI+L2Fzc2V0c2AgZGlyZWN0b3J5LCBhbmQgZG9uJ3QgbmVlZCB0byBiZSBtb2RpZmllZC5cbiAqIEhUTUwgZmlsZXMgYWNjZXNzIHRoZW0gdmlhIGFic29sdXRlIFVSTHMsIHNvIHdlIGRvbid0IG5lZWQgdG8gdXBkYXRlIGFueSBpbXBvcnQgcGF0aHMgaW4gdGhlIEhUTUxcbiAqIGZpbGVzIGVpdGhlci5cbiAqXG4gKiBUSElTIFBMVUdJTiBTSE9VTEQgT05MWSBCRSBBUFBMSUVEIFRPIE1VTFRJUEFHRSBCVUlMRFMuIEl0IHNob3VsZCBub3QgYmUgYWRkZWQgdG8gZXZlcnkgYnVpbGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBhZ2VNb3ZlKFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogdml0ZS5QbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6bXVsdGlwYWdlLW1vdmUnLFxuICAgIGFzeW5jIHdyaXRlQnVuZGxlKF8sIGJ1bmRsZSkge1xuICAgICAgZm9yIChjb25zdCBvbGRCdW5kbGVQYXRoIGluIGJ1bmRsZSkge1xuICAgICAgICAvLyBvbGRCdW5kbGVQYXRoID0gJ2VudHJ5cG9pbnRzL3BvcHVwLmh0bWwnIG9yICdlbnRyeXBvaW50cy9vcHRpb25zL2luZGV4Lmh0bWwnXG5cbiAgICAgICAgLy8gRmluZCBhIG1hdGNoaW5nIGVudHJ5cG9pbnQgLSBvbGRCdW5kbGVQYXRoIGlzIHRoZSBzYW1lIGFzIGVuZCBlbmQgb2YgdGhlIGlucHV0IHBhdGguXG4gICAgICAgIGNvbnN0IGVudHJ5cG9pbnQgPSBlbnRyeXBvaW50cy5maW5kKFxuICAgICAgICAgIChlbnRyeSkgPT4gISFub3JtYWxpemVQYXRoKGVudHJ5LmlucHV0UGF0aCkuZW5kc1dpdGgob2xkQnVuZGxlUGF0aCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChlbnRyeXBvaW50ID09IG51bGwpIHtcbiAgICAgICAgICBjb25maWcubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYE5vIGVudHJ5cG9pbnQgZm91bmQgZm9yICR7b2xkQnVuZGxlUGF0aH0sIGxlYXZpbmcgaW4gY2h1bmtzIGRpcmVjdG9yeWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgbmV3IGJ1bmRsZSBwYXRoXG4gICAgICAgIGNvbnN0IG5ld0J1bmRsZVBhdGggPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgICAgICBlbnRyeXBvaW50LFxuICAgICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgICAgZXh0bmFtZShvbGRCdW5kbGVQYXRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5ld0J1bmRsZVBhdGggPT09IG9sZEJ1bmRsZVBhdGgpIHtcbiAgICAgICAgICBjb25maWcubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgJ0hUTUwgZmlsZSBpcyBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uJyxcbiAgICAgICAgICAgIG9sZEJ1bmRsZVBhdGgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vdmUgZmlsZSBhbmQgdXBkYXRlIGJ1bmRsZVxuICAgICAgICAvLyBEbyB0aGlzIGluc2lkZSBhIG11dGV4IGxvY2sgc28gaXQgb25seSBydW5zIG9uZSBhdCBhIHRpbWUgZm9yIGNvbmN1cnJlbnQgbXVsdGlwYWdlIGJ1aWxkc1xuICAgICAgICBjb25zdCBvbGRBYnNQYXRoID0gcmVzb2x2ZShjb25maWcub3V0RGlyLCBvbGRCdW5kbGVQYXRoKTtcbiAgICAgICAgY29uc3QgbmV3QWJzUGF0aCA9IHJlc29sdmUoY29uZmlnLm91dERpciwgbmV3QnVuZGxlUGF0aCk7XG4gICAgICAgIGF3YWl0IGVuc3VyZURpcihkaXJuYW1lKG5ld0Fic1BhdGgpKTtcbiAgICAgICAgYXdhaXQgZnMubW92ZShvbGRBYnNQYXRoLCBuZXdBYnNQYXRoLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcblxuICAgICAgICBjb25zdCByZW5hbWVkQ2h1bmsgPSB7XG4gICAgICAgICAgLi4uYnVuZGxlW29sZEJ1bmRsZVBhdGhdLFxuICAgICAgICAgIGZpbGVOYW1lOiBuZXdCdW5kbGVQYXRoLFxuICAgICAgICB9O1xuICAgICAgICBkZWxldGUgYnVuZGxlW29sZEJ1bmRsZVBhdGhdO1xuICAgICAgICBidW5kbGVbbmV3QnVuZGxlUGF0aF0gPSByZW5hbWVkQ2h1bms7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVVbmltcG9ydCB9IGZyb20gJ3VuaW1wb3J0JztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0VW5pbXBvcnRPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvYXV0by1pbXBvcnRzJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBleHRuYW1lIH0gZnJvbSAncGF0aCc7XG5cbmNvbnN0IEVOQUJMRURfRVhURU5TSU9OUzogUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHVuZGVmaW5lZD4gPSB7XG4gICcuanMnOiB0cnVlLFxuICAnLmpzeCc6IHRydWUsXG4gICcudHMnOiB0cnVlLFxuICAnLnRzeCc6IHRydWUsXG4gICcudnVlJzogdHJ1ZSxcbiAgJy5zdmVsdGUnOiB0cnVlLFxufTtcblxuLyoqXG4gKiBJbmplY3QgYW55IGdsb2JhbCBpbXBvcnRzIGRlZmluZWQgYnkgdW5pbXBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaW1wb3J0KGNvbmZpZzogSW50ZXJuYWxDb25maWcpOiB2aXRlLlBsdWdpbk9wdGlvbiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRVbmltcG9ydE9wdGlvbnMoY29uZmlnKTtcbiAgaWYgKG9wdGlvbnMgPT09IGZhbHNlKSByZXR1cm4gW107XG5cbiAgY29uc3QgdW5pbXBvcnQgPSBjcmVhdGVVbmltcG9ydChvcHRpb25zKTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6dW5pbXBvcnQnLFxuICAgIGFzeW5jIGNvbmZpZygpIHtcbiAgICAgIGF3YWl0IHVuaW1wb3J0LnNjYW5JbXBvcnRzRnJvbURpcih1bmRlZmluZWQsIHsgY3dkOiBjb25maWcuc3JjRGlyIH0pO1xuICAgIH0sXG4gICAgYXN5bmMgdHJhbnNmb3JtKGNvZGUsIGlkKSB7XG4gICAgICBjb25zdCBleHQgPSBleHRuYW1lKGlkKTtcbiAgICAgIGlmIChFTkFCTEVEX0VYVEVOU0lPTlNbZXh0XSkgcmV0dXJuIHVuaW1wb3J0LmluamVjdEltcG9ydHMoY29kZSwgaWQpO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHsgVW5pbXBvcnRPcHRpb25zIH0gZnJvbSAndW5pbXBvcnQnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBtZXJnZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pbXBvcnRPcHRpb25zKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUGFydGlhbDxVbmltcG9ydE9wdGlvbnMgfCBmYWxzZT4ge1xuICBpZiAoY29uZmlnLmltcG9ydHMgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZGVmYXVsdE9wdGlvbnM6IFBhcnRpYWw8VW5pbXBvcnRPcHRpb25zPiA9IHtcbiAgICBkZWJ1Z0xvZzogY29uZmlnLmxvZ2dlci5kZWJ1ZyxcbiAgICBpbXBvcnRzOiBbeyBuYW1lOiAnZGVmaW5lQ29uZmlnJywgZnJvbTogJ3d4dCcgfV0sXG4gICAgcHJlc2V0czogW3sgcGFja2FnZTogJ3d4dC9jbGllbnQnIH0sIHsgcGFja2FnZTogJ3d4dC9icm93c2VyJyB9XSxcbiAgICB3YXJuOiBjb25maWcubG9nZ2VyLndhcm4sXG4gICAgZGlyczogWydjb21wb25lbnRzJywgJ2NvbXBvc2FibGVzJywgJ2hvb2tzJywgJ3V0aWxzJ10sXG4gIH07XG5cbiAgcmV0dXJuIG1lcmdlQ29uZmlnKFxuICAgIGRlZmF1bHRPcHRpb25zLFxuICAgIGNvbmZpZy5pbXBvcnRzLFxuICApIGFzIFBhcnRpYWw8VW5pbXBvcnRPcHRpb25zPjtcbn1cbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEVudHJ5cG9pbnQsIEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tICcuLi91dGlscy9wYXRocyc7XG5cbi8qKlxuICogV3JhcHMgYSB1c2VyJ3MgZW50cnlwb2ludCB3aXRoIGEgdml0dWFsIHZlcnNpb24gd2l0aCBhZGRpdGlvbmFsIGxvZ2ljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmlydHVhbEVudHJ5cG9pbihcbiAgdHlwZTogRW50cnlwb2ludFsndHlwZSddLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUGx1Z2luIHtcbiAgY29uc3QgdmlydHVhbElkID0gYHZpcnR1YWw6d3h0LSR7dHlwZX0/YDtcbiAgY29uc3QgcmVzb2x2ZWRWaXJ0dWFsSWQgPSBgXFwwJHt2aXJ0dWFsSWR9YDtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IGB3eHQ6dmlydHVhbC1lbnRyeXBvaW50YCxcbiAgICByZXNvbHZlSWQoaWQpIHtcbiAgICAgIC8vIElkIGRvZXNuJ3Qgc3RhcnQgd2l0aCBwcmVmaXgsIGl0IGxvb2tzIGxpa2UgdGhpczpcbiAgICAgIC8vIC9wYXRoL3RvL3Byb2plY3QvdmlydHVhbDpiYWNrZ3JvdW5kPy9wYXRoL3RvL3Byb2plY3QvZW50cnlwb2ludHMvYmFja2dyb3VuZC50c1xuICAgICAgY29uc3QgaW5kZXggPSBpZC5pbmRleE9mKHZpcnR1YWxJZCk7XG4gICAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGlucHV0UGF0aCA9IG5vcm1hbGl6ZVBhdGgoaWQuc3Vic3RyaW5nKGluZGV4ICsgdmlydHVhbElkLmxlbmd0aCkpO1xuICAgICAgcmV0dXJuIHJlc29sdmVkVmlydHVhbElkICsgaW5wdXRQYXRoO1xuICAgIH0sXG4gICAgYXN5bmMgbG9hZChpZCkge1xuICAgICAgaWYgKCFpZC5zdGFydHNXaXRoKHJlc29sdmVkVmlydHVhbElkKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBpbnB1dFBhdGggPSBpZC5yZXBsYWNlKHJlc29sdmVkVmlydHVhbElkLCAnJyk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgICAgICByZXNvbHZlKFxuICAgICAgICAgIGNvbmZpZy5yb290LFxuICAgICAgICAgIGBub2RlX21vZHVsZXMvd3h0L2Rpc3QvdmlydHVhbC1tb2R1bGVzLyR7dHlwZX0tZW50cnlwb2ludC5qc2AsXG4gICAgICAgICksXG4gICAgICAgICd1dGYtOCcsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoYHZpcnR1YWw6dXNlci0ke3R5cGV9YCwgaW5wdXRQYXRoKTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRzY29uZmlnUGF0aHMoY29uZmlnOiBJbnRlcm5hbENvbmZpZyk6IHZpdGUuUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd3h0OmFsaWFzZXMnLFxuICAgIGFzeW5jIGNvbmZpZygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc29sdmU6IHtcbiAgICAgICAgICBhbGlhczoge1xuICAgICAgICAgICAgJ0BAJzogY29uZmlnLnJvb3QsXG4gICAgICAgICAgICAnfn4nOiBjb25maWcucm9vdCxcbiAgICAgICAgICAgICdAJzogY29uZmlnLnNyY0RpcixcbiAgICAgICAgICAgICd+JzogY29uZmlnLnNyY0RpcixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ3ZpdGUnO1xuXG4vKipcbiAqIEluIGRldiBtb2RlLCBpZiB0aGVyZSdzIG5vdCBhIGJhY2tncm91bmQgc2NyaXB0IGxpc3RlZCwgd2UgbmVlZCB0byBhZGQgb25lLlxuICpcbiAqIFRoaXMgZGVmaW5lJ3MgYSB2aXJ0dWFsIG1vZHVsZSB0aGF0IGlzIGJhc2ljYWxseSBqdXN0IGEgbm9vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vb3BCYWNrZ3JvdW5kKCk6IFBsdWdpbiB7XG4gIGNvbnN0IHZpcnR1YWxNb2R1bGVJZCA9IFZJUlRVQUxfTk9PUF9CQUNLR1JPVU5EX01PRFVMRV9JRDtcbiAgY29uc3QgcmVzb2x2ZWRWaXJ0dWFsTW9kdWxlSWQgPSAnXFwwJyArIHZpcnR1YWxNb2R1bGVJZDtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd3h0Om5vb3AtYmFja2dyb3VuZCcsXG4gICAgcmVzb2x2ZUlkKGlkKSB7XG4gICAgICBpZiAoaWQgPT09IHZpcnR1YWxNb2R1bGVJZCkgcmV0dXJuIHJlc29sdmVkVmlydHVhbE1vZHVsZUlkO1xuICAgIH0sXG4gICAgbG9hZChpZCkge1xuICAgICAgaWYgKGlkID09PSByZXNvbHZlZFZpcnR1YWxNb2R1bGVJZCkge1xuICAgICAgICByZXR1cm4gYGltcG9ydCB7IGRlZmluZUJhY2tncm91bmQgfSBmcm9tICd3eHQvY2xpZW50JztcXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVCYWNrZ3JvdW5kKCgpID0+IHZvaWQgMClgO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBWSVJUVUFMX05PT1BfQkFDS0dST1VORF9NT0RVTEVfSUQgPSAndmlydHVhbDp1c2VyLWJhY2tncm91bmQnO1xuIiwgImltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBFbnRyeXBvaW50LCBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuXG4vKipcbiAqIFJlbmFtZSBDU1MgZW50cnlwb2ludCBvdXRwdXRzIHRvIGVuc3VyZSBhIEpTIGZpbGUgaXMgbm90IGdlbmVyYXRlZCwgYW5kIHRoYXQgdGhlIENTUyBmaWxlIGlzXG4gKiBwbGFjZWQgaW4gdGhlIGNvcnJlY3QgcGxhY2UuXG4gKlxuICogSXQ6XG4gKiAxLiBSZW5hbWVzIENTUyBmaWxlcyB0byB0aGVpciBmaW5hbCBwYXRoc1xuICogMi4gUmVtb3ZlcyB0aGUgSlMgZmlsZSB0aGF0IGdldCdzIG91dHB1dCBieSBsaWIgbW9kZVxuICpcbiAqIFRISVMgUExVR0lOIFNIT1VMRCBPTkxZIEJFIEFQUExJRUQgVE8gQ1NTIExJQiBNT0RFIEJVSUxEUy4gSXQgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byBldmVyeSBidWlsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzc0VudHJ5cG9pbnRzKFxuICBlbnRyeXBvaW50OiBFbnRyeXBvaW50LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogdml0ZS5QbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6Y3NzLWVudHJ5cG9pbnQnLFxuICAgIGNvbmZpZygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJ1aWxkOiB7XG4gICAgICAgICAgcm9sbHVwT3B0aW9uczoge1xuICAgICAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgICAgIGFzc2V0RmlsZU5hbWVzOiAoKSA9PlxuICAgICAgICAgICAgICAgIGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKGVudHJ5cG9pbnQsIGNvbmZpZy5vdXREaXIsICcuY3NzJyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGVCdW5kbGUoXywgYnVuZGxlKSB7XG4gICAgICBPYmplY3Qua2V5cyhidW5kbGUpLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoJy5qcycpKSBkZWxldGUgYnVuZGxlW2ZpbGVdO1xuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgKiBhcyB2aXRlIGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgdmlzdWFsaXplciB9IGZyb20gJ3JvbGx1cC1wbHVnaW4tdmlzdWFsaXplcic7XG5cbmxldCBpbmNyZW1lbnQgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVuZGxlQW5hbHlzaXMoKTogdml0ZS5QbHVnaW4ge1xuICByZXR1cm4gdmlzdWFsaXplcih7XG4gICAgZW1pdEZpbGU6IHRydWUsXG4gICAgdGVtcGxhdGU6ICdyYXctZGF0YScsXG4gICAgZmlsZW5hbWU6IGBzdGF0cy0ke2luY3JlbWVudCsrfS5qc29uYCxcbiAgfSkgYXMgdml0ZS5QbHVnaW47XG59XG4iLCAiaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxzKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnk7IHR5cGU6IHN0cmluZyB9PiB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbmFtZTogJ19fTUFOSUZFU1RfVkVSU0lPTl9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcubWFuaWZlc3RWZXJzaW9uLFxuICAgICAgdHlwZTogYDIgfCAzYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdfX0JST1dTRVJfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIsXG4gICAgICB0eXBlOiBgc3RyaW5nYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdfX0lTX0NIUk9NRV9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlciA9PT0gJ2Nocm9tZScsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19JU19GSVJFRk9YX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19JU19TQUZBUklfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIgPT09ICdzYWZhcmknLFxuICAgICAgdHlwZTogYGJvb2xlYW5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fSVNfRURHRV9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlciA9PT0gJ2VkZ2UnLFxuICAgICAgdHlwZTogYGJvb2xlYW5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fSVNfT1BFUkFfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIgPT09ICdvcGVyYScsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19DT01NQU5EX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5jb21tYW5kLFxuICAgICAgdHlwZTogYFwiYnVpbGRcIiB8IFwic2VydmVcImAsXG4gICAgfSxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudHJ5cG9pbnRHbG9iYWxzKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBlbnRyeXBvaW50TmFtZTogc3RyaW5nLFxuKSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbmFtZTogJ19fRU5UUllQT0lOVF9fJyxcbiAgICAgIHZhbHVlOiBlbnRyeXBvaW50TmFtZSxcbiAgICAgIHR5cGU6IGBzdHJpbmdgLFxuICAgIH0sXG4gIF07XG59XG4iLCAiaW1wb3J0IHsgQnVpbGRPdXRwdXQsIFd4dERldlNlcnZlciwgSW5saW5lQ29uZmlnIH0gZnJvbSAnLi9jb3JlL3R5cGVzJztcbmltcG9ydCB7IGdldEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi9jb3JlL3V0aWxzL2dldEludGVybmFsQ29uZmlnJztcbmltcG9ydCBwYyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCB7IGRldGVjdERldkNoYW5nZXMgfSBmcm9tICcuL2NvcmUvdXRpbHMvZGV0ZWN0RGV2Q2hhbmdlcyc7XG5pbXBvcnQgeyBNdXRleCB9IGZyb20gJ2FzeW5jLW11dGV4JztcbmltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcbmltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRPdXRwdXRGaWxlIH0gZnJvbSAnLi9jb3JlL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCB7IGJ1aWxkSW50ZXJuYWwsIHJlYnVpbGQgfSBmcm9tICcuL2NvcmUvYnVpbGQnO1xuaW1wb3J0IHtcbiAgZ2V0U2VydmVySW5mbyxcbiAgcmVsb2FkQ29udGVudFNjcmlwdHMsXG4gIHJlbG9hZEh0bWxQYWdlcyxcbiAgc2V0dXBTZXJ2ZXIsXG59IGZyb20gJy4vY29yZS9zZXJ2ZXInO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvY2xlYW4nO1xuZXhwb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvdHlwZXMvZXh0ZXJuYWwnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3V0aWxzL2RlZmluZUNvbmZpZyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvdXRpbHMvZGVmaW5lUnVubmVyQ29uZmlnJztcblxuLyoqXG4gKiBCdW5kbGVzIHRoZSBleHRlbnNpb24gZm9yIHByb2R1Y3Rpb24uIFJldHVybnMgYSBwcm9taXNlIG9mIHRoZSBidWlsZCByZXN1bHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChjb25maWc6IElubGluZUNvbmZpZyk6IFByb21pc2U8QnVpbGRPdXRwdXQ+IHtcbiAgY29uc3QgaW50ZXJuYWxDb25maWcgPSBhd2FpdCBnZXRJbnRlcm5hbENvbmZpZyhjb25maWcsICdidWlsZCcpO1xuICByZXR1cm4gYXdhaXQgYnVpbGRJbnRlcm5hbChpbnRlcm5hbENvbmZpZyk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRldiBzZXJ2ZXIsIHByZS1idWlsZHMgYWxsIHRoZSBmaWxlcyB0aGF0IG5lZWQgdG8gZXhpc3QgdG8gbG9hZCB0aGUgZXh0ZW5zaW9uLCBhbmQgb3BlblxuICogdGhlIGJyb3dzZXIgd2l0aCB0aGUgZXh0ZW5zaW9uIGluc3RhbGxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlcnZlcihcbiAgY29uZmlnPzogSW5saW5lQ29uZmlnLFxuKTogUHJvbWlzZTxXeHREZXZTZXJ2ZXI+IHtcbiAgY29uc3Qgc2VydmVySW5mbyA9IGF3YWl0IGdldFNlcnZlckluZm8oKTtcblxuICBjb25zdCBnZXRMYXRlc3RJbnRlcm5hbENvbmZpZyA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxDb25maWcoXG4gICAgICB7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgdml0ZTogKCkgPT4gc2VydmVySW5mby52aXRlU2VydmVyQ29uZmlnLFxuICAgICAgfSxcbiAgICAgICdzZXJ2ZScsXG4gICAgKTtcbiAgfTtcblxuICBsZXQgaW50ZXJuYWxDb25maWcgPSBhd2FpdCBnZXRMYXRlc3RJbnRlcm5hbENvbmZpZygpO1xuICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBzZXR1cFNlcnZlcihzZXJ2ZXJJbmZvLCBpbnRlcm5hbENvbmZpZyk7XG4gIGludGVybmFsQ29uZmlnLnNlcnZlciA9IHNlcnZlcjtcblxuICBjb25zdCBmaWxlQ2hhbmdlZE11dGV4ID0gbmV3IE11dGV4KCk7XG4gIGNvbnN0IGNoYW5nZVF1ZXVlOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtdO1xuXG4gIHNlcnZlci53cy5vbignd3h0OmJhY2tncm91bmQtaW5pdGlhbGl6ZWQnLCAoKSA9PiB7XG4gICAgLy8gUmVnaXN0ZXIgY29udGVudCBzY3JpcHRzIGZvciB0aGUgZmlyc3QgdGltZSBzaW5jZSB0aGV5J3JlIG5vdCBsaXN0ZWQgaW4gdGhlIG1hbmlmZXN0XG4gICAgcmVsb2FkQ29udGVudFNjcmlwdHMoc2VydmVyLmN1cnJlbnRPdXRwdXQuc3RlcHMsIGludGVybmFsQ29uZmlnLCBzZXJ2ZXIpO1xuICB9KTtcblxuICBzZXJ2ZXIud2F0Y2hlci5vbignYWxsJywgYXN5bmMgKGV2ZW50LCBwYXRoLCBfc3RhdHMpID0+IHtcbiAgICAvLyBIZXJlLCBcInBhdGhcIiBpcyBhIG5vbi1ub3JtYWxpemVkIHBhdGggKGllOiBDOlxcXFx1c2Vyc1xcXFwuLi4gaW5zdGVhZCBvZiBDOi91c2Vycy8uLi4pXG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChpbnRlcm5hbENvbmZpZy5vdXRCYXNlRGlyKSkgcmV0dXJuO1xuICAgIGNoYW5nZVF1ZXVlLnB1c2goW2V2ZW50LCBwYXRoXSk7XG5cbiAgICBhd2FpdCBmaWxlQ2hhbmdlZE11dGV4LnJ1bkV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlQ2hhbmdlcyA9IGNoYW5nZVF1ZXVlLnNwbGljZSgwLCBjaGFuZ2VRdWV1ZS5sZW5ndGgpO1xuICAgICAgaWYgKGZpbGVDaGFuZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBjaGFuZ2VzID0gZGV0ZWN0RGV2Q2hhbmdlcyhmaWxlQ2hhbmdlcywgc2VydmVyLmN1cnJlbnRPdXRwdXQpO1xuICAgICAgaWYgKGNoYW5nZXMudHlwZSA9PT0gJ25vLWNoYW5nZScpIHJldHVybjtcblxuICAgICAgLy8gTG9nIHRoZSBlbnRyeXBvaW50cyB0aGF0IHdlcmUgZWZmZWN0ZWRcbiAgICAgIGludGVybmFsQ29uZmlnLmxvZ2dlci5pbmZvKFxuICAgICAgICBgQ2hhbmdlZDogJHtBcnJheS5mcm9tKG5ldyBTZXQoZmlsZUNoYW5nZXMubWFwKChjaGFuZ2UpID0+IGNoYW5nZVsxXSkpKVxuICAgICAgICAgIC5tYXAoKGZpbGUpID0+IHBjLmRpbShyZWxhdGl2ZShpbnRlcm5hbENvbmZpZy5yb290LCBmaWxlKSkpXG4gICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCByZWJ1aWx0TmFtZXMgPSBjaGFuZ2VzLnJlYnVpbGRHcm91cHNcbiAgICAgICAgLmZsYXQoKVxuICAgICAgICAubWFwKChlbnRyeSkgPT4ge1xuICAgICAgICAgIHJldHVybiBwYy5jeWFuKFxuICAgICAgICAgICAgcmVsYXRpdmUoaW50ZXJuYWxDb25maWcub3V0RGlyLCBnZXRFbnRyeXBvaW50T3V0cHV0RmlsZShlbnRyeSwgJycpKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihwYy5kaW0oJywgJykpO1xuXG4gICAgICAvLyBHZXQgbGF0ZXN0IGNvbmZpZyBhbmQgUmVidWlsZCBncm91cHMgd2l0aCBjaGFuZ2VzXG4gICAgICBpbnRlcm5hbENvbmZpZyA9IGF3YWl0IGdldExhdGVzdEludGVybmFsQ29uZmlnKCk7XG4gICAgICBpbnRlcm5hbENvbmZpZy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgICBjb25zdCB7IG91dHB1dDogbmV3T3V0cHV0IH0gPSBhd2FpdCByZWJ1aWxkKFxuICAgICAgICBpbnRlcm5hbENvbmZpZyxcbiAgICAgICAgLy8gVE9ETzogdGhpcyBleGNsdWRlcyBuZXcgZW50cnlwb2ludHMsIHNvIHRoZXkncmUgbm90IGJ1aWx0IHVudGlsIHRoZSBkZXYgY29tbWFuZCBpcyByZXN0YXJ0ZWRcbiAgICAgICAgY2hhbmdlcy5yZWJ1aWxkR3JvdXBzLFxuICAgICAgICBjaGFuZ2VzLmNhY2hlZE91dHB1dCxcbiAgICAgICk7XG4gICAgICBzZXJ2ZXIuY3VycmVudE91dHB1dCA9IG5ld091dHB1dDtcblxuICAgICAgLy8gUGVyZm9ybSByZWxvYWRzXG4gICAgICBzd2l0Y2ggKGNoYW5nZXMudHlwZSkge1xuICAgICAgICBjYXNlICdleHRlbnNpb24tcmVsb2FkJzpcbiAgICAgICAgICBzZXJ2ZXIucmVsb2FkRXh0ZW5zaW9uKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2h0bWwtcmVsb2FkJzpcbiAgICAgICAgICByZWxvYWRIdG1sUGFnZXMoY2hhbmdlcy5yZWJ1aWxkR3JvdXBzLCBzZXJ2ZXIsIGludGVybmFsQ29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29udGVudC1zY3JpcHQtcmVsb2FkJzpcbiAgICAgICAgICByZWxvYWRDb250ZW50U2NyaXB0cyhjaGFuZ2VzLmNoYW5nZWRTdGVwcywgaW50ZXJuYWxDb25maWcsIHNlcnZlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zb2xhLnN1Y2Nlc3MoYFJlbG9hZGVkOiAke3JlYnVpbHROYW1lc31gKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHNlcnZlcjtcbn1cbiIsICIvKipcbiAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgYWxsIGVsZW1lbnRzIG9mIHRoZSBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQ+KFxuICBhcnJheTogVFtdLFxuICBwcmVkaWNhdGU6IChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspXG4gICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaV0sIGkpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuIiwgImltcG9ydCB7IEJ1aWxkT3V0cHV0LCBCdWlsZFN0ZXBPdXRwdXQsIEVudHJ5cG9pbnRHcm91cCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBldmVyeSB9IGZyb20gJy4vYXJyYXlzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tICcuL3BhdGhzJztcblxuLyoqXG4gKiBDb21wYXJlIHRoZSBjaGFuZ2VkIGZpbGVzIHZzIHRoZSBidWlsZCBvdXRwdXQgYW5kIGRldGVybWluZSB3aGF0IGtpbmQgb2YgcmVsb2FkIG5lZWRzIHRvIGhhcHBlbjpcbiAqXG4gKiAtIERvIG5vdGhpbmdcbiAqICAgLSBDU1Mgb3IgSlMgZmlsZSBhc3NvY2lhdGVkIHdpdGggYW4gSFRNTCBwYWdlIGlzIGNoYW5nZWQgLSB0aGlzIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSBieSB0aGVcbiAqICAgICBkZXYgc2VydmVyXG4gKiAgIC0gQ2hhbmdlIGlzbid0IHVzZWQgYnkgYW55IG9mIHRoZSBlbnRyeXBvaW50c1xuICogLSBSZWxvYWQgQ29udGVudCBzY3JpcHRcbiAqICAgLSBDU1Mgb3IgSlMgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBjb250ZW50IHNjcmlwdFxuICogICAtIEJhY2tncm91bmQgc2NyaXB0IHdpbGwgYmUgdG9sZCB0byByZWxvYWQgdGhlIGNvbnRlbnQgc2NyaXB0XG4gKiAtIFJlbG9hZCBIVE1MIGZpbGVcbiAqICAgLSBIVE1MIGZpbGUgaXRzZWxmIGlzIHNhdmVkIC0gSE1SIGRvZXNuJ3QgaGFuZGxlIHRoaXMgYmVjYXVzZSB0aGUgSFRNTCBwYWdlcyBhcmUgcHJlLXJlbmRlcmVkXG4gKiAgIC0gQ2hyb21lIGlzIE9LIHJlbG9hZGluZyB0aGUgcGFnZSB3aGVuIHRoZSBIVE1MIGZpbGUgaXMgY2hhbmdlZCB3aXRob3V0IHJlbG9hZGluZyB0aGUgd2hvbGVcbiAqICAgICBleHRlbnNpb24uIE5vdCBzdXJlIGFib3V0IGZpcmVmb3gsIHRoaXMgbWlnaHQgbmVlZCB0byBjaGFuZ2UgdG8gYW4gZXh0ZW5zaW9uIHJlbG9hZFxuICogLSBSZWxvYWQgZXh0ZW5zaW9uXG4gKiAgIC0gQmFja2dyb3VuZCBzY3JpcHQgaXMgY2hhbmdlZFxuICogICAtIE1hbmlmZXN0IGlzIGRpZmZlcmVudFxuICogLSBSZXN0YXJ0IGJyb3dzZXJcbiAqICAgLSBDb25maWcgZmlsZSBjaGFuZ2VkICh3eHQuY29uZmlnLnRzLCAuZW52LCB3ZWItZXh0LmNvbmZpZy50cywgZXRjKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0RGV2Q2hhbmdlcyhcbiAgY2hhbmdlZEZpbGVzOiBbZXZlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nXVtdLFxuICBjdXJyZW50T3V0cHV0OiBCdWlsZE91dHB1dCB8IHVuZGVmaW5lZCxcbik6IERldk1vZGVDaGFuZ2Uge1xuICBpZiAoY3VycmVudE91dHB1dCA9PSBudWxsKSByZXR1cm4geyB0eXBlOiAnbm8tY2hhbmdlJyB9O1xuXG4gIGNvbnN0IGNoYW5nZWRTdGVwcyA9IG5ldyBTZXQoXG4gICAgY2hhbmdlZEZpbGVzLmZsYXRNYXAoKGNoYW5nZWRGaWxlKSA9PlxuICAgICAgZmluZEVmZmVjdGVkU3RlcHMoY2hhbmdlZEZpbGUsIGN1cnJlbnRPdXRwdXQpLFxuICAgICksXG4gICk7XG4gIGlmIChjaGFuZ2VkU3RlcHMuc2l6ZSA9PT0gMCkgcmV0dXJuIHsgdHlwZTogJ25vLWNoYW5nZScgfTtcblxuICBjb25zdCB1bmNoYW5nZWRPdXRwdXQ6IEJ1aWxkT3V0cHV0ID0ge1xuICAgIG1hbmlmZXN0OiBjdXJyZW50T3V0cHV0Lm1hbmlmZXN0LFxuICAgIHN0ZXBzOiBbXSxcbiAgICBwdWJsaWNBc3NldHM6IFtdLFxuICB9O1xuICBjb25zdCBjaGFuZ2VkT3V0cHV0OiBCdWlsZE91dHB1dCA9IHtcbiAgICBtYW5pZmVzdDogY3VycmVudE91dHB1dC5tYW5pZmVzdCxcbiAgICBzdGVwczogW10sXG4gICAgcHVibGljQXNzZXRzOiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IHN0ZXAgb2YgY3VycmVudE91dHB1dC5zdGVwcykge1xuICAgIGlmIChjaGFuZ2VkU3RlcHMuaGFzKHN0ZXApKSB7XG4gICAgICBjaGFuZ2VkT3V0cHV0LnN0ZXBzLnB1c2goc3RlcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuY2hhbmdlZE91dHB1dC5zdGVwcy5wdXNoKHN0ZXApO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGFzc2V0IG9mIGN1cnJlbnRPdXRwdXQucHVibGljQXNzZXRzKSB7XG4gICAgaWYgKGNoYW5nZWRTdGVwcy5oYXMoYXNzZXQpKSB7XG4gICAgICBjaGFuZ2VkT3V0cHV0LnB1YmxpY0Fzc2V0cy5wdXNoKGFzc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5jaGFuZ2VkT3V0cHV0LnB1YmxpY0Fzc2V0cy5wdXNoKGFzc2V0KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc09ubHlIdG1sQ2hhbmdlcyA9XG4gICAgY2hhbmdlZEZpbGVzLmxlbmd0aCA+IDAgJiZcbiAgICBldmVyeShjaGFuZ2VkRmlsZXMsIChbXywgZmlsZV0pID0+IGZpbGUuZW5kc1dpdGgoJy5odG1sJykpO1xuICBpZiAoaXNPbmx5SHRtbENoYW5nZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2h0bWwtcmVsb2FkJyxcbiAgICAgIGNhY2hlZE91dHB1dDogdW5jaGFuZ2VkT3V0cHV0LFxuICAgICAgcmVidWlsZEdyb3VwczogY2hhbmdlZE91dHB1dC5zdGVwcy5tYXAoKHN0ZXApID0+IHN0ZXAuZW50cnlwb2ludHMpLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBpc09ubHlDb250ZW50U2NyaXB0cyA9XG4gICAgY2hhbmdlZE91dHB1dC5zdGVwcy5sZW5ndGggPiAwICYmXG4gICAgZXZlcnkoXG4gICAgICBjaGFuZ2VkT3V0cHV0LnN0ZXBzLmZsYXRNYXAoKHN0ZXApID0+IHN0ZXAuZW50cnlwb2ludHMpLFxuICAgICAgKGVudHJ5KSA9PiBlbnRyeS50eXBlID09PSAnY29udGVudC1zY3JpcHQnLFxuICAgICk7XG4gIGlmIChpc09ubHlDb250ZW50U2NyaXB0cykge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnY29udGVudC1zY3JpcHQtcmVsb2FkJyxcbiAgICAgIGNhY2hlZE91dHB1dDogdW5jaGFuZ2VkT3V0cHV0LFxuICAgICAgY2hhbmdlZFN0ZXBzOiBjaGFuZ2VkT3V0cHV0LnN0ZXBzLFxuICAgICAgcmVidWlsZEdyb3VwczogY2hhbmdlZE91dHB1dC5zdGVwcy5tYXAoKHN0ZXApID0+IHN0ZXAuZW50cnlwb2ludHMpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdleHRlbnNpb24tcmVsb2FkJyxcbiAgICBjYWNoZWRPdXRwdXQ6IHVuY2hhbmdlZE91dHB1dCxcbiAgICByZWJ1aWxkR3JvdXBzOiBjaGFuZ2VkT3V0cHV0LnN0ZXBzLm1hcCgoc3RlcCkgPT4gc3RlcC5lbnRyeXBvaW50cyksXG4gIH07XG59XG5cbi8qKlxuICogRm9yIGEgc2luZ2xlIGNoYW5nZSwgcmV0dXJuIGFsbCB0aGUgc3RlcCBvZiB0aGUgYnVpbGQgb3V0cHV0IHRoYXQgd2VyZSBlZmZlY3RlZCBieSBpdC5cbiAqL1xuZnVuY3Rpb24gZmluZEVmZmVjdGVkU3RlcHMoXG4gIGNoYW5nZWRGaWxlOiBbZXZlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nXSxcbiAgY3VycmVudE91dHB1dDogQnVpbGRPdXRwdXQsXG4pOiBEZXRlY3RlZENoYW5nZVtdIHtcbiAgY29uc3QgY2hhbmdlczogRGV0ZWN0ZWRDaGFuZ2VbXSA9IFtdO1xuICBjb25zdCBjaGFuZ2VkUGF0aCA9IG5vcm1hbGl6ZVBhdGgoY2hhbmdlZEZpbGVbMV0pO1xuXG4gIGNvbnN0IGlzQ2h1bmtFZmZlY3RlZCA9IChcbiAgICBjaHVuazogdml0ZS5Sb2xsdXAuT3V0cHV0Q2h1bmsgfCB2aXRlLlJvbGx1cC5PdXRwdXRBc3NldCxcbiAgKTogYm9vbGVhbiA9PlxuICAgIC8vIElmIGl0J3MgYW4gSFRNTCBmaWxlIHdpdGggdGhlIHNhbWUgcGF0aCwgaXMgaXMgZWZmZWN0ZWQgYmVjYXVzZSBIVE1MIGZpbGVzIG5lZWQgdG8gYmUgcHJlLXJlbmRlcmVkXG4gICAgLy8gZmlsZU5hbWUgaXMgbm9ybWFsaXplZCwgcmVsYXRpdmUgYnVuZGxlIHBhdGhcbiAgICAoY2h1bmsudHlwZSA9PT0gJ2Fzc2V0JyAmJiBjaGFuZ2VkUGF0aC5lbmRzV2l0aChjaHVuay5maWxlTmFtZSkpIHx8XG4gICAgLy8gSWYgaXQncyBhIGNodW5rIHRoYXQgZGVwZW5kcyBvbiB0aGUgY2hhbmdlZCBmaWxlLCBpdCBpcyBlZmZlY3RlZFxuICAgIC8vIG1vZHVsZUlkcyBhcmUgYWJzb2x1dGUsIG5vcm1hbGl6ZWQgcGF0aHNcbiAgICAoY2h1bmsudHlwZSA9PT0gJ2NodW5rJyAmJiBjaHVuay5tb2R1bGVJZHMuaW5jbHVkZXMoY2hhbmdlZFBhdGgpKTtcblxuICBmb3IgKGNvbnN0IHN0ZXAgb2YgY3VycmVudE91dHB1dC5zdGVwcykge1xuICAgIGNvbnN0IGVmZmVjdGVkQ2h1bmsgPSBzdGVwLmNodW5rcy5maW5kKChjaHVuaykgPT4gaXNDaHVua0VmZmVjdGVkKGNodW5rKSk7XG4gICAgaWYgKGVmZmVjdGVkQ2h1bmspIGNoYW5nZXMucHVzaChzdGVwKTtcbiAgfVxuXG4gIGNvbnN0IGVmZmVjdGVkQXNzZXQgPSBjdXJyZW50T3V0cHV0LnB1YmxpY0Fzc2V0cy5maW5kKChjaHVuaykgPT5cbiAgICBpc0NodW5rRWZmZWN0ZWQoY2h1bmspLFxuICApO1xuICBpZiAoZWZmZWN0ZWRBc3NldCkgY2hhbmdlcy5wdXNoKGVmZmVjdGVkQXNzZXQpO1xuXG4gIHJldHVybiBjaGFuZ2VzO1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgZmlsZXMgY2hhbmdlZCwgd2hhdCBuZWVkcyByZWJ1aWx0LCBhbmQgdGhlIHR5cGUgb2YgcmVsb2FkIHRoYXQgaXNcbiAqIHJlcXVpcmVkLlxuICovXG5leHBvcnQgdHlwZSBEZXZNb2RlQ2hhbmdlID1cbiAgfCBOb0NoYW5nZVxuICB8IEh0bWxSZWxvYWRcbiAgfCBFeHRlbnNpb25SZWxvYWRcbiAgfCBDb250ZW50U2NyaXB0UmVsb2FkO1xuLy8gfCBCcm93c2VyUmVzdGFydFxuXG5pbnRlcmZhY2UgTm9DaGFuZ2Uge1xuICB0eXBlOiAnbm8tY2hhbmdlJztcbn1cblxuaW50ZXJmYWNlIFJlYnVpbGRDaGFuZ2Uge1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgZW50cnlwb2ludHMgdGhhdCBuZWVkIHJlYnVpbHQuXG4gICAqL1xuICByZWJ1aWxkR3JvdXBzOiBFbnRyeXBvaW50R3JvdXBbXTtcbiAgLyoqXG4gICAqIFRoZSBwcmV2aW91cyBvdXRwdXQgc3RyaXBwZWQgb2YgYW55IGZpbGVzIGFyZSBnb2luZyB0byBjaGFuZ2UuXG4gICAqL1xuICBjYWNoZWRPdXRwdXQ6IEJ1aWxkT3V0cHV0O1xufVxuXG5pbnRlcmZhY2UgSHRtbFJlbG9hZCBleHRlbmRzIFJlYnVpbGRDaGFuZ2Uge1xuICB0eXBlOiAnaHRtbC1yZWxvYWQnO1xufVxuXG5pbnRlcmZhY2UgRXh0ZW5zaW9uUmVsb2FkIGV4dGVuZHMgUmVidWlsZENoYW5nZSB7XG4gIHR5cGU6ICdleHRlbnNpb24tcmVsb2FkJztcbn1cblxuLy8gaW50ZXJmYWNlIEJyb3dzZXJSZXN0YXJ0IGV4dGVuZHMgUmVidWlsZENoYW5nZSB7XG4vLyAgIHR5cGU6ICdicm93c2VyLXJlc3RhcnQnO1xuLy8gfVxuXG5pbnRlcmZhY2UgQ29udGVudFNjcmlwdFJlbG9hZCBleHRlbmRzIFJlYnVpbGRDaGFuZ2Uge1xuICB0eXBlOiAnY29udGVudC1zY3JpcHQtcmVsb2FkJztcbiAgY2hhbmdlZFN0ZXBzOiBCdWlsZFN0ZXBPdXRwdXRbXTtcbn1cblxuLyoqXG4gKiBXaGVuIGZpZ3VyaW5nIG91dCB3aGF0IG5lZWRzIHJlbG9hZGVkLCB0aGlzIHN0b3JlcyB0aGUgc3RlcCB0aGF0IHdhcyBjaGFuZ2VkLCBvciB0aGUgcHVibGljXG4gKiBkaXJlY3RvcnkgYXNzZXQgdGhhdCB3YXMgY2hhbmdlZC4gSXQgZG9lc24ndCBrbm93IHdoYXQgdHlwZSBvZiBjaGFuZ2UgaXMgcmVxdWlyZWQgeWV0LiBKdXN0IGFuXG4gKiBpbnRlcm1lZGlhdGUgdHlwZS5cbiAqL1xudHlwZSBEZXRlY3RlZENoYW5nZSA9IEJ1aWxkU3RlcE91dHB1dCB8IHZpdGUuUm9sbHVwLk91dHB1dEFzc2V0O1xuIiwgImltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQge1xuICBCdWlsZE91dHB1dCxcbiAgQnVpbGRTdGVwT3V0cHV0LFxuICBFbnRyeXBvaW50LFxuICBFbnRyeXBvaW50R3JvdXAsXG4gIEludGVybmFsQ29uZmlnLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB3eHRQbHVnaW5zIGZyb20gJy4uL3ZpdGUtcGx1Z2lucyc7XG5pbXBvcnQgeyByZW1vdmVFbXB0eURpcnMgfSBmcm9tICcuLi91dGlscy9yZW1vdmVFbXB0eURpcnMnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGggfSBmcm9tICcuLi91dGlscy9lbnRyeXBvaW50cyc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgZGlybmFtZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0UHVibGljRmlsZXMgfSBmcm9tICcuLi91dGlscy9wdWJsaWMnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludEdsb2JhbHMgfSBmcm9tICcuLi91dGlscy9nbG9iYWxzJztcbmltcG9ydCB0eXBlIHsgT3JhIH0gZnJvbSAnb3JhJztcbmltcG9ydCBwYyBmcm9tICdwaWNvY29sb3JzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkRW50cnlwb2ludHMoXG4gIGdyb3VwczogRW50cnlwb2ludEdyb3VwW10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4gIHNwaW5uZXI6IE9yYSxcbik6IFByb21pc2U8T21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4+IHtcbiAgY29uc3Qgc3RlcHM6IEJ1aWxkU3RlcE91dHB1dFtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZ3JvdXAgPSBncm91cHNbaV07XG5cbiAgICBzcGlubmVyLnRleHQgPVxuICAgICAgcGMuZGltKGBbJHtpICsgMX0vJHtncm91cHMubGVuZ3RofV1gKSArXG4gICAgICBgICR7W2dyb3VwXVxuICAgICAgICAuZmxhdCgpXG4gICAgICAgIC5tYXAoKGUpID0+IGUubmFtZSlcbiAgICAgICAgLmpvaW4ocGMuZGltKCcsICcpKX1gO1xuXG4gICAgY29uc3Qgc3RlcCA9IEFycmF5LmlzQXJyYXkoZ3JvdXApXG4gICAgICA/IGF3YWl0IGJ1aWxkTXVsdGlwbGVFbnRyeXBvaW50cyhncm91cCwgY29uZmlnKVxuICAgICAgOiBhd2FpdCBidWlsZFNpbmdsZUVudHJ5cG9pbnQoZ3JvdXAsIGNvbmZpZyk7XG4gICAgc3RlcHMucHVzaChzdGVwKTtcbiAgfVxuICBjb25zdCBwdWJsaWNBc3NldHMgPSBhd2FpdCBjb3B5UHVibGljRGlyZWN0b3J5KGNvbmZpZyk7XG5cbiAgLy8gUmVtb3ZlIGFueSBlbXB0eSBkaXJlY3RvcmllcyBmcm9tIG1vdmluZyBvdXRwdXRzIGFyb3VuZFxuICBhd2FpdCByZW1vdmVFbXB0eURpcnMoY29uZmlnLm91dERpcik7XG5cbiAgcmV0dXJuIHsgcHVibGljQXNzZXRzLCBzdGVwcyB9O1xufVxuXG4vKipcbiAqIFVzZSBWaXRlJ3MgbGliIG1vZGUgKyBJSUZFIGZvcm1hdCB0byBidW5kbGUgdGhlIGVudHJ5cG9pbnQgdG8gYSBzaW5nbGUgZmlsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRTaW5nbGVFbnRyeXBvaW50KFxuICBlbnRyeXBvaW50OiBFbnRyeXBvaW50LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxCdWlsZFN0ZXBPdXRwdXQ+IHtcbiAgLy8gU2hvdWxkIHRoaXMgZW50cnlwb2ludCBiZSB3cmFwcGVkIGJ5IHRoZSB2aXRlLXBsdWdpbnMvdmlydHVhbEVudHJ5cG9pbnQgcGx1Z2luP1xuICBjb25zdCBpc1ZpcnR1YWwgPSBbJ2JhY2tncm91bmQnLCAnY29udGVudC1zY3JpcHQnXS5pbmNsdWRlcyhlbnRyeXBvaW50LnR5cGUpO1xuICBjb25zdCBlbnRyeSA9IGlzVmlydHVhbFxuICAgID8gYHZpcnR1YWw6d3h0LSR7ZW50cnlwb2ludC50eXBlfT8ke2VudHJ5cG9pbnQuaW5wdXRQYXRofWBcbiAgICA6IGVudHJ5cG9pbnQuaW5wdXRQYXRoO1xuXG4gIGNvbnN0IHBsdWdpbnM6IE5vbk51bGxhYmxlPHZpdGUuVXNlckNvbmZpZ1sncGx1Z2lucyddPiA9IFtdO1xuICBpZiAoXG4gICAgZW50cnlwb2ludC50eXBlID09PSAnY29udGVudC1zY3JpcHQtc3R5bGUnIHx8XG4gICAgZW50cnlwb2ludC50eXBlID09PSAndW5saXN0ZWQtc3R5bGUnXG4gICkge1xuICAgIHBsdWdpbnMucHVzaCh3eHRQbHVnaW5zLmNzc0VudHJ5cG9pbnRzKGVudHJ5cG9pbnQsIGNvbmZpZykpO1xuICB9XG5cbiAgY29uc3QgbGliTW9kZTogdml0ZS5Vc2VyQ29uZmlnID0ge1xuICAgIHBsdWdpbnMsXG4gICAgYnVpbGQ6IHtcbiAgICAgIGxpYjoge1xuICAgICAgICBlbnRyeSxcbiAgICAgICAgZm9ybWF0czogWydpaWZlJ10sXG4gICAgICAgIG5hbWU6ICdfJyxcbiAgICAgICAgZmlsZU5hbWU6IGVudHJ5cG9pbnQubmFtZSxcbiAgICAgIH0sXG4gICAgICByb2xsdXBPcHRpb25zOiB7XG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgIC8vIFRoZXJlJ3Mgb25seSBhIHNpbmdsZSBvdXRwdXQgZm9yIHRoaXMgYnVpbGQsIHNvIHdlIHVzZSB0aGUgZGVzaXJlZCBidW5kbGUgcGF0aCBmb3IgdGhlXG4gICAgICAgICAgLy8gZW50cnkgb3V0cHV0IChsaWtlIFwiY29udGVudC1zY3JpcHRzL292ZXJsYXkuanNcIilcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICAgICAgICBlbnRyeXBvaW50LFxuICAgICAgICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICAgICAgICcuanMnLFxuICAgICAgICAgICksXG4gICAgICAgICAgLy8gT3V0cHV0IGNvbnRlbnQgc2NyaXB0IENTUyB0byBgY29udGVudC1zY3JpcHRzL2AsIGJ1dCBhbGwgb3RoZXIgc2NyaXB0cyBhcmUgd3JpdHRlbiB0b1xuICAgICAgICAgIC8vIGBhc3NldHMvYC5cbiAgICAgICAgICBhc3NldEZpbGVOYW1lczogKHsgbmFtZSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoZW50cnlwb2ludC50eXBlID09PSAnY29udGVudC1zY3JpcHQnICYmIG5hbWU/LmVuZHNXaXRoKCdjc3MnKSkge1xuICAgICAgICAgICAgICByZXR1cm4gYGNvbnRlbnQtc2NyaXB0cy8ke2VudHJ5cG9pbnQubmFtZX0uW2V4dF1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGBhc3NldHMvJHtlbnRyeXBvaW50Lm5hbWV9LltleHRdYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmluZToge1xuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ha2xpbmtlcjEvdml0ZS1wbHVnaW4td2ViLWV4dGVuc2lvbi9pc3N1ZXMvOTZcbiAgICAgICdwcm9jZXNzLmVudi5OT0RFX0VOVic6IEpTT04uc3RyaW5naWZ5KGNvbmZpZy5tb2RlKSxcbiAgICB9LFxuICB9O1xuICBmb3IgKGNvbnN0IGdsb2JhbCBvZiBnZXRFbnRyeXBvaW50R2xvYmFscyhjb25maWcsIGVudHJ5cG9pbnQubmFtZSkpIHtcbiAgICBsaWJNb2RlLmRlZmluZSFbZ2xvYmFsLm5hbWVdID0gSlNPTi5zdHJpbmdpZnkoZ2xvYmFsLnZhbHVlKTtcbiAgfVxuICBjb25zdCBlbnRyeUNvbmZpZyA9IHZpdGUubWVyZ2VDb25maWcoXG4gICAgbGliTW9kZSxcbiAgICBhd2FpdCBjb25maWcudml0ZShjb25maWcuZW52KSxcbiAgKSBhcyB2aXRlLklubGluZUNvbmZpZztcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCB2aXRlLmJ1aWxkKGVudHJ5Q29uZmlnKTtcbiAgcmV0dXJuIHtcbiAgICBlbnRyeXBvaW50czogZW50cnlwb2ludCxcbiAgICBjaHVua3M6IGdldEJ1aWxkT3V0cHV0Q2h1bmtzKHJlc3VsdCksXG4gIH07XG59XG5cbi8qKlxuICogVXNlIFZpdGUncyBtdWx0aXBhZ2UgYnVpbGQgdG8gYnVuZGxlIGFsbCB0aGUgZW50cnlwb2ludHMgaW4gYSBzaW5nbGUgc3RlcC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRNdWx0aXBsZUVudHJ5cG9pbnRzKFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxCdWlsZFN0ZXBPdXRwdXQ+IHtcbiAgY29uc3QgbXVsdGlQYWdlOiB2aXRlLlVzZXJDb25maWcgPSB7XG4gICAgcGx1Z2luczogW3d4dFBsdWdpbnMubXVsdGlwYWdlTW92ZShlbnRyeXBvaW50cywgY29uZmlnKV0sXG4gICAgYnVpbGQ6IHtcbiAgICAgIHJvbGx1cE9wdGlvbnM6IHtcbiAgICAgICAgaW5wdXQ6IGVudHJ5cG9pbnRzLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoaW5wdXQsIGVudHJ5KSA9PiB7XG4gICAgICAgICAgaW5wdXRbZW50cnkubmFtZV0gPSBlbnRyeS5pbnB1dFBhdGg7XG4gICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9LCB7fSksXG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgIC8vIEluY2x1ZGUgYSBoYXNoIHRvIHByZXZlbnQgY29uZmxpY3RzXG4gICAgICAgICAgY2h1bmtGaWxlTmFtZXM6ICdjaHVua3MvW25hbWVdLVtoYXNoXS5qcycsXG4gICAgICAgICAgLy8gSW5jbHVkZSBhIGhhc2ggdG8gcHJldmVudCBjb25mbGljdHNcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogJ2NodW5rcy9bbmFtZV0tW2hhc2hdLmpzJyxcbiAgICAgICAgICAvLyBXZSBjYW4ndCBjb250cm9sIHRoZSBcIm5hbWVcIiwgc28gd2UgbmVlZCBhIGhhc2ggdG8gcHJldmVudCBjb25mbGljdHNcbiAgICAgICAgICBhc3NldEZpbGVOYW1lczogJ2Fzc2V0cy9bbmFtZV0tW2hhc2hdLltleHRdJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkZWZpbmU6IHt9LFxuICB9O1xuICBmb3IgKGNvbnN0IGdsb2JhbCBvZiBnZXRFbnRyeXBvaW50R2xvYmFscyhjb25maWcsICdodG1sJykpIHtcbiAgICBtdWx0aVBhZ2UuZGVmaW5lIVtnbG9iYWwubmFtZV0gPSBKU09OLnN0cmluZ2lmeShnbG9iYWwudmFsdWUpO1xuICB9XG5cbiAgY29uc3QgZW50cnlDb25maWcgPSB2aXRlLm1lcmdlQ29uZmlnKFxuICAgIG11bHRpUGFnZSxcbiAgICBhd2FpdCBjb25maWcudml0ZShjb25maWcuZW52KSxcbiAgKSBhcyB2aXRlLlVzZXJDb25maWc7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdml0ZS5idWlsZChlbnRyeUNvbmZpZyk7XG4gIHJldHVybiB7XG4gICAgZW50cnlwb2ludHMsXG4gICAgY2h1bmtzOiBnZXRCdWlsZE91dHB1dENodW5rcyhyZXN1bHQpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRCdWlsZE91dHB1dENodW5rcyhcbiAgcmVzdWx0OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHZpdGUuYnVpbGQ+Pixcbik6IEJ1aWxkU3RlcE91dHB1dFsnY2h1bmtzJ10ge1xuICBpZiAoJ29uJyBpbiByZXN1bHQpIHRocm93IEVycm9yKCd3eHQgZG9lcyBub3Qgc3VwcG9ydCB2aXRlIHdhdGNoIG1vZGUuJyk7XG4gIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHJldHVybiByZXN1bHQuZmxhdE1hcCgoeyBvdXRwdXQgfSkgPT4gb3V0cHV0KTtcbiAgcmV0dXJuIHJlc3VsdC5vdXRwdXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcHlQdWJsaWNEaXJlY3RvcnkoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPEJ1aWxkT3V0cHV0WydwdWJsaWNBc3NldHMnXT4ge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGdldFB1YmxpY0ZpbGVzKGNvbmZpZyk7XG4gIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBwdWJsaWNBc3NldHM6IEJ1aWxkT3V0cHV0WydwdWJsaWNBc3NldHMnXSA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBzcmNQYXRoID0gcmVzb2x2ZShjb25maWcucHVibGljRGlyLCBmaWxlKTtcbiAgICBjb25zdCBvdXRQYXRoID0gcmVzb2x2ZShjb25maWcub3V0RGlyLCBmaWxlKTtcblxuICAgIGF3YWl0IGZzLmVuc3VyZURpcihkaXJuYW1lKG91dFBhdGgpKTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShzcmNQYXRoLCBvdXRQYXRoKTtcbiAgICBwdWJsaWNBc3NldHMucHVzaCh7XG4gICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgZmlsZU5hbWU6IGZpbGUsXG4gICAgICBuYW1lOiBmaWxlLFxuICAgICAgbmVlZHNDb2RlUmVmZXJlbmNlOiBmYWxzZSxcbiAgICAgIHNvdXJjZTogYXdhaXQgZnMucmVhZEZpbGUoc3JjUGF0aCksXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHVibGljQXNzZXRzO1xufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUVtcHR5RGlycyhkaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBmaWxlKTtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCByZW1vdmVFbXB0eURpcnMoZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucm1kaXIoZGlyKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gbm9vcCBvbiBmYWlsdXJlIC0gdGhpcyBtZWFucyB0aGUgZGlyZWN0b3J5IHdhcyBub3QgZW1wdHkuXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgZ2xvYiBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgdW5ub3JtYWxpemVQYXRoIH0gZnJvbSAnLi9wYXRocyc7XG5cbi8qKlxuICogR2V0IGFsbCB0aGUgZmlsZXMgaW4gdGhlIHByb2plY3QncyBwdWJsaWMgZGlyZWN0b3J5LiBSZXR1cm5lZCBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlXG4gKiBgY29uZmlnLnB1YmxpY0RpcmAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQdWJsaWNGaWxlcyhcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKGNvbmZpZy5wdWJsaWNEaXIpKSkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZ2xvYignKiovKicsIHsgY3dkOiBjb25maWcucHVibGljRGlyIH0pO1xuICByZXR1cm4gZmlsZXMubWFwKHVubm9ybWFsaXplUGF0aCk7XG59XG4iLCAiaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIEJhY2tncm91bmRFbnRyeXBvaW50LFxuICBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24sXG4gIEJhc2VFbnRyeXBvaW50T3B0aW9ucyxcbiAgQ29udGVudFNjcmlwdERlZmluaXRpb24sXG4gIENvbnRlbnRTY3JpcHRFbnRyeXBvaW50LFxuICBFbnRyeXBvaW50LFxuICBHZW5lcmljRW50cnlwb2ludCxcbiAgSW50ZXJuYWxDb25maWcsXG4gIE9wdGlvbnNFbnRyeXBvaW50LFxuICBQb3B1cEVudHJ5cG9pbnQsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBtaW5pbWF0Y2ggfSBmcm9tICdtaW5pbWF0Y2gnO1xuaW1wb3J0IHsgcGFyc2VIVE1MIH0gZnJvbSAnbGlua2Vkb20nO1xuaW1wb3J0IEpTT041IGZyb20gJ2pzb241JztcbmltcG9ydCB7IGltcG9ydEVudHJ5cG9pbnRGaWxlIH0gZnJvbSAnLi4vdXRpbHMvaW1wb3J0RW50cnlwb2ludEZpbGUnO1xuaW1wb3J0IGdsb2IgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnROYW1lIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgVklSVFVBTF9OT09QX0JBQ0tHUk9VTkRfTU9EVUxFX0lEIH0gZnJvbSAnLi4vdml0ZS1wbHVnaW5zL25vb3BCYWNrZ3JvdW5kJztcbmltcG9ydCB7IENTU19FWFRFTlNJT05TX1BBVFRFUk4gfSBmcm9tICcuLi91dGlscy9wYXRocyc7XG5cbi8qKlxuICogUmV0dXJuIGVudHJ5cG9pbnRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9uIGJ5IGxvb2tpbmcgdGhyb3VnaCB0aGUgcHJvamVjdCdzIGZpbGVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZEVudHJ5cG9pbnRzKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxFbnRyeXBvaW50W10+IHtcbiAgY29uc3QgcmVsYXRpdmVQYXRocyA9IGF3YWl0IGdsb2IoJyoqLyonLCB7XG4gICAgY3dkOiBjb25maWcuZW50cnlwb2ludHNEaXIsXG4gIH0pO1xuICAvLyBFbnN1cmUgY29uc2lzdGVudCBvdXRwdXRcbiAgcmVsYXRpdmVQYXRocy5zb3J0KCk7XG5cbiAgY29uc3QgcGF0aEdsb2JzID0gT2JqZWN0LmtleXMoUEFUSF9HTE9CX1RPX1RZUEVfTUFQKTtcbiAgY29uc3QgZXhpc3RpbmdOYW1lczogUmVjb3JkPHN0cmluZywgRW50cnlwb2ludCB8IHVuZGVmaW5lZD4gPSB7fTtcblxuICBjb25zdCBlbnRyeXBvaW50czogRW50cnlwb2ludFtdID0gW107XG4gIGxldCBoYXNCYWNrZ3JvdW5kID0gZmFsc2U7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHJlbGF0aXZlUGF0aHMubWFwKGFzeW5jIChyZWxhdGl2ZVBhdGgpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKGNvbmZpZy5lbnRyeXBvaW50c0RpciwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIGNvbnN0IG1hdGNoaW5nR2xvYiA9IHBhdGhHbG9icy5maW5kKChnbG9iKSA9PlxuICAgICAgICBtaW5pbWF0Y2gocmVsYXRpdmVQYXRoLCBnbG9iKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChtYXRjaGluZ0dsb2IgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGAke3JlbGF0aXZlUGF0aH0gZG9lcyBub3QgbWF0Y2ggYW55IGtub3duIGVudHJ5cG9pbnQuIEtub3duIGVudHJ5cG9pbnRzOlxcbiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBQQVRIX0dMT0JfVE9fVFlQRV9NQVAsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgMixcbiAgICAgICAgICApfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGUgPSBQQVRIX0dMT0JfVE9fVFlQRV9NQVBbbWF0Y2hpbmdHbG9iXTtcbiAgICAgIGlmICh0eXBlID09PSAnaWdub3JlZCcpIHJldHVybjtcblxuICAgICAgbGV0IGVudHJ5cG9pbnQ6IEVudHJ5cG9pbnQ7XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAncG9wdXAnOlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSBhd2FpdCBnZXRQb3B1cEVudHJ5cG9pbnQoY29uZmlnLCBwYXRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb3B0aW9ucyc6XG4gICAgICAgICAgZW50cnlwb2ludCA9IGF3YWl0IGdldE9wdGlvbnNFbnRyeXBvaW50KGNvbmZpZywgcGF0aCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JhY2tncm91bmQnOlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSBhd2FpdCBnZXRCYWNrZ3JvdW5kRW50cnlwb2ludChjb25maWcsIHBhdGgpO1xuICAgICAgICAgIGhhc0JhY2tncm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjb250ZW50LXNjcmlwdCc6XG4gICAgICAgICAgZW50cnlwb2ludCA9IGF3YWl0IGdldENvbnRlbnRTY3JpcHRFbnRyeXBvaW50KFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgZ2V0RW50cnlwb2ludE5hbWUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCBwYXRoKSxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndW5saXN0ZWQtcGFnZSc6XG4gICAgICAgICAgZW50cnlwb2ludCA9IGF3YWl0IGdldFVubGlzdGVkUGFnZUVudHJ5cG9pbnQoY29uZmlnLCBwYXRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29udGVudC1zY3JpcHQtc3R5bGUnOlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSB7XG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbmFtZTogZ2V0RW50cnlwb2ludE5hbWUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCBwYXRoKSxcbiAgICAgICAgICAgIGlucHV0UGF0aDogcGF0aCxcbiAgICAgICAgICAgIG91dHB1dERpcjogcmVzb2x2ZShjb25maWcub3V0RGlyLCBDT05URU5UX1NDUklQVF9PVVRfRElSKSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgaW5jbHVkZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBleGNsdWRlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZW50cnlwb2ludCA9IHtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBuYW1lOiBnZXRFbnRyeXBvaW50TmFtZShjb25maWcuZW50cnlwb2ludHNEaXIsIHBhdGgpLFxuICAgICAgICAgICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgICAgICAgICAgb3V0cHV0RGlyOiBjb25maWcub3V0RGlyLFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICBpbmNsdWRlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGV4Y2x1ZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd2l0aFNhbWVOYW1lID0gZXhpc3RpbmdOYW1lc1tlbnRyeXBvaW50Lm5hbWVdO1xuICAgICAgaWYgKHdpdGhTYW1lTmFtZSkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgTXVsdGlwbGUgZW50cnlwb2ludHMgd2l0aCB0aGUgbmFtZSBcIiR7XG4gICAgICAgICAgICBlbnRyeXBvaW50Lm5hbWVcbiAgICAgICAgICB9XCIgZGV0ZWN0ZWQsIGJ1dCBvbmx5IG9uZSBpcyBhbGxvd2VkOiAke1tcbiAgICAgICAgICAgIHJlbGF0aXZlKGNvbmZpZy5yb290LCB3aXRoU2FtZU5hbWUuaW5wdXRQYXRoKSxcbiAgICAgICAgICAgIHJlbGF0aXZlKGNvbmZpZy5yb290LCBlbnRyeXBvaW50LmlucHV0UGF0aCksXG4gICAgICAgICAgXS5qb2luKCcsICcpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbnRyeXBvaW50cy5wdXNoKGVudHJ5cG9pbnQpO1xuICAgICAgZXhpc3RpbmdOYW1lc1tlbnRyeXBvaW50Lm5hbWVdID0gZW50cnlwb2ludDtcbiAgICB9KSxcbiAgKTtcbiAgaWYgKGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnICYmICFoYXNCYWNrZ3JvdW5kKSB7XG4gICAgZW50cnlwb2ludHMucHVzaChcbiAgICAgIGF3YWl0IGdldEJhY2tncm91bmRFbnRyeXBvaW50KGNvbmZpZywgVklSVFVBTF9OT09QX0JBQ0tHUk9VTkRfTU9EVUxFX0lEKSxcbiAgICApO1xuICB9XG5cbiAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnQWxsIGVudHJ5cG9pbnRzOicsIGVudHJ5cG9pbnRzKTtcbiAgY29uc3QgdGFyZ2V0RW50cnlwb2ludHMgPSBlbnRyeXBvaW50cy5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgY29uc3QgeyBpbmNsdWRlLCBleGNsdWRlIH0gPSBlbnRyeS5vcHRpb25zO1xuICAgIGlmIChpbmNsdWRlPy5sZW5ndGggJiYgZXhjbHVkZT8ubGVuZ3RoKSB7XG4gICAgICBjb25maWcubG9nZ2VyLndhcm4oXG4gICAgICAgIGBUaGUgJHtlbnRyeS5uYW1lfSBlbnRyeXBvaW50IGxpc3RzIGJvdGggaW5jbHVkZSBhbmQgZXhjbHVkZSwgYnV0IG9ubHkgb25lIGNhbiBiZSB1c2VkIHBlciBlbnRyeXBvaW50LiBFbnRyeXBvaW50IGlnbm9yZWQuYCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChleGNsdWRlPy5sZW5ndGggJiYgIWluY2x1ZGU/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuICFleGNsdWRlLmluY2x1ZGVzKGNvbmZpZy5icm93c2VyKTtcbiAgICB9XG4gICAgaWYgKGluY2x1ZGU/Lmxlbmd0aCAmJiAhZXhjbHVkZT8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gaW5jbHVkZS5pbmNsdWRlcyhjb25maWcuYnJvd3Nlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuICBjb25maWcubG9nZ2VyLmRlYnVnKGAke2NvbmZpZy5icm93c2VyfSBlbnRyeXBvaW50czpgLCB0YXJnZXRFbnRyeXBvaW50cyk7XG4gIHJldHVybiB0YXJnZXRFbnRyeXBvaW50cztcbn1cblxuZnVuY3Rpb24gZ2V0SHRtbEJhc2VPcHRpb25zKGRvY3VtZW50OiBEb2N1bWVudCk6IEJhc2VFbnRyeXBvaW50T3B0aW9ucyB7XG4gIGNvbnN0IG9wdGlvbnM6IEJhc2VFbnRyeXBvaW50T3B0aW9ucyA9IHt9O1xuXG4gIGNvbnN0IGluY2x1ZGVDb250ZW50ID0gZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nbWFuaWZlc3QuaW5jbHVkZSddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKGluY2x1ZGVDb250ZW50KSB7XG4gICAgb3B0aW9ucy5pbmNsdWRlID0gSlNPTjUucGFyc2UoaW5jbHVkZUNvbnRlbnQpO1xuICB9XG5cbiAgY29uc3QgZXhjbHVkZUNvbnRlbnQgPSBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdtYW5pZmVzdC5leGNsdWRlJ11cIilcbiAgICA/LmdldEF0dHJpYnV0ZSgnY29udGVudCcpO1xuICBpZiAoZXhjbHVkZUNvbnRlbnQpIHtcbiAgICBvcHRpb25zLmV4Y2x1ZGUgPSBKU09ONS5wYXJzZShleGNsdWRlQ29udGVudCk7XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBAcGFyYW0gcGF0aCBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwb3B1cCBIVE1MIGZpbGUuXG4gKiBAcGFyYW0gY29udGVudCBTdHJpbmcgY29udGVudHMgb2YgdGhlIGZpbGUgYXQgdGhlIHBhdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBvcHVwRW50cnlwb2ludChcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgcGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTxQb3B1cEVudHJ5cG9pbnQ+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICBjb25zdCB7IGRvY3VtZW50IH0gPSBwYXJzZUhUTUwoY29udGVudCk7XG5cbiAgY29uc3Qgb3B0aW9uczogUG9wdXBFbnRyeXBvaW50WydvcHRpb25zJ10gPSBnZXRIdG1sQmFzZU9wdGlvbnMoZG9jdW1lbnQpO1xuXG4gIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKTtcbiAgaWYgKHRpdGxlICE9IG51bGwpIG9wdGlvbnMuZGVmYXVsdFRpdGxlID0gdGl0bGUudGV4dENvbnRlbnQgPz8gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGRlZmF1bHRJY29uQ29udGVudCA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J21hbmlmZXN0LmRlZmF1bHRfaWNvbiddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKGRlZmF1bHRJY29uQ29udGVudCkge1xuICAgIHRyeSB7XG4gICAgICBvcHRpb25zLmRlZmF1bHRJY29uID0gSlNPTjUucGFyc2UoZGVmYXVsdEljb25Db250ZW50KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZmF0YWwoXG4gICAgICAgIGBGYWlsZWQgdG8gcGFyc2UgZGVmYXVsdF9pY29uIG1ldGEgdGFnIGNvbnRlbnQgYXMgSlNPTjUuIGNvbnRlbnQ9JHtkZWZhdWx0SWNvbkNvbnRlbnR9YCxcbiAgICAgICAgZXJyLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBtdjJLZXlDb250ZW50ID0gZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nbWFuaWZlc3QudHlwZSddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKG12MktleUNvbnRlbnQpIHtcbiAgICBvcHRpb25zLm12MktleSA9XG4gICAgICBtdjJLZXlDb250ZW50ID09PSAncGFnZV9hY3Rpb24nID8gJ3BhZ2VfYWN0aW9uJyA6ICdicm93c2VyX2FjdGlvbic7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdwb3B1cCcsXG4gICAgbmFtZTogJ3BvcHVwJyxcbiAgICBvcHRpb25zLFxuICAgIGlucHV0UGF0aDogcGF0aCxcbiAgICBvdXRwdXREaXI6IGNvbmZpZy5vdXREaXIsXG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHBhdGggQWJzb2x1dGUgcGF0aCB0byB0aGUgb3B0aW9ucyBIVE1MIGZpbGUuXG4gKiBAcGFyYW0gY29udGVudCBTdHJpbmcgY29udGVudHMgb2YgdGhlIGZpbGUgYXQgdGhlIHBhdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE9wdGlvbnNFbnRyeXBvaW50KFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBwYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPE9wdGlvbnNFbnRyeXBvaW50PiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgeyBkb2N1bWVudCB9ID0gcGFyc2VIVE1MKGNvbnRlbnQpO1xuXG4gIGNvbnN0IG9wdGlvbnM6IE9wdGlvbnNFbnRyeXBvaW50WydvcHRpb25zJ10gPSBnZXRIdG1sQmFzZU9wdGlvbnMoZG9jdW1lbnQpO1xuXG4gIGNvbnN0IG9wZW5JblRhYkNvbnRlbnQgPSBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdtYW5pZmVzdC5vcGVuX2luX3RhYiddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKG9wZW5JblRhYkNvbnRlbnQpIHtcbiAgICBvcHRpb25zLm9wZW5JblRhYiA9IG9wZW5JblRhYkNvbnRlbnQgPT09ICd0cnVlJztcbiAgfVxuXG4gIGNvbnN0IGNocm9tZVN0eWxlQ29udGVudCA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J21hbmlmZXN0LmNocm9tZV9zdHlsZSddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKGNocm9tZVN0eWxlQ29udGVudCkge1xuICAgIG9wdGlvbnMuY2hyb21lU3R5bGUgPSBjaHJvbWVTdHlsZUNvbnRlbnQgPT09ICd0cnVlJztcbiAgfVxuXG4gIGNvbnN0IGJyb3dzZXJTdHlsZUNvbnRlbnQgPSBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdtYW5pZmVzdC5icm93c2VyX3N0eWxlJ11cIilcbiAgICA/LmdldEF0dHJpYnV0ZSgnY29udGVudCcpO1xuICBpZiAoYnJvd3NlclN0eWxlQ29udGVudCkge1xuICAgIG9wdGlvbnMuYnJvd3NlclN0eWxlID0gYnJvd3NlclN0eWxlQ29udGVudCA9PT0gJ3RydWUnO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnb3B0aW9ucycsXG4gICAgbmFtZTogJ29wdGlvbnMnLFxuICAgIG9wdGlvbnMsXG4gICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgIG91dHB1dERpcjogY29uZmlnLm91dERpcixcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gcGF0aCBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBIVE1MIGZpbGUuXG4gKiBAcGFyYW0gY29udGVudCBTdHJpbmcgY29udGVudHMgb2YgdGhlIGZpbGUgYXQgdGhlIHBhdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFVubGlzdGVkUGFnZUVudHJ5cG9pbnQoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4gIHBhdGg6IHN0cmluZyxcbik6IFByb21pc2U8R2VuZXJpY0VudHJ5cG9pbnQ+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICBjb25zdCB7IGRvY3VtZW50IH0gPSBwYXJzZUhUTUwoY29udGVudCk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAndW5saXN0ZWQtcGFnZScsXG4gICAgbmFtZTogZ2V0RW50cnlwb2ludE5hbWUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCBwYXRoKSxcbiAgICBpbnB1dFBhdGg6IHBhdGgsXG4gICAgb3V0cHV0RGlyOiBjb25maWcub3V0RGlyLFxuICAgIG9wdGlvbnM6IGdldEh0bWxCYXNlT3B0aW9ucyhkb2N1bWVudCksXG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHBhdGggQWJzb2x1dGUgcGF0aCB0byB0aGUgYmFja2dyb3VuZCdzIFRTIGZpbGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEJhY2tncm91bmRFbnRyeXBvaW50KFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBwYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPEJhY2tncm91bmRFbnRyeXBvaW50PiB7XG4gIGxldCBvcHRpb25zOiBPbWl0PEJhY2tncm91bmRTY3JpcHREZWZpbnRpdGlvbiwgJ21haW4nPiA9IHt9O1xuICBpZiAocGF0aCAhPT0gVklSVFVBTF9OT09QX0JBQ0tHUk9VTkRfTU9EVUxFX0lEKSB7XG4gICAgY29uc3QgZGVmYXVsdEV4cG9ydCA9XG4gICAgICBhd2FpdCBpbXBvcnRFbnRyeXBvaW50RmlsZTxCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24+KHBhdGgsIGNvbmZpZyk7XG4gICAgaWYgKGRlZmF1bHRFeHBvcnQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0JhY2tncm91bmQgc2NyaXB0IGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGV4cG9ydCcpO1xuICAgIH1cbiAgICBjb25zdCB7IG1haW46IF8sIC4uLm1vZHVsZU9wdGlvbnMgfSA9IGRlZmF1bHRFeHBvcnQ7XG4gICAgb3B0aW9ucyA9IG1vZHVsZU9wdGlvbnM7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnYmFja2dyb3VuZCcsXG4gICAgbmFtZTogJ2JhY2tncm91bmQnLFxuICAgIGlucHV0UGF0aDogcGF0aCxcbiAgICBvdXRwdXREaXI6IGNvbmZpZy5vdXREaXIsXG4gICAgb3B0aW9uczogb3B0aW9ucyxcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gcGF0aCBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBjb250ZW50IHNjcmlwdCdzIFRTIGZpbGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENvbnRlbnRTY3JpcHRFbnRyeXBvaW50KFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBuYW1lOiBzdHJpbmcsXG4gIHBhdGg6IHN0cmluZyxcbik6IFByb21pc2U8Q29udGVudFNjcmlwdEVudHJ5cG9pbnQ+IHtcbiAgY29uc3QgeyBtYWluOiBfLCAuLi5vcHRpb25zIH0gPVxuICAgIGF3YWl0IGltcG9ydEVudHJ5cG9pbnRGaWxlPENvbnRlbnRTY3JpcHREZWZpbml0aW9uPihwYXRoLCBjb25maWcpO1xuICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgdGhyb3cgRXJyb3IoYENvbnRlbnQgc2NyaXB0ICR7bmFtZX0gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgZXhwb3J0YCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnY29udGVudC1zY3JpcHQnLFxuICAgIG5hbWU6IGdldEVudHJ5cG9pbnROYW1lKGNvbmZpZy5lbnRyeXBvaW50c0RpciwgcGF0aCksXG4gICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgIG91dHB1dERpcjogcmVzb2x2ZShjb25maWcub3V0RGlyLCBDT05URU5UX1NDUklQVF9PVVRfRElSKSxcbiAgICBvcHRpb25zLFxuICB9O1xufVxuXG5jb25zdCBQQVRIX0dMT0JfVE9fVFlQRV9NQVA6IFJlY29yZDxzdHJpbmcsIEVudHJ5cG9pbnRbJ3R5cGUnXSB8ICdpZ25vcmVkJz4gPSB7XG4gICdzYW5kYm94Lmh0bWwnOiAnc2FuZGJveCcsXG4gICdzYW5kYm94L2luZGV4Lmh0bWwnOiAnc2FuZGJveCcsXG4gICcqLnNhbmRib3guaHRtbCc6ICdzYW5kYm94JyxcbiAgJyouc2FuZGJveC9pbmRleC5odG1sJzogJ3NhbmRib3gnLFxuXG4gICdib29rbWFya3MuaHRtbCc6ICdib29rbWFya3MnLFxuICAnYm9va21hcmtzL2luZGV4Lmh0bWwnOiAnYm9va21hcmtzJyxcblxuICAnaGlzdG9yeS5odG1sJzogJ2hpc3RvcnknLFxuICAnaGlzdG9yeS9pbmRleC5odG1sJzogJ2hpc3RvcnknLFxuXG4gICduZXd0YWIuaHRtbCc6ICduZXd0YWInLFxuICAnbmV3dGFiL2luZGV4Lmh0bWwnOiAnbmV3dGFiJyxcblxuICAnc2lkZXBhbmVsLmh0bWwnOiAnc2lkZXBhbmVsJyxcbiAgJ3NpZGVwYW5lbC9pbmRleC5odG1sJzogJ3NpZGVwYW5lbCcsXG4gICcqLnNpZGVwYW5lbC5odG1sJzogJ3NpZGVwYW5lbCcsXG4gICcqLnNpZGVwYW5lbC9pbmRleC5odG1sJzogJ3NpZGVwYW5lbCcsXG5cbiAgJ2RldnRvb2xzLmh0bWwnOiAnZGV2dG9vbHMnLFxuICAnZGV2dG9vbHMvaW5kZXguaHRtbCc6ICdkZXZ0b29scycsXG5cbiAgJ2JhY2tncm91bmQudHMnOiAnYmFja2dyb3VuZCcsXG4gICdiYWNrZ3JvdW5kL2luZGV4LnRzJzogJ2JhY2tncm91bmQnLFxuICBbVklSVFVBTF9OT09QX0JBQ0tHUk9VTkRfTU9EVUxFX0lEXTogJ2JhY2tncm91bmQnLFxuXG4gICdjb250ZW50LnRzPyh4KSc6ICdjb250ZW50LXNjcmlwdCcsXG4gICdjb250ZW50L2luZGV4LnRzPyh4KSc6ICdjb250ZW50LXNjcmlwdCcsXG4gICcqLmNvbnRlbnQudHM/KHgpJzogJ2NvbnRlbnQtc2NyaXB0JyxcbiAgJyouY29udGVudC9pbmRleC50cz8oeCknOiAnY29udGVudC1zY3JpcHQnLFxuICBbYGNvbnRlbnQuJHtDU1NfRVhURU5TSU9OU19QQVRURVJOfWBdOiAnY29udGVudC1zY3JpcHQtc3R5bGUnLFxuICBbYCouY29udGVudC4ke0NTU19FWFRFTlNJT05TX1BBVFRFUk59YF06ICdjb250ZW50LXNjcmlwdC1zdHlsZScsXG4gIFtgY29udGVudC9pbmRleC4ke0NTU19FWFRFTlNJT05TX1BBVFRFUk59YF06ICdjb250ZW50LXNjcmlwdC1zdHlsZScsXG4gIFtgKi5jb250ZW50L2luZGV4LiR7Q1NTX0VYVEVOU0lPTlNfUEFUVEVSTn1gXTogJ2NvbnRlbnQtc2NyaXB0LXN0eWxlJyxcblxuICAncG9wdXAuaHRtbCc6ICdwb3B1cCcsXG4gICdwb3B1cC9pbmRleC5odG1sJzogJ3BvcHVwJyxcblxuICAnb3B0aW9ucy5odG1sJzogJ29wdGlvbnMnLFxuICAnb3B0aW9ucy9pbmRleC5odG1sJzogJ29wdGlvbnMnLFxuXG4gICcqLmh0bWwnOiAndW5saXN0ZWQtcGFnZScsXG4gICcqL2luZGV4Lmh0bWwnOiAndW5saXN0ZWQtcGFnZScsXG4gICcqLnRzJzogJ3VubGlzdGVkLXNjcmlwdCcsXG4gICcqL2luZGV4LnRzJzogJ3VubGlzdGVkLXNjcmlwdCcsXG4gIFtgKi4ke0NTU19FWFRFTlNJT05TX1BBVFRFUk59YF06ICd1bmxpc3RlZC1zdHlsZScsXG4gIFtgKi9pbmRleC4ke0NTU19FWFRFTlNJT05TX1BBVFRFUk59YF06ICd1bmxpc3RlZC1zdHlsZScsXG5cbiAgLy8gRG9uJ3Qgd2FybiBhYm91dCBhbnkgZmlsZXMgaW4gc3ViZGlyZWN0b3JpZXMsIGxpa2UgQ1NTIG9yIEpTIGVudHJ5cG9pbnRzIGZvciBIVE1MIGZpbGVzIG9yIHRlc3RzXG4gICcqLyoqJzogJ2lnbm9yZWQnLFxufTtcblxuY29uc3QgQ09OVEVOVF9TQ1JJUFRfT1VUX0RJUiA9ICdjb250ZW50LXNjcmlwdHMnO1xuIiwgImltcG9ydCBjcmVhdGVKSVRJLCB7IFRyYW5zZm9ybU9wdGlvbnMgYXMgSml0aVRyYW5zZm9ybU9wdGlvbnMgfSBmcm9tICdqaXRpJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlVW5pbXBvcnQgfSBmcm9tICd1bmltcG9ydCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0VW5pbXBvcnRPcHRpb25zIH0gZnJvbSAnLi9hdXRvLWltcG9ydHMnO1xuaW1wb3J0IHsgcmVtb3ZlUHJvamVjdEltcG9ydFN0YXRlbWVudHMgfSBmcm9tICcuL3N0cmluZ3MnO1xuaW1wb3J0IHsgbm9ybWFsaXplUGF0aCB9IGZyb20gJy4vcGF0aHMnO1xuaW1wb3J0IHsgVHJhbnNmb3JtT3B0aW9ucywgdHJhbnNmb3JtU3luYyB9IGZyb20gJ2VzYnVpbGQnO1xuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgZGVmYXVsdCBleHBvcnQgb2YgYSBgcGF0aGAuXG4gKlxuICogSXQgd29ya3MgYnk6XG4gKlxuICogMS4gUmVhZGluZyB0aGUgZmlsZSB0ZXh0XG4gKiAyLiBTdHJpcHBpbmcgYWxsIGltcG9ydHMgZnJvbSBpdCB2aWEgcmVnZXhcbiAqIDMuIEF1dG8taW1wb3J0IG9ubHkgdGhlIGNsaWVudCBoZWxwZXIgZnVuY3Rpb25zXG4gKlxuICogVGhpcyBwcmV2ZW50cyByZXNvbHZpbmcgaW1wb3J0cyBvZiBpbXBvcnRzLCBzcGVlZGluZyB0aGluZ3MgdXAgYW5kIHByZXZlbnRpbmcgXCJ4eHggaXMgbm90XG4gKiBkZWZpbmVkXCIgZXJyb3JzLlxuICpcbiAqIERvd25zaWRlIGlzIHRoYXQgY29kZSBjYW5ub3QgYmUgZXhlY3V0ZWQgb3V0c2lkZSBvZiB0aGUgbWFpbiBmdWNudGlvbiBmb3IgdGhlIGVudHJ5cG9pbnQsXG4gKiBvdGhlcndpc2UgeW91IHdpbGwgc2VlIFwieHh4IGlzIG5vdCBkZWZpbmVkXCIgZXJyb3JzIGZvciBhbnkgaW1wb3J0cyB1c2VkIG91dHNpZGUgb2YgbWFpbiBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEVudHJ5cG9pbnRGaWxlPFQ+KFxuICBwYXRoOiBzdHJpbmcsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBmaWxlIG1ldGFkYXRhOicsIHBhdGgpO1xuICAvLyBKSVRJICYgQmFiZWwgdXNlcyBub3JtYWxpemVkIHBhdGhzLlxuICBjb25zdCBub3JtYWxQYXRoID0gbm9ybWFsaXplUGF0aChwYXRoKTtcblxuICBjb25zdCB1bmltcG9ydCA9IGNyZWF0ZVVuaW1wb3J0KHtcbiAgICAuLi5nZXRVbmltcG9ydE9wdGlvbnMoY29uZmlnKSxcbiAgICAvLyBPbmx5IGFsbG93IHNwZWNpZmljIGltcG9ydHMsIG5vdCBhbGwgZnJvbSB0aGUgcHJvamVjdFxuICAgIGRpcnM6IFtdLFxuICB9KTtcbiAgYXdhaXQgdW5pbXBvcnQuaW5pdCgpO1xuXG4gIGNvbnN0IHRleHQgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgdGV4dE5vSW1wb3J0cyA9IHJlbW92ZVByb2plY3RJbXBvcnRTdGF0ZW1lbnRzKHRleHQpO1xuICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHVuaW1wb3J0LmluamVjdEltcG9ydHModGV4dE5vSW1wb3J0cyk7XG4gIGNvbmZpZy5sb2dnZXIuZGVidWcoXG4gICAgWydUZXh0OicsIHRleHQsICdObyBpbXBvcnRzOicsIHRleHROb0ltcG9ydHMsICdDb2RlOicsIGNvZGVdLmpvaW4oJ1xcbicpLFxuICApO1xuXG4gIGNvbnN0IGppdGkgPSBjcmVhdGVKSVRJKF9fZmlsZW5hbWUsIHtcbiAgICBjYWNoZTogZmFsc2UsXG4gICAgZGVidWc6IGNvbmZpZy5kZWJ1ZyxcbiAgICBlc21SZXNvbHZlOiB0cnVlLFxuICAgIGludGVyb3BEZWZhdWx0OiB0cnVlLFxuICAgIGFsaWFzOiB7XG4gICAgICAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJzogcmVzb2x2ZShcbiAgICAgICAgY29uZmlnLnJvb3QsXG4gICAgICAgICdub2RlX21vZHVsZXMvd3h0L2Rpc3QvdmlydHVhbC1tb2R1bGVzL2Zha2UtYnJvd3Nlci5qcycsXG4gICAgICApLFxuICAgIH0sXG4gICAgZXh0ZW5zaW9uczogWycudHMnLCAnLnRzeCcsICcuY2pzJywgJy5qcycsICcubWpzJ10sXG4gICAgdHJhbnNmb3JtKG9wdHMpIHtcbiAgICAgIGNvbnN0IGlzRW50cnlwb2ludCA9IG9wdHMuZmlsZW5hbWUgPT09IG5vcm1hbFBhdGg7XG4gICAgICByZXR1cm4gdHJhbnNmb3JtU3luYyhcbiAgICAgICAgLy8gVXNlIG1vZGlmaWVkIHNvdXJjZSBjb2RlIGZvciBlbnRyeXBvaW50c1xuICAgICAgICBpc0VudHJ5cG9pbnQgPyBjb2RlIDogb3B0cy5zb3VyY2UsXG4gICAgICAgIGdldEVzYnVpbGRPcHRpb25zKG9wdHMpLFxuICAgICAgKTtcbiAgICB9LFxuICB9KTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBqaXRpKHBhdGgpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25maWcubG9nZ2VyLmVycm9yKGVycik7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEVzYnVpbGRPcHRpb25zKG9wdHM6IEppdGlUcmFuc2Zvcm1PcHRpb25zKTogVHJhbnNmb3JtT3B0aW9ucyB7XG4gIGNvbnN0IGlzSnN4ID0gb3B0cy5maWxlbmFtZT8uZW5kc1dpdGgoJ3gnKTtcbiAgcmV0dXJuIHtcbiAgICBmb3JtYXQ6ICdjanMnLFxuICAgIGxvYWRlcjogaXNKc3ggPyAndHN4JyA6ICd0cycsXG4gICAganN4OiBpc0pzeCA/ICdhdXRvbWF0aWMnIDogdW5kZWZpbmVkLFxuICB9O1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBrZWJhYkNhc2VBbHBoYW51bWVyaWMoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvW15hLXowLTktXFxzXS9nLCAnJykgLy8gUmVtb3ZlIGFsbCBub24tYWxwaGFudW1lcmljLCBub24taHlwaGVuIGNoYXJhY3RlcnNcbiAgICAucmVwbGFjZSgvXFxzKy9nLCAnLScpOyAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIGh5cGhlbnNcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGltcG9ydCBzdGF0ZW1lbnRzIGZyb20gdGhlIHRvcCBvZiBhIGZpbGUuIEtlZXBzIGltcG9ydC5tZXRhIGFuZCBpbmxpbmUsIGFzeW5jIGBpbXBvcnQoKWBcbiAqIGNhbGxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlSW1wb3J0U3RhdGVtZW50cyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKFxuICAgIC8oaW1wb3J0XFxzP1t7XFx3XVtcXHNcXFNdKj9mcm9tXFxzP1tcIiddW1xcc1xcU10qP1tcIiddOz98aW1wb3J0XFxzP1tcIiddW1xcc1xcU10qP1tcIiddOz8pL2dtLFxuICAgICcnLFxuICApO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgaW1wb3J0cywgZW5zdXJpbmcgdGhhdCBzb21lIG9mIFdYVCdzIGNsaWVudCBpbXBvcnRzIGFyZSBwcmVzZW50LCBzbyB0aGF0IGVudHJ5cG9pbnRzIGNhbiBiZSBwYXJzZWQgaWYgYXV0by1pbXBvcnRzIGFyZSBkaXNhYmxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVByb2plY3RJbXBvcnRTdGF0ZW1lbnRzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG5vSW1wb3J0cyA9IHJlbW92ZUltcG9ydFN0YXRlbWVudHModGV4dCk7XG5cbiAgcmV0dXJuIGBpbXBvcnQgeyBkZWZpbmVDb250ZW50U2NyaXB0LCBkZWZpbmVCYWNrZ3JvdW5kIH0gZnJvbSAnd3h0L2NsaWVudCc7XG5cbiR7bm9JbXBvcnRzfWA7XG59XG4iLCAiaW1wb3J0IHsgVW5pbXBvcnRPcHRpb25zLCBjcmVhdGVVbmltcG9ydCB9IGZyb20gJ3VuaW1wb3J0JztcbmltcG9ydCB7IEVudHJ5cG9pbnQsIEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aCB9IGZyb20gJy4uL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCB7IGdldFVuaW1wb3J0T3B0aW9ucyB9IGZyb20gJy4uL3V0aWxzL2F1dG8taW1wb3J0cyc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50R2xvYmFscywgZ2V0R2xvYmFscyB9IGZyb20gJy4uL3V0aWxzL2dsb2JhbHMnO1xuaW1wb3J0IHsgZ2V0UHVibGljRmlsZXMgfSBmcm9tICcuLi91dGlscy9wdWJsaWMnO1xuaW1wb3J0IHsgbm9ybWFsaXplUGF0aCB9IGZyb20gJy4uL3V0aWxzL3BhdGhzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBNZXNzYWdlLCBwYXJzZUkxOG5NZXNzYWdlcyB9IGZyb20gJy4uL3V0aWxzL2kxOG4nO1xuaW1wb3J0IHsgd3JpdGVGaWxlSWZEaWZmZXJlbnQgfSBmcm9tICcuLi91dGlscy9mcyc7XG5cbi8qKlxuICogR2VuZXJhdGUgYW5kIHdyaXRlIGFsbCB0aGUgZmlsZXMgaW5zaWRlIHRoZSBgSW50ZXJuYWxDb25maWcudHlwZXNEaXJgIGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHlwZXNEaXIoXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMuZW5zdXJlRGlyKGNvbmZpZy50eXBlc0Rpcik7XG5cbiAgY29uc3QgcmVmZXJlbmNlczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdCBpbXBvcnRzID0gZ2V0VW5pbXBvcnRPcHRpb25zKGNvbmZpZyk7XG4gIGlmIChpbXBvcnRzICE9PSBmYWxzZSkge1xuICAgIHJlZmVyZW5jZXMucHVzaChhd2FpdCB3cml0ZUltcG9ydHNEZWNsYXJhdGlvbkZpbGUoY29uZmlnLCBpbXBvcnRzKSk7XG4gIH1cblxuICByZWZlcmVuY2VzLnB1c2goYXdhaXQgd3JpdGVQYXRoc0RlY2xhcmF0aW9uRmlsZShlbnRyeXBvaW50cywgY29uZmlnKSk7XG4gIHJlZmVyZW5jZXMucHVzaChhd2FpdCB3cml0ZUkxOG5EZWNsYXJhdGlvbkZpbGUoY29uZmlnKSk7XG4gIHJlZmVyZW5jZXMucHVzaChhd2FpdCB3cml0ZUdsb2JhbHNEZWNsYXJhdGlvbkZpbGUoY29uZmlnKSk7XG5cbiAgY29uc3QgbWFpblJlZmVyZW5jZSA9IGF3YWl0IHdyaXRlTWFpbkRlY2xhcmF0aW9uRmlsZShyZWZlcmVuY2VzLCBjb25maWcpO1xuICBhd2FpdCB3cml0ZVRzQ29uZmlnRmlsZShtYWluUmVmZXJlbmNlLCBjb25maWcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUltcG9ydHNEZWNsYXJhdGlvbkZpbGUoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4gIHVuaW1wb3J0T3B0aW9uczogUGFydGlhbDxVbmltcG9ydE9wdGlvbnM+LFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGNvbmZpZy50eXBlc0RpciwgJ2ltcG9ydHMuZC50cycpO1xuICBjb25zdCB1bmltcG9ydCA9IGNyZWF0ZVVuaW1wb3J0KHVuaW1wb3J0T3B0aW9ucyk7XG5cbiAgLy8gTG9hZCBwcm9qZWN0IGltcG9ydHMgaW50byB1bmltcG9ydCBtZW1vcnkgc28gdGhleSBhcmUgb3V0cHV0IHZpYSBnZW5lcmF0ZVR5cGVEZWNsYXJhdGlvbnNcbiAgYXdhaXQgdW5pbXBvcnQuc2NhbkltcG9ydHNGcm9tRGlyKHVuZGVmaW5lZCwgeyBjd2Q6IGNvbmZpZy5zcmNEaXIgfSk7XG5cbiAgYXdhaXQgd3JpdGVGaWxlSWZEaWZmZXJlbnQoXG4gICAgZmlsZVBhdGgsXG4gICAgWycvLyBHZW5lcmF0ZWQgYnkgd3h0JywgYXdhaXQgdW5pbXBvcnQuZ2VuZXJhdGVUeXBlRGVjbGFyYXRpb25zKCldLmpvaW4oXG4gICAgICAnXFxuJyxcbiAgICApICsgJ1xcbicsXG4gICk7XG5cbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVBhdGhzRGVjbGFyYXRpb25GaWxlKFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGNvbmZpZy50eXBlc0RpciwgJ3BhdGhzLmQudHMnKTtcbiAgY29uc3QgdW5pb25zID0gZW50cnlwb2ludHNcbiAgICAubWFwKChlbnRyeSkgPT5cbiAgICAgIGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgICBlbnRyeSxcbiAgICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICAgZW50cnkuaW5wdXRQYXRoLmVuZHNXaXRoKCcuaHRtbCcpID8gJy5odG1sJyA6ICcuanMnLFxuICAgICAgKSxcbiAgICApXG4gICAgLmNvbmNhdChhd2FpdCBnZXRQdWJsaWNGaWxlcyhjb25maWcpKVxuICAgIC5tYXAobm9ybWFsaXplUGF0aClcbiAgICAubWFwKChwYXRoKSA9PiBgICAgIHwgXCIvJHtwYXRofVwiYClcbiAgICAuc29ydCgpXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIGNvbnN0IHRlbXBsYXRlID0gYC8vIEdlbmVyYXRlZCBieSB3eHRcbmltcG9ydCBcInd4dC9icm93c2VyXCI7XG5cbmRlY2xhcmUgbW9kdWxlIFwid3h0L2Jyb3dzZXJcIiB7XG4gIHR5cGUgUHVibGljUGF0aCA9XG57eyB1bmlvbiB9fVxuICBleHBvcnQgaW50ZXJmYWNlIFd4dFJ1bnRpbWUgZXh0ZW5kcyBSdW50aW1lLlN0YXRpYyB7XG4gICAgZ2V0VVJMKHBhdGg6IFB1YmxpY1BhdGgpOiBzdHJpbmc7XG4gIH1cbn1cbmA7XG5cbiAgYXdhaXQgd3JpdGVGaWxlSWZEaWZmZXJlbnQoXG4gICAgZmlsZVBhdGgsXG4gICAgdGVtcGxhdGUucmVwbGFjZSgne3sgdW5pb24gfX0nLCB1bmlvbnMgfHwgJyAgICB8IG5ldmVyJyksXG4gICk7XG5cbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUkxOG5EZWNsYXJhdGlvbkZpbGUoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoY29uZmlnLnR5cGVzRGlyLCAnaTE4bi5kLnRzJyk7XG4gIGNvbnN0IGRlZmF1bHRMb2NhbGUgPSBjb25maWcubWFuaWZlc3QuZGVmYXVsdF9sb2NhbGU7XG4gIGNvbnN0IHRlbXBsYXRlID0gYC8vIEdlbmVyYXRlZCBieSB3eHRcbmltcG9ydCBcInd4dC9icm93c2VyXCI7XG5cbmRlY2xhcmUgbW9kdWxlIFwid3h0L2Jyb3dzZXJcIiB7XG4gIC8qKlxuICAgKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9kb2NzL2V4dGVuc2lvbnMvcmVmZXJlbmNlL2kxOG4vI21ldGhvZC1nZXRNZXNzYWdlXG4gICAqL1xuICBpbnRlcmZhY2UgR2V0TWVzc2FnZU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNlZSBodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2RvY3MvZXh0ZW5zaW9ucy9yZWZlcmVuY2UvaTE4bi8jbWV0aG9kLWdldE1lc3NhZ2VcbiAgICAgKi9cbiAgICBlc2NhcGVMdD86IGJvb2xlYW5cbiAgfVxuXG4gIGV4cG9ydCBpbnRlcmZhY2UgV3h0STE4biBleHRlbmRzIEkxOG4uU3RhdGljIHtcbnt7IG92ZXJyaWRlcyB9fVxuICB9XG59XG5gO1xuXG4gIGxldCBtZXNzYWdlczogTWVzc2FnZVtdO1xuICBpZiAoZGVmYXVsdExvY2FsZSkge1xuICAgIGNvbnN0IGRlZmF1bHRMb2NhbGVQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgY29uZmlnLnB1YmxpY0RpcixcbiAgICAgICdfbG9jYWxlcycsXG4gICAgICBkZWZhdWx0TG9jYWxlLFxuICAgICAgJ21lc3NhZ2VzLmpzb24nLFxuICAgICk7XG4gICAgY29uc3QgY29udGVudCA9IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUoZGVmYXVsdExvY2FsZVBhdGgsICd1dGYtOCcpKTtcbiAgICBtZXNzYWdlcyA9IHBhcnNlSTE4bk1lc3NhZ2VzKGNvbnRlbnQpO1xuICB9IGVsc2Uge1xuICAgIG1lc3NhZ2VzID0gcGFyc2VJMThuTWVzc2FnZXMoe30pO1xuICB9XG5cbiAgY29uc3Qgb3ZlcnJpZGVzID0gbWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PiB7XG4gICAgcmV0dXJuIGAgICAgLyoqXG4gICAgICogJHttZXNzYWdlLmRlc2NyaXB0aW9uID8/ICdObyBtZXNzYWdlIGRlc2NyaXB0aW9uLid9XG4gICAgICogXG4gICAgICogXCIke21lc3NhZ2UubWVzc2FnZX1cIlxuICAgICAqL1xuICAgIGdldE1lc3NhZ2UoXG4gICAgICBtZXNzYWdlTmFtZTogXCIke21lc3NhZ2UubmFtZX1cIixcbiAgICAgIHN1YnN0aXR1dGlvbnM/OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgIG9wdGlvbnM/OiBHZXRNZXNzYWdlT3B0aW9ucyxcbiAgICApOiBzdHJpbmc7YDtcbiAgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZUlmRGlmZmVyZW50KFxuICAgIGZpbGVQYXRoLFxuICAgIHRlbXBsYXRlLnJlcGxhY2UoJ3t7IG92ZXJyaWRlcyB9fScsIG92ZXJyaWRlcy5qb2luKCdcXG4nKSksXG4gICk7XG5cbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUdsb2JhbHNEZWNsYXJhdGlvbkZpbGUoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoY29uZmlnLnR5cGVzRGlyLCAnZ2xvYmFscy5kLnRzJyk7XG4gIGNvbnN0IGdsb2JhbHMgPSBbLi4uZ2V0R2xvYmFscyhjb25maWcpLCAuLi5nZXRFbnRyeXBvaW50R2xvYmFscyhjb25maWcsICcnKV07XG4gIGF3YWl0IHdyaXRlRmlsZUlmRGlmZmVyZW50KFxuICAgIGZpbGVQYXRoLFxuICAgIFtcbiAgICAgICcvLyBHZW5lcmF0ZWQgYnkgd3h0JyxcbiAgICAgICdleHBvcnQge30nLFxuICAgICAgJ2RlY2xhcmUgZ2xvYmFsIHsnLFxuICAgICAgLi4uZ2xvYmFscy5tYXAoKGdsb2JhbCkgPT4gYCAgY29uc3QgJHtnbG9iYWwubmFtZX06ICR7Z2xvYmFsLnR5cGV9O2ApLFxuICAgICAgJ30nLFxuICAgIF0uam9pbignXFxuJykgKyAnXFxuJyxcbiAgKTtcbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZU1haW5EZWNsYXJhdGlvbkZpbGUoXG4gIHJlZmVyZW5jZXM6IHN0cmluZ1tdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGlyID0gY29uZmlnLnd4dERpcjtcbiAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGRpciwgJ3d4dC5kLnRzJyk7XG4gIGF3YWl0IHdyaXRlRmlsZUlmRGlmZmVyZW50KFxuICAgIGZpbGVQYXRoLFxuICAgIFtcbiAgICAgICcvLyBHZW5lcmF0ZWQgYnkgd3h0JyxcbiAgICAgIGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cInZpdGUvY2xpZW50XCIgLz5gLFxuICAgICAgLi4ucmVmZXJlbmNlcy5tYXAoXG4gICAgICAgIChyZWYpID0+XG4gICAgICAgICAgYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi8ke25vcm1hbGl6ZVBhdGgocmVsYXRpdmUoZGlyLCByZWYpKX1cIiAvPmAsXG4gICAgICApLFxuICAgIF0uam9pbignXFxuJykgKyAnXFxuJyxcbiAgKTtcbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVRzQ29uZmlnRmlsZShcbiAgbWFpblJlZmVyZW5jZTogc3RyaW5nLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKSB7XG4gIGNvbnN0IGRpciA9IGNvbmZpZy53eHREaXI7XG4gIGNvbnN0IHJvb3RQYXRoID0gbm9ybWFsaXplUGF0aChyZWxhdGl2ZShkaXIsIGNvbmZpZy5yb290KSk7XG4gIGNvbnN0IHNyY1BhdGggPSBub3JtYWxpemVQYXRoKHJlbGF0aXZlKGRpciwgY29uZmlnLnNyY0RpcikpO1xuICBhd2FpdCB3cml0ZUZpbGVJZkRpZmZlcmVudChcbiAgICByZXNvbHZlKGRpciwgJ3RzY29uZmlnLmpzb24nKSxcbiAgICBge1xuICBcImNvbXBpbGVyT3B0aW9uc1wiOiB7XG4gICAgXCJ0YXJnZXRcIjogXCJFU05leHRcIixcbiAgICBcIm1vZHVsZVwiOiBcIkVTTmV4dFwiLFxuICAgIFwibW9kdWxlUmVzb2x1dGlvblwiOiBcIkJ1bmRsZXJcIixcbiAgICBcIm5vRW1pdFwiOiB0cnVlLFxuICAgIFwiZXNNb2R1bGVJbnRlcm9wXCI6IHRydWUsXG4gICAgXCJmb3JjZUNvbnNpc3RlbnRDYXNpbmdJbkZpbGVOYW1lc1wiOiB0cnVlLFxuICAgIFwicmVzb2x2ZUpzb25Nb2R1bGVcIjogdHJ1ZSxcbiAgICBcInN0cmljdFwiOiB0cnVlLFxuICAgIFwibGliXCI6IFtcIkRPTVwiLCBcIldlYldvcmtlclwiXSxcbiAgICBcInNraXBMaWJDaGVja1wiOiB0cnVlLFxuICAgIFwicGF0aHNcIjoge1xuICAgICAgXCJAXCI6IFtcIiR7c3JjUGF0aH1cIl0sXG4gICAgICBcIkAvKlwiOiBbXCIke3NyY1BhdGh9LypcIl0sXG4gICAgICBcIn5cIjogW1wiJHtzcmNQYXRofVwiXSxcbiAgICAgIFwifi8qXCI6IFtcIiR7c3JjUGF0aH0vKlwiXSxcbiAgICAgIFwiQEBcIjogW1wiJHtyb290UGF0aH1cIl0sXG4gICAgICBcIkBALypcIjogW1wiJHtyb290UGF0aH0vKlwiXSxcbiAgICAgIFwifn5cIjogW1wiJHtyb290UGF0aH1cIl0sXG4gICAgICBcIn5+LypcIjogW1wiJHtyb290UGF0aH0vKlwiXVxuICAgIH1cbiAgfSxcbiAgXCJpbmNsdWRlXCI6IFtcbiAgICBcIiR7bm9ybWFsaXplUGF0aChyZWxhdGl2ZShkaXIsIGNvbmZpZy5yb290KSl9LyoqLypcIixcbiAgICBcIi4vJHtub3JtYWxpemVQYXRoKHJlbGF0aXZlKGRpciwgbWFpblJlZmVyZW5jZSkpfVwiXG4gIF0sXG4gIFwiZXhjbHVkZVwiOiBbXCIke25vcm1hbGl6ZVBhdGgocmVsYXRpdmUoZGlyLCBjb25maWcub3V0QmFzZURpcikpfVwiXVxufWAsXG4gICk7XG59XG4iLCAiZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG5jb25zdCBwcmVkZWZpbmVkTWVzc2FnZXMgPSB7XG4gICdAQGV4dGVuc2lvbl9pZCc6IHtcbiAgICBtZXNzYWdlOiAnPGJyb3dzZXIucnVudGltZS5pZD4nLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJUaGUgZXh0ZW5zaW9uIG9yIGFwcCBJRDsgeW91IG1pZ2h0IHVzZSB0aGlzIHN0cmluZyB0byBjb25zdHJ1Y3QgVVJMcyBmb3IgcmVzb3VyY2VzIGluc2lkZSB0aGUgZXh0ZW5zaW9uLiBFdmVuIHVubG9jYWxpemVkIGV4dGVuc2lvbnMgY2FuIHVzZSB0aGlzIG1lc3NhZ2UuXFxuTm90ZTogWW91IGNhbid0IHVzZSB0aGlzIG1lc3NhZ2UgaW4gYSBtYW5pZmVzdCBmaWxlLlwiLFxuICB9LFxuICAnQEB1aV9sb2NhbGUnOiB7XG4gICAgbWVzc2FnZTogJzxicm93c2VyLmkxOG4uZ2V0VWlMb2NhbGUoKT4nLFxuICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgfSxcbiAgJ0BAYmlkaV9kaXInOiB7XG4gICAgbWVzc2FnZTogJzxsdHJ8cnRsPicsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnVGhlIHRleHQgZGlyZWN0aW9uIGZvciB0aGUgY3VycmVudCBsb2NhbGUsIGVpdGhlciBcImx0clwiIGZvciBsZWZ0LXRvLXJpZ2h0IGxhbmd1YWdlcyBzdWNoIGFzIEVuZ2xpc2ggb3IgXCJydGxcIiBmb3IgcmlnaHQtdG8tbGVmdCBsYW5ndWFnZXMgc3VjaCBhcyBKYXBhbmVzZS4nLFxuICB9LFxuICAnQEBiaWRpX3JldmVyc2VkX2Rpcic6IHtcbiAgICBtZXNzYWdlOiAnPHJ0bHxsdHI+JyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdJZiB0aGUgQEBiaWRpX2RpciBpcyBcImx0clwiLCB0aGVuIHRoaXMgaXMgXCJydGxcIjsgb3RoZXJ3aXNlLCBpdFxcJ3MgXCJsdHJcIi4nLFxuICB9LFxuICAnQEBiaWRpX3N0YXJ0X2VkZ2UnOiB7XG4gICAgbWVzc2FnZTogJzxsZWZ0fHJpZ2h0PicsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnSWYgdGhlIEBAYmlkaV9kaXIgaXMgXCJsdHJcIiwgdGhlbiB0aGlzIGlzIFwibGVmdFwiOyBvdGhlcndpc2UsIGl0XFwncyBcInJpZ2h0XCIuJyxcbiAgfSxcbiAgJ0BAYmlkaV9lbmRfZWRnZSc6IHtcbiAgICBtZXNzYWdlOiAnPHJpZ2h0fGxlZnQ+JyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdJZiB0aGUgQEBiaWRpX2RpciBpcyBcImx0clwiLCB0aGVuIHRoaXMgaXMgXCJyaWdodFwiOyBvdGhlcndpc2UsIGl0XFwncyBcImxlZnRcIi4nLFxuICB9LFxufTtcblxuLyoqXG4gKiBHZXQgYSBsaXN0IG9mIGFsbCBtZXNzYWdlcyBhbmQgdGhlaXIgbWV0YWRhdGEgZnJvbSBKU09OIGZpbGUgY29udGVudHMuXG4gKlxuICogQHBhcmFtIG1lc3NhZ2VzSnNvbiBUaGUgY29udGVudHMgb2YgYSBgX2xvY2FsZXMvZW4vbWVzc2FnZXMuanNvbmAgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSTE4bk1lc3NhZ2VzKG1lc3NhZ2VzSnNvbjogb2JqZWN0KTogTWVzc2FnZVtdIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHtcbiAgICAuLi5wcmVkZWZpbmVkTWVzc2FnZXMsXG4gICAgLi4ubWVzc2FnZXNKc29uLFxuICB9KS5tYXA8TWVzc2FnZT4oKFtuYW1lLCBkZXRhaWxzXSkgPT4gKHtcbiAgICBuYW1lLFxuICAgIC4uLmRldGFpbHMsXG4gIH0pKTtcbn1cbiIsICJpbXBvcnQgeyBFbnRyeXBvaW50IH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgTWFuaWZlc3QgfSBmcm9tICd3ZWJleHRlbnNpb24tcG9seWZpbGwnO1xuaW1wb3J0IHtcbiAgQmFja2dyb3VuZEVudHJ5cG9pbnQsXG4gIEJ1aWxkT3V0cHV0LFxuICBDb250ZW50U2NyaXB0RW50cnlwb2ludCxcbiAgSW50ZXJuYWxDb25maWcsXG4gIE9wdGlvbnNFbnRyeXBvaW50LFxuICBQb3B1cEVudHJ5cG9pbnQsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aCB9IGZyb20gJy4vZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgQ29udGVudFNlY3VyaXR5UG9saWN5IH0gZnJvbSAnLi9Db250ZW50U2VjdXJpdHlQb2xpY3knO1xuaW1wb3J0IHtcbiAgaGFzaENvbnRlbnRTY3JpcHRPcHRpb25zLFxuICBtYXBXeHRPcHRpb25zVG9Db250ZW50U2NyaXB0LFxufSBmcm9tICcuL2NvbnRlbnQtc2NyaXB0cyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlSnNvbiB9IGZyb20gJy4vcGFja2FnZSc7XG5pbXBvcnQgeyBub3JtYWxpemVQYXRoIH0gZnJvbSAnLi9wYXRocyc7XG5pbXBvcnQgeyB3cml0ZUZpbGVJZkRpZmZlcmVudCB9IGZyb20gJy4vZnMnO1xuaW1wb3J0IHsgcHJvZHVjZSB9IGZyb20gJ2ltbWVyJztcblxuLyoqXG4gKiBXcml0ZXMgdGhlIG1hbmlmZXN0IHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGFuZCB0aGUgYnVpbGQgb3V0cHV0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVNYW5pZmVzdChcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0LFxuICBvdXRwdXQ6IEJ1aWxkT3V0cHV0LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHN0ciA9XG4gICAgY29uZmlnLm1vZGUgPT09ICdwcm9kdWN0aW9uJ1xuICAgICAgPyBKU09OLnN0cmluZ2lmeShtYW5pZmVzdClcbiAgICAgIDogSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QsIG51bGwsIDIpO1xuXG4gIGF3YWl0IGZzLmVuc3VyZURpcihjb25maWcub3V0RGlyKTtcbiAgYXdhaXQgd3JpdGVGaWxlSWZEaWZmZXJlbnQocmVzb2x2ZShjb25maWcub3V0RGlyLCAnbWFuaWZlc3QuanNvbicpLCBzdHIpO1xuXG4gIG91dHB1dC5wdWJsaWNBc3NldHMudW5zaGlmdCh7XG4gICAgdHlwZTogJ2Fzc2V0JyxcbiAgICBmaWxlTmFtZTogJ21hbmlmZXN0Lmpzb24nLFxuICAgIG5hbWU6ICdtYW5pZmVzdCcsXG4gICAgbmVlZHNDb2RlUmVmZXJlbmNlOiBmYWxzZSxcbiAgICBzb3VyY2U6IHN0cixcbiAgfSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBtYW5pZmVzdCBiYXNlZCBvbiB0aGUgY29uZmlnIGFuZCBlbnRyeXBvaW50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTWFpbmZlc3QoXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGJ1aWxkT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPixcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8TWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3Q+IHtcbiAgY29uc3QgcGtnID0gYXdhaXQgZ2V0UGFja2FnZUpzb24oY29uZmlnKTtcblxuICBjb25zdCBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QgPSBPYmplY3QuYXNzaWduKFxuICAgIHtcbiAgICAgIG1hbmlmZXN0X3ZlcnNpb246IGNvbmZpZy5tYW5pZmVzdFZlcnNpb24sXG4gICAgICBuYW1lOiBwa2c/Lm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogcGtnPy5kZXNjcmlwdGlvbixcbiAgICAgIHZlcnNpb246IHBrZz8udmVyc2lvbiAmJiBzaW1wbGlmeVZlcnNpb24ocGtnLnZlcnNpb24pLFxuICAgICAgLy8gT25seSBhZGQgdGhlIHZlcnNpb24gbmFtZSB0byBjaHJvbWl1bSBhbmQgaWYgdGhlIHVzZXIgaGFzbid0IHNwZWNpZmllZCBhIGN1c3RvbSB2ZXJzaW9uLlxuICAgICAgdmVyc2lvbl9uYW1lOlxuICAgICAgICBjb25maWcuYnJvd3NlciAhPT0gJ2ZpcmVmb3gnICYmICFjb25maWcubWFuaWZlc3QudmVyc2lvblxuICAgICAgICAgID8gcGtnPy52ZXJzaW9uXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBzaG9ydF9uYW1lOiBwa2c/LnNob3J0TmFtZSxcbiAgICAgIGljb25zOiBkaXNjb3Zlckljb25zKGJ1aWxkT3V0cHV0KSxcbiAgICB9LFxuICAgIGNvbmZpZy5tYW5pZmVzdCxcbiAgKTtcblxuICBhZGRFbnRyeXBvaW50cyhtYW5pZmVzdCwgZW50cnlwb2ludHMsIGJ1aWxkT3V0cHV0LCBjb25maWcpO1xuXG4gIGlmIChjb25maWcuY29tbWFuZCA9PT0gJ3NlcnZlJykgYWRkRGV2TW9kZUNzcChtYW5pZmVzdCwgY29uZmlnKTtcbiAgaWYgKGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnKSBhZGREZXZNb2RlUGVybWlzc2lvbnMobWFuaWZlc3QsIGNvbmZpZyk7XG5cbiAgY29uc3QgZmluYWxNYW5pZmVzdCA9IHByb2R1Y2UobWFuaWZlc3QsIGNvbmZpZy50cmFuc2Zvcm1NYW5pZmVzdCk7XG5cbiAgaWYgKGZpbmFsTWFuaWZlc3QubmFtZSA9PSBudWxsKVxuICAgIHRocm93IEVycm9yKFxuICAgICAgXCJNYW5pZmVzdCAnbmFtZScgaXMgbWlzc2luZy4gRWl0aGVyOlxcbjEuIFNldCB0aGUgbmFtZSBpbiB5b3VyIDxyb290RGlyPi9wYWNrYWdlLmpzb25cXG4yLiBTZXQgYSBuYW1lIHZpYSB0aGUgbWFuaWZlc3Qgb3B0aW9uIGluIHlvdXIgd3h0LmNvbmZpZy50c1wiLFxuICAgICk7XG4gIGlmIChmaW5hbE1hbmlmZXN0LnZlcnNpb24gPT0gbnVsbCkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgXCJNYW5pZmVzdCAndmVyc2lvbicgaXMgbWlzc2luZy4gRWl0aGVyOlxcbjEuIEFkZCBhIHZlcnNpb24gaW4geW91ciA8cm9vdERpcj4vcGFja2FnZS5qc29uXFxuMi4gUGFzcyB0aGUgdmVyc2lvbiB2aWEgdGhlIG1hbmlmZXN0IG9wdGlvbiBpbiB5b3VyIHd4dC5jb25maWcudHNcIixcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGZpbmFsTWFuaWZlc3Q7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBzdWZmaXhlcyBmcm9tIHRoZSB2ZXJzaW9uLCBsaWtlIFguWS5aLWFscGhhMSAod2hpY2ggYnJvc2VycyBkb24ndCBhbGxvdyksIHNvIGl0J3MgYVxuICogc2ltcGxlIHZlcnNpb24gbnVtYmVyLCBsaWtlIFggb3IgWC5ZIG9yIFguWS5aLCB3aGljaCBicm93c2VycyBhbGxvdy5cbiAqL1xuZnVuY3Rpb24gc2ltcGxpZnlWZXJzaW9uKHZlcnNpb25OYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBSZWdleCBhZGFwdGVkIGZyb20gaGVyZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Nb3ppbGxhL0FkZC1vbnMvV2ViRXh0ZW5zaW9ucy9tYW5pZmVzdC5qc29uL3ZlcnNpb24jdmVyc2lvbl9mb3JtYXRcbiAgY29uc3QgdmVyc2lvbiA9IC9eKCgwfFsxLTldWzAtOV17MCw4fSkoWy5dKDB8WzEtOV1bMC05XXswLDh9KSl7MCwzfSkuKiQvLmV4ZWMoXG4gICAgdmVyc2lvbk5hbWUsXG4gICk/LlsxXTtcblxuICBpZiAodmVyc2lvbiA9PSBudWxsKVxuICAgIHRocm93IEVycm9yKFxuICAgICAgYENhbm5vdCBzaW1wbGlmeSBwYWNrYWdlLmpzb24gdmVyc2lvbiBcIiR7dmVyc2lvbk5hbWV9XCIgdG8gYSB2YWxpZCBleHRlbnNpb24gdmVyc2lvbiwgXCJYLlkuWlwiYCxcbiAgICApO1xuXG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5mdW5jdGlvbiBhZGRFbnRyeXBvaW50cyhcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0LFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBidWlsZE91dHB1dDogT21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiB2b2lkIHtcbiAgY29uc3QgZW50cmllc0J5VHlwZSA9IGVudHJ5cG9pbnRzLnJlZHVjZTxcbiAgICBQYXJ0aWFsPFJlY29yZDxFbnRyeXBvaW50Wyd0eXBlJ10sIEVudHJ5cG9pbnRbXT4+XG4gID4oKG1hcCwgZW50cnlwb2ludCkgPT4ge1xuICAgIG1hcFtlbnRyeXBvaW50LnR5cGVdID8/PSBbXTtcbiAgICBtYXBbZW50cnlwb2ludC50eXBlXT8ucHVzaChlbnRyeXBvaW50KTtcbiAgICByZXR1cm4gbWFwO1xuICB9LCB7fSk7XG5cbiAgY29uc3QgYmFja2dyb3VuZCA9IGVudHJpZXNCeVR5cGVbJ2JhY2tncm91bmQnXT8uWzBdIGFzXG4gICAgfCBCYWNrZ3JvdW5kRW50cnlwb2ludFxuICAgIHwgdW5kZWZpbmVkO1xuICBjb25zdCBib29rbWFya3MgPSBlbnRyaWVzQnlUeXBlWydib29rbWFya3MnXT8uWzBdO1xuICBjb25zdCBjb250ZW50U2NyaXB0cyA9IGVudHJpZXNCeVR5cGVbJ2NvbnRlbnQtc2NyaXB0J10gYXNcbiAgICB8IENvbnRlbnRTY3JpcHRFbnRyeXBvaW50W11cbiAgICB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZGV2dG9vbHMgPSBlbnRyaWVzQnlUeXBlWydkZXZ0b29scyddPy5bMF07XG4gIGNvbnN0IGhpc3RvcnkgPSBlbnRyaWVzQnlUeXBlWydoaXN0b3J5J10/LlswXTtcbiAgY29uc3QgbmV3dGFiID0gZW50cmllc0J5VHlwZVsnbmV3dGFiJ10/LlswXTtcbiAgY29uc3Qgb3B0aW9ucyA9IGVudHJpZXNCeVR5cGVbJ29wdGlvbnMnXT8uWzBdIGFzXG4gICAgfCBPcHRpb25zRW50cnlwb2ludFxuICAgIHwgdW5kZWZpbmVkO1xuICBjb25zdCBwb3B1cCA9IGVudHJpZXNCeVR5cGVbJ3BvcHVwJ10/LlswXSBhcyBQb3B1cEVudHJ5cG9pbnQgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHNhbmRib3hlcyA9IGVudHJpZXNCeVR5cGVbJ3NhbmRib3gnXTtcbiAgY29uc3Qgc2lkZXBhbmVscyA9IGVudHJpZXNCeVR5cGVbJ3NpZGVwYW5lbCddO1xuXG4gIGlmIChiYWNrZ3JvdW5kKSB7XG4gICAgY29uc3Qgc2NyaXB0ID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoYmFja2dyb3VuZCwgY29uZmlnLm91dERpciwgJy5qcycpO1xuICAgIGlmIChtYW5pZmVzdC5tYW5pZmVzdF92ZXJzaW9uID09PSAzKSB7XG4gICAgICBtYW5pZmVzdC5iYWNrZ3JvdW5kID0ge1xuICAgICAgICB0eXBlOiBiYWNrZ3JvdW5kLm9wdGlvbnMudHlwZSxcbiAgICAgICAgc2VydmljZV93b3JrZXI6IHNjcmlwdCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hbmlmZXN0LmJhY2tncm91bmQgPSB7XG4gICAgICAgIHBlcnNpc3RlbnQ6IGJhY2tncm91bmQub3B0aW9ucy5wZXJzaXN0ZW50LFxuICAgICAgICBzY3JpcHRzOiBbc2NyaXB0XSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKGJvb2ttYXJrcykge1xuICAgIGlmIChjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICBjb25maWcubG9nZ2VyLndhcm4oXG4gICAgICAgICdCb29rbWFya3MgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgRmlyZWZveC4gY2hyb21lX3VybF9vdmVycmlkZXMuYm9va21hcmtzIHdhcyBub3QgYWRkZWQgdG8gdGhlIG1hbmlmZXN0JyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hbmlmZXN0LmNocm9tZV91cmxfb3ZlcnJpZGVzID8/PSB7fTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGJvb2ttYXJrcyBpcyB1bnR5cGVkIGluIHdlYmV4dGVuc2lvbi1wb2x5ZmlsbCwgYnV0IHN1cHBvcnRlZCBieSBjaHJvbWVcbiAgICAgIG1hbmlmZXN0LmNocm9tZV91cmxfb3ZlcnJpZGVzLmJvb2ttYXJrcyA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgICBib29rbWFya3MsXG4gICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgICcuaHRtbCcsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChoaXN0b3J5KSB7XG4gICAgaWYgKGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcpIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIud2FybihcbiAgICAgICAgJ0Jvb2ttYXJrcyBhcmUgbm90IHN1cHBvcnRlZCBieSBGaXJlZm94LiBjaHJvbWVfdXJsX292ZXJyaWRlcy5oaXN0b3J5IHdhcyBub3QgYWRkZWQgdG8gdGhlIG1hbmlmZXN0JyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hbmlmZXN0LmNocm9tZV91cmxfb3ZlcnJpZGVzID8/PSB7fTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGhpc3RvcnkgaXMgdW50eXBlZCBpbiB3ZWJleHRlbnNpb24tcG9seWZpbGwsIGJ1dCBzdXBwb3J0ZWQgYnkgY2hyb21lXG4gICAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcy5oaXN0b3J5ID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICAgIGhpc3RvcnksXG4gICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgICcuaHRtbCcsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChuZXd0YWIpIHtcbiAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcyA/Pz0ge307XG4gICAgbWFuaWZlc3QuY2hyb21lX3VybF9vdmVycmlkZXMubmV3dGFiID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICBuZXd0YWIsXG4gICAgICBjb25maWcub3V0RGlyLFxuICAgICAgJy5odG1sJyxcbiAgICApO1xuICB9XG5cbiAgaWYgKHBvcHVwKSB7XG4gICAgY29uc3QgZGVmYXVsdF9wb3B1cCA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgcG9wdXAsXG4gICAgICBjb25maWcub3V0RGlyLFxuICAgICAgJy5odG1sJyxcbiAgICApO1xuICAgIGNvbnN0IG9wdGlvbnM6IE1hbmlmZXN0LkFjdGlvbk1hbmlmZXN0ID0ge1xuICAgICAgZGVmYXVsdF9pY29uOiBwb3B1cC5vcHRpb25zLmRlZmF1bHRJY29uLFxuICAgICAgZGVmYXVsdF90aXRsZTogcG9wdXAub3B0aW9ucy5kZWZhdWx0VGl0bGUsXG4gICAgfTtcbiAgICBpZiAobWFuaWZlc3QubWFuaWZlc3RfdmVyc2lvbiA9PT0gMykge1xuICAgICAgbWFuaWZlc3QuYWN0aW9uID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBkZWZhdWx0X3BvcHVwLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuaWZlc3RbcG9wdXAub3B0aW9ucy5tdjJLZXkgPz8gJ2Jyb3dzZXJfYWN0aW9uJ10gPSB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGRlZmF1bHRfcG9wdXAsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChkZXZ0b29scykge1xuICAgIG1hbmlmZXN0LmRldnRvb2xzX3BhZ2UgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgIGRldnRvb2xzLFxuICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICcuaHRtbCcsXG4gICAgKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgY29uc3QgcGFnZSA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKG9wdGlvbnMsIGNvbmZpZy5vdXREaXIsICcuaHRtbCcpO1xuICAgIG1hbmlmZXN0Lm9wdGlvbnNfdWkgPSB7XG4gICAgICBvcGVuX2luX3RhYjogb3B0aW9ucy5vcHRpb25zLm9wZW5JblRhYixcbiAgICAgIGJyb3dzZXJfc3R5bGU6XG4gICAgICAgIGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcgPyBvcHRpb25zLm9wdGlvbnMuYnJvd3NlclN0eWxlIDogdW5kZWZpbmVkLFxuICAgICAgY2hyb21lX3N0eWxlOlxuICAgICAgICBjb25maWcuYnJvd3NlciAhPT0gJ2ZpcmVmb3gnID8gb3B0aW9ucy5vcHRpb25zLmNocm9tZVN0eWxlIDogdW5kZWZpbmVkLFxuICAgICAgcGFnZSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHNhbmRib3hlcz8ubGVuZ3RoKSB7XG4gICAgaWYgKGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcpIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIud2FybihcbiAgICAgICAgJ1NhbmRib3hlZCBwYWdlcyBub3Qgc3VwcG9ydGVkIGJ5IEZpcmVmb3guIHNhbmRib3gucGFnZXMgd2FzIG5vdCBhZGRlZCB0byB0aGUgbWFuaWZlc3QnLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogc2FuZGJveCBub3QgdHlwZWRcbiAgICAgIG1hbmlmZXN0LnNhbmRib3ggPSB7XG4gICAgICAgIHBhZ2VzOiBzYW5kYm94ZXMubWFwKChlbnRyeSkgPT5cbiAgICAgICAgICBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChlbnRyeSwgY29uZmlnLm91dERpciwgJy5odG1sJyksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaWRlcGFuZWxzPy5sZW5ndGgpIHtcbiAgICBjb25zdCBkZWZhdWx0U2lkZXBhbmVsID1cbiAgICAgIHNpZGVwYW5lbHMuZmluZCgoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09ICdzaWRlcGFuZWwnKSA/PyBzaWRlcGFuZWxzWzBdO1xuICAgIGNvbnN0IHBhZ2UgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgIGRlZmF1bHRTaWRlcGFuZWwsXG4gICAgICBjb25maWcub3V0RGlyLFxuICAgICAgJy5odG1sJyxcbiAgICApO1xuXG4gICAgaWYgKGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcpIHtcbiAgICAgIG1hbmlmZXN0LnNpZGViYXJfYWN0aW9uID0ge1xuICAgICAgICAvLyBUT0RPOiBBZGQgb3B0aW9ucyB0byBzaWRlIHBhbmVsXG4gICAgICAgIC8vIC4uLmRlZmF1bHRTaWRlcGFuZWwub3B0aW9ucyxcbiAgICAgICAgZGVmYXVsdF9wYW5lbDogcGFnZSxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChjb25maWcubWFuaWZlc3RWZXJzaW9uID09PSAzKSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBVbnR5cGVkXG4gICAgICBtYW5pZmVzdC5zaWRlX3BhbmVsID0ge1xuICAgICAgICBkZWZhdWx0X3BhdGg6IHBhZ2UsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcubG9nZ2VyLndhcm4oXG4gICAgICAgICdTaWRlIHBhbmVsIG5vdCBzdXBwb3J0ZWQgYnkgQ2hyb21pdW0gdXNpbmcgTVYyLiBzaWRlX3BhbmVsLmRlZmF1bHRfcGF0aCB3YXMgbm90IGFkZGVkIHRvIHRoZSBtYW5pZmVzdCcsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb250ZW50U2NyaXB0cz8ubGVuZ3RoKSB7XG4gICAgLy8gRG9uJ3QgYWRkIGNvbnRlbnQgc2NyaXB0cyB0byB0aGUgbWFuaWZlc3QgaW4gZGV2IG1vZGUgZm9yIE1WMyAtIHRoZXkncmUgbWFuYWdlZCBhbmQgcmVsb2FkZWRcbiAgICAvLyBhdCBydW50aW1lXG4gICAgaWYgKGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnICYmIGNvbmZpZy5tYW5pZmVzdFZlcnNpb24gPT09IDMpIHtcbiAgICAgIGNvbnN0IGhvc3RQZXJtaXNzaW9ucyA9IG5ldyBTZXQ8c3RyaW5nPihtYW5pZmVzdC5ob3N0X3Blcm1pc3Npb25zID8/IFtdKTtcbiAgICAgIGNvbnRlbnRTY3JpcHRzLmZvckVhY2goKHNjcmlwdCkgPT4ge1xuICAgICAgICBzY3JpcHQub3B0aW9ucy5tYXRjaGVzLmZvckVhY2goKG1hdGNoUGF0dGVybikgPT4ge1xuICAgICAgICAgIGhvc3RQZXJtaXNzaW9ucy5hZGQobWF0Y2hQYXR0ZXJuKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGhvc3RQZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PlxuICAgICAgICBhZGRIb3N0UGVybWlzc2lvbihtYW5pZmVzdCwgcGVybWlzc2lvbiksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBoYXNoVG9FbnRyeXBvaW50c01hcCA9IGNvbnRlbnRTY3JpcHRzLnJlZHVjZSgobWFwLCBzY3JpcHQpID0+IHtcbiAgICAgICAgY29uc3QgaGFzaCA9IGhhc2hDb250ZW50U2NyaXB0T3B0aW9ucyhzY3JpcHQub3B0aW9ucyk7XG4gICAgICAgIGlmIChtYXAuaGFzKGhhc2gpKSBtYXAuZ2V0KGhhc2gpPy5wdXNoKHNjcmlwdCk7XG4gICAgICAgIGVsc2UgbWFwLnNldChoYXNoLCBbc2NyaXB0XSk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgICB9LCBuZXcgTWFwPHN0cmluZywgQ29udGVudFNjcmlwdEVudHJ5cG9pbnRbXT4oKSk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnRTY3JpcHRzID0gQXJyYXkuZnJvbShoYXNoVG9FbnRyeXBvaW50c01hcC5lbnRyaWVzKCkpLm1hcChcbiAgICAgICAgKFssIHNjcmlwdHNdKSA9PiAoe1xuICAgICAgICAgIC4uLm1hcFd4dE9wdGlvbnNUb0NvbnRlbnRTY3JpcHQoc2NyaXB0c1swXS5vcHRpb25zKSxcbiAgICAgICAgICAvLyBUT09EOiBTb3J0aW5nIGNzcyBhbmQganMgYXJyYXlzIGhlcmUgc28gd2UgZ2V0IGNvbnNpc3RlbnQgdGVzdCByZXN1bHRzLi4uIGJ1dCB3ZVxuICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXZlIHRvLiBXaGVyZSBpcyB0aGUgaW5jb25zaXN0ZW5jeSBjb21pbmcgZnJvbT9cbiAgICAgICAgICBjc3M6IGdldENvbnRlbnRTY3JpcHRDc3NGaWxlcyhzY3JpcHRzLCBidWlsZE91dHB1dCk/LnNvcnQoKSxcbiAgICAgICAgICBqczogc2NyaXB0c1xuICAgICAgICAgICAgLm1hcCgoZW50cnkpID0+XG4gICAgICAgICAgICAgIGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKGVudHJ5LCBjb25maWcub3V0RGlyLCAnLmpzJyksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc29ydCgpLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBpZiAobmV3Q29udGVudFNjcmlwdHMubGVuZ3RoID49IDApIHtcbiAgICAgICAgbWFuaWZlc3QuY29udGVudF9zY3JpcHRzID8/PSBbXTtcbiAgICAgICAgbWFuaWZlc3QuY29udGVudF9zY3JpcHRzLnB1c2goLi4ubmV3Q29udGVudFNjcmlwdHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNjb3Zlckljb25zKFxuICBidWlsZE91dHB1dDogT21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4sXG4pOiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdFsnaWNvbnMnXSB7XG4gIGNvbnN0IGljb25zOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIC8vICNyZWdpb24gc25pcHBldFxuICBjb25zdCBpY29uUmVnZXggPSBbXG4gICAgL15pY29uLShbMC05XSspXFwuKHBuZ3xibXB8anBlZ3xqcGd8aWNvfGdpZikkLywgICAgICAgICAgICAgLy8gaWNvbi0xNi5wbmdcbiAgICAvXmljb24tKFswLTldKyl4WzAtOV0rXFwuKHBuZ3xibXB8anBlZ3xqcGd8aWNvfGdpZikkLywgICAgICAvLyBpY29uLTE2eDE2LnBuZ1xuICAgIC9eaWNvbkAoWzAtOV0rKXdcXC4ocG5nfGJtcHxqcGVnfGpwZ3xpY298Z2lmKSQvLCAgICAgICAgICAgIC8vIGljb25AMTZ3LnBuZ1xuICAgIC9eaWNvbkAoWzAtOV0rKWhcXC4ocG5nfGJtcHxqcGVnfGpwZ3xpY298Z2lmKSQvLCAgICAgICAgICAgIC8vIGljb25AMTZoLnBuZ1xuICAgIC9eaWNvbkAoWzAtOV0rKVxcLihwbmd8Ym1wfGpwZWd8anBnfGljb3xnaWYpJC8sICAgICAgICAgICAgIC8vIGljb25AMTYucG5nXG4gICAgL15pY29uW1xcL1xcXFxdKFswLTldKylcXC4ocG5nfGJtcHxqcGVnfGpwZ3xpY298Z2lmKSQvLCAgICAgICAgLy8gaWNvbi8xNi5wbmdcbiAgICAvXmljb25bXFwvXFxcXF0oWzAtOV0rKXhbMC05XStcXC4ocG5nfGJtcHxqcGVnfGpwZ3xpY298Z2lmKSQvLCAvLyBpY29uLzE2eDE2LnBuZ1xuICBdO1xuICAvLyAjZW5kcmVnaW9uIHNuaXBwZXRcblxuICBidWlsZE91dHB1dC5wdWJsaWNBc3NldHMuZm9yRWFjaCgoYXNzZXQpID0+IHtcbiAgICBsZXQgc2l6ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgcmVnZXggb2YgaWNvblJlZ2V4KSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGFzc2V0LmZpbGVOYW1lLm1hdGNoKHJlZ2V4KTtcbiAgICAgIGlmIChtYXRjaD8uWzFdICE9IG51bGwpIHtcbiAgICAgICAgc2l6ZSA9IG1hdGNoWzFdO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNpemUgPT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgaWNvbnMucHVzaChbc2l6ZSwgbm9ybWFsaXplUGF0aChhc3NldC5maWxlTmFtZSldKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGljb25zLmxlbmd0aCA+IDAgPyBPYmplY3QuZnJvbUVudHJpZXMoaWNvbnMpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhZGREZXZNb2RlQ3NwKFxuICBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiB2b2lkIHtcbiAgY29uc3QgcGVybWlzc2lvbiA9IGBodHRwOi8vJHtjb25maWcuc2VydmVyPy5ob3N0bmFtZSA/PyAnJ30vKmA7XG4gIGNvbnN0IGFsbG93ZWRDc3AgPSBjb25maWcuc2VydmVyPy5vcmlnaW4gPz8gJ2h0dHA6Ly9sb2NhbGhvc3Q6Kic7XG5cbiAgaWYgKG1hbmlmZXN0Lm1hbmlmZXN0X3ZlcnNpb24gPT09IDMpIHtcbiAgICBhZGRIb3N0UGVybWlzc2lvbihtYW5pZmVzdCwgcGVybWlzc2lvbik7XG4gIH0gZWxzZSB7XG4gICAgYWRkUGVybWlzc2lvbihtYW5pZmVzdCwgcGVybWlzc2lvbik7XG4gIH1cblxuICBjb25zdCBjc3AgPSBuZXcgQ29udGVudFNlY3VyaXR5UG9saWN5KFxuICAgIG1hbmlmZXN0Lm1hbmlmZXN0X3ZlcnNpb24gPT09IDNcbiAgICAgID8gLy8gQHRzLWV4cGVjdC1lcnJvcjogZXh0ZW5zaW9uX3BhZ2VzIGlzIG5vdCB0eXBlZFxuICAgICAgICBtYW5pZmVzdC5jb250ZW50X3NlY3VyaXR5X3BvbGljeT8uZXh0ZW5zaW9uX3BhZ2VzID8/XG4gICAgICAgIFwic2NyaXB0LXNyYyAnc2VsZicgJ3dhc20tdW5zYWZlLWV2YWwnOyBvYmplY3Qtc3JjICdzZWxmJztcIiAvLyBkZWZhdWx0IENTUCBmb3IgTVYzXG4gICAgICA6IG1hbmlmZXN0LmNvbnRlbnRfc2VjdXJpdHlfcG9saWN5ID8/XG4gICAgICAgIFwic2NyaXB0LXNyYyAnc2VsZic7IG9iamVjdC1zcmMgJ3NlbGYnO1wiLCAvLyBkZWZhdWx0IENTUCBmb3IgTVYyXG4gICk7XG5cbiAgaWYgKGNvbmZpZy5zZXJ2ZXIpIGNzcC5hZGQoJ3NjcmlwdC1zcmMnLCBhbGxvd2VkQ3NwKTtcblxuICBpZiAobWFuaWZlc3QubWFuaWZlc3RfdmVyc2lvbiA9PT0gMykge1xuICAgIG1hbmlmZXN0LmNvbnRlbnRfc2VjdXJpdHlfcG9saWN5ID8/PSB7fTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBleHRlbnNpb25fcGFnZXMgaXMgbm90IHR5cGVkXG4gICAgbWFuaWZlc3QuY29udGVudF9zZWN1cml0eV9wb2xpY3kuZXh0ZW5zaW9uX3BhZ2VzID0gY3NwLnRvU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgbWFuaWZlc3QuY29udGVudF9zZWN1cml0eV9wb2xpY3kgPSBjc3AudG9TdHJpbmcoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGREZXZNb2RlUGVybWlzc2lvbnMoXG4gIG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbikge1xuICAvLyBGb3IgcmVsb2FkaW5nIHRoZSBwYWdlXG4gIGFkZFBlcm1pc3Npb24obWFuaWZlc3QsICd0YWJzJyk7XG5cbiAgLy8gRm9yIHJlZ2lzdGVyaW5nIGNvbnRlbnQgc2NyaXB0c1xuICBpZiAoY29uZmlnLm1hbmlmZXN0VmVyc2lvbiA9PT0gMykgYWRkUGVybWlzc2lvbihtYW5pZmVzdCwgJ3NjcmlwdGluZycpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGJ1bmRsZSBwYXRocyB0byBDU1MgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGEgbGlzdCBvZiBjb250ZW50IHNjcmlwdHMsIG9yIHVuZGVmaW5lZCBpZlxuICogdGhlcmUgaXMgbm8gYXNzb2NpYXRlZCBDU1MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250ZW50U2NyaXB0Q3NzRmlsZXMoXG4gIGNvbnRlbnRTY3JpcHRzOiBDb250ZW50U2NyaXB0RW50cnlwb2ludFtdLFxuICBidWlsZE91dHB1dDogT21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4sXG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNzczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdCBhbGxDaHVua3MgPSBidWlsZE91dHB1dC5zdGVwcy5mbGF0TWFwKChzdGVwKSA9PiBzdGVwLmNodW5rcyk7XG5cbiAgY29udGVudFNjcmlwdHMuZm9yRWFjaCgoc2NyaXB0KSA9PiB7XG4gICAgaWYgKHNjcmlwdC5vcHRpb25zLmNzc0luamVjdGlvbk1vZGUgPT09ICdtYW51YWwnKSByZXR1cm47XG5cbiAgICBjb25zdCByZWxhdGVkQ3NzID0gYWxsQ2h1bmtzLmZpbmQoXG4gICAgICAoY2h1bmspID0+IGNodW5rLmZpbGVOYW1lID09PSBgY29udGVudC1zY3JpcHRzLyR7c2NyaXB0Lm5hbWV9LmNzc2AsXG4gICAgKTtcbiAgICBpZiAocmVsYXRlZENzcykgY3NzLnB1c2gocmVsYXRlZENzcy5maWxlTmFtZSk7XG4gIH0pO1xuXG4gIGlmIChjc3MubGVuZ3RoID4gMCkgcmV0dXJuIGNzcztcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYWRkUGVybWlzc2lvbihcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0LFxuICBwZXJtaXNzaW9uOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgbWFuaWZlc3QucGVybWlzc2lvbnMgPz89IFtdO1xuICBpZiAobWFuaWZlc3QucGVybWlzc2lvbnMuaW5jbHVkZXMocGVybWlzc2lvbikpIHJldHVybjtcbiAgbWFuaWZlc3QucGVybWlzc2lvbnMucHVzaChwZXJtaXNzaW9uKTtcbn1cblxuZnVuY3Rpb24gYWRkSG9zdFBlcm1pc3Npb24oXG4gIG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCxcbiAgaG9zdFBlcm1pc3Npb246IHN0cmluZyxcbik6IHZvaWQge1xuICBtYW5pZmVzdC5ob3N0X3Blcm1pc3Npb25zID8/PSBbXTtcbiAgaWYgKG1hbmlmZXN0Lmhvc3RfcGVybWlzc2lvbnMuaW5jbHVkZXMoaG9zdFBlcm1pc3Npb24pKSByZXR1cm47XG4gIG1hbmlmZXN0Lmhvc3RfcGVybWlzc2lvbnMucHVzaChob3N0UGVybWlzc2lvbik7XG59XG4iLCAiLyoqXG4gKiBEaXJlY3RpdmUgbmFtZXMgdGhhdCBtYWtlIHVwIENTUHMuIFRoZXJlIGFyZSBtb3JlLCB0aGlzIGlzIGFsbCBJIG5lZWQgZm9yIHRoZSBwbHVnaW4uXG4gKi9cbmV4cG9ydCB0eXBlIENzcERpcmVjdGl2ZSA9ICdkZWZhdWx0LXNyYycgfCAnc2NyaXB0LXNyYycgfCAnb2JqZWN0LXNyYyc7XG5cbmV4cG9ydCBjbGFzcyBDb250ZW50U2VjdXJpdHlQb2xpY3kge1xuICBwcml2YXRlIHN0YXRpYyBESVJFQ1RJVkVfT1JERVI6IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IHVuZGVmaW5lZD4gPSB7XG4gICAgJ2RlZmF1bHQtc3JjJzogMCxcbiAgICAnc2NyaXB0LXNyYyc6IDEsXG4gICAgJ29iamVjdC1zcmMnOiAyLFxuICB9O1xuXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcblxuICBjb25zdHJ1Y3Rvcihjc3A/OiBzdHJpbmcpIHtcbiAgICBpZiAoY3NwKSB7XG4gICAgICBjb25zdCBzZWN0aW9ucyA9IGNzcC5zcGxpdCgnOycpLm1hcCgoc2VjdGlvbikgPT4gc2VjdGlvbi50cmltKCkpO1xuICAgICAgdGhpcy5kYXRhID0gc2VjdGlvbnMucmVkdWNlPFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPj4oKGRhdGEsIHNlY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3QgW2tleSwgLi4udmFsdWVzXSA9IHNlY3Rpb24uc3BsaXQoJyAnKS5tYXAoKGl0ZW0pID0+IGl0ZW0udHJpbSgpKTtcbiAgICAgICAgaWYgKGtleSkgZGF0YVtrZXldID0gdmFsdWVzO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0sIHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhID0ge307XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBhIHNldCBvZiB2YWx1ZXMgYXJlIGxpc3RlZCB1bmRlciBhIGRpcmVjdGl2ZS5cbiAgICovXG4gIGFkZChkaXJlY3RpdmU6IENzcERpcmVjdGl2ZSwgLi4ubmV3VmFsdWVzOiBzdHJpbmdbXSk6IENvbnRlbnRTZWN1cml0eVBvbGljeSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5kYXRhW2RpcmVjdGl2ZV0gPz8gW107XG4gICAgbmV3VmFsdWVzLmZvckVhY2goKG5ld1ZhbHVlKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlcy5pbmNsdWRlcyhuZXdWYWx1ZSkpIHZhbHVlcy5wdXNoKG5ld1ZhbHVlKTtcbiAgICB9KTtcbiAgICB0aGlzLmRhdGFbZGlyZWN0aXZlXSA9IHZhbHVlcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyZWN0aXZlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuZGF0YSkuc29ydCgoW2xdLCBbcl0pID0+IHtcbiAgICAgIGNvbnN0IGxvID0gQ29udGVudFNlY3VyaXR5UG9saWN5LkRJUkVDVElWRV9PUkRFUltsXSA/PyAyO1xuICAgICAgY29uc3Qgcm8gPSBDb250ZW50U2VjdXJpdHlQb2xpY3kuRElSRUNUSVZFX09SREVSW3JdID8/IDI7XG4gICAgICByZXR1cm4gbG8gLSBybztcbiAgICB9KTtcbiAgICByZXR1cm4gZGlyZWN0aXZlcy5tYXAoKGVudHJ5KSA9PiBlbnRyeS5mbGF0KCkuam9pbignICcpKS5qb2luKCc7ICcpICsgJzsnO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTWFuaWZlc3QgfSBmcm9tICd3ZWJleHRlbnNpb24tcG9seWZpbGwnO1xuaW1wb3J0IHsgQ29udGVudFNjcmlwdEVudHJ5cG9pbnQgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogUmV0dXJucyBhIHVuaXF1ZSBhbmQgY29uc2lzdGVudCBzdHJpbmcgaGFzaCBiYXNlZCBvbiBhIGNvbnRlbnQgc2NyaXB0cyBvcHRpb25zLlxuICpcbiAqIEl0IGlzIGFibGUgdG8gcmVjb2duaXplIGRlZmF1bHQgdmFsdWVzLFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaENvbnRlbnRTY3JpcHRPcHRpb25zKFxuICBvcHRpb25zOiBDb250ZW50U2NyaXB0RW50cnlwb2ludFsnb3B0aW9ucyddLFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgd2l0aERlZmF1bHRzOiBDb250ZW50U2NyaXB0RW50cnlwb2ludFsnb3B0aW9ucyddID0ge1xuICAgIGV4Y2x1ZGVHbG9iczogW10sXG4gICAgZXhjbHVkZU1hdGNoZXM6IFtdLFxuICAgIGluY2x1ZGVHbG9iczogW10sXG4gICAgbWF0Y2hBYm91dEJsYW5rOiBmYWxzZSxcbiAgICBtYXRjaE9yaWdpbkFzRmFsbGJhY2s6IGZhbHNlLFxuICAgIHJ1bkF0OiAnZG9jdW1lbnRfaWRsZScsXG4gICAgYWxsRnJhbWVzOiBmYWxzZSxcbiAgICB3b3JsZDogJ0lTT0xBVEVEJyxcbiAgICAvLyBUT0RPOiBzdHJpcCB1bmRlZmluZWQgZmllbGRzIGZyb20gb3B0aW9ucyBvYmplY3QgdG8gaW1wcm92ZSBjb250ZW50IHNjcmlwdCBncm91cGluZy5cbiAgICAuLi5vcHRpb25zLFxuICB9O1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMod2l0aERlZmF1bHRzKVxuICAgICAgLy8gU29ydCBhbnkgYXJyYXlzIHNvIHRoZWlyIHZhbHVlcyBhcmUgY29uc2lzdGVudFxuICAgICAgLm1hcDxbc3RyaW5nLCB1bmtub3duXT4oKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBba2V5LCB2YWx1ZS5zb3J0KCldO1xuICAgICAgICBlbHNlIHJldHVybiBba2V5LCB2YWx1ZV07XG4gICAgICB9KVxuICAgICAgLy8gU29ydCBhbGwgdGhlIGZpZWxkcyBhbHBoYWJldGljYWxseVxuICAgICAgLnNvcnQoKGwsIHIpID0+IGxbMF0ubG9jYWxlQ29tcGFyZShyWzBdKSksXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBXeHRPcHRpb25zVG9Db250ZW50U2NyaXB0KFxuICBvcHRpb25zOiBDb250ZW50U2NyaXB0RW50cnlwb2ludFsnb3B0aW9ucyddLFxuKTogT21pdDxNYW5pZmVzdC5Db250ZW50U2NyaXB0LCAnanMnIHwgJ2Nzcyc+IHtcbiAgcmV0dXJuIHtcbiAgICBtYXRjaGVzOiBvcHRpb25zLm1hdGNoZXMsXG4gICAgYWxsX2ZyYW1lczogb3B0aW9ucy5hbGxGcmFtZXMsXG4gICAgbWF0Y2hfYWJvdXRfYmxhbms6IG9wdGlvbnMubWF0Y2hBYm91dEJsYW5rLFxuICAgIGV4Y2x1ZGVfZ2xvYnM6IG9wdGlvbnMuZXhjbHVkZUdsb2JzLFxuICAgIGV4Y2x1ZGVfbWF0Y2hlczogb3B0aW9ucy5leGNsdWRlTWF0Y2hlcyxcbiAgICBpbmNsdWRlX2dsb2JzOiBvcHRpb25zLmluY2x1ZGVHbG9icyxcbiAgICBydW5fYXQ6IG9wdGlvbnMucnVuQXQsXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiB1bnR5cGVkIGNocm9tZSBvcHRpb25zXG4gICAgbWF0Y2hfb3JpZ2luX2FzX2ZhbGxiYWNrOiBvcHRpb25zLm1hdGNoT3JpZ2luQXNGYWxsYmFjayxcbiAgICB3b3JsZDogb3B0aW9ucy53b3JsZCxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcblxuLyoqXG4gKiBSZWFkIHRoZSBwcm9qZWN0J3MgcGFja2FnZS5qc29uLlxuICpcbiAqIFRPRE86IGxvb2sgaW4gcm9vdCBhbmQgdXAgZGlyZWN0b3JpZXMgdW50aWwgaXQncyBmb3VuZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUpzb24oXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPFBhcnRpYWw8UmVjb3JkPHN0cmluZywgYW55Pj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZmlsZSA9IHJlc29sdmUoY29uZmlnLnJvb3QsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMucmVhZEpzb24oZmlsZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoXG4gICAgICBgRmFpbGVkIHRvIHJlYWQgcGFja2FnZS5qc29uIGF0OiAke2ZpbGV9LiBSZXR1cm5pbmcgdW5kZWZpbmVkLmAsXG4gICAgKTtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBNYW5pZmVzdCB9IGZyb20gJ3dlYmV4dGVuc2lvbi1wb2x5ZmlsbCc7XG5pbXBvcnQgeyBCdWlsZE91dHB1dCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgYnVpbGRFbnRyeXBvaW50cyB9IGZyb20gJy4vYnVpbGQvYnVpbGRFbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBmaW5kRW50cnlwb2ludHMgfSBmcm9tICcuL2J1aWxkL2ZpbmRFbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVR5cGVzRGlyIH0gZnJvbSAnLi9idWlsZC9nZW5lcmF0ZVR5cGVzRGlyJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnLCBFbnRyeXBvaW50R3JvdXAgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdlbmVyYXRlTWFpbmZlc3QsIHdyaXRlTWFuaWZlc3QgfSBmcm9tICcuL3V0aWxzL21hbmlmZXN0JztcbmltcG9ydCBwYyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgZ3JvdXBFbnRyeXBvaW50cyB9IGZyb20gJy4vdXRpbHMvZ3JvdXBFbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiB9IGZyb20gJy4vdXRpbHMvZm9ybWF0RHVyYXRpb24nO1xuaW1wb3J0IHsgcHJpbnRCdWlsZFN1bW1hcnkgfSBmcm9tICcuL2xvZy9wcmludEJ1aWxkU3VtbWFyeSc7XG5pbXBvcnQgeyBleGVjYUNvbW1hbmQgfSBmcm9tICdleGVjYSc7XG5pbXBvcnQgZ2xvYiBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgdW5ub3JtYWxpemVQYXRoIH0gZnJvbSAnLi91dGlscy9wYXRocyc7XG5cbi8qKlxuICogQnVpbGRzIHRoZSBleHRlbnNpb24gYmFzZWQgb24gYW4gaW50ZXJuYWwgY29uZmlnLlxuICpcbiAqIFRoaXMgZnVuY3Rpb246XG4gKiAxLiBDbGVhbnMgdGhlIG91dHB1dCBkaXJlY3RvcnlcbiAqIDIuIEV4ZWN1dGVzIHRoZSByZWJ1aWxkIGZ1bmN0aW9uIHdpdGggYSBibGFuayBwcmV2aW91cyBvdXRwdXQgc28gZXZlcnl0aGluZyBpcyBidWlsdCAoc2VlXG4gKiAgICBgcmVidWlsZGAgZm9yIG1vcmUgZGV0YWlscylcbiAqIDMuIFByaW50cyB0aGUgc3VtbWFyeVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJbnRlcm5hbChcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8QnVpbGRPdXRwdXQ+IHtcbiAgY29uc3QgdmVyYiA9IGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnID8gJ1ByZS1yZW5kZXJpbmcnIDogJ0J1aWxkaW5nJztcbiAgY29uc3QgdGFyZ2V0ID0gYCR7Y29uZmlnLmJyb3dzZXJ9LW12JHtjb25maWcubWFuaWZlc3RWZXJzaW9ufWA7XG4gIGNvbmZpZy5sb2dnZXIuaW5mbyhcbiAgICBgJHt2ZXJifSAke3BjLmN5YW4odGFyZ2V0KX0gZm9yICR7cGMuY3lhbihjb25maWcubW9kZSl9IHdpdGggJHtwYy5ncmVlbihcbiAgICAgIGBWaXRlICR7dml0ZS52ZXJzaW9ufWAsXG4gICAgKX1gLFxuICApO1xuICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gIC8vIENsZWFudXBcbiAgYXdhaXQgZnMucm0oY29uZmlnLm91dERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5lbnN1cmVEaXIoY29uZmlnLm91dERpcik7XG5cbiAgY29uc3QgZW50cnlwb2ludHMgPSBhd2FpdCBmaW5kRW50cnlwb2ludHMoY29uZmlnKTtcbiAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnRGV0ZWN0ZWQgZW50cnlwb2ludHM6JywgZW50cnlwb2ludHMpO1xuICBjb25zdCBncm91cHMgPSBncm91cEVudHJ5cG9pbnRzKGVudHJ5cG9pbnRzKTtcbiAgY29uc3QgeyBvdXRwdXQgfSA9IGF3YWl0IHJlYnVpbGQoY29uZmlnLCBncm91cHMsIHVuZGVmaW5lZCk7XG5cbiAgLy8gUG9zdC1idWlsZFxuICBhd2FpdCBwcmludEJ1aWxkU3VtbWFyeShcbiAgICBjb25maWcubG9nZ2VyLnN1Y2Nlc3MsXG4gICAgYEJ1aWx0IGV4dGVuc2lvbiBpbiAke2Zvcm1hdER1cmF0aW9uKERhdGUubm93KCkgLSBzdGFydFRpbWUpfWAsXG4gICAgb3V0cHV0LFxuICAgIGNvbmZpZyxcbiAgKTtcblxuICBpZiAoY29uZmlnLmFuYWx5c2lzLmVuYWJsZWQpIHtcbiAgICBhd2FpdCBjb21iaW5lQW5hbHlzaXNTdGF0cyhjb25maWcpO1xuICAgIGNvbmZpZy5sb2dnZXIuaW5mbyhcbiAgICAgIGBBbmFseXNpcyBjb21wbGV0ZTpcXG4gICR7cGMuZ3JheSgnXHUyNTE0XHUyNTAwJyl9ICR7cGMueWVsbG93KCdzdGF0cy5odG1sJyl9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIGNvbmZpZ3VyYXRpb24sIGxpc3Qgb2YgZW50cnlwb2ludHMsIGFuZCBhbiBleGlzdGluZywgcGFydGlhbCBvdXRwdXQsIGJ1aWxkIHRoZVxuICogZW50cnlwb2ludHMgYW5kIG1lcmdlIHRoZSBuZXcgb3V0cHV0IHdpdGggdGhlIGV4aXN0aW5nIG91dHB1dC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGw6XG4gKiAxLiBHZW5lcmF0ZSB0aGUgLnd4dCBkaXJlY3RvcnkncyB0eXBlc1xuICogMi4gQnVpbGQgdGhlIGBlbnRyeXBvaW50R3JvdXBzYCAoYW5kIGNvcGllcyBwdWJsaWMgZmlsZXMpXG4gKiAzLiBHZW5lcmF0ZSB0aGUgbGF0ZXN0IG1hbmlmZXN0IGZvciBhbGwgZW50cnlwb2ludHNcbiAqIDQuIFdyaXRlIHRoZSBuZXcgbWFuaWZlc3QgdG8gdGhlIGZpbGUgc3lzdGVtXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWJ1aWxkKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBlbnRyeXBvaW50R3JvdXBzOiBFbnRyeXBvaW50R3JvdXBbXSxcbiAgZXhpc3RpbmdPdXRwdXQ6IE9taXQ8QnVpbGRPdXRwdXQsICdtYW5pZmVzdCc+ID0ge1xuICAgIHN0ZXBzOiBbXSxcbiAgICBwdWJsaWNBc3NldHM6IFtdLFxuICB9LFxuKTogUHJvbWlzZTx7IG91dHB1dDogQnVpbGRPdXRwdXQ7IG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCB9PiB7XG4gIGNvbnN0IHsgZGVmYXVsdDogb3JhIH0gPSBhd2FpdCBpbXBvcnQoJ29yYScpO1xuICBjb25zdCBzcGlubmVyID0gb3JhKGBQcmVwYXJpbmcuLi5gKS5zdGFydCgpO1xuXG4gIC8vIFVwZGF0ZSB0eXBlcyBkaXJlY3Rvcnkgd2l0aCBuZXcgZmlsZXMgYW5kIHR5cGVzXG4gIGNvbnN0IGFsbEVudHJ5cG9pbnRzID0gYXdhaXQgZmluZEVudHJ5cG9pbnRzKGNvbmZpZyk7XG4gIGF3YWl0IGdlbmVyYXRlVHlwZXNEaXIoYWxsRW50cnlwb2ludHMsIGNvbmZpZykuY2F0Y2goKGVycikgPT4ge1xuICAgIGNvbmZpZy5sb2dnZXIud2FybignRmFpbGVkIHRvIHVwZGF0ZSAud3h0IGRpcmVjdG9yeTonLCBlcnIpO1xuICAgIC8vIFRocm93IHRoZSBlcnJvciBpZiBkb2luZyBhIHJlZ3VsYXIgYnVpbGQsIGRvbid0IGZvciBkZXYgbW9kZS5cbiAgICBpZiAoY29uZmlnLmNvbW1hbmQgPT09ICdidWlsZCcpIHRocm93IGVycjtcbiAgfSk7XG5cbiAgLy8gQnVpbGQgYW5kIG1lcmdlIHRoZSBvdXRwdXRzXG4gIGNvbnN0IG5ld091dHB1dCA9IGF3YWl0IGJ1aWxkRW50cnlwb2ludHMoZW50cnlwb2ludEdyb3VwcywgY29uZmlnLCBzcGlubmVyKTtcbiAgY29uc3QgbWVyZ2VkT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPiA9IHtcbiAgICBzdGVwczogWy4uLmV4aXN0aW5nT3V0cHV0LnN0ZXBzLCAuLi5uZXdPdXRwdXQuc3RlcHNdLFxuICAgIHB1YmxpY0Fzc2V0czogWy4uLmV4aXN0aW5nT3V0cHV0LnB1YmxpY0Fzc2V0cywgLi4ubmV3T3V0cHV0LnB1YmxpY0Fzc2V0c10sXG4gIH07XG5cbiAgY29uc3QgbmV3TWFuaWZlc3QgPSBhd2FpdCBnZW5lcmF0ZU1haW5mZXN0KFxuICAgIGFsbEVudHJ5cG9pbnRzLFxuICAgIG1lcmdlZE91dHB1dCxcbiAgICBjb25maWcsXG4gICk7XG4gIGNvbnN0IGZpbmFsT3V0cHV0OiBCdWlsZE91dHB1dCA9IHtcbiAgICBtYW5pZmVzdDogbmV3TWFuaWZlc3QsXG4gICAgLi4ubmV3T3V0cHV0LFxuICB9O1xuXG4gIC8vIFdyaXRlIG1hbmlmZXN0XG4gIGF3YWl0IHdyaXRlTWFuaWZlc3QobmV3TWFuaWZlc3QsIGZpbmFsT3V0cHV0LCBjb25maWcpO1xuXG4gIC8vIFN0b3AgdGhlIHNwaW5uZXIgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBDTEkgb3V0cHV0XG4gIHNwaW5uZXIuY2xlYXIoKS5zdG9wKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBvdXRwdXQ6IHtcbiAgICAgIG1hbmlmZXN0OiBuZXdNYW5pZmVzdCxcbiAgICAgIHN0ZXBzOiBbLi4uZXhpc3RpbmdPdXRwdXQuc3RlcHMsIC4uLmZpbmFsT3V0cHV0LnN0ZXBzXSxcbiAgICAgIHB1YmxpY0Fzc2V0czogW1xuICAgICAgICAuLi5leGlzdGluZ091dHB1dC5wdWJsaWNBc3NldHMsXG4gICAgICAgIC4uLmZpbmFsT3V0cHV0LnB1YmxpY0Fzc2V0cyxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBtYW5pZmVzdDogbmV3TWFuaWZlc3QsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbWJpbmVBbmFseXNpc1N0YXRzKGNvbmZpZzogSW50ZXJuYWxDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdW5peEZpbGVzID0gYXdhaXQgZ2xvYihgc3RhdHMtKi5qc29uYCwge1xuICAgIGN3ZDogY29uZmlnLm91dERpcixcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgfSk7XG4gIGNvbnN0IGFic29sdXRlUGF0aHMgPSB1bml4RmlsZXMubWFwKHVubm9ybWFsaXplUGF0aCk7XG5cbiAgYXdhaXQgZXhlY2FDb21tYW5kKFxuICAgIGByb2xsdXAtcGx1Z2luLXZpc3VhbGl6ZXIgJHthYnNvbHV0ZVBhdGhzLmpvaW4oJyAnKX0gLS10ZW1wbGF0ZSAke1xuICAgICAgY29uZmlnLmFuYWx5c2lzLnRlbXBsYXRlXG4gICAgfWAsXG4gICAgeyBjd2Q6IGNvbmZpZy5yb290LCBzdGRpbzogJ2luaGVyaXQnIH0sXG4gICk7XG59XG4iLCAiaW1wb3J0IHsgRW50cnlwb2ludCB9IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IEVudHJ5cG9pbnRHcm91cCB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBFbnRyeXBvaW50cyBjYW4gYmUgYnVpbGQgaW4gZ3JvdXBzLiBIVE1MIHBhZ2VzIGNhbiBhbGwgYmUgYnVpbHQgdG9nZXRoZXIgaW4gYSBzaW5nbGUgc3RlcCwgd2hpbGVcbiAqIGNvbnRlbnQgc2NyaXB0cyBtdXN0IGJlIGJ1aWxkIGluZGl2aWR1YWxseS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGVudHJ5cG9pbnRzIHB1dCBpbnRvIHRoZXNlIHR5cGVzIG9mIGdyb3Vwcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwRW50cnlwb2ludHMoZW50cnlwb2ludHM6IEVudHJ5cG9pbnRbXSk6IEVudHJ5cG9pbnRHcm91cFtdIHtcbiAgY29uc3QgZ3JvdXBJbmRleE1hcDogUGFydGlhbDxSZWNvcmQ8R3JvdXAsIG51bWJlcj4+ID0ge307XG4gIGNvbnN0IGdyb3VwczogRW50cnlwb2ludEdyb3VwW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJ5cG9pbnRzKSB7XG4gICAgY29uc3QgZ3JvdXAgPSBFTlRSWV9UWVBFX1RPX0dST1VQX01BUFtlbnRyeS50eXBlXTtcbiAgICBpZiAoZ3JvdXAgPT09ICduby1ncm91cCcpIHtcbiAgICAgIGdyb3Vwcy5wdXNoKGVudHJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGdyb3VwSW5kZXggPSBncm91cEluZGV4TWFwW2dyb3VwXTtcbiAgICAgIGlmIChncm91cEluZGV4ID09IG51bGwpIHtcbiAgICAgICAgZ3JvdXBJbmRleCA9IGdyb3Vwcy5wdXNoKFtdKSAtIDE7XG4gICAgICAgIGdyb3VwSW5kZXhNYXBbZ3JvdXBdID0gZ3JvdXBJbmRleDtcbiAgICAgIH1cbiAgICAgIChncm91cHNbZ3JvdXBJbmRleF0gYXMgRW50cnlwb2ludFtdKS5wdXNoKGVudHJ5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZ3JvdXBzO1xufVxuXG5jb25zdCBFTlRSWV9UWVBFX1RPX0dST1VQX01BUDogUmVjb3JkPEVudHJ5cG9pbnRbJ3R5cGUnXSwgR3JvdXA+ID0ge1xuICBzYW5kYm94OiAnc2FuZGJveC1wYWdlJyxcblxuICBwb3B1cDogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgbmV3dGFiOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICBoaXN0b3J5OiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICBvcHRpb25zOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICBkZXZ0b29sczogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgYm9va21hcmtzOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICBzaWRlcGFuZWw6ICdleHRlbnNpb24tcGFnZScsXG4gICd1bmxpc3RlZC1wYWdlJzogJ2V4dGVuc2lvbi1wYWdlJyxcblxuICBiYWNrZ3JvdW5kOiAnbm8tZ3JvdXAnLFxuICAnY29udGVudC1zY3JpcHQnOiAnbm8tZ3JvdXAnLFxuICAndW5saXN0ZWQtc2NyaXB0JzogJ25vLWdyb3VwJyxcbiAgJ3VubGlzdGVkLXN0eWxlJzogJ25vLWdyb3VwJyxcbiAgJ2NvbnRlbnQtc2NyaXB0LXN0eWxlJzogJ25vLWdyb3VwJyxcbn07XG5cbnR5cGUgR3JvdXAgPSAnZXh0ZW5zaW9uLXBhZ2UnIHwgJ3NhbmRib3gtcGFnZScgfCAnbm8tZ3JvdXAnO1xuIiwgImV4cG9ydCBmdW5jdGlvbiBmb3JtYXREdXJhdGlvbihkdXJhdGlvbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGR1cmF0aW9uIDwgMWUzKSByZXR1cm4gYCR7ZHVyYXRpb259IG1zYDtcbiAgaWYgKGR1cmF0aW9uIDwgMTBlMykgcmV0dXJuIGAkeyhkdXJhdGlvbiAvIDFlMykudG9GaXhlZCgzKX0gc2A7XG4gIGlmIChkdXJhdGlvbiA8IDYwZTMpIHJldHVybiBgJHsoZHVyYXRpb24gLyAxZTMpLnRvRml4ZWQoMSl9IHNgO1xuICByZXR1cm4gYCR7KGR1cmF0aW9uIC8gMWUzKS50b0ZpeGVkKDApfSBzYDtcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBCdWlsZE91dHB1dCwgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBwcmludEZpbGVMaXN0IH0gZnJvbSAnLi9wcmludEZpbGVMaXN0JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByaW50QnVpbGRTdW1tYXJ5KFxuICBsb2c6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCxcbiAgaGVhZGVyOiBzdHJpbmcsXG4gIG91dHB1dDogQnVpbGRPdXRwdXQsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pIHtcbiAgY29uc3QgY2h1bmtzID0gW1xuICAgIC4uLm91dHB1dC5zdGVwcy5mbGF0TWFwKChzdGVwKSA9PiBzdGVwLmNodW5rcyksXG4gICAgLi4ub3V0cHV0LnB1YmxpY0Fzc2V0cyxcbiAgXS5zb3J0KChsLCByKSA9PiB7XG4gICAgY29uc3QgbFdlaWdodCA9IGdldENodW5rU29ydFdlaWdodChsLmZpbGVOYW1lKTtcbiAgICBjb25zdCByV2VpZ2h0ID0gZ2V0Q2h1bmtTb3J0V2VpZ2h0KHIuZmlsZU5hbWUpO1xuICAgIGNvbnN0IGRpZmYgPSBsV2VpZ2h0IC0gcldlaWdodDtcbiAgICBpZiAoZGlmZiAhPT0gMCkgcmV0dXJuIGRpZmY7XG4gICAgcmV0dXJuIGwuZmlsZU5hbWUubG9jYWxlQ29tcGFyZShyLmZpbGVOYW1lKTtcbiAgfSk7XG5cbiAgY29uc3QgZmlsZXMgPSBjaHVua3MubWFwKChjaHVuaykgPT4gcmVzb2x2ZShjb25maWcub3V0RGlyLCBjaHVuay5maWxlTmFtZSkpO1xuICBhd2FpdCBwcmludEZpbGVMaXN0KGxvZywgaGVhZGVyLCBjb25maWcub3V0RGlyLCBmaWxlcyk7XG59XG5cbmNvbnN0IERFRkFVTFRfU09SVF9XRUlHSFQgPSAxMDA7XG5jb25zdCBDSFVOS19TT1JUX1dFSUdIVFM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gICdtYW5pZmVzdC5qc29uJzogMCxcbiAgJy5odG1sJzogMSxcbiAgJy5qcy5tYXAnOiAyLFxuICAnLmpzJzogMixcbiAgJy5jc3MnOiAzLFxufTtcbmZ1bmN0aW9uIGdldENodW5rU29ydFdlaWdodChmaWxlbmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0LmVudHJpZXMoQ0hVTktfU09SVF9XRUlHSFRTKS5maW5kKChba2V5XSkgPT5cbiAgICAgIGZpbGVuYW1lLmVuZHNXaXRoKGtleSksXG4gICAgKT8uWzFdID8/IERFRkFVTFRfU09SVF9XRUlHSFRcbiAgKTtcbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHBjIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGZpbGVzaXplIH0gZnJvbSAnZmlsZXNpemUnO1xuaW1wb3J0IHsgcHJpbnRUYWJsZSB9IGZyb20gJy4vcHJpbnRUYWJsZSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmludEZpbGVMaXN0KFxuICBsb2c6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQsXG4gIGhlYWRlcjogc3RyaW5nLFxuICBiYXNlRGlyOiBzdHJpbmcsXG4gIGZpbGVzOiBzdHJpbmdbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgdG90YWxTaXplID0gMDtcblxuICBjb25zdCBmaWxlUm93czogc3RyaW5nW11bXSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbGVzLm1hcChhc3luYyAoZmlsZSwgaSkgPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAgIHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgYmFzZURpcikgKyBwYXRoLnNlcCxcbiAgICAgICAgcGF0aC5yZWxhdGl2ZShiYXNlRGlyLCBmaWxlKSxcbiAgICAgIF07XG4gICAgICBjb25zdCBwcmVmaXggPSBpID09PSBmaWxlcy5sZW5ndGggLSAxID8gJyAgXHUyNTE0XHUyNTAwJyA6ICcgIFx1MjUxQ1x1MjUwMCc7XG4gICAgICBjb25zdCBjb2xvciA9IGdldENodW5rQ29sb3IoZmlsZSk7XG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLmxzdGF0KGZpbGUpO1xuICAgICAgdG90YWxTaXplICs9IHN0YXRzLnNpemU7XG4gICAgICBjb25zdCBzaXplID0gU3RyaW5nKGZpbGVzaXplKHN0YXRzLnNpemUpKTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGAke3BjLmdyYXkocHJlZml4KX0gJHtwYy5kaW0ocGFydHNbMF0pfSR7Y29sb3IocGFydHNbMV0pfWAsXG4gICAgICAgIHBjLmRpbShzaXplKSxcbiAgICAgIF07XG4gICAgfSksXG4gICk7XG5cbiAgZmlsZVJvd3MucHVzaChbYCR7cGMuY3lhbignXHUwM0EzIFRvdGFsIHNpemU6Jyl9ICR7U3RyaW5nKGZpbGVzaXplKHRvdGFsU2l6ZSkpfWBdKTtcblxuICBwcmludFRhYmxlKGxvZywgaGVhZGVyLCBmaWxlUm93cyk7XG59XG5cbmNvbnN0IERFRkFVTFRfQ09MT1IgPSBwYy5ibHVlO1xuY29uc3QgQ0hVTktfQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCAodGV4dDogc3RyaW5nKSA9PiBzdHJpbmc+ID0ge1xuICAnLmpzLm1hcCc6IHBjLmdyYXksXG4gICcuaHRtbCc6IHBjLmdyZWVuLFxuICAnLmNzcyc6IHBjLm1hZ2VudGEsXG4gICcuanMnOiBwYy5jeWFuLFxuICAnLnppcCc6IHBjLnllbGxvdyxcbn07XG5mdW5jdGlvbiBnZXRDaHVua0NvbG9yKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIChcbiAgICBPYmplY3QuZW50cmllcyhDSFVOS19DT0xPUlMpLmZpbmQoKFtrZXldKSA9PiBmaWxlbmFtZS5lbmRzV2l0aChrZXkpKT8uWzFdID8/XG4gICAgREVGQVVMVF9DT0xPUlxuICApO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBwcmludFRhYmxlKFxuICBsb2c6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQsXG4gIGhlYWRlcjogc3RyaW5nLFxuICByb3dzOiBzdHJpbmdbXVtdLFxuICBnYXAgPSAyLFxuKTogdm9pZCB7XG4gIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbHVtbldpZHRocyA9IHJvd3MucmVkdWNlKFxuICAgICh3aWR0aHMsIHJvdykgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1heCh3aWR0aHMubGVuZ3RoLCByb3cubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgIHdpZHRoc1tpXSA9IE1hdGgubWF4KHJvd1tpXT8ubGVuZ3RoID8/IDAsIHdpZHRoc1tpXSA/PyAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3aWR0aHM7XG4gICAgfSxcbiAgICByb3dzWzBdLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubGVuZ3RoKSxcbiAgKTtcblxuICBsZXQgc3RyID0gJyc7XG4gIHJvd3MuZm9yRWFjaCgocm93LCBpKSA9PiB7XG4gICAgcm93LmZvckVhY2goKGNvbCwgaikgPT4ge1xuICAgICAgc3RyICs9IGNvbC5wYWRFbmQoY29sdW1uV2lkdGhzW2pdLCAnICcpO1xuICAgICAgaWYgKGogIT09IHJvdy5sZW5ndGggLSAxKSBzdHIgKz0gJycucGFkRW5kKGdhcCwgJyAnKTtcbiAgICB9KTtcbiAgICBpZiAoaSAhPT0gcm93cy5sZW5ndGggLSAxKSBzdHIgKz0gJ1xcbic7XG4gIH0pO1xuXG4gIGxvZyhgJHtoZWFkZXJ9XFxuJHtzdHJ9YCk7XG59XG4iLCAiaW1wb3J0IHtCdWZmZXJ9IGZyb20gJ25vZGU6YnVmZmVyJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IGNyb3NzU3Bhd24gZnJvbSAnY3Jvc3Mtc3Bhd24nO1xuaW1wb3J0IHN0cmlwRmluYWxOZXdsaW5lIGZyb20gJ3N0cmlwLWZpbmFsLW5ld2xpbmUnO1xuaW1wb3J0IHtucG1SdW5QYXRoRW52fSBmcm9tICducG0tcnVuLXBhdGgnO1xuaW1wb3J0IG9uZXRpbWUgZnJvbSAnb25ldGltZSc7XG5pbXBvcnQge21ha2VFcnJvcn0gZnJvbSAnLi9saWIvZXJyb3IuanMnO1xuaW1wb3J0IHtub3JtYWxpemVTdGRpbywgbm9ybWFsaXplU3RkaW9Ob2RlfSBmcm9tICcuL2xpYi9zdGRpby5qcyc7XG5pbXBvcnQge3NwYXduZWRLaWxsLCBzcGF3bmVkQ2FuY2VsLCBzZXR1cFRpbWVvdXQsIHZhbGlkYXRlVGltZW91dCwgc2V0RXhpdEhhbmRsZXJ9IGZyb20gJy4vbGliL2tpbGwuanMnO1xuaW1wb3J0IHthZGRQaXBlTWV0aG9kc30gZnJvbSAnLi9saWIvcGlwZS5qcyc7XG5pbXBvcnQge2hhbmRsZUlucHV0LCBnZXRTcGF3bmVkUmVzdWx0LCBtYWtlQWxsU3RyZWFtLCBoYW5kbGVJbnB1dFN5bmN9IGZyb20gJy4vbGliL3N0cmVhbS5qcyc7XG5pbXBvcnQge21lcmdlUHJvbWlzZSwgZ2V0U3Bhd25lZFByb21pc2V9IGZyb20gJy4vbGliL3Byb21pc2UuanMnO1xuaW1wb3J0IHtqb2luQ29tbWFuZCwgcGFyc2VDb21tYW5kLCBwYXJzZVRlbXBsYXRlcywgZ2V0RXNjYXBlZENvbW1hbmR9IGZyb20gJy4vbGliL2NvbW1hbmQuanMnO1xuaW1wb3J0IHtsb2dDb21tYW5kLCB2ZXJib3NlRGVmYXVsdH0gZnJvbSAnLi9saWIvdmVyYm9zZS5qcyc7XG5cbmNvbnN0IERFRkFVTFRfTUFYX0JVRkZFUiA9IDEwMDAgKiAxMDAwICogMTAwO1xuXG5jb25zdCBnZXRFbnYgPSAoe2VudjogZW52T3B0aW9uLCBleHRlbmRFbnYsIHByZWZlckxvY2FsLCBsb2NhbERpciwgZXhlY1BhdGh9KSA9PiB7XG5cdGNvbnN0IGVudiA9IGV4dGVuZEVudiA/IHsuLi5wcm9jZXNzLmVudiwgLi4uZW52T3B0aW9ufSA6IGVudk9wdGlvbjtcblxuXHRpZiAocHJlZmVyTG9jYWwpIHtcblx0XHRyZXR1cm4gbnBtUnVuUGF0aEVudih7ZW52LCBjd2Q6IGxvY2FsRGlyLCBleGVjUGF0aH0pO1xuXHR9XG5cblx0cmV0dXJuIGVudjtcbn07XG5cbmNvbnN0IGhhbmRsZUFyZ3VtZW50cyA9IChmaWxlLCBhcmdzLCBvcHRpb25zID0ge30pID0+IHtcblx0Y29uc3QgcGFyc2VkID0gY3Jvc3NTcGF3bi5fcGFyc2UoZmlsZSwgYXJncywgb3B0aW9ucyk7XG5cdGZpbGUgPSBwYXJzZWQuY29tbWFuZDtcblx0YXJncyA9IHBhcnNlZC5hcmdzO1xuXHRvcHRpb25zID0gcGFyc2VkLm9wdGlvbnM7XG5cblx0b3B0aW9ucyA9IHtcblx0XHRtYXhCdWZmZXI6IERFRkFVTFRfTUFYX0JVRkZFUixcblx0XHRidWZmZXI6IHRydWUsXG5cdFx0c3RyaXBGaW5hbE5ld2xpbmU6IHRydWUsXG5cdFx0ZXh0ZW5kRW52OiB0cnVlLFxuXHRcdHByZWZlckxvY2FsOiBmYWxzZSxcblx0XHRsb2NhbERpcjogb3B0aW9ucy5jd2QgfHwgcHJvY2Vzcy5jd2QoKSxcblx0XHRleGVjUGF0aDogcHJvY2Vzcy5leGVjUGF0aCxcblx0XHRlbmNvZGluZzogJ3V0ZjgnLFxuXHRcdHJlamVjdDogdHJ1ZSxcblx0XHRjbGVhbnVwOiB0cnVlLFxuXHRcdGFsbDogZmFsc2UsXG5cdFx0d2luZG93c0hpZGU6IHRydWUsXG5cdFx0dmVyYm9zZTogdmVyYm9zZURlZmF1bHQsXG5cdFx0Li4ub3B0aW9ucyxcblx0fTtcblxuXHRvcHRpb25zLmVudiA9IGdldEVudihvcHRpb25zKTtcblxuXHRvcHRpb25zLnN0ZGlvID0gbm9ybWFsaXplU3RkaW8ob3B0aW9ucyk7XG5cblx0aWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgJiYgcGF0aC5iYXNlbmFtZShmaWxlLCAnLmV4ZScpID09PSAnY21kJykge1xuXHRcdC8vICMxMTZcblx0XHRhcmdzLnVuc2hpZnQoJy9xJyk7XG5cdH1cblxuXHRyZXR1cm4ge2ZpbGUsIGFyZ3MsIG9wdGlvbnMsIHBhcnNlZH07XG59O1xuXG5jb25zdCBoYW5kbGVPdXRwdXQgPSAob3B0aW9ucywgdmFsdWUsIGVycm9yKSA9PiB7XG5cdGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG5cdFx0Ly8gV2hlbiBgZXhlY2FTeW5jKClgIGVycm9ycywgd2Ugbm9ybWFsaXplIGl0IHRvICcnIHRvIG1pbWljIGBleGVjYSgpYFxuXHRcdHJldHVybiBlcnJvciA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogJyc7XG5cdH1cblxuXHRpZiAob3B0aW9ucy5zdHJpcEZpbmFsTmV3bGluZSkge1xuXHRcdHJldHVybiBzdHJpcEZpbmFsTmV3bGluZSh2YWx1ZSk7XG5cdH1cblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZXhlY2EoZmlsZSwgYXJncywgb3B0aW9ucykge1xuXHRjb25zdCBwYXJzZWQgPSBoYW5kbGVBcmd1bWVudHMoZmlsZSwgYXJncywgb3B0aW9ucyk7XG5cdGNvbnN0IGNvbW1hbmQgPSBqb2luQ29tbWFuZChmaWxlLCBhcmdzKTtcblx0Y29uc3QgZXNjYXBlZENvbW1hbmQgPSBnZXRFc2NhcGVkQ29tbWFuZChmaWxlLCBhcmdzKTtcblx0bG9nQ29tbWFuZChlc2NhcGVkQ29tbWFuZCwgcGFyc2VkLm9wdGlvbnMpO1xuXG5cdHZhbGlkYXRlVGltZW91dChwYXJzZWQub3B0aW9ucyk7XG5cblx0bGV0IHNwYXduZWQ7XG5cdHRyeSB7XG5cdFx0c3Bhd25lZCA9IGNoaWxkUHJvY2Vzcy5zcGF3bihwYXJzZWQuZmlsZSwgcGFyc2VkLmFyZ3MsIHBhcnNlZC5vcHRpb25zKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBFbnN1cmUgdGhlIHJldHVybmVkIGVycm9yIGlzIGFsd2F5cyBib3RoIGEgcHJvbWlzZSBhbmQgYSBjaGlsZCBwcm9jZXNzXG5cdFx0Y29uc3QgZHVtbXlTcGF3bmVkID0gbmV3IGNoaWxkUHJvY2Vzcy5DaGlsZFByb2Nlc3MoKTtcblx0XHRjb25zdCBlcnJvclByb21pc2UgPSBQcm9taXNlLnJlamVjdChtYWtlRXJyb3Ioe1xuXHRcdFx0ZXJyb3IsXG5cdFx0XHRzdGRvdXQ6ICcnLFxuXHRcdFx0c3RkZXJyOiAnJyxcblx0XHRcdGFsbDogJycsXG5cdFx0XHRjb21tYW5kLFxuXHRcdFx0ZXNjYXBlZENvbW1hbmQsXG5cdFx0XHRwYXJzZWQsXG5cdFx0XHR0aW1lZE91dDogZmFsc2UsXG5cdFx0XHRpc0NhbmNlbGVkOiBmYWxzZSxcblx0XHRcdGtpbGxlZDogZmFsc2UsXG5cdFx0fSkpO1xuXHRcdG1lcmdlUHJvbWlzZShkdW1teVNwYXduZWQsIGVycm9yUHJvbWlzZSk7XG5cdFx0cmV0dXJuIGR1bW15U3Bhd25lZDtcblx0fVxuXG5cdGNvbnN0IHNwYXduZWRQcm9taXNlID0gZ2V0U3Bhd25lZFByb21pc2Uoc3Bhd25lZCk7XG5cdGNvbnN0IHRpbWVkUHJvbWlzZSA9IHNldHVwVGltZW91dChzcGF3bmVkLCBwYXJzZWQub3B0aW9ucywgc3Bhd25lZFByb21pc2UpO1xuXHRjb25zdCBwcm9jZXNzRG9uZSA9IHNldEV4aXRIYW5kbGVyKHNwYXduZWQsIHBhcnNlZC5vcHRpb25zLCB0aW1lZFByb21pc2UpO1xuXG5cdGNvbnN0IGNvbnRleHQgPSB7aXNDYW5jZWxlZDogZmFsc2V9O1xuXG5cdHNwYXduZWQua2lsbCA9IHNwYXduZWRLaWxsLmJpbmQobnVsbCwgc3Bhd25lZC5raWxsLmJpbmQoc3Bhd25lZCkpO1xuXHRzcGF3bmVkLmNhbmNlbCA9IHNwYXduZWRDYW5jZWwuYmluZChudWxsLCBzcGF3bmVkLCBjb250ZXh0KTtcblxuXHRjb25zdCBoYW5kbGVQcm9taXNlID0gYXN5bmMgKCkgPT4ge1xuXHRcdGNvbnN0IFt7ZXJyb3IsIGV4aXRDb2RlLCBzaWduYWwsIHRpbWVkT3V0fSwgc3Rkb3V0UmVzdWx0LCBzdGRlcnJSZXN1bHQsIGFsbFJlc3VsdF0gPSBhd2FpdCBnZXRTcGF3bmVkUmVzdWx0KHNwYXduZWQsIHBhcnNlZC5vcHRpb25zLCBwcm9jZXNzRG9uZSk7XG5cdFx0Y29uc3Qgc3Rkb3V0ID0gaGFuZGxlT3V0cHV0KHBhcnNlZC5vcHRpb25zLCBzdGRvdXRSZXN1bHQpO1xuXHRcdGNvbnN0IHN0ZGVyciA9IGhhbmRsZU91dHB1dChwYXJzZWQub3B0aW9ucywgc3RkZXJyUmVzdWx0KTtcblx0XHRjb25zdCBhbGwgPSBoYW5kbGVPdXRwdXQocGFyc2VkLm9wdGlvbnMsIGFsbFJlc3VsdCk7XG5cblx0XHRpZiAoZXJyb3IgfHwgZXhpdENvZGUgIT09IDAgfHwgc2lnbmFsICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCByZXR1cm5lZEVycm9yID0gbWFrZUVycm9yKHtcblx0XHRcdFx0ZXJyb3IsXG5cdFx0XHRcdGV4aXRDb2RlLFxuXHRcdFx0XHRzaWduYWwsXG5cdFx0XHRcdHN0ZG91dCxcblx0XHRcdFx0c3RkZXJyLFxuXHRcdFx0XHRhbGwsXG5cdFx0XHRcdGNvbW1hbmQsXG5cdFx0XHRcdGVzY2FwZWRDb21tYW5kLFxuXHRcdFx0XHRwYXJzZWQsXG5cdFx0XHRcdHRpbWVkT3V0LFxuXHRcdFx0XHRpc0NhbmNlbGVkOiBjb250ZXh0LmlzQ2FuY2VsZWQgfHwgKHBhcnNlZC5vcHRpb25zLnNpZ25hbCA/IHBhcnNlZC5vcHRpb25zLnNpZ25hbC5hYm9ydGVkIDogZmFsc2UpLFxuXHRcdFx0XHRraWxsZWQ6IHNwYXduZWQua2lsbGVkLFxuXHRcdFx0fSk7XG5cblx0XHRcdGlmICghcGFyc2VkLm9wdGlvbnMucmVqZWN0KSB7XG5cdFx0XHRcdHJldHVybiByZXR1cm5lZEVycm9yO1xuXHRcdFx0fVxuXG5cdFx0XHR0aHJvdyByZXR1cm5lZEVycm9yO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRjb21tYW5kLFxuXHRcdFx0ZXNjYXBlZENvbW1hbmQsXG5cdFx0XHRleGl0Q29kZTogMCxcblx0XHRcdHN0ZG91dCxcblx0XHRcdHN0ZGVycixcblx0XHRcdGFsbCxcblx0XHRcdGZhaWxlZDogZmFsc2UsXG5cdFx0XHR0aW1lZE91dDogZmFsc2UsXG5cdFx0XHRpc0NhbmNlbGVkOiBmYWxzZSxcblx0XHRcdGtpbGxlZDogZmFsc2UsXG5cdFx0fTtcblx0fTtcblxuXHRjb25zdCBoYW5kbGVQcm9taXNlT25jZSA9IG9uZXRpbWUoaGFuZGxlUHJvbWlzZSk7XG5cblx0aGFuZGxlSW5wdXQoc3Bhd25lZCwgcGFyc2VkLm9wdGlvbnMpO1xuXG5cdHNwYXduZWQuYWxsID0gbWFrZUFsbFN0cmVhbShzcGF3bmVkLCBwYXJzZWQub3B0aW9ucyk7XG5cblx0YWRkUGlwZU1ldGhvZHMoc3Bhd25lZCk7XG5cdG1lcmdlUHJvbWlzZShzcGF3bmVkLCBoYW5kbGVQcm9taXNlT25jZSk7XG5cdHJldHVybiBzcGF3bmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhlY2FTeW5jKGZpbGUsIGFyZ3MsIG9wdGlvbnMpIHtcblx0Y29uc3QgcGFyc2VkID0gaGFuZGxlQXJndW1lbnRzKGZpbGUsIGFyZ3MsIG9wdGlvbnMpO1xuXHRjb25zdCBjb21tYW5kID0gam9pbkNvbW1hbmQoZmlsZSwgYXJncyk7XG5cdGNvbnN0IGVzY2FwZWRDb21tYW5kID0gZ2V0RXNjYXBlZENvbW1hbmQoZmlsZSwgYXJncyk7XG5cdGxvZ0NvbW1hbmQoZXNjYXBlZENvbW1hbmQsIHBhcnNlZC5vcHRpb25zKTtcblxuXHRjb25zdCBpbnB1dCA9IGhhbmRsZUlucHV0U3luYyhwYXJzZWQub3B0aW9ucyk7XG5cblx0bGV0IHJlc3VsdDtcblx0dHJ5IHtcblx0XHRyZXN1bHQgPSBjaGlsZFByb2Nlc3Muc3Bhd25TeW5jKHBhcnNlZC5maWxlLCBwYXJzZWQuYXJncywgey4uLnBhcnNlZC5vcHRpb25zLCBpbnB1dH0pO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdHRocm93IG1ha2VFcnJvcih7XG5cdFx0XHRlcnJvcixcblx0XHRcdHN0ZG91dDogJycsXG5cdFx0XHRzdGRlcnI6ICcnLFxuXHRcdFx0YWxsOiAnJyxcblx0XHRcdGNvbW1hbmQsXG5cdFx0XHRlc2NhcGVkQ29tbWFuZCxcblx0XHRcdHBhcnNlZCxcblx0XHRcdHRpbWVkT3V0OiBmYWxzZSxcblx0XHRcdGlzQ2FuY2VsZWQ6IGZhbHNlLFxuXHRcdFx0a2lsbGVkOiBmYWxzZSxcblx0XHR9KTtcblx0fVxuXG5cdGNvbnN0IHN0ZG91dCA9IGhhbmRsZU91dHB1dChwYXJzZWQub3B0aW9ucywgcmVzdWx0LnN0ZG91dCwgcmVzdWx0LmVycm9yKTtcblx0Y29uc3Qgc3RkZXJyID0gaGFuZGxlT3V0cHV0KHBhcnNlZC5vcHRpb25zLCByZXN1bHQuc3RkZXJyLCByZXN1bHQuZXJyb3IpO1xuXG5cdGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCByZXN1bHQuc2lnbmFsICE9PSBudWxsKSB7XG5cdFx0Y29uc3QgZXJyb3IgPSBtYWtlRXJyb3Ioe1xuXHRcdFx0c3Rkb3V0LFxuXHRcdFx0c3RkZXJyLFxuXHRcdFx0ZXJyb3I6IHJlc3VsdC5lcnJvcixcblx0XHRcdHNpZ25hbDogcmVzdWx0LnNpZ25hbCxcblx0XHRcdGV4aXRDb2RlOiByZXN1bHQuc3RhdHVzLFxuXHRcdFx0Y29tbWFuZCxcblx0XHRcdGVzY2FwZWRDb21tYW5kLFxuXHRcdFx0cGFyc2VkLFxuXHRcdFx0dGltZWRPdXQ6IHJlc3VsdC5lcnJvciAmJiByZXN1bHQuZXJyb3IuY29kZSA9PT0gJ0VUSU1FRE9VVCcsXG5cdFx0XHRpc0NhbmNlbGVkOiBmYWxzZSxcblx0XHRcdGtpbGxlZDogcmVzdWx0LnNpZ25hbCAhPT0gbnVsbCxcblx0XHR9KTtcblxuXHRcdGlmICghcGFyc2VkLm9wdGlvbnMucmVqZWN0KSB7XG5cdFx0XHRyZXR1cm4gZXJyb3I7XG5cdFx0fVxuXG5cdFx0dGhyb3cgZXJyb3I7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGNvbW1hbmQsXG5cdFx0ZXNjYXBlZENvbW1hbmQsXG5cdFx0ZXhpdENvZGU6IDAsXG5cdFx0c3Rkb3V0LFxuXHRcdHN0ZGVycixcblx0XHRmYWlsZWQ6IGZhbHNlLFxuXHRcdHRpbWVkT3V0OiBmYWxzZSxcblx0XHRpc0NhbmNlbGVkOiBmYWxzZSxcblx0XHRraWxsZWQ6IGZhbHNlLFxuXHR9O1xufVxuXG5jb25zdCBub3JtYWxpemVTY3JpcHRTdGRpbiA9ICh7aW5wdXQsIGlucHV0RmlsZSwgc3RkaW99KSA9PiBpbnB1dCA9PT0gdW5kZWZpbmVkICYmIGlucHV0RmlsZSA9PT0gdW5kZWZpbmVkICYmIHN0ZGlvID09PSB1bmRlZmluZWRcblx0PyB7c3RkaW46ICdpbmhlcml0J31cblx0OiB7fTtcblxuY29uc3Qgbm9ybWFsaXplU2NyaXB0T3B0aW9ucyA9IChvcHRpb25zID0ge30pID0+ICh7XG5cdHByZWZlckxvY2FsOiB0cnVlLFxuXHQuLi5ub3JtYWxpemVTY3JpcHRTdGRpbihvcHRpb25zKSxcblx0Li4ub3B0aW9ucyxcbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGUkKG9wdGlvbnMpIHtcblx0ZnVuY3Rpb24gJCh0ZW1wbGF0ZXNPck9wdGlvbnMsIC4uLmV4cHJlc3Npb25zKSB7XG5cdFx0aWYgKCFBcnJheS5pc0FycmF5KHRlbXBsYXRlc09yT3B0aW9ucykpIHtcblx0XHRcdHJldHVybiBjcmVhdGUkKHsuLi5vcHRpb25zLCAuLi50ZW1wbGF0ZXNPck9wdGlvbnN9KTtcblx0XHR9XG5cblx0XHRjb25zdCBbZmlsZSwgLi4uYXJnc10gPSBwYXJzZVRlbXBsYXRlcyh0ZW1wbGF0ZXNPck9wdGlvbnMsIGV4cHJlc3Npb25zKTtcblx0XHRyZXR1cm4gZXhlY2EoZmlsZSwgYXJncywgbm9ybWFsaXplU2NyaXB0T3B0aW9ucyhvcHRpb25zKSk7XG5cdH1cblxuXHQkLnN5bmMgPSAodGVtcGxhdGVzLCAuLi5leHByZXNzaW9ucykgPT4ge1xuXHRcdGlmICghQXJyYXkuaXNBcnJheSh0ZW1wbGF0ZXMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdQbGVhc2UgdXNlICQob3B0aW9ucykuc3luY2Bjb21tYW5kYCBpbnN0ZWFkIG9mICQuc3luYyhvcHRpb25zKWBjb21tYW5kYC4nKTtcblx0XHR9XG5cblx0XHRjb25zdCBbZmlsZSwgLi4uYXJnc10gPSBwYXJzZVRlbXBsYXRlcyh0ZW1wbGF0ZXMsIGV4cHJlc3Npb25zKTtcblx0XHRyZXR1cm4gZXhlY2FTeW5jKGZpbGUsIGFyZ3MsIG5vcm1hbGl6ZVNjcmlwdE9wdGlvbnMob3B0aW9ucykpO1xuXHR9O1xuXG5cdHJldHVybiAkO1xufVxuXG5leHBvcnQgY29uc3QgJCA9IGNyZWF0ZSQoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWNhQ29tbWFuZChjb21tYW5kLCBvcHRpb25zKSB7XG5cdGNvbnN0IFtmaWxlLCAuLi5hcmdzXSA9IHBhcnNlQ29tbWFuZChjb21tYW5kKTtcblx0cmV0dXJuIGV4ZWNhKGZpbGUsIGFyZ3MsIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhlY2FDb21tYW5kU3luYyhjb21tYW5kLCBvcHRpb25zKSB7XG5cdGNvbnN0IFtmaWxlLCAuLi5hcmdzXSA9IHBhcnNlQ29tbWFuZChjb21tYW5kKTtcblx0cmV0dXJuIGV4ZWNhU3luYyhmaWxlLCBhcmdzLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWNhTm9kZShzY3JpcHRQYXRoLCBhcmdzLCBvcHRpb25zID0ge30pIHtcblx0aWYgKGFyZ3MgJiYgIUFycmF5LmlzQXJyYXkoYXJncykgJiYgdHlwZW9mIGFyZ3MgPT09ICdvYmplY3QnKSB7XG5cdFx0b3B0aW9ucyA9IGFyZ3M7XG5cdFx0YXJncyA9IFtdO1xuXHR9XG5cblx0Y29uc3Qgc3RkaW8gPSBub3JtYWxpemVTdGRpb05vZGUob3B0aW9ucyk7XG5cdGNvbnN0IGRlZmF1bHRFeGVjQXJndiA9IHByb2Nlc3MuZXhlY0FyZ3YuZmlsdGVyKGFyZyA9PiAhYXJnLnN0YXJ0c1dpdGgoJy0taW5zcGVjdCcpKTtcblxuXHRjb25zdCB7XG5cdFx0bm9kZVBhdGggPSBwcm9jZXNzLmV4ZWNQYXRoLFxuXHRcdG5vZGVPcHRpb25zID0gZGVmYXVsdEV4ZWNBcmd2LFxuXHR9ID0gb3B0aW9ucztcblxuXHRyZXR1cm4gZXhlY2EoXG5cdFx0bm9kZVBhdGgsXG5cdFx0W1xuXHRcdFx0Li4ubm9kZU9wdGlvbnMsXG5cdFx0XHRzY3JpcHRQYXRoLFxuXHRcdFx0Li4uKEFycmF5LmlzQXJyYXkoYXJncykgPyBhcmdzIDogW10pLFxuXHRcdF0sXG5cdFx0e1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdHN0ZGluOiB1bmRlZmluZWQsXG5cdFx0XHRzdGRvdXQ6IHVuZGVmaW5lZCxcblx0XHRcdHN0ZGVycjogdW5kZWZpbmVkLFxuXHRcdFx0c3RkaW8sXG5cdFx0XHRzaGVsbDogZmFsc2UsXG5cdFx0fSxcblx0KTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdHJpcEZpbmFsTmV3bGluZShpbnB1dCkge1xuXHRjb25zdCBMRiA9IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyAnXFxuJyA6ICdcXG4nLmNoYXJDb2RlQXQoKTtcblx0Y29uc3QgQ1IgPSB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnID8gJ1xccicgOiAnXFxyJy5jaGFyQ29kZUF0KCk7XG5cblx0aWYgKGlucHV0W2lucHV0Lmxlbmd0aCAtIDFdID09PSBMRikge1xuXHRcdGlucHV0ID0gaW5wdXQuc2xpY2UoMCwgLTEpO1xuXHR9XG5cblx0aWYgKGlucHV0W2lucHV0Lmxlbmd0aCAtIDFdID09PSBDUikge1xuXHRcdGlucHV0ID0gaW5wdXQuc2xpY2UoMCwgLTEpO1xuXHR9XG5cblx0cmV0dXJuIGlucHV0O1xufVxuIiwgImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHVybCBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgcGF0aEtleSBmcm9tICdwYXRoLWtleSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBucG1SdW5QYXRoKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7XG5cdFx0Y3dkID0gcHJvY2Vzcy5jd2QoKSxcblx0XHRwYXRoOiBwYXRoXyA9IHByb2Nlc3MuZW52W3BhdGhLZXkoKV0sXG5cdFx0ZXhlY1BhdGggPSBwcm9jZXNzLmV4ZWNQYXRoLFxuXHR9ID0gb3B0aW9ucztcblxuXHRsZXQgcHJldmlvdXM7XG5cdGNvbnN0IGN3ZFN0cmluZyA9IGN3ZCBpbnN0YW5jZW9mIFVSTCA/IHVybC5maWxlVVJMVG9QYXRoKGN3ZCkgOiBjd2Q7XG5cdGxldCBjd2RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZFN0cmluZyk7XG5cdGNvbnN0IHJlc3VsdCA9IFtdO1xuXG5cdHdoaWxlIChwcmV2aW91cyAhPT0gY3dkUGF0aCkge1xuXHRcdHJlc3VsdC5wdXNoKHBhdGguam9pbihjd2RQYXRoLCAnbm9kZV9tb2R1bGVzLy5iaW4nKSk7XG5cdFx0cHJldmlvdXMgPSBjd2RQYXRoO1xuXHRcdGN3ZFBhdGggPSBwYXRoLnJlc29sdmUoY3dkUGF0aCwgJy4uJyk7XG5cdH1cblxuXHQvLyBFbnN1cmUgdGhlIHJ1bm5pbmcgYG5vZGVgIGJpbmFyeSBpcyB1c2VkLlxuXHRyZXN1bHQucHVzaChwYXRoLnJlc29sdmUoY3dkU3RyaW5nLCBleGVjUGF0aCwgJy4uJykpO1xuXG5cdHJldHVybiBbLi4ucmVzdWx0LCBwYXRoX10uam9pbihwYXRoLmRlbGltaXRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBucG1SdW5QYXRoRW52KHtlbnYgPSBwcm9jZXNzLmVudiwgLi4ub3B0aW9uc30gPSB7fSkge1xuXHRlbnYgPSB7Li4uZW52fTtcblxuXHRjb25zdCBwYXRoID0gcGF0aEtleSh7ZW52fSk7XG5cdG9wdGlvbnMucGF0aCA9IGVudltwYXRoXTtcblx0ZW52W3BhdGhdID0gbnBtUnVuUGF0aChvcHRpb25zKTtcblxuXHRyZXR1cm4gZW52O1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhdGhLZXkob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHtcblx0XHRlbnYgPSBwcm9jZXNzLmVudixcblx0XHRwbGF0Zm9ybSA9IHByb2Nlc3MucGxhdGZvcm1cblx0fSA9IG9wdGlvbnM7XG5cblx0aWYgKHBsYXRmb3JtICE9PSAnd2luMzInKSB7XG5cdFx0cmV0dXJuICdQQVRIJztcblx0fVxuXG5cdHJldHVybiBPYmplY3Qua2V5cyhlbnYpLnJldmVyc2UoKS5maW5kKGtleSA9PiBrZXkudG9VcHBlckNhc2UoKSA9PT0gJ1BBVEgnKSB8fCAnUGF0aCc7XG59XG4iLCAiY29uc3QgY29weVByb3BlcnR5ID0gKHRvLCBmcm9tLCBwcm9wZXJ0eSwgaWdub3JlTm9uQ29uZmlndXJhYmxlKSA9PiB7XG5cdC8vIGBGdW5jdGlvbiNsZW5ndGhgIHNob3VsZCByZWZsZWN0IHRoZSBwYXJhbWV0ZXJzIG9mIGB0b2Agbm90IGBmcm9tYCBzaW5jZSB3ZSBrZWVwIGl0cyBib2R5LlxuXHQvLyBgRnVuY3Rpb24jcHJvdG90eXBlYCBpcyBub24td3JpdGFibGUgYW5kIG5vbi1jb25maWd1cmFibGUgc28gY2FuIG5ldmVyIGJlIG1vZGlmaWVkLlxuXHRpZiAocHJvcGVydHkgPT09ICdsZW5ndGgnIHx8IHByb3BlcnR5ID09PSAncHJvdG90eXBlJykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIGBGdW5jdGlvbiNhcmd1bWVudHNgIGFuZCBgRnVuY3Rpb24jY2FsbGVyYCBzaG91bGQgbm90IGJlIGNvcGllZC4gVGhleSB3ZXJlIHJlcG9ydGVkIHRvIGJlIHByZXNlbnQgaW4gYFJlZmxlY3Qub3duS2V5c2AgZm9yIHNvbWUgZGV2aWNlcyBpbiBSZWFjdCBOYXRpdmUgKCM0MSksIHNvIHdlIGV4cGxpY2l0bHkgaWdub3JlIHRoZW0gaGVyZS5cblx0aWYgKHByb3BlcnR5ID09PSAnYXJndW1lbnRzJyB8fCBwcm9wZXJ0eSA9PT0gJ2NhbGxlcicpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCB0b0Rlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvLCBwcm9wZXJ0eSk7XG5cdGNvbnN0IGZyb21EZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihmcm9tLCBwcm9wZXJ0eSk7XG5cblx0aWYgKCFjYW5Db3B5UHJvcGVydHkodG9EZXNjcmlwdG9yLCBmcm9tRGVzY3JpcHRvcikgJiYgaWdub3JlTm9uQ29uZmlndXJhYmxlKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRvLCBwcm9wZXJ0eSwgZnJvbURlc2NyaXB0b3IpO1xufTtcblxuLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpYCB0aHJvd3MgaWYgdGhlIHByb3BlcnR5IGV4aXN0cywgaXMgbm90IGNvbmZpZ3VyYWJsZSBhbmQgZWl0aGVyOlxuLy8gLSBvbmUgaXRzIGRlc2NyaXB0b3JzIGlzIGNoYW5nZWRcbi8vIC0gaXQgaXMgbm9uLXdyaXRhYmxlIGFuZCBpdHMgdmFsdWUgaXMgY2hhbmdlZFxuY29uc3QgY2FuQ29weVByb3BlcnR5ID0gZnVuY3Rpb24gKHRvRGVzY3JpcHRvciwgZnJvbURlc2NyaXB0b3IpIHtcblx0cmV0dXJuIHRvRGVzY3JpcHRvciA9PT0gdW5kZWZpbmVkIHx8IHRvRGVzY3JpcHRvci5jb25maWd1cmFibGUgfHwgKFxuXHRcdHRvRGVzY3JpcHRvci53cml0YWJsZSA9PT0gZnJvbURlc2NyaXB0b3Iud3JpdGFibGUgJiZcblx0XHR0b0Rlc2NyaXB0b3IuZW51bWVyYWJsZSA9PT0gZnJvbURlc2NyaXB0b3IuZW51bWVyYWJsZSAmJlxuXHRcdHRvRGVzY3JpcHRvci5jb25maWd1cmFibGUgPT09IGZyb21EZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSAmJlxuXHRcdCh0b0Rlc2NyaXB0b3Iud3JpdGFibGUgfHwgdG9EZXNjcmlwdG9yLnZhbHVlID09PSBmcm9tRGVzY3JpcHRvci52YWx1ZSlcblx0KTtcbn07XG5cbmNvbnN0IGNoYW5nZVByb3RvdHlwZSA9ICh0bywgZnJvbSkgPT4ge1xuXHRjb25zdCBmcm9tUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGZyb20pO1xuXHRpZiAoZnJvbVByb3RvdHlwZSA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRvKSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdE9iamVjdC5zZXRQcm90b3R5cGVPZih0bywgZnJvbVByb3RvdHlwZSk7XG59O1xuXG5jb25zdCB3cmFwcGVkVG9TdHJpbmcgPSAod2l0aE5hbWUsIGZyb21Cb2R5KSA9PiBgLyogV3JhcHBlZCAke3dpdGhOYW1lfSovXFxuJHtmcm9tQm9keX1gO1xuXG5jb25zdCB0b1N0cmluZ0Rlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEZ1bmN0aW9uLnByb3RvdHlwZSwgJ3RvU3RyaW5nJyk7XG5jb25zdCB0b1N0cmluZ05hbWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywgJ25hbWUnKTtcblxuLy8gV2UgY2FsbCBgZnJvbS50b1N0cmluZygpYCBlYXJseSAobm90IGxhemlseSkgdG8gZW5zdXJlIGBmcm9tYCBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4vLyBXZSB1c2UgYGJpbmQoKWAgaW5zdGVhZCBvZiBhIGNsb3N1cmUgZm9yIHRoZSBzYW1lIHJlYXNvbi5cbi8vIENhbGxpbmcgYGZyb20udG9TdHJpbmcoKWAgZWFybHkgYWxzbyBhbGxvd3MgY2FjaGluZyBpdCBpbiBjYXNlIGB0by50b1N0cmluZygpYCBpcyBjYWxsZWQgc2V2ZXJhbCB0aW1lcy5cbmNvbnN0IGNoYW5nZVRvU3RyaW5nID0gKHRvLCBmcm9tLCBuYW1lKSA9PiB7XG5cdGNvbnN0IHdpdGhOYW1lID0gbmFtZSA9PT0gJycgPyAnJyA6IGB3aXRoICR7bmFtZS50cmltKCl9KCkgYDtcblx0Y29uc3QgbmV3VG9TdHJpbmcgPSB3cmFwcGVkVG9TdHJpbmcuYmluZChudWxsLCB3aXRoTmFtZSwgZnJvbS50b1N0cmluZygpKTtcblx0Ly8gRW5zdXJlIGB0by50b1N0cmluZy50b1N0cmluZ2AgaXMgbm9uLWVudW1lcmFibGUgYW5kIGhhcyB0aGUgc2FtZSBgc2FtZWBcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld1RvU3RyaW5nLCAnbmFtZScsIHRvU3RyaW5nTmFtZSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0bywgJ3RvU3RyaW5nJywgey4uLnRvU3RyaW5nRGVzY3JpcHRvciwgdmFsdWU6IG5ld1RvU3RyaW5nfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtaW1pY0Z1bmN0aW9uKHRvLCBmcm9tLCB7aWdub3JlTm9uQ29uZmlndXJhYmxlID0gZmFsc2V9ID0ge30pIHtcblx0Y29uc3Qge25hbWV9ID0gdG87XG5cblx0Zm9yIChjb25zdCBwcm9wZXJ0eSBvZiBSZWZsZWN0Lm93bktleXMoZnJvbSkpIHtcblx0XHRjb3B5UHJvcGVydHkodG8sIGZyb20sIHByb3BlcnR5LCBpZ25vcmVOb25Db25maWd1cmFibGUpO1xuXHR9XG5cblx0Y2hhbmdlUHJvdG90eXBlKHRvLCBmcm9tKTtcblx0Y2hhbmdlVG9TdHJpbmcodG8sIGZyb20sIG5hbWUpO1xuXG5cdHJldHVybiB0bztcbn1cbiIsICJpbXBvcnQgbWltaWNGdW5jdGlvbiBmcm9tICdtaW1pYy1mbic7XG5cbmNvbnN0IGNhbGxlZEZ1bmN0aW9ucyA9IG5ldyBXZWFrTWFwKCk7XG5cbmNvbnN0IG9uZXRpbWUgPSAoZnVuY3Rpb25fLCBvcHRpb25zID0ge30pID0+IHtcblx0aWYgKHR5cGVvZiBmdW5jdGlvbl8gIT09ICdmdW5jdGlvbicpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIGZ1bmN0aW9uJyk7XG5cdH1cblxuXHRsZXQgcmV0dXJuVmFsdWU7XG5cdGxldCBjYWxsQ291bnQgPSAwO1xuXHRjb25zdCBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbl8uZGlzcGxheU5hbWUgfHwgZnVuY3Rpb25fLm5hbWUgfHwgJzxhbm9ueW1vdXM+JztcblxuXHRjb25zdCBvbmV0aW1lID0gZnVuY3Rpb24gKC4uLmFyZ3VtZW50c18pIHtcblx0XHRjYWxsZWRGdW5jdGlvbnMuc2V0KG9uZXRpbWUsICsrY2FsbENvdW50KTtcblxuXHRcdGlmIChjYWxsQ291bnQgPT09IDEpIHtcblx0XHRcdHJldHVyblZhbHVlID0gZnVuY3Rpb25fLmFwcGx5KHRoaXMsIGFyZ3VtZW50c18pO1xuXHRcdFx0ZnVuY3Rpb25fID0gbnVsbDtcblx0XHR9IGVsc2UgaWYgKG9wdGlvbnMudGhyb3cgPT09IHRydWUpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRnVuY3Rpb24gXFxgJHtmdW5jdGlvbk5hbWV9XFxgIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlYCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJldHVyblZhbHVlO1xuXHR9O1xuXG5cdG1pbWljRnVuY3Rpb24ob25ldGltZSwgZnVuY3Rpb25fKTtcblx0Y2FsbGVkRnVuY3Rpb25zLnNldChvbmV0aW1lLCBjYWxsQ291bnQpO1xuXG5cdHJldHVybiBvbmV0aW1lO1xufTtcblxub25ldGltZS5jYWxsQ291bnQgPSBmdW5jdGlvbl8gPT4ge1xuXHRpZiAoIWNhbGxlZEZ1bmN0aW9ucy5oYXMoZnVuY3Rpb25fKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgVGhlIGdpdmVuIGZ1bmN0aW9uIFxcYCR7ZnVuY3Rpb25fLm5hbWV9XFxgIGlzIG5vdCB3cmFwcGVkIGJ5IHRoZSBcXGBvbmV0aW1lXFxgIHBhY2thZ2VgKTtcblx0fVxuXG5cdHJldHVybiBjYWxsZWRGdW5jdGlvbnMuZ2V0KGZ1bmN0aW9uXyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBvbmV0aW1lO1xuIiwgImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQge3NpZ25hbHNCeU5hbWV9IGZyb20gJ2h1bWFuLXNpZ25hbHMnO1xuXG5jb25zdCBnZXRFcnJvclByZWZpeCA9ICh7dGltZWRPdXQsIHRpbWVvdXQsIGVycm9yQ29kZSwgc2lnbmFsLCBzaWduYWxEZXNjcmlwdGlvbiwgZXhpdENvZGUsIGlzQ2FuY2VsZWR9KSA9PiB7XG5cdGlmICh0aW1lZE91dCkge1xuXHRcdHJldHVybiBgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH0gbWlsbGlzZWNvbmRzYDtcblx0fVxuXG5cdGlmIChpc0NhbmNlbGVkKSB7XG5cdFx0cmV0dXJuICd3YXMgY2FuY2VsZWQnO1xuXHR9XG5cblx0aWYgKGVycm9yQ29kZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGBmYWlsZWQgd2l0aCAke2Vycm9yQ29kZX1gO1xuXHR9XG5cblx0aWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGB3YXMga2lsbGVkIHdpdGggJHtzaWduYWx9ICgke3NpZ25hbERlc2NyaXB0aW9ufSlgO1xuXHR9XG5cblx0aWYgKGV4aXRDb2RlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gYGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2V4aXRDb2RlfWA7XG5cdH1cblxuXHRyZXR1cm4gJ2ZhaWxlZCc7XG59O1xuXG5leHBvcnQgY29uc3QgbWFrZUVycm9yID0gKHtcblx0c3Rkb3V0LFxuXHRzdGRlcnIsXG5cdGFsbCxcblx0ZXJyb3IsXG5cdHNpZ25hbCxcblx0ZXhpdENvZGUsXG5cdGNvbW1hbmQsXG5cdGVzY2FwZWRDb21tYW5kLFxuXHR0aW1lZE91dCxcblx0aXNDYW5jZWxlZCxcblx0a2lsbGVkLFxuXHRwYXJzZWQ6IHtvcHRpb25zOiB7dGltZW91dCwgY3dkID0gcHJvY2Vzcy5jd2QoKX19LFxufSkgPT4ge1xuXHQvLyBgc2lnbmFsYCBhbmQgYGV4aXRDb2RlYCBlbWl0dGVkIG9uIGBzcGF3bmVkLm9uKCdleGl0JylgIGV2ZW50IGNhbiBiZSBgbnVsbGAuXG5cdC8vIFdlIG5vcm1hbGl6ZSB0aGVtIHRvIGB1bmRlZmluZWRgXG5cdGV4aXRDb2RlID0gZXhpdENvZGUgPT09IG51bGwgPyB1bmRlZmluZWQgOiBleGl0Q29kZTtcblx0c2lnbmFsID0gc2lnbmFsID09PSBudWxsID8gdW5kZWZpbmVkIDogc2lnbmFsO1xuXHRjb25zdCBzaWduYWxEZXNjcmlwdGlvbiA9IHNpZ25hbCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2lnbmFsc0J5TmFtZVtzaWduYWxdLmRlc2NyaXB0aW9uO1xuXG5cdGNvbnN0IGVycm9yQ29kZSA9IGVycm9yICYmIGVycm9yLmNvZGU7XG5cblx0Y29uc3QgcHJlZml4ID0gZ2V0RXJyb3JQcmVmaXgoe3RpbWVkT3V0LCB0aW1lb3V0LCBlcnJvckNvZGUsIHNpZ25hbCwgc2lnbmFsRGVzY3JpcHRpb24sIGV4aXRDb2RlLCBpc0NhbmNlbGVkfSk7XG5cdGNvbnN0IGV4ZWNhTWVzc2FnZSA9IGBDb21tYW5kICR7cHJlZml4fTogJHtjb21tYW5kfWA7XG5cdGNvbnN0IGlzRXJyb3IgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZXJyb3IpID09PSAnW29iamVjdCBFcnJvcl0nO1xuXHRjb25zdCBzaG9ydE1lc3NhZ2UgPSBpc0Vycm9yID8gYCR7ZXhlY2FNZXNzYWdlfVxcbiR7ZXJyb3IubWVzc2FnZX1gIDogZXhlY2FNZXNzYWdlO1xuXHRjb25zdCBtZXNzYWdlID0gW3Nob3J0TWVzc2FnZSwgc3RkZXJyLCBzdGRvdXRdLmZpbHRlcihCb29sZWFuKS5qb2luKCdcXG4nKTtcblxuXHRpZiAoaXNFcnJvcikge1xuXHRcdGVycm9yLm9yaWdpbmFsTWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG5cdFx0ZXJyb3IubWVzc2FnZSA9IG1lc3NhZ2U7XG5cdH0gZWxzZSB7XG5cdFx0ZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG5cdH1cblxuXHRlcnJvci5zaG9ydE1lc3NhZ2UgPSBzaG9ydE1lc3NhZ2U7XG5cdGVycm9yLmNvbW1hbmQgPSBjb21tYW5kO1xuXHRlcnJvci5lc2NhcGVkQ29tbWFuZCA9IGVzY2FwZWRDb21tYW5kO1xuXHRlcnJvci5leGl0Q29kZSA9IGV4aXRDb2RlO1xuXHRlcnJvci5zaWduYWwgPSBzaWduYWw7XG5cdGVycm9yLnNpZ25hbERlc2NyaXB0aW9uID0gc2lnbmFsRGVzY3JpcHRpb247XG5cdGVycm9yLnN0ZG91dCA9IHN0ZG91dDtcblx0ZXJyb3Iuc3RkZXJyID0gc3RkZXJyO1xuXHRlcnJvci5jd2QgPSBjd2Q7XG5cblx0aWYgKGFsbCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0ZXJyb3IuYWxsID0gYWxsO1xuXHR9XG5cblx0aWYgKCdidWZmZXJlZERhdGEnIGluIGVycm9yKSB7XG5cdFx0ZGVsZXRlIGVycm9yLmJ1ZmZlcmVkRGF0YTtcblx0fVxuXG5cdGVycm9yLmZhaWxlZCA9IHRydWU7XG5cdGVycm9yLnRpbWVkT3V0ID0gQm9vbGVhbih0aW1lZE91dCk7XG5cdGVycm9yLmlzQ2FuY2VsZWQgPSBpc0NhbmNlbGVkO1xuXHRlcnJvci5raWxsZWQgPSBraWxsZWQgJiYgIXRpbWVkT3V0O1xuXG5cdHJldHVybiBlcnJvcjtcbn07XG4iLCAiaW1wb3J0e2NvbnN0YW50c31mcm9tXCJub2RlOm9zXCI7XG5cbmltcG9ydHtTSUdSVE1BWH1mcm9tXCIuL3JlYWx0aW1lLmpzXCI7XG5pbXBvcnR7Z2V0U2lnbmFsc31mcm9tXCIuL3NpZ25hbHMuanNcIjtcblxuXG5cbmNvbnN0IGdldFNpZ25hbHNCeU5hbWU9KCk9PntcbmNvbnN0IHNpZ25hbHM9Z2V0U2lnbmFscygpO1xucmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhzaWduYWxzLm1hcChnZXRTaWduYWxCeU5hbWUpKTtcbn07XG5cbmNvbnN0IGdldFNpZ25hbEJ5TmFtZT0oe1xubmFtZSxcbm51bWJlcixcbmRlc2NyaXB0aW9uLFxuc3VwcG9ydGVkLFxuYWN0aW9uLFxuZm9yY2VkLFxuc3RhbmRhcmRcbn0pPT5bbmFtZSx7bmFtZSxudW1iZXIsZGVzY3JpcHRpb24sc3VwcG9ydGVkLGFjdGlvbixmb3JjZWQsc3RhbmRhcmR9XTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbHNCeU5hbWU9Z2V0U2lnbmFsc0J5TmFtZSgpO1xuXG5cblxuXG5jb25zdCBnZXRTaWduYWxzQnlOdW1iZXI9KCk9PntcbmNvbnN0IHNpZ25hbHM9Z2V0U2lnbmFscygpO1xuY29uc3QgbGVuZ3RoPVNJR1JUTUFYKzE7XG5jb25zdCBzaWduYWxzQT1BcnJheS5mcm9tKHtsZW5ndGh9LCh2YWx1ZSxudW1iZXIpPT5cbmdldFNpZ25hbEJ5TnVtYmVyKG51bWJlcixzaWduYWxzKSk7XG5cbnJldHVybiBPYmplY3QuYXNzaWduKHt9LC4uLnNpZ25hbHNBKTtcbn07XG5cbmNvbnN0IGdldFNpZ25hbEJ5TnVtYmVyPShudW1iZXIsc2lnbmFscyk9PntcbmNvbnN0IHNpZ25hbD1maW5kU2lnbmFsQnlOdW1iZXIobnVtYmVyLHNpZ25hbHMpO1xuXG5pZihzaWduYWw9PT11bmRlZmluZWQpe1xucmV0dXJue307XG59XG5cbmNvbnN0e25hbWUsZGVzY3JpcHRpb24sc3VwcG9ydGVkLGFjdGlvbixmb3JjZWQsc3RhbmRhcmR9PXNpZ25hbDtcbnJldHVybntcbltudW1iZXJdOntcbm5hbWUsXG5udW1iZXIsXG5kZXNjcmlwdGlvbixcbnN1cHBvcnRlZCxcbmFjdGlvbixcbmZvcmNlZCxcbnN0YW5kYXJkXG59XG59O1xufTtcblxuXG5cbmNvbnN0IGZpbmRTaWduYWxCeU51bWJlcj0obnVtYmVyLHNpZ25hbHMpPT57XG5jb25zdCBzaWduYWw9c2lnbmFscy5maW5kKCh7bmFtZX0pPT5jb25zdGFudHMuc2lnbmFsc1tuYW1lXT09PW51bWJlcik7XG5cbmlmKHNpZ25hbCE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gc2lnbmFsO1xufVxuXG5yZXR1cm4gc2lnbmFscy5maW5kKChzaWduYWxBKT0+c2lnbmFsQS5udW1iZXI9PT1udW1iZXIpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbHNCeU51bWJlcj1nZXRTaWduYWxzQnlOdW1iZXIoKTsiLCAiXG5leHBvcnQgY29uc3QgZ2V0UmVhbHRpbWVTaWduYWxzPSgpPT57XG5jb25zdCBsZW5ndGg9U0lHUlRNQVgtU0lHUlRNSU4rMTtcbnJldHVybiBBcnJheS5mcm9tKHtsZW5ndGh9LGdldFJlYWx0aW1lU2lnbmFsKTtcbn07XG5cbmNvbnN0IGdldFJlYWx0aW1lU2lnbmFsPSh2YWx1ZSxpbmRleCk9Pih7XG5uYW1lOmBTSUdSVCR7aW5kZXgrMX1gLFxubnVtYmVyOlNJR1JUTUlOK2luZGV4LFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIkFwcGxpY2F0aW9uLXNwZWNpZmljIHNpZ25hbCAocmVhbHRpbWUpXCIsXG5zdGFuZGFyZDpcInBvc2l4XCJcbn0pO1xuXG5jb25zdCBTSUdSVE1JTj0zNDtcbmV4cG9ydCBjb25zdCBTSUdSVE1BWD02NDsiLCAiaW1wb3J0e2NvbnN0YW50c31mcm9tXCJub2RlOm9zXCI7XG5cbmltcG9ydHtTSUdOQUxTfWZyb21cIi4vY29yZS5qc1wiO1xuaW1wb3J0e2dldFJlYWx0aW1lU2lnbmFsc31mcm9tXCIuL3JlYWx0aW1lLmpzXCI7XG5cblxuXG5leHBvcnQgY29uc3QgZ2V0U2lnbmFscz0oKT0+e1xuY29uc3QgcmVhbHRpbWVTaWduYWxzPWdldFJlYWx0aW1lU2lnbmFscygpO1xuY29uc3Qgc2lnbmFscz1bLi4uU0lHTkFMUywuLi5yZWFsdGltZVNpZ25hbHNdLm1hcChub3JtYWxpemVTaWduYWwpO1xucmV0dXJuIHNpZ25hbHM7XG59O1xuXG5cblxuXG5cblxuXG5jb25zdCBub3JtYWxpemVTaWduYWw9KHtcbm5hbWUsXG5udW1iZXI6ZGVmYXVsdE51bWJlcixcbmRlc2NyaXB0aW9uLFxuYWN0aW9uLFxuZm9yY2VkPWZhbHNlLFxuc3RhbmRhcmRcbn0pPT57XG5jb25zdHtcbnNpZ25hbHM6e1tuYW1lXTpjb25zdGFudFNpZ25hbH1cbn09Y29uc3RhbnRzO1xuY29uc3Qgc3VwcG9ydGVkPWNvbnN0YW50U2lnbmFsIT09dW5kZWZpbmVkO1xuY29uc3QgbnVtYmVyPXN1cHBvcnRlZD9jb25zdGFudFNpZ25hbDpkZWZhdWx0TnVtYmVyO1xucmV0dXJue25hbWUsbnVtYmVyLGRlc2NyaXB0aW9uLHN1cHBvcnRlZCxhY3Rpb24sZm9yY2VkLHN0YW5kYXJkfTtcbn07IiwgIlxuXG5leHBvcnQgY29uc3QgU0lHTkFMUz1bXG57XG5uYW1lOlwiU0lHSFVQXCIsXG5udW1iZXI6MSxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJUZXJtaW5hbCBjbG9zZWRcIixcbnN0YW5kYXJkOlwicG9zaXhcIlxufSxcbntcbm5hbWU6XCJTSUdJTlRcIixcbm51bWJlcjoyLFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIlVzZXIgaW50ZXJydXB0aW9uIHdpdGggQ1RSTC1DXCIsXG5zdGFuZGFyZDpcImFuc2lcIlxufSxcbntcbm5hbWU6XCJTSUdRVUlUXCIsXG5udW1iZXI6MyxcbmFjdGlvbjpcImNvcmVcIixcbmRlc2NyaXB0aW9uOlwiVXNlciBpbnRlcnJ1cHRpb24gd2l0aCBDVFJMLVxcXFxcIixcbnN0YW5kYXJkOlwicG9zaXhcIlxufSxcbntcbm5hbWU6XCJTSUdJTExcIixcbm51bWJlcjo0LFxuYWN0aW9uOlwiY29yZVwiLFxuZGVzY3JpcHRpb246XCJJbnZhbGlkIG1hY2hpbmUgaW5zdHJ1Y3Rpb25cIixcbnN0YW5kYXJkOlwiYW5zaVwiXG59LFxue1xubmFtZTpcIlNJR1RSQVBcIixcbm51bWJlcjo1LFxuYWN0aW9uOlwiY29yZVwiLFxuZGVzY3JpcHRpb246XCJEZWJ1Z2dlciBicmVha3BvaW50XCIsXG5zdGFuZGFyZDpcInBvc2l4XCJcbn0sXG57XG5uYW1lOlwiU0lHQUJSVFwiLFxubnVtYmVyOjYsXG5hY3Rpb246XCJjb3JlXCIsXG5kZXNjcmlwdGlvbjpcIkFib3J0ZWRcIixcbnN0YW5kYXJkOlwiYW5zaVwiXG59LFxue1xubmFtZTpcIlNJR0lPVFwiLFxubnVtYmVyOjYsXG5hY3Rpb246XCJjb3JlXCIsXG5kZXNjcmlwdGlvbjpcIkFib3J0ZWRcIixcbnN0YW5kYXJkOlwiYnNkXCJcbn0sXG57XG5uYW1lOlwiU0lHQlVTXCIsXG5udW1iZXI6NyxcbmFjdGlvbjpcImNvcmVcIixcbmRlc2NyaXB0aW9uOlxuXCJCdXMgZXJyb3IgZHVlIHRvIG1pc2FsaWduZWQsIG5vbi1leGlzdGluZyBhZGRyZXNzIG9yIHBhZ2luZyBlcnJvclwiLFxuc3RhbmRhcmQ6XCJic2RcIlxufSxcbntcbm5hbWU6XCJTSUdFTVRcIixcbm51bWJlcjo3LFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIkNvbW1hbmQgc2hvdWxkIGJlIGVtdWxhdGVkIGJ1dCBpcyBub3QgaW1wbGVtZW50ZWRcIixcbnN0YW5kYXJkOlwib3RoZXJcIlxufSxcbntcbm5hbWU6XCJTSUdGUEVcIixcbm51bWJlcjo4LFxuYWN0aW9uOlwiY29yZVwiLFxuZGVzY3JpcHRpb246XCJGbG9hdGluZyBwb2ludCBhcml0aG1ldGljIGVycm9yXCIsXG5zdGFuZGFyZDpcImFuc2lcIlxufSxcbntcbm5hbWU6XCJTSUdLSUxMXCIsXG5udW1iZXI6OSxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJGb3JjZWQgdGVybWluYXRpb25cIixcbnN0YW5kYXJkOlwicG9zaXhcIixcbmZvcmNlZDp0cnVlXG59LFxue1xubmFtZTpcIlNJR1VTUjFcIixcbm51bWJlcjoxMCxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJBcHBsaWNhdGlvbi1zcGVjaWZpYyBzaWduYWxcIixcbnN0YW5kYXJkOlwicG9zaXhcIlxufSxcbntcbm5hbWU6XCJTSUdTRUdWXCIsXG5udW1iZXI6MTEsXG5hY3Rpb246XCJjb3JlXCIsXG5kZXNjcmlwdGlvbjpcIlNlZ21lbnRhdGlvbiBmYXVsdFwiLFxuc3RhbmRhcmQ6XCJhbnNpXCJcbn0sXG57XG5uYW1lOlwiU0lHVVNSMlwiLFxubnVtYmVyOjEyLFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIkFwcGxpY2F0aW9uLXNwZWNpZmljIHNpZ25hbFwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwiXG59LFxue1xubmFtZTpcIlNJR1BJUEVcIixcbm51bWJlcjoxMyxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJCcm9rZW4gcGlwZSBvciBzb2NrZXRcIixcbnN0YW5kYXJkOlwicG9zaXhcIlxufSxcbntcbm5hbWU6XCJTSUdBTFJNXCIsXG5udW1iZXI6MTQsXG5hY3Rpb246XCJ0ZXJtaW5hdGVcIixcbmRlc2NyaXB0aW9uOlwiVGltZW91dCBvciB0aW1lclwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwiXG59LFxue1xubmFtZTpcIlNJR1RFUk1cIixcbm51bWJlcjoxNSxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJUZXJtaW5hdGlvblwiLFxuc3RhbmRhcmQ6XCJhbnNpXCJcbn0sXG57XG5uYW1lOlwiU0lHU1RLRkxUXCIsXG5udW1iZXI6MTYsXG5hY3Rpb246XCJ0ZXJtaW5hdGVcIixcbmRlc2NyaXB0aW9uOlwiU3RhY2sgaXMgZW1wdHkgb3Igb3ZlcmZsb3dlZFwiLFxuc3RhbmRhcmQ6XCJvdGhlclwiXG59LFxue1xubmFtZTpcIlNJR0NITERcIixcbm51bWJlcjoxNyxcbmFjdGlvbjpcImlnbm9yZVwiLFxuZGVzY3JpcHRpb246XCJDaGlsZCBwcm9jZXNzIHRlcm1pbmF0ZWQsIHBhdXNlZCBvciB1bnBhdXNlZFwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwiXG59LFxue1xubmFtZTpcIlNJR0NMRFwiLFxubnVtYmVyOjE3LFxuYWN0aW9uOlwiaWdub3JlXCIsXG5kZXNjcmlwdGlvbjpcIkNoaWxkIHByb2Nlc3MgdGVybWluYXRlZCwgcGF1c2VkIG9yIHVucGF1c2VkXCIsXG5zdGFuZGFyZDpcIm90aGVyXCJcbn0sXG57XG5uYW1lOlwiU0lHQ09OVFwiLFxubnVtYmVyOjE4LFxuYWN0aW9uOlwidW5wYXVzZVwiLFxuZGVzY3JpcHRpb246XCJVbnBhdXNlZFwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwiLFxuZm9yY2VkOnRydWVcbn0sXG57XG5uYW1lOlwiU0lHU1RPUFwiLFxubnVtYmVyOjE5LFxuYWN0aW9uOlwicGF1c2VcIixcbmRlc2NyaXB0aW9uOlwiUGF1c2VkXCIsXG5zdGFuZGFyZDpcInBvc2l4XCIsXG5mb3JjZWQ6dHJ1ZVxufSxcbntcbm5hbWU6XCJTSUdUU1RQXCIsXG5udW1iZXI6MjAsXG5hY3Rpb246XCJwYXVzZVwiLFxuZGVzY3JpcHRpb246XCJQYXVzZWQgdXNpbmcgQ1RSTC1aIG9yIFxcXCJzdXNwZW5kXFxcIlwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwiXG59LFxue1xubmFtZTpcIlNJR1RUSU5cIixcbm51bWJlcjoyMSxcbmFjdGlvbjpcInBhdXNlXCIsXG5kZXNjcmlwdGlvbjpcIkJhY2tncm91bmQgcHJvY2VzcyBjYW5ub3QgcmVhZCB0ZXJtaW5hbCBpbnB1dFwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwiXG59LFxue1xubmFtZTpcIlNJR0JSRUFLXCIsXG5udW1iZXI6MjEsXG5hY3Rpb246XCJ0ZXJtaW5hdGVcIixcbmRlc2NyaXB0aW9uOlwiVXNlciBpbnRlcnJ1cHRpb24gd2l0aCBDVFJMLUJSRUFLXCIsXG5zdGFuZGFyZDpcIm90aGVyXCJcbn0sXG57XG5uYW1lOlwiU0lHVFRPVVwiLFxubnVtYmVyOjIyLFxuYWN0aW9uOlwicGF1c2VcIixcbmRlc2NyaXB0aW9uOlwiQmFja2dyb3VuZCBwcm9jZXNzIGNhbm5vdCB3cml0ZSB0byB0ZXJtaW5hbCBvdXRwdXRcIixcbnN0YW5kYXJkOlwicG9zaXhcIlxufSxcbntcbm5hbWU6XCJTSUdVUkdcIixcbm51bWJlcjoyMyxcbmFjdGlvbjpcImlnbm9yZVwiLFxuZGVzY3JpcHRpb246XCJTb2NrZXQgcmVjZWl2ZWQgb3V0LW9mLWJhbmQgZGF0YVwiLFxuc3RhbmRhcmQ6XCJic2RcIlxufSxcbntcbm5hbWU6XCJTSUdYQ1BVXCIsXG5udW1iZXI6MjQsXG5hY3Rpb246XCJjb3JlXCIsXG5kZXNjcmlwdGlvbjpcIlByb2Nlc3MgdGltZWQgb3V0XCIsXG5zdGFuZGFyZDpcImJzZFwiXG59LFxue1xubmFtZTpcIlNJR1hGU1pcIixcbm51bWJlcjoyNSxcbmFjdGlvbjpcImNvcmVcIixcbmRlc2NyaXB0aW9uOlwiRmlsZSB0b28gYmlnXCIsXG5zdGFuZGFyZDpcImJzZFwiXG59LFxue1xubmFtZTpcIlNJR1ZUQUxSTVwiLFxubnVtYmVyOjI2LFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIlRpbWVvdXQgb3IgdGltZXJcIixcbnN0YW5kYXJkOlwiYnNkXCJcbn0sXG57XG5uYW1lOlwiU0lHUFJPRlwiLFxubnVtYmVyOjI3LFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIlRpbWVvdXQgb3IgdGltZXJcIixcbnN0YW5kYXJkOlwiYnNkXCJcbn0sXG57XG5uYW1lOlwiU0lHV0lOQ0hcIixcbm51bWJlcjoyOCxcbmFjdGlvbjpcImlnbm9yZVwiLFxuZGVzY3JpcHRpb246XCJUZXJtaW5hbCB3aW5kb3cgc2l6ZSBjaGFuZ2VkXCIsXG5zdGFuZGFyZDpcImJzZFwiXG59LFxue1xubmFtZTpcIlNJR0lPXCIsXG5udW1iZXI6MjksXG5hY3Rpb246XCJ0ZXJtaW5hdGVcIixcbmRlc2NyaXB0aW9uOlwiSS9PIGlzIGF2YWlsYWJsZVwiLFxuc3RhbmRhcmQ6XCJvdGhlclwiXG59LFxue1xubmFtZTpcIlNJR1BPTExcIixcbm51bWJlcjoyOSxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJXYXRjaGVkIGV2ZW50XCIsXG5zdGFuZGFyZDpcIm90aGVyXCJcbn0sXG57XG5uYW1lOlwiU0lHSU5GT1wiLFxubnVtYmVyOjI5LFxuYWN0aW9uOlwiaWdub3JlXCIsXG5kZXNjcmlwdGlvbjpcIlJlcXVlc3QgZm9yIHByb2Nlc3MgaW5mb3JtYXRpb25cIixcbnN0YW5kYXJkOlwib3RoZXJcIlxufSxcbntcbm5hbWU6XCJTSUdQV1JcIixcbm51bWJlcjozMCxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJEZXZpY2UgcnVubmluZyBvdXQgb2YgcG93ZXJcIixcbnN0YW5kYXJkOlwic3lzdGVtdlwiXG59LFxue1xubmFtZTpcIlNJR1NZU1wiLFxubnVtYmVyOjMxLFxuYWN0aW9uOlwiY29yZVwiLFxuZGVzY3JpcHRpb246XCJJbnZhbGlkIHN5c3RlbSBjYWxsXCIsXG5zdGFuZGFyZDpcIm90aGVyXCJcbn0sXG57XG5uYW1lOlwiU0lHVU5VU0VEXCIsXG5udW1iZXI6MzEsXG5hY3Rpb246XCJ0ZXJtaW5hdGVcIixcbmRlc2NyaXB0aW9uOlwiSW52YWxpZCBzeXN0ZW0gY2FsbFwiLFxuc3RhbmRhcmQ6XCJvdGhlclwiXG59XTsiLCAiY29uc3QgYWxpYXNlcyA9IFsnc3RkaW4nLCAnc3Rkb3V0JywgJ3N0ZGVyciddO1xuXG5jb25zdCBoYXNBbGlhcyA9IG9wdGlvbnMgPT4gYWxpYXNlcy5zb21lKGFsaWFzID0+IG9wdGlvbnNbYWxpYXNdICE9PSB1bmRlZmluZWQpO1xuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplU3RkaW8gPSBvcHRpb25zID0+IHtcblx0aWYgKCFvcHRpb25zKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3Qge3N0ZGlvfSA9IG9wdGlvbnM7XG5cblx0aWYgKHN0ZGlvID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gYWxpYXNlcy5tYXAoYWxpYXMgPT4gb3B0aW9uc1thbGlhc10pO1xuXHR9XG5cblx0aWYgKGhhc0FsaWFzKG9wdGlvbnMpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBJdCdzIG5vdCBwb3NzaWJsZSB0byBwcm92aWRlIFxcYHN0ZGlvXFxgIGluIGNvbWJpbmF0aW9uIHdpdGggb25lIG9mICR7YWxpYXNlcy5tYXAoYWxpYXMgPT4gYFxcYCR7YWxpYXN9XFxgYCkuam9pbignLCAnKX1gKTtcblx0fVxuXG5cdGlmICh0eXBlb2Ygc3RkaW8gPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIHN0ZGlvO1xuXHR9XG5cblx0aWYgKCFBcnJheS5pc0FycmF5KHN0ZGlvKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYHN0ZGlvXFxgIHRvIGJlIG9mIHR5cGUgXFxgc3RyaW5nXFxgIG9yIFxcYEFycmF5XFxgLCBnb3QgXFxgJHt0eXBlb2Ygc3RkaW99XFxgYCk7XG5cdH1cblxuXHRjb25zdCBsZW5ndGggPSBNYXRoLm1heChzdGRpby5sZW5ndGgsIGFsaWFzZXMubGVuZ3RoKTtcblx0cmV0dXJuIEFycmF5LmZyb20oe2xlbmd0aH0sICh2YWx1ZSwgaW5kZXgpID0+IHN0ZGlvW2luZGV4XSk7XG59O1xuXG4vLyBgaXBjYCBpcyBwdXNoZWQgdW5sZXNzIGl0IGlzIGFscmVhZHkgcHJlc2VudFxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVN0ZGlvTm9kZSA9IG9wdGlvbnMgPT4ge1xuXHRjb25zdCBzdGRpbyA9IG5vcm1hbGl6ZVN0ZGlvKG9wdGlvbnMpO1xuXG5cdGlmIChzdGRpbyA9PT0gJ2lwYycpIHtcblx0XHRyZXR1cm4gJ2lwYyc7XG5cdH1cblxuXHRpZiAoc3RkaW8gPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Ygc3RkaW8gPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIFtzdGRpbywgc3RkaW8sIHN0ZGlvLCAnaXBjJ107XG5cdH1cblxuXHRpZiAoc3RkaW8uaW5jbHVkZXMoJ2lwYycpKSB7XG5cdFx0cmV0dXJuIHN0ZGlvO1xuXHR9XG5cblx0cmV0dXJuIFsuLi5zdGRpbywgJ2lwYyddO1xufTtcbiIsICJpbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgb25FeGl0IGZyb20gJ3NpZ25hbC1leGl0JztcblxuY29uc3QgREVGQVVMVF9GT1JDRV9LSUxMX1RJTUVPVVQgPSAxMDAwICogNTtcblxuLy8gTW9ua2V5LXBhdGNoZXMgYGNoaWxkUHJvY2Vzcy5raWxsKClgIHRvIGFkZCBgZm9yY2VLaWxsQWZ0ZXJUaW1lb3V0YCBiZWhhdmlvclxuZXhwb3J0IGNvbnN0IHNwYXduZWRLaWxsID0gKGtpbGwsIHNpZ25hbCA9ICdTSUdURVJNJywgb3B0aW9ucyA9IHt9KSA9PiB7XG5cdGNvbnN0IGtpbGxSZXN1bHQgPSBraWxsKHNpZ25hbCk7XG5cdHNldEtpbGxUaW1lb3V0KGtpbGwsIHNpZ25hbCwgb3B0aW9ucywga2lsbFJlc3VsdCk7XG5cdHJldHVybiBraWxsUmVzdWx0O1xufTtcblxuY29uc3Qgc2V0S2lsbFRpbWVvdXQgPSAoa2lsbCwgc2lnbmFsLCBvcHRpb25zLCBraWxsUmVzdWx0KSA9PiB7XG5cdGlmICghc2hvdWxkRm9yY2VLaWxsKHNpZ25hbCwgb3B0aW9ucywga2lsbFJlc3VsdCkpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCB0aW1lb3V0ID0gZ2V0Rm9yY2VLaWxsQWZ0ZXJUaW1lb3V0KG9wdGlvbnMpO1xuXHRjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0a2lsbCgnU0lHS0lMTCcpO1xuXHR9LCB0aW1lb3V0KTtcblxuXHQvLyBHdWFyZGVkIGJlY2F1c2UgdGhlcmUncyBubyBgLnVucmVmKClgIHdoZW4gYGV4ZWNhYCBpcyB1c2VkIGluIHRoZSByZW5kZXJlclxuXHQvLyBwcm9jZXNzIGluIEVsZWN0cm9uLiBUaGlzIGNhbm5vdCBiZSB0ZXN0ZWQgc2luY2Ugd2UgZG9uJ3QgcnVuIHRlc3RzIGluXG5cdC8vIEVsZWN0cm9uLlxuXHQvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuXHRpZiAodC51bnJlZikge1xuXHRcdHQudW5yZWYoKTtcblx0fVxufTtcblxuY29uc3Qgc2hvdWxkRm9yY2VLaWxsID0gKHNpZ25hbCwge2ZvcmNlS2lsbEFmdGVyVGltZW91dH0sIGtpbGxSZXN1bHQpID0+IGlzU2lndGVybShzaWduYWwpICYmIGZvcmNlS2lsbEFmdGVyVGltZW91dCAhPT0gZmFsc2UgJiYga2lsbFJlc3VsdDtcblxuY29uc3QgaXNTaWd0ZXJtID0gc2lnbmFsID0+IHNpZ25hbCA9PT0gb3MuY29uc3RhbnRzLnNpZ25hbHMuU0lHVEVSTVxuXHRcdHx8ICh0eXBlb2Ygc2lnbmFsID09PSAnc3RyaW5nJyAmJiBzaWduYWwudG9VcHBlckNhc2UoKSA9PT0gJ1NJR1RFUk0nKTtcblxuY29uc3QgZ2V0Rm9yY2VLaWxsQWZ0ZXJUaW1lb3V0ID0gKHtmb3JjZUtpbGxBZnRlclRpbWVvdXQgPSB0cnVlfSkgPT4ge1xuXHRpZiAoZm9yY2VLaWxsQWZ0ZXJUaW1lb3V0ID09PSB0cnVlKSB7XG5cdFx0cmV0dXJuIERFRkFVTFRfRk9SQ0VfS0lMTF9USU1FT1VUO1xuXHR9XG5cblx0aWYgKCFOdW1iZXIuaXNGaW5pdGUoZm9yY2VLaWxsQWZ0ZXJUaW1lb3V0KSB8fCBmb3JjZUtpbGxBZnRlclRpbWVvdXQgPCAwKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgdGhlIFxcYGZvcmNlS2lsbEFmdGVyVGltZW91dFxcYCBvcHRpb24gdG8gYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290IFxcYCR7Zm9yY2VLaWxsQWZ0ZXJUaW1lb3V0fVxcYCAoJHt0eXBlb2YgZm9yY2VLaWxsQWZ0ZXJUaW1lb3V0fSlgKTtcblx0fVxuXG5cdHJldHVybiBmb3JjZUtpbGxBZnRlclRpbWVvdXQ7XG59O1xuXG4vLyBgY2hpbGRQcm9jZXNzLmNhbmNlbCgpYFxuZXhwb3J0IGNvbnN0IHNwYXduZWRDYW5jZWwgPSAoc3Bhd25lZCwgY29udGV4dCkgPT4ge1xuXHRjb25zdCBraWxsUmVzdWx0ID0gc3Bhd25lZC5raWxsKCk7XG5cblx0aWYgKGtpbGxSZXN1bHQpIHtcblx0XHRjb250ZXh0LmlzQ2FuY2VsZWQgPSB0cnVlO1xuXHR9XG59O1xuXG5jb25zdCB0aW1lb3V0S2lsbCA9IChzcGF3bmVkLCBzaWduYWwsIHJlamVjdCkgPT4ge1xuXHRzcGF3bmVkLmtpbGwoc2lnbmFsKTtcblx0cmVqZWN0KE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCdUaW1lZCBvdXQnKSwge3RpbWVkT3V0OiB0cnVlLCBzaWduYWx9KSk7XG59O1xuXG4vLyBgdGltZW91dGAgb3B0aW9uIGhhbmRsaW5nXG5leHBvcnQgY29uc3Qgc2V0dXBUaW1lb3V0ID0gKHNwYXduZWQsIHt0aW1lb3V0LCBraWxsU2lnbmFsID0gJ1NJR1RFUk0nfSwgc3Bhd25lZFByb21pc2UpID0+IHtcblx0aWYgKHRpbWVvdXQgPT09IDAgfHwgdGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHNwYXduZWRQcm9taXNlO1xuXHR9XG5cblx0bGV0IHRpbWVvdXRJZDtcblx0Y29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0dGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0aW1lb3V0S2lsbChzcGF3bmVkLCBraWxsU2lnbmFsLCByZWplY3QpO1xuXHRcdH0sIHRpbWVvdXQpO1xuXHR9KTtcblxuXHRjb25zdCBzYWZlU3Bhd25lZFByb21pc2UgPSBzcGF3bmVkUHJvbWlzZS5maW5hbGx5KCgpID0+IHtcblx0XHRjbGVhclRpbWVvdXQodGltZW91dElkKTtcblx0fSk7XG5cblx0cmV0dXJuIFByb21pc2UucmFjZShbdGltZW91dFByb21pc2UsIHNhZmVTcGF3bmVkUHJvbWlzZV0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVGltZW91dCA9ICh7dGltZW91dH0pID0+IHtcblx0aWYgKHRpbWVvdXQgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0Zpbml0ZSh0aW1lb3V0KSB8fCB0aW1lb3V0IDwgMCkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCB0aGUgXFxgdGltZW91dFxcYCBvcHRpb24gdG8gYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290IFxcYCR7dGltZW91dH1cXGAgKCR7dHlwZW9mIHRpbWVvdXR9KWApO1xuXHR9XG59O1xuXG4vLyBgY2xlYW51cGAgb3B0aW9uIGhhbmRsaW5nXG5leHBvcnQgY29uc3Qgc2V0RXhpdEhhbmRsZXIgPSBhc3luYyAoc3Bhd25lZCwge2NsZWFudXAsIGRldGFjaGVkfSwgdGltZWRQcm9taXNlKSA9PiB7XG5cdGlmICghY2xlYW51cCB8fCBkZXRhY2hlZCkge1xuXHRcdHJldHVybiB0aW1lZFByb21pc2U7XG5cdH1cblxuXHRjb25zdCByZW1vdmVFeGl0SGFuZGxlciA9IG9uRXhpdCgoKSA9PiB7XG5cdFx0c3Bhd25lZC5raWxsKCk7XG5cdH0pO1xuXG5cdHJldHVybiB0aW1lZFByb21pc2UuZmluYWxseSgoKSA9PiB7XG5cdFx0cmVtb3ZlRXhpdEhhbmRsZXIoKTtcblx0fSk7XG59O1xuIiwgImltcG9ydCB7Y3JlYXRlV3JpdGVTdHJlYW19IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtDaGlsZFByb2Nlc3N9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge2lzV3JpdGFibGVTdHJlYW19IGZyb20gJ2lzLXN0cmVhbSc7XG5cbmNvbnN0IGlzRXhlY2FDaGlsZFByb2Nlc3MgPSB0YXJnZXQgPT4gdGFyZ2V0IGluc3RhbmNlb2YgQ2hpbGRQcm9jZXNzICYmIHR5cGVvZiB0YXJnZXQudGhlbiA9PT0gJ2Z1bmN0aW9uJztcblxuY29uc3QgcGlwZVRvVGFyZ2V0ID0gKHNwYXduZWQsIHN0cmVhbU5hbWUsIHRhcmdldCkgPT4ge1xuXHRpZiAodHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycpIHtcblx0XHRzcGF3bmVkW3N0cmVhbU5hbWVdLnBpcGUoY3JlYXRlV3JpdGVTdHJlYW0odGFyZ2V0KSk7XG5cdFx0cmV0dXJuIHNwYXduZWQ7XG5cdH1cblxuXHRpZiAoaXNXcml0YWJsZVN0cmVhbSh0YXJnZXQpKSB7XG5cdFx0c3Bhd25lZFtzdHJlYW1OYW1lXS5waXBlKHRhcmdldCk7XG5cdFx0cmV0dXJuIHNwYXduZWQ7XG5cdH1cblxuXHRpZiAoIWlzRXhlY2FDaGlsZFByb2Nlc3ModGFyZ2V0KSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgYSBzdHJlYW0gb3IgYW4gRXhlY2EgY2hpbGQgcHJvY2Vzcy4nKTtcblx0fVxuXG5cdGlmICghaXNXcml0YWJsZVN0cmVhbSh0YXJnZXQuc3RkaW4pKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHRhcmdldCBjaGlsZCBwcm9jZXNzXFwncyBzdGRpbiBtdXN0IGJlIGF2YWlsYWJsZS4nKTtcblx0fVxuXG5cdHNwYXduZWRbc3RyZWFtTmFtZV0ucGlwZSh0YXJnZXQuc3RkaW4pO1xuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFBpcGVNZXRob2RzID0gc3Bhd25lZCA9PiB7XG5cdGlmIChzcGF3bmVkLnN0ZG91dCAhPT0gbnVsbCkge1xuXHRcdHNwYXduZWQucGlwZVN0ZG91dCA9IHBpcGVUb1RhcmdldC5iaW5kKHVuZGVmaW5lZCwgc3Bhd25lZCwgJ3N0ZG91dCcpO1xuXHR9XG5cblx0aWYgKHNwYXduZWQuc3RkZXJyICE9PSBudWxsKSB7XG5cdFx0c3Bhd25lZC5waXBlU3RkZXJyID0gcGlwZVRvVGFyZ2V0LmJpbmQodW5kZWZpbmVkLCBzcGF3bmVkLCAnc3RkZXJyJyk7XG5cdH1cblxuXHRpZiAoc3Bhd25lZC5hbGwgIT09IHVuZGVmaW5lZCkge1xuXHRcdHNwYXduZWQucGlwZUFsbCA9IHBpcGVUb1RhcmdldC5iaW5kKHVuZGVmaW5lZCwgc3Bhd25lZCwgJ2FsbCcpO1xuXHR9XG59O1xuIiwgImV4cG9ydCBmdW5jdGlvbiBpc1N0cmVhbShzdHJlYW0pIHtcblx0cmV0dXJuIHN0cmVhbSAhPT0gbnVsbFxuXHRcdCYmIHR5cGVvZiBzdHJlYW0gPT09ICdvYmplY3QnXG5cdFx0JiYgdHlwZW9mIHN0cmVhbS5waXBlID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXcml0YWJsZVN0cmVhbShzdHJlYW0pIHtcblx0cmV0dXJuIGlzU3RyZWFtKHN0cmVhbSlcblx0XHQmJiBzdHJlYW0ud3JpdGFibGUgIT09IGZhbHNlXG5cdFx0JiYgdHlwZW9mIHN0cmVhbS5fd3JpdGUgPT09ICdmdW5jdGlvbidcblx0XHQmJiB0eXBlb2Ygc3RyZWFtLl93cml0YWJsZVN0YXRlID09PSAnb2JqZWN0Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZGFibGVTdHJlYW0oc3RyZWFtKSB7XG5cdHJldHVybiBpc1N0cmVhbShzdHJlYW0pXG5cdFx0JiYgc3RyZWFtLnJlYWRhYmxlICE9PSBmYWxzZVxuXHRcdCYmIHR5cGVvZiBzdHJlYW0uX3JlYWQgPT09ICdmdW5jdGlvbidcblx0XHQmJiB0eXBlb2Ygc3RyZWFtLl9yZWFkYWJsZVN0YXRlID09PSAnb2JqZWN0Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRHVwbGV4U3RyZWFtKHN0cmVhbSkge1xuXHRyZXR1cm4gaXNXcml0YWJsZVN0cmVhbShzdHJlYW0pXG5cdFx0JiYgaXNSZWFkYWJsZVN0cmVhbShzdHJlYW0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUcmFuc2Zvcm1TdHJlYW0oc3RyZWFtKSB7XG5cdHJldHVybiBpc0R1cGxleFN0cmVhbShzdHJlYW0pXG5cdFx0JiYgdHlwZW9mIHN0cmVhbS5fdHJhbnNmb3JtID09PSAnZnVuY3Rpb24nO1xufVxuIiwgImltcG9ydCB7Y3JlYXRlUmVhZFN0cmVhbSwgcmVhZEZpbGVTeW5jfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7aXNTdHJlYW19IGZyb20gJ2lzLXN0cmVhbSc7XG5pbXBvcnQgZ2V0U3RyZWFtIGZyb20gJ2dldC1zdHJlYW0nO1xuaW1wb3J0IG1lcmdlU3RyZWFtIGZyb20gJ21lcmdlLXN0cmVhbSc7XG5cbmNvbnN0IHZhbGlkYXRlSW5wdXRPcHRpb25zID0gaW5wdXQgPT4ge1xuXHRpZiAoaW5wdXQgIT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBgaW5wdXRgIGFuZCBgaW5wdXRGaWxlYCBvcHRpb25zIGNhbm5vdCBiZSBib3RoIHNldC4nKTtcblx0fVxufTtcblxuY29uc3QgZ2V0SW5wdXRTeW5jID0gKHtpbnB1dCwgaW5wdXRGaWxlfSkgPT4ge1xuXHRpZiAodHlwZW9mIGlucHV0RmlsZSAhPT0gJ3N0cmluZycpIHtcblx0XHRyZXR1cm4gaW5wdXQ7XG5cdH1cblxuXHR2YWxpZGF0ZUlucHV0T3B0aW9ucyhpbnB1dCk7XG5cdHJldHVybiByZWFkRmlsZVN5bmMoaW5wdXRGaWxlKTtcbn07XG5cbi8vIGBpbnB1dGAgYW5kIGBpbnB1dEZpbGVgIG9wdGlvbiBpbiBzeW5jIG1vZGVcbmV4cG9ydCBjb25zdCBoYW5kbGVJbnB1dFN5bmMgPSBvcHRpb25zID0+IHtcblx0Y29uc3QgaW5wdXQgPSBnZXRJbnB1dFN5bmMob3B0aW9ucyk7XG5cblx0aWYgKGlzU3RyZWFtKGlucHV0KSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBgaW5wdXRgIG9wdGlvbiBjYW5ub3QgYmUgYSBzdHJlYW0gaW4gc3luYyBtb2RlJyk7XG5cdH1cblxuXHRyZXR1cm4gaW5wdXQ7XG59O1xuXG5jb25zdCBnZXRJbnB1dCA9ICh7aW5wdXQsIGlucHV0RmlsZX0pID0+IHtcblx0aWYgKHR5cGVvZiBpbnB1dEZpbGUgIT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIGlucHV0O1xuXHR9XG5cblx0dmFsaWRhdGVJbnB1dE9wdGlvbnMoaW5wdXQpO1xuXHRyZXR1cm4gY3JlYXRlUmVhZFN0cmVhbShpbnB1dEZpbGUpO1xufTtcblxuLy8gYGlucHV0YCBhbmQgYGlucHV0RmlsZWAgb3B0aW9uIGluIGFzeW5jIG1vZGVcbmV4cG9ydCBjb25zdCBoYW5kbGVJbnB1dCA9IChzcGF3bmVkLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IGlucHV0ID0gZ2V0SW5wdXQob3B0aW9ucyk7XG5cblx0aWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZiAoaXNTdHJlYW0oaW5wdXQpKSB7XG5cdFx0aW5wdXQucGlwZShzcGF3bmVkLnN0ZGluKTtcblx0fSBlbHNlIHtcblx0XHRzcGF3bmVkLnN0ZGluLmVuZChpbnB1dCk7XG5cdH1cbn07XG5cbi8vIGBhbGxgIGludGVybGVhdmVzIGBzdGRvdXRgIGFuZCBgc3RkZXJyYFxuZXhwb3J0IGNvbnN0IG1ha2VBbGxTdHJlYW0gPSAoc3Bhd25lZCwge2FsbH0pID0+IHtcblx0aWYgKCFhbGwgfHwgKCFzcGF3bmVkLnN0ZG91dCAmJiAhc3Bhd25lZC5zdGRlcnIpKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgbWl4ZWQgPSBtZXJnZVN0cmVhbSgpO1xuXG5cdGlmIChzcGF3bmVkLnN0ZG91dCkge1xuXHRcdG1peGVkLmFkZChzcGF3bmVkLnN0ZG91dCk7XG5cdH1cblxuXHRpZiAoc3Bhd25lZC5zdGRlcnIpIHtcblx0XHRtaXhlZC5hZGQoc3Bhd25lZC5zdGRlcnIpO1xuXHR9XG5cblx0cmV0dXJuIG1peGVkO1xufTtcblxuLy8gT24gZmFpbHVyZSwgYHJlc3VsdC5zdGRvdXR8c3RkZXJyfGFsbGAgc2hvdWxkIGNvbnRhaW4gdGhlIGN1cnJlbnRseSBidWZmZXJlZCBzdHJlYW1cbmNvbnN0IGdldEJ1ZmZlcmVkRGF0YSA9IGFzeW5jIChzdHJlYW0sIHN0cmVhbVByb21pc2UpID0+IHtcblx0Ly8gV2hlbiBgYnVmZmVyYCBpcyBgZmFsc2VgLCBgc3RyZWFtUHJvbWlzZWAgaXMgYHVuZGVmaW5lZGAgYW5kIHRoZXJlIGlzIG5vIGJ1ZmZlcmVkIGRhdGEgdG8gcmV0cmlldmVcblx0aWYgKCFzdHJlYW0gfHwgc3RyZWFtUHJvbWlzZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0c3RyZWFtLmRlc3Ryb3koKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiBhd2FpdCBzdHJlYW1Qcm9taXNlO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdHJldHVybiBlcnJvci5idWZmZXJlZERhdGE7XG5cdH1cbn07XG5cbmNvbnN0IGdldFN0cmVhbVByb21pc2UgPSAoc3RyZWFtLCB7ZW5jb2RpbmcsIGJ1ZmZlciwgbWF4QnVmZmVyfSkgPT4ge1xuXHRpZiAoIXN0cmVhbSB8fCAhYnVmZmVyKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKGVuY29kaW5nKSB7XG5cdFx0cmV0dXJuIGdldFN0cmVhbShzdHJlYW0sIHtlbmNvZGluZywgbWF4QnVmZmVyfSk7XG5cdH1cblxuXHRyZXR1cm4gZ2V0U3RyZWFtLmJ1ZmZlcihzdHJlYW0sIHttYXhCdWZmZXJ9KTtcbn07XG5cbi8vIFJldHJpZXZlIHJlc3VsdCBvZiBjaGlsZCBwcm9jZXNzOiBleGl0IGNvZGUsIHNpZ25hbCwgZXJyb3IsIHN0cmVhbXMgKHN0ZG91dC9zdGRlcnIvYWxsKVxuZXhwb3J0IGNvbnN0IGdldFNwYXduZWRSZXN1bHQgPSBhc3luYyAoe3N0ZG91dCwgc3RkZXJyLCBhbGx9LCB7ZW5jb2RpbmcsIGJ1ZmZlciwgbWF4QnVmZmVyfSwgcHJvY2Vzc0RvbmUpID0+IHtcblx0Y29uc3Qgc3Rkb3V0UHJvbWlzZSA9IGdldFN0cmVhbVByb21pc2Uoc3Rkb3V0LCB7ZW5jb2RpbmcsIGJ1ZmZlciwgbWF4QnVmZmVyfSk7XG5cdGNvbnN0IHN0ZGVyclByb21pc2UgPSBnZXRTdHJlYW1Qcm9taXNlKHN0ZGVyciwge2VuY29kaW5nLCBidWZmZXIsIG1heEJ1ZmZlcn0pO1xuXHRjb25zdCBhbGxQcm9taXNlID0gZ2V0U3RyZWFtUHJvbWlzZShhbGwsIHtlbmNvZGluZywgYnVmZmVyLCBtYXhCdWZmZXI6IG1heEJ1ZmZlciAqIDJ9KTtcblxuXHR0cnkge1xuXHRcdHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChbcHJvY2Vzc0RvbmUsIHN0ZG91dFByb21pc2UsIHN0ZGVyclByb21pc2UsIGFsbFByb21pc2VdKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoW1xuXHRcdFx0e2Vycm9yLCBzaWduYWw6IGVycm9yLnNpZ25hbCwgdGltZWRPdXQ6IGVycm9yLnRpbWVkT3V0fSxcblx0XHRcdGdldEJ1ZmZlcmVkRGF0YShzdGRvdXQsIHN0ZG91dFByb21pc2UpLFxuXHRcdFx0Z2V0QnVmZmVyZWREYXRhKHN0ZGVyciwgc3RkZXJyUHJvbWlzZSksXG5cdFx0XHRnZXRCdWZmZXJlZERhdGEoYWxsLCBhbGxQcm9taXNlKSxcblx0XHRdKTtcblx0fVxufTtcbiIsICIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItdG9wLWxldmVsLWF3YWl0XG5jb25zdCBuYXRpdmVQcm9taXNlUHJvdG90eXBlID0gKGFzeW5jICgpID0+IHt9KSgpLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuY29uc3QgZGVzY3JpcHRvcnMgPSBbJ3RoZW4nLCAnY2F0Y2gnLCAnZmluYWxseSddLm1hcChwcm9wZXJ0eSA9PiBbXG5cdHByb3BlcnR5LFxuXHRSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuYXRpdmVQcm9taXNlUHJvdG90eXBlLCBwcm9wZXJ0eSksXG5dKTtcblxuLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBhIG1peGluIG9mIGBjaGlsZFByb2Nlc3NgIGFuZCBgUHJvbWlzZWBcbmV4cG9ydCBjb25zdCBtZXJnZVByb21pc2UgPSAoc3Bhd25lZCwgcHJvbWlzZSkgPT4ge1xuXHRmb3IgKGNvbnN0IFtwcm9wZXJ0eSwgZGVzY3JpcHRvcl0gb2YgZGVzY3JpcHRvcnMpIHtcblx0XHQvLyBTdGFydGluZyB0aGUgbWFpbiBgcHJvbWlzZWAgaXMgZGVmZXJyZWQgdG8gYXZvaWQgY29uc3VtaW5nIHN0cmVhbXNcblx0XHRjb25zdCB2YWx1ZSA9IHR5cGVvZiBwcm9taXNlID09PSAnZnVuY3Rpb24nXG5cdFx0XHQ/ICguLi5hcmdzKSA9PiBSZWZsZWN0LmFwcGx5KGRlc2NyaXB0b3IudmFsdWUsIHByb21pc2UoKSwgYXJncylcblx0XHRcdDogZGVzY3JpcHRvci52YWx1ZS5iaW5kKHByb21pc2UpO1xuXG5cdFx0UmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShzcGF3bmVkLCBwcm9wZXJ0eSwgey4uLmRlc2NyaXB0b3IsIHZhbHVlfSk7XG5cdH1cbn07XG5cbi8vIFVzZSBwcm9taXNlcyBpbnN0ZWFkIG9mIGBjaGlsZF9wcm9jZXNzYCBldmVudHNcbmV4cG9ydCBjb25zdCBnZXRTcGF3bmVkUHJvbWlzZSA9IHNwYXduZWQgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRzcGF3bmVkLm9uKCdleGl0JywgKGV4aXRDb2RlLCBzaWduYWwpID0+IHtcblx0XHRyZXNvbHZlKHtleGl0Q29kZSwgc2lnbmFsfSk7XG5cdH0pO1xuXG5cdHNwYXduZWQub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xuXHRcdHJlamVjdChlcnJvcik7XG5cdH0pO1xuXG5cdGlmIChzcGF3bmVkLnN0ZGluKSB7XG5cdFx0c3Bhd25lZC5zdGRpbi5vbignZXJyb3InLCBlcnJvciA9PiB7XG5cdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdH0pO1xuXHR9XG59KTtcbiIsICJpbXBvcnQge0J1ZmZlcn0gZnJvbSAnbm9kZTpidWZmZXInO1xuaW1wb3J0IHtDaGlsZFByb2Nlc3N9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmNvbnN0IG5vcm1hbGl6ZUFyZ3MgPSAoZmlsZSwgYXJncyA9IFtdKSA9PiB7XG5cdGlmICghQXJyYXkuaXNBcnJheShhcmdzKSkge1xuXHRcdHJldHVybiBbZmlsZV07XG5cdH1cblxuXHRyZXR1cm4gW2ZpbGUsIC4uLmFyZ3NdO1xufTtcblxuY29uc3QgTk9fRVNDQVBFX1JFR0VYUCA9IC9eW1xcdy4tXSskLztcbmNvbnN0IERPVUJMRV9RVU9URVNfUkVHRVhQID0gL1wiL2c7XG5cbmNvbnN0IGVzY2FwZUFyZyA9IGFyZyA9PiB7XG5cdGlmICh0eXBlb2YgYXJnICE9PSAnc3RyaW5nJyB8fCBOT19FU0NBUEVfUkVHRVhQLnRlc3QoYXJnKSkge1xuXHRcdHJldHVybiBhcmc7XG5cdH1cblxuXHRyZXR1cm4gYFwiJHthcmcucmVwbGFjZShET1VCTEVfUVVPVEVTX1JFR0VYUCwgJ1xcXFxcIicpfVwiYDtcbn07XG5cbmV4cG9ydCBjb25zdCBqb2luQ29tbWFuZCA9IChmaWxlLCBhcmdzKSA9PiBub3JtYWxpemVBcmdzKGZpbGUsIGFyZ3MpLmpvaW4oJyAnKTtcblxuZXhwb3J0IGNvbnN0IGdldEVzY2FwZWRDb21tYW5kID0gKGZpbGUsIGFyZ3MpID0+IG5vcm1hbGl6ZUFyZ3MoZmlsZSwgYXJncykubWFwKGFyZyA9PiBlc2NhcGVBcmcoYXJnKSkuam9pbignICcpO1xuXG5jb25zdCBTUEFDRVNfUkVHRVhQID0gLyArL2c7XG5cbi8vIEhhbmRsZSBgZXhlY2FDb21tYW5kKClgXG5leHBvcnQgY29uc3QgcGFyc2VDb21tYW5kID0gY29tbWFuZCA9PiB7XG5cdGNvbnN0IHRva2VucyA9IFtdO1xuXHRmb3IgKGNvbnN0IHRva2VuIG9mIGNvbW1hbmQudHJpbSgpLnNwbGl0KFNQQUNFU19SRUdFWFApKSB7XG5cdFx0Ly8gQWxsb3cgc3BhY2VzIHRvIGJlIGVzY2FwZWQgYnkgYSBiYWNrc2xhc2ggaWYgbm90IG1lYW50IGFzIGEgZGVsaW1pdGVyXG5cdFx0Y29uc3QgcHJldmlvdXNUb2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG5cdFx0aWYgKHByZXZpb3VzVG9rZW4gJiYgcHJldmlvdXNUb2tlbi5lbmRzV2l0aCgnXFxcXCcpKSB7XG5cdFx0XHQvLyBNZXJnZSBwcmV2aW91cyB0b2tlbiB3aXRoIGN1cnJlbnQgb25lXG5cdFx0XHR0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdID0gYCR7cHJldmlvdXNUb2tlbi5zbGljZSgwLCAtMSl9ICR7dG9rZW59YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dG9rZW5zLnB1c2godG9rZW4pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0b2tlbnM7XG59O1xuXG5jb25zdCBwYXJzZUV4cHJlc3Npb24gPSBleHByZXNzaW9uID0+IHtcblx0Y29uc3QgdHlwZU9mRXhwcmVzc2lvbiA9IHR5cGVvZiBleHByZXNzaW9uO1xuXG5cdGlmICh0eXBlT2ZFeHByZXNzaW9uID09PSAnc3RyaW5nJykge1xuXHRcdHJldHVybiBleHByZXNzaW9uO1xuXHR9XG5cblx0aWYgKHR5cGVPZkV4cHJlc3Npb24gPT09ICdudW1iZXInKSB7XG5cdFx0cmV0dXJuIFN0cmluZyhleHByZXNzaW9uKTtcblx0fVxuXG5cdGlmIChcblx0XHR0eXBlT2ZFeHByZXNzaW9uID09PSAnb2JqZWN0J1xuXHRcdCYmIGV4cHJlc3Npb24gIT09IG51bGxcblx0XHQmJiAhKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDaGlsZFByb2Nlc3MpXG5cdFx0JiYgJ3N0ZG91dCcgaW4gZXhwcmVzc2lvblxuXHQpIHtcblx0XHRjb25zdCB0eXBlT2ZTdGRvdXQgPSB0eXBlb2YgZXhwcmVzc2lvbi5zdGRvdXQ7XG5cblx0XHRpZiAodHlwZU9mU3Rkb3V0ID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIGV4cHJlc3Npb24uc3Rkb3V0O1xuXHRcdH1cblxuXHRcdGlmIChCdWZmZXIuaXNCdWZmZXIoZXhwcmVzc2lvbi5zdGRvdXQpKSB7XG5cdFx0XHRyZXR1cm4gZXhwcmVzc2lvbi5zdGRvdXQudG9TdHJpbmcoKTtcblx0XHR9XG5cblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBVbmV4cGVjdGVkIFwiJHt0eXBlT2ZTdGRvdXR9XCIgc3Rkb3V0IGluIHRlbXBsYXRlIGV4cHJlc3Npb25gKTtcblx0fVxuXG5cdHRocm93IG5ldyBUeXBlRXJyb3IoYFVuZXhwZWN0ZWQgXCIke3R5cGVPZkV4cHJlc3Npb259XCIgaW4gdGVtcGxhdGUgZXhwcmVzc2lvbmApO1xufTtcblxuY29uc3QgY29uY2F0VG9rZW5zID0gKHRva2VucywgbmV4dFRva2VucywgaXNOZXcpID0+IGlzTmV3IHx8IHRva2Vucy5sZW5ndGggPT09IDAgfHwgbmV4dFRva2Vucy5sZW5ndGggPT09IDBcblx0PyBbLi4udG9rZW5zLCAuLi5uZXh0VG9rZW5zXVxuXHQ6IFtcblx0XHQuLi50b2tlbnMuc2xpY2UoMCwgLTEpLFxuXHRcdGAke3Rva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV19JHtuZXh0VG9rZW5zWzBdfWAsXG5cdFx0Li4ubmV4dFRva2Vucy5zbGljZSgxKSxcblx0XTtcblxuY29uc3QgcGFyc2VUZW1wbGF0ZSA9ICh7dGVtcGxhdGVzLCBleHByZXNzaW9ucywgdG9rZW5zLCBpbmRleCwgdGVtcGxhdGV9KSA9PiB7XG5cdGNvbnN0IHRlbXBsYXRlU3RyaW5nID0gdGVtcGxhdGUgPz8gdGVtcGxhdGVzLnJhd1tpbmRleF07XG5cdGNvbnN0IHRlbXBsYXRlVG9rZW5zID0gdGVtcGxhdGVTdHJpbmcuc3BsaXQoU1BBQ0VTX1JFR0VYUCkuZmlsdGVyKEJvb2xlYW4pO1xuXHRjb25zdCBuZXdUb2tlbnMgPSBjb25jYXRUb2tlbnMoXG5cdFx0dG9rZW5zLFxuXHRcdHRlbXBsYXRlVG9rZW5zLFxuXHRcdHRlbXBsYXRlU3RyaW5nLnN0YXJ0c1dpdGgoJyAnKSxcblx0KTtcblxuXHRpZiAoaW5kZXggPT09IGV4cHJlc3Npb25zLmxlbmd0aCkge1xuXHRcdHJldHVybiBuZXdUb2tlbnM7XG5cdH1cblxuXHRjb25zdCBleHByZXNzaW9uID0gZXhwcmVzc2lvbnNbaW5kZXhdO1xuXHRjb25zdCBleHByZXNzaW9uVG9rZW5zID0gQXJyYXkuaXNBcnJheShleHByZXNzaW9uKVxuXHRcdD8gZXhwcmVzc2lvbi5tYXAoZXhwcmVzc2lvbiA9PiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbikpXG5cdFx0OiBbcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb24pXTtcblx0cmV0dXJuIGNvbmNhdFRva2Vucyhcblx0XHRuZXdUb2tlbnMsXG5cdFx0ZXhwcmVzc2lvblRva2Vucyxcblx0XHR0ZW1wbGF0ZVN0cmluZy5lbmRzV2l0aCgnICcpLFxuXHQpO1xufTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlVGVtcGxhdGVzID0gKHRlbXBsYXRlcywgZXhwcmVzc2lvbnMpID0+IHtcblx0bGV0IHRva2VucyA9IFtdO1xuXG5cdGZvciAoY29uc3QgW2luZGV4LCB0ZW1wbGF0ZV0gb2YgdGVtcGxhdGVzLmVudHJpZXMoKSkge1xuXHRcdHRva2VucyA9IHBhcnNlVGVtcGxhdGUoe3RlbXBsYXRlcywgZXhwcmVzc2lvbnMsIHRva2VucywgaW5kZXgsIHRlbXBsYXRlfSk7XG5cdH1cblxuXHRyZXR1cm4gdG9rZW5zO1xufTtcblxuIiwgImltcG9ydCB7ZGVidWdsb2d9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5leHBvcnQgY29uc3QgdmVyYm9zZURlZmF1bHQgPSBkZWJ1Z2xvZygnZXhlY2EnKS5lbmFibGVkO1xuXG5jb25zdCBwYWRGaWVsZCA9IChmaWVsZCwgcGFkZGluZykgPT4gU3RyaW5nKGZpZWxkKS5wYWRTdGFydChwYWRkaW5nLCAnMCcpO1xuXG5jb25zdCBnZXRUaW1lc3RhbXAgPSAoKSA9PiB7XG5cdGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuXHRyZXR1cm4gYCR7cGFkRmllbGQoZGF0ZS5nZXRIb3VycygpLCAyKX06JHtwYWRGaWVsZChkYXRlLmdldE1pbnV0ZXMoKSwgMil9OiR7cGFkRmllbGQoZGF0ZS5nZXRTZWNvbmRzKCksIDIpfS4ke3BhZEZpZWxkKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCksIDMpfWA7XG59O1xuXG5leHBvcnQgY29uc3QgbG9nQ29tbWFuZCA9IChlc2NhcGVkQ29tbWFuZCwge3ZlcmJvc2V9KSA9PiB7XG5cdGlmICghdmVyYm9zZSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHByb2Nlc3Muc3RkZXJyLndyaXRlKGBbJHtnZXRUaW1lc3RhbXAoKX1dICR7ZXNjYXBlZENvbW1hbmR9XFxuYCk7XG59O1xuIiwgImltcG9ydCB7XG4gIEJ1aWxkU3RlcE91dHB1dCxcbiAgRW50cnlwb2ludEdyb3VwLFxuICBJbnRlcm5hbENvbmZpZyxcbiAgV3h0RGV2U2VydmVyLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBTY3JpcHRpbmcgfSBmcm9tICd3ZWJleHRlbnNpb24tcG9seWZpbGwnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGggfSBmcm9tICcuL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCB7IGdldENvbnRlbnRTY3JpcHRDc3NGaWxlcyB9IGZyb20gJy4vdXRpbHMvbWFuaWZlc3QnO1xuaW1wb3J0IHsgYnVpbGRJbnRlcm5hbCB9IGZyb20gJy4vYnVpbGQnO1xuaW1wb3J0IHsgY3JlYXRlRXh0ZW5zaW9uUnVubmVyIH0gZnJvbSAnLi9ydW5uZXJzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNlcnZlckluZm8oKTogUHJvbWlzZTxTZXJ2ZXJJbmZvPiB7XG4gIGNvbnN0IHsgZGVmYXVsdDogZ2V0UG9ydCwgcG9ydE51bWJlcnMgfSA9IGF3YWl0IGltcG9ydCgnZ2V0LXBvcnQnKTtcbiAgY29uc3QgcG9ydCA9IGF3YWl0IGdldFBvcnQoeyBwb3J0OiBwb3J0TnVtYmVycygzMDAwLCAzMDEwKSB9KTtcbiAgY29uc3QgaG9zdG5hbWUgPSAnbG9jYWxob3N0JztcbiAgY29uc3Qgb3JpZ2luID0gYGh0dHA6Ly8ke2hvc3RuYW1lfToke3BvcnR9YDtcbiAgY29uc3Qgc2VydmVyQ29uZmlnOiB2aXRlLklubGluZUNvbmZpZyA9IHtcbiAgICBzZXJ2ZXI6IHtcbiAgICAgIG9yaWdpbixcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcG9ydCxcbiAgICBob3N0bmFtZSxcbiAgICBvcmlnaW4sXG4gICAgdml0ZVNlcnZlckNvbmZpZzogc2VydmVyQ29uZmlnLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBTZXJ2ZXIoXG4gIHNlcnZlckluZm86IFNlcnZlckluZm8sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPFd4dERldlNlcnZlcj4ge1xuICBjb25zdCBydW5uZXIgPSBhd2FpdCBjcmVhdGVFeHRlbnNpb25SdW5uZXIoY29uZmlnKTtcblxuICBjb25zdCB2aXRlU2VydmVyID0gYXdhaXQgdml0ZS5jcmVhdGVTZXJ2ZXIoXG4gICAgdml0ZS5tZXJnZUNvbmZpZyhzZXJ2ZXJJbmZvLCBhd2FpdCBjb25maWcudml0ZShjb25maWcuZW52KSksXG4gICk7XG5cbiAgY29uc3Qgc3RhcnQgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdml0ZVNlcnZlci5saXN0ZW4oc2VydmVyLnBvcnQpO1xuICAgIGNvbmZpZy5sb2dnZXIuc3VjY2VzcyhgU3RhcnRlZCBkZXYgc2VydmVyIEAgJHtzZXJ2ZXJJbmZvLm9yaWdpbn1gKTtcblxuICAgIHNlcnZlci5jdXJyZW50T3V0cHV0ID0gYXdhaXQgYnVpbGRJbnRlcm5hbChjb25maWcpO1xuICAgIGF3YWl0IHJ1bm5lci5vcGVuQnJvd3Nlcihjb25maWcpO1xuICB9O1xuXG4gIGNvbnN0IHJlbG9hZEV4dGVuc2lvbiA9ICgpID0+IHtcbiAgICB2aXRlU2VydmVyLndzLnNlbmQoJ3d4dDpyZWxvYWQtZXh0ZW5zaW9uJyk7XG4gIH07XG4gIGNvbnN0IHJlbG9hZFBhZ2UgPSAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgLy8gQ2FuJ3QgdXNlIFZpdGUncyBidWlsdC1pbiBcImZ1bGwtcmVsb2FkXCIgZXZlbnQgYmVjYXVzZSBpdCBkb2Vzbid0IGxpa2Ugb3VyIHBhdGhzLCBpdCBleHBlY3RzXG4gICAgLy8gcGF0aHMgZW5kaW5nIGluIFwiL2luZGV4Lmh0bWxcIlxuICAgIHZpdGVTZXJ2ZXIud3Muc2VuZCgnd3h0OnJlbG9hZC1wYWdlJywgcGF0aCk7XG4gIH07XG4gIGNvbnN0IHJlbG9hZENvbnRlbnRTY3JpcHQgPSAoXG4gICAgY29udGVudFNjcmlwdDogT21pdDxTY3JpcHRpbmcuUmVnaXN0ZXJlZENvbnRlbnRTY3JpcHQsICdpZCc+LFxuICApID0+IHtcbiAgICB2aXRlU2VydmVyLndzLnNlbmQoJ3d4dDpyZWxvYWQtY29udGVudC1zY3JpcHQnLCBjb250ZW50U2NyaXB0KTtcbiAgfTtcblxuICBjb25zdCBzZXJ2ZXI6IFd4dERldlNlcnZlciA9IHtcbiAgICAuLi52aXRlU2VydmVyLFxuICAgIHN0YXJ0LFxuICAgIGN1cnJlbnRPdXRwdXQ6IHtcbiAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgIG1hbmlmZXN0X3ZlcnNpb246IDMsXG4gICAgICAgIG5hbWU6ICcnLFxuICAgICAgICB2ZXJzaW9uOiAnJyxcbiAgICAgIH0sXG4gICAgICBwdWJsaWNBc3NldHM6IFtdLFxuICAgICAgc3RlcHM6IFtdLFxuICAgIH0sXG4gICAgcG9ydDogc2VydmVySW5mby5wb3J0LFxuICAgIGhvc3RuYW1lOiBzZXJ2ZXJJbmZvLmhvc3RuYW1lLFxuICAgIG9yaWdpbjogc2VydmVySW5mby5vcmlnaW4sXG4gICAgcmVsb2FkRXh0ZW5zaW9uLFxuICAgIHJlbG9hZFBhZ2UsXG4gICAgcmVsb2FkQ29udGVudFNjcmlwdCxcbiAgfTtcblxuICByZXR1cm4gc2VydmVyO1xufVxuXG4vKipcbiAqIEZyb20gdGhlIHNlcnZlciwgdGVsbCB0aGUgY2xpZW50IHRvIHJlbG9hZCBjb250ZW50IHNjcmlwdHMgZnJvbSB0aGUgcHJvdmlkZWQgYnVpbGQgc3RlcCBvdXRwdXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVsb2FkQ29udGVudFNjcmlwdHMoXG4gIHN0ZXBzOiBCdWlsZFN0ZXBPdXRwdXRbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgc2VydmVyOiBXeHREZXZTZXJ2ZXIsXG4pIHtcbiAgaWYgKGNvbmZpZy5tYW5pZmVzdFZlcnNpb24gPT09IDMpIHtcbiAgICBzdGVwcy5mb3JFYWNoKChzdGVwKSA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IHN0ZXAuZW50cnlwb2ludHM7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkgfHwgZW50cnkudHlwZSAhPT0gJ2NvbnRlbnQtc2NyaXB0JykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBqcyA9IFtnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChlbnRyeSwgY29uZmlnLm91dERpciwgJy5qcycpXTtcbiAgICAgIGNvbnN0IGNzcyA9IGdldENvbnRlbnRTY3JpcHRDc3NGaWxlcyhbZW50cnldLCBzZXJ2ZXIuY3VycmVudE91dHB1dCk7XG5cbiAgICAgIHNlcnZlci5yZWxvYWRDb250ZW50U2NyaXB0KHtcbiAgICAgICAgYWxsRnJhbWVzOiBlbnRyeS5vcHRpb25zLmFsbEZyYW1lcyxcbiAgICAgICAgZXhjbHVkZU1hdGNoZXM6IGVudHJ5Lm9wdGlvbnMuZXhjbHVkZU1hdGNoZXMsXG4gICAgICAgIG1hdGNoZXM6IGVudHJ5Lm9wdGlvbnMubWF0Y2hlcyxcbiAgICAgICAgcnVuQXQ6IGVudHJ5Lm9wdGlvbnMucnVuQXQsXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IENocm9tZSBhY2NlcHRzIHRoaXMsIG5vdCB0eXBlZCBpbiB3ZWJleHRlbnNpb24tcG9seWZpbGwgKGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZG9jcy9leHRlbnNpb25zL3JlZmVyZW5jZS9zY3JpcHRpbmcvI3R5cGUtUmVnaXN0ZXJlZENvbnRlbnRTY3JpcHQpXG4gICAgICAgIHdvcmxkOiBlbnRyeS5vcHRpb25zLndvcmxkLFxuICAgICAgICBqcyxcbiAgICAgICAgY3NzLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgc2VydmVyLnJlbG9hZEV4dGVuc2lvbigpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxvYWRIdG1sUGFnZXMoXG4gIGdyb3VwczogRW50cnlwb2ludEdyb3VwW10sXG4gIHNlcnZlcjogV3h0RGV2U2VydmVyLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKSB7XG4gIGdyb3Vwcy5mbGF0KCkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoZW50cnksIGNvbmZpZy5vdXREaXIsICcuaHRtbCcpO1xuICAgIHNlcnZlci5yZWxvYWRQYWdlKHBhdGgpO1xuICB9KTtcbn1cblxuaW50ZXJmYWNlIFNlcnZlckluZm8ge1xuICBwb3J0OiBudW1iZXI7XG4gIGhvc3RuYW1lOiBzdHJpbmc7XG4gIG9yaWdpbjogc3RyaW5nO1xuICB2aXRlU2VydmVyQ29uZmlnOiB2aXRlLklubGluZUNvbmZpZztcbn1cbiIsICJpbXBvcnQgeyBFeHRlbnNpb25SdW5uZXIgfSBmcm9tICcuL2V4dGVuc2lvbi1ydW5uZXInO1xuaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuXG4vKipcbiAqIFRoZSBXU0wgcnVubmVyIGp1c3QgbG9ncyBhIHdhcm5pbmcgbWVzc2FnZSBiZWNhdXNlIGB3ZWItZXh0YCBkb2Vzbid0IHdvcmsgaW4gV1NMLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV3NsUnVubmVyKCk6IEV4dGVuc2lvblJ1bm5lciB7XG4gIHJldHVybiB7XG4gICAgYXN5bmMgb3BlbkJyb3dzZXIoY29uZmlnKSB7XG4gICAgICBjb25maWcubG9nZ2VyLndhcm4oXG4gICAgICAgIGBDYW5ub3Qgb3BlbiBicm93c2VyIHdoZW4gdXNpbmcgV1NMLiBMb2FkIFwiJHtyZWxhdGl2ZShcbiAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgICl9XCIgYXMgYW4gdW5wYWNrZWQgZXh0ZW5zaW9uIG1hbnVhbGx5YCxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhc3luYyBjbG9zZUJyb3dzZXIoKSB7XG4gICAgICAvLyBub29wXG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFdlYkV4dFJ1bkluc3RhbmNlIH0gZnJvbSAnd2ViLWV4dC1ydW4nO1xuaW1wb3J0IHsgRXh0ZW5zaW9uUnVubmVyIH0gZnJvbSAnLi9leHRlbnNpb24tcnVubmVyJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gYEV4dGVuc2lvblJ1bm5lcmAgYmFja2VkIGJ5IGB3ZWItZXh0YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYkV4dFJ1bm5lcigpOiBFeHRlbnNpb25SdW5uZXIge1xuICBsZXQgcnVubmVyOiBXZWJFeHRSdW5JbnN0YW5jZSB8IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIG9wZW5Ccm93c2VyKGNvbmZpZykge1xuICAgICAgY29uZmlnLmxvZ2dlci5pbmZvKCdPcGVuaW5nIGJyb3dzZXIuLi4nKTtcblxuICAgICAgLy8gVXNlIHRoZSBwbHVnaW4ncyBsb2dnZXIgaW5zdGVhZCBvZiB3ZWItZXh0J3MgYnVpbHQtaW4gb25lLlxuICAgICAgY29uc3Qgd2ViRXh0TG9nZ2VyID0gYXdhaXQgaW1wb3J0KCd3ZWItZXh0LXJ1bi91dGlsL2xvZ2dlcicpO1xuICAgICAgd2ViRXh0TG9nZ2VyLmNvbnNvbGVTdHJlYW0ud3JpdGUgPSAoeyBsZXZlbCwgbXNnLCBuYW1lIH0pID0+IHtcbiAgICAgICAgaWYgKGxldmVsID49IEVSUk9SX0xPR19MRVZFTCkgY29uZmlnLmxvZ2dlci5lcnJvcihuYW1lLCBtc2cpO1xuICAgICAgICBpZiAobGV2ZWwgPj0gV0FSTl9MT0dfTEVWRUwpIGNvbmZpZy5sb2dnZXIud2Fybihtc2cpO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgd3h0VXNlckNvbmZpZyA9IGNvbmZpZy5ydW5uZXJDb25maWcuY29uZmlnO1xuICAgICAgY29uc3QgdXNlckNvbmZpZyA9IHtcbiAgICAgICAgY29uc29sZTogd3h0VXNlckNvbmZpZz8ub3BlbkNvbnNvbGUsXG4gICAgICAgIGRldnRvb2xzOiB3eHRVc2VyQ29uZmlnPy5vcGVuRGV2dG9vbHMsXG4gICAgICAgIHN0YXJ0VXJsOiB3eHRVc2VyQ29uZmlnPy5zdGFydFVybHMsXG4gICAgICAgIC4uLihjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGZpcmVmb3g6IHd4dFVzZXJDb25maWc/LmJpbmFyaWVzPy5maXJlZm94LFxuICAgICAgICAgICAgICBmaXJlZm94UHJvZmlsZTogd3h0VXNlckNvbmZpZz8uZmlyZWZveFByb2ZpbGUsXG4gICAgICAgICAgICAgIHByZWZzOiB3eHRVc2VyQ29uZmlnPy5maXJlZm94UHJlZnMsXG4gICAgICAgICAgICAgIGFyZ3M6IHd4dFVzZXJDb25maWc/LmZpcmVmb3hBcmdzLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBjaHJvbWl1bUJpbmFyeTogd3h0VXNlckNvbmZpZz8uYmluYXJpZXM/Lltjb25maWcuYnJvd3Nlcl0sXG4gICAgICAgICAgICAgIGNocm9taXVtUHJvZmlsZTogd3h0VXNlckNvbmZpZz8uY2hyb21pdW1Qcm9maWxlLFxuICAgICAgICAgICAgICBhcmdzOiB3eHRVc2VyQ29uZmlnPy5jaHJvbWl1bUFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmFsQ29uZmlnID0ge1xuICAgICAgICAuLi51c2VyQ29uZmlnLFxuICAgICAgICB0YXJnZXQ6IGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcgPyAnZmlyZWZveC1kZXNrdG9wJyA6ICdjaHJvbWl1bScsXG4gICAgICAgIHNvdXJjZURpcjogY29uZmlnLm91dERpcixcbiAgICAgICAgLy8gV1hUIGhhbmRsZXMgcmVsb2Fkcywgc28gZGlzYWJsZSBhdXRvLXJlbG9hZCBiZWhhdmlvcnMgaW4gd2ViLWV4dFxuICAgICAgICBub1JlbG9hZDogdHJ1ZSxcbiAgICAgICAgbm9JbnB1dDogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAvLyBEb24ndCBjYWxsIGBwcm9jZXNzLmV4aXQoMClgIGFmdGVyIHN0YXJ0aW5nIHdlYi1leHRcbiAgICAgICAgc2hvdWxkRXhpdFByb2dyYW06IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoJ3dlYi1leHQgY29uZmlnOicsIGZpbmFsQ29uZmlnKTtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoJ3dlYi1leHQgb3B0aW9uczonLCBvcHRpb25zKTtcblxuICAgICAgY29uc3Qgd2ViRXh0ID0gYXdhaXQgaW1wb3J0KCd3ZWItZXh0LXJ1bicpO1xuICAgICAgcnVubmVyID0gYXdhaXQgd2ViRXh0LmRlZmF1bHQuY21kLnJ1bihmaW5hbENvbmZpZywgb3B0aW9ucyk7XG5cbiAgICAgIGNvbmZpZy5sb2dnZXIuc3VjY2VzcygnT3BlbmVkIScpO1xuICAgIH0sXG5cbiAgICBhc3luYyBjbG9zZUJyb3dzZXIoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcnVubmVyPy5leGl0KCk7XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvd2ViLWV4dC9ibG9iL2UzN2U2MGEyNzM4NDc4ZjUxMmYxMjU1YzUzNzEzMzMyMWYzMDE3NzEvc3JjL3V0aWwvbG9nZ2VyLmpzI0wxMlxuY29uc3QgV0FSTl9MT0dfTEVWRUwgPSA0MDtcbmNvbnN0IEVSUk9SX0xPR19MRVZFTCA9IDUwO1xuIiwgImltcG9ydCB7IEV4dGVuc2lvblJ1bm5lciB9IGZyb20gJy4vZXh0ZW5zaW9uLXJ1bm5lcic7XG5pbXBvcnQgeyByZWxhdGl2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogVGhlIFNhZmFyaSBydW5uZXIganVzdCBsb2dzIGEgd2FybmluZyBtZXNzYWdlIGJlY2F1c2UgYHdlYi1leHRgIGRvZXNuJ3Qgd29yayB3aXRoIFNhZmFyaS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNhZmFyaVJ1bm5lcigpOiBFeHRlbnNpb25SdW5uZXIge1xuICByZXR1cm4ge1xuICAgIGFzeW5jIG9wZW5Ccm93c2VyKGNvbmZpZykge1xuICAgICAgY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgICBgQ2Fubm90IFNhZmFyaSB1c2luZyB3ZWItZXh0LiBMb2FkIFwiJHtyZWxhdGl2ZShcbiAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgICl9XCIgYXMgYW4gdW5wYWNrZWQgZXh0ZW5zaW9uIG1hbnVhbGx5YCxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhc3luYyBjbG9zZUJyb3dzZXIoKSB7XG4gICAgICAvLyBub29wXG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBFeHRlbnNpb25SdW5uZXIgfSBmcm9tICcuL2V4dGVuc2lvbi1ydW5uZXInO1xuaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuXG4vKipcbiAqIFRoZSBtYW51YWwgcnVubmVyIHRlbGxzIHRoZSB1c2VyIHRvIGxvYWQgdGhlIHVucGFja2VkIGV4dGVuc2lvbiBtYW51YWxseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1hbnVhbFJ1bm5lcigpOiBFeHRlbnNpb25SdW5uZXIge1xuICByZXR1cm4ge1xuICAgIGFzeW5jIG9wZW5Ccm93c2VyKGNvbmZpZykge1xuICAgICAgY29uZmlnLmxvZ2dlci5pbmZvKFxuICAgICAgICBgTG9hZCBcIiR7cmVsYXRpdmUoXG4gICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICBjb25maWcub3V0RGlyLFxuICAgICAgICApfVwiIGFzIGFuIHVucGFja2VkIGV4dGVuc2lvbiBtYW51YWxseWAsXG4gICAgICApO1xuICAgIH0sXG4gICAgYXN5bmMgY2xvc2VCcm93c2VyKCkge1xuICAgICAgLy8gbm9vcFxuICAgIH0sXG4gIH07XG59XG4iLCAiLyoqXG4gKiBSZXR1cm5zIHRydWUgd2hlbiBydW5uaW5nIG9uIFdTTCBvciBXU0wyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNXc2woKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHsgZGVmYXVsdDogaXNXc2wgfSA9IGF3YWl0IGltcG9ydCgnaXMtd3NsJyk7IC8vIEVTTSBvbmx5LCByZXF1aXJlcyBkeW5hbWljIGltcG9ydFxuICByZXR1cm4gaXNXc2w7XG59XG4iLCAiaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25SdW5uZXIgfSBmcm9tICcuL2V4dGVuc2lvbi1ydW5uZXInO1xuaW1wb3J0IHsgY3JlYXRlV3NsUnVubmVyIH0gZnJvbSAnLi93c2wnO1xuaW1wb3J0IHsgY3JlYXRlV2ViRXh0UnVubmVyIH0gZnJvbSAnLi93ZWItZXh0JztcbmltcG9ydCB7IGNyZWF0ZVNhZmFyaVJ1bm5lciB9IGZyb20gJy4vc2FmYXJpJztcbmltcG9ydCB7IGNyZWF0ZU1hbnVhbFJ1bm5lciB9IGZyb20gJy4vbWFudWFsJztcbmltcG9ydCB7IGlzV3NsIH0gZnJvbSAnLi4vdXRpbHMvd3NsJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUV4dGVuc2lvblJ1bm5lcihcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8RXh0ZW5zaW9uUnVubmVyPiB7XG4gIGlmIChjb25maWcuYnJvd3NlciA9PT0gJ3NhZmFyaScpIHJldHVybiBjcmVhdGVTYWZhcmlSdW5uZXIoKTtcblxuICBpZiAoYXdhaXQgaXNXc2woKSkgcmV0dXJuIGNyZWF0ZVdzbFJ1bm5lcigpO1xuICBpZiAoY29uZmlnLnJ1bm5lckNvbmZpZy5jb25maWc/LmRpc2FibGVkKSByZXR1cm4gY3JlYXRlTWFudWFsUnVubmVyKCk7XG5cbiAgcmV0dXJuIGNyZWF0ZVdlYkV4dFJ1bm5lcigpO1xufVxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgZ2xvYiBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcbmltcG9ydCBwYyBmcm9tICdwaWNvY29sb3JzJztcblxuLyoqXG4gKiBSZW1vdmUgZ2VuZXJhdGVkL3RlbXAgZmlsZXMgZnJvbSB0aGUgZGlyZWN0b3J5LlxuICpcbiAqIEBwYXJhbSByb290IFRoZSBkaXJlY3RvcnkgdG8gbG9vayBmb3IgZ2VuZXJhdGVkL3RlbXAgZmlsZXMgaW4uIERlZmF1bHRzIHRvIGBwcm9jZXNzLmN3ZCgpYC4gQ2FuIGJlIHJlbGF0aXZlIHRvIGBwcm9jZXNzLmN3ZCgpYCBvciBhYnNvbHV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFuKHJvb3QgPSBwcm9jZXNzLmN3ZCgpKSB7XG4gIGNvbnNvbGEuaW5mbygnQ2xlYW5pbmcgUHJvamVjdCcpO1xuXG4gIGNvbnN0IHRlbXBEaXJzID0gW1xuICAgICdub2RlX21vZHVsZXMvLnZpdGUnLFxuICAgICdub2RlX21vZHVsZXMvLmNhY2hlJyxcbiAgICAnKiovLnd4dCcsXG4gICAgJy5vdXRwdXQvKicsXG4gIF07XG4gIGNvbnNvbGEuZGVidWcoJ0xvb2tpbmcgZm9yOicsIHRlbXBEaXJzLm1hcChwYy5jeWFuKS5qb2luKCcsICcpKTtcbiAgY29uc3QgZGlyZWN0b3JpZXMgPSBhd2FpdCBnbG9iKHRlbXBEaXJzLCB7XG4gICAgY3dkOiBwYXRoLnJlc29sdmUocm9vdCksXG4gICAgYWJzb2x1dGU6IHRydWUsXG4gICAgb25seURpcmVjdG9yaWVzOiB0cnVlLFxuICAgIGRlZXA6IDIsXG4gIH0pO1xuICBpZiAoZGlyZWN0b3JpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sYS5kZWJ1ZygnTm8gZ2VuZXJhdGVkIGZpbGVzIGZvdW5kLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnNvbGEuZGVidWcoXG4gICAgJ0ZvdW5kOicsXG4gICAgZGlyZWN0b3JpZXMubWFwKChkaXIpID0+IHBjLmN5YW4ocGF0aC5yZWxhdGl2ZShyb290LCBkaXIpKSkuam9pbignLCAnKSxcbiAgKTtcbiAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICBhd2FpdCBmcy5ybShkaXJlY3RvcnksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBjb25zb2xhLmRlYnVnKCdEZWxldGVkICcgKyBwYy5jeWFuKHBhdGgucmVsYXRpdmUocm9vdCwgZGlyZWN0b3J5KSkpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTG9nTGV2ZWxzLCBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5pbXBvcnQgeyBwcmludEhlYWRlciB9IGZyb20gJy4uLy4uL2NvcmUvbG9nL3ByaW50SGVhZGVyJztcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9mb3JtYXREdXJhdGlvbic7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVDb21tYW5kPFRBcmdzIGV4dGVuZHMgYW55W10+KFxuICBjYjogKC4uLmFyZ3M6IFRBcmdzKSA9PiB2b2lkIHwgYm9vbGVhbiB8IFByb21pc2U8dm9pZCB8IGJvb2xlYW4+LFxuICBvcHRpb25zPzoge1xuICAgIGRpc2FibGVGaW5pc2hlZExvZz86IGJvb2xlYW47XG4gIH0sXG4pIHtcbiAgcmV0dXJuIGFzeW5jICguLi5hcmdzOiBUQXJncykgPT4ge1xuICAgIC8vIEVuYWJsZSBjb25zb2xhJ3MgZGVidWcgbW9kZSBnbG9iYWxseSBhdCB0aGUgc3RhcnQgb2YgYWxsIGNvbW1hbmRzIHdoZW4gdGhlIGAtLWRlYnVnYCBmbGFnIGlzXG4gICAgLy8gcGFzc2VkXG4gICAgY29uc3QgaXNEZWJ1ZyA9ICEhYXJncy5maW5kKChhcmcpID0+IGFyZz8uZGVidWcpO1xuICAgIGlmIChpc0RlYnVnKSB7XG4gICAgICBjb25zb2xhLmxldmVsID0gTG9nTGV2ZWxzLmRlYnVnO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgdHJ5IHtcbiAgICAgIHByaW50SGVhZGVyKCk7XG5cbiAgICAgIGNvbnN0IG9uZ29pbmcgPSBhd2FpdCBjYiguLi5hcmdzKTtcblxuICAgICAgaWYgKCFvbmdvaW5nICYmICFvcHRpb25zPy5kaXNhYmxlRmluaXNoZWRMb2cpXG4gICAgICAgIGNvbnNvbGEuc3VjY2VzcyhcbiAgICAgICAgICBgRmluaXNoZWQgaW4gJHtmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gLFxuICAgICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sYS5mYWlsKFxuICAgICAgICBgQ29tbWFuZCBmYWlsZWQgYWZ0ZXIgJHtmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gLFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGEuZXJyb3IoZXJyKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH07XG59XG4iLCAiaW1wb3J0IHBjIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50SGVhZGVyKCkge1xuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xhLmxvZyhgJHtwYy5ncmF5KCdXWFQnKX0gJHtwYy5ncmF5KHBjLmJvbGQodmVyc2lvbikpfWApO1xufVxuIiwgImltcG9ydCAqIGFzIHd4dCBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5cbmV4cG9ydCBjb25zdCBidWlsZCA9IGRlZmluZUNvbW1hbmQ8XG4gIFtcbiAgICByb290OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZmxhZ3M6IHtcbiAgICAgIG1vZGU/OiBzdHJpbmc7XG4gICAgICBjb25maWc/OiBzdHJpbmc7XG4gICAgICBicm93c2VyPzogd3h0LlRhcmdldEJyb3dzZXI7XG4gICAgICBtdjM/OiBib29sZWFuO1xuICAgICAgbXYyPzogYm9vbGVhbjtcbiAgICAgIGRlYnVnPzogYm9vbGVhbjtcbiAgICAgIGFuYWx5emU/OiBib29sZWFuO1xuICAgIH0sXG4gIF1cbj4oYXN5bmMgKHJvb3QsIGZsYWdzKSA9PiB7XG4gIGNvbnN0IGNsaUNvbmZpZzogd3h0LklubGluZUNvbmZpZyA9IHtcbiAgICByb290LFxuICAgIG1vZGU6IGZsYWdzLm1vZGUsXG4gICAgYnJvd3NlcjogZmxhZ3MuYnJvd3NlcixcbiAgICBtYW5pZmVzdFZlcnNpb246IGZsYWdzLm12MyA/IDMgOiBmbGFncy5tdjIgPyAyIDogdW5kZWZpbmVkLFxuICAgIGNvbmZpZ0ZpbGU6IGZsYWdzLmNvbmZpZyxcbiAgICBkZWJ1ZzogZmxhZ3MuZGVidWcsXG4gICAgYW5hbHlzaXM6IHtcbiAgICAgIGVuYWJsZWQ6IGZsYWdzLmFuYWx5emUsXG4gICAgfSxcbiAgfTtcblxuICBhd2FpdCB3eHQuYnVpbGQoY2xpQ29uZmlnKTtcbn0pO1xuIiwgImltcG9ydCAqIGFzIHd4dCBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5cbmV4cG9ydCBjb25zdCBkZXYgPSBkZWZpbmVDb21tYW5kPFxuICBbXG4gICAgcm9vdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiB7XG4gICAgICBtb2RlPzogc3RyaW5nO1xuICAgICAgY29uZmlnPzogc3RyaW5nO1xuICAgICAgYnJvd3Nlcj86IHd4dC5UYXJnZXRCcm93c2VyO1xuICAgICAgbXYzPzogYm9vbGVhbjtcbiAgICAgIG12Mj86IGJvb2xlYW47XG4gICAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgfSxcbiAgXVxuPihhc3luYyAocm9vdCwgZmxhZ3MpID0+IHtcbiAgY29uc3QgY2xpQ29uZmlnOiB3eHQuSW5saW5lQ29uZmlnID0ge1xuICAgIHJvb3QsXG4gICAgbW9kZTogZmxhZ3MubW9kZSxcbiAgICBicm93c2VyOiBmbGFncy5icm93c2VyLFxuICAgIG1hbmlmZXN0VmVyc2lvbjogZmxhZ3MubXYzID8gMyA6IGZsYWdzLm12MiA/IDIgOiB1bmRlZmluZWQsXG4gICAgY29uZmlnRmlsZTogZmxhZ3MuY29uZmlnLFxuICAgIGRlYnVnOiBmbGFncy5kZWJ1ZyxcbiAgfTtcblxuICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCB3eHQuY3JlYXRlU2VydmVyKGNsaUNvbmZpZyk7XG4gIGF3YWl0IHNlcnZlci5zdGFydCgpO1xuXG4gIHJldHVybiB0cnVlO1xufSk7XG4iLCAiaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuaW1wb3J0IHByb21wdHMgZnJvbSAncHJvbXB0cyc7XG5pbXBvcnQgeyBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5pbXBvcnQgeyBkb3dubG9hZFRlbXBsYXRlIH0gZnJvbSAnZ2lnZXQnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcGMgZnJvbSAncGljb2NvbG9ycyc7XG5pbXBvcnQgeyBGb3JtYXR0ZXIgfSBmcm9tICdwaWNvY29sb3JzL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGluaXQgPSBkZWZpbmVDb21tYW5kPFxuICBbXG4gICAgZGlyZWN0b3J5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogeyB0ZW1wbGF0ZT86IHN0cmluZzsgcG0/OiBzdHJpbmc7IGRlYnVnPzogYm9vbGVhbiB9LFxuICBdXG4+KFxuICBhc3luYyAodXNlckRpcmVjdG9yeSwgZmxhZ3MpID0+IHtcbiAgICBjb25zb2xhLmluZm8oJ0luaXRhbGl6aW5nIG5ldyBwcm9qZWN0Jyk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZXMgPSBhd2FpdCBsaXN0VGVtcGxhdGVzKCk7XG4gICAgY29uc3QgZGVmYXVsdFRlbXBsYXRlID0gdGVtcGxhdGVzLmZpbmQoXG4gICAgICAodGVtcGxhdGUpID0+IHRlbXBsYXRlLm5hbWUgPT09IGZsYWdzLnRlbXBsYXRlPy50b0xvd2VyQ2FzZSgpLnRyaW0oKSxcbiAgICApO1xuXG4gICAgY29uc3QgaW5wdXQgPSBhd2FpdCBwcm9tcHRzKFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2RpcmVjdG9yeScsXG4gICAgICAgICAgdHlwZTogKCkgPT4gKHVzZXJEaXJlY3RvcnkgPT0gbnVsbCA/ICd0ZXh0JyA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgbWVzc2FnZTogJ1Byb2plY3QgRGlyZWN0b3J5JyxcbiAgICAgICAgICBpbml0aWFsOiB1c2VyRGlyZWN0b3J5LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3RlbXBsYXRlJyxcbiAgICAgICAgICB0eXBlOiAoKSA9PiAoZGVmYXVsdFRlbXBsYXRlID09IG51bGwgPyAnc2VsZWN0JyA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgbWVzc2FnZTogJ0Nob29zZSBhIHRlbXBsYXRlJyxcbiAgICAgICAgICBjaG9pY2VzOiB0ZW1wbGF0ZXMubWFwKCh0ZW1wbGF0ZSkgPT4gKHtcbiAgICAgICAgICAgIHRpdGxlOlxuICAgICAgICAgICAgICBURU1QTEFURV9DT0xPUlNbdGVtcGxhdGUubmFtZV0/Lih0ZW1wbGF0ZS5uYW1lKSA/PyB0ZW1wbGF0ZS5uYW1lLFxuICAgICAgICAgICAgdmFsdWU6IHRlbXBsYXRlLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdwYWNrYWdlTWFuYWdlcicsXG4gICAgICAgICAgdHlwZTogKCkgPT4gKGZsYWdzLnBtID09IG51bGwgPyAnc2VsZWN0JyA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgbWVzc2FnZTogJ1BhY2thZ2UgTWFuYWdlcicsXG4gICAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgeyB0aXRsZTogJ25wbScsIHZhbHVlOiAnbnBtJyB9LFxuICAgICAgICAgICAgeyB0aXRsZTogJ3BucG0nLCB2YWx1ZTogJ3BucG0nIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiAneWFybicsIHZhbHVlOiAneWFybicgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHtcbiAgICAgICAgb25DYW5jZWw6ICgpID0+IHByb2Nlc3MuZXhpdCgxKSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBpbnB1dC5kaXJlY3RvcnkgPz89IHVzZXJEaXJlY3Rvcnk7XG4gICAgaW5wdXQudGVtcGxhdGUgPz89IGRlZmF1bHRUZW1wbGF0ZTtcbiAgICBpbnB1dC5wYWNrYWdlTWFuYWdlciA/Pz0gZmxhZ3MucG07XG5cbiAgICBhd2FpdCBjbG9uZVByb2plY3QoaW5wdXQpO1xuXG4gICAgY29uc3QgY2RQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoLnJlc29sdmUoaW5wdXQuZGlyZWN0b3J5KSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xhLmxvZyhcbiAgICAgIGBcdTI3MjggV1hUIHByb2plY3QgY3JlYXRlZCB3aXRoIHRoZSAke1xuICAgICAgICBURU1QTEFURV9DT0xPUlNbaW5wdXQudGVtcGxhdGUubmFtZV0/LihpbnB1dC50ZW1wbGF0ZS5uYW1lKSA/P1xuICAgICAgICBpbnB1dC50ZW1wbGF0ZS5uYW1lXG4gICAgICB9IHRlbXBsYXRlLmAsXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGEubG9nKCdOZXh0IHN0ZXBzOicpO1xuICAgIGxldCBzdGVwID0gMDtcbiAgICBpZiAoY2RQYXRoICE9PSAnJykgY29uc29sYS5sb2coYCAgJHsrK3N0ZXB9LmAsIHBjLmN5YW4oYGNkICR7Y2RQYXRofWApKTtcbiAgICBjb25zb2xhLmxvZyhgICAkeysrc3RlcH0uYCwgcGMuY3lhbihgJHtpbnB1dC5wYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGApKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9LFxuICB7IGRpc2FibGVGaW5pc2hlZExvZzogdHJ1ZSB9LFxuKTtcblxuaW50ZXJmYWNlIFRlbXBsYXRlIHtcbiAgLyoqXG4gICAqIFRlbXBsYXRlJ3MgbmFtZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFBhdGggdG8gdGVtcGxhdGUgZGlyZWN0b3J5IGluIGdpdGh1YiByZXBvLlxuICAgKi9cbiAgcGF0aDogc3RyaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0VGVtcGxhdGVzKCk6IFByb21pc2U8VGVtcGxhdGVbXT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvd3h0LWRldi93eHQvY29udGVudHMvdGVtcGxhdGVzJyxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbicsXG4gICAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICAgIGlmIChyZXMuc3RhdHVzID49IDMwMClcbiAgICAgIHRocm93IEVycm9yKGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG5cbiAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIEFycmF5PHtcbiAgICAgIHR5cGU6ICdmaWxlJyB8ICdkaXInO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgcGF0aDogc3RyaW5nO1xuICAgIH0+O1xuICAgIHJldHVybiBkYXRhXG4gICAgICAuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0udHlwZSA9PT0gJ2RpcicpXG4gICAgICAubWFwKChpdGVtKSA9PiAoeyBuYW1lOiBpdGVtLm5hbWUsIHBhdGg6IGl0ZW0ucGF0aCB9KSlcbiAgICAgIC5zb3J0KChsLCByKSA9PiB7XG4gICAgICAgIGNvbnN0IGxXZWlnaHQgPSBURU1QTEFURV9TT1JUX1dFSUdIVFtsLm5hbWVdID8/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgICBjb25zdCByV2VpZ2h0ID0gVEVNUExBVEVfU09SVF9XRUlHSFRbci5uYW1lXSA/PyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgY29uc3QgZGlmZiA9IGxXZWlnaHQgLSByV2VpZ2h0O1xuICAgICAgICBpZiAoZGlmZiAhPT0gMCkgcmV0dXJuIGRpZmY7XG4gICAgICAgIHJldHVybiBsLm5hbWUubG9jYWxlQ29tcGFyZShyLm5hbWUpO1xuICAgICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IEVycm9yKGBDYW5ub3QgbG9hZCB0ZW1wbGF0ZXM6ICR7SlNPTi5zdHJpbmdpZnkoZXJyLCBudWxsLCAyKX1gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjbG9uZVByb2plY3Qoe1xuICBkaXJlY3RvcnksXG4gIHRlbXBsYXRlLFxuICBwYWNrYWdlTWFuYWdlcixcbn06IHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIHRlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgcGFja2FnZU1hbmFnZXI6IHN0cmluZztcbn0pIHtcbiAgY29uc3QgeyBkZWZhdWx0OiBvcmEgfSA9IGF3YWl0IGltcG9ydCgnb3JhJyk7XG4gIGNvbnN0IHNwaW5uZXIgPSBvcmEoJ0Rvd25sb2FkaW5nIHRlbXBsYXRlJykuc3RhcnQoKTtcbiAgdHJ5IHtcbiAgICAvLyAxLiBDbG9uZSByZXBvXG4gICAgYXdhaXQgZG93bmxvYWRUZW1wbGF0ZShgZ2g6d3h0LWRldi93eHQvJHt0ZW1wbGF0ZS5wYXRofWAsIHtcbiAgICAgIGRpcjogZGlyZWN0b3J5LFxuICAgICAgZm9yY2U6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyAyLiBNb3ZlIF9naXRpZ25vcmUgLT4gLmdpdGlnbm9yZVxuICAgIGF3YWl0IGZzXG4gICAgICAubW92ZShcbiAgICAgICAgcGF0aC5qb2luKGRpcmVjdG9yeSwgJ19naXRpZ25vcmUnKSxcbiAgICAgICAgcGF0aC5qb2luKGRpcmVjdG9yeSwgJy5naXRpZ25vcmUnKSxcbiAgICAgIClcbiAgICAgIC5jYXRjaCgoZXJyKSA9PlxuICAgICAgICBjb25zb2xhLndhcm4oJ0ZhaWxlZCB0byBtb3ZlIF9naXRpZ25vcmUgdG8gLmdpdGlnbm9yZTonLCBlcnIpLFxuICAgICAgKTtcblxuICAgIC8vIDMuIEFkZCAubnBtcmMgZm9yIHBucG1cbiAgICBpZiAocGFja2FnZU1hbmFnZXIgPT09ICdwbnBtJykge1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgICAgICBwYXRoLmpvaW4oZGlyZWN0b3J5LCAnLm5wbXJjJyksXG4gICAgICAgICdzaGFtZWZ1bGx5LWhvaXN0PXRydWVcXG4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBzcGlubmVyLnN1Y2NlZWQoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3Bpbm5lci5mYWlsKCk7XG4gICAgdGhyb3cgRXJyb3IoYEZhaWxlZCB0byBzZXR1cCBuZXcgcHJvamVjdDogJHtKU09OLnN0cmluZ2lmeShlcnIsIG51bGwsIDIpfWApO1xuICB9XG59XG5cbmNvbnN0IFRFTVBMQVRFX0NPTE9SUzogUmVjb3JkPHN0cmluZywgRm9ybWF0dGVyPiA9IHtcbiAgdmFuaWxsYTogcGMuYmx1ZSxcbiAgdnVlOiBwYy5ncmVlbixcbiAgcmVhY3Q6IHBjLmN5YW4sXG4gIHN2ZWx0ZTogcGMucmVkLFxuICBzb2xpZDogcGMuYmx1ZSxcbn07XG5cbmNvbnN0IFRFTVBMQVRFX1NPUlRfV0VJR0hUOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICB2YW5pbGxhOiAwLFxuICB2dWU6IDEsXG4gIHJlYWN0OiAyLFxufTtcbiIsICJpbXBvcnQgeyBnZXRJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvZ2V0SW50ZXJuYWxDb25maWcnO1xuaW1wb3J0IHsgZmluZEVudHJ5cG9pbnRzIH0gZnJvbSAnLi4vLi4vY29yZS9idWlsZC9maW5kRW50cnlwb2ludHMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUeXBlc0RpciB9IGZyb20gJy4uLy4uL2NvcmUvYnVpbGQvZ2VuZXJhdGVUeXBlc0Rpcic7XG5pbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5pbXBvcnQgKiBhcyB3eHQgZnJvbSAnLi4vLi4nO1xuXG5leHBvcnQgY29uc3QgcHJlcGFyZSA9IGRlZmluZUNvbW1hbmQ8XG4gIFtcbiAgICByb290OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZmxhZ3M6IHtcbiAgICAgIGNvbmZpZz86IHN0cmluZztcbiAgICAgIGRlYnVnPzogYm9vbGVhbjtcbiAgICB9LFxuICBdXG4+KGFzeW5jIChyb290LCBmbGFncykgPT4ge1xuICBjb25zdCBjbGlDb25maWc6IHd4dC5JbmxpbmVDb25maWcgPSB7XG4gICAgcm9vdCxcbiAgICBjb25maWdGaWxlOiBmbGFncy5jb25maWcsXG4gICAgZGVidWc6IGZsYWdzLmRlYnVnLFxuICB9O1xuICBjb25zdCBjb25maWcgPSBhd2FpdCBnZXRJbnRlcm5hbENvbmZpZyhjbGlDb25maWcsICdidWlsZCcpO1xuXG4gIGNvbmZpZy5sb2dnZXIuaW5mbygnR2VuZXJhdGluZyB0eXBlcy4uLicpO1xuXG4gIGNvbnN0IGVudHJ5cG9pbnRzID0gYXdhaXQgZmluZEVudHJ5cG9pbnRzKGNvbmZpZyk7XG4gIGF3YWl0IGdlbmVyYXRlVHlwZXNEaXIoZW50cnlwb2ludHMsIGNvbmZpZyk7XG59KTtcbiIsICJpbXBvcnQgeyBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5pbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5cbmV4cG9ydCBjb25zdCBwdWJsaXNoID0gZGVmaW5lQ29tbWFuZChcbiAgYXN5bmMgKFxuICAgIHJvb3Q6IGFueSxcbiAgICB7IGNvbmZpZzogY29uZmlnRmlsZSwgZGVidWcgfTogeyBjb25maWc/OiBzdHJpbmc7IGRlYnVnPzogc3RyaW5nIH0sXG4gICkgPT4ge1xuICAgIGNvbnNvbGEud2Fybignd3h0IHB1Ymxpc2g6IE5vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuKTtcbiIsICJpbXBvcnQgeyBCdWlsZE91dHB1dCwgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB6aXBkaXIgZnJvbSAnemlwLWRpcic7XG5pbXBvcnQgeyBkaXJuYW1lLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsga2ViYWJDYXNlQWxwaGFudW1lcmljIH0gZnJvbSAnLi91dGlscy9zdHJpbmdzJztcbmltcG9ydCB7IGdldFBhY2thZ2VKc29uIH0gZnJvbSAnLi91dGlscy9wYWNrYWdlJztcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gJ21pbmltYXRjaCc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiB9IGZyb20gJy4vdXRpbHMvZm9ybWF0RHVyYXRpb24nO1xuaW1wb3J0IHsgcHJpbnRGaWxlTGlzdCB9IGZyb20gJy4vbG9nL3ByaW50RmlsZUxpc3QnO1xuXG4vKipcbiAqIFppcCB0aGUgZXh0ZW5zaW9uIGZvciBkaXN0cmlidXRpb24uIERvZXMgbm90IGJ1aWxkLCBqdXN0IHppcHMgdGhlIG91dHB1dCB0aGF0IHNob3VsZCBleGlzdCBmb3JcbiAqIHRoZSBnaXZlbiBjb25maWcuXG4gKlxuICogUmV0dXJucyBhIGxpc3Qgb2YgWklQIGZpbGVzIHRoYXQgd2VyZSBjcmVhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gemlwRXh0ZW5zaW9uKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBidWlsZE91dHB1dDogQnVpbGRPdXRwdXQsXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgY29uZmlnLmxvZ2dlci5pbmZvKCdaaXBwaW5nIGV4dGVuc2lvbi4uLicpO1xuICBjb25zdCB6aXBGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdCBwcm9qZWN0TmFtZSA9XG4gICAgY29uZmlnLnppcC5uYW1lID8/XG4gICAga2ViYWJDYXNlQWxwaGFudW1lcmljKFxuICAgICAgKGF3YWl0IGdldFBhY2thZ2VKc29uKGNvbmZpZykpPy5uYW1lIHx8IGRpcm5hbWUocHJvY2Vzcy5jd2QoKSksXG4gICAgKTtcbiAgY29uc3QgYXBwbHlUZW1wbGF0ZSA9ICh0ZW1wbGF0ZTogc3RyaW5nKTogc3RyaW5nID0+XG4gICAgdGVtcGxhdGVcbiAgICAgIC5yZXBsYWNlQWxsKCd7e25hbWV9fScsIHByb2plY3ROYW1lKVxuICAgICAgLnJlcGxhY2VBbGwoJ3t7YnJvd3Nlcn19JywgY29uZmlnLmJyb3dzZXIpXG4gICAgICAucmVwbGFjZUFsbChcbiAgICAgICAgJ3t7dmVyc2lvbn19JyxcbiAgICAgICAgYnVpbGRPdXRwdXQubWFuaWZlc3QudmVyc2lvbl9uYW1lID8/IGJ1aWxkT3V0cHV0Lm1hbmlmZXN0LnZlcnNpb24sXG4gICAgICApXG4gICAgICAucmVwbGFjZUFsbCgne3ttYW5pZmVzdFZlcnNpb259fScsIGBtdiR7Y29uZmlnLm1hbmlmZXN0VmVyc2lvbn1gKTtcblxuICBhd2FpdCBmcy5lbnN1cmVEaXIoY29uZmlnLm91dEJhc2VEaXIpO1xuXG4gIC8vIFpJUCBvdXRwdXQgZGlyZWN0b3J5XG5cbiAgY29uc3Qgb3V0WmlwRmlsZW5hbWUgPSBhcHBseVRlbXBsYXRlKGNvbmZpZy56aXAuYXJ0aWZhY3RUZW1wbGF0ZSk7XG4gIGNvbnN0IG91dFppcFBhdGggPSByZXNvbHZlKGNvbmZpZy5vdXRCYXNlRGlyLCBvdXRaaXBGaWxlbmFtZSk7XG4gIGF3YWl0IHppcGRpcihjb25maWcub3V0RGlyLCB7XG4gICAgc2F2ZVRvOiBvdXRaaXBQYXRoLFxuICB9KTtcbiAgemlwRmlsZXMucHVzaChvdXRaaXBQYXRoKTtcblxuICAvLyBaSVAgc291cmNlcyBmb3IgRmlyZWZveFxuXG4gIGlmIChjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgY29uc3Qgc291cmNlc1ppcEZpbGVuYW1lID0gYXBwbHlUZW1wbGF0ZShjb25maWcuemlwLnNvdXJjZXNUZW1wbGF0ZSk7XG4gICAgY29uc3Qgc291cmNlc1ppcFBhdGggPSByZXNvbHZlKGNvbmZpZy5vdXRCYXNlRGlyLCBzb3VyY2VzWmlwRmlsZW5hbWUpO1xuICAgIGF3YWl0IHppcGRpcihjb25maWcuemlwLnNvdXJjZXNSb290LCB7XG4gICAgICBzYXZlVG86IHNvdXJjZXNaaXBQYXRoLFxuICAgICAgZmlsdGVyKHBhdGgpIHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUoY29uZmlnLnppcC5zb3VyY2VzUm9vdCwgcGF0aCk7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRQYXR0ZXJuID0gY29uZmlnLnppcC5pZ25vcmVkU291cmNlcy5maW5kKChwYXR0ZXJuKSA9PlxuICAgICAgICAgIG1pbmltYXRjaChyZWxhdGl2ZVBhdGgsIHBhdHRlcm4pLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbWF0Y2hlZFBhdHRlcm4gPT0gbnVsbDtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgemlwRmlsZXMucHVzaChzb3VyY2VzWmlwUGF0aCk7XG4gIH1cblxuICBhd2FpdCBwcmludEZpbGVMaXN0KFxuICAgIGNvbmZpZy5sb2dnZXIuc3VjY2VzcyxcbiAgICBgWmlwcGVkIGV4dGVuc2lvbiBpbiAke2Zvcm1hdER1cmF0aW9uKERhdGUubm93KCkgLSBzdGFydCl9YCxcbiAgICBjb25maWcub3V0QmFzZURpcixcbiAgICB6aXBGaWxlcyxcbiAgKTtcblxuICByZXR1cm4gemlwRmlsZXM7XG59XG4iLCAiaW1wb3J0ICogYXMgd3h0IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IGJ1aWxkSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9jb3JlL2J1aWxkJztcbmltcG9ydCB7IGdldEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9nZXRJbnRlcm5hbENvbmZpZyc7XG5pbXBvcnQgeyB6aXBFeHRlbnNpb24gfSBmcm9tICcuLi8uLi9jb3JlL3ppcCc7XG5pbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5cbmV4cG9ydCBjb25zdCB6aXAgPSBkZWZpbmVDb21tYW5kPFxuICBbXG4gICAgcm9vdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiB7XG4gICAgICBtb2RlPzogc3RyaW5nO1xuICAgICAgY29uZmlnPzogc3RyaW5nO1xuICAgICAgYnJvd3Nlcj86IHd4dC5UYXJnZXRCcm93c2VyO1xuICAgICAgbXYzPzogYm9vbGVhbjtcbiAgICAgIG12Mj86IGJvb2xlYW47XG4gICAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgfSxcbiAgXVxuPihhc3luYyAocm9vdCwgZmxhZ3MpID0+IHtcbiAgY29uc3QgY2xpQ29uZmlnOiB3eHQuSW5saW5lQ29uZmlnID0ge1xuICAgIHJvb3QsXG4gICAgbW9kZTogZmxhZ3MubW9kZSxcbiAgICBicm93c2VyOiBmbGFncy5icm93c2VyLFxuICAgIG1hbmlmZXN0VmVyc2lvbjogZmxhZ3MubXYzID8gMyA6IGZsYWdzLm12MiA/IDIgOiB1bmRlZmluZWQsXG4gICAgY29uZmlnRmlsZTogZmxhZ3MuY29uZmlnLFxuICAgIGRlYnVnOiBmbGFncy5kZWJ1ZyxcbiAgfTtcblxuICBjb25zdCBjb25maWcgPSBhd2FpdCBnZXRJbnRlcm5hbENvbmZpZyhjbGlDb25maWcsICdidWlsZCcpO1xuICBjb25zdCBvdXRwdXQgPSBhd2FpdCBidWlsZEludGVybmFsKGNvbmZpZyk7XG4gIGF3YWl0IHppcEV4dGVuc2lvbihjb25maWcsIG91dHB1dCk7XG59KTtcbiIsICJpbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5pbXBvcnQgKiBhcyB3eHQgZnJvbSAnLi4vLi4nO1xuXG5leHBvcnQgY29uc3QgY2xlYW4gPSBkZWZpbmVDb21tYW5kPFxuICBbXG4gICAgcm9vdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiB7XG4gICAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgfSxcbiAgXVxuPih3eHQuY2xlYW4pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUEsMEVBQUFBLFNBQUE7QUFBQTtBQUFBLElBQUFBLFFBQU8sVUFBVTtBQUNqQixVQUFNLE9BQU87QUFFYixRQUFJQyxPQUFLLFFBQVEsSUFBSTtBQUVyQixhQUFTLGFBQWNDLFFBQU0sU0FBUztBQUNwQyxVQUFJLFVBQVUsUUFBUSxZQUFZLFNBQ2hDLFFBQVEsVUFBVSxRQUFRLElBQUk7QUFFaEMsVUFBSSxDQUFDLFNBQVM7QUFDWixlQUFPO0FBQUEsTUFDVDtBQUVBLGdCQUFVLFFBQVEsTUFBTSxHQUFHO0FBQzNCLFVBQUksUUFBUSxRQUFRLEVBQUUsTUFBTSxJQUFJO0FBQzlCLGVBQU87QUFBQSxNQUNUO0FBQ0EsZUFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSztBQUN2QyxZQUFJLElBQUksUUFBUSxDQUFDLEVBQUUsWUFBWTtBQUMvQixZQUFJLEtBQUtBLE9BQUssT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksTUFBTSxHQUFHO0FBQ25ELGlCQUFPO0FBQUEsUUFDVDtBQUFBLE1BQ0Y7QUFDQSxhQUFPO0FBQUEs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O0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUNBO0FBQUEsSUFDQSxVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsSUFDVCxRQUFPO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxJQUNULFFBQU87QUFBQSxFQUNQO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLElBQ1QsUUFBTztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNB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ICJwYXRoIiwgIm1vZHVsZSIsICJmcyIsICJwYXRoIiwgIm1vZHVsZSIsICJmcyIsICJwYXRoIiwgInJlc29sdmUiLCAibW9kdWxlIiwgInBhdGgiLCAicmVzb2x2ZSIsICJtb2R1bGUiLCAicGF0aEtleSIsICJtb2R1bGUiLCAicGF0aCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJwYXRoIiwgIm1vZHVsZSIsICJmcyIsICJtb2R1bGUiLCAicGF0aCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicHJvY2VzcyIsICJ1bmxvYWQiLCAiZW1pdCIsICJsb2FkIiwgInByb2Nlc3NSZWFsbHlFeGl0IiwgInByb2Nlc3NFbWl0IiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2V0U3RyZWFtIiwgInN0cmVhbSIsICJyZXNvbHZlIiwgIm1vZHVsZSIsICJpbXBvcnRfbm9kZV9wYXRoIiwgInZpdGUiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImZzIiwgInBhdGgiLCAiZnMiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJub3JtYWxpemVQYXRoIiwgInBhdGgiLCAibm9kZVBhdGgiLCAicGF0aCIsICJub3JtYWxpemVQYXRoIiwgImltcG9ydF9wYXRoIiwgInVybCIsICJpc09mZmxpbmUiLCAiZG5zIiwgInVybCIsICJ1cmwiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJpbXBvcnRfZnNfZXh0cmEiLCAibm9ybWFsaXplUGF0aCIsICJmcyIsICJpbXBvcnRfcGF0aCIsICJ1bmltcG9ydCIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAibm9ybWFsaXplUGF0aCIsICJmcyIsICJjb25zb2xhIiwgInBhdGgiLCAiZW52IiwgInppcCIsICJnbG9iYWwiLCAiaW1wb3J0X3BpY29jb2xvcnMiLCAibm9ybWFsaXplUGF0aCIsICJpbXBvcnRfY29uc29sYSIsICJpbXBvcnRfbm9kZV9wYXRoIiwgInZpdGUiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImZzIiwgInBhdGgiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJmcyIsICJnbG9iIiwgInBjIiwgImdsb2JhbCIsICJmcyIsICJpbXBvcnRfcGF0aCIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X2xpbmtlZG9tIiwgImltcG9ydF91bmltcG9ydCIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAicGF0aCIsICJub3JtYWxpemVQYXRoIiwgInVuaW1wb3J0IiwgImZzIiwgImNyZWF0ZUpJVEkiLCAiaW1wb3J0X2Zhc3RfZ2xvYiIsICJnbG9iIiwgInBhdGgiLCAiSlNPTjUiLCAiZnMiLCAiaW1wb3J0X3VuaW1wb3J0IiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImZzIiwgInVuaW1wb3J0IiwgIm5vcm1hbGl6ZVBhdGgiLCAicGF0aCIsICJnbG9iYWwiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImZzIiwgImZzIiwgInZlcnNpb24iLCAib3B0aW9ucyIsICJub3JtYWxpemVQYXRoIiwgImltcG9ydF9waWNvY29sb3JzIiwgInZpdGUiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X3BpY29jb2xvcnMiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgInBhdGgiLCAiZnMiLCAicGMiLCAiaW1wb3J0X25vZGVfYnVmZmVyIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X25vZGVfY2hpbGRfcHJvY2VzcyIsICJpbXBvcnRfbm9kZV9wcm9jZXNzIiwgImltcG9ydF9ub2RlX3BhdGgiLCAicHJvY2VzcyIsICJ1cmwiLCAicGF0aCIsICJvbmV0aW1lIiwgImltcG9ydF9ub2RlX3Byb2Nlc3MiLCAiaW1wb3J0X25vZGVfb3MiLCAicHJvY2VzcyIsICJpbXBvcnRfbm9kZV9vcyIsICJvcyIsICJyZXNvbHZlIiwgIm9uRXhpdCIsICJpbXBvcnRfbm9kZV9mcyIsICJtZXJnZVN0cmVhbSIsICJnZXRTdHJlYW0iLCAicmVzb2x2ZSIsICJpbXBvcnRfbm9kZV9jaGlsZF9wcm9jZXNzIiwgImV4cHJlc3Npb24iLCAiaW1wb3J0X25vZGVfcHJvY2VzcyIsICJwcm9jZXNzIiwgInByb2Nlc3MiLCAiY3Jvc3NTcGF3biIsICJwYXRoIiwgImNoaWxkUHJvY2VzcyIsICIkIiwgImltcG9ydF9mYXN0X2dsb2IiLCAicGMiLCAiZnMiLCAiZ2xvYiIsICJ2aXRlIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImlzV3NsIiwgInBhdGgiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJpbXBvcnRfZmFzdF9nbG9iIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfY29uc29sYSIsICJpbXBvcnRfcGljb2NvbG9ycyIsICJwYyIsICJnbG9iIiwgInBhdGgiLCAiZnMiLCAiYnVpbGQiLCAiY3JlYXRlU2VydmVyIiwgInBhdGgiLCAicGMiLCAiaW1wb3J0X2NvbnNvbGEiLCAiaW1wb3J0X3BpY29jb2xvcnMiLCAiaW1wb3J0X2NvbnNvbGEiLCAicGMiLCAiYnVpbGQiLCAiY3JlYXRlU2VydmVyIiwgImltcG9ydF9jb25zb2xhIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImltcG9ydF9waWNvY29sb3JzIiwgInByb21wdHMiLCAicGF0aCIsICJwYyIsICJmcyIsICJpbXBvcnRfY29uc29sYSIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfbWluaW1hdGNoIiwgImZzIiwgInppcGRpciIsICJwYXRoIiwgImNsZWFuIiwgImNhYyIsICJidWlsZCIsICJjbGVhbiJdCn0K
|
|
4835
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2lzZXhlQDIuMC4wL25vZGVfbW9kdWxlcy9pc2V4ZS93aW5kb3dzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9pc2V4ZUAyLjAuMC9ub2RlX21vZHVsZXMvaXNleGUvbW9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vaXNleGVAMi4wLjAvbm9kZV9tb2R1bGVzL2lzZXhlL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS93aGljaEAyLjAuMi9ub2RlX21vZHVsZXMvd2hpY2gvd2hpY2guanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3BhdGgta2V5QDMuMS4xL25vZGVfbW9kdWxlcy9wYXRoLWtleS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY3Jvc3Mtc3Bhd25ANy4wLjMvbm9kZV9tb2R1bGVzL2Nyb3NzLXNwYXduL2xpYi91dGlsL3Jlc29sdmVDb21tYW5kLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jcm9zcy1zcGF3bkA3LjAuMy9ub2RlX21vZHVsZXMvY3Jvc3Mtc3Bhd24vbGliL3V0aWwvZXNjYXBlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9zaGViYW5nLXJlZ2V4QDMuMC4wL25vZGVfbW9kdWxlcy9zaGViYW5nLXJlZ2V4L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9zaGViYW5nLWNvbW1hbmRAMi4wLjAvbm9kZV9tb2R1bGVzL3NoZWJhbmctY29tbWFuZC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY3Jvc3Mtc3Bhd25ANy4wLjMvbm9kZV9tb2R1bGVzL2Nyb3NzLXNwYXduL2xpYi91dGlsL3JlYWRTaGViYW5nLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jcm9zcy1zcGF3bkA3LjAuMy9ub2RlX21vZHVsZXMvY3Jvc3Mtc3Bhd24vbGliL3BhcnNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jcm9zcy1zcGF3bkA3LjAuMy9ub2RlX21vZHVsZXMvY3Jvc3Mtc3Bhd24vbGliL2Vub2VudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY3Jvc3Mtc3Bhd25ANy4wLjMvbm9kZV9tb2R1bGVzL2Nyb3NzLXNwYXduL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9zaWduYWwtZXhpdEAzLjAuNy9ub2RlX21vZHVsZXMvc2lnbmFsLWV4aXQvc2lnbmFscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vc2lnbmFsLWV4aXRAMy4wLjcvbm9kZV9tb2R1bGVzL3NpZ25hbC1leGl0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9nZXQtc3RyZWFtQDYuMC4xL25vZGVfbW9kdWxlcy9nZXQtc3RyZWFtL2J1ZmZlci1zdHJlYW0uanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2dldC1zdHJlYW1ANi4wLjEvbm9kZV9tb2R1bGVzL2dldC1zdHJlYW0vaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21lcmdlLXN0cmVhbUAyLjAuMC9ub2RlX21vZHVsZXMvbWVyZ2Utc3RyZWFtL2luZGV4LmpzIiwgIi4uL3NyYy9jbGkvaW5kZXgudHMiLCAiLi4vcGFja2FnZS5qc29uIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2dldEludGVybmFsQ29uZmlnLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2NyZWF0ZUZzQ2FjaGUudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZnMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZW50cnlwb2ludHMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvcGF0aHMudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL2Rldkh0bWxQcmVyZW5kZXIudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL2RldlNlcnZlckdsb2JhbHMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvbmV0d29yay50cyIsICIuLi9zcmMvY29yZS91dGlscy9wcm9taXNlcy50cyIsICIuLi9zcmMvY29yZS92aXRlLXBsdWdpbnMvZG93bmxvYWQudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL211bHRpcGFnZU1vdmUudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL3VuaW1wb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2F1dG8taW1wb3J0cy50cyIsICIuLi9zcmMvY29yZS92aXRlLXBsdWdpbnMvdmlydHVhbEVudHJ5cG9pbnQudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL3RzY29uZmlnUGF0aHMudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL25vb3BCYWNrZ3JvdW5kLnRzIiwgIi4uL3NyYy9jb3JlL3ZpdGUtcGx1Z2lucy9jc3NFbnRyeXBvaW50cy50cyIsICIuLi9zcmMvY29yZS92aXRlLXBsdWdpbnMvYnVuZGxlQW5hbHlzaXMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZ2xvYmFscy50cyIsICIuLi9zcmMvaW5kZXgudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvYXJyYXlzLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2RldGVjdERldkNoYW5nZXMudHMiLCAiLi4vc3JjL2NvcmUvYnVpbGQvYnVpbGRFbnRyeXBvaW50cy50cyIsICIuLi9zcmMvY29yZS91dGlscy9yZW1vdmVFbXB0eURpcnMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvcHVibGljLnRzIiwgIi4uL3NyYy9jb3JlL2J1aWxkL2ZpbmRFbnRyeXBvaW50cy50cyIsICIuLi9zcmMvY29yZS91dGlscy9pbXBvcnRFbnRyeXBvaW50RmlsZS50cyIsICIuLi9zcmMvY29yZS91dGlscy9zdHJpbmdzLnRzIiwgIi4uL3NyYy9jb3JlL2J1aWxkL2dlbmVyYXRlVHlwZXNEaXIudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvaTE4bi50cyIsICIuLi9zcmMvY29yZS91dGlscy9tYW5pZmVzdC50cyIsICIuLi9zcmMvY29yZS91dGlscy9Db250ZW50U2VjdXJpdHlQb2xpY3kudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvY29udGVudC1zY3JpcHRzLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL3BhY2thZ2UudHMiLCAiLi4vc3JjL2NvcmUvYnVpbGQudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZ3JvdXBFbnRyeXBvaW50cy50cyIsICIuLi9zcmMvY29yZS91dGlscy9mb3JtYXREdXJhdGlvbi50cyIsICIuLi9zcmMvY29yZS9sb2cvcHJpbnRCdWlsZFN1bW1hcnkudHMiLCAiLi4vc3JjL2NvcmUvbG9nL3ByaW50RmlsZUxpc3QudHMiLCAiLi4vc3JjL2NvcmUvbG9nL3ByaW50VGFibGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2V4ZWNhQDcuMi4wL25vZGVfbW9kdWxlcy9leGVjYS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vc3RyaXAtZmluYWwtbmV3bGluZUAzLjAuMC9ub2RlX21vZHVsZXMvc3RyaXAtZmluYWwtbmV3bGluZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbnBtLXJ1bi1wYXRoQDUuMS4wL25vZGVfbW9kdWxlcy9ucG0tcnVuLXBhdGgvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3BhdGgta2V5QDQuMC4wL25vZGVfbW9kdWxlcy9wYXRoLWtleS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbWltaWMtZm5ANC4wLjAvbm9kZV9tb2R1bGVzL21pbWljLWZuL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9vbmV0aW1lQDYuMC4wL25vZGVfbW9kdWxlcy9vbmV0aW1lL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9leGVjYUA3LjIuMC9ub2RlX21vZHVsZXMvZXhlY2EvbGliL2Vycm9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9odW1hbi1zaWduYWxzQDQuMy4xL25vZGVfbW9kdWxlcy9odW1hbi1zaWduYWxzL2J1aWxkL3NyYy9tYWluLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9odW1hbi1zaWduYWxzQDQuMy4xL25vZGVfbW9kdWxlcy9odW1hbi1zaWduYWxzL2J1aWxkL3NyYy9yZWFsdGltZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vaHVtYW4tc2lnbmFsc0A0LjMuMS9ub2RlX21vZHVsZXMvaHVtYW4tc2lnbmFscy9idWlsZC9zcmMvc2lnbmFscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vaHVtYW4tc2lnbmFsc0A0LjMuMS9ub2RlX21vZHVsZXMvaHVtYW4tc2lnbmFscy9idWlsZC9zcmMvY29yZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vZXhlY2FANy4yLjAvbm9kZV9tb2R1bGVzL2V4ZWNhL2xpYi9zdGRpby5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vZXhlY2FANy4yLjAvbm9kZV9tb2R1bGVzL2V4ZWNhL2xpYi9raWxsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9leGVjYUA3LjIuMC9ub2RlX21vZHVsZXMvZXhlY2EvbGliL3BpcGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2lzLXN0cmVhbUAzLjAuMC9ub2RlX21vZHVsZXMvaXMtc3RyZWFtL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9leGVjYUA3LjIuMC9ub2RlX21vZHVsZXMvZXhlY2EvbGliL3N0cmVhbS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vZXhlY2FANy4yLjAvbm9kZV9tb2R1bGVzL2V4ZWNhL2xpYi9wcm9taXNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9leGVjYUA3LjIuMC9ub2RlX21vZHVsZXMvZXhlY2EvbGliL2NvbW1hbmQuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2V4ZWNhQDcuMi4wL25vZGVfbW9kdWxlcy9leGVjYS9saWIvdmVyYm9zZS5qcyIsICIuLi9zcmMvY29yZS9zZXJ2ZXIudHMiLCAiLi4vc3JjL2NvcmUvcnVubmVycy93c2wudHMiLCAiLi4vc3JjL2NvcmUvcnVubmVycy93ZWItZXh0LnRzIiwgIi4uL3NyYy9jb3JlL3J1bm5lcnMvc2FmYXJpLnRzIiwgIi4uL3NyYy9jb3JlL3J1bm5lcnMvbWFudWFsLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL3dzbC50cyIsICIuLi9zcmMvY29yZS9ydW5uZXJzL2luZGV4LnRzIiwgIi4uL3NyYy9jb3JlL2NsZWFuLnRzIiwgIi4uL3NyYy9jbGkvdXRpbHMvZGVmaW5lQ29tbWFuZC50cyIsICIuLi9zcmMvY29yZS9sb2cvcHJpbnRIZWFkZXIudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy9idWlsZC50cyIsICIuLi9zcmMvY2xpL2NvbW1hbmRzL2Rldi50cyIsICIuLi9zcmMvY2xpL2NvbW1hbmRzL2luaXQudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy9wcmVwYXJlLnRzIiwgIi4uL3NyYy9jbGkvY29tbWFuZHMvcHVibGlzaC50cyIsICIuLi9zcmMvY29yZS96aXAudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy96aXAudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy9jbGVhbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsibW9kdWxlLmV4cG9ydHMgPSBpc2V4ZVxuaXNleGUuc3luYyA9IHN5bmNcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKVxuXG5mdW5jdGlvbiBjaGVja1BhdGhFeHQgKHBhdGgsIG9wdGlvbnMpIHtcbiAgdmFyIHBhdGhleHQgPSBvcHRpb25zLnBhdGhFeHQgIT09IHVuZGVmaW5lZCA/XG4gICAgb3B0aW9ucy5wYXRoRXh0IDogcHJvY2Vzcy5lbnYuUEFUSEVYVFxuXG4gIGlmICghcGF0aGV4dCkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBwYXRoZXh0ID0gcGF0aGV4dC5zcGxpdCgnOycpXG4gIGlmIChwYXRoZXh0LmluZGV4T2YoJycpICE9PSAtMSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHAgPSBwYXRoZXh0W2ldLnRvTG93ZXJDYXNlKClcbiAgICBpZiAocCAmJiBwYXRoLnN1YnN0cigtcC5sZW5ndGgpLnRvTG93ZXJDYXNlKCkgPT09IHApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBjaGVja1N0YXQgKHN0YXQsIHBhdGgsIG9wdGlvbnMpIHtcbiAgaWYgKCFzdGF0LmlzU3ltYm9saWNMaW5rKCkgJiYgIXN0YXQuaXNGaWxlKCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gY2hlY2tQYXRoRXh0KHBhdGgsIG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIGlzZXhlIChwYXRoLCBvcHRpb25zLCBjYikge1xuICBmcy5zdGF0KHBhdGgsIGZ1bmN0aW9uIChlciwgc3RhdCkge1xuICAgIGNiKGVyLCBlciA/IGZhbHNlIDogY2hlY2tTdGF0KHN0YXQsIHBhdGgsIG9wdGlvbnMpKVxuICB9KVxufVxuXG5mdW5jdGlvbiBzeW5jIChwYXRoLCBvcHRpb25zKSB7XG4gIHJldHVybiBjaGVja1N0YXQoZnMuc3RhdFN5bmMocGF0aCksIHBhdGgsIG9wdGlvbnMpXG59XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBpc2V4ZVxuaXNleGUuc3luYyA9IHN5bmNcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKVxuXG5mdW5jdGlvbiBpc2V4ZSAocGF0aCwgb3B0aW9ucywgY2IpIHtcbiAgZnMuc3RhdChwYXRoLCBmdW5jdGlvbiAoZXIsIHN0YXQpIHtcbiAgICBjYihlciwgZXIgPyBmYWxzZSA6IGNoZWNrU3RhdChzdGF0LCBvcHRpb25zKSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gc3luYyAocGF0aCwgb3B0aW9ucykge1xuICByZXR1cm4gY2hlY2tTdGF0KGZzLnN0YXRTeW5jKHBhdGgpLCBvcHRpb25zKVxufVxuXG5mdW5jdGlvbiBjaGVja1N0YXQgKHN0YXQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHN0YXQuaXNGaWxlKCkgJiYgY2hlY2tNb2RlKHN0YXQsIG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIGNoZWNrTW9kZSAoc3RhdCwgb3B0aW9ucykge1xuICB2YXIgbW9kID0gc3RhdC5tb2RlXG4gIHZhciB1aWQgPSBzdGF0LnVpZFxuICB2YXIgZ2lkID0gc3RhdC5naWRcblxuICB2YXIgbXlVaWQgPSBvcHRpb25zLnVpZCAhPT0gdW5kZWZpbmVkID9cbiAgICBvcHRpb25zLnVpZCA6IHByb2Nlc3MuZ2V0dWlkICYmIHByb2Nlc3MuZ2V0dWlkKClcbiAgdmFyIG15R2lkID0gb3B0aW9ucy5naWQgIT09IHVuZGVmaW5lZCA/XG4gICAgb3B0aW9ucy5naWQgOiBwcm9jZXNzLmdldGdpZCAmJiBwcm9jZXNzLmdldGdpZCgpXG5cbiAgdmFyIHUgPSBwYXJzZUludCgnMTAwJywgOClcbiAgdmFyIGcgPSBwYXJzZUludCgnMDEwJywgOClcbiAgdmFyIG8gPSBwYXJzZUludCgnMDAxJywgOClcbiAgdmFyIHVnID0gdSB8IGdcblxuICB2YXIgcmV0ID0gKG1vZCAmIG8pIHx8XG4gICAgKG1vZCAmIGcpICYmIGdpZCA9PT0gbXlHaWQgfHxcbiAgICAobW9kICYgdSkgJiYgdWlkID09PSBteVVpZCB8fFxuICAgIChtb2QgJiB1ZykgJiYgbXlVaWQgPT09IDBcblxuICByZXR1cm4gcmV0XG59XG4iLCAidmFyIGZzID0gcmVxdWlyZSgnZnMnKVxudmFyIGNvcmVcbmlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInIHx8IGdsb2JhbC5URVNUSU5HX1dJTkRPV1MpIHtcbiAgY29yZSA9IHJlcXVpcmUoJy4vd2luZG93cy5qcycpXG59IGVsc2Uge1xuICBjb3JlID0gcmVxdWlyZSgnLi9tb2RlLmpzJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc2V4ZVxuaXNleGUuc3luYyA9IHN5bmNcblxuZnVuY3Rpb24gaXNleGUgKHBhdGgsIG9wdGlvbnMsIGNiKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSB7fVxuICB9XG5cbiAgaWYgKCFjYikge1xuICAgIGlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgbm90IHByb3ZpZGVkJylcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgaXNleGUocGF0aCwgb3B0aW9ucyB8fCB7fSwgZnVuY3Rpb24gKGVyLCBpcykge1xuICAgICAgICBpZiAoZXIpIHtcbiAgICAgICAgICByZWplY3QoZXIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZShpcylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgY29yZShwYXRoLCBvcHRpb25zIHx8IHt9LCBmdW5jdGlvbiAoZXIsIGlzKSB7XG4gICAgLy8gaWdub3JlIEVBQ0NFUyBiZWNhdXNlIHRoYXQganVzdCBtZWFucyB3ZSBhcmVuJ3QgYWxsb3dlZCB0byBydW4gaXRcbiAgICBpZiAoZXIpIHtcbiAgICAgIGlmIChlci5jb2RlID09PSAnRUFDQ0VTJyB8fCBvcHRpb25zICYmIG9wdGlvbnMuaWdub3JlRXJyb3JzKSB7XG4gICAgICAgIGVyID0gbnVsbFxuICAgICAgICBpcyA9IGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIGNiKGVyLCBpcylcbiAgfSlcbn1cblxuZnVuY3Rpb24gc3luYyAocGF0aCwgb3B0aW9ucykge1xuICAvLyBteSBraW5nZG9tIGZvciBhIGZpbHRlcmVkIGNhdGNoXG4gIHRyeSB7XG4gICAgcmV0dXJuIGNvcmUuc3luYyhwYXRoLCBvcHRpb25zIHx8IHt9KVxuICB9IGNhdGNoIChlcikge1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaWdub3JlRXJyb3JzIHx8IGVyLmNvZGUgPT09ICdFQUNDRVMnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJcbiAgICB9XG4gIH1cbn1cbiIsICJjb25zdCBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInIHx8XG4gICAgcHJvY2Vzcy5lbnYuT1NUWVBFID09PSAnY3lnd2luJyB8fFxuICAgIHByb2Nlc3MuZW52Lk9TVFlQRSA9PT0gJ21zeXMnXG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IENPTE9OID0gaXNXaW5kb3dzID8gJzsnIDogJzonXG5jb25zdCBpc2V4ZSA9IHJlcXVpcmUoJ2lzZXhlJylcblxuY29uc3QgZ2V0Tm90Rm91bmRFcnJvciA9IChjbWQpID0+XG4gIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBub3QgZm91bmQ6ICR7Y21kfWApLCB7IGNvZGU6ICdFTk9FTlQnIH0pXG5cbmNvbnN0IGdldFBhdGhJbmZvID0gKGNtZCwgb3B0KSA9PiB7XG4gIGNvbnN0IGNvbG9uID0gb3B0LmNvbG9uIHx8IENPTE9OXG5cbiAgLy8gSWYgaXQgaGFzIGEgc2xhc2gsIHRoZW4gd2UgZG9uJ3QgYm90aGVyIHNlYXJjaGluZyB0aGUgcGF0aGVudi5cbiAgLy8ganVzdCBjaGVjayB0aGUgZmlsZSBpdHNlbGYsIGFuZCB0aGF0J3MgaXQuXG4gIGNvbnN0IHBhdGhFbnYgPSBjbWQubWF0Y2goL1xcLy8pIHx8IGlzV2luZG93cyAmJiBjbWQubWF0Y2goL1xcXFwvKSA/IFsnJ11cbiAgICA6IChcbiAgICAgIFtcbiAgICAgICAgLy8gd2luZG93cyBhbHdheXMgY2hlY2tzIHRoZSBjd2QgZmlyc3RcbiAgICAgICAgLi4uKGlzV2luZG93cyA/IFtwcm9jZXNzLmN3ZCgpXSA6IFtdKSxcbiAgICAgICAgLi4uKG9wdC5wYXRoIHx8IHByb2Nlc3MuZW52LlBBVEggfHxcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogdmVyeSB1bnVzdWFsICovICcnKS5zcGxpdChjb2xvbiksXG4gICAgICBdXG4gICAgKVxuICBjb25zdCBwYXRoRXh0RXhlID0gaXNXaW5kb3dzXG4gICAgPyBvcHQucGF0aEV4dCB8fCBwcm9jZXNzLmVudi5QQVRIRVhUIHx8ICcuRVhFOy5DTUQ7LkJBVDsuQ09NJ1xuICAgIDogJydcbiAgY29uc3QgcGF0aEV4dCA9IGlzV2luZG93cyA/IHBhdGhFeHRFeGUuc3BsaXQoY29sb24pIDogWycnXVxuXG4gIGlmIChpc1dpbmRvd3MpIHtcbiAgICBpZiAoY21kLmluZGV4T2YoJy4nKSAhPT0gLTEgJiYgcGF0aEV4dFswXSAhPT0gJycpXG4gICAgICBwYXRoRXh0LnVuc2hpZnQoJycpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhdGhFbnYsXG4gICAgcGF0aEV4dCxcbiAgICBwYXRoRXh0RXhlLFxuICB9XG59XG5cbmNvbnN0IHdoaWNoID0gKGNtZCwgb3B0LCBjYikgPT4ge1xuICBpZiAodHlwZW9mIG9wdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gb3B0XG4gICAgb3B0ID0ge31cbiAgfVxuICBpZiAoIW9wdClcbiAgICBvcHQgPSB7fVxuXG4gIGNvbnN0IHsgcGF0aEVudiwgcGF0aEV4dCwgcGF0aEV4dEV4ZSB9ID0gZ2V0UGF0aEluZm8oY21kLCBvcHQpXG4gIGNvbnN0IGZvdW5kID0gW11cblxuICBjb25zdCBzdGVwID0gaSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaWYgKGkgPT09IHBhdGhFbnYubGVuZ3RoKVxuICAgICAgcmV0dXJuIG9wdC5hbGwgJiYgZm91bmQubGVuZ3RoID8gcmVzb2x2ZShmb3VuZClcbiAgICAgICAgOiByZWplY3QoZ2V0Tm90Rm91bmRFcnJvcihjbWQpKVxuXG4gICAgY29uc3QgcHBSYXcgPSBwYXRoRW52W2ldXG4gICAgY29uc3QgcGF0aFBhcnQgPSAvXlwiLipcIiQvLnRlc3QocHBSYXcpID8gcHBSYXcuc2xpY2UoMSwgLTEpIDogcHBSYXdcblxuICAgIGNvbnN0IHBDbWQgPSBwYXRoLmpvaW4ocGF0aFBhcnQsIGNtZClcbiAgICBjb25zdCBwID0gIXBhdGhQYXJ0ICYmIC9eXFwuW1xcXFxcXC9dLy50ZXN0KGNtZCkgPyBjbWQuc2xpY2UoMCwgMikgKyBwQ21kXG4gICAgICA6IHBDbWRcblxuICAgIHJlc29sdmUoc3ViU3RlcChwLCBpLCAwKSlcbiAgfSlcblxuICBjb25zdCBzdWJTdGVwID0gKHAsIGksIGlpKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaWYgKGlpID09PSBwYXRoRXh0Lmxlbmd0aClcbiAgICAgIHJldHVybiByZXNvbHZlKHN0ZXAoaSArIDEpKVxuICAgIGNvbnN0IGV4dCA9IHBhdGhFeHRbaWldXG4gICAgaXNleGUocCArIGV4dCwgeyBwYXRoRXh0OiBwYXRoRXh0RXhlIH0sIChlciwgaXMpID0+IHtcbiAgICAgIGlmICghZXIgJiYgaXMpIHtcbiAgICAgICAgaWYgKG9wdC5hbGwpXG4gICAgICAgICAgZm91bmQucHVzaChwICsgZXh0KVxuICAgICAgICBlbHNlXG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUocCArIGV4dClcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNvbHZlKHN1YlN0ZXAocCwgaSwgaWkgKyAxKSlcbiAgICB9KVxuICB9KVxuXG4gIHJldHVybiBjYiA/IHN0ZXAoMCkudGhlbihyZXMgPT4gY2IobnVsbCwgcmVzKSwgY2IpIDogc3RlcCgwKVxufVxuXG5jb25zdCB3aGljaFN5bmMgPSAoY21kLCBvcHQpID0+IHtcbiAgb3B0ID0gb3B0IHx8IHt9XG5cbiAgY29uc3QgeyBwYXRoRW52LCBwYXRoRXh0LCBwYXRoRXh0RXhlIH0gPSBnZXRQYXRoSW5mbyhjbWQsIG9wdClcbiAgY29uc3QgZm91bmQgPSBbXVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aEVudi5sZW5ndGg7IGkgKyspIHtcbiAgICBjb25zdCBwcFJhdyA9IHBhdGhFbnZbaV1cbiAgICBjb25zdCBwYXRoUGFydCA9IC9eXCIuKlwiJC8udGVzdChwcFJhdykgPyBwcFJhdy5zbGljZSgxLCAtMSkgOiBwcFJhd1xuXG4gICAgY29uc3QgcENtZCA9IHBhdGguam9pbihwYXRoUGFydCwgY21kKVxuICAgIGNvbnN0IHAgPSAhcGF0aFBhcnQgJiYgL15cXC5bXFxcXFxcL10vLnRlc3QoY21kKSA/IGNtZC5zbGljZSgwLCAyKSArIHBDbWRcbiAgICAgIDogcENtZFxuXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBwYXRoRXh0Lmxlbmd0aDsgaiArKykge1xuICAgICAgY29uc3QgY3VyID0gcCArIHBhdGhFeHRbal1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGlzID0gaXNleGUuc3luYyhjdXIsIHsgcGF0aEV4dDogcGF0aEV4dEV4ZSB9KVxuICAgICAgICBpZiAoaXMpIHtcbiAgICAgICAgICBpZiAob3B0LmFsbClcbiAgICAgICAgICAgIGZvdW5kLnB1c2goY3VyKVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBjdXJcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXgpIHt9XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdC5hbGwgJiYgZm91bmQubGVuZ3RoKVxuICAgIHJldHVybiBmb3VuZFxuXG4gIGlmIChvcHQubm90aHJvdylcbiAgICByZXR1cm4gbnVsbFxuXG4gIHRocm93IGdldE5vdEZvdW5kRXJyb3IoY21kKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdoaWNoXG53aGljaC5zeW5jID0gd2hpY2hTeW5jXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXRoS2V5ID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuXHRjb25zdCBlbnZpcm9ubWVudCA9IG9wdGlvbnMuZW52IHx8IHByb2Nlc3MuZW52O1xuXHRjb25zdCBwbGF0Zm9ybSA9IG9wdGlvbnMucGxhdGZvcm0gfHwgcHJvY2Vzcy5wbGF0Zm9ybTtcblxuXHRpZiAocGxhdGZvcm0gIT09ICd3aW4zMicpIHtcblx0XHRyZXR1cm4gJ1BBVEgnO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdC5rZXlzKGVudmlyb25tZW50KS5yZXZlcnNlKCkuZmluZChrZXkgPT4ga2V5LnRvVXBwZXJDYXNlKCkgPT09ICdQQVRIJykgfHwgJ1BhdGgnO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoS2V5O1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgZm9yIHRoZSBuZXh0IG1ham9yIHJlbGVhc2Vcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBwYXRoS2V5O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IHdoaWNoID0gcmVxdWlyZSgnd2hpY2gnKTtcbmNvbnN0IGdldFBhdGhLZXkgPSByZXF1aXJlKCdwYXRoLWtleScpO1xuXG5mdW5jdGlvbiByZXNvbHZlQ29tbWFuZEF0dGVtcHQocGFyc2VkLCB3aXRob3V0UGF0aEV4dCkge1xuICAgIGNvbnN0IGVudiA9IHBhcnNlZC5vcHRpb25zLmVudiB8fCBwcm9jZXNzLmVudjtcbiAgICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IGhhc0N1c3RvbUN3ZCA9IHBhcnNlZC5vcHRpb25zLmN3ZCAhPSBudWxsO1xuICAgIC8vIFdvcmtlciB0aHJlYWRzIGRvIG5vdCBoYXZlIHByb2Nlc3MuY2hkaXIoKVxuICAgIGNvbnN0IHNob3VsZFN3aXRjaEN3ZCA9IGhhc0N1c3RvbUN3ZCAmJiBwcm9jZXNzLmNoZGlyICE9PSB1bmRlZmluZWQgJiYgIXByb2Nlc3MuY2hkaXIuZGlzYWJsZWQ7XG5cbiAgICAvLyBJZiBhIGN1c3RvbSBgY3dkYCB3YXMgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgcHJvY2VzcyBjd2RcbiAgICAvLyBiZWNhdXNlIGB3aGljaGAgd2lsbCBkbyBzdGF0IGNhbGxzIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IGEgY3VzdG9tIGN3ZFxuICAgIGlmIChzaG91bGRTd2l0Y2hDd2QpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb2Nlc3MuY2hkaXIocGFyc2VkLm9wdGlvbnMuY3dkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvKiBFbXB0eSAqL1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHJlc29sdmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgcmVzb2x2ZWQgPSB3aGljaC5zeW5jKHBhcnNlZC5jb21tYW5kLCB7XG4gICAgICAgICAgICBwYXRoOiBlbnZbZ2V0UGF0aEtleSh7IGVudiB9KV0sXG4gICAgICAgICAgICBwYXRoRXh0OiB3aXRob3V0UGF0aEV4dCA/IHBhdGguZGVsaW1pdGVyIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8qIEVtcHR5ICovXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHNob3VsZFN3aXRjaEN3ZCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5jaGRpcihjd2QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgd2Ugc3VjY2Vzc2Z1bGx5IHJlc29sdmVkLCBlbnN1cmUgdGhhdCBhbiBhYnNvbHV0ZSBwYXRoIGlzIHJldHVybmVkXG4gICAgLy8gTm90ZSB0aGF0IHdoZW4gYSBjdXN0b20gYGN3ZGAgd2FzIHVzZWQsIHdlIG5lZWQgdG8gcmVzb2x2ZSB0byBhbiBhYnNvbHV0ZSBwYXRoIGJhc2VkIG9uIGl0XG4gICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICAgIHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKGhhc0N1c3RvbUN3ZCA/IHBhcnNlZC5vcHRpb25zLmN3ZCA6ICcnLCByZXNvbHZlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQ29tbWFuZChwYXJzZWQpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUNvbW1hbmRBdHRlbXB0KHBhcnNlZCkgfHwgcmVzb2x2ZUNvbW1hbmRBdHRlbXB0KHBhcnNlZCwgdHJ1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVzb2x2ZUNvbW1hbmQ7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vLyBTZWUgaHR0cDovL3d3dy5yb2J2YW5kZXJ3b3VkZS5jb20vZXNjYXBlY2hhcnMucGhwXG5jb25zdCBtZXRhQ2hhcnNSZWdFeHAgPSAvKFsoKVxcXVslIV5cImA8PiZ8OywgKj9dKS9nO1xuXG5mdW5jdGlvbiBlc2NhcGVDb21tYW5kKGFyZykge1xuICAgIC8vIEVzY2FwZSBtZXRhIGNoYXJzXG4gICAgYXJnID0gYXJnLnJlcGxhY2UobWV0YUNoYXJzUmVnRXhwLCAnXiQxJyk7XG5cbiAgICByZXR1cm4gYXJnO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVBcmd1bWVudChhcmcsIGRvdWJsZUVzY2FwZU1ldGFDaGFycykge1xuICAgIC8vIENvbnZlcnQgdG8gc3RyaW5nXG4gICAgYXJnID0gYCR7YXJnfWA7XG5cbiAgICAvLyBBbGdvcml0aG0gYmVsb3cgaXMgYmFzZWQgb24gaHR0cHM6Ly9xbnRtLm9yZy9jbWRcblxuICAgIC8vIFNlcXVlbmNlIG9mIGJhY2tzbGFzaGVzIGZvbGxvd2VkIGJ5IGEgZG91YmxlIHF1b3RlOlxuICAgIC8vIGRvdWJsZSB1cCBhbGwgdGhlIGJhY2tzbGFzaGVzIGFuZCBlc2NhcGUgdGhlIGRvdWJsZSBxdW90ZVxuICAgIGFyZyA9IGFyZy5yZXBsYWNlKC8oXFxcXCopXCIvZywgJyQxJDFcXFxcXCInKTtcblxuICAgIC8vIFNlcXVlbmNlIG9mIGJhY2tzbGFzaGVzIGZvbGxvd2VkIGJ5IHRoZSBlbmQgb2YgdGhlIHN0cmluZ1xuICAgIC8vICh3aGljaCB3aWxsIGJlY29tZSBhIGRvdWJsZSBxdW90ZSBsYXRlcik6XG4gICAgLy8gZG91YmxlIHVwIGFsbCB0aGUgYmFja3NsYXNoZXNcbiAgICBhcmcgPSBhcmcucmVwbGFjZSgvKFxcXFwqKSQvLCAnJDEkMScpO1xuXG4gICAgLy8gQWxsIG90aGVyIGJhY2tzbGFzaGVzIG9jY3VyIGxpdGVyYWxseVxuXG4gICAgLy8gUXVvdGUgdGhlIHdob2xlIHRoaW5nOlxuICAgIGFyZyA9IGBcIiR7YXJnfVwiYDtcblxuICAgIC8vIEVzY2FwZSBtZXRhIGNoYXJzXG4gICAgYXJnID0gYXJnLnJlcGxhY2UobWV0YUNoYXJzUmVnRXhwLCAnXiQxJyk7XG5cbiAgICAvLyBEb3VibGUgZXNjYXBlIG1ldGEgY2hhcnMgaWYgbmVjZXNzYXJ5XG4gICAgaWYgKGRvdWJsZUVzY2FwZU1ldGFDaGFycykge1xuICAgICAgICBhcmcgPSBhcmcucmVwbGFjZShtZXRhQ2hhcnNSZWdFeHAsICdeJDEnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJnO1xufVxuXG5tb2R1bGUuZXhwb3J0cy5jb21tYW5kID0gZXNjYXBlQ29tbWFuZDtcbm1vZHVsZS5leHBvcnRzLmFyZ3VtZW50ID0gZXNjYXBlQXJndW1lbnQ7XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSAvXiMhKC4qKS87XG4iLCAiJ3VzZSBzdHJpY3QnO1xuY29uc3Qgc2hlYmFuZ1JlZ2V4ID0gcmVxdWlyZSgnc2hlYmFuZy1yZWdleCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChzdHJpbmcgPSAnJykgPT4ge1xuXHRjb25zdCBtYXRjaCA9IHN0cmluZy5tYXRjaChzaGViYW5nUmVnZXgpO1xuXG5cdGlmICghbWF0Y2gpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGNvbnN0IFtwYXRoLCBhcmd1bWVudF0gPSBtYXRjaFswXS5yZXBsYWNlKC8jISA/LywgJycpLnNwbGl0KCcgJyk7XG5cdGNvbnN0IGJpbmFyeSA9IHBhdGguc3BsaXQoJy8nKS5wb3AoKTtcblxuXHRpZiAoYmluYXJ5ID09PSAnZW52Jykge1xuXHRcdHJldHVybiBhcmd1bWVudDtcblx0fVxuXG5cdHJldHVybiBhcmd1bWVudCA/IGAke2JpbmFyeX0gJHthcmd1bWVudH1gIDogYmluYXJ5O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHNoZWJhbmdDb21tYW5kID0gcmVxdWlyZSgnc2hlYmFuZy1jb21tYW5kJyk7XG5cbmZ1bmN0aW9uIHJlYWRTaGViYW5nKGNvbW1hbmQpIHtcbiAgICAvLyBSZWFkIHRoZSBmaXJzdCAxNTAgYnl0ZXMgZnJvbSB0aGUgZmlsZVxuICAgIGNvbnN0IHNpemUgPSAxNTA7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuXG4gICAgbGV0IGZkO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgZmQgPSBmcy5vcGVuU3luYyhjb21tYW5kLCAncicpO1xuICAgICAgICBmcy5yZWFkU3luYyhmZCwgYnVmZmVyLCAwLCBzaXplLCAwKTtcbiAgICAgICAgZnMuY2xvc2VTeW5jKGZkKTtcbiAgICB9IGNhdGNoIChlKSB7IC8qIEVtcHR5ICovIH1cblxuICAgIC8vIEF0dGVtcHQgdG8gZXh0cmFjdCBzaGViYW5nIChudWxsIGlzIHJldHVybmVkIGlmIG5vdCBhIHNoZWJhbmcpXG4gICAgcmV0dXJuIHNoZWJhbmdDb21tYW5kKGJ1ZmZlci50b1N0cmluZygpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWFkU2hlYmFuZztcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCByZXNvbHZlQ29tbWFuZCA9IHJlcXVpcmUoJy4vdXRpbC9yZXNvbHZlQ29tbWFuZCcpO1xuY29uc3QgZXNjYXBlID0gcmVxdWlyZSgnLi91dGlsL2VzY2FwZScpO1xuY29uc3QgcmVhZFNoZWJhbmcgPSByZXF1aXJlKCcuL3V0aWwvcmVhZFNoZWJhbmcnKTtcblxuY29uc3QgaXNXaW4gPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuY29uc3QgaXNFeGVjdXRhYmxlUmVnRXhwID0gL1xcLig/OmNvbXxleGUpJC9pO1xuY29uc3QgaXNDbWRTaGltUmVnRXhwID0gL25vZGVfbW9kdWxlc1tcXFxcL10uYmluW1xcXFwvXVteXFxcXC9dK1xcLmNtZCQvaTtcblxuZnVuY3Rpb24gZGV0ZWN0U2hlYmFuZyhwYXJzZWQpIHtcbiAgICBwYXJzZWQuZmlsZSA9IHJlc29sdmVDb21tYW5kKHBhcnNlZCk7XG5cbiAgICBjb25zdCBzaGViYW5nID0gcGFyc2VkLmZpbGUgJiYgcmVhZFNoZWJhbmcocGFyc2VkLmZpbGUpO1xuXG4gICAgaWYgKHNoZWJhbmcpIHtcbiAgICAgICAgcGFyc2VkLmFyZ3MudW5zaGlmdChwYXJzZWQuZmlsZSk7XG4gICAgICAgIHBhcnNlZC5jb21tYW5kID0gc2hlYmFuZztcblxuICAgICAgICByZXR1cm4gcmVzb2x2ZUNvbW1hbmQocGFyc2VkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkLmZpbGU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTm9uU2hlbGwocGFyc2VkKSB7XG4gICAgaWYgKCFpc1dpbikge1xuICAgICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cblxuICAgIC8vIERldGVjdCAmIGFkZCBzdXBwb3J0IGZvciBzaGViYW5nc1xuICAgIGNvbnN0IGNvbW1hbmRGaWxlID0gZGV0ZWN0U2hlYmFuZyhwYXJzZWQpO1xuXG4gICAgLy8gV2UgZG9uJ3QgbmVlZCBhIHNoZWxsIGlmIHRoZSBjb21tYW5kIGZpbGVuYW1lIGlzIGFuIGV4ZWN1dGFibGVcbiAgICBjb25zdCBuZWVkc1NoZWxsID0gIWlzRXhlY3V0YWJsZVJlZ0V4cC50ZXN0KGNvbW1hbmRGaWxlKTtcblxuICAgIC8vIElmIGEgc2hlbGwgaXMgcmVxdWlyZWQsIHVzZSBjbWQuZXhlIGFuZCB0YWtlIGNhcmUgb2YgZXNjYXBpbmcgZXZlcnl0aGluZyBjb3JyZWN0bHlcbiAgICAvLyBOb3RlIHRoYXQgYGZvcmNlU2hlbGxgIGlzIGFuIGhpZGRlbiBvcHRpb24gdXNlZCBvbmx5IGluIHRlc3RzXG4gICAgaWYgKHBhcnNlZC5vcHRpb25zLmZvcmNlU2hlbGwgfHwgbmVlZHNTaGVsbCkge1xuICAgICAgICAvLyBOZWVkIHRvIGRvdWJsZSBlc2NhcGUgbWV0YSBjaGFycyBpZiB0aGUgY29tbWFuZCBpcyBhIGNtZC1zaGltIGxvY2F0ZWQgaW4gYG5vZGVfbW9kdWxlcy8uYmluL2BcbiAgICAgICAgLy8gVGhlIGNtZC1zaGltIHNpbXBseSBjYWxscyBleGVjdXRlIHRoZSBwYWNrYWdlIGJpbiBmaWxlIHdpdGggTm9kZUpTLCBwcm94eWluZyBhbnkgYXJndW1lbnRcbiAgICAgICAgLy8gQmVjYXVzZSB0aGUgZXNjYXBlIG9mIG1ldGFjaGFycyB3aXRoIF4gZ2V0cyBpbnRlcnByZXRlZCB3aGVuIHRoZSBjbWQuZXhlIGlzIGZpcnN0IGNhbGxlZCxcbiAgICAgICAgLy8gd2UgbmVlZCB0byBkb3VibGUgZXNjYXBlIHRoZW1cbiAgICAgICAgY29uc3QgbmVlZHNEb3VibGVFc2NhcGVNZXRhQ2hhcnMgPSBpc0NtZFNoaW1SZWdFeHAudGVzdChjb21tYW5kRmlsZSk7XG5cbiAgICAgICAgLy8gTm9ybWFsaXplIHBvc2l4IHBhdGhzIGludG8gT1MgY29tcGF0aWJsZSBwYXRocyAoZS5nLjogZm9vL2JhciAtPiBmb29cXGJhcilcbiAgICAgICAgLy8gVGhpcyBpcyBuZWNlc3Nhcnkgb3RoZXJ3aXNlIGl0IHdpbGwgYWx3YXlzIGZhaWwgd2l0aCBFTk9FTlQgaW4gdGhvc2UgY2FzZXNcbiAgICAgICAgcGFyc2VkLmNvbW1hbmQgPSBwYXRoLm5vcm1hbGl6ZShwYXJzZWQuY29tbWFuZCk7XG5cbiAgICAgICAgLy8gRXNjYXBlIGNvbW1hbmQgJiBhcmd1bWVudHNcbiAgICAgICAgcGFyc2VkLmNvbW1hbmQgPSBlc2NhcGUuY29tbWFuZChwYXJzZWQuY29tbWFuZCk7XG4gICAgICAgIHBhcnNlZC5hcmdzID0gcGFyc2VkLmFyZ3MubWFwKChhcmcpID0+IGVzY2FwZS5hcmd1bWVudChhcmcsIG5lZWRzRG91YmxlRXNjYXBlTWV0YUNoYXJzKSk7XG5cbiAgICAgICAgY29uc3Qgc2hlbGxDb21tYW5kID0gW3BhcnNlZC5jb21tYW5kXS5jb25jYXQocGFyc2VkLmFyZ3MpLmpvaW4oJyAnKTtcblxuICAgICAgICBwYXJzZWQuYXJncyA9IFsnL2QnLCAnL3MnLCAnL2MnLCBgXCIke3NoZWxsQ29tbWFuZH1cImBdO1xuICAgICAgICBwYXJzZWQuY29tbWFuZCA9IHByb2Nlc3MuZW52LmNvbXNwZWMgfHwgJ2NtZC5leGUnO1xuICAgICAgICBwYXJzZWQub3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHMgPSB0cnVlOyAvLyBUZWxsIG5vZGUncyBzcGF3biB0aGF0IHRoZSBhcmd1bWVudHMgYXJlIGFscmVhZHkgZXNjYXBlZFxuICAgIH1cblxuICAgIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlKGNvbW1hbmQsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICAvLyBOb3JtYWxpemUgYXJndW1lbnRzLCBzaW1pbGFyIHRvIG5vZGVqc1xuICAgIGlmIChhcmdzICYmICFBcnJheS5pc0FycmF5KGFyZ3MpKSB7XG4gICAgICAgIG9wdGlvbnMgPSBhcmdzO1xuICAgICAgICBhcmdzID0gbnVsbDtcbiAgICB9XG5cbiAgICBhcmdzID0gYXJncyA/IGFyZ3Muc2xpY2UoMCkgOiBbXTsgLy8gQ2xvbmUgYXJyYXkgdG8gYXZvaWQgY2hhbmdpbmcgdGhlIG9yaWdpbmFsXG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpOyAvLyBDbG9uZSBvYmplY3QgdG8gYXZvaWQgY2hhbmdpbmcgdGhlIG9yaWdpbmFsXG5cbiAgICAvLyBCdWlsZCBvdXIgcGFyc2VkIG9iamVjdFxuICAgIGNvbnN0IHBhcnNlZCA9IHtcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgYXJncyxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgZmlsZTogdW5kZWZpbmVkLFxuICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIERlbGVnYXRlIGZ1cnRoZXIgcGFyc2luZyB0byBzaGVsbCBvciBub24tc2hlbGxcbiAgICByZXR1cm4gb3B0aW9ucy5zaGVsbCA/IHBhcnNlZCA6IHBhcnNlTm9uU2hlbGwocGFyc2VkKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzV2luID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcblxuZnVuY3Rpb24gbm90Rm91bmRFcnJvcihvcmlnaW5hbCwgc3lzY2FsbCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgJHtzeXNjYWxsfSAke29yaWdpbmFsLmNvbW1hbmR9IEVOT0VOVGApLCB7XG4gICAgICAgIGNvZGU6ICdFTk9FTlQnLFxuICAgICAgICBlcnJubzogJ0VOT0VOVCcsXG4gICAgICAgIHN5c2NhbGw6IGAke3N5c2NhbGx9ICR7b3JpZ2luYWwuY29tbWFuZH1gLFxuICAgICAgICBwYXRoOiBvcmlnaW5hbC5jb21tYW5kLFxuICAgICAgICBzcGF3bmFyZ3M6IG9yaWdpbmFsLmFyZ3MsXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGhvb2tDaGlsZFByb2Nlc3MoY3AsIHBhcnNlZCkge1xuICAgIGlmICghaXNXaW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsRW1pdCA9IGNwLmVtaXQ7XG5cbiAgICBjcC5lbWl0ID0gZnVuY3Rpb24gKG5hbWUsIGFyZzEpIHtcbiAgICAgICAgLy8gSWYgZW1pdHRpbmcgXCJleGl0XCIgZXZlbnQgYW5kIGV4aXQgY29kZSBpcyAxLCB3ZSBuZWVkIHRvIGNoZWNrIGlmXG4gICAgICAgIC8vIHRoZSBjb21tYW5kIGV4aXN0cyBhbmQgZW1pdCBhbiBcImVycm9yXCIgaW5zdGVhZFxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0luZGlnb1VuaXRlZC9ub2RlLWNyb3NzLXNwYXduL2lzc3Vlcy8xNlxuICAgICAgICBpZiAobmFtZSA9PT0gJ2V4aXQnKSB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSB2ZXJpZnlFTk9FTlQoYXJnMSwgcGFyc2VkLCAnc3Bhd24nKTtcblxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEVtaXQuY2FsbChjcCwgJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcmlnaW5hbEVtaXQuYXBwbHkoY3AsIGFyZ3VtZW50cyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5RU5PRU5UKHN0YXR1cywgcGFyc2VkKSB7XG4gICAgaWYgKGlzV2luICYmIHN0YXR1cyA9PT0gMSAmJiAhcGFyc2VkLmZpbGUpIHtcbiAgICAgICAgcmV0dXJuIG5vdEZvdW5kRXJyb3IocGFyc2VkLm9yaWdpbmFsLCAnc3Bhd24nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5RU5PRU5UU3luYyhzdGF0dXMsIHBhcnNlZCkge1xuICAgIGlmIChpc1dpbiAmJiBzdGF0dXMgPT09IDEgJiYgIXBhcnNlZC5maWxlKSB7XG4gICAgICAgIHJldHVybiBub3RGb3VuZEVycm9yKHBhcnNlZC5vcmlnaW5hbCwgJ3NwYXduU3luYycpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBob29rQ2hpbGRQcm9jZXNzLFxuICAgIHZlcmlmeUVOT0VOVCxcbiAgICB2ZXJpZnlFTk9FTlRTeW5jLFxuICAgIG5vdEZvdW5kRXJyb3IsXG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgY3AgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7XG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vbGliL3BhcnNlJyk7XG5jb25zdCBlbm9lbnQgPSByZXF1aXJlKCcuL2xpYi9lbm9lbnQnKTtcblxuZnVuY3Rpb24gc3Bhd24oY29tbWFuZCwgYXJncywgb3B0aW9ucykge1xuICAgIC8vIFBhcnNlIHRoZSBhcmd1bWVudHNcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZShjb21tYW5kLCBhcmdzLCBvcHRpb25zKTtcblxuICAgIC8vIFNwYXduIHRoZSBjaGlsZCBwcm9jZXNzXG4gICAgY29uc3Qgc3Bhd25lZCA9IGNwLnNwYXduKHBhcnNlZC5jb21tYW5kLCBwYXJzZWQuYXJncywgcGFyc2VkLm9wdGlvbnMpO1xuXG4gICAgLy8gSG9vayBpbnRvIGNoaWxkIHByb2Nlc3MgXCJleGl0XCIgZXZlbnQgdG8gZW1pdCBhbiBlcnJvciBpZiB0aGUgY29tbWFuZFxuICAgIC8vIGRvZXMgbm90IGV4aXN0cywgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vSW5kaWdvVW5pdGVkL25vZGUtY3Jvc3Mtc3Bhd24vaXNzdWVzLzE2XG4gICAgZW5vZW50Lmhvb2tDaGlsZFByb2Nlc3Moc3Bhd25lZCwgcGFyc2VkKTtcblxuICAgIHJldHVybiBzcGF3bmVkO1xufVxuXG5mdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZCwgYXJncywgb3B0aW9ucykge1xuICAgIC8vIFBhcnNlIHRoZSBhcmd1bWVudHNcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZShjb21tYW5kLCBhcmdzLCBvcHRpb25zKTtcblxuICAgIC8vIFNwYXduIHRoZSBjaGlsZCBwcm9jZXNzXG4gICAgY29uc3QgcmVzdWx0ID0gY3Auc3Bhd25TeW5jKHBhcnNlZC5jb21tYW5kLCBwYXJzZWQuYXJncywgcGFyc2VkLm9wdGlvbnMpO1xuXG4gICAgLy8gQW5hbHl6ZSBpZiB0aGUgY29tbWFuZCBkb2VzIG5vdCBleGlzdCwgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vSW5kaWdvVW5pdGVkL25vZGUtY3Jvc3Mtc3Bhd24vaXNzdWVzLzE2XG4gICAgcmVzdWx0LmVycm9yID0gcmVzdWx0LmVycm9yIHx8IGVub2VudC52ZXJpZnlFTk9FTlRTeW5jKHJlc3VsdC5zdGF0dXMsIHBhcnNlZCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNwYXduO1xubW9kdWxlLmV4cG9ydHMuc3Bhd24gPSBzcGF3bjtcbm1vZHVsZS5leHBvcnRzLnN5bmMgPSBzcGF3blN5bmM7XG5cbm1vZHVsZS5leHBvcnRzLl9wYXJzZSA9IHBhcnNlO1xubW9kdWxlLmV4cG9ydHMuX2Vub2VudCA9IGVub2VudDtcbiIsICIvLyBUaGlzIGlzIG5vdCB0aGUgc2V0IG9mIGFsbCBwb3NzaWJsZSBzaWduYWxzLlxuLy9cbi8vIEl0IElTLCBob3dldmVyLCB0aGUgc2V0IG9mIGFsbCBzaWduYWxzIHRoYXQgdHJpZ2dlclxuLy8gYW4gZXhpdCBvbiBlaXRoZXIgTGludXggb3IgQlNEIHN5c3RlbXMuICBMaW51eCBpcyBhXG4vLyBzdXBlcnNldCBvZiB0aGUgc2lnbmFsIG5hbWVzIHN1cHBvcnRlZCBvbiBCU0QsIGFuZFxuLy8gdGhlIHVua25vd24gc2lnbmFscyBqdXN0IGZhaWwgdG8gcmVnaXN0ZXIsIHNvIHdlIGNhblxuLy8gY2F0Y2ggdGhhdCBlYXNpbHkgZW5vdWdoLlxuLy9cbi8vIERvbid0IGJvdGhlciB3aXRoIFNJR0tJTEwuICBJdCdzIHVuY2F0Y2hhYmxlLCB3aGljaFxuLy8gbWVhbnMgdGhhdCB3ZSBjYW4ndCBmaXJlIGFueSBjYWxsYmFja3MgYW55d2F5LlxuLy9cbi8vIElmIGEgdXNlciBkb2VzIGhhcHBlbiB0byByZWdpc3RlciBhIGhhbmRsZXIgb24gYSBub24tXG4vLyBmYXRhbCBzaWduYWwgbGlrZSBTSUdXSU5DSCBvciBzb21ldGhpbmcsIGFuZCB0aGVuXG4vLyBleGl0LCBpdCdsbCBlbmQgdXAgZmlyaW5nIGBwcm9jZXNzLmVtaXQoJ2V4aXQnKWAsIHNvXG4vLyB0aGUgaGFuZGxlciB3aWxsIGJlIGZpcmVkIGFueXdheS5cbi8vXG4vLyBTSUdCVVMsIFNJR0ZQRSwgU0lHU0VHViBhbmQgU0lHSUxMLCB3aGVuIG5vdCByYWlzZWRcbi8vIGFydGlmaWNpYWxseSwgaW5oZXJlbnRseSBsZWF2ZSB0aGUgcHJvY2VzcyBpbiBhXG4vLyBzdGF0ZSBmcm9tIHdoaWNoIGl0IGlzIG5vdCBzYWZlIHRvIHRyeSBhbmQgZW50ZXIgSlNcbi8vIGxpc3RlbmVycy5cbm1vZHVsZS5leHBvcnRzID0gW1xuICAnU0lHQUJSVCcsXG4gICdTSUdBTFJNJyxcbiAgJ1NJR0hVUCcsXG4gICdTSUdJTlQnLFxuICAnU0lHVEVSTSdcbl1cblxuaWYgKHByb2Nlc3MucGxhdGZvcm0gIT09ICd3aW4zMicpIHtcbiAgbW9kdWxlLmV4cG9ydHMucHVzaChcbiAgICAnU0lHVlRBTFJNJyxcbiAgICAnU0lHWENQVScsXG4gICAgJ1NJR1hGU1onLFxuICAgICdTSUdVU1IyJyxcbiAgICAnU0lHVFJBUCcsXG4gICAgJ1NJR1NZUycsXG4gICAgJ1NJR1FVSVQnLFxuICAgICdTSUdJT1QnXG4gICAgLy8gc2hvdWxkIGRldGVjdCBwcm9maWxlciBhbmQgZW5hYmxlL2Rpc2FibGUgYWNjb3JkaW5nbHkuXG4gICAgLy8gc2VlICMyMVxuICAgIC8vICdTSUdQUk9GJ1xuICApXG59XG5cbmlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnKSB7XG4gIG1vZHVsZS5leHBvcnRzLnB1c2goXG4gICAgJ1NJR0lPJyxcbiAgICAnU0lHUE9MTCcsXG4gICAgJ1NJR1BXUicsXG4gICAgJ1NJR1NUS0ZMVCcsXG4gICAgJ1NJR1VOVVNFRCdcbiAgKVxufVxuIiwgIi8vIE5vdGU6IHNpbmNlIG55YyB1c2VzIHRoaXMgbW9kdWxlIHRvIG91dHB1dCBjb3ZlcmFnZSwgYW55IGxpbmVzXG4vLyB0aGF0IGFyZSBpbiB0aGUgZGlyZWN0IHN5bmMgZmxvdyBvZiBueWMncyBvdXRwdXRDb3ZlcmFnZSBhcmVcbi8vIGlnbm9yZWQsIHNpbmNlIHdlIGNhbiBuZXZlciBnZXQgY292ZXJhZ2UgZm9yIHRoZW0uXG4vLyBncmFiIGEgcmVmZXJlbmNlIHRvIG5vZGUncyByZWFsIHByb2Nlc3Mgb2JqZWN0IHJpZ2h0IGF3YXlcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3NcblxuY29uc3QgcHJvY2Vzc09rID0gZnVuY3Rpb24gKHByb2Nlc3MpIHtcbiAgcmV0dXJuIHByb2Nlc3MgJiZcbiAgICB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBwcm9jZXNzLmVtaXQgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgcHJvY2Vzcy5yZWFsbHlFeGl0ID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIHByb2Nlc3MubGlzdGVuZXJzID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIHByb2Nlc3Mua2lsbCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBwcm9jZXNzLnBpZCA9PT0gJ251bWJlcicgJiZcbiAgICB0eXBlb2YgcHJvY2Vzcy5vbiA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG4vLyBzb21lIGtpbmQgb2Ygbm9uLW5vZGUgZW52aXJvbm1lbnQsIGp1c3Qgbm8tb3Bcbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKCFwcm9jZXNzT2socHJvY2VzcykpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHt9XG4gIH1cbn0gZWxzZSB7XG4gIHZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuICB2YXIgc2lnbmFscyA9IHJlcXVpcmUoJy4vc2lnbmFscy5qcycpXG4gIHZhciBpc1dpbiA9IC9ed2luL2kudGVzdChwcm9jZXNzLnBsYXRmb3JtKVxuXG4gIHZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZW9mIEVFICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgRUUgPSBFRS5FdmVudEVtaXR0ZXJcbiAgfVxuXG4gIHZhciBlbWl0dGVyXG4gIGlmIChwcm9jZXNzLl9fc2lnbmFsX2V4aXRfZW1pdHRlcl9fKSB7XG4gICAgZW1pdHRlciA9IHByb2Nlc3MuX19zaWduYWxfZXhpdF9lbWl0dGVyX19cbiAgfSBlbHNlIHtcbiAgICBlbWl0dGVyID0gcHJvY2Vzcy5fX3NpZ25hbF9leGl0X2VtaXR0ZXJfXyA9IG5ldyBFRSgpXG4gICAgZW1pdHRlci5jb3VudCA9IDBcbiAgICBlbWl0dGVyLmVtaXR0ZWQgPSB7fVxuICB9XG5cbiAgLy8gQmVjYXVzZSB0aGlzIGVtaXR0ZXIgaXMgYSBnbG9iYWwsIHdlIGhhdmUgdG8gY2hlY2sgdG8gc2VlIGlmIGFcbiAgLy8gcHJldmlvdXMgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnkgZmFpbGVkIHRvIGVuYWJsZSBpbmZpbml0ZSBsaXN0ZW5lcnMuXG4gIC8vIEkga25vdyB3aGF0IHlvdSdyZSBhYm91dCB0byBzYXkuICBCdXQgbGl0ZXJhbGx5IGV2ZXJ5dGhpbmcgYWJvdXRcbiAgLy8gc2lnbmFsLWV4aXQgaXMgYSBjb21wcm9taXNlIHdpdGggZXZpbC4gIEdldCB1c2VkIHRvIGl0LlxuICBpZiAoIWVtaXR0ZXIuaW5maW5pdGUpIHtcbiAgICBlbWl0dGVyLnNldE1heExpc3RlbmVycyhJbmZpbml0eSlcbiAgICBlbWl0dGVyLmluZmluaXRlID0gdHJ1ZVxuICB9XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY2IsIG9wdHMpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIXByb2Nlc3NPayhnbG9iYWwucHJvY2VzcykpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7fVxuICAgIH1cbiAgICBhc3NlcnQuZXF1YWwodHlwZW9mIGNiLCAnZnVuY3Rpb24nLCAnYSBjYWxsYmFjayBtdXN0IGJlIHByb3ZpZGVkIGZvciBleGl0IGhhbmRsZXInKVxuXG4gICAgaWYgKGxvYWRlZCA9PT0gZmFsc2UpIHtcbiAgICAgIGxvYWQoKVxuICAgIH1cblxuICAgIHZhciBldiA9ICdleGl0J1xuICAgIGlmIChvcHRzICYmIG9wdHMuYWx3YXlzTGFzdCkge1xuICAgICAgZXYgPSAnYWZ0ZXJleGl0J1xuICAgIH1cblxuICAgIHZhciByZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKGV2LCBjYilcbiAgICAgIGlmIChlbWl0dGVyLmxpc3RlbmVycygnZXhpdCcpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgIGVtaXR0ZXIubGlzdGVuZXJzKCdhZnRlcmV4aXQnKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdW5sb2FkKClcbiAgICAgIH1cbiAgICB9XG4gICAgZW1pdHRlci5vbihldiwgY2IpXG5cbiAgICByZXR1cm4gcmVtb3ZlXG4gIH1cblxuICB2YXIgdW5sb2FkID0gZnVuY3Rpb24gdW5sb2FkICgpIHtcbiAgICBpZiAoIWxvYWRlZCB8fCAhcHJvY2Vzc09rKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGxvYWRlZCA9IGZhbHNlXG5cbiAgICBzaWduYWxzLmZvckVhY2goZnVuY3Rpb24gKHNpZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihzaWcsIHNpZ0xpc3RlbmVyc1tzaWddKVxuICAgICAgfSBjYXRjaCAoZXIpIHt9XG4gICAgfSlcbiAgICBwcm9jZXNzLmVtaXQgPSBvcmlnaW5hbFByb2Nlc3NFbWl0XG4gICAgcHJvY2Vzcy5yZWFsbHlFeGl0ID0gb3JpZ2luYWxQcm9jZXNzUmVhbGx5RXhpdFxuICAgIGVtaXR0ZXIuY291bnQgLT0gMVxuICB9XG4gIG1vZHVsZS5leHBvcnRzLnVubG9hZCA9IHVubG9hZFxuXG4gIHZhciBlbWl0ID0gZnVuY3Rpb24gZW1pdCAoZXZlbnQsIGNvZGUsIHNpZ25hbCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChlbWl0dGVyLmVtaXR0ZWRbZXZlbnRdKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgZW1pdHRlci5lbWl0dGVkW2V2ZW50XSA9IHRydWVcbiAgICBlbWl0dGVyLmVtaXQoZXZlbnQsIGNvZGUsIHNpZ25hbClcbiAgfVxuXG4gIC8vIHsgPHNpZ25hbD46IDxsaXN0ZW5lciBmbj4sIC4uLiB9XG4gIHZhciBzaWdMaXN0ZW5lcnMgPSB7fVxuICBzaWduYWxzLmZvckVhY2goZnVuY3Rpb24gKHNpZykge1xuICAgIHNpZ0xpc3RlbmVyc1tzaWddID0gZnVuY3Rpb24gbGlzdGVuZXIgKCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoIXByb2Nlc3NPayhnbG9iYWwucHJvY2VzcykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gb3RoZXIgbGlzdGVuZXJzLCBhbiBleGl0IGlzIGNvbWluZyFcbiAgICAgIC8vIFNpbXBsZXN0IHdheTogcmVtb3ZlIHVzIGFuZCB0aGVuIHJlLXNlbmQgdGhlIHNpZ25hbC5cbiAgICAgIC8vIFdlIGtub3cgdGhhdCB0aGlzIHdpbGwga2lsbCB0aGUgcHJvY2Vzcywgc28gd2UgY2FuXG4gICAgICAvLyBzYWZlbHkgZW1pdCBub3cuXG4gICAgICB2YXIgbGlzdGVuZXJzID0gcHJvY2Vzcy5saXN0ZW5lcnMoc2lnKVxuICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IGVtaXR0ZXIuY291bnQpIHtcbiAgICAgICAgdW5sb2FkKClcbiAgICAgICAgZW1pdCgnZXhpdCcsIG51bGwsIHNpZylcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZW1pdCgnYWZ0ZXJleGl0JywgbnVsbCwgc2lnKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBpZiAoaXNXaW4gJiYgc2lnID09PSAnU0lHSFVQJykge1xuICAgICAgICAgIC8vIFwiU0lHSFVQXCIgdGhyb3dzIGFuIGBFTk9TWVNgIGVycm9yIG9uIFdpbmRvd3MsXG4gICAgICAgICAgLy8gc28gdXNlIGEgc3VwcG9ydGVkIHNpZ25hbCBpbnN0ZWFkXG4gICAgICAgICAgc2lnID0gJ1NJR0lOVCdcbiAgICAgICAgfVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgbW9kdWxlLmV4cG9ydHMuc2lnbmFscyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2lnbmFsc1xuICB9XG5cbiAgdmFyIGxvYWRlZCA9IGZhbHNlXG5cbiAgdmFyIGxvYWQgPSBmdW5jdGlvbiBsb2FkICgpIHtcbiAgICBpZiAobG9hZGVkIHx8ICFwcm9jZXNzT2soZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgbG9hZGVkID0gdHJ1ZVxuXG4gICAgLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIG9uU2lnbmFsRXhpdCdzIHRoYXQgYXJlIGluIHBsYXkuXG4gICAgLy8gSXQncyBpbXBvcnRhbnQgc28gdGhhdCB3ZSBjYW4gY291bnQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mXG4gICAgLy8gbGlzdGVuZXJzIG9uIHNpZ25hbHMsIGFuZCBkb24ndCB3YWl0IGZvciB0aGUgb3RoZXIgb25lIHRvXG4gICAgLy8gaGFuZGxlIGl0IGluc3RlYWQgb2YgdXMuXG4gICAgZW1pdHRlci5jb3VudCArPSAxXG5cbiAgICBzaWduYWxzID0gc2lnbmFscy5maWx0ZXIoZnVuY3Rpb24gKHNpZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcHJvY2Vzcy5vbihzaWcsIHNpZ0xpc3RlbmVyc1tzaWddKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSlcblxuICAgIHByb2Nlc3MuZW1pdCA9IHByb2Nlc3NFbWl0XG4gICAgcHJvY2Vzcy5yZWFsbHlFeGl0ID0gcHJvY2Vzc1JlYWxseUV4aXRcbiAgfVxuICBtb2R1bGUuZXhwb3J0cy5sb2FkID0gbG9hZFxuXG4gIHZhciBvcmlnaW5hbFByb2Nlc3NSZWFsbHlFeGl0ID0gcHJvY2Vzcy5yZWFsbHlFeGl0XG4gIHZhciBwcm9jZXNzUmVhbGx5RXhpdCA9IGZ1bmN0aW9uIHByb2Nlc3NSZWFsbHlFeGl0IChjb2RlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCFwcm9jZXNzT2soZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IGNvZGUgfHwgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gMFxuICAgIGVtaXQoJ2V4aXQnLCBwcm9jZXNzLmV4aXRDb2RlLCBudWxsKVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZW1pdCgnYWZ0ZXJleGl0JywgcHJvY2Vzcy5leGl0Q29kZSwgbnVsbClcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIG9yaWdpbmFsUHJvY2Vzc1JlYWxseUV4aXQuY2FsbChwcm9jZXNzLCBwcm9jZXNzLmV4aXRDb2RlKVxuICB9XG5cbiAgdmFyIG9yaWdpbmFsUHJvY2Vzc0VtaXQgPSBwcm9jZXNzLmVtaXRcbiAgdmFyIHByb2Nlc3NFbWl0ID0gZnVuY3Rpb24gcHJvY2Vzc0VtaXQgKGV2LCBhcmcpIHtcbiAgICBpZiAoZXYgPT09ICdleGl0JyAmJiBwcm9jZXNzT2soZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGFyZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhcmdcbiAgICAgIH1cbiAgICAgIHZhciByZXQgPSBvcmlnaW5hbFByb2Nlc3NFbWl0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBlbWl0KCdleGl0JywgcHJvY2Vzcy5leGl0Q29kZSwgbnVsbClcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBlbWl0KCdhZnRlcmV4aXQnLCBwcm9jZXNzLmV4aXRDb2RlLCBudWxsKVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiByZXRcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsUHJvY2Vzc0VtaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgIH1cbiAgfVxufVxuIiwgIid1c2Ugc3RyaWN0JztcbmNvbnN0IHtQYXNzVGhyb3VnaDogUGFzc1Rocm91Z2hTdHJlYW19ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gb3B0aW9ucyA9PiB7XG5cdG9wdGlvbnMgPSB7Li4ub3B0aW9uc307XG5cblx0Y29uc3Qge2FycmF5fSA9IG9wdGlvbnM7XG5cdGxldCB7ZW5jb2Rpbmd9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNCdWZmZXIgPSBlbmNvZGluZyA9PT0gJ2J1ZmZlcic7XG5cdGxldCBvYmplY3RNb2RlID0gZmFsc2U7XG5cblx0aWYgKGFycmF5KSB7XG5cdFx0b2JqZWN0TW9kZSA9ICEoZW5jb2RpbmcgfHwgaXNCdWZmZXIpO1xuXHR9IGVsc2Uge1xuXHRcdGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXHR9XG5cblx0aWYgKGlzQnVmZmVyKSB7XG5cdFx0ZW5jb2RpbmcgPSBudWxsO1xuXHR9XG5cblx0Y29uc3Qgc3RyZWFtID0gbmV3IFBhc3NUaHJvdWdoU3RyZWFtKHtvYmplY3RNb2RlfSk7XG5cblx0aWYgKGVuY29kaW5nKSB7XG5cdFx0c3RyZWFtLnNldEVuY29kaW5nKGVuY29kaW5nKTtcblx0fVxuXG5cdGxldCBsZW5ndGggPSAwO1xuXHRjb25zdCBjaHVua3MgPSBbXTtcblxuXHRzdHJlYW0ub24oJ2RhdGEnLCBjaHVuayA9PiB7XG5cdFx0Y2h1bmtzLnB1c2goY2h1bmspO1xuXG5cdFx0aWYgKG9iamVjdE1vZGUpIHtcblx0XHRcdGxlbmd0aCA9IGNodW5rcy5sZW5ndGg7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxlbmd0aCArPSBjaHVuay5sZW5ndGg7XG5cdFx0fVxuXHR9KTtcblxuXHRzdHJlYW0uZ2V0QnVmZmVyZWRWYWx1ZSA9ICgpID0+IHtcblx0XHRpZiAoYXJyYXkpIHtcblx0XHRcdHJldHVybiBjaHVua3M7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGlzQnVmZmVyID8gQnVmZmVyLmNvbmNhdChjaHVua3MsIGxlbmd0aCkgOiBjaHVua3Muam9pbignJyk7XG5cdH07XG5cblx0c3RyZWFtLmdldEJ1ZmZlcmVkTGVuZ3RoID0gKCkgPT4gbGVuZ3RoO1xuXG5cdHJldHVybiBzdHJlYW07XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbmNvbnN0IHtjb25zdGFudHM6IEJ1ZmZlckNvbnN0YW50c30gPSByZXF1aXJlKCdidWZmZXInKTtcbmNvbnN0IHN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuY29uc3Qge3Byb21pc2lmeX0gPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCBidWZmZXJTdHJlYW0gPSByZXF1aXJlKCcuL2J1ZmZlci1zdHJlYW0nKTtcblxuY29uc3Qgc3RyZWFtUGlwZWxpbmVQcm9taXNpZmllZCA9IHByb21pc2lmeShzdHJlYW0ucGlwZWxpbmUpO1xuXG5jbGFzcyBNYXhCdWZmZXJFcnJvciBleHRlbmRzIEVycm9yIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoJ21heEJ1ZmZlciBleGNlZWRlZCcpO1xuXHRcdHRoaXMubmFtZSA9ICdNYXhCdWZmZXJFcnJvcic7XG5cdH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0U3RyZWFtKGlucHV0U3RyZWFtLCBvcHRpb25zKSB7XG5cdGlmICghaW5wdXRTdHJlYW0pIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgc3RyZWFtJyk7XG5cdH1cblxuXHRvcHRpb25zID0ge1xuXHRcdG1heEJ1ZmZlcjogSW5maW5pdHksXG5cdFx0Li4ub3B0aW9uc1xuXHR9O1xuXG5cdGNvbnN0IHttYXhCdWZmZXJ9ID0gb3B0aW9ucztcblx0Y29uc3Qgc3RyZWFtID0gYnVmZmVyU3RyZWFtKG9wdGlvbnMpO1xuXG5cdGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCByZWplY3RQcm9taXNlID0gZXJyb3IgPT4ge1xuXHRcdFx0Ly8gRG9uJ3QgcmV0cmlldmUgYW4gb3ZlcnNpemVkIGJ1ZmZlci5cblx0XHRcdGlmIChlcnJvciAmJiBzdHJlYW0uZ2V0QnVmZmVyZWRMZW5ndGgoKSA8PSBCdWZmZXJDb25zdGFudHMuTUFYX0xFTkdUSCkge1xuXHRcdFx0XHRlcnJvci5idWZmZXJlZERhdGEgPSBzdHJlYW0uZ2V0QnVmZmVyZWRWYWx1ZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdH07XG5cblx0XHQoYXN5bmMgKCkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgc3RyZWFtUGlwZWxpbmVQcm9taXNpZmllZChpbnB1dFN0cmVhbSwgc3RyZWFtKTtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0cmVqZWN0UHJvbWlzZShlcnJvcik7XG5cdFx0XHR9XG5cdFx0fSkoKTtcblxuXHRcdHN0cmVhbS5vbignZGF0YScsICgpID0+IHtcblx0XHRcdGlmIChzdHJlYW0uZ2V0QnVmZmVyZWRMZW5ndGgoKSA+IG1heEJ1ZmZlcikge1xuXHRcdFx0XHRyZWplY3RQcm9taXNlKG5ldyBNYXhCdWZmZXJFcnJvcigpKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG5cblx0cmV0dXJuIHN0cmVhbS5nZXRCdWZmZXJlZFZhbHVlKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U3RyZWFtO1xubW9kdWxlLmV4cG9ydHMuYnVmZmVyID0gKHN0cmVhbSwgb3B0aW9ucykgPT4gZ2V0U3RyZWFtKHN0cmVhbSwgey4uLm9wdGlvbnMsIGVuY29kaW5nOiAnYnVmZmVyJ30pO1xubW9kdWxlLmV4cG9ydHMuYXJyYXkgPSAoc3RyZWFtLCBvcHRpb25zKSA9PiBnZXRTdHJlYW0oc3RyZWFtLCB7Li4ub3B0aW9ucywgYXJyYXk6IHRydWV9KTtcbm1vZHVsZS5leHBvcnRzLk1heEJ1ZmZlckVycm9yID0gTWF4QnVmZmVyRXJyb3I7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IFBhc3NUaHJvdWdoIH0gPSByZXF1aXJlKCdzdHJlYW0nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoLypzdHJlYW1zLi4uKi8pIHtcbiAgdmFyIHNvdXJjZXMgPSBbXVxuICB2YXIgb3V0cHV0ICA9IG5ldyBQYXNzVGhyb3VnaCh7b2JqZWN0TW9kZTogdHJ1ZX0pXG5cbiAgb3V0cHV0LnNldE1heExpc3RlbmVycygwKVxuXG4gIG91dHB1dC5hZGQgPSBhZGRcbiAgb3V0cHV0LmlzRW1wdHkgPSBpc0VtcHR5XG5cbiAgb3V0cHV0Lm9uKCd1bnBpcGUnLCByZW1vdmUpXG5cbiAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5mb3JFYWNoKGFkZClcblxuICByZXR1cm4gb3V0cHV0XG5cbiAgZnVuY3Rpb24gYWRkIChzb3VyY2UpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UuZm9yRWFjaChhZGQpXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgIHNvdXJjZS5vbmNlKCdlbmQnLCByZW1vdmUuYmluZChudWxsLCBzb3VyY2UpKVxuICAgIHNvdXJjZS5vbmNlKCdlcnJvcicsIG91dHB1dC5lbWl0LmJpbmQob3V0cHV0LCAnZXJyb3InKSlcbiAgICBzb3VyY2UucGlwZShvdXRwdXQsIHtlbmQ6IGZhbHNlfSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgZnVuY3Rpb24gaXNFbXB0eSAoKSB7XG4gICAgcmV0dXJuIHNvdXJjZXMubGVuZ3RoID09IDA7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmUgKHNvdXJjZSkge1xuICAgIHNvdXJjZXMgPSBzb3VyY2VzLmZpbHRlcihmdW5jdGlvbiAoaXQpIHsgcmV0dXJuIGl0ICE9PSBzb3VyY2UgfSlcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoICYmIG91dHB1dC5yZWFkYWJsZSkgeyBvdXRwdXQuZW5kKCkgfVxuICB9XG59XG4iLCAiaW1wb3J0IGNhYyBmcm9tICdjYWMnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uLy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgKiBhcyBjb21tYW5kcyBmcm9tICcuL2NvbW1hbmRzJztcblxuY29uc3QgY2xpID0gY2FjKCd3eHQnKTtcbmNsaS5oZWxwKCk7XG5jbGkudmVyc2lvbih2ZXJzaW9uKTtcblxuY2xpLm9wdGlvbignLS1kZWJ1ZycsICdlbmFibGUgZGVidWcgbW9kZScpO1xuXG4vLyBERVZcbmNsaVxuICAuY29tbWFuZCgnW3Jvb3RdJywgJ3N0YXJ0IGRldiBzZXJ2ZXInKVxuICAub3B0aW9uKCctYywgLS1jb25maWcgPGZpbGU+JywgJ3VzZSBzcGVjaWZpZWQgY29uZmlnIGZpbGUnKVxuICAub3B0aW9uKCctbSwgLS1tb2RlIDxtb2RlPicsICdzZXQgZW52IG1vZGUnKVxuICAub3B0aW9uKCctYiwgLS1icm93c2VyIDxicm93c2VyPicsICdzcGVjaWZ5IGEgYnJvd3NlcicpXG4gIC5vcHRpb24oJy0tbXYzJywgJ3RhcmdldCBtYW5pZmVzdCB2MycpXG4gIC5vcHRpb24oJy0tbXYyJywgJ3RhcmdldCBtYW5pZmVzdCB2MicpXG4gIC5hY3Rpb24oY29tbWFuZHMuZGV2KTtcblxuLy8gQlVJTERcbmNsaVxuICAuY29tbWFuZCgnYnVpbGQgW3Jvb3RdJywgJ2J1aWxkIGZvciBwcm9kdWN0aW9uJylcbiAgLm9wdGlvbignLWMsIC0tY29uZmlnIDxmaWxlPicsICd1c2Ugc3BlY2lmaWVkIGNvbmZpZyBmaWxlJylcbiAgLm9wdGlvbignLW0sIC0tbW9kZSA8bW9kZT4nLCAnc2V0IGVudiBtb2RlJylcbiAgLm9wdGlvbignLWIsIC0tYnJvd3NlciA8YnJvd3Nlcj4nLCAnc3BlY2lmeSBhIGJyb3dzZXInKVxuICAub3B0aW9uKCctLW12MycsICd0YXJnZXQgbWFuaWZlc3QgdjMnKVxuICAub3B0aW9uKCctLW12MicsICd0YXJnZXQgbWFuaWZlc3QgdjInKVxuICAub3B0aW9uKCctLWFuYWx5emUnLCAndmlzdWFsaXplIGV4dGVuc2lvbiBidW5kbGUnKVxuICAuYWN0aW9uKGNvbW1hbmRzLmJ1aWxkKTtcblxuLy8gWklQXG5jbGlcbiAgLmNvbW1hbmQoJ3ppcCBbcm9vdF0nLCAnYnVpbGQgZm9yIHByb2R1Y3Rpb24gYW5kIHppcCBvdXRwdXQnKVxuICAub3B0aW9uKCctYywgLS1jb25maWcgPGZpbGU+JywgJ3VzZSBzcGVjaWZpZWQgY29uZmlnIGZpbGUnKVxuICAub3B0aW9uKCctbSwgLS1tb2RlIDxtb2RlPicsICdzZXQgZW52IG1vZGUnKVxuICAub3B0aW9uKCctYiwgLS1icm93c2VyIDxicm93c2VyPicsICdzcGVjaWZ5IGEgYnJvd3NlcicpXG4gIC5vcHRpb24oJy0tbXYzJywgJ3RhcmdldCBtYW5pZmVzdCB2MycpXG4gIC5vcHRpb24oJy0tbXYyJywgJ3RhcmdldCBtYW5pZmVzdCB2MicpXG4gIC5hY3Rpb24oY29tbWFuZHMuemlwKTtcblxuLy8gUFJFUEFSRVxuY2xpXG4gIC5jb21tYW5kKCdwcmVwYXJlIFtyb290XScsICdwcmVwYXJlIHR5cGVzY3JpcHQgcHJvamVjdCcpXG4gIC5vcHRpb24oJy1jLCAtLWNvbmZpZyA8ZmlsZT4nLCAndXNlIHNwZWNpZmllZCBjb25maWcgZmlsZScpXG4gIC5hY3Rpb24oY29tbWFuZHMucHJlcGFyZSk7XG5cbi8vIENMRUFOXG5jbGlcbiAgLmNvbW1hbmQoJ2NsZWFuIFtyb290XScsICdjbGVhbiBnZW5lcmF0ZWQgZmlsZXMgYW5kIGNhY2hlcycpXG4gIC5hbGlhcygnY2xlYW51cCcpXG4gIC5hY3Rpb24oY29tbWFuZHMuY2xlYW4pO1xuXG4vLyBQVUJMSVNIXG5jbGkuY29tbWFuZCgncHVibGlzaCBbcm9vdF0nLCAncHVibGlzaCB0byBzdG9yZXMnKS5hY3Rpb24oY29tbWFuZHMucHVibGlzaCk7XG5cbi8vIElOSVRcbmNsaVxuICAuY29tbWFuZCgnaW5pdCBbZGlyZWN0b3J5XScsICdpbml0aWFsaXplIGEgbmV3IHByb2plY3QnKVxuICAub3B0aW9uKCctdCwgLS10ZW1wbGF0ZSA8dGVtcGxhdGU+JywgJ3RlbXBsYXRlIHRvIHVzZScpXG4gIC5vcHRpb24oJy0tcG0gPHBhY2thZ2VNYW5hZ2VyPicsICd3aGljaCBwYWNrYWdlIG1hbmFnZXIgdG8gdXNlJylcbiAgLmFjdGlvbihjb21tYW5kcy5pbml0KTtcblxuY2xpLnBhcnNlKCk7XG4iLCAie1xuICBcIm5hbWVcIjogXCJ3eHRcIixcbiAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gIFwidmVyc2lvblwiOiBcIjAuNy4xLWFscGhhMVwiLFxuICBcImRlc2NyaXB0aW9uXCI6IFwiTmV4dCBnZW4gZnJhbWV3b3JrIGZvciBkZXZlbG9waW5nIHdlYiBleHRlbnNpb25zXCIsXG4gIFwiZW5naW5lc1wiOiB7XG4gICAgXCJub2RlXCI6IFwiPj0xOC4xNi4wXCIsXG4gICAgXCJwbnBtXCI6IFwiPj04XCJcbiAgfSxcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS93eHQtZGV2L3d4dFwiXG4gIH0sXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL3d4dC5kZXZcIixcbiAgXCJrZXl3b3Jkc1wiOiBbXG4gICAgXCJ2aXRlXCIsXG4gICAgXCJjaHJvbWVcIixcbiAgICBcIndlYlwiLFxuICAgIFwiZXh0ZW5zaW9uXCIsXG4gICAgXCJicm93c2VyXCIsXG4gICAgXCJidW5kbGVyXCIsXG4gICAgXCJmcmFtZXdvcmtcIlxuICBdLFxuICBcImF1dGhvclwiOiB7XG4gICAgXCJuYW1lXCI6IFwiQWFyb24gS2xpbmtlclwiLFxuICAgIFwiZW1haWxcIjogXCJhYXJvbmtsaW5rZXIxK3d4dEBnbWFpbC5jb21cIlxuICB9LFxuICBcImxpY2Vuc2VcIjogXCJNSVRcIixcbiAgXCJmaWxlc1wiOiBbXG4gICAgXCJiaW5cIixcbiAgICBcImRpc3RcIlxuICBdLFxuICBcImJpblwiOiBcIi4vYmluL3d4dC5janNcIixcbiAgXCJtYWluXCI6IFwiLi9kaXN0L2luZGV4LmNqc1wiLFxuICBcIm1vZHVsZVwiOiBcIi4vZGlzdC9pbmRleC5qc1wiLFxuICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIixcbiAgXCJleHBvcnRzXCI6IHtcbiAgICBcIi5cIjoge1xuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2luZGV4LmNqc1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiXG4gICAgfSxcbiAgICBcIi4vY2xpZW50XCI6IHtcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2NsaWVudC5qc1wiLFxuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9jbGllbnQuZC50c1wiXG4gICAgfSxcbiAgICBcIi4vYnJvd3NlclwiOiB7XG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9icm93c2VyLmpzXCIsXG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2Jyb3dzZXIuZC50c1wiXG4gICAgfVxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwid3h0XCI6IFwidHN4IHNyYy9jbGkvaW5kZXgudHNcIixcbiAgICBcImJ1aWxkXCI6IFwidHN4IHNjcmlwdHMvYnVpbGQudHNcIixcbiAgICBcImZvcm1hdFwiOiBcInByZXR0aWVyIC0td3JpdGUgLlwiLFxuICAgIFwiZm9ybWF0OmNoZWNrXCI6IFwicHJldHRpZXIgLS13cml0ZSAuXCIsXG4gICAgXCJjb21waWxlXCI6IFwidHNjIC0tbm9FbWl0XCIsXG4gICAgXCJ0ZXN0XCI6IFwidml0ZXN0XCIsXG4gICAgXCJ0ZXN0OmNvdmVyYWdlXCI6IFwidml0ZXN0IHJ1biAtLWNvdmVyYWdlLmVuYWJsZWQgLS1jb3ZlcmFnZS5leGNsdWRlPWUyZSAtLWNvdmVyYWdlLmV4Y2x1ZGU9c3JjL3Rlc3RpbmdcIixcbiAgICBcInByZXBhcmVcIjogXCJzaW1wbGUtZ2l0LWhvb2tzXCIsXG4gICAgXCJwcmVwdWJsaXNoXCI6IFwicG5wbSAtcyBidWlsZFwiLFxuICAgIFwiZG9jczpkZXZcIjogXCJ2aXRlcHJlc3MgZGV2IGRvY3NcIixcbiAgICBcImRvY3M6YnVpbGRcIjogXCJ2aXRlcHJlc3MgYnVpbGQgZG9jc1wiLFxuICAgIFwiZG9jczpwcmV2aWV3XCI6IFwidml0ZXByZXNzIHByZXZpZXcgZG9jc1wiLFxuICAgIFwic3luYy1yZWxlYXNlc1wiOiBcInBucHggY2hhbmdlbG9nZW5AbGF0ZXN0IGdoIHJlbGVhc2VcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAdHlwZXMvd2ViZXh0ZW5zaW9uLXBvbHlmaWxsXCI6IFwiXjAuMTAuMVwiLFxuICAgIFwiQHdlYmV4dC1jb3JlL2Zha2UtYnJvd3NlclwiOiBcIl4xLjIuMlwiLFxuICAgIFwiQHdlYmV4dC1jb3JlL2lzb2xhdGVkLWVsZW1lbnRcIjogXCJeMS4wLjRcIixcbiAgICBcIkB3ZWJleHQtY29yZS9tYXRjaC1wYXR0ZXJuc1wiOiBcIl4xLjAuMlwiLFxuICAgIFwiYXN5bmMtbXV0ZXhcIjogXCJeMC40LjBcIixcbiAgICBcImMxMlwiOiBcIl4xLjQuMlwiLFxuICAgIFwiY2FjXCI6IFwiXjYuNy4xNFwiLFxuICAgIFwiY29uc29sYVwiOiBcIl4zLjIuM1wiLFxuICAgIFwiZXNidWlsZFwiOiBcIl4wLjE5LjRcIixcbiAgICBcImZhc3QtZ2xvYlwiOiBcIl4zLjMuMVwiLFxuICAgIFwiZmlsZXNpemVcIjogXCJeMTAuMC44XCIsXG4gICAgXCJmcy1leHRyYVwiOiBcIl4xMS4xLjFcIixcbiAgICBcImdldC1wb3J0XCI6IFwiXjcuMC4wXCIsXG4gICAgXCJnaWdldFwiOiBcIl4xLjEuMlwiLFxuICAgIFwiaW1tZXJcIjogXCJeMTAuMC4yXCIsXG4gICAgXCJpcy13c2xcIjogXCJeMy4wLjBcIixcbiAgICBcImppdGlcIjogXCJeMS4xOS4xXCIsXG4gICAgXCJqc29uNVwiOiBcIl4yLjIuM1wiLFxuICAgIFwibGlua2Vkb21cIjogXCJeMC4xNS4xXCIsXG4gICAgXCJtaW5pbWF0Y2hcIjogXCJeOS4wLjNcIixcbiAgICBcIm9yYVwiOiBcIl43LjAuMVwiLFxuICAgIFwicGljb2NvbG9yc1wiOiBcIl4xLjAuMFwiLFxuICAgIFwicHJvbXB0c1wiOiBcIl4yLjQuMlwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi12aXN1YWxpemVyXCI6IFwiXjUuOS4yXCIsXG4gICAgXCJ1bmltcG9ydFwiOiBcIl4zLjEuMFwiLFxuICAgIFwidml0ZVwiOiBcIl40LjQuN1wiLFxuICAgIFwid2ViLWV4dC1ydW5cIjogXCJeMC4xLjBcIixcbiAgICBcIndlYmV4dGVuc2lvbi1wb2x5ZmlsbFwiOiBcIl4wLjEwLjBcIixcbiAgICBcInppcC1kaXJcIjogXCJeMi4wLjBcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAZmFrZXItanMvZmFrZXJcIjogXCJeOC4wLjJcIixcbiAgICBcIkB0eXBlcy9mcy1leHRyYVwiOiBcIl4xMS4wLjFcIixcbiAgICBcIkB0eXBlcy9sb2Rhc2gubWVyZ2VcIjogXCJeNC42LjdcIixcbiAgICBcIkB0eXBlcy9ub2RlXCI6IFwiXjIwLjQuNVwiLFxuICAgIFwiQHR5cGVzL3Byb21wdHNcIjogXCJeMi40LjRcIixcbiAgICBcIkB2aXRlc3QvY292ZXJhZ2UtdjhcIjogXCJeMC4zNC4xXCIsXG4gICAgXCJleGVjYVwiOiBcIl43LjIuMFwiLFxuICAgIFwianNkb21cIjogXCJeMjIuMS4wXCIsXG4gICAgXCJsaW50LXN0YWdlZFwiOiBcIl4xNC4wLjBcIixcbiAgICBcImxvZGFzaC5tZXJnZVwiOiBcIl40LjYuMlwiLFxuICAgIFwibnBtLXJ1bi1hbGxcIjogXCJeNC4xLjVcIixcbiAgICBcInByZXR0aWVyXCI6IFwiXjMuMC4xXCIsXG4gICAgXCJzaW1wbGUtZ2l0LWhvb2tzXCI6IFwiXjIuOS4wXCIsXG4gICAgXCJ0cy1tb3JwaFwiOiBcIl4xOS4wLjBcIixcbiAgICBcInRzdXBcIjogXCJeNy4xLjBcIixcbiAgICBcInRzeFwiOiBcIl4zLjEyLjdcIixcbiAgICBcInR5cGVzY3JpcHRcIjogXCJeNS4xLjZcIixcbiAgICBcInZpdGVwcmVzc1wiOiBcIjEuMC4wLXJjLjEwXCIsXG4gICAgXCJ2aXRlc3RcIjogXCJeMC4zNC4xXCIsXG4gICAgXCJ2aXRlc3QtbW9jay1leHRlbmRlZFwiOiBcIl4xLjEuNFwiLFxuICAgIFwidnVlXCI6IFwiXjMuMy40XCIsXG4gICAgXCJ3ZWJleHRlbnNpb24tcG9seWZpbGxcIjogXCJeMC4xMC4wXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIndlYmV4dGVuc2lvbi1wb2x5ZmlsbFwiOiBcIj49MC4xMC4wXCJcbiAgfSxcbiAgXCJwYWNrYWdlTWFuYWdlclwiOiBcInBucG1AOC42LjNcIixcbiAgXCJzaW1wbGUtZ2l0LWhvb2tzXCI6IHtcbiAgICBcInByZS1jb21taXRcIjogXCJwbnBtIGxpbnQtc3RhZ2VkXCJcbiAgfSxcbiAgXCJsaW50LXN0YWdlZFwiOiB7XG4gICAgXCIqXCI6IFwicHJldHRpZXIgLS13cml0ZVwiXG4gIH0sXG4gIFwiY2hhbmdlbG9nXCI6IHtcbiAgICBcImV4Y2x1ZGVBdXRob3JzXCI6IFtcbiAgICAgIFwiYWFyb25rbGlua2VyMUBnbWFpbC5jb21cIlxuICAgIF1cbiAgfSxcbiAgXCJwbnBtXCI6IHtcbiAgICBcInBlZXJEZXBlbmRlbmN5UnVsZXNcIjoge1xuICAgICAgXCJpZ25vcmVNaXNzaW5nXCI6IFtcbiAgICAgICAgXCJAYWxnb2xpYS9jbGllbnQtc2VhcmNoXCIsXG4gICAgICAgIFwic2VhcmNoLWluc2lnaHRzXCJcbiAgICAgIF1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSAnYzEyJztcbmltcG9ydCB7XG4gIElubGluZUNvbmZpZyxcbiAgSW50ZXJuYWxDb25maWcsXG4gIFVzZXJDb25maWcsXG4gIENvbmZpZ0VudixcbiAgVXNlck1hbmlmZXN0Rm4sXG4gIFVzZXJNYW5pZmVzdCxcbiAgV3h0Vml0ZUNvbmZpZyxcbiAgRXh0ZW5zaW9uUnVubmVyQ29uZmlnLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7IGNyZWF0ZUZzQ2FjaGUgfSBmcm9tICcuL2NyZWF0ZUZzQ2FjaGUnO1xuaW1wb3J0IGNvbnNvbGEsIHsgTG9nTGV2ZWxzIH0gZnJvbSAnY29uc29sYSc7XG5pbXBvcnQgKiBhcyBwbHVnaW5zIGZyb20gJy4uL3ZpdGUtcGx1Z2lucyc7XG5pbXBvcnQgeyBnZXRHbG9iYWxzIH0gZnJvbSAnLi9nbG9iYWxzJztcblxuLyoqXG4gKiBHaXZlbiBhbiBpbmxpbmUgY29uZmlnLCBkaXNjb3ZlciB0aGUgY29uZmlnIGZpbGUgaWYgbmVjZXNzYXJ5LCBtZXJnZSB0aGUgcmVzdWx0cywgcmVzb2x2ZSBhbnlcbiAqIHJlbGF0aXZlIHBhdGhzLCBhbmQgYXBwbHkgYW55IGRlZmF1bHRzLlxuICpcbiAqIElubGluZSBjb25maWcgYWx3YXlzIGhhcyBwcmlvcml0eSBvdmVyIHVzZXIgY29uZmlnLiBDbGkgZmxhZ3MgYXJlIHBhc3NlZCBhcyBpbmxpbmUgY29uZmlnIGlmIHNldC5cbiAqIElmIHVuc2V0LCB1bmRlZmluZWQgaXMgcGFzc2VkIGluLCBsZXR0aW5nIHRoaXMgZnVuY3Rpb24gZGVjaWRlIGRlZmF1bHQgdmFsdWVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SW50ZXJuYWxDb25maWcoXG4gIGlubGluZUNvbmZpZzogSW5saW5lQ29uZmlnLFxuICBjb21tYW5kOiAnYnVpbGQnIHwgJ3NlcnZlJyxcbik6IFByb21pc2U8SW50ZXJuYWxDb25maWc+IHtcbiAgLy8gTG9hZCB1c2VyIGNvbmZpZ1xuXG4gIGxldCB1c2VyQ29uZmlnOiBVc2VyQ29uZmlnID0ge307XG4gIGxldCB1c2VyQ29uZmlnTWV0YWRhdGE6IEludGVybmFsQ29uZmlnWyd1c2VyQ29uZmlnTWV0YWRhdGEnXSB8IHVuZGVmaW5lZDtcbiAgaWYgKGlubGluZUNvbmZpZy5jb25maWdGaWxlICE9PSBmYWxzZSkge1xuICAgIGNvbnN0IHsgY29uZmlnOiBsb2FkZWRDb25maWcsIC4uLm1ldGFkYXRhIH0gPSBhd2FpdCBsb2FkQ29uZmlnPFVzZXJDb25maWc+KHtcbiAgICAgIG5hbWU6ICd3eHQnLFxuICAgICAgY3dkOiBpbmxpbmVDb25maWcucm9vdCA/PyBwcm9jZXNzLmN3ZCgpLFxuICAgICAgcmNGaWxlOiBmYWxzZSxcbiAgICB9KTtcbiAgICB1c2VyQ29uZmlnID0gbG9hZGVkQ29uZmlnID8/IHt9O1xuICAgIHVzZXJDb25maWdNZXRhZGF0YSA9IG1ldGFkYXRhO1xuICB9XG5cbiAgLy8gTWVyZ2UgaXQgaW50byB0aGUgaW5saW5lIGNvbmZpZ1xuXG4gIGNvbnN0IG1lcmdlZENvbmZpZyA9IG1lcmdlSW5saW5lQ29uZmlnKGlubGluZUNvbmZpZywgdXNlckNvbmZpZyk7XG5cbiAgLy8gQXBwbHkgZGVmYXVsdHMgdG8gbWFrZSBpbnRlcm5hbCBjb25maWcuXG5cbiAgY29uc3QgZGVidWcgPSBtZXJnZWRDb25maWcuZGVidWcgPz8gZmFsc2U7XG4gIGNvbnN0IGxvZ2dlciA9IG1lcmdlZENvbmZpZy5sb2dnZXIgPz8gY29uc29sYTtcbiAgaWYgKGRlYnVnKSBsb2dnZXIubGV2ZWwgPSBMb2dMZXZlbHMuZGVidWc7XG5cbiAgY29uc3QgYnJvd3NlciA9IG1lcmdlZENvbmZpZy5icm93c2VyID8/ICdjaHJvbWUnO1xuICBjb25zdCBtYW5pZmVzdFZlcnNpb24gPVxuICAgIG1lcmdlZENvbmZpZy5tYW5pZmVzdFZlcnNpb24gPz8gKGJyb3dzZXIgPT0gJ2ZpcmVmb3gnID8gMiA6IDMpO1xuICBjb25zdCBtb2RlID1cbiAgICBtZXJnZWRDb25maWcubW9kZSA/PyAoY29tbWFuZCA9PT0gJ2J1aWxkJyA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCcpO1xuICBjb25zdCBlbnY6IENvbmZpZ0VudiA9IHsgYnJvd3NlciwgY29tbWFuZCwgbWFuaWZlc3RWZXJzaW9uLCBtb2RlIH07XG5cbiAgY29uc3Qgcm9vdCA9IHBhdGgucmVzb2x2ZShcbiAgICBpbmxpbmVDb25maWcucm9vdCA/PyB1c2VyQ29uZmlnLnJvb3QgPz8gcHJvY2Vzcy5jd2QoKSxcbiAgKTtcbiAgY29uc3Qgd3h0RGlyID0gcGF0aC5yZXNvbHZlKHJvb3QsICcud3h0Jyk7XG4gIGNvbnN0IHNyY0RpciA9IHBhdGgucmVzb2x2ZShyb290LCBtZXJnZWRDb25maWcuc3JjRGlyID8/IHJvb3QpO1xuICBjb25zdCBlbnRyeXBvaW50c0RpciA9IHBhdGgucmVzb2x2ZShcbiAgICBzcmNEaXIsXG4gICAgbWVyZ2VkQ29uZmlnLmVudHJ5cG9pbnRzRGlyID8/ICdlbnRyeXBvaW50cycsXG4gICk7XG4gIGNvbnN0IHB1YmxpY0RpciA9IHBhdGgucmVzb2x2ZShzcmNEaXIsIG1lcmdlZENvbmZpZy5wdWJsaWNEaXIgPz8gJ3B1YmxpYycpO1xuICBjb25zdCB0eXBlc0RpciA9IHBhdGgucmVzb2x2ZSh3eHREaXIsICd0eXBlcycpO1xuICBjb25zdCBvdXRCYXNlRGlyID0gcGF0aC5yZXNvbHZlKHJvb3QsICcub3V0cHV0Jyk7XG4gIGNvbnN0IG91dERpciA9IHBhdGgucmVzb2x2ZShvdXRCYXNlRGlyLCBgJHticm93c2VyfS1tdiR7bWFuaWZlc3RWZXJzaW9ufWApO1xuXG4gIGNvbnN0IHJ1bm5lckNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWc8RXh0ZW5zaW9uUnVubmVyQ29uZmlnPih7XG4gICAgbmFtZTogJ3dlYi1leHQnLFxuICAgIGN3ZDogcm9vdCxcbiAgICBnbG9iYWxSYzogdHJ1ZSxcbiAgICByY0ZpbGU6ICcud2ViZXh0cmMnLFxuICAgIG92ZXJyaWRlczogaW5saW5lQ29uZmlnLnJ1bm5lcixcbiAgICBkZWZhdWx0czogdXNlckNvbmZpZy5ydW5uZXIsXG4gIH0pO1xuXG4gIGNvbnN0IGZpbmFsQ29uZmlnOiBJbnRlcm5hbENvbmZpZyA9IHtcbiAgICBicm93c2VyLFxuICAgIGNvbW1hbmQsXG4gICAgZGVidWcsXG4gICAgZW50cnlwb2ludHNEaXIsXG4gICAgZW52LFxuICAgIGZzQ2FjaGU6IGNyZWF0ZUZzQ2FjaGUod3h0RGlyKSxcbiAgICBpbXBvcnRzOiBtZXJnZWRDb25maWcuaW1wb3J0cyA/PyB7fSxcbiAgICBsb2dnZXIsXG4gICAgbWFuaWZlc3Q6IGF3YWl0IHJlc29sdmVNYW5pZmVzdENvbmZpZyhlbnYsIG1lcmdlZENvbmZpZy5tYW5pZmVzdCksXG4gICAgbWFuaWZlc3RWZXJzaW9uLFxuICAgIG1vZGUsXG4gICAgb3V0QmFzZURpcixcbiAgICBvdXREaXIsXG4gICAgcHVibGljRGlyLFxuICAgIHJvb3QsXG4gICAgcnVubmVyQ29uZmlnLFxuICAgIHNyY0RpcixcbiAgICB0eXBlc0RpcixcbiAgICB2aXRlOiAoKSA9PiAoe30pLCAvLyBSZWFsIHZhbHVlIGFkZGVkIGFmdGVyIHRoaXMgb2JqZWN0IGlzIGluaXRpYWxpemVkLlxuICAgIHd4dERpcixcbiAgICB6aXA6IHJlc29sdmVJbnRlcm5hbFppcENvbmZpZyhyb290LCBtZXJnZWRDb25maWcpLFxuICAgIHRyYW5zZm9ybU1hbmlmZXN0KG1hbmlmZXN0KSB7XG4gICAgICB1c2VyQ29uZmlnLnRyYW5zZm9ybU1hbmlmZXN0Py4obWFuaWZlc3QpO1xuICAgICAgaW5saW5lQ29uZmlnLnRyYW5zZm9ybU1hbmlmZXN0Py4obWFuaWZlc3QpO1xuICAgIH0sXG4gICAgYW5hbHlzaXM6IHtcbiAgICAgIGVuYWJsZWQ6IG1lcmdlZENvbmZpZy5hbmFseXNpcz8uZW5hYmxlZCA/PyBmYWxzZSxcbiAgICAgIHRlbXBsYXRlOiBtZXJnZWRDb25maWcuYW5hbHlzaXM/LnRlbXBsYXRlID8/ICd0cmVlbWFwJyxcbiAgICB9LFxuICAgIHVzZXJDb25maWdNZXRhZGF0YTogdXNlckNvbmZpZ01ldGFkYXRhID8/IHt9LFxuICB9O1xuXG4gIGZpbmFsQ29uZmlnLnZpdGUgPSAoZW52KSA9PlxuICAgIHJlc29sdmVJbnRlcm5hbFZpdGVDb25maWcoZW52LCBtZXJnZWRDb25maWcsIGZpbmFsQ29uZmlnKTtcblxuICByZXR1cm4gZmluYWxDb25maWc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVNYW5pZmVzdENvbmZpZyhcbiAgZW52OiBDb25maWdFbnYsXG4gIG1hbmlmZXN0OiBVc2VyTWFuaWZlc3QgfCBQcm9taXNlPFVzZXJNYW5pZmVzdD4gfCBVc2VyTWFuaWZlc3RGbiB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8VXNlck1hbmlmZXN0PiB7XG4gIHJldHVybiBhd2FpdCAodHlwZW9mIG1hbmlmZXN0ID09PSAnZnVuY3Rpb24nXG4gICAgPyBtYW5pZmVzdChlbnYpXG4gICAgOiBtYW5pZmVzdCA/PyB7fSk7XG59XG5cbi8qKlxuICogTWVyZ2UgdGhlIGlubGluZSBjb25maWcgYW5kIHVzZXIgY29uZmlnLiBJbmxpbmUgY29uZmlnIGlzIGdpdmVuIHByaW9yaXR5LiBEZWZhdWx0cyBhcmUgbm90IGFwcGxpZWQgaGVyZS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VJbmxpbmVDb25maWcoXG4gIGlubGluZUNvbmZpZzogSW5saW5lQ29uZmlnLFxuICB1c2VyQ29uZmlnOiBVc2VyQ29uZmlnLFxuKTogSW5saW5lQ29uZmlnIHtcbiAgbGV0IGltcG9ydHM6IElubGluZUNvbmZpZ1snaW1wb3J0cyddO1xuICBpZiAoaW5saW5lQ29uZmlnLmltcG9ydHMgPT09IGZhbHNlIHx8IHVzZXJDb25maWcuaW1wb3J0cyA9PT0gZmFsc2UpIHtcbiAgICBpbXBvcnRzID0gZmFsc2U7XG4gIH0gZWxzZSBpZiAodXNlckNvbmZpZy5pbXBvcnRzID09IG51bGwgJiYgaW5saW5lQ29uZmlnLmltcG9ydHMgPT0gbnVsbCkge1xuICAgIGltcG9ydHMgPSB1bmRlZmluZWQ7XG4gIH0gZWxzZSB7XG4gICAgaW1wb3J0cyA9IHZpdGUubWVyZ2VDb25maWcoXG4gICAgICB1c2VyQ29uZmlnLmltcG9ydHMgPz8ge30sXG4gICAgICBpbmxpbmVDb25maWcuaW1wb3J0cyA/PyB7fSxcbiAgICApO1xuICB9XG4gIGNvbnN0IG1hbmlmZXN0OiBVc2VyTWFuaWZlc3RGbiA9IGFzeW5jIChlbnYpID0+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgcmVzb2x2ZU1hbmlmZXN0Q29uZmlnKGVudiwgdXNlckNvbmZpZy5tYW5pZmVzdCk7XG4gICAgY29uc3QgaW5saW5lID0gYXdhaXQgcmVzb2x2ZU1hbmlmZXN0Q29uZmlnKGVudiwgaW5saW5lQ29uZmlnLm1hbmlmZXN0KTtcbiAgICByZXR1cm4gdml0ZS5tZXJnZUNvbmZpZyh1c2VyLCBpbmxpbmUpO1xuICB9O1xuICBjb25zdCB2aXRlQ29uZmlnID0gYXN5bmMgKGVudjogQ29uZmlnRW52KTogUHJvbWlzZTxXeHRWaXRlQ29uZmlnPiA9PiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHVzZXJDb25maWcudml0ZT8uKGVudik7XG4gICAgY29uc3QgaW5saW5lID0gYXdhaXQgaW5saW5lQ29uZmlnLnZpdGU/LihlbnYpO1xuICAgIHJldHVybiB2aXRlLm1lcmdlQ29uZmlnKHVzZXIgPz8ge30sIGlubGluZSA/PyB7fSk7XG4gIH07XG4gIGNvbnN0IHJ1bm5lcjogSW5saW5lQ29uZmlnWydydW5uZXInXSA9IHZpdGUubWVyZ2VDb25maWcoXG4gICAgdXNlckNvbmZpZy5ydW5uZXIgPz8ge30sXG4gICAgaW5saW5lQ29uZmlnLnJ1bm5lciA/PyB7fSxcbiAgKTtcbiAgY29uc3QgemlwOiBJbmxpbmVDb25maWdbJ3ppcCddID0gdml0ZS5tZXJnZUNvbmZpZyhcbiAgICB1c2VyQ29uZmlnLnppcCA/PyB7fSxcbiAgICBpbmxpbmVDb25maWcuemlwID8/IHt9LFxuICApO1xuXG4gIHJldHVybiB7XG4gICAgcm9vdDogaW5saW5lQ29uZmlnLnJvb3QgPz8gdXNlckNvbmZpZy5yb290LFxuICAgIGJyb3dzZXI6IGlubGluZUNvbmZpZy5icm93c2VyID8/IHVzZXJDb25maWcuYnJvd3NlcixcbiAgICBtYW5pZmVzdFZlcnNpb246IGlubGluZUNvbmZpZy5tYW5pZmVzdFZlcnNpb24gPz8gdXNlckNvbmZpZy5tYW5pZmVzdFZlcnNpb24sXG4gICAgY29uZmlnRmlsZTogaW5saW5lQ29uZmlnLmNvbmZpZ0ZpbGUsXG4gICAgZGVidWc6IGlubGluZUNvbmZpZy5kZWJ1ZyA/PyB1c2VyQ29uZmlnLmRlYnVnLFxuICAgIGVudHJ5cG9pbnRzRGlyOiBpbmxpbmVDb25maWcuZW50cnlwb2ludHNEaXIgPz8gdXNlckNvbmZpZy5lbnRyeXBvaW50c0RpcixcbiAgICBpbXBvcnRzLFxuICAgIGxvZ2dlcjogaW5saW5lQ29uZmlnLmxvZ2dlciA/PyB1c2VyQ29uZmlnLmxvZ2dlcixcbiAgICBtYW5pZmVzdCxcbiAgICBtb2RlOiBpbmxpbmVDb25maWcubW9kZSA/PyB1c2VyQ29uZmlnLm1vZGUsXG4gICAgcHVibGljRGlyOiBpbmxpbmVDb25maWcucHVibGljRGlyID8/IHVzZXJDb25maWcucHVibGljRGlyLFxuICAgIHJ1bm5lcixcbiAgICBzcmNEaXI6IGlubGluZUNvbmZpZy5zcmNEaXIgPz8gdXNlckNvbmZpZy5zcmNEaXIsXG4gICAgdml0ZTogdml0ZUNvbmZpZyxcbiAgICB6aXAsXG4gICAgYW5hbHlzaXM6IHtcbiAgICAgIGVuYWJsZWQ6IGlubGluZUNvbmZpZy5hbmFseXNpcz8uZW5hYmxlZCA/PyB1c2VyQ29uZmlnLmFuYWx5c2lzPy5lbmFibGVkLFxuICAgICAgdGVtcGxhdGU6XG4gICAgICAgIGlubGluZUNvbmZpZy5hbmFseXNpcz8udGVtcGxhdGUgPz8gdXNlckNvbmZpZy5hbmFseXNpcz8udGVtcGxhdGUsXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUludGVybmFsWmlwQ29uZmlnKFxuICByb290OiBzdHJpbmcsXG4gIG1lcmdlZENvbmZpZzogSW5saW5lQ29uZmlnLFxuKTogSW50ZXJuYWxDb25maWdbJ3ppcCddIHtcbiAgcmV0dXJuIHtcbiAgICBzb3VyY2VzVGVtcGxhdGU6ICd7e25hbWV9fS17e3ZlcnNpb259fS1zb3VyY2VzLnppcCcsXG4gICAgYXJ0aWZhY3RUZW1wbGF0ZTogJ3t7bmFtZX19LXt7dmVyc2lvbn19LXt7YnJvd3Nlcn19LnppcCcsXG4gICAgc291cmNlc1Jvb3Q6IHJvb3QsXG4gICAgLi4ubWVyZ2VkQ29uZmlnLnppcCxcbiAgICBpZ25vcmVkU291cmNlczogW1xuICAgICAgJyoqL25vZGVfbW9kdWxlcycsXG4gICAgICAvLyBXWFQgZmlsZXNcbiAgICAgICcqKi93ZWItZXh0LmNvbmZpZy50cycsXG4gICAgICAvLyBIaWRkZW4gZmlsZXNcbiAgICAgICcqKi8uKicsXG4gICAgICAvLyBUZXN0c1xuICAgICAgJyoqL19fdGVzdHNfXy8qKicsXG4gICAgICAnKiovKi4rKHRlc3R8c3BlYykuPyhjfG0pKyhqfHQpcz8oeCknLFxuICAgICAgLy8gRnJvbSB1c2VyXG4gICAgICAuLi4obWVyZ2VkQ29uZmlnLnppcD8uaWdub3JlZFNvdXJjZXMgPz8gW10pLFxuICAgIF0sXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVJbnRlcm5hbFZpdGVDb25maWcoXG4gIGVudjogQ29uZmlnRW52LFxuICBtZXJnZWRDb25maWc6IElubGluZUNvbmZpZyxcbiAgZmluYWxDb25maWc6IEludGVybmFsQ29uZmlnLFxuKSB7XG4gIGNvbnN0IGludGVybmFsVml0ZTogdml0ZS5JbmxpbmVDb25maWcgPVxuICAgIChhd2FpdCBtZXJnZWRDb25maWcudml0ZT8uKGVudikpID8/IHt9O1xuXG4gIGludGVybmFsVml0ZS5yb290ID0gZmluYWxDb25maWcucm9vdDtcbiAgaW50ZXJuYWxWaXRlLmNvbmZpZ0ZpbGUgPSBmYWxzZTtcbiAgaW50ZXJuYWxWaXRlLmxvZ0xldmVsID0gJ3dhcm4nO1xuICBpbnRlcm5hbFZpdGUubW9kZSA9IGVudi5tb2RlO1xuXG4gIGludGVybmFsVml0ZS5idWlsZCA/Pz0ge307XG4gIGludGVybmFsVml0ZS5idWlsZC5vdXREaXIgPSBmaW5hbENvbmZpZy5vdXREaXI7XG4gIGludGVybmFsVml0ZS5idWlsZC5lbXB0eU91dERpciA9IGZhbHNlO1xuXG4gIGludGVybmFsVml0ZS5wbHVnaW5zID8/PSBbXTtcbiAgaW50ZXJuYWxWaXRlLnBsdWdpbnMucHVzaChwbHVnaW5zLmRvd25sb2FkKGZpbmFsQ29uZmlnKSk7XG4gIGludGVybmFsVml0ZS5wbHVnaW5zLnB1c2gocGx1Z2lucy5kZXZIdG1sUHJlcmVuZGVyKGZpbmFsQ29uZmlnKSk7XG4gIGludGVybmFsVml0ZS5wbHVnaW5zLnB1c2gocGx1Z2lucy51bmltcG9ydChmaW5hbENvbmZpZykpO1xuICBpbnRlcm5hbFZpdGUucGx1Z2lucy5wdXNoKFxuICAgIHBsdWdpbnMudmlydHVhbEVudHJ5cG9pbignYmFja2dyb3VuZCcsIGZpbmFsQ29uZmlnKSxcbiAgKTtcbiAgaW50ZXJuYWxWaXRlLnBsdWdpbnMucHVzaChcbiAgICBwbHVnaW5zLnZpcnR1YWxFbnRyeXBvaW4oJ2NvbnRlbnQtc2NyaXB0JywgZmluYWxDb25maWcpLFxuICApO1xuICBpbnRlcm5hbFZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMuZGV2U2VydmVyR2xvYmFscyhmaW5hbENvbmZpZykpO1xuICBpbnRlcm5hbFZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMudHNjb25maWdQYXRocyhmaW5hbENvbmZpZykpO1xuICBpbnRlcm5hbFZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMubm9vcEJhY2tncm91bmQoKSk7XG4gIGlmIChmaW5hbENvbmZpZy5hbmFseXNpcy5lbmFibGVkKSB7XG4gICAgaW50ZXJuYWxWaXRlLnBsdWdpbnMucHVzaChwbHVnaW5zLmJ1bmRsZUFuYWx5c2lzKCkpO1xuICB9XG5cbiAgaW50ZXJuYWxWaXRlLmRlZmluZSA/Pz0ge307XG4gIGZvciAoY29uc3QgZ2xvYmFsIG9mIGdldEdsb2JhbHMoZmluYWxDb25maWcpKSB7XG4gICAgaW50ZXJuYWxWaXRlLmRlZmluZVtnbG9iYWwubmFtZV0gPSBKU09OLnN0cmluZ2lmeShnbG9iYWwudmFsdWUpO1xuICB9XG4gIHJldHVybiBpbnRlcm5hbFZpdGU7XG59XG4iLCAiaW1wb3J0IGZzLCB7IGVuc3VyZURpciB9IGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IEZzQ2FjaGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyB3cml0ZUZpbGVJZkRpZmZlcmVudCB9IGZyb20gJy4vZnMnO1xuXG4vKipcbiAqIEEgYmFzaWMgZmlsZSBzeXN0ZW0gY2FjaGUgc3RvcmVkIGF0IGA8c3JjRGlyPi8ud3h0L2NhY2hlLzxrZXk+YC4gSnVzdCBjYWNoZXMgYSBzdHJpbmcgaW4gYVxuICogZmlsZSBmb3IgdGhlIGdpdmVuIGtleS5cbiAqXG4gKiBAcGFyYW0gc3JjRGlyIEFic29sdXRlIHBhdGggdG8gc291cmNlIGRpcmVjdG9yeS4gU2VlIGBJbnRlcm5hbENvbmZpZy5zcmNEaXJgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGc0NhY2hlKHd4dERpcjogc3RyaW5nKTogRnNDYWNoZSB7XG4gIGNvbnN0IGdldFBhdGggPSAoa2V5OiBzdHJpbmcpID0+XG4gICAgcmVzb2x2ZSh3eHREaXIsICdjYWNoZScsIGVuY29kZVVSSUNvbXBvbmVudChrZXkpKTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGdldFBhdGgoa2V5KTtcbiAgICAgIGF3YWl0IGVuc3VyZURpcihkaXJuYW1lKHBhdGgpKTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZUlmRGlmZmVyZW50KHBhdGgsIHZhbHVlKTtcbiAgICB9LFxuICAgIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChrZXkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuXG4vKipcbiAqIE9ubHkgd3JpdGUgdGhlIGNvbnRlbnRzIHRvIGEgZmlsZSBpZiBpdCByZXN1bHRzIGluIGEgY2hhbmdlLiBUaGlzIHByZXZlbnRzIHVubmVjZXNzYXJ5IGZpbGVcbiAqIHdhdGNoZXJzIGZyb20gYmVpbmcgdHJpZ2dlcmVkLCBsaWtlIFdYVCdzIGRldiBzZXJ2ZXIgb3IgdGhlIFRTIGxhbmd1YWdlIHNlcnZlciBpbiBlZGl0b3JzLlxuICpcbiAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIHdyaXRlIHRvLlxuICogQHBhcmFtIG5ld0NvbnRlbnRzIFRoZSBuZXcgdGV4dCBjb250ZW50IHRvIHdyaXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWxlSWZEaWZmZXJlbnQoXG4gIGZpbGU6IHN0cmluZyxcbiAgbmV3Q29udGVudHM6IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnRzID0gYXdhaXQgZnNcbiAgICAucmVhZEZpbGUoZmlsZSwgJ3V0Zi04JylcbiAgICAuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcblxuICBpZiAoZXhpc3RpbmdDb250ZW50cyAhPT0gbmV3Q29udGVudHMpIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZSwgbmV3Q29udGVudHMpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRW50cnlwb2ludCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBwYXRoLCB7IHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tICcuL3BhdGhzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudHJ5cG9pbnROYW1lKFxuICBlbnRyeXBvaW50c0Rpcjogc3RyaW5nLFxuICBpbnB1dFBhdGg6IHN0cmluZyxcbiAgLy8gdHlwZTogRW50cnlwb2ludFsndHlwZSddLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShlbnRyeXBvaW50c0RpciwgaW5wdXRQYXRoKTtcbiAgLy8gR3JhYiB0aGUgc3RyaW5nIHVwIHRvIHRoZSBmaXJzdCAuIG9yIC8gb3IgXFxcXFxuICBjb25zdCBuYW1lID0gcmVsYXRpdmVQYXRoLnNwbGl0KC9bXFwuXFwvXFxcXF0vLCAyKVswXTtcblxuICByZXR1cm4gbmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudHJ5cG9pbnRPdXRwdXRGaWxlKFxuICBlbnRyeXBvaW50OiBFbnRyeXBvaW50LFxuICBleHQ6IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIHJldHVybiByZXNvbHZlKGVudHJ5cG9pbnQub3V0cHV0RGlyLCBgJHtlbnRyeXBvaW50Lm5hbWV9JHtleHR9YCk7XG59XG5cbi8qKlxuICogUmV0dXJuJ3MgdGhlIGVudHJ5cG9pbnQncyBvdXRwdXQgcGF0aCByZWxhdGl2ZSB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gVXNlZCBmb3IgcGF0aHMgaW4gdGhlXG4gKiBtYW5pZmVzdCBhbmQgcm9sbHVwJ3MgYnVuZGxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gIGVudHJ5cG9pbnQ6IEVudHJ5cG9pbnQsXG4gIG91dERpcjogc3RyaW5nLFxuICBleHQ6IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIHJldHVybiBub3JtYWxpemVQYXRoKFxuICAgIHJlbGF0aXZlKG91dERpciwgZ2V0RW50cnlwb2ludE91dHB1dEZpbGUoZW50cnlwb2ludCwgZXh0KSksXG4gICk7XG59XG4iLCAiaW1wb3J0IG5vZGVQYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgKiBhcyB2aXRlIGZyb20gJ3ZpdGUnO1xuXG4vKipcbiAqIENvbnZlcnRzIHN5c3RlbSBwYXRocyB0byBub3JtYWxpemVkIGJ1bmRsZXIgcGF0aC4gT24gd2luZG93cyBhbmQgdW5peCwgdGhpcyByZXR1cm5zIHBhdGhzIHdpdGggL1xuICogaW5zdGVhZCBvZiBcXC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZpdGUubm9ybWFsaXplUGF0aChwYXRoKTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIG5vcm1hbGl6ZWQgcGF0aCwgY29udmVydCBpdCB0byB0aGUgc3lzdGVtIHBhdGggc3R5bGUuIE9uIFdpbmRvd3MsIHN3aXRjaCB0byBcXCwgb3RoZXJ3aXNlIHVzZSAvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5ub3JtYWxpemVQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBub2RlUGF0aC5ub3JtYWxpemUocGF0aCk7XG59XG5cbmV4cG9ydCBjb25zdCBDU1NfRVhURU5TSU9OUyA9IFsnY3NzJywgJ3Njc3MnLCAnc2FzcycsICdsZXNzJywgJ3N0eWwnLCAnc3R5bHVzJ107XG5cbi8vIC5tb2R1bGUuY3NzIGZpbGVzIGFyZSBub3Qgc3VwcG9ydGVkIGJlY2F1c2UgdGhlc2UgYXJlIGdsb2JhbCBDU1MgZmlsZXMsIHNvIHVzaW5nIENTUyBtb2R1bGVzIGRvZXNuJ3QgbWFrZSBzZW5zZS5cbmV4cG9ydCBjb25zdCBDU1NfRVhURU5TSU9OU19QQVRURVJOID0gYCsoJHtDU1NfRVhURU5TSU9OUy5qb2luKCd8Jyl9KWA7XG4iLCAiaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludE5hbWUgfSBmcm9tICcuLi91dGlscy9lbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBwYXJzZUhUTUwgfSBmcm9tICdsaW5rZWRvbSc7XG5pbXBvcnQgeyBkaXJuYW1lLCBpc0Fic29sdXRlLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuXG4vKipcbiAqIFByZS1yZW5kZXJzIHRoZSBIVE1MIGVudHJ5cG9pbnRzIHdoZW4gYnVpbGRpbmcgdGhlIGV4dGVuc2lvbiB0byBjb25uZWN0IHRvIHRoZSBkZXYgc2VydmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV2SHRtbFByZXJlbmRlcihjb25maWc6IEludGVybmFsQ29uZmlnKTogdml0ZS5QbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIGFwcGx5OiAnYnVpbGQnLFxuICAgIG5hbWU6ICd3eHQ6ZGV2LWh0bWwtcHJlcmVuZGVyJyxcbiAgICBjb25maWcoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXNvbHZlOiB7XG4gICAgICAgICAgYWxpYXM6IHtcbiAgICAgICAgICAgICdAd3h0L3JlbG9hZC1odG1sJzogcmVzb2x2ZShcbiAgICAgICAgICAgICAgY29uZmlnLnJvb3QsXG4gICAgICAgICAgICAgICdub2RlX21vZHVsZXMvd3h0L2Rpc3QvdmlydHVhbC1tb2R1bGVzL3JlbG9hZC1odG1sLmpzJyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBhc3luYyB0cmFuc2Zvcm0oaHRtbCwgaWQpIHtcbiAgICAgIGNvbnN0IHNlcnZlciA9IGNvbmZpZy5zZXJ2ZXI7XG4gICAgICBpZiAoY29uZmlnLmNvbW1hbmQgIT09ICdzZXJ2ZScgfHwgc2VydmVyID09IG51bGwgfHwgIWlkLmVuZHNXaXRoKCcuaHRtbCcpKVxuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsVXJsID0gYCR7c2VydmVyLm9yaWdpbn0ke2lkfWA7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0RW50cnlwb2ludE5hbWUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCBpZCk7XG4gICAgICBjb25zdCB1cmwgPSBgJHtzZXJ2ZXIub3JpZ2lufS8ke25hbWV9Lmh0bWxgO1xuICAgICAgY29uc3Qgc2VydmVySHRtbCA9IGF3YWl0IHNlcnZlci50cmFuc2Zvcm1JbmRleEh0bWwoXG4gICAgICAgIHVybCxcbiAgICAgICAgaHRtbCxcbiAgICAgICAgb3JpZ2luYWxVcmwsXG4gICAgICApO1xuICAgICAgY29uc3QgeyBkb2N1bWVudCB9ID0gcGFyc2VIVE1MKHNlcnZlckh0bWwpO1xuXG4gICAgICBjb25zdCBwb2ludFRvRGV2U2VydmVyID0gKHF1ZXJ5U2VsZWN0b3I6IHN0cmluZywgYXR0cjogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnlTZWxlY3RvcikuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNyYyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHIpO1xuICAgICAgICAgIGlmICghc3JjKSByZXR1cm47XG5cbiAgICAgICAgICBpZiAoaXNBYnNvbHV0ZShzcmMpKSB7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLCBzZXJ2ZXIub3JpZ2luICsgc3JjKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNyYy5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGFicyA9IHJlc29sdmUoZGlybmFtZShpZCksIHNyYyk7XG4gICAgICAgICAgICBjb25zdCBwYXRobmFtZSA9IHJlbGF0aXZlKGNvbmZpZy5yb290LCBhYnMpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ciwgYCR7c2VydmVyLm9yaWdpbn0vJHtwYXRobmFtZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHBvaW50VG9EZXZTZXJ2ZXIoJ3NjcmlwdFt0eXBlPW1vZHVsZV0nLCAnc3JjJyk7XG4gICAgICBwb2ludFRvRGV2U2VydmVyKCdsaW5rW3JlbD1zdHlsZXNoZWV0XScsICdocmVmJyk7XG5cbiAgICAgIC8vIEFkZCBhIHNjcmlwdCB0byBhZGQgcGFnZSByZWxvYWRpbmdcbiAgICAgIGNvbnN0IHJlbG9hZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICByZWxvYWRlci5zcmMgPSAnQHd4dC9yZWxvYWQtaHRtbCc7XG4gICAgICByZWxvYWRlci50eXBlID0gJ21vZHVsZSc7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHJlbG9hZGVyKTtcblxuICAgICAgY29uc3QgbmV3SHRtbCA9IGRvY3VtZW50LnRvU3RyaW5nKCk7XG4gICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCdUcmFuc2Zvcm1lZCAnICsgaWQpO1xuICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnT2xkIEhUTUw6XFxuJyArIGh0bWwpO1xuICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnTmV3IEhUTUw6XFxuJyArIG5ld0h0bWwpO1xuICAgICAgcmV0dXJuIG5ld0h0bWw7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIERlZmluZXMgZ2xvYmFsIGNvbnN0YW50cyBhYm91dCB0aGUgZGV2IHNlcnZlci4gSGVscHMgc2NyaXB0cyBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIncyB3ZWIgc29ja2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV2U2VydmVyR2xvYmFscyhpbnRlcm5hbENvbmZpZzogSW50ZXJuYWxDb25maWcpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6ZGV2LXNlcnZlci1nbG9iYWxzJyxcbiAgICBjb25maWcoKSB7XG4gICAgICBpZiAoaW50ZXJuYWxDb25maWcuc2VydmVyID09IG51bGwgfHwgaW50ZXJuYWxDb25maWcuY29tbWFuZCA9PSAnYnVpbGQnKVxuICAgICAgICByZXR1cm47XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRlZmluZToge1xuICAgICAgICAgIF9fREVWX1NFUlZFUl9QUk9UT0NPTF9fOiBKU09OLnN0cmluZ2lmeSgnd3M6JyksXG4gICAgICAgICAgX19ERVZfU0VSVkVSX0hPU1ROQU1FX186IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgaW50ZXJuYWxDb25maWcuc2VydmVyLmhvc3RuYW1lLFxuICAgICAgICAgICksXG4gICAgICAgICAgX19ERVZfU0VSVkVSX1BPUlRfXzogSlNPTi5zdHJpbmdpZnkoaW50ZXJuYWxDb25maWcuc2VydmVyLnBvcnQpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCBkbnMgZnJvbSAnbm9kZTpkbnMnO1xuaW1wb3J0IHsgd2l0aFRpbWVvdXQgfSBmcm9tICcuL3Byb21pc2VzJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5mdW5jdGlvbiBpc09mZmxpbmUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGlzT2ZmbGluZSA9IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXMpID0+IHtcbiAgICBkbnMucmVzb2x2ZSgnZ29vZ2xlLmNvbScsIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIgPT0gbnVsbCkge1xuICAgICAgICByZXMoZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzKHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHdpdGhUaW1lb3V0KGlzT2ZmbGluZSwgMWUzKS5jYXRjaCgoKSA9PiB0cnVlKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzT25saW5lKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBvZmZsaW5lID0gYXdhaXQgaXNPZmZsaW5lKCk7XG4gIHJldHVybiAhb2ZmbGluZTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIGEgVVJMIHdpdGggYSBzaW1wbGUgR0VUIHJlcXVlc3QuIEdyYWJzIGl0IGZyb20gY2FjaGUgaWYgaXQgZG9lc24ndCBleGlzdCwgb3IgdGhyb3dzIGFuXG4gKiBlcnJvciBpZiBpdCBjYW4ndCBiZSByZXNvbHZlZCB2aWEgdGhlIG5ldHdvcmsgb3IgY2FjaGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaENhY2hlZChcbiAgdXJsOiBzdHJpbmcsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBsZXQgY29udGVudDogc3RyaW5nID0gJyc7XG5cbiAgaWYgKGF3YWl0IGlzT25saW5lKCkpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIGlmIChyZXMuc3RhdHVzIDwgMzAwKSB7XG4gICAgICBjb250ZW50ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgIGF3YWl0IGNvbmZpZy5mc0NhY2hlLnNldCh1cmwsIGNvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgRmFpbGVkIHRvIGRvd25sb2FkIFwiJHt1cmx9XCIsIGZhbGxpbmcgYmFjayB0byBjYWNoZS4uLmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29udGVudCkgY29udGVudCA9IChhd2FpdCBjb25maWcuZnNDYWNoZS5nZXQodXJsKSkgPz8gJyc7XG4gIGlmICghY29udGVudClcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBPZmZsaW5lIGFuZCBcIiR7dXJsfVwiIGhhcyBub3QgYmVlbiBjYWNoZWQuIFRyeSBhZ2FpbiB3aGVuIG9ubGluZS5gLFxuICAgICk7XG5cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG4iLCAiLyoqXG4gKiBBZGQgYSB0aW1lb3V0IHRvIGEgcHJvbWlzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhUaW1lb3V0PFQ+KFxuICBwcm9taXNlOiBQcm9taXNlPFQ+LFxuICBkdXJhdGlvbjogbnVtYmVyLFxuKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICByZWooYFByb21pc2UgdGltZWQgb3V0IGFmdGVyICR7ZHVyYXRpb259bXNgKTtcbiAgICB9LCBkdXJhdGlvbik7XG4gICAgcHJvbWlzZVxuICAgICAgLnRoZW4ocmVzKVxuICAgICAgLmNhdGNoKHJlailcbiAgICAgIC5maW5hbGx5KCgpID0+IGNsZWFyVGltZW91dCh0aW1lb3V0KSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIERvbid0IHVzZSBpbiBwcm9kdWN0aW9uLCBqdXN0IGZvciB0ZXN0aW5nIGFuZCBzbG93aW5nIHRoaW5ncyBkb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlcykgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG59XG4iLCAiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGZldGNoQ2FjaGVkIH0gZnJvbSAnLi4vdXRpbHMvbmV0d29yayc7XG5cbi8qKlxuICogRG93bmxvYWRzIGFueSBVUkwgaW1wb3J0cywgbGlrZSBHb29nbGUgQW5hbHl0aWNzLCBpbnRvIHZpcnR1YWwgbW9kdWxlcyBzbyB0aGV5IGFyZSBidW5kbGVkIHdpdGhcbiAqIHRoZSBleHRlbnNpb24gaW5zdGVhZCBvZiBkZXBlbmRpbmcgb24gcmVtb3RlIGNvZGUgYXQgcnVudGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IFwidXJsOmh0dHBzOi8vZ29vZ2xlLXRhZ21hbmFnZXIuY29tL2d0YWc/aWQ9WFlaXCI7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZChjb25maWc6IEludGVybmFsQ29uZmlnKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd3h0OmRvd25sb2FkJyxcbiAgICByZXNvbHZlSWQoaWQpIHtcbiAgICAgIGlmIChpZC5zdGFydHNXaXRoKCd1cmw6JykpIHJldHVybiAnXFwwJyArIGlkO1xuICAgIH0sXG4gICAgYXN5bmMgbG9hZChpZCkge1xuICAgICAgaWYgKCFpZC5zdGFydHNXaXRoKCdcXDB1cmw6JykpIHJldHVybjtcblxuICAgICAgLy8gTG9hZCBmaWxlIGZyb20gbmV0d29yayBvciBjYWNoZVxuICAgICAgY29uc3QgdXJsID0gaWQucmVwbGFjZSgnXFwwdXJsOicsICcnKTtcbiAgICAgIHJldHVybiBhd2FpdCBmZXRjaENhY2hlZCh1cmwsIGNvbmZpZyk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgKiBhcyB2aXRlIGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgRW50cnlwb2ludCwgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBleHRuYW1lLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IGZzLCB7IGVuc3VyZURpciB9IGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tICcuLi91dGlscy9wYXRocyc7XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgSFRNTCBmaWxlcyBvdXRwdXQgYnkgYSBtdWx0aXBhZ2UgYnVpbGQgYXJlIGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uLiBUaGlzIGRvZXMgdHdvXG4gKiB0aGluZ3M6XG4gKlxuICogMS4gTW92ZXMgdGhlIEhNVEwgZmlsZXMgdG8gdGhlaXIgZmluYWwgbG9jYXRpb24gYXQgYDxvdXREaXI+LzxlbnRyeXBvaW50Lm5hbWU+Lmh0bWxgLlxuICogMi4gVXBkYXRlcyB0aGUgYnVuZGxlIHNvIGl0IHN1bW1hcml6ZXMgdGhlIGZpbGVzIGNvcnJlY3RseSBpbiB0aGUgcmV0dXJuZWQgYnVpbGQgb3V0cHV0LlxuICpcbiAqIEFzc2V0cyAoSlMgYW5kIENTUykgYXJlIG91dHB1dCB0byB0aGUgYDxvdXREaXI+L2Fzc2V0c2AgZGlyZWN0b3J5LCBhbmQgZG9uJ3QgbmVlZCB0byBiZSBtb2RpZmllZC5cbiAqIEhUTUwgZmlsZXMgYWNjZXNzIHRoZW0gdmlhIGFic29sdXRlIFVSTHMsIHNvIHdlIGRvbid0IG5lZWQgdG8gdXBkYXRlIGFueSBpbXBvcnQgcGF0aHMgaW4gdGhlIEhUTUxcbiAqIGZpbGVzIGVpdGhlci5cbiAqXG4gKiBUSElTIFBMVUdJTiBTSE9VTEQgT05MWSBCRSBBUFBMSUVEIFRPIE1VTFRJUEFHRSBCVUlMRFMuIEl0IHNob3VsZCBub3QgYmUgYWRkZWQgdG8gZXZlcnkgYnVpbGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBhZ2VNb3ZlKFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogdml0ZS5QbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6bXVsdGlwYWdlLW1vdmUnLFxuICAgIGFzeW5jIHdyaXRlQnVuZGxlKF8sIGJ1bmRsZSkge1xuICAgICAgZm9yIChjb25zdCBvbGRCdW5kbGVQYXRoIGluIGJ1bmRsZSkge1xuICAgICAgICAvLyBvbGRCdW5kbGVQYXRoID0gJ2VudHJ5cG9pbnRzL3BvcHVwLmh0bWwnIG9yICdlbnRyeXBvaW50cy9vcHRpb25zL2luZGV4Lmh0bWwnXG5cbiAgICAgICAgLy8gRmluZCBhIG1hdGNoaW5nIGVudHJ5cG9pbnQgLSBvbGRCdW5kbGVQYXRoIGlzIHRoZSBzYW1lIGFzIGVuZCBlbmQgb2YgdGhlIGlucHV0IHBhdGguXG4gICAgICAgIGNvbnN0IGVudHJ5cG9pbnQgPSBlbnRyeXBvaW50cy5maW5kKFxuICAgICAgICAgIChlbnRyeSkgPT4gISFub3JtYWxpemVQYXRoKGVudHJ5LmlucHV0UGF0aCkuZW5kc1dpdGgob2xkQnVuZGxlUGF0aCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChlbnRyeXBvaW50ID09IG51bGwpIHtcbiAgICAgICAgICBjb25maWcubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYE5vIGVudHJ5cG9pbnQgZm91bmQgZm9yICR7b2xkQnVuZGxlUGF0aH0sIGxlYXZpbmcgaW4gY2h1bmtzIGRpcmVjdG9yeWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgbmV3IGJ1bmRsZSBwYXRoXG4gICAgICAgIGNvbnN0IG5ld0J1bmRsZVBhdGggPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgICAgICBlbnRyeXBvaW50LFxuICAgICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgICAgZXh0bmFtZShvbGRCdW5kbGVQYXRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5ld0J1bmRsZVBhdGggPT09IG9sZEJ1bmRsZVBhdGgpIHtcbiAgICAgICAgICBjb25maWcubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgJ0hUTUwgZmlsZSBpcyBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uJyxcbiAgICAgICAgICAgIG9sZEJ1bmRsZVBhdGgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vdmUgZmlsZSBhbmQgdXBkYXRlIGJ1bmRsZVxuICAgICAgICAvLyBEbyB0aGlzIGluc2lkZSBhIG11dGV4IGxvY2sgc28gaXQgb25seSBydW5zIG9uZSBhdCBhIHRpbWUgZm9yIGNvbmN1cnJlbnQgbXVsdGlwYWdlIGJ1aWxkc1xuICAgICAgICBjb25zdCBvbGRBYnNQYXRoID0gcmVzb2x2ZShjb25maWcub3V0RGlyLCBvbGRCdW5kbGVQYXRoKTtcbiAgICAgICAgY29uc3QgbmV3QWJzUGF0aCA9IHJlc29sdmUoY29uZmlnLm91dERpciwgbmV3QnVuZGxlUGF0aCk7XG4gICAgICAgIGF3YWl0IGVuc3VyZURpcihkaXJuYW1lKG5ld0Fic1BhdGgpKTtcbiAgICAgICAgYXdhaXQgZnMubW92ZShvbGRBYnNQYXRoLCBuZXdBYnNQYXRoLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcblxuICAgICAgICBjb25zdCByZW5hbWVkQ2h1bmsgPSB7XG4gICAgICAgICAgLi4uYnVuZGxlW29sZEJ1bmRsZVBhdGhdLFxuICAgICAgICAgIGZpbGVOYW1lOiBuZXdCdW5kbGVQYXRoLFxuICAgICAgICB9O1xuICAgICAgICBkZWxldGUgYnVuZGxlW29sZEJ1bmRsZVBhdGhdO1xuICAgICAgICBidW5kbGVbbmV3QnVuZGxlUGF0aF0gPSByZW5hbWVkQ2h1bms7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVVbmltcG9ydCB9IGZyb20gJ3VuaW1wb3J0JztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0VW5pbXBvcnRPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvYXV0by1pbXBvcnRzJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBleHRuYW1lIH0gZnJvbSAncGF0aCc7XG5cbmNvbnN0IEVOQUJMRURfRVhURU5TSU9OUzogUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHVuZGVmaW5lZD4gPSB7XG4gICcuanMnOiB0cnVlLFxuICAnLmpzeCc6IHRydWUsXG4gICcudHMnOiB0cnVlLFxuICAnLnRzeCc6IHRydWUsXG4gICcudnVlJzogdHJ1ZSxcbiAgJy5zdmVsdGUnOiB0cnVlLFxufTtcblxuLyoqXG4gKiBJbmplY3QgYW55IGdsb2JhbCBpbXBvcnRzIGRlZmluZWQgYnkgdW5pbXBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaW1wb3J0KGNvbmZpZzogSW50ZXJuYWxDb25maWcpOiB2aXRlLlBsdWdpbk9wdGlvbiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRVbmltcG9ydE9wdGlvbnMoY29uZmlnKTtcbiAgaWYgKG9wdGlvbnMgPT09IGZhbHNlKSByZXR1cm4gW107XG5cbiAgY29uc3QgdW5pbXBvcnQgPSBjcmVhdGVVbmltcG9ydChvcHRpb25zKTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6dW5pbXBvcnQnLFxuICAgIGFzeW5jIGNvbmZpZygpIHtcbiAgICAgIGF3YWl0IHVuaW1wb3J0LnNjYW5JbXBvcnRzRnJvbURpcih1bmRlZmluZWQsIHsgY3dkOiBjb25maWcuc3JjRGlyIH0pO1xuICAgIH0sXG4gICAgYXN5bmMgdHJhbnNmb3JtKGNvZGUsIGlkKSB7XG4gICAgICBjb25zdCBleHQgPSBleHRuYW1lKGlkKTtcbiAgICAgIGlmIChFTkFCTEVEX0VYVEVOU0lPTlNbZXh0XSkgcmV0dXJuIHVuaW1wb3J0LmluamVjdEltcG9ydHMoY29kZSwgaWQpO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHsgVW5pbXBvcnRPcHRpb25zIH0gZnJvbSAndW5pbXBvcnQnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBtZXJnZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pbXBvcnRPcHRpb25zKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUGFydGlhbDxVbmltcG9ydE9wdGlvbnMgfCBmYWxzZT4ge1xuICBpZiAoY29uZmlnLmltcG9ydHMgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZGVmYXVsdE9wdGlvbnM6IFBhcnRpYWw8VW5pbXBvcnRPcHRpb25zPiA9IHtcbiAgICBkZWJ1Z0xvZzogY29uZmlnLmxvZ2dlci5kZWJ1ZyxcbiAgICBpbXBvcnRzOiBbeyBuYW1lOiAnZGVmaW5lQ29uZmlnJywgZnJvbTogJ3d4dCcgfV0sXG4gICAgcHJlc2V0czogW3sgcGFja2FnZTogJ3d4dC9jbGllbnQnIH0sIHsgcGFja2FnZTogJ3d4dC9icm93c2VyJyB9XSxcbiAgICB3YXJuOiBjb25maWcubG9nZ2VyLndhcm4sXG4gICAgZGlyczogWydjb21wb25lbnRzJywgJ2NvbXBvc2FibGVzJywgJ2hvb2tzJywgJ3V0aWxzJ10sXG4gIH07XG5cbiAgcmV0dXJuIG1lcmdlQ29uZmlnKFxuICAgIGRlZmF1bHRPcHRpb25zLFxuICAgIGNvbmZpZy5pbXBvcnRzLFxuICApIGFzIFBhcnRpYWw8VW5pbXBvcnRPcHRpb25zPjtcbn1cbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEVudHJ5cG9pbnQsIEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tICcuLi91dGlscy9wYXRocyc7XG5cbi8qKlxuICogV3JhcHMgYSB1c2VyJ3MgZW50cnlwb2ludCB3aXRoIGEgdml0dWFsIHZlcnNpb24gd2l0aCBhZGRpdGlvbmFsIGxvZ2ljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmlydHVhbEVudHJ5cG9pbihcbiAgdHlwZTogRW50cnlwb2ludFsndHlwZSddLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUGx1Z2luIHtcbiAgY29uc3QgdmlydHVhbElkID0gYHZpcnR1YWw6d3h0LSR7dHlwZX0/YDtcbiAgY29uc3QgcmVzb2x2ZWRWaXJ0dWFsSWQgPSBgXFwwJHt2aXJ0dWFsSWR9YDtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IGB3eHQ6dmlydHVhbC1lbnRyeXBvaW50YCxcbiAgICByZXNvbHZlSWQoaWQpIHtcbiAgICAgIC8vIElkIGRvZXNuJ3Qgc3RhcnQgd2l0aCBwcmVmaXgsIGl0IGxvb2tzIGxpa2UgdGhpczpcbiAgICAgIC8vIC9wYXRoL3RvL3Byb2plY3QvdmlydHVhbDpiYWNrZ3JvdW5kPy9wYXRoL3RvL3Byb2plY3QvZW50cnlwb2ludHMvYmFja2dyb3VuZC50c1xuICAgICAgY29uc3QgaW5kZXggPSBpZC5pbmRleE9mKHZpcnR1YWxJZCk7XG4gICAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGlucHV0UGF0aCA9IG5vcm1hbGl6ZVBhdGgoaWQuc3Vic3RyaW5nKGluZGV4ICsgdmlydHVhbElkLmxlbmd0aCkpO1xuICAgICAgcmV0dXJuIHJlc29sdmVkVmlydHVhbElkICsgaW5wdXRQYXRoO1xuICAgIH0sXG4gICAgYXN5bmMgbG9hZChpZCkge1xuICAgICAgaWYgKCFpZC5zdGFydHNXaXRoKHJlc29sdmVkVmlydHVhbElkKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBpbnB1dFBhdGggPSBpZC5yZXBsYWNlKHJlc29sdmVkVmlydHVhbElkLCAnJyk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgICAgICByZXNvbHZlKFxuICAgICAgICAgIGNvbmZpZy5yb290LFxuICAgICAgICAgIGBub2RlX21vZHVsZXMvd3h0L2Rpc3QvdmlydHVhbC1tb2R1bGVzLyR7dHlwZX0tZW50cnlwb2ludC5qc2AsXG4gICAgICAgICksXG4gICAgICAgICd1dGYtOCcsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoYHZpcnR1YWw6dXNlci0ke3R5cGV9YCwgaW5wdXRQYXRoKTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRzY29uZmlnUGF0aHMoY29uZmlnOiBJbnRlcm5hbENvbmZpZyk6IHZpdGUuUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd3h0OmFsaWFzZXMnLFxuICAgIGFzeW5jIGNvbmZpZygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc29sdmU6IHtcbiAgICAgICAgICBhbGlhczoge1xuICAgICAgICAgICAgJ0BAJzogY29uZmlnLnJvb3QsXG4gICAgICAgICAgICAnfn4nOiBjb25maWcucm9vdCxcbiAgICAgICAgICAgICdAJzogY29uZmlnLnNyY0RpcixcbiAgICAgICAgICAgICd+JzogY29uZmlnLnNyY0RpcixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ3ZpdGUnO1xuXG4vKipcbiAqIEluIGRldiBtb2RlLCBpZiB0aGVyZSdzIG5vdCBhIGJhY2tncm91bmQgc2NyaXB0IGxpc3RlZCwgd2UgbmVlZCB0byBhZGQgb25lLlxuICpcbiAqIFRoaXMgZGVmaW5lJ3MgYSB2aXJ0dWFsIG1vZHVsZSB0aGF0IGlzIGJhc2ljYWxseSBqdXN0IGEgbm9vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vb3BCYWNrZ3JvdW5kKCk6IFBsdWdpbiB7XG4gIGNvbnN0IHZpcnR1YWxNb2R1bGVJZCA9IFZJUlRVQUxfTk9PUF9CQUNLR1JPVU5EX01PRFVMRV9JRDtcbiAgY29uc3QgcmVzb2x2ZWRWaXJ0dWFsTW9kdWxlSWQgPSAnXFwwJyArIHZpcnR1YWxNb2R1bGVJZDtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd3h0Om5vb3AtYmFja2dyb3VuZCcsXG4gICAgcmVzb2x2ZUlkKGlkKSB7XG4gICAgICBpZiAoaWQgPT09IHZpcnR1YWxNb2R1bGVJZCkgcmV0dXJuIHJlc29sdmVkVmlydHVhbE1vZHVsZUlkO1xuICAgIH0sXG4gICAgbG9hZChpZCkge1xuICAgICAgaWYgKGlkID09PSByZXNvbHZlZFZpcnR1YWxNb2R1bGVJZCkge1xuICAgICAgICByZXR1cm4gYGltcG9ydCB7IGRlZmluZUJhY2tncm91bmQgfSBmcm9tICd3eHQvY2xpZW50JztcXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVCYWNrZ3JvdW5kKCgpID0+IHZvaWQgMClgO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBWSVJUVUFMX05PT1BfQkFDS0dST1VORF9NT0RVTEVfSUQgPSAndmlydHVhbDp1c2VyLWJhY2tncm91bmQnO1xuIiwgImltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBFbnRyeXBvaW50LCBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuXG4vKipcbiAqIFJlbmFtZSBDU1MgZW50cnlwb2ludCBvdXRwdXRzIHRvIGVuc3VyZSBhIEpTIGZpbGUgaXMgbm90IGdlbmVyYXRlZCwgYW5kIHRoYXQgdGhlIENTUyBmaWxlIGlzXG4gKiBwbGFjZWQgaW4gdGhlIGNvcnJlY3QgcGxhY2UuXG4gKlxuICogSXQ6XG4gKiAxLiBSZW5hbWVzIENTUyBmaWxlcyB0byB0aGVpciBmaW5hbCBwYXRoc1xuICogMi4gUmVtb3ZlcyB0aGUgSlMgZmlsZSB0aGF0IGdldCdzIG91dHB1dCBieSBsaWIgbW9kZVxuICpcbiAqIFRISVMgUExVR0lOIFNIT1VMRCBPTkxZIEJFIEFQUExJRUQgVE8gQ1NTIExJQiBNT0RFIEJVSUxEUy4gSXQgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byBldmVyeSBidWlsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzc0VudHJ5cG9pbnRzKFxuICBlbnRyeXBvaW50OiBFbnRyeXBvaW50LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogdml0ZS5QbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6Y3NzLWVudHJ5cG9pbnQnLFxuICAgIGNvbmZpZygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJ1aWxkOiB7XG4gICAgICAgICAgcm9sbHVwT3B0aW9uczoge1xuICAgICAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgICAgIGFzc2V0RmlsZU5hbWVzOiAoKSA9PlxuICAgICAgICAgICAgICAgIGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKGVudHJ5cG9pbnQsIGNvbmZpZy5vdXREaXIsICcuY3NzJyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGVCdW5kbGUoXywgYnVuZGxlKSB7XG4gICAgICBPYmplY3Qua2V5cyhidW5kbGUpLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoJy5qcycpKSBkZWxldGUgYnVuZGxlW2ZpbGVdO1xuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgKiBhcyB2aXRlIGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgdmlzdWFsaXplciB9IGZyb20gJ3JvbGx1cC1wbHVnaW4tdmlzdWFsaXplcic7XG5cbmxldCBpbmNyZW1lbnQgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVuZGxlQW5hbHlzaXMoKTogdml0ZS5QbHVnaW4ge1xuICByZXR1cm4gdmlzdWFsaXplcih7XG4gICAgZW1pdEZpbGU6IHRydWUsXG4gICAgdGVtcGxhdGU6ICdyYXctZGF0YScsXG4gICAgZmlsZW5hbWU6IGBzdGF0cy0ke2luY3JlbWVudCsrfS5qc29uYCxcbiAgfSkgYXMgdml0ZS5QbHVnaW47XG59XG4iLCAiaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxzKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnk7IHR5cGU6IHN0cmluZyB9PiB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbmFtZTogJ19fTUFOSUZFU1RfVkVSU0lPTl9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcubWFuaWZlc3RWZXJzaW9uLFxuICAgICAgdHlwZTogYDIgfCAzYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdfX0JST1dTRVJfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIsXG4gICAgICB0eXBlOiBgc3RyaW5nYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdfX0lTX0NIUk9NRV9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlciA9PT0gJ2Nocm9tZScsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19JU19GSVJFRk9YX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19JU19TQUZBUklfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIgPT09ICdzYWZhcmknLFxuICAgICAgdHlwZTogYGJvb2xlYW5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fSVNfRURHRV9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlciA9PT0gJ2VkZ2UnLFxuICAgICAgdHlwZTogYGJvb2xlYW5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fSVNfT1BFUkFfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIgPT09ICdvcGVyYScsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19DT01NQU5EX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5jb21tYW5kLFxuICAgICAgdHlwZTogYFwiYnVpbGRcIiB8IFwic2VydmVcImAsXG4gICAgfSxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudHJ5cG9pbnRHbG9iYWxzKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBlbnRyeXBvaW50TmFtZTogc3RyaW5nLFxuKSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbmFtZTogJ19fRU5UUllQT0lOVF9fJyxcbiAgICAgIHZhbHVlOiBlbnRyeXBvaW50TmFtZSxcbiAgICAgIHR5cGU6IGBzdHJpbmdgLFxuICAgIH0sXG4gIF07XG59XG4iLCAiaW1wb3J0IHsgQnVpbGRPdXRwdXQsIFd4dERldlNlcnZlciwgSW5saW5lQ29uZmlnIH0gZnJvbSAnLi9jb3JlL3R5cGVzJztcbmltcG9ydCB7IGdldEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi9jb3JlL3V0aWxzL2dldEludGVybmFsQ29uZmlnJztcbmltcG9ydCBwYyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCB7IGRldGVjdERldkNoYW5nZXMgfSBmcm9tICcuL2NvcmUvdXRpbHMvZGV0ZWN0RGV2Q2hhbmdlcyc7XG5pbXBvcnQgeyBNdXRleCB9IGZyb20gJ2FzeW5jLW11dGV4JztcbmltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcbmltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRPdXRwdXRGaWxlIH0gZnJvbSAnLi9jb3JlL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCB7IGJ1aWxkSW50ZXJuYWwsIHJlYnVpbGQgfSBmcm9tICcuL2NvcmUvYnVpbGQnO1xuaW1wb3J0IHtcbiAgZ2V0U2VydmVySW5mbyxcbiAgcmVsb2FkQ29udGVudFNjcmlwdHMsXG4gIHJlbG9hZEh0bWxQYWdlcyxcbiAgc2V0dXBTZXJ2ZXIsXG59IGZyb20gJy4vY29yZS9zZXJ2ZXInO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvY2xlYW4nO1xuZXhwb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvdHlwZXMvZXh0ZXJuYWwnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3V0aWxzL2RlZmluZUNvbmZpZyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvdXRpbHMvZGVmaW5lUnVubmVyQ29uZmlnJztcblxuLyoqXG4gKiBCdW5kbGVzIHRoZSBleHRlbnNpb24gZm9yIHByb2R1Y3Rpb24uIFJldHVybnMgYSBwcm9taXNlIG9mIHRoZSBidWlsZCByZXN1bHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChjb25maWc6IElubGluZUNvbmZpZyk6IFByb21pc2U8QnVpbGRPdXRwdXQ+IHtcbiAgY29uc3QgaW50ZXJuYWxDb25maWcgPSBhd2FpdCBnZXRJbnRlcm5hbENvbmZpZyhjb25maWcsICdidWlsZCcpO1xuICByZXR1cm4gYXdhaXQgYnVpbGRJbnRlcm5hbChpbnRlcm5hbENvbmZpZyk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRldiBzZXJ2ZXIsIHByZS1idWlsZHMgYWxsIHRoZSBmaWxlcyB0aGF0IG5lZWQgdG8gZXhpc3QgdG8gbG9hZCB0aGUgZXh0ZW5zaW9uLCBhbmQgb3BlblxuICogdGhlIGJyb3dzZXIgd2l0aCB0aGUgZXh0ZW5zaW9uIGluc3RhbGxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlcnZlcihcbiAgY29uZmlnPzogSW5saW5lQ29uZmlnLFxuKTogUHJvbWlzZTxXeHREZXZTZXJ2ZXI+IHtcbiAgY29uc3Qgc2VydmVySW5mbyA9IGF3YWl0IGdldFNlcnZlckluZm8oKTtcblxuICBjb25zdCBnZXRMYXRlc3RJbnRlcm5hbENvbmZpZyA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxDb25maWcoXG4gICAgICB7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgdml0ZTogKCkgPT4gc2VydmVySW5mby52aXRlU2VydmVyQ29uZmlnLFxuICAgICAgfSxcbiAgICAgICdzZXJ2ZScsXG4gICAgKTtcbiAgfTtcblxuICBsZXQgaW50ZXJuYWxDb25maWcgPSBhd2FpdCBnZXRMYXRlc3RJbnRlcm5hbENvbmZpZygpO1xuICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBzZXR1cFNlcnZlcihzZXJ2ZXJJbmZvLCBpbnRlcm5hbENvbmZpZyk7XG4gIGludGVybmFsQ29uZmlnLnNlcnZlciA9IHNlcnZlcjtcblxuICBjb25zdCBmaWxlQ2hhbmdlZE11dGV4ID0gbmV3IE11dGV4KCk7XG4gIGNvbnN0IGNoYW5nZVF1ZXVlOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtdO1xuXG4gIHNlcnZlci53cy5vbignd3h0OmJhY2tncm91bmQtaW5pdGlhbGl6ZWQnLCAoKSA9PiB7XG4gICAgLy8gUmVnaXN0ZXIgY29udGVudCBzY3JpcHRzIGZvciB0aGUgZmlyc3QgdGltZSBzaW5jZSB0aGV5J3JlIG5vdCBsaXN0ZWQgaW4gdGhlIG1hbmlmZXN0XG4gICAgcmVsb2FkQ29udGVudFNjcmlwdHMoc2VydmVyLmN1cnJlbnRPdXRwdXQuc3RlcHMsIGludGVybmFsQ29uZmlnLCBzZXJ2ZXIpO1xuICB9KTtcblxuICBzZXJ2ZXIud2F0Y2hlci5vbignYWxsJywgYXN5bmMgKGV2ZW50LCBwYXRoLCBfc3RhdHMpID0+IHtcbiAgICAvLyBIZXJlLCBcInBhdGhcIiBpcyBhIG5vbi1ub3JtYWxpemVkIHBhdGggKGllOiBDOlxcXFx1c2Vyc1xcXFwuLi4gaW5zdGVhZCBvZiBDOi91c2Vycy8uLi4pXG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChpbnRlcm5hbENvbmZpZy5vdXRCYXNlRGlyKSkgcmV0dXJuO1xuICAgIGNoYW5nZVF1ZXVlLnB1c2goW2V2ZW50LCBwYXRoXSk7XG5cbiAgICBhd2FpdCBmaWxlQ2hhbmdlZE11dGV4LnJ1bkV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlQ2hhbmdlcyA9IGNoYW5nZVF1ZXVlLnNwbGljZSgwLCBjaGFuZ2VRdWV1ZS5sZW5ndGgpO1xuICAgICAgaWYgKGZpbGVDaGFuZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBjaGFuZ2VzID0gZGV0ZWN0RGV2Q2hhbmdlcyhmaWxlQ2hhbmdlcywgc2VydmVyLmN1cnJlbnRPdXRwdXQpO1xuICAgICAgaWYgKGNoYW5nZXMudHlwZSA9PT0gJ25vLWNoYW5nZScpIHJldHVybjtcblxuICAgICAgLy8gTG9nIHRoZSBlbnRyeXBvaW50cyB0aGF0IHdlcmUgZWZmZWN0ZWRcbiAgICAgIGludGVybmFsQ29uZmlnLmxvZ2dlci5pbmZvKFxuICAgICAgICBgQ2hhbmdlZDogJHtBcnJheS5mcm9tKG5ldyBTZXQoZmlsZUNoYW5nZXMubWFwKChjaGFuZ2UpID0+IGNoYW5nZVsxXSkpKVxuICAgICAgICAgIC5tYXAoKGZpbGUpID0+IHBjLmRpbShyZWxhdGl2ZShpbnRlcm5hbENvbmZpZy5yb290LCBmaWxlKSkpXG4gICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCByZWJ1aWx0TmFtZXMgPSBjaGFuZ2VzLnJlYnVpbGRHcm91cHNcbiAgICAgICAgLmZsYXQoKVxuICAgICAgICAubWFwKChlbnRyeSkgPT4ge1xuICAgICAgICAgIHJldHVybiBwYy5jeWFuKFxuICAgICAgICAgICAgcmVsYXRpdmUoaW50ZXJuYWxDb25maWcub3V0RGlyLCBnZXRFbnRyeXBvaW50T3V0cHV0RmlsZShlbnRyeSwgJycpKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihwYy5kaW0oJywgJykpO1xuXG4gICAgICAvLyBHZXQgbGF0ZXN0IGNvbmZpZyBhbmQgUmVidWlsZCBncm91cHMgd2l0aCBjaGFuZ2VzXG4gICAgICBpbnRlcm5hbENvbmZpZyA9IGF3YWl0IGdldExhdGVzdEludGVybmFsQ29uZmlnKCk7XG4gICAgICBpbnRlcm5hbENvbmZpZy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgICBjb25zdCB7IG91dHB1dDogbmV3T3V0cHV0IH0gPSBhd2FpdCByZWJ1aWxkKFxuICAgICAgICBpbnRlcm5hbENvbmZpZyxcbiAgICAgICAgLy8gVE9ETzogdGhpcyBleGNsdWRlcyBuZXcgZW50cnlwb2ludHMsIHNvIHRoZXkncmUgbm90IGJ1aWx0IHVudGlsIHRoZSBkZXYgY29tbWFuZCBpcyByZXN0YXJ0ZWRcbiAgICAgICAgY2hhbmdlcy5yZWJ1aWxkR3JvdXBzLFxuICAgICAgICBjaGFuZ2VzLmNhY2hlZE91dHB1dCxcbiAgICAgICk7XG4gICAgICBzZXJ2ZXIuY3VycmVudE91dHB1dCA9IG5ld091dHB1dDtcblxuICAgICAgLy8gUGVyZm9ybSByZWxvYWRzXG4gICAgICBzd2l0Y2ggKGNoYW5nZXMudHlwZSkge1xuICAgICAgICBjYXNlICdleHRlbnNpb24tcmVsb2FkJzpcbiAgICAgICAgICBzZXJ2ZXIucmVsb2FkRXh0ZW5zaW9uKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2h0bWwtcmVsb2FkJzpcbiAgICAgICAgICByZWxvYWRIdG1sUGFnZXMoY2hhbmdlcy5yZWJ1aWxkR3JvdXBzLCBzZXJ2ZXIsIGludGVybmFsQ29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29udGVudC1zY3JpcHQtcmVsb2FkJzpcbiAgICAgICAgICByZWxvYWRDb250ZW50U2NyaXB0cyhjaGFuZ2VzLmNoYW5nZWRTdGVwcywgaW50ZXJuYWxDb25maWcsIHNlcnZlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zb2xhLnN1Y2Nlc3MoYFJlbG9hZGVkOiAke3JlYnVpbHROYW1lc31gKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHNlcnZlcjtcbn1cbiIsICIvKipcbiAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgYWxsIGVsZW1lbnRzIG9mIHRoZSBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQ+KFxuICBhcnJheTogVFtdLFxuICBwcmVkaWNhdGU6IChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspXG4gICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaV0sIGkpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuIiwgImltcG9ydCB7IEJ1aWxkT3V0cHV0LCBCdWlsZFN0ZXBPdXRwdXQsIEVudHJ5cG9pbnRHcm91cCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBldmVyeSB9IGZyb20gJy4vYXJyYXlzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tICcuL3BhdGhzJztcblxuLyoqXG4gKiBDb21wYXJlIHRoZSBjaGFuZ2VkIGZpbGVzIHZzIHRoZSBidWlsZCBvdXRwdXQgYW5kIGRldGVybWluZSB3aGF0IGtpbmQgb2YgcmVsb2FkIG5lZWRzIHRvIGhhcHBlbjpcbiAqXG4gKiAtIERvIG5vdGhpbmdcbiAqICAgLSBDU1Mgb3IgSlMgZmlsZSBhc3NvY2lhdGVkIHdpdGggYW4gSFRNTCBwYWdlIGlzIGNoYW5nZWQgLSB0aGlzIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSBieSB0aGVcbiAqICAgICBkZXYgc2VydmVyXG4gKiAgIC0gQ2hhbmdlIGlzbid0IHVzZWQgYnkgYW55IG9mIHRoZSBlbnRyeXBvaW50c1xuICogLSBSZWxvYWQgQ29udGVudCBzY3JpcHRcbiAqICAgLSBDU1Mgb3IgSlMgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBjb250ZW50IHNjcmlwdFxuICogICAtIEJhY2tncm91bmQgc2NyaXB0IHdpbGwgYmUgdG9sZCB0byByZWxvYWQgdGhlIGNvbnRlbnQgc2NyaXB0XG4gKiAtIFJlbG9hZCBIVE1MIGZpbGVcbiAqICAgLSBIVE1MIGZpbGUgaXRzZWxmIGlzIHNhdmVkIC0gSE1SIGRvZXNuJ3QgaGFuZGxlIHRoaXMgYmVjYXVzZSB0aGUgSFRNTCBwYWdlcyBhcmUgcHJlLXJlbmRlcmVkXG4gKiAgIC0gQ2hyb21lIGlzIE9LIHJlbG9hZGluZyB0aGUgcGFnZSB3aGVuIHRoZSBIVE1MIGZpbGUgaXMgY2hhbmdlZCB3aXRob3V0IHJlbG9hZGluZyB0aGUgd2hvbGVcbiAqICAgICBleHRlbnNpb24uIE5vdCBzdXJlIGFib3V0IGZpcmVmb3gsIHRoaXMgbWlnaHQgbmVlZCB0byBjaGFuZ2UgdG8gYW4gZXh0ZW5zaW9uIHJlbG9hZFxuICogLSBSZWxvYWQgZXh0ZW5zaW9uXG4gKiAgIC0gQmFja2dyb3VuZCBzY3JpcHQgaXMgY2hhbmdlZFxuICogICAtIE1hbmlmZXN0IGlzIGRpZmZlcmVudFxuICogLSBSZXN0YXJ0IGJyb3dzZXJcbiAqICAgLSBDb25maWcgZmlsZSBjaGFuZ2VkICh3eHQuY29uZmlnLnRzLCAuZW52LCB3ZWItZXh0LmNvbmZpZy50cywgZXRjKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0RGV2Q2hhbmdlcyhcbiAgY2hhbmdlZEZpbGVzOiBbZXZlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nXVtdLFxuICBjdXJyZW50T3V0cHV0OiBCdWlsZE91dHB1dCB8IHVuZGVmaW5lZCxcbik6IERldk1vZGVDaGFuZ2Uge1xuICBpZiAoY3VycmVudE91dHB1dCA9PSBudWxsKSByZXR1cm4geyB0eXBlOiAnbm8tY2hhbmdlJyB9O1xuXG4gIGNvbnN0IGNoYW5nZWRTdGVwcyA9IG5ldyBTZXQoXG4gICAgY2hhbmdlZEZpbGVzLmZsYXRNYXAoKGNoYW5nZWRGaWxlKSA9PlxuICAgICAgZmluZEVmZmVjdGVkU3RlcHMoY2hhbmdlZEZpbGUsIGN1cnJlbnRPdXRwdXQpLFxuICAgICksXG4gICk7XG4gIGlmIChjaGFuZ2VkU3RlcHMuc2l6ZSA9PT0gMCkgcmV0dXJuIHsgdHlwZTogJ25vLWNoYW5nZScgfTtcblxuICBjb25zdCB1bmNoYW5nZWRPdXRwdXQ6IEJ1aWxkT3V0cHV0ID0ge1xuICAgIG1hbmlmZXN0OiBjdXJyZW50T3V0cHV0Lm1hbmlmZXN0LFxuICAgIHN0ZXBzOiBbXSxcbiAgICBwdWJsaWNBc3NldHM6IFtdLFxuICB9O1xuICBjb25zdCBjaGFuZ2VkT3V0cHV0OiBCdWlsZE91dHB1dCA9IHtcbiAgICBtYW5pZmVzdDogY3VycmVudE91dHB1dC5tYW5pZmVzdCxcbiAgICBzdGVwczogW10sXG4gICAgcHVibGljQXNzZXRzOiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IHN0ZXAgb2YgY3VycmVudE91dHB1dC5zdGVwcykge1xuICAgIGlmIChjaGFuZ2VkU3RlcHMuaGFzKHN0ZXApKSB7XG4gICAgICBjaGFuZ2VkT3V0cHV0LnN0ZXBzLnB1c2goc3RlcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuY2hhbmdlZE91dHB1dC5zdGVwcy5wdXNoKHN0ZXApO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGFzc2V0IG9mIGN1cnJlbnRPdXRwdXQucHVibGljQXNzZXRzKSB7XG4gICAgaWYgKGNoYW5nZWRTdGVwcy5oYXMoYXNzZXQpKSB7XG4gICAgICBjaGFuZ2VkT3V0cHV0LnB1YmxpY0Fzc2V0cy5wdXNoKGFzc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5jaGFuZ2VkT3V0cHV0LnB1YmxpY0Fzc2V0cy5wdXNoKGFzc2V0KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc09ubHlIdG1sQ2hhbmdlcyA9XG4gICAgY2hhbmdlZEZpbGVzLmxlbmd0aCA+IDAgJiZcbiAgICBldmVyeShjaGFuZ2VkRmlsZXMsIChbXywgZmlsZV0pID0+IGZpbGUuZW5kc1dpdGgoJy5odG1sJykpO1xuICBpZiAoaXNPbmx5SHRtbENoYW5nZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2h0bWwtcmVsb2FkJyxcbiAgICAgIGNhY2hlZE91dHB1dDogdW5jaGFuZ2VkT3V0cHV0LFxuICAgICAgcmVidWlsZEdyb3VwczogY2hhbmdlZE91dHB1dC5zdGVwcy5tYXAoKHN0ZXApID0+IHN0ZXAuZW50cnlwb2ludHMpLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBpc09ubHlDb250ZW50U2NyaXB0cyA9XG4gICAgY2hhbmdlZE91dHB1dC5zdGVwcy5sZW5ndGggPiAwICYmXG4gICAgZXZlcnkoXG4gICAgICBjaGFuZ2VkT3V0cHV0LnN0ZXBzLmZsYXRNYXAoKHN0ZXApID0+IHN0ZXAuZW50cnlwb2ludHMpLFxuICAgICAgKGVudHJ5KSA9PiBlbnRyeS50eXBlID09PSAnY29udGVudC1zY3JpcHQnLFxuICAgICk7XG4gIGlmIChpc09ubHlDb250ZW50U2NyaXB0cykge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnY29udGVudC1zY3JpcHQtcmVsb2FkJyxcbiAgICAgIGNhY2hlZE91dHB1dDogdW5jaGFuZ2VkT3V0cHV0LFxuICAgICAgY2hhbmdlZFN0ZXBzOiBjaGFuZ2VkT3V0cHV0LnN0ZXBzLFxuICAgICAgcmVidWlsZEdyb3VwczogY2hhbmdlZE91dHB1dC5zdGVwcy5tYXAoKHN0ZXApID0+IHN0ZXAuZW50cnlwb2ludHMpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdleHRlbnNpb24tcmVsb2FkJyxcbiAgICBjYWNoZWRPdXRwdXQ6IHVuY2hhbmdlZE91dHB1dCxcbiAgICByZWJ1aWxkR3JvdXBzOiBjaGFuZ2VkT3V0cHV0LnN0ZXBzLm1hcCgoc3RlcCkgPT4gc3RlcC5lbnRyeXBvaW50cyksXG4gIH07XG59XG5cbi8qKlxuICogRm9yIGEgc2luZ2xlIGNoYW5nZSwgcmV0dXJuIGFsbCB0aGUgc3RlcCBvZiB0aGUgYnVpbGQgb3V0cHV0IHRoYXQgd2VyZSBlZmZlY3RlZCBieSBpdC5cbiAqL1xuZnVuY3Rpb24gZmluZEVmZmVjdGVkU3RlcHMoXG4gIGNoYW5nZWRGaWxlOiBbZXZlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nXSxcbiAgY3VycmVudE91dHB1dDogQnVpbGRPdXRwdXQsXG4pOiBEZXRlY3RlZENoYW5nZVtdIHtcbiAgY29uc3QgY2hhbmdlczogRGV0ZWN0ZWRDaGFuZ2VbXSA9IFtdO1xuICBjb25zdCBjaGFuZ2VkUGF0aCA9IG5vcm1hbGl6ZVBhdGgoY2hhbmdlZEZpbGVbMV0pO1xuXG4gIGNvbnN0IGlzQ2h1bmtFZmZlY3RlZCA9IChcbiAgICBjaHVuazogdml0ZS5Sb2xsdXAuT3V0cHV0Q2h1bmsgfCB2aXRlLlJvbGx1cC5PdXRwdXRBc3NldCxcbiAgKTogYm9vbGVhbiA9PlxuICAgIC8vIElmIGl0J3MgYW4gSFRNTCBmaWxlIHdpdGggdGhlIHNhbWUgcGF0aCwgaXMgaXMgZWZmZWN0ZWQgYmVjYXVzZSBIVE1MIGZpbGVzIG5lZWQgdG8gYmUgcHJlLXJlbmRlcmVkXG4gICAgLy8gZmlsZU5hbWUgaXMgbm9ybWFsaXplZCwgcmVsYXRpdmUgYnVuZGxlIHBhdGhcbiAgICAoY2h1bmsudHlwZSA9PT0gJ2Fzc2V0JyAmJiBjaGFuZ2VkUGF0aC5lbmRzV2l0aChjaHVuay5maWxlTmFtZSkpIHx8XG4gICAgLy8gSWYgaXQncyBhIGNodW5rIHRoYXQgZGVwZW5kcyBvbiB0aGUgY2hhbmdlZCBmaWxlLCBpdCBpcyBlZmZlY3RlZFxuICAgIC8vIG1vZHVsZUlkcyBhcmUgYWJzb2x1dGUsIG5vcm1hbGl6ZWQgcGF0aHNcbiAgICAoY2h1bmsudHlwZSA9PT0gJ2NodW5rJyAmJiBjaHVuay5tb2R1bGVJZHMuaW5jbHVkZXMoY2hhbmdlZFBhdGgpKTtcblxuICBmb3IgKGNvbnN0IHN0ZXAgb2YgY3VycmVudE91dHB1dC5zdGVwcykge1xuICAgIGNvbnN0IGVmZmVjdGVkQ2h1bmsgPSBzdGVwLmNodW5rcy5maW5kKChjaHVuaykgPT4gaXNDaHVua0VmZmVjdGVkKGNodW5rKSk7XG4gICAgaWYgKGVmZmVjdGVkQ2h1bmspIGNoYW5nZXMucHVzaChzdGVwKTtcbiAgfVxuXG4gIGNvbnN0IGVmZmVjdGVkQXNzZXQgPSBjdXJyZW50T3V0cHV0LnB1YmxpY0Fzc2V0cy5maW5kKChjaHVuaykgPT5cbiAgICBpc0NodW5rRWZmZWN0ZWQoY2h1bmspLFxuICApO1xuICBpZiAoZWZmZWN0ZWRBc3NldCkgY2hhbmdlcy5wdXNoKGVmZmVjdGVkQXNzZXQpO1xuXG4gIHJldHVybiBjaGFuZ2VzO1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgZmlsZXMgY2hhbmdlZCwgd2hhdCBuZWVkcyByZWJ1aWx0LCBhbmQgdGhlIHR5cGUgb2YgcmVsb2FkIHRoYXQgaXNcbiAqIHJlcXVpcmVkLlxuICovXG5leHBvcnQgdHlwZSBEZXZNb2RlQ2hhbmdlID1cbiAgfCBOb0NoYW5nZVxuICB8IEh0bWxSZWxvYWRcbiAgfCBFeHRlbnNpb25SZWxvYWRcbiAgfCBDb250ZW50U2NyaXB0UmVsb2FkO1xuLy8gfCBCcm93c2VyUmVzdGFydFxuXG5pbnRlcmZhY2UgTm9DaGFuZ2Uge1xuICB0eXBlOiAnbm8tY2hhbmdlJztcbn1cblxuaW50ZXJmYWNlIFJlYnVpbGRDaGFuZ2Uge1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgZW50cnlwb2ludHMgdGhhdCBuZWVkIHJlYnVpbHQuXG4gICAqL1xuICByZWJ1aWxkR3JvdXBzOiBFbnRyeXBvaW50R3JvdXBbXTtcbiAgLyoqXG4gICAqIFRoZSBwcmV2aW91cyBvdXRwdXQgc3RyaXBwZWQgb2YgYW55IGZpbGVzIGFyZSBnb2luZyB0byBjaGFuZ2UuXG4gICAqL1xuICBjYWNoZWRPdXRwdXQ6IEJ1aWxkT3V0cHV0O1xufVxuXG5pbnRlcmZhY2UgSHRtbFJlbG9hZCBleHRlbmRzIFJlYnVpbGRDaGFuZ2Uge1xuICB0eXBlOiAnaHRtbC1yZWxvYWQnO1xufVxuXG5pbnRlcmZhY2UgRXh0ZW5zaW9uUmVsb2FkIGV4dGVuZHMgUmVidWlsZENoYW5nZSB7XG4gIHR5cGU6ICdleHRlbnNpb24tcmVsb2FkJztcbn1cblxuLy8gaW50ZXJmYWNlIEJyb3dzZXJSZXN0YXJ0IGV4dGVuZHMgUmVidWlsZENoYW5nZSB7XG4vLyAgIHR5cGU6ICdicm93c2VyLXJlc3RhcnQnO1xuLy8gfVxuXG5pbnRlcmZhY2UgQ29udGVudFNjcmlwdFJlbG9hZCBleHRlbmRzIFJlYnVpbGRDaGFuZ2Uge1xuICB0eXBlOiAnY29udGVudC1zY3JpcHQtcmVsb2FkJztcbiAgY2hhbmdlZFN0ZXBzOiBCdWlsZFN0ZXBPdXRwdXRbXTtcbn1cblxuLyoqXG4gKiBXaGVuIGZpZ3VyaW5nIG91dCB3aGF0IG5lZWRzIHJlbG9hZGVkLCB0aGlzIHN0b3JlcyB0aGUgc3RlcCB0aGF0IHdhcyBjaGFuZ2VkLCBvciB0aGUgcHVibGljXG4gKiBkaXJlY3RvcnkgYXNzZXQgdGhhdCB3YXMgY2hhbmdlZC4gSXQgZG9lc24ndCBrbm93IHdoYXQgdHlwZSBvZiBjaGFuZ2UgaXMgcmVxdWlyZWQgeWV0LiBKdXN0IGFuXG4gKiBpbnRlcm1lZGlhdGUgdHlwZS5cbiAqL1xudHlwZSBEZXRlY3RlZENoYW5nZSA9IEJ1aWxkU3RlcE91dHB1dCB8IHZpdGUuUm9sbHVwLk91dHB1dEFzc2V0O1xuIiwgImltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQge1xuICBCdWlsZE91dHB1dCxcbiAgQnVpbGRTdGVwT3V0cHV0LFxuICBFbnRyeXBvaW50LFxuICBFbnRyeXBvaW50R3JvdXAsXG4gIEludGVybmFsQ29uZmlnLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB3eHRQbHVnaW5zIGZyb20gJy4uL3ZpdGUtcGx1Z2lucyc7XG5pbXBvcnQgeyByZW1vdmVFbXB0eURpcnMgfSBmcm9tICcuLi91dGlscy9yZW1vdmVFbXB0eURpcnMnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGggfSBmcm9tICcuLi91dGlscy9lbnRyeXBvaW50cyc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgZGlybmFtZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0UHVibGljRmlsZXMgfSBmcm9tICcuLi91dGlscy9wdWJsaWMnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludEdsb2JhbHMgfSBmcm9tICcuLi91dGlscy9nbG9iYWxzJztcbmltcG9ydCB0eXBlIHsgT3JhIH0gZnJvbSAnb3JhJztcbmltcG9ydCBwYyBmcm9tICdwaWNvY29sb3JzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkRW50cnlwb2ludHMoXG4gIGdyb3VwczogRW50cnlwb2ludEdyb3VwW10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4gIHNwaW5uZXI6IE9yYSxcbik6IFByb21pc2U8T21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4+IHtcbiAgY29uc3Qgc3RlcHM6IEJ1aWxkU3RlcE91dHB1dFtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZ3JvdXAgPSBncm91cHNbaV07XG5cbiAgICBzcGlubmVyLnRleHQgPVxuICAgICAgcGMuZGltKGBbJHtpICsgMX0vJHtncm91cHMubGVuZ3RofV1gKSArXG4gICAgICBgICR7W2dyb3VwXVxuICAgICAgICAuZmxhdCgpXG4gICAgICAgIC5tYXAoKGUpID0+IGUubmFtZSlcbiAgICAgICAgLmpvaW4ocGMuZGltKCcsICcpKX1gO1xuXG4gICAgY29uc3Qgc3RlcCA9IEFycmF5LmlzQXJyYXkoZ3JvdXApXG4gICAgICA/IGF3YWl0IGJ1aWxkTXVsdGlwbGVFbnRyeXBvaW50cyhncm91cCwgY29uZmlnKVxuICAgICAgOiBhd2FpdCBidWlsZFNpbmdsZUVudHJ5cG9pbnQoZ3JvdXAsIGNvbmZpZyk7XG4gICAgc3RlcHMucHVzaChzdGVwKTtcbiAgfVxuICBjb25zdCBwdWJsaWNBc3NldHMgPSBhd2FpdCBjb3B5UHVibGljRGlyZWN0b3J5KGNvbmZpZyk7XG5cbiAgLy8gUmVtb3ZlIGFueSBlbXB0eSBkaXJlY3RvcmllcyBmcm9tIG1vdmluZyBvdXRwdXRzIGFyb3VuZFxuICBhd2FpdCByZW1vdmVFbXB0eURpcnMoY29uZmlnLm91dERpcik7XG5cbiAgcmV0dXJuIHsgcHVibGljQXNzZXRzLCBzdGVwcyB9O1xufVxuXG4vKipcbiAqIFVzZSBWaXRlJ3MgbGliIG1vZGUgKyBJSUZFIGZvcm1hdCB0byBidW5kbGUgdGhlIGVudHJ5cG9pbnQgdG8gYSBzaW5nbGUgZmlsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRTaW5nbGVFbnRyeXBvaW50KFxuICBlbnRyeXBvaW50OiBFbnRyeXBvaW50LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxCdWlsZFN0ZXBPdXRwdXQ+IHtcbiAgLy8gU2hvdWxkIHRoaXMgZW50cnlwb2ludCBiZSB3cmFwcGVkIGJ5IHRoZSB2aXRlLXBsdWdpbnMvdmlydHVhbEVudHJ5cG9pbnQgcGx1Z2luP1xuICBjb25zdCBpc1ZpcnR1YWwgPSBbJ2JhY2tncm91bmQnLCAnY29udGVudC1zY3JpcHQnXS5pbmNsdWRlcyhlbnRyeXBvaW50LnR5cGUpO1xuICBjb25zdCBlbnRyeSA9IGlzVmlydHVhbFxuICAgID8gYHZpcnR1YWw6d3h0LSR7ZW50cnlwb2ludC50eXBlfT8ke2VudHJ5cG9pbnQuaW5wdXRQYXRofWBcbiAgICA6IGVudHJ5cG9pbnQuaW5wdXRQYXRoO1xuXG4gIGNvbnN0IHBsdWdpbnM6IE5vbk51bGxhYmxlPHZpdGUuVXNlckNvbmZpZ1sncGx1Z2lucyddPiA9IFtdO1xuICBpZiAoXG4gICAgZW50cnlwb2ludC50eXBlID09PSAnY29udGVudC1zY3JpcHQtc3R5bGUnIHx8XG4gICAgZW50cnlwb2ludC50eXBlID09PSAndW5saXN0ZWQtc3R5bGUnXG4gICkge1xuICAgIHBsdWdpbnMucHVzaCh3eHRQbHVnaW5zLmNzc0VudHJ5cG9pbnRzKGVudHJ5cG9pbnQsIGNvbmZpZykpO1xuICB9XG5cbiAgY29uc3QgbGliTW9kZTogdml0ZS5Vc2VyQ29uZmlnID0ge1xuICAgIHBsdWdpbnMsXG4gICAgYnVpbGQ6IHtcbiAgICAgIGxpYjoge1xuICAgICAgICBlbnRyeSxcbiAgICAgICAgZm9ybWF0czogWydpaWZlJ10sXG4gICAgICAgIG5hbWU6ICdfJyxcbiAgICAgICAgZmlsZU5hbWU6IGVudHJ5cG9pbnQubmFtZSxcbiAgICAgIH0sXG4gICAgICByb2xsdXBPcHRpb25zOiB7XG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgIC8vIFRoZXJlJ3Mgb25seSBhIHNpbmdsZSBvdXRwdXQgZm9yIHRoaXMgYnVpbGQsIHNvIHdlIHVzZSB0aGUgZGVzaXJlZCBidW5kbGUgcGF0aCBmb3IgdGhlXG4gICAgICAgICAgLy8gZW50cnkgb3V0cHV0IChsaWtlIFwiY29udGVudC1zY3JpcHRzL292ZXJsYXkuanNcIilcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICAgICAgICBlbnRyeXBvaW50LFxuICAgICAgICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICAgICAgICcuanMnLFxuICAgICAgICAgICksXG4gICAgICAgICAgLy8gT3V0cHV0IGNvbnRlbnQgc2NyaXB0IENTUyB0byBgY29udGVudC1zY3JpcHRzL2AsIGJ1dCBhbGwgb3RoZXIgc2NyaXB0cyBhcmUgd3JpdHRlbiB0b1xuICAgICAgICAgIC8vIGBhc3NldHMvYC5cbiAgICAgICAgICBhc3NldEZpbGVOYW1lczogKHsgbmFtZSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoZW50cnlwb2ludC50eXBlID09PSAnY29udGVudC1zY3JpcHQnICYmIG5hbWU/LmVuZHNXaXRoKCdjc3MnKSkge1xuICAgICAgICAgICAgICByZXR1cm4gYGNvbnRlbnQtc2NyaXB0cy8ke2VudHJ5cG9pbnQubmFtZX0uW2V4dF1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGBhc3NldHMvJHtlbnRyeXBvaW50Lm5hbWV9LltleHRdYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmluZToge1xuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ha2xpbmtlcjEvdml0ZS1wbHVnaW4td2ViLWV4dGVuc2lvbi9pc3N1ZXMvOTZcbiAgICAgICdwcm9jZXNzLmVudi5OT0RFX0VOVic6IEpTT04uc3RyaW5naWZ5KGNvbmZpZy5tb2RlKSxcbiAgICB9LFxuICB9O1xuICBmb3IgKGNvbnN0IGdsb2JhbCBvZiBnZXRFbnRyeXBvaW50R2xvYmFscyhjb25maWcsIGVudHJ5cG9pbnQubmFtZSkpIHtcbiAgICBsaWJNb2RlLmRlZmluZSFbZ2xvYmFsLm5hbWVdID0gSlNPTi5zdHJpbmdpZnkoZ2xvYmFsLnZhbHVlKTtcbiAgfVxuICBjb25zdCBlbnRyeUNvbmZpZyA9IHZpdGUubWVyZ2VDb25maWcoXG4gICAgbGliTW9kZSxcbiAgICBhd2FpdCBjb25maWcudml0ZShjb25maWcuZW52KSxcbiAgKSBhcyB2aXRlLklubGluZUNvbmZpZztcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCB2aXRlLmJ1aWxkKGVudHJ5Q29uZmlnKTtcbiAgcmV0dXJuIHtcbiAgICBlbnRyeXBvaW50czogZW50cnlwb2ludCxcbiAgICBjaHVua3M6IGdldEJ1aWxkT3V0cHV0Q2h1bmtzKHJlc3VsdCksXG4gIH07XG59XG5cbi8qKlxuICogVXNlIFZpdGUncyBtdWx0aXBhZ2UgYnVpbGQgdG8gYnVuZGxlIGFsbCB0aGUgZW50cnlwb2ludHMgaW4gYSBzaW5nbGUgc3RlcC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRNdWx0aXBsZUVudHJ5cG9pbnRzKFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxCdWlsZFN0ZXBPdXRwdXQ+IHtcbiAgY29uc3QgbXVsdGlQYWdlOiB2aXRlLlVzZXJDb25maWcgPSB7XG4gICAgcGx1Z2luczogW3d4dFBsdWdpbnMubXVsdGlwYWdlTW92ZShlbnRyeXBvaW50cywgY29uZmlnKV0sXG4gICAgYnVpbGQ6IHtcbiAgICAgIHJvbGx1cE9wdGlvbnM6IHtcbiAgICAgICAgaW5wdXQ6IGVudHJ5cG9pbnRzLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoaW5wdXQsIGVudHJ5KSA9PiB7XG4gICAgICAgICAgaW5wdXRbZW50cnkubmFtZV0gPSBlbnRyeS5pbnB1dFBhdGg7XG4gICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9LCB7fSksXG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgIC8vIEluY2x1ZGUgYSBoYXNoIHRvIHByZXZlbnQgY29uZmxpY3RzXG4gICAgICAgICAgY2h1bmtGaWxlTmFtZXM6ICdjaHVua3MvW25hbWVdLVtoYXNoXS5qcycsXG4gICAgICAgICAgLy8gSW5jbHVkZSBhIGhhc2ggdG8gcHJldmVudCBjb25mbGljdHNcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogJ2NodW5rcy9bbmFtZV0tW2hhc2hdLmpzJyxcbiAgICAgICAgICAvLyBXZSBjYW4ndCBjb250cm9sIHRoZSBcIm5hbWVcIiwgc28gd2UgbmVlZCBhIGhhc2ggdG8gcHJldmVudCBjb25mbGljdHNcbiAgICAgICAgICBhc3NldEZpbGVOYW1lczogJ2Fzc2V0cy9bbmFtZV0tW2hhc2hdLltleHRdJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkZWZpbmU6IHt9LFxuICB9O1xuICBmb3IgKGNvbnN0IGdsb2JhbCBvZiBnZXRFbnRyeXBvaW50R2xvYmFscyhjb25maWcsICdodG1sJykpIHtcbiAgICBtdWx0aVBhZ2UuZGVmaW5lIVtnbG9iYWwubmFtZV0gPSBKU09OLnN0cmluZ2lmeShnbG9iYWwudmFsdWUpO1xuICB9XG5cbiAgY29uc3QgZW50cnlDb25maWcgPSB2aXRlLm1lcmdlQ29uZmlnKFxuICAgIG11bHRpUGFnZSxcbiAgICBhd2FpdCBjb25maWcudml0ZShjb25maWcuZW52KSxcbiAgKSBhcyB2aXRlLlVzZXJDb25maWc7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdml0ZS5idWlsZChlbnRyeUNvbmZpZyk7XG4gIHJldHVybiB7XG4gICAgZW50cnlwb2ludHMsXG4gICAgY2h1bmtzOiBnZXRCdWlsZE91dHB1dENodW5rcyhyZXN1bHQpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRCdWlsZE91dHB1dENodW5rcyhcbiAgcmVzdWx0OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHZpdGUuYnVpbGQ+Pixcbik6IEJ1aWxkU3RlcE91dHB1dFsnY2h1bmtzJ10ge1xuICBpZiAoJ29uJyBpbiByZXN1bHQpIHRocm93IEVycm9yKCd3eHQgZG9lcyBub3Qgc3VwcG9ydCB2aXRlIHdhdGNoIG1vZGUuJyk7XG4gIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHJldHVybiByZXN1bHQuZmxhdE1hcCgoeyBvdXRwdXQgfSkgPT4gb3V0cHV0KTtcbiAgcmV0dXJuIHJlc3VsdC5vdXRwdXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcHlQdWJsaWNEaXJlY3RvcnkoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPEJ1aWxkT3V0cHV0WydwdWJsaWNBc3NldHMnXT4ge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGdldFB1YmxpY0ZpbGVzKGNvbmZpZyk7XG4gIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBwdWJsaWNBc3NldHM6IEJ1aWxkT3V0cHV0WydwdWJsaWNBc3NldHMnXSA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBzcmNQYXRoID0gcmVzb2x2ZShjb25maWcucHVibGljRGlyLCBmaWxlKTtcbiAgICBjb25zdCBvdXRQYXRoID0gcmVzb2x2ZShjb25maWcub3V0RGlyLCBmaWxlKTtcblxuICAgIGF3YWl0IGZzLmVuc3VyZURpcihkaXJuYW1lKG91dFBhdGgpKTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShzcmNQYXRoLCBvdXRQYXRoKTtcbiAgICBwdWJsaWNBc3NldHMucHVzaCh7XG4gICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgZmlsZU5hbWU6IGZpbGUsXG4gICAgICBuYW1lOiBmaWxlLFxuICAgICAgbmVlZHNDb2RlUmVmZXJlbmNlOiBmYWxzZSxcbiAgICAgIHNvdXJjZTogYXdhaXQgZnMucmVhZEZpbGUoc3JjUGF0aCksXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHVibGljQXNzZXRzO1xufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUVtcHR5RGlycyhkaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBmaWxlKTtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCByZW1vdmVFbXB0eURpcnMoZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucm1kaXIoZGlyKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gbm9vcCBvbiBmYWlsdXJlIC0gdGhpcyBtZWFucyB0aGUgZGlyZWN0b3J5IHdhcyBub3QgZW1wdHkuXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgZ2xvYiBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgdW5ub3JtYWxpemVQYXRoIH0gZnJvbSAnLi9wYXRocyc7XG5cbi8qKlxuICogR2V0IGFsbCB0aGUgZmlsZXMgaW4gdGhlIHByb2plY3QncyBwdWJsaWMgZGlyZWN0b3J5LiBSZXR1cm5lZCBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlXG4gKiBgY29uZmlnLnB1YmxpY0RpcmAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQdWJsaWNGaWxlcyhcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKGNvbmZpZy5wdWJsaWNEaXIpKSkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZ2xvYignKiovKicsIHsgY3dkOiBjb25maWcucHVibGljRGlyIH0pO1xuICByZXR1cm4gZmlsZXMubWFwKHVubm9ybWFsaXplUGF0aCk7XG59XG4iLCAiaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIEJhY2tncm91bmRFbnRyeXBvaW50LFxuICBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24sXG4gIEJhc2VFbnRyeXBvaW50T3B0aW9ucyxcbiAgQ29udGVudFNjcmlwdERlZmluaXRpb24sXG4gIENvbnRlbnRTY3JpcHRFbnRyeXBvaW50LFxuICBFbnRyeXBvaW50LFxuICBHZW5lcmljRW50cnlwb2ludCxcbiAgSW50ZXJuYWxDb25maWcsXG4gIE9wdGlvbnNFbnRyeXBvaW50LFxuICBQb3B1cEVudHJ5cG9pbnQsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBtaW5pbWF0Y2ggfSBmcm9tICdtaW5pbWF0Y2gnO1xuaW1wb3J0IHsgcGFyc2VIVE1MIH0gZnJvbSAnbGlua2Vkb20nO1xuaW1wb3J0IEpTT041IGZyb20gJ2pzb241JztcbmltcG9ydCB7IGltcG9ydEVudHJ5cG9pbnRGaWxlIH0gZnJvbSAnLi4vdXRpbHMvaW1wb3J0RW50cnlwb2ludEZpbGUnO1xuaW1wb3J0IGdsb2IgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnROYW1lIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgVklSVFVBTF9OT09QX0JBQ0tHUk9VTkRfTU9EVUxFX0lEIH0gZnJvbSAnLi4vdml0ZS1wbHVnaW5zL25vb3BCYWNrZ3JvdW5kJztcbmltcG9ydCB7IENTU19FWFRFTlNJT05TX1BBVFRFUk4gfSBmcm9tICcuLi91dGlscy9wYXRocyc7XG5cbi8qKlxuICogUmV0dXJuIGVudHJ5cG9pbnRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9uIGJ5IGxvb2tpbmcgdGhyb3VnaCB0aGUgcHJvamVjdCdzIGZpbGVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZEVudHJ5cG9pbnRzKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxFbnRyeXBvaW50W10+IHtcbiAgY29uc3QgcmVsYXRpdmVQYXRocyA9IGF3YWl0IGdsb2IoJyoqLyonLCB7XG4gICAgY3dkOiBjb25maWcuZW50cnlwb2ludHNEaXIsXG4gIH0pO1xuICAvLyBFbnN1cmUgY29uc2lzdGVudCBvdXRwdXRcbiAgcmVsYXRpdmVQYXRocy5zb3J0KCk7XG5cbiAgY29uc3QgcGF0aEdsb2JzID0gT2JqZWN0LmtleXMoUEFUSF9HTE9CX1RPX1RZUEVfTUFQKTtcbiAgY29uc3QgZXhpc3RpbmdOYW1lczogUmVjb3JkPHN0cmluZywgRW50cnlwb2ludCB8IHVuZGVmaW5lZD4gPSB7fTtcblxuICBjb25zdCBlbnRyeXBvaW50czogRW50cnlwb2ludFtdID0gW107XG4gIGxldCBoYXNCYWNrZ3JvdW5kID0gZmFsc2U7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHJlbGF0aXZlUGF0aHMubWFwKGFzeW5jIChyZWxhdGl2ZVBhdGgpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKGNvbmZpZy5lbnRyeXBvaW50c0RpciwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIGNvbnN0IG1hdGNoaW5nR2xvYiA9IHBhdGhHbG9icy5maW5kKChnbG9iKSA9PlxuICAgICAgICBtaW5pbWF0Y2gocmVsYXRpdmVQYXRoLCBnbG9iKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChtYXRjaGluZ0dsb2IgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGAke3JlbGF0aXZlUGF0aH0gZG9lcyBub3QgbWF0Y2ggYW55IGtub3duIGVudHJ5cG9pbnQuIEtub3duIGVudHJ5cG9pbnRzOlxcbiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBQQVRIX0dMT0JfVE9fVFlQRV9NQVAsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgMixcbiAgICAgICAgICApfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGUgPSBQQVRIX0dMT0JfVE9fVFlQRV9NQVBbbWF0Y2hpbmdHbG9iXTtcbiAgICAgIGlmICh0eXBlID09PSAnaWdub3JlZCcpIHJldHVybjtcblxuICAgICAgbGV0IGVudHJ5cG9pbnQ6IEVudHJ5cG9pbnQ7XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAncG9wdXAnOlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSBhd2FpdCBnZXRQb3B1cEVudHJ5cG9pbnQoY29uZmlnLCBwYXRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb3B0aW9ucyc6XG4gICAgICAgICAgZW50cnlwb2ludCA9IGF3YWl0IGdldE9wdGlvbnNFbnRyeXBvaW50KGNvbmZpZywgcGF0aCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JhY2tncm91bmQnOlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSBhd2FpdCBnZXRCYWNrZ3JvdW5kRW50cnlwb2ludChjb25maWcsIHBhdGgpO1xuICAgICAgICAgIGhhc0JhY2tncm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjb250ZW50LXNjcmlwdCc6XG4gICAgICAgICAgZW50cnlwb2ludCA9IGF3YWl0IGdldENvbnRlbnRTY3JpcHRFbnRyeXBvaW50KFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgZ2V0RW50cnlwb2ludE5hbWUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCBwYXRoKSxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndW5saXN0ZWQtcGFnZSc6XG4gICAgICAgICAgZW50cnlwb2ludCA9IGF3YWl0IGdldFVubGlzdGVkUGFnZUVudHJ5cG9pbnQoY29uZmlnLCBwYXRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29udGVudC1zY3JpcHQtc3R5bGUnOlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSB7XG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbmFtZTogZ2V0RW50cnlwb2ludE5hbWUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCBwYXRoKSxcbiAgICAgICAgICAgIGlucHV0UGF0aDogcGF0aCxcbiAgICAgICAgICAgIG91dHB1dERpcjogcmVzb2x2ZShjb25maWcub3V0RGlyLCBDT05URU5UX1NDUklQVF9PVVRfRElSKSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgaW5jbHVkZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBleGNsdWRlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZW50cnlwb2ludCA9IHtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBuYW1lOiBnZXRFbnRyeXBvaW50TmFtZShjb25maWcuZW50cnlwb2ludHNEaXIsIHBhdGgpLFxuICAgICAgICAgICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgICAgICAgICAgb3V0cHV0RGlyOiBjb25maWcub3V0RGlyLFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICBpbmNsdWRlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGV4Y2x1ZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd2l0aFNhbWVOYW1lID0gZXhpc3RpbmdOYW1lc1tlbnRyeXBvaW50Lm5hbWVdO1xuICAgICAgaWYgKHdpdGhTYW1lTmFtZSkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgTXVsdGlwbGUgZW50cnlwb2ludHMgd2l0aCB0aGUgbmFtZSBcIiR7XG4gICAgICAgICAgICBlbnRyeXBvaW50Lm5hbWVcbiAgICAgICAgICB9XCIgZGV0ZWN0ZWQsIGJ1dCBvbmx5IG9uZSBpcyBhbGxvd2VkOiAke1tcbiAgICAgICAgICAgIHJlbGF0aXZlKGNvbmZpZy5yb290LCB3aXRoU2FtZU5hbWUuaW5wdXRQYXRoKSxcbiAgICAgICAgICAgIHJlbGF0aXZlKGNvbmZpZy5yb290LCBlbnRyeXBvaW50LmlucHV0UGF0aCksXG4gICAgICAgICAgXS5qb2luKCcsICcpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbnRyeXBvaW50cy5wdXNoKGVudHJ5cG9pbnQpO1xuICAgICAgZXhpc3RpbmdOYW1lc1tlbnRyeXBvaW50Lm5hbWVdID0gZW50cnlwb2ludDtcbiAgICB9KSxcbiAgKTtcbiAgaWYgKGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnICYmICFoYXNCYWNrZ3JvdW5kKSB7XG4gICAgZW50cnlwb2ludHMucHVzaChcbiAgICAgIGF3YWl0IGdldEJhY2tncm91bmRFbnRyeXBvaW50KGNvbmZpZywgVklSVFVBTF9OT09QX0JBQ0tHUk9VTkRfTU9EVUxFX0lEKSxcbiAgICApO1xuICB9XG5cbiAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnQWxsIGVudHJ5cG9pbnRzOicsIGVudHJ5cG9pbnRzKTtcbiAgY29uc3QgdGFyZ2V0RW50cnlwb2ludHMgPSBlbnRyeXBvaW50cy5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgY29uc3QgeyBpbmNsdWRlLCBleGNsdWRlIH0gPSBlbnRyeS5vcHRpb25zO1xuICAgIGlmIChpbmNsdWRlPy5sZW5ndGggJiYgZXhjbHVkZT8ubGVuZ3RoKSB7XG4gICAgICBjb25maWcubG9nZ2VyLndhcm4oXG4gICAgICAgIGBUaGUgJHtlbnRyeS5uYW1lfSBlbnRyeXBvaW50IGxpc3RzIGJvdGggaW5jbHVkZSBhbmQgZXhjbHVkZSwgYnV0IG9ubHkgb25lIGNhbiBiZSB1c2VkIHBlciBlbnRyeXBvaW50LiBFbnRyeXBvaW50IGlnbm9yZWQuYCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChleGNsdWRlPy5sZW5ndGggJiYgIWluY2x1ZGU/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuICFleGNsdWRlLmluY2x1ZGVzKGNvbmZpZy5icm93c2VyKTtcbiAgICB9XG4gICAgaWYgKGluY2x1ZGU/Lmxlbmd0aCAmJiAhZXhjbHVkZT8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gaW5jbHVkZS5pbmNsdWRlcyhjb25maWcuYnJvd3Nlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuICBjb25maWcubG9nZ2VyLmRlYnVnKGAke2NvbmZpZy5icm93c2VyfSBlbnRyeXBvaW50czpgLCB0YXJnZXRFbnRyeXBvaW50cyk7XG4gIHJldHVybiB0YXJnZXRFbnRyeXBvaW50cztcbn1cblxuZnVuY3Rpb24gZ2V0SHRtbEJhc2VPcHRpb25zKGRvY3VtZW50OiBEb2N1bWVudCk6IEJhc2VFbnRyeXBvaW50T3B0aW9ucyB7XG4gIGNvbnN0IG9wdGlvbnM6IEJhc2VFbnRyeXBvaW50T3B0aW9ucyA9IHt9O1xuXG4gIGNvbnN0IGluY2x1ZGVDb250ZW50ID0gZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nbWFuaWZlc3QuaW5jbHVkZSddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKGluY2x1ZGVDb250ZW50KSB7XG4gICAgb3B0aW9ucy5pbmNsdWRlID0gSlNPTjUucGFyc2UoaW5jbHVkZUNvbnRlbnQpO1xuICB9XG5cbiAgY29uc3QgZXhjbHVkZUNvbnRlbnQgPSBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdtYW5pZmVzdC5leGNsdWRlJ11cIilcbiAgICA/LmdldEF0dHJpYnV0ZSgnY29udGVudCcpO1xuICBpZiAoZXhjbHVkZUNvbnRlbnQpIHtcbiAgICBvcHRpb25zLmV4Y2x1ZGUgPSBKU09ONS5wYXJzZShleGNsdWRlQ29udGVudCk7XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBAcGFyYW0gcGF0aCBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwb3B1cCBIVE1MIGZpbGUuXG4gKiBAcGFyYW0gY29udGVudCBTdHJpbmcgY29udGVudHMgb2YgdGhlIGZpbGUgYXQgdGhlIHBhdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBvcHVwRW50cnlwb2ludChcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgcGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTxQb3B1cEVudHJ5cG9pbnQ+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICBjb25zdCB7IGRvY3VtZW50IH0gPSBwYXJzZUhUTUwoY29udGVudCk7XG5cbiAgY29uc3Qgb3B0aW9uczogUG9wdXBFbnRyeXBvaW50WydvcHRpb25zJ10gPSBnZXRIdG1sQmFzZU9wdGlvbnMoZG9jdW1lbnQpO1xuXG4gIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKTtcbiAgaWYgKHRpdGxlICE9IG51bGwpIG9wdGlvbnMuZGVmYXVsdFRpdGxlID0gdGl0bGUudGV4dENvbnRlbnQgPz8gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGRlZmF1bHRJY29uQ29udGVudCA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J21hbmlmZXN0LmRlZmF1bHRfaWNvbiddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKGRlZmF1bHRJY29uQ29udGVudCkge1xuICAgIHRyeSB7XG4gICAgICBvcHRpb25zLmRlZmF1bHRJY29uID0gSlNPTjUucGFyc2UoZGVmYXVsdEljb25Db250ZW50KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZmF0YWwoXG4gICAgICAgIGBGYWlsZWQgdG8gcGFyc2UgZGVmYXVsdF9pY29uIG1ldGEgdGFnIGNvbnRlbnQgYXMgSlNPTjUuIGNvbnRlbnQ9JHtkZWZhdWx0SWNvbkNvbnRlbnR9YCxcbiAgICAgICAgZXJyLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBtdjJLZXlDb250ZW50ID0gZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nbWFuaWZlc3QudHlwZSddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKG12MktleUNvbnRlbnQpIHtcbiAgICBvcHRpb25zLm12MktleSA9XG4gICAgICBtdjJLZXlDb250ZW50ID09PSAncGFnZV9hY3Rpb24nID8gJ3BhZ2VfYWN0aW9uJyA6ICdicm93c2VyX2FjdGlvbic7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdwb3B1cCcsXG4gICAgbmFtZTogJ3BvcHVwJyxcbiAgICBvcHRpb25zLFxuICAgIGlucHV0UGF0aDogcGF0aCxcbiAgICBvdXRwdXREaXI6IGNvbmZpZy5vdXREaXIsXG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHBhdGggQWJzb2x1dGUgcGF0aCB0byB0aGUgb3B0aW9ucyBIVE1MIGZpbGUuXG4gKiBAcGFyYW0gY29udGVudCBTdHJpbmcgY29udGVudHMgb2YgdGhlIGZpbGUgYXQgdGhlIHBhdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE9wdGlvbnNFbnRyeXBvaW50KFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBwYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPE9wdGlvbnNFbnRyeXBvaW50PiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgeyBkb2N1bWVudCB9ID0gcGFyc2VIVE1MKGNvbnRlbnQpO1xuXG4gIGNvbnN0IG9wdGlvbnM6IE9wdGlvbnNFbnRyeXBvaW50WydvcHRpb25zJ10gPSBnZXRIdG1sQmFzZU9wdGlvbnMoZG9jdW1lbnQpO1xuXG4gIGNvbnN0IG9wZW5JblRhYkNvbnRlbnQgPSBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdtYW5pZmVzdC5vcGVuX2luX3RhYiddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKG9wZW5JblRhYkNvbnRlbnQpIHtcbiAgICBvcHRpb25zLm9wZW5JblRhYiA9IG9wZW5JblRhYkNvbnRlbnQgPT09ICd0cnVlJztcbiAgfVxuXG4gIGNvbnN0IGNocm9tZVN0eWxlQ29udGVudCA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J21hbmlmZXN0LmNocm9tZV9zdHlsZSddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKGNocm9tZVN0eWxlQ29udGVudCkge1xuICAgIG9wdGlvbnMuY2hyb21lU3R5bGUgPSBjaHJvbWVTdHlsZUNvbnRlbnQgPT09ICd0cnVlJztcbiAgfVxuXG4gIGNvbnN0IGJyb3dzZXJTdHlsZUNvbnRlbnQgPSBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdtYW5pZmVzdC5icm93c2VyX3N0eWxlJ11cIilcbiAgICA/LmdldEF0dHJpYnV0ZSgnY29udGVudCcpO1xuICBpZiAoYnJvd3NlclN0eWxlQ29udGVudCkge1xuICAgIG9wdGlvbnMuYnJvd3NlclN0eWxlID0gYnJvd3NlclN0eWxlQ29udGVudCA9PT0gJ3RydWUnO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnb3B0aW9ucycsXG4gICAgbmFtZTogJ29wdGlvbnMnLFxuICAgIG9wdGlvbnMsXG4gICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgIG91dHB1dERpcjogY29uZmlnLm91dERpcixcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gcGF0aCBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBIVE1MIGZpbGUuXG4gKiBAcGFyYW0gY29udGVudCBTdHJpbmcgY29udGVudHMgb2YgdGhlIGZpbGUgYXQgdGhlIHBhdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFVubGlzdGVkUGFnZUVudHJ5cG9pbnQoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4gIHBhdGg6IHN0cmluZyxcbik6IFByb21pc2U8R2VuZXJpY0VudHJ5cG9pbnQ+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICBjb25zdCB7IGRvY3VtZW50IH0gPSBwYXJzZUhUTUwoY29udGVudCk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAndW5saXN0ZWQtcGFnZScsXG4gICAgbmFtZTogZ2V0RW50cnlwb2ludE5hbWUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCBwYXRoKSxcbiAgICBpbnB1dFBhdGg6IHBhdGgsXG4gICAgb3V0cHV0RGlyOiBjb25maWcub3V0RGlyLFxuICAgIG9wdGlvbnM6IGdldEh0bWxCYXNlT3B0aW9ucyhkb2N1bWVudCksXG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHBhdGggQWJzb2x1dGUgcGF0aCB0byB0aGUgYmFja2dyb3VuZCdzIFRTIGZpbGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEJhY2tncm91bmRFbnRyeXBvaW50KFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBwYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPEJhY2tncm91bmRFbnRyeXBvaW50PiB7XG4gIGxldCBvcHRpb25zOiBPbWl0PEJhY2tncm91bmRTY3JpcHREZWZpbnRpdGlvbiwgJ21haW4nPiA9IHt9O1xuICBpZiAocGF0aCAhPT0gVklSVFVBTF9OT09QX0JBQ0tHUk9VTkRfTU9EVUxFX0lEKSB7XG4gICAgY29uc3QgZGVmYXVsdEV4cG9ydCA9XG4gICAgICBhd2FpdCBpbXBvcnRFbnRyeXBvaW50RmlsZTxCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24+KHBhdGgsIGNvbmZpZyk7XG4gICAgaWYgKGRlZmF1bHRFeHBvcnQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0JhY2tncm91bmQgc2NyaXB0IGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGV4cG9ydCcpO1xuICAgIH1cbiAgICBjb25zdCB7IG1haW46IF8sIC4uLm1vZHVsZU9wdGlvbnMgfSA9IGRlZmF1bHRFeHBvcnQ7XG4gICAgb3B0aW9ucyA9IG1vZHVsZU9wdGlvbnM7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnYmFja2dyb3VuZCcsXG4gICAgbmFtZTogJ2JhY2tncm91bmQnLFxuICAgIGlucHV0UGF0aDogcGF0aCxcbiAgICBvdXRwdXREaXI6IGNvbmZpZy5vdXREaXIsXG4gICAgb3B0aW9uczogb3B0aW9ucyxcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gcGF0aCBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBjb250ZW50IHNjcmlwdCdzIFRTIGZpbGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENvbnRlbnRTY3JpcHRFbnRyeXBvaW50KFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBuYW1lOiBzdHJpbmcsXG4gIHBhdGg6IHN0cmluZyxcbik6IFByb21pc2U8Q29udGVudFNjcmlwdEVudHJ5cG9pbnQ+IHtcbiAgY29uc3QgeyBtYWluOiBfLCAuLi5vcHRpb25zIH0gPVxuICAgIGF3YWl0IGltcG9ydEVudHJ5cG9pbnRGaWxlPENvbnRlbnRTY3JpcHREZWZpbml0aW9uPihwYXRoLCBjb25maWcpO1xuICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgdGhyb3cgRXJyb3IoYENvbnRlbnQgc2NyaXB0ICR7bmFtZX0gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgZXhwb3J0YCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnY29udGVudC1zY3JpcHQnLFxuICAgIG5hbWU6IGdldEVudHJ5cG9pbnROYW1lKGNvbmZpZy5lbnRyeXBvaW50c0RpciwgcGF0aCksXG4gICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgIG91dHB1dERpcjogcmVzb2x2ZShjb25maWcub3V0RGlyLCBDT05URU5UX1NDUklQVF9PVVRfRElSKSxcbiAgICBvcHRpb25zLFxuICB9O1xufVxuXG5jb25zdCBQQVRIX0dMT0JfVE9fVFlQRV9NQVA6IFJlY29yZDxzdHJpbmcsIEVudHJ5cG9pbnRbJ3R5cGUnXSB8ICdpZ25vcmVkJz4gPSB7XG4gICdzYW5kYm94Lmh0bWwnOiAnc2FuZGJveCcsXG4gICdzYW5kYm94L2luZGV4Lmh0bWwnOiAnc2FuZGJveCcsXG4gICcqLnNhbmRib3guaHRtbCc6ICdzYW5kYm94JyxcbiAgJyouc2FuZGJveC9pbmRleC5odG1sJzogJ3NhbmRib3gnLFxuXG4gICdib29rbWFya3MuaHRtbCc6ICdib29rbWFya3MnLFxuICAnYm9va21hcmtzL2luZGV4Lmh0bWwnOiAnYm9va21hcmtzJyxcblxuICAnaGlzdG9yeS5odG1sJzogJ2hpc3RvcnknLFxuICAnaGlzdG9yeS9pbmRleC5odG1sJzogJ2hpc3RvcnknLFxuXG4gICduZXd0YWIuaHRtbCc6ICduZXd0YWInLFxuICAnbmV3dGFiL2luZGV4Lmh0bWwnOiAnbmV3dGFiJyxcblxuICAnc2lkZXBhbmVsLmh0bWwnOiAnc2lkZXBhbmVsJyxcbiAgJ3NpZGVwYW5lbC9pbmRleC5odG1sJzogJ3NpZGVwYW5lbCcsXG4gICcqLnNpZGVwYW5lbC5odG1sJzogJ3NpZGVwYW5lbCcsXG4gICcqLnNpZGVwYW5lbC9pbmRleC5odG1sJzogJ3NpZGVwYW5lbCcsXG5cbiAgJ2RldnRvb2xzLmh0bWwnOiAnZGV2dG9vbHMnLFxuICAnZGV2dG9vbHMvaW5kZXguaHRtbCc6ICdkZXZ0b29scycsXG5cbiAgJ2JhY2tncm91bmQudHMnOiAnYmFja2dyb3VuZCcsXG4gICdiYWNrZ3JvdW5kL2luZGV4LnRzJzogJ2JhY2tncm91bmQnLFxuICBbVklSVFVBTF9OT09QX0JBQ0tHUk9VTkRfTU9EVUxFX0lEXTogJ2JhY2tncm91bmQnLFxuXG4gICdjb250ZW50LnRzPyh4KSc6ICdjb250ZW50LXNjcmlwdCcsXG4gICdjb250ZW50L2luZGV4LnRzPyh4KSc6ICdjb250ZW50LXNjcmlwdCcsXG4gICcqLmNvbnRlbnQudHM/KHgpJzogJ2NvbnRlbnQtc2NyaXB0JyxcbiAgJyouY29udGVudC9pbmRleC50cz8oeCknOiAnY29udGVudC1zY3JpcHQnLFxuICBbYGNvbnRlbnQuJHtDU1NfRVhURU5TSU9OU19QQVRURVJOfWBdOiAnY29udGVudC1zY3JpcHQtc3R5bGUnLFxuICBbYCouY29udGVudC4ke0NTU19FWFRFTlNJT05TX1BBVFRFUk59YF06ICdjb250ZW50LXNjcmlwdC1zdHlsZScsXG4gIFtgY29udGVudC9pbmRleC4ke0NTU19FWFRFTlNJT05TX1BBVFRFUk59YF06ICdjb250ZW50LXNjcmlwdC1zdHlsZScsXG4gIFtgKi5jb250ZW50L2luZGV4LiR7Q1NTX0VYVEVOU0lPTlNfUEFUVEVSTn1gXTogJ2NvbnRlbnQtc2NyaXB0LXN0eWxlJyxcblxuICAncG9wdXAuaHRtbCc6ICdwb3B1cCcsXG4gICdwb3B1cC9pbmRleC5odG1sJzogJ3BvcHVwJyxcblxuICAnb3B0aW9ucy5odG1sJzogJ29wdGlvbnMnLFxuICAnb3B0aW9ucy9pbmRleC5odG1sJzogJ29wdGlvbnMnLFxuXG4gICcqLmh0bWwnOiAndW5saXN0ZWQtcGFnZScsXG4gICcqL2luZGV4Lmh0bWwnOiAndW5saXN0ZWQtcGFnZScsXG4gICcqLnRzJzogJ3VubGlzdGVkLXNjcmlwdCcsXG4gICcqL2luZGV4LnRzJzogJ3VubGlzdGVkLXNjcmlwdCcsXG4gIFtgKi4ke0NTU19FWFRFTlNJT05TX1BBVFRFUk59YF06ICd1bmxpc3RlZC1zdHlsZScsXG4gIFtgKi9pbmRleC4ke0NTU19FWFRFTlNJT05TX1BBVFRFUk59YF06ICd1bmxpc3RlZC1zdHlsZScsXG5cbiAgLy8gRG9uJ3Qgd2FybiBhYm91dCBhbnkgZmlsZXMgaW4gc3ViZGlyZWN0b3JpZXMsIGxpa2UgQ1NTIG9yIEpTIGVudHJ5cG9pbnRzIGZvciBIVE1MIGZpbGVzIG9yIHRlc3RzXG4gICcqLyoqJzogJ2lnbm9yZWQnLFxufTtcblxuY29uc3QgQ09OVEVOVF9TQ1JJUFRfT1VUX0RJUiA9ICdjb250ZW50LXNjcmlwdHMnO1xuIiwgImltcG9ydCBjcmVhdGVKSVRJLCB7IFRyYW5zZm9ybU9wdGlvbnMgYXMgSml0aVRyYW5zZm9ybU9wdGlvbnMgfSBmcm9tICdqaXRpJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlVW5pbXBvcnQgfSBmcm9tICd1bmltcG9ydCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0VW5pbXBvcnRPcHRpb25zIH0gZnJvbSAnLi9hdXRvLWltcG9ydHMnO1xuaW1wb3J0IHsgcmVtb3ZlUHJvamVjdEltcG9ydFN0YXRlbWVudHMgfSBmcm9tICcuL3N0cmluZ3MnO1xuaW1wb3J0IHsgbm9ybWFsaXplUGF0aCB9IGZyb20gJy4vcGF0aHMnO1xuaW1wb3J0IHsgVHJhbnNmb3JtT3B0aW9ucywgdHJhbnNmb3JtU3luYyB9IGZyb20gJ2VzYnVpbGQnO1xuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgZGVmYXVsdCBleHBvcnQgb2YgYSBgcGF0aGAuXG4gKlxuICogSXQgd29ya3MgYnk6XG4gKlxuICogMS4gUmVhZGluZyB0aGUgZmlsZSB0ZXh0XG4gKiAyLiBTdHJpcHBpbmcgYWxsIGltcG9ydHMgZnJvbSBpdCB2aWEgcmVnZXhcbiAqIDMuIEF1dG8taW1wb3J0IG9ubHkgdGhlIGNsaWVudCBoZWxwZXIgZnVuY3Rpb25zXG4gKlxuICogVGhpcyBwcmV2ZW50cyByZXNvbHZpbmcgaW1wb3J0cyBvZiBpbXBvcnRzLCBzcGVlZGluZyB0aGluZ3MgdXAgYW5kIHByZXZlbnRpbmcgXCJ4eHggaXMgbm90XG4gKiBkZWZpbmVkXCIgZXJyb3JzLlxuICpcbiAqIERvd25zaWRlIGlzIHRoYXQgY29kZSBjYW5ub3QgYmUgZXhlY3V0ZWQgb3V0c2lkZSBvZiB0aGUgbWFpbiBmdWNudGlvbiBmb3IgdGhlIGVudHJ5cG9pbnQsXG4gKiBvdGhlcndpc2UgeW91IHdpbGwgc2VlIFwieHh4IGlzIG5vdCBkZWZpbmVkXCIgZXJyb3JzIGZvciBhbnkgaW1wb3J0cyB1c2VkIG91dHNpZGUgb2YgbWFpbiBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEVudHJ5cG9pbnRGaWxlPFQ+KFxuICBwYXRoOiBzdHJpbmcsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBmaWxlIG1ldGFkYXRhOicsIHBhdGgpO1xuICAvLyBKSVRJICYgQmFiZWwgdXNlcyBub3JtYWxpemVkIHBhdGhzLlxuICBjb25zdCBub3JtYWxQYXRoID0gbm9ybWFsaXplUGF0aChwYXRoKTtcblxuICBjb25zdCB1bmltcG9ydCA9IGNyZWF0ZVVuaW1wb3J0KHtcbiAgICAuLi5nZXRVbmltcG9ydE9wdGlvbnMoY29uZmlnKSxcbiAgICAvLyBPbmx5IGFsbG93IHNwZWNpZmljIGltcG9ydHMsIG5vdCBhbGwgZnJvbSB0aGUgcHJvamVjdFxuICAgIGRpcnM6IFtdLFxuICB9KTtcbiAgYXdhaXQgdW5pbXBvcnQuaW5pdCgpO1xuXG4gIGNvbnN0IHRleHQgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgdGV4dE5vSW1wb3J0cyA9IHJlbW92ZVByb2plY3RJbXBvcnRTdGF0ZW1lbnRzKHRleHQpO1xuICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHVuaW1wb3J0LmluamVjdEltcG9ydHModGV4dE5vSW1wb3J0cyk7XG4gIGNvbmZpZy5sb2dnZXIuZGVidWcoXG4gICAgWydUZXh0OicsIHRleHQsICdObyBpbXBvcnRzOicsIHRleHROb0ltcG9ydHMsICdDb2RlOicsIGNvZGVdLmpvaW4oJ1xcbicpLFxuICApO1xuXG4gIGNvbnN0IGppdGkgPSBjcmVhdGVKSVRJKF9fZmlsZW5hbWUsIHtcbiAgICBjYWNoZTogZmFsc2UsXG4gICAgZGVidWc6IGNvbmZpZy5kZWJ1ZyxcbiAgICBlc21SZXNvbHZlOiB0cnVlLFxuICAgIGludGVyb3BEZWZhdWx0OiB0cnVlLFxuICAgIGFsaWFzOiB7XG4gICAgICAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJzogcmVzb2x2ZShcbiAgICAgICAgY29uZmlnLnJvb3QsXG4gICAgICAgICdub2RlX21vZHVsZXMvd3h0L2Rpc3QvdmlydHVhbC1tb2R1bGVzL2Zha2UtYnJvd3Nlci5qcycsXG4gICAgICApLFxuICAgIH0sXG4gICAgZXh0ZW5zaW9uczogWycudHMnLCAnLnRzeCcsICcuY2pzJywgJy5qcycsICcubWpzJ10sXG4gICAgdHJhbnNmb3JtKG9wdHMpIHtcbiAgICAgIGNvbnN0IGlzRW50cnlwb2ludCA9IG9wdHMuZmlsZW5hbWUgPT09IG5vcm1hbFBhdGg7XG4gICAgICByZXR1cm4gdHJhbnNmb3JtU3luYyhcbiAgICAgICAgLy8gVXNlIG1vZGlmaWVkIHNvdXJjZSBjb2RlIGZvciBlbnRyeXBvaW50c1xuICAgICAgICBpc0VudHJ5cG9pbnQgPyBjb2RlIDogb3B0cy5zb3VyY2UsXG4gICAgICAgIGdldEVzYnVpbGRPcHRpb25zKG9wdHMpLFxuICAgICAgKTtcbiAgICB9LFxuICB9KTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBqaXRpKHBhdGgpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25maWcubG9nZ2VyLmVycm9yKGVycik7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEVzYnVpbGRPcHRpb25zKG9wdHM6IEppdGlUcmFuc2Zvcm1PcHRpb25zKTogVHJhbnNmb3JtT3B0aW9ucyB7XG4gIGNvbnN0IGlzSnN4ID0gb3B0cy5maWxlbmFtZT8uZW5kc1dpdGgoJ3gnKTtcbiAgcmV0dXJuIHtcbiAgICBmb3JtYXQ6ICdjanMnLFxuICAgIGxvYWRlcjogaXNKc3ggPyAndHN4JyA6ICd0cycsXG4gICAganN4OiBpc0pzeCA/ICdhdXRvbWF0aWMnIDogdW5kZWZpbmVkLFxuICB9O1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBrZWJhYkNhc2VBbHBoYW51bWVyaWMoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvW15hLXowLTktXFxzXS9nLCAnJykgLy8gUmVtb3ZlIGFsbCBub24tYWxwaGFudW1lcmljLCBub24taHlwaGVuIGNoYXJhY3RlcnNcbiAgICAucmVwbGFjZSgvXFxzKy9nLCAnLScpOyAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIGh5cGhlbnNcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGltcG9ydCBzdGF0ZW1lbnRzIGZyb20gdGhlIHRvcCBvZiBhIGZpbGUuIEtlZXBzIGltcG9ydC5tZXRhIGFuZCBpbmxpbmUsIGFzeW5jIGBpbXBvcnQoKWBcbiAqIGNhbGxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlSW1wb3J0U3RhdGVtZW50cyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKFxuICAgIC8oaW1wb3J0XFxzP1t7XFx3XVtcXHNcXFNdKj9mcm9tXFxzP1tcIiddW1xcc1xcU10qP1tcIiddOz98aW1wb3J0XFxzP1tcIiddW1xcc1xcU10qP1tcIiddOz8pL2dtLFxuICAgICcnLFxuICApO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgaW1wb3J0cywgZW5zdXJpbmcgdGhhdCBzb21lIG9mIFdYVCdzIGNsaWVudCBpbXBvcnRzIGFyZSBwcmVzZW50LCBzbyB0aGF0IGVudHJ5cG9pbnRzIGNhbiBiZSBwYXJzZWQgaWYgYXV0by1pbXBvcnRzIGFyZSBkaXNhYmxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVByb2plY3RJbXBvcnRTdGF0ZW1lbnRzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG5vSW1wb3J0cyA9IHJlbW92ZUltcG9ydFN0YXRlbWVudHModGV4dCk7XG5cbiAgcmV0dXJuIGBpbXBvcnQgeyBkZWZpbmVDb250ZW50U2NyaXB0LCBkZWZpbmVCYWNrZ3JvdW5kIH0gZnJvbSAnd3h0L2NsaWVudCc7XG5cbiR7bm9JbXBvcnRzfWA7XG59XG4iLCAiaW1wb3J0IHsgVW5pbXBvcnRPcHRpb25zLCBjcmVhdGVVbmltcG9ydCB9IGZyb20gJ3VuaW1wb3J0JztcbmltcG9ydCB7IEVudHJ5cG9pbnQsIEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aCB9IGZyb20gJy4uL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCB7IGdldFVuaW1wb3J0T3B0aW9ucyB9IGZyb20gJy4uL3V0aWxzL2F1dG8taW1wb3J0cyc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50R2xvYmFscywgZ2V0R2xvYmFscyB9IGZyb20gJy4uL3V0aWxzL2dsb2JhbHMnO1xuaW1wb3J0IHsgZ2V0UHVibGljRmlsZXMgfSBmcm9tICcuLi91dGlscy9wdWJsaWMnO1xuaW1wb3J0IHsgbm9ybWFsaXplUGF0aCB9IGZyb20gJy4uL3V0aWxzL3BhdGhzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBNZXNzYWdlLCBwYXJzZUkxOG5NZXNzYWdlcyB9IGZyb20gJy4uL3V0aWxzL2kxOG4nO1xuaW1wb3J0IHsgd3JpdGVGaWxlSWZEaWZmZXJlbnQgfSBmcm9tICcuLi91dGlscy9mcyc7XG5cbi8qKlxuICogR2VuZXJhdGUgYW5kIHdyaXRlIGFsbCB0aGUgZmlsZXMgaW5zaWRlIHRoZSBgSW50ZXJuYWxDb25maWcudHlwZXNEaXJgIGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHlwZXNEaXIoXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMuZW5zdXJlRGlyKGNvbmZpZy50eXBlc0Rpcik7XG5cbiAgY29uc3QgcmVmZXJlbmNlczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdCBpbXBvcnRzID0gZ2V0VW5pbXBvcnRPcHRpb25zKGNvbmZpZyk7XG4gIGlmIChpbXBvcnRzICE9PSBmYWxzZSkge1xuICAgIHJlZmVyZW5jZXMucHVzaChhd2FpdCB3cml0ZUltcG9ydHNEZWNsYXJhdGlvbkZpbGUoY29uZmlnLCBpbXBvcnRzKSk7XG4gIH1cblxuICByZWZlcmVuY2VzLnB1c2goYXdhaXQgd3JpdGVQYXRoc0RlY2xhcmF0aW9uRmlsZShlbnRyeXBvaW50cywgY29uZmlnKSk7XG4gIHJlZmVyZW5jZXMucHVzaChhd2FpdCB3cml0ZUkxOG5EZWNsYXJhdGlvbkZpbGUoY29uZmlnKSk7XG4gIHJlZmVyZW5jZXMucHVzaChhd2FpdCB3cml0ZUdsb2JhbHNEZWNsYXJhdGlvbkZpbGUoY29uZmlnKSk7XG5cbiAgY29uc3QgbWFpblJlZmVyZW5jZSA9IGF3YWl0IHdyaXRlTWFpbkRlY2xhcmF0aW9uRmlsZShyZWZlcmVuY2VzLCBjb25maWcpO1xuICBhd2FpdCB3cml0ZVRzQ29uZmlnRmlsZShtYWluUmVmZXJlbmNlLCBjb25maWcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUltcG9ydHNEZWNsYXJhdGlvbkZpbGUoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4gIHVuaW1wb3J0T3B0aW9uczogUGFydGlhbDxVbmltcG9ydE9wdGlvbnM+LFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGNvbmZpZy50eXBlc0RpciwgJ2ltcG9ydHMuZC50cycpO1xuICBjb25zdCB1bmltcG9ydCA9IGNyZWF0ZVVuaW1wb3J0KHVuaW1wb3J0T3B0aW9ucyk7XG5cbiAgLy8gTG9hZCBwcm9qZWN0IGltcG9ydHMgaW50byB1bmltcG9ydCBtZW1vcnkgc28gdGhleSBhcmUgb3V0cHV0IHZpYSBnZW5lcmF0ZVR5cGVEZWNsYXJhdGlvbnNcbiAgYXdhaXQgdW5pbXBvcnQuc2NhbkltcG9ydHNGcm9tRGlyKHVuZGVmaW5lZCwgeyBjd2Q6IGNvbmZpZy5zcmNEaXIgfSk7XG5cbiAgYXdhaXQgd3JpdGVGaWxlSWZEaWZmZXJlbnQoXG4gICAgZmlsZVBhdGgsXG4gICAgWycvLyBHZW5lcmF0ZWQgYnkgd3h0JywgYXdhaXQgdW5pbXBvcnQuZ2VuZXJhdGVUeXBlRGVjbGFyYXRpb25zKCldLmpvaW4oXG4gICAgICAnXFxuJyxcbiAgICApICsgJ1xcbicsXG4gICk7XG5cbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVBhdGhzRGVjbGFyYXRpb25GaWxlKFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGNvbmZpZy50eXBlc0RpciwgJ3BhdGhzLmQudHMnKTtcbiAgY29uc3QgdW5pb25zID0gZW50cnlwb2ludHNcbiAgICAubWFwKChlbnRyeSkgPT5cbiAgICAgIGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgICBlbnRyeSxcbiAgICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICAgZW50cnkuaW5wdXRQYXRoLmVuZHNXaXRoKCcuaHRtbCcpID8gJy5odG1sJyA6ICcuanMnLFxuICAgICAgKSxcbiAgICApXG4gICAgLmNvbmNhdChhd2FpdCBnZXRQdWJsaWNGaWxlcyhjb25maWcpKVxuICAgIC5tYXAobm9ybWFsaXplUGF0aClcbiAgICAubWFwKChwYXRoKSA9PiBgICAgIHwgXCIvJHtwYXRofVwiYClcbiAgICAuc29ydCgpXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIGNvbnN0IHRlbXBsYXRlID0gYC8vIEdlbmVyYXRlZCBieSB3eHRcbmltcG9ydCBcInd4dC9icm93c2VyXCI7XG5cbmRlY2xhcmUgbW9kdWxlIFwid3h0L2Jyb3dzZXJcIiB7XG4gIHR5cGUgUHVibGljUGF0aCA9XG57eyB1bmlvbiB9fVxuICBleHBvcnQgaW50ZXJmYWNlIFd4dFJ1bnRpbWUgZXh0ZW5kcyBSdW50aW1lLlN0YXRpYyB7XG4gICAgZ2V0VVJMKHBhdGg6IFB1YmxpY1BhdGgpOiBzdHJpbmc7XG4gIH1cbn1cbmA7XG5cbiAgYXdhaXQgd3JpdGVGaWxlSWZEaWZmZXJlbnQoXG4gICAgZmlsZVBhdGgsXG4gICAgdGVtcGxhdGUucmVwbGFjZSgne3sgdW5pb24gfX0nLCB1bmlvbnMgfHwgJyAgICB8IG5ldmVyJyksXG4gICk7XG5cbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUkxOG5EZWNsYXJhdGlvbkZpbGUoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoY29uZmlnLnR5cGVzRGlyLCAnaTE4bi5kLnRzJyk7XG4gIGNvbnN0IGRlZmF1bHRMb2NhbGUgPSBjb25maWcubWFuaWZlc3QuZGVmYXVsdF9sb2NhbGU7XG4gIGNvbnN0IHRlbXBsYXRlID0gYC8vIEdlbmVyYXRlZCBieSB3eHRcbmltcG9ydCBcInd4dC9icm93c2VyXCI7XG5cbmRlY2xhcmUgbW9kdWxlIFwid3h0L2Jyb3dzZXJcIiB7XG4gIC8qKlxuICAgKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9kb2NzL2V4dGVuc2lvbnMvcmVmZXJlbmNlL2kxOG4vI21ldGhvZC1nZXRNZXNzYWdlXG4gICAqL1xuICBpbnRlcmZhY2UgR2V0TWVzc2FnZU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNlZSBodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2RvY3MvZXh0ZW5zaW9ucy9yZWZlcmVuY2UvaTE4bi8jbWV0aG9kLWdldE1lc3NhZ2VcbiAgICAgKi9cbiAgICBlc2NhcGVMdD86IGJvb2xlYW5cbiAgfVxuXG4gIGV4cG9ydCBpbnRlcmZhY2UgV3h0STE4biBleHRlbmRzIEkxOG4uU3RhdGljIHtcbnt7IG92ZXJyaWRlcyB9fVxuICB9XG59XG5gO1xuXG4gIGxldCBtZXNzYWdlczogTWVzc2FnZVtdO1xuICBpZiAoZGVmYXVsdExvY2FsZSkge1xuICAgIGNvbnN0IGRlZmF1bHRMb2NhbGVQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgY29uZmlnLnB1YmxpY0RpcixcbiAgICAgICdfbG9jYWxlcycsXG4gICAgICBkZWZhdWx0TG9jYWxlLFxuICAgICAgJ21lc3NhZ2VzLmpzb24nLFxuICAgICk7XG4gICAgY29uc3QgY29udGVudCA9IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUoZGVmYXVsdExvY2FsZVBhdGgsICd1dGYtOCcpKTtcbiAgICBtZXNzYWdlcyA9IHBhcnNlSTE4bk1lc3NhZ2VzKGNvbnRlbnQpO1xuICB9IGVsc2Uge1xuICAgIG1lc3NhZ2VzID0gcGFyc2VJMThuTWVzc2FnZXMoe30pO1xuICB9XG5cbiAgY29uc3Qgb3ZlcnJpZGVzID0gbWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PiB7XG4gICAgcmV0dXJuIGAgICAgLyoqXG4gICAgICogJHttZXNzYWdlLmRlc2NyaXB0aW9uID8/ICdObyBtZXNzYWdlIGRlc2NyaXB0aW9uLid9XG4gICAgICogXG4gICAgICogXCIke21lc3NhZ2UubWVzc2FnZX1cIlxuICAgICAqL1xuICAgIGdldE1lc3NhZ2UoXG4gICAgICBtZXNzYWdlTmFtZTogXCIke21lc3NhZ2UubmFtZX1cIixcbiAgICAgIHN1YnN0aXR1dGlvbnM/OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgIG9wdGlvbnM/OiBHZXRNZXNzYWdlT3B0aW9ucyxcbiAgICApOiBzdHJpbmc7YDtcbiAgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZUlmRGlmZmVyZW50KFxuICAgIGZpbGVQYXRoLFxuICAgIHRlbXBsYXRlLnJlcGxhY2UoJ3t7IG92ZXJyaWRlcyB9fScsIG92ZXJyaWRlcy5qb2luKCdcXG4nKSksXG4gICk7XG5cbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUdsb2JhbHNEZWNsYXJhdGlvbkZpbGUoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoY29uZmlnLnR5cGVzRGlyLCAnZ2xvYmFscy5kLnRzJyk7XG4gIGNvbnN0IGdsb2JhbHMgPSBbLi4uZ2V0R2xvYmFscyhjb25maWcpLCAuLi5nZXRFbnRyeXBvaW50R2xvYmFscyhjb25maWcsICcnKV07XG4gIGF3YWl0IHdyaXRlRmlsZUlmRGlmZmVyZW50KFxuICAgIGZpbGVQYXRoLFxuICAgIFtcbiAgICAgICcvLyBHZW5lcmF0ZWQgYnkgd3h0JyxcbiAgICAgICdleHBvcnQge30nLFxuICAgICAgJ2RlY2xhcmUgZ2xvYmFsIHsnLFxuICAgICAgLi4uZ2xvYmFscy5tYXAoKGdsb2JhbCkgPT4gYCAgY29uc3QgJHtnbG9iYWwubmFtZX06ICR7Z2xvYmFsLnR5cGV9O2ApLFxuICAgICAgJ30nLFxuICAgIF0uam9pbignXFxuJykgKyAnXFxuJyxcbiAgKTtcbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZU1haW5EZWNsYXJhdGlvbkZpbGUoXG4gIHJlZmVyZW5jZXM6IHN0cmluZ1tdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGlyID0gY29uZmlnLnd4dERpcjtcbiAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGRpciwgJ3d4dC5kLnRzJyk7XG4gIGF3YWl0IHdyaXRlRmlsZUlmRGlmZmVyZW50KFxuICAgIGZpbGVQYXRoLFxuICAgIFtcbiAgICAgICcvLyBHZW5lcmF0ZWQgYnkgd3h0JyxcbiAgICAgIGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cInZpdGUvY2xpZW50XCIgLz5gLFxuICAgICAgLi4ucmVmZXJlbmNlcy5tYXAoXG4gICAgICAgIChyZWYpID0+XG4gICAgICAgICAgYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi8ke25vcm1hbGl6ZVBhdGgocmVsYXRpdmUoZGlyLCByZWYpKX1cIiAvPmAsXG4gICAgICApLFxuICAgIF0uam9pbignXFxuJykgKyAnXFxuJyxcbiAgKTtcbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVRzQ29uZmlnRmlsZShcbiAgbWFpblJlZmVyZW5jZTogc3RyaW5nLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKSB7XG4gIGNvbnN0IGRpciA9IGNvbmZpZy53eHREaXI7XG4gIGNvbnN0IHJvb3RQYXRoID0gbm9ybWFsaXplUGF0aChyZWxhdGl2ZShkaXIsIGNvbmZpZy5yb290KSk7XG4gIGNvbnN0IHNyY1BhdGggPSBub3JtYWxpemVQYXRoKHJlbGF0aXZlKGRpciwgY29uZmlnLnNyY0RpcikpO1xuICBhd2FpdCB3cml0ZUZpbGVJZkRpZmZlcmVudChcbiAgICByZXNvbHZlKGRpciwgJ3RzY29uZmlnLmpzb24nKSxcbiAgICBge1xuICBcImNvbXBpbGVyT3B0aW9uc1wiOiB7XG4gICAgXCJ0YXJnZXRcIjogXCJFU05leHRcIixcbiAgICBcIm1vZHVsZVwiOiBcIkVTTmV4dFwiLFxuICAgIFwibW9kdWxlUmVzb2x1dGlvblwiOiBcIkJ1bmRsZXJcIixcbiAgICBcIm5vRW1pdFwiOiB0cnVlLFxuICAgIFwiZXNNb2R1bGVJbnRlcm9wXCI6IHRydWUsXG4gICAgXCJmb3JjZUNvbnNpc3RlbnRDYXNpbmdJbkZpbGVOYW1lc1wiOiB0cnVlLFxuICAgIFwicmVzb2x2ZUpzb25Nb2R1bGVcIjogdHJ1ZSxcbiAgICBcInN0cmljdFwiOiB0cnVlLFxuICAgIFwibGliXCI6IFtcIkRPTVwiLCBcIldlYldvcmtlclwiXSxcbiAgICBcInNraXBMaWJDaGVja1wiOiB0cnVlLFxuICAgIFwicGF0aHNcIjoge1xuICAgICAgXCJAXCI6IFtcIiR7c3JjUGF0aH1cIl0sXG4gICAgICBcIkAvKlwiOiBbXCIke3NyY1BhdGh9LypcIl0sXG4gICAgICBcIn5cIjogW1wiJHtzcmNQYXRofVwiXSxcbiAgICAgIFwifi8qXCI6IFtcIiR7c3JjUGF0aH0vKlwiXSxcbiAgICAgIFwiQEBcIjogW1wiJHtyb290UGF0aH1cIl0sXG4gICAgICBcIkBALypcIjogW1wiJHtyb290UGF0aH0vKlwiXSxcbiAgICAgIFwifn5cIjogW1wiJHtyb290UGF0aH1cIl0sXG4gICAgICBcIn5+LypcIjogW1wiJHtyb290UGF0aH0vKlwiXVxuICAgIH1cbiAgfSxcbiAgXCJpbmNsdWRlXCI6IFtcbiAgICBcIiR7bm9ybWFsaXplUGF0aChyZWxhdGl2ZShkaXIsIGNvbmZpZy5yb290KSl9LyoqLypcIixcbiAgICBcIi4vJHtub3JtYWxpemVQYXRoKHJlbGF0aXZlKGRpciwgbWFpblJlZmVyZW5jZSkpfVwiXG4gIF0sXG4gIFwiZXhjbHVkZVwiOiBbXCIke25vcm1hbGl6ZVBhdGgocmVsYXRpdmUoZGlyLCBjb25maWcub3V0QmFzZURpcikpfVwiXVxufWAsXG4gICk7XG59XG4iLCAiZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG5jb25zdCBwcmVkZWZpbmVkTWVzc2FnZXMgPSB7XG4gICdAQGV4dGVuc2lvbl9pZCc6IHtcbiAgICBtZXNzYWdlOiAnPGJyb3dzZXIucnVudGltZS5pZD4nLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJUaGUgZXh0ZW5zaW9uIG9yIGFwcCBJRDsgeW91IG1pZ2h0IHVzZSB0aGlzIHN0cmluZyB0byBjb25zdHJ1Y3QgVVJMcyBmb3IgcmVzb3VyY2VzIGluc2lkZSB0aGUgZXh0ZW5zaW9uLiBFdmVuIHVubG9jYWxpemVkIGV4dGVuc2lvbnMgY2FuIHVzZSB0aGlzIG1lc3NhZ2UuXFxuTm90ZTogWW91IGNhbid0IHVzZSB0aGlzIG1lc3NhZ2UgaW4gYSBtYW5pZmVzdCBmaWxlLlwiLFxuICB9LFxuICAnQEB1aV9sb2NhbGUnOiB7XG4gICAgbWVzc2FnZTogJzxicm93c2VyLmkxOG4uZ2V0VWlMb2NhbGUoKT4nLFxuICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgfSxcbiAgJ0BAYmlkaV9kaXInOiB7XG4gICAgbWVzc2FnZTogJzxsdHJ8cnRsPicsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnVGhlIHRleHQgZGlyZWN0aW9uIGZvciB0aGUgY3VycmVudCBsb2NhbGUsIGVpdGhlciBcImx0clwiIGZvciBsZWZ0LXRvLXJpZ2h0IGxhbmd1YWdlcyBzdWNoIGFzIEVuZ2xpc2ggb3IgXCJydGxcIiBmb3IgcmlnaHQtdG8tbGVmdCBsYW5ndWFnZXMgc3VjaCBhcyBKYXBhbmVzZS4nLFxuICB9LFxuICAnQEBiaWRpX3JldmVyc2VkX2Rpcic6IHtcbiAgICBtZXNzYWdlOiAnPHJ0bHxsdHI+JyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdJZiB0aGUgQEBiaWRpX2RpciBpcyBcImx0clwiLCB0aGVuIHRoaXMgaXMgXCJydGxcIjsgb3RoZXJ3aXNlLCBpdFxcJ3MgXCJsdHJcIi4nLFxuICB9LFxuICAnQEBiaWRpX3N0YXJ0X2VkZ2UnOiB7XG4gICAgbWVzc2FnZTogJzxsZWZ0fHJpZ2h0PicsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnSWYgdGhlIEBAYmlkaV9kaXIgaXMgXCJsdHJcIiwgdGhlbiB0aGlzIGlzIFwibGVmdFwiOyBvdGhlcndpc2UsIGl0XFwncyBcInJpZ2h0XCIuJyxcbiAgfSxcbiAgJ0BAYmlkaV9lbmRfZWRnZSc6IHtcbiAgICBtZXNzYWdlOiAnPHJpZ2h0fGxlZnQ+JyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdJZiB0aGUgQEBiaWRpX2RpciBpcyBcImx0clwiLCB0aGVuIHRoaXMgaXMgXCJyaWdodFwiOyBvdGhlcndpc2UsIGl0XFwncyBcImxlZnRcIi4nLFxuICB9LFxufTtcblxuLyoqXG4gKiBHZXQgYSBsaXN0IG9mIGFsbCBtZXNzYWdlcyBhbmQgdGhlaXIgbWV0YWRhdGEgZnJvbSBKU09OIGZpbGUgY29udGVudHMuXG4gKlxuICogQHBhcmFtIG1lc3NhZ2VzSnNvbiBUaGUgY29udGVudHMgb2YgYSBgX2xvY2FsZXMvZW4vbWVzc2FnZXMuanNvbmAgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSTE4bk1lc3NhZ2VzKG1lc3NhZ2VzSnNvbjogb2JqZWN0KTogTWVzc2FnZVtdIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHtcbiAgICAuLi5wcmVkZWZpbmVkTWVzc2FnZXMsXG4gICAgLi4ubWVzc2FnZXNKc29uLFxuICB9KS5tYXA8TWVzc2FnZT4oKFtuYW1lLCBkZXRhaWxzXSkgPT4gKHtcbiAgICBuYW1lLFxuICAgIC4uLmRldGFpbHMsXG4gIH0pKTtcbn1cbiIsICJpbXBvcnQgeyBFbnRyeXBvaW50IH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgTWFuaWZlc3QgfSBmcm9tICd3ZWJleHRlbnNpb24tcG9seWZpbGwnO1xuaW1wb3J0IHtcbiAgQmFja2dyb3VuZEVudHJ5cG9pbnQsXG4gIEJ1aWxkT3V0cHV0LFxuICBDb250ZW50U2NyaXB0RW50cnlwb2ludCxcbiAgSW50ZXJuYWxDb25maWcsXG4gIE9wdGlvbnNFbnRyeXBvaW50LFxuICBQb3B1cEVudHJ5cG9pbnQsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aCB9IGZyb20gJy4vZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgQ29udGVudFNlY3VyaXR5UG9saWN5IH0gZnJvbSAnLi9Db250ZW50U2VjdXJpdHlQb2xpY3knO1xuaW1wb3J0IHtcbiAgaGFzaENvbnRlbnRTY3JpcHRPcHRpb25zLFxuICBtYXBXeHRPcHRpb25zVG9Db250ZW50U2NyaXB0LFxufSBmcm9tICcuL2NvbnRlbnQtc2NyaXB0cyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlSnNvbiB9IGZyb20gJy4vcGFja2FnZSc7XG5pbXBvcnQgeyBub3JtYWxpemVQYXRoIH0gZnJvbSAnLi9wYXRocyc7XG5pbXBvcnQgeyB3cml0ZUZpbGVJZkRpZmZlcmVudCB9IGZyb20gJy4vZnMnO1xuaW1wb3J0IHsgcHJvZHVjZSB9IGZyb20gJ2ltbWVyJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5cbi8qKlxuICogV3JpdGVzIHRoZSBtYW5pZmVzdCB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeSBhbmQgdGhlIGJ1aWxkIG91dHB1dC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlTWFuaWZlc3QoXG4gIG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCxcbiAgb3V0cHV0OiBCdWlsZE91dHB1dCxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzdHIgPVxuICAgIGNvbmZpZy5tb2RlID09PSAncHJvZHVjdGlvbidcbiAgICAgID8gSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QpXG4gICAgICA6IEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKTtcblxuICBhd2FpdCBmcy5lbnN1cmVEaXIoY29uZmlnLm91dERpcik7XG4gIGF3YWl0IHdyaXRlRmlsZUlmRGlmZmVyZW50KHJlc29sdmUoY29uZmlnLm91dERpciwgJ21hbmlmZXN0Lmpzb24nKSwgc3RyKTtcblxuICBvdXRwdXQucHVibGljQXNzZXRzLnVuc2hpZnQoe1xuICAgIHR5cGU6ICdhc3NldCcsXG4gICAgZmlsZU5hbWU6ICdtYW5pZmVzdC5qc29uJyxcbiAgICBuYW1lOiAnbWFuaWZlc3QnLFxuICAgIG5lZWRzQ29kZVJlZmVyZW5jZTogZmFsc2UsXG4gICAgc291cmNlOiBzdHIsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgbWFuaWZlc3QgYmFzZWQgb24gdGhlIGNvbmZpZyBhbmQgZW50cnlwb2ludHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU1haW5mZXN0KFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBidWlsZE91dHB1dDogT21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0PiB7XG4gIGNvbnN0IHBrZyA9IGF3YWl0IGdldFBhY2thZ2VKc29uKGNvbmZpZyk7XG5cbiAgY29uc3QgYmFzZU1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCA9IHtcbiAgICBtYW5pZmVzdF92ZXJzaW9uOiBjb25maWcubWFuaWZlc3RWZXJzaW9uLFxuICAgIG5hbWU6IHBrZz8ubmFtZSxcbiAgICBkZXNjcmlwdGlvbjogcGtnPy5kZXNjcmlwdGlvbixcbiAgICB2ZXJzaW9uOiBwa2c/LnZlcnNpb24gJiYgc2ltcGxpZnlWZXJzaW9uKHBrZy52ZXJzaW9uKSxcbiAgICAvLyBPbmx5IGFkZCB0aGUgdmVyc2lvbiBuYW1lIHRvIGNocm9taXVtIGFuZCBpZiB0aGUgdXNlciBoYXNuJ3Qgc3BlY2lmaWVkIGEgY3VzdG9tIHZlcnNpb24uXG4gICAgdmVyc2lvbl9uYW1lOlxuICAgICAgY29uZmlnLmJyb3dzZXIgIT09ICdmaXJlZm94JyAmJiAhY29uZmlnLm1hbmlmZXN0LnZlcnNpb25cbiAgICAgICAgPyBwa2c/LnZlcnNpb25cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgc2hvcnRfbmFtZTogcGtnPy5zaG9ydE5hbWUsXG4gICAgaWNvbnM6IGRpc2NvdmVySWNvbnMoYnVpbGRPdXRwdXQpLFxuICB9O1xuICBjb25zdCB1c2VyTWFuaWZlc3QgPSBjb25maWcubWFuaWZlc3Q7XG5cbiAgY29uc3QgbWFuaWZlc3QgPSB2aXRlLm1lcmdlQ29uZmlnKFxuICAgIGJhc2VNYW5pZmVzdCxcbiAgICB1c2VyTWFuaWZlc3QsXG4gICkgYXMgTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3Q7XG5cbiAgYWRkRW50cnlwb2ludHMobWFuaWZlc3QsIGVudHJ5cG9pbnRzLCBidWlsZE91dHB1dCwgY29uZmlnKTtcblxuICBpZiAoY29uZmlnLmNvbW1hbmQgPT09ICdzZXJ2ZScpIGFkZERldk1vZGVDc3AobWFuaWZlc3QsIGNvbmZpZyk7XG4gIGlmIChjb25maWcuY29tbWFuZCA9PT0gJ3NlcnZlJykgYWRkRGV2TW9kZVBlcm1pc3Npb25zKG1hbmlmZXN0LCBjb25maWcpO1xuXG4gIGNvbnN0IGZpbmFsTWFuaWZlc3QgPSBwcm9kdWNlKG1hbmlmZXN0LCBjb25maWcudHJhbnNmb3JtTWFuaWZlc3QpO1xuXG4gIGlmIChmaW5hbE1hbmlmZXN0Lm5hbWUgPT0gbnVsbClcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIFwiTWFuaWZlc3QgJ25hbWUnIGlzIG1pc3NpbmcuIEVpdGhlcjpcXG4xLiBTZXQgdGhlIG5hbWUgaW4geW91ciA8cm9vdERpcj4vcGFja2FnZS5qc29uXFxuMi4gU2V0IGEgbmFtZSB2aWEgdGhlIG1hbmlmZXN0IG9wdGlvbiBpbiB5b3VyIHd4dC5jb25maWcudHNcIixcbiAgICApO1xuICBpZiAoZmluYWxNYW5pZmVzdC52ZXJzaW9uID09IG51bGwpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIFwiTWFuaWZlc3QgJ3ZlcnNpb24nIGlzIG1pc3NpbmcuIEVpdGhlcjpcXG4xLiBBZGQgYSB2ZXJzaW9uIGluIHlvdXIgPHJvb3REaXI+L3BhY2thZ2UuanNvblxcbjIuIFBhc3MgdGhlIHZlcnNpb24gdmlhIHRoZSBtYW5pZmVzdCBvcHRpb24gaW4geW91ciB3eHQuY29uZmlnLnRzXCIsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBmaW5hbE1hbmlmZXN0O1xufVxuXG4vKipcbiAqIFJlbW92ZXMgc3VmZml4ZXMgZnJvbSB0aGUgdmVyc2lvbiwgbGlrZSBYLlkuWi1hbHBoYTEgKHdoaWNoIGJyb3NlcnMgZG9uJ3QgYWxsb3cpLCBzbyBpdCdzIGFcbiAqIHNpbXBsZSB2ZXJzaW9uIG51bWJlciwgbGlrZSBYIG9yIFguWSBvciBYLlkuWiwgd2hpY2ggYnJvd3NlcnMgYWxsb3cuXG4gKi9cbmZ1bmN0aW9uIHNpbXBsaWZ5VmVyc2lvbih2ZXJzaW9uTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gUmVnZXggYWRhcHRlZCBmcm9tIGhlcmU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvTW96aWxsYS9BZGQtb25zL1dlYkV4dGVuc2lvbnMvbWFuaWZlc3QuanNvbi92ZXJzaW9uI3ZlcnNpb25fZm9ybWF0XG4gIGNvbnN0IHZlcnNpb24gPSAvXigoMHxbMS05XVswLTldezAsOH0pKFsuXSgwfFsxLTldWzAtOV17MCw4fSkpezAsM30pLiokLy5leGVjKFxuICAgIHZlcnNpb25OYW1lLFxuICApPy5bMV07XG5cbiAgaWYgKHZlcnNpb24gPT0gbnVsbClcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDYW5ub3Qgc2ltcGxpZnkgcGFja2FnZS5qc29uIHZlcnNpb24gXCIke3ZlcnNpb25OYW1lfVwiIHRvIGEgdmFsaWQgZXh0ZW5zaW9uIHZlcnNpb24sIFwiWC5ZLlpcImAsXG4gICAgKTtcblxuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuZnVuY3Rpb24gYWRkRW50cnlwb2ludHMoXG4gIG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCxcbiAgZW50cnlwb2ludHM6IEVudHJ5cG9pbnRbXSxcbiAgYnVpbGRPdXRwdXQ6IE9taXQ8QnVpbGRPdXRwdXQsICdtYW5pZmVzdCc+LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogdm9pZCB7XG4gIGNvbnN0IGVudHJpZXNCeVR5cGUgPSBlbnRyeXBvaW50cy5yZWR1Y2U8XG4gICAgUGFydGlhbDxSZWNvcmQ8RW50cnlwb2ludFsndHlwZSddLCBFbnRyeXBvaW50W10+PlxuICA+KChtYXAsIGVudHJ5cG9pbnQpID0+IHtcbiAgICBtYXBbZW50cnlwb2ludC50eXBlXSA/Pz0gW107XG4gICAgbWFwW2VudHJ5cG9pbnQudHlwZV0/LnB1c2goZW50cnlwb2ludCk7XG4gICAgcmV0dXJuIG1hcDtcbiAgfSwge30pO1xuXG4gIGNvbnN0IGJhY2tncm91bmQgPSBlbnRyaWVzQnlUeXBlWydiYWNrZ3JvdW5kJ10/LlswXSBhc1xuICAgIHwgQmFja2dyb3VuZEVudHJ5cG9pbnRcbiAgICB8IHVuZGVmaW5lZDtcbiAgY29uc3QgYm9va21hcmtzID0gZW50cmllc0J5VHlwZVsnYm9va21hcmtzJ10/LlswXTtcbiAgY29uc3QgY29udGVudFNjcmlwdHMgPSBlbnRyaWVzQnlUeXBlWydjb250ZW50LXNjcmlwdCddIGFzXG4gICAgfCBDb250ZW50U2NyaXB0RW50cnlwb2ludFtdXG4gICAgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGRldnRvb2xzID0gZW50cmllc0J5VHlwZVsnZGV2dG9vbHMnXT8uWzBdO1xuICBjb25zdCBoaXN0b3J5ID0gZW50cmllc0J5VHlwZVsnaGlzdG9yeSddPy5bMF07XG4gIGNvbnN0IG5ld3RhYiA9IGVudHJpZXNCeVR5cGVbJ25ld3RhYiddPy5bMF07XG4gIGNvbnN0IG9wdGlvbnMgPSBlbnRyaWVzQnlUeXBlWydvcHRpb25zJ10/LlswXSBhc1xuICAgIHwgT3B0aW9uc0VudHJ5cG9pbnRcbiAgICB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcG9wdXAgPSBlbnRyaWVzQnlUeXBlWydwb3B1cCddPy5bMF0gYXMgUG9wdXBFbnRyeXBvaW50IHwgdW5kZWZpbmVkO1xuICBjb25zdCBzYW5kYm94ZXMgPSBlbnRyaWVzQnlUeXBlWydzYW5kYm94J107XG4gIGNvbnN0IHNpZGVwYW5lbHMgPSBlbnRyaWVzQnlUeXBlWydzaWRlcGFuZWwnXTtcblxuICBpZiAoYmFja2dyb3VuZCkge1xuICAgIGNvbnN0IHNjcmlwdCA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKGJhY2tncm91bmQsIGNvbmZpZy5vdXREaXIsICcuanMnKTtcbiAgICBpZiAobWFuaWZlc3QubWFuaWZlc3RfdmVyc2lvbiA9PT0gMykge1xuICAgICAgbWFuaWZlc3QuYmFja2dyb3VuZCA9IHtcbiAgICAgICAgdHlwZTogYmFja2dyb3VuZC5vcHRpb25zLnR5cGUsXG4gICAgICAgIHNlcnZpY2Vfd29ya2VyOiBzY3JpcHQsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBtYW5pZmVzdC5iYWNrZ3JvdW5kID0ge1xuICAgICAgICBwZXJzaXN0ZW50OiBiYWNrZ3JvdW5kLm9wdGlvbnMucGVyc2lzdGVudCxcbiAgICAgICAgc2NyaXB0czogW3NjcmlwdF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChib29rbWFya3MpIHtcbiAgICBpZiAoY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94Jykge1xuICAgICAgY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgICAnQm9va21hcmtzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IEZpcmVmb3guIGNocm9tZV91cmxfb3ZlcnJpZGVzLmJvb2ttYXJrcyB3YXMgbm90IGFkZGVkIHRvIHRoZSBtYW5pZmVzdCcsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcyA/Pz0ge307XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBib29rbWFya3MgaXMgdW50eXBlZCBpbiB3ZWJleHRlbnNpb24tcG9seWZpbGwsIGJ1dCBzdXBwb3J0ZWQgYnkgY2hyb21lXG4gICAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcy5ib29rbWFya3MgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgICAgYm9va21hcmtzLFxuICAgICAgICBjb25maWcub3V0RGlyLFxuICAgICAgICAnLmh0bWwnLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaGlzdG9yeSkge1xuICAgIGlmIChjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICBjb25maWcubG9nZ2VyLndhcm4oXG4gICAgICAgICdCb29rbWFya3MgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgRmlyZWZveC4gY2hyb21lX3VybF9vdmVycmlkZXMuaGlzdG9yeSB3YXMgbm90IGFkZGVkIHRvIHRoZSBtYW5pZmVzdCcsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcyA/Pz0ge307XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBoaXN0b3J5IGlzIHVudHlwZWQgaW4gd2ViZXh0ZW5zaW9uLXBvbHlmaWxsLCBidXQgc3VwcG9ydGVkIGJ5IGNocm9tZVxuICAgICAgbWFuaWZlc3QuY2hyb21lX3VybF9vdmVycmlkZXMuaGlzdG9yeSA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgICBoaXN0b3J5LFxuICAgICAgICBjb25maWcub3V0RGlyLFxuICAgICAgICAnLmh0bWwnLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAobmV3dGFiKSB7XG4gICAgbWFuaWZlc3QuY2hyb21lX3VybF9vdmVycmlkZXMgPz89IHt9O1xuICAgIG1hbmlmZXN0LmNocm9tZV91cmxfb3ZlcnJpZGVzLm5ld3RhYiA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgbmV3dGFiLFxuICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICcuaHRtbCcsXG4gICAgKTtcbiAgfVxuXG4gIGlmIChwb3B1cCkge1xuICAgIGNvbnN0IGRlZmF1bHRfcG9wdXAgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgIHBvcHVwLFxuICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICcuaHRtbCcsXG4gICAgKTtcbiAgICBjb25zdCBvcHRpb25zOiBNYW5pZmVzdC5BY3Rpb25NYW5pZmVzdCA9IHtcbiAgICAgIGRlZmF1bHRfaWNvbjogcG9wdXAub3B0aW9ucy5kZWZhdWx0SWNvbixcbiAgICAgIGRlZmF1bHRfdGl0bGU6IHBvcHVwLm9wdGlvbnMuZGVmYXVsdFRpdGxlLFxuICAgIH07XG4gICAgaWYgKG1hbmlmZXN0Lm1hbmlmZXN0X3ZlcnNpb24gPT09IDMpIHtcbiAgICAgIG1hbmlmZXN0LmFjdGlvbiA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgZGVmYXVsdF9wb3B1cCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hbmlmZXN0W3BvcHVwLm9wdGlvbnMubXYyS2V5ID8/ICdicm93c2VyX2FjdGlvbiddID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBkZWZhdWx0X3BvcHVwLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAoZGV2dG9vbHMpIHtcbiAgICBtYW5pZmVzdC5kZXZ0b29sc19wYWdlID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICBkZXZ0b29scyxcbiAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAnLmh0bWwnLFxuICAgICk7XG4gIH1cblxuICBpZiAob3B0aW9ucykge1xuICAgIGNvbnN0IHBhZ2UgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChvcHRpb25zLCBjb25maWcub3V0RGlyLCAnLmh0bWwnKTtcbiAgICBtYW5pZmVzdC5vcHRpb25zX3VpID0ge1xuICAgICAgb3Blbl9pbl90YWI6IG9wdGlvbnMub3B0aW9ucy5vcGVuSW5UYWIsXG4gICAgICBicm93c2VyX3N0eWxlOlxuICAgICAgICBjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnID8gb3B0aW9ucy5vcHRpb25zLmJyb3dzZXJTdHlsZSA6IHVuZGVmaW5lZCxcbiAgICAgIGNocm9tZV9zdHlsZTpcbiAgICAgICAgY29uZmlnLmJyb3dzZXIgIT09ICdmaXJlZm94JyA/IG9wdGlvbnMub3B0aW9ucy5jaHJvbWVTdHlsZSA6IHVuZGVmaW5lZCxcbiAgICAgIHBhZ2UsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChzYW5kYm94ZXM/Lmxlbmd0aCkge1xuICAgIGlmIChjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICBjb25maWcubG9nZ2VyLndhcm4oXG4gICAgICAgICdTYW5kYm94ZWQgcGFnZXMgbm90IHN1cHBvcnRlZCBieSBGaXJlZm94LiBzYW5kYm94LnBhZ2VzIHdhcyBub3QgYWRkZWQgdG8gdGhlIG1hbmlmZXN0JyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHNhbmRib3ggbm90IHR5cGVkXG4gICAgICBtYW5pZmVzdC5zYW5kYm94ID0ge1xuICAgICAgICBwYWdlczogc2FuZGJveGVzLm1hcCgoZW50cnkpID0+XG4gICAgICAgICAgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoZW50cnksIGNvbmZpZy5vdXREaXIsICcuaHRtbCcpLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2lkZXBhbmVscz8ubGVuZ3RoKSB7XG4gICAgY29uc3QgZGVmYXVsdFNpZGVwYW5lbCA9XG4gICAgICBzaWRlcGFuZWxzLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS5uYW1lID09PSAnc2lkZXBhbmVsJykgPz8gc2lkZXBhbmVsc1swXTtcbiAgICBjb25zdCBwYWdlID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICBkZWZhdWx0U2lkZXBhbmVsLFxuICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICcuaHRtbCcsXG4gICAgKTtcblxuICAgIGlmIChjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICBtYW5pZmVzdC5zaWRlYmFyX2FjdGlvbiA9IHtcbiAgICAgICAgLy8gVE9ETzogQWRkIG9wdGlvbnMgdG8gc2lkZSBwYW5lbFxuICAgICAgICAvLyAuLi5kZWZhdWx0U2lkZXBhbmVsLm9wdGlvbnMsXG4gICAgICAgIGRlZmF1bHRfcGFuZWw6IHBhZ2UsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLm1hbmlmZXN0VmVyc2lvbiA9PT0gMykge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogVW50eXBlZFxuICAgICAgbWFuaWZlc3Quc2lkZV9wYW5lbCA9IHtcbiAgICAgICAgZGVmYXVsdF9wYXRoOiBwYWdlLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgICAnU2lkZSBwYW5lbCBub3Qgc3VwcG9ydGVkIGJ5IENocm9taXVtIHVzaW5nIE1WMi4gc2lkZV9wYW5lbC5kZWZhdWx0X3BhdGggd2FzIG5vdCBhZGRlZCB0byB0aGUgbWFuaWZlc3QnLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29udGVudFNjcmlwdHM/Lmxlbmd0aCkge1xuICAgIGNvbnN0IGNzc01hcCA9IGdldENvbnRlbnRTY3JpcHRzQ3NzTWFwKGJ1aWxkT3V0cHV0LCBjb250ZW50U2NyaXB0cyk7XG5cbiAgICAvLyBEb24ndCBhZGQgY29udGVudCBzY3JpcHRzIHRvIHRoZSBtYW5pZmVzdCBpbiBkZXYgbW9kZSBmb3IgTVYzIC0gdGhleSdyZSBtYW5hZ2VkIGFuZCByZWxvYWRlZFxuICAgIC8vIGF0IHJ1bnRpbWVcbiAgICBpZiAoY29uZmlnLmNvbW1hbmQgPT09ICdzZXJ2ZScgJiYgY29uZmlnLm1hbmlmZXN0VmVyc2lvbiA9PT0gMykge1xuICAgICAgY29uc3QgaG9zdFBlcm1pc3Npb25zID0gbmV3IFNldDxzdHJpbmc+KG1hbmlmZXN0Lmhvc3RfcGVybWlzc2lvbnMgPz8gW10pO1xuICAgICAgY29udGVudFNjcmlwdHMuZm9yRWFjaCgoc2NyaXB0KSA9PiB7XG4gICAgICAgIHNjcmlwdC5vcHRpb25zLm1hdGNoZXMuZm9yRWFjaCgobWF0Y2hQYXR0ZXJuKSA9PiB7XG4gICAgICAgICAgaG9zdFBlcm1pc3Npb25zLmFkZChtYXRjaFBhdHRlcm4pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaG9zdFBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb24pID0+XG4gICAgICAgIGFkZEhvc3RQZXJtaXNzaW9uKG1hbmlmZXN0LCBwZXJtaXNzaW9uKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhhc2hUb0VudHJ5cG9pbnRzTWFwID0gY29udGVudFNjcmlwdHMucmVkdWNlKChtYXAsIHNjcmlwdCkgPT4ge1xuICAgICAgICBjb25zdCBoYXNoID0gaGFzaENvbnRlbnRTY3JpcHRPcHRpb25zKHNjcmlwdC5vcHRpb25zKTtcbiAgICAgICAgaWYgKG1hcC5oYXMoaGFzaCkpIG1hcC5nZXQoaGFzaCk/LnB1c2goc2NyaXB0KTtcbiAgICAgICAgZWxzZSBtYXAuc2V0KGhhc2gsIFtzY3JpcHRdKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH0sIG5ldyBNYXA8c3RyaW5nLCBDb250ZW50U2NyaXB0RW50cnlwb2ludFtdPigpKTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudFNjcmlwdHMgPSBBcnJheS5mcm9tKGhhc2hUb0VudHJ5cG9pbnRzTWFwLmVudHJpZXMoKSkubWFwKFxuICAgICAgICAoWywgc2NyaXB0c10pID0+ICh7XG4gICAgICAgICAgLi4ubWFwV3h0T3B0aW9uc1RvQ29udGVudFNjcmlwdChzY3JpcHRzWzBdLm9wdGlvbnMpLFxuICAgICAgICAgIC8vIFRPT0Q6IFNvcnRpbmcgY3NzIGFuZCBqcyBhcnJheXMgaGVyZSBzbyB3ZSBnZXQgY29uc2lzdGVudCB0ZXN0IHJlc3VsdHMuLi4gYnV0IHdlXG4gICAgICAgICAgLy8gc2hvdWxkbid0IGhhdmUgdG8uIFdoZXJlIGlzIHRoZSBpbmNvbnNpc3RlbmN5IGNvbWluZyBmcm9tP1xuICAgICAgICAgIGNzczogZ2V0Q29udGVudFNjcmlwdENzc0ZpbGVzKHNjcmlwdHMsIGNzc01hcCk/LnNvcnQoKSxcbiAgICAgICAgICBqczogc2NyaXB0c1xuICAgICAgICAgICAgLm1hcCgoZW50cnkpID0+XG4gICAgICAgICAgICAgIGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKGVudHJ5LCBjb25maWcub3V0RGlyLCAnLmpzJyksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc29ydCgpLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBpZiAobmV3Q29udGVudFNjcmlwdHMubGVuZ3RoID49IDApIHtcbiAgICAgICAgbWFuaWZlc3QuY29udGVudF9zY3JpcHRzID8/PSBbXTtcbiAgICAgICAgbWFuaWZlc3QuY29udGVudF9zY3JpcHRzLnB1c2goLi4ubmV3Q29udGVudFNjcmlwdHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnRTY3JpcHRDc3NSZXNvdXJjZXMgPSBnZXRDb250ZW50U2NyaXB0Q3NzV2ViQWNjZXNzaWJsZVJlc291cmNlcyhcbiAgICAgIGNvbmZpZyxcbiAgICAgIGNvbnRlbnRTY3JpcHRzLFxuICAgICAgY3NzTWFwLFxuICAgICk7XG4gICAgaWYgKGNvbnRlbnRTY3JpcHRDc3NSZXNvdXJjZXMubGVuZ3RoID4gMCkge1xuICAgICAgbWFuaWZlc3Qud2ViX2FjY2Vzc2libGVfcmVzb3VyY2VzID8/PSBbXTtcbiAgICAgIG1hbmlmZXN0LndlYl9hY2Nlc3NpYmxlX3Jlc291cmNlcy5wdXNoKC4uLmNvbnRlbnRTY3JpcHRDc3NSZXNvdXJjZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNjb3Zlckljb25zKFxuICBidWlsZE91dHB1dDogT21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4sXG4pOiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdFsnaWNvbnMnXSB7XG4gIGNvbnN0IGljb25zOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIC8vICNyZWdpb24gc25pcHBldFxuICBjb25zdCBpY29uUmVnZXggPSBbXG4gICAgL15pY29uLShbMC05XSspXFwuKHBuZ3xibXB8anBlZ3xqcGd8aWNvfGdpZikkLywgICAgICAgICAgICAgLy8gaWNvbi0xNi5wbmdcbiAgICAvXmljb24tKFswLTldKyl4WzAtOV0rXFwuKHBuZ3xibXB8anBlZ3xqcGd8aWNvfGdpZikkLywgICAgICAvLyBpY29uLTE2eDE2LnBuZ1xuICAgIC9eaWNvbkAoWzAtOV0rKXdcXC4ocG5nfGJtcHxqcGVnfGpwZ3xpY298Z2lmKSQvLCAgICAgICAgICAgIC8vIGljb25AMTZ3LnBuZ1xuICAgIC9eaWNvbkAoWzAtOV0rKWhcXC4ocG5nfGJtcHxqcGVnfGpwZ3xpY298Z2lmKSQvLCAgICAgICAgICAgIC8vIGljb25AMTZoLnBuZ1xuICAgIC9eaWNvbkAoWzAtOV0rKVxcLihwbmd8Ym1wfGpwZWd8anBnfGljb3xnaWYpJC8sICAgICAgICAgICAgIC8vIGljb25AMTYucG5nXG4gICAgL15pY29uW1xcL1xcXFxdKFswLTldKylcXC4ocG5nfGJtcHxqcGVnfGpwZ3xpY298Z2lmKSQvLCAgICAgICAgLy8gaWNvbi8xNi5wbmdcbiAgICAvXmljb25bXFwvXFxcXF0oWzAtOV0rKXhbMC05XStcXC4ocG5nfGJtcHxqcGVnfGpwZ3xpY298Z2lmKSQvLCAvLyBpY29uLzE2eDE2LnBuZ1xuICBdO1xuICAvLyAjZW5kcmVnaW9uIHNuaXBwZXRcblxuICBidWlsZE91dHB1dC5wdWJsaWNBc3NldHMuZm9yRWFjaCgoYXNzZXQpID0+IHtcbiAgICBsZXQgc2l6ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgcmVnZXggb2YgaWNvblJlZ2V4KSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGFzc2V0LmZpbGVOYW1lLm1hdGNoKHJlZ2V4KTtcbiAgICAgIGlmIChtYXRjaD8uWzFdICE9IG51bGwpIHtcbiAgICAgICAgc2l6ZSA9IG1hdGNoWzFdO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNpemUgPT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgaWNvbnMucHVzaChbc2l6ZSwgbm9ybWFsaXplUGF0aChhc3NldC5maWxlTmFtZSldKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGljb25zLmxlbmd0aCA+IDAgPyBPYmplY3QuZnJvbUVudHJpZXMoaWNvbnMpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhZGREZXZNb2RlQ3NwKFxuICBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiB2b2lkIHtcbiAgY29uc3QgcGVybWlzc2lvbiA9IGBodHRwOi8vJHtjb25maWcuc2VydmVyPy5ob3N0bmFtZSA/PyAnJ30vKmA7XG4gIGNvbnN0IGFsbG93ZWRDc3AgPSBjb25maWcuc2VydmVyPy5vcmlnaW4gPz8gJ2h0dHA6Ly9sb2NhbGhvc3Q6Kic7XG5cbiAgaWYgKG1hbmlmZXN0Lm1hbmlmZXN0X3ZlcnNpb24gPT09IDMpIHtcbiAgICBhZGRIb3N0UGVybWlzc2lvbihtYW5pZmVzdCwgcGVybWlzc2lvbik7XG4gIH0gZWxzZSB7XG4gICAgYWRkUGVybWlzc2lvbihtYW5pZmVzdCwgcGVybWlzc2lvbik7XG4gIH1cblxuICBjb25zdCBjc3AgPSBuZXcgQ29udGVudFNlY3VyaXR5UG9saWN5KFxuICAgIG1hbmlmZXN0Lm1hbmlmZXN0X3ZlcnNpb24gPT09IDNcbiAgICAgID8gLy8gQHRzLWV4cGVjdC1lcnJvcjogZXh0ZW5zaW9uX3BhZ2VzIGlzIG5vdCB0eXBlZFxuICAgICAgICBtYW5pZmVzdC5jb250ZW50X3NlY3VyaXR5X3BvbGljeT8uZXh0ZW5zaW9uX3BhZ2VzID8/XG4gICAgICAgIFwic2NyaXB0LXNyYyAnc2VsZicgJ3dhc20tdW5zYWZlLWV2YWwnOyBvYmplY3Qtc3JjICdzZWxmJztcIiAvLyBkZWZhdWx0IENTUCBmb3IgTVYzXG4gICAgICA6IG1hbmlmZXN0LmNvbnRlbnRfc2VjdXJpdHlfcG9saWN5ID8/XG4gICAgICAgIFwic2NyaXB0LXNyYyAnc2VsZic7IG9iamVjdC1zcmMgJ3NlbGYnO1wiLCAvLyBkZWZhdWx0IENTUCBmb3IgTVYyXG4gICk7XG5cbiAgaWYgKGNvbmZpZy5zZXJ2ZXIpIGNzcC5hZGQoJ3NjcmlwdC1zcmMnLCBhbGxvd2VkQ3NwKTtcblxuICBpZiAobWFuaWZlc3QubWFuaWZlc3RfdmVyc2lvbiA9PT0gMykge1xuICAgIG1hbmlmZXN0LmNvbnRlbnRfc2VjdXJpdHlfcG9saWN5ID8/PSB7fTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBleHRlbnNpb25fcGFnZXMgaXMgbm90IHR5cGVkXG4gICAgbWFuaWZlc3QuY29udGVudF9zZWN1cml0eV9wb2xpY3kuZXh0ZW5zaW9uX3BhZ2VzID0gY3NwLnRvU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgbWFuaWZlc3QuY29udGVudF9zZWN1cml0eV9wb2xpY3kgPSBjc3AudG9TdHJpbmcoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGREZXZNb2RlUGVybWlzc2lvbnMoXG4gIG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbikge1xuICAvLyBGb3IgcmVsb2FkaW5nIHRoZSBwYWdlXG4gIGFkZFBlcm1pc3Npb24obWFuaWZlc3QsICd0YWJzJyk7XG5cbiAgLy8gRm9yIHJlZ2lzdGVyaW5nIGNvbnRlbnQgc2NyaXB0c1xuICBpZiAoY29uZmlnLm1hbmlmZXN0VmVyc2lvbiA9PT0gMykgYWRkUGVybWlzc2lvbihtYW5pZmVzdCwgJ3NjcmlwdGluZycpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGJ1bmRsZSBwYXRocyB0byBDU1MgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGEgbGlzdCBvZiBjb250ZW50IHNjcmlwdHMsIG9yIHVuZGVmaW5lZCBpZlxuICogdGhlcmUgaXMgbm8gYXNzb2NpYXRlZCBDU1MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250ZW50U2NyaXB0Q3NzRmlsZXMoXG4gIGNvbnRlbnRTY3JpcHRzOiBDb250ZW50U2NyaXB0RW50cnlwb2ludFtdLFxuICBjb250ZW50U2NyaXB0Q3NzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LFxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBjc3M6IHN0cmluZ1tdID0gW107XG5cbiAgY29udGVudFNjcmlwdHMuZm9yRWFjaCgoc2NyaXB0KSA9PiB7XG4gICAgaWYgKFxuICAgICAgc2NyaXB0Lm9wdGlvbnMuY3NzSW5qZWN0aW9uTW9kZSA9PT0gJ21hbnVhbCcgfHxcbiAgICAgIHNjcmlwdC5vcHRpb25zLmNzc0luamVjdGlvbk1vZGUgPT09ICd1aSdcbiAgICApXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCBjc3NGaWxlID0gY29udGVudFNjcmlwdENzc01hcFtzY3JpcHQubmFtZV07XG4gICAgaWYgKGNzc0ZpbGUgPT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgaWYgKGNzc0ZpbGUpIGNzcy5wdXNoKGNzc0ZpbGUpO1xuICB9KTtcblxuICBpZiAoY3NzLmxlbmd0aCA+IDApIHJldHVybiBjc3M7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29udGVudCBzY3JpcHRzIGNvbmZpZ3VyZWQgd2l0aCBgY3NzSW5qZWN0aW9uTW9kZTogXCJ1aVwiYCBuZWVkIHRvIGFkZCB0aGVpciBDU1MgZmlsZXMgdG8gd2ViXG4gKiBhY2Nlc3NpYmxlIHJlc291cmNlcyBzbyB0aGV5IGNhbiBiZSBmZXRjaGVkIGFzIHRleHQgYW5kIGFkZGVkIHRvIHNoYWRvdyByb290cyB0aGF0IHRoZSBVSSBpc1xuICogYWRkZWQgdG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250ZW50U2NyaXB0Q3NzV2ViQWNjZXNzaWJsZVJlc291cmNlcyhcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgY29udGVudFNjcmlwdHM6IENvbnRlbnRTY3JpcHRFbnRyeXBvaW50W10sXG4gIGNvbnRlbnRTY3JpcHRDc3NNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4pOiBhbnlbXSB7XG4gIGNvbnN0IHJlc291cmNlczogYW55W10gPSBbXTtcblxuICBjb250ZW50U2NyaXB0cy5mb3JFYWNoKChzY3JpcHQpID0+IHtcbiAgICBpZiAoc2NyaXB0Lm9wdGlvbnMuY3NzSW5qZWN0aW9uTW9kZSAhPT0gJ3VpJykgcmV0dXJuO1xuXG4gICAgY29uc3QgY3NzRmlsZSA9IGNvbnRlbnRTY3JpcHRDc3NNYXBbc2NyaXB0Lm5hbWVdO1xuICAgIGlmIChjc3NGaWxlID09IG51bGwpIHJldHVybjtcblxuICAgIGlmIChjb25maWcubWFuaWZlc3RWZXJzaW9uID09PSAyKSB7XG4gICAgICByZXNvdXJjZXMucHVzaChjc3NGaWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb3VyY2VzLnB1c2goe1xuICAgICAgICByZXNvdXJjZXM6IFtjc3NGaWxlXSxcbiAgICAgICAgbWF0Y2hlczogc2NyaXB0Lm9wdGlvbnMubWF0Y2hlcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc291cmNlcztcbn1cblxuLyoqXG4gKiBCYXNlZCBvbiB0aGUgYnVpbGQgb3V0cHV0LCByZXR1cm4gYSBSZWNvcmQgb2YgZWFjaCBjb250ZW50IHNjcmlwdCdzIG5hbWUgdG8gaXQgQ1NTIGZpbGUgaWYgdGhlXG4gKiBzY3JpcHQgaW5jbHVkZXMgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udGVudFNjcmlwdHNDc3NNYXAoXG4gIGJ1aWxkT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPixcbiAgc2NyaXB0czogQ29udGVudFNjcmlwdEVudHJ5cG9pbnRbXSxcbikge1xuICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gPSB7fTtcbiAgY29uc3QgYWxsQ2h1bmtzID0gYnVpbGRPdXRwdXQuc3RlcHMuZmxhdE1hcCgoc3RlcCkgPT4gc3RlcC5jaHVua3MpO1xuICBzY3JpcHRzLmZvckVhY2goKHNjcmlwdCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0ZWRDc3MgPSBhbGxDaHVua3MuZmluZChcbiAgICAgIChjaHVuaykgPT4gY2h1bmsuZmlsZU5hbWUgPT09IGBjb250ZW50LXNjcmlwdHMvJHtzY3JpcHQubmFtZX0uY3NzYCxcbiAgICApO1xuICAgIGlmIChyZWxhdGVkQ3NzICE9IG51bGwpIG1hcFtzY3JpcHQubmFtZV0gPSByZWxhdGVkQ3NzLmZpbGVOYW1lO1xuICB9KTtcbiAgcmV0dXJuIG1hcDtcbn1cblxuZnVuY3Rpb24gYWRkUGVybWlzc2lvbihcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0LFxuICBwZXJtaXNzaW9uOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgbWFuaWZlc3QucGVybWlzc2lvbnMgPz89IFtdO1xuICBpZiAobWFuaWZlc3QucGVybWlzc2lvbnMuaW5jbHVkZXMocGVybWlzc2lvbikpIHJldHVybjtcbiAgbWFuaWZlc3QucGVybWlzc2lvbnMucHVzaChwZXJtaXNzaW9uKTtcbn1cblxuZnVuY3Rpb24gYWRkSG9zdFBlcm1pc3Npb24oXG4gIG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCxcbiAgaG9zdFBlcm1pc3Npb246IHN0cmluZyxcbik6IHZvaWQge1xuICBtYW5pZmVzdC5ob3N0X3Blcm1pc3Npb25zID8/PSBbXTtcbiAgaWYgKG1hbmlmZXN0Lmhvc3RfcGVybWlzc2lvbnMuaW5jbHVkZXMoaG9zdFBlcm1pc3Npb24pKSByZXR1cm47XG4gIG1hbmlmZXN0Lmhvc3RfcGVybWlzc2lvbnMucHVzaChob3N0UGVybWlzc2lvbik7XG59XG4iLCAiLyoqXG4gKiBEaXJlY3RpdmUgbmFtZXMgdGhhdCBtYWtlIHVwIENTUHMuIFRoZXJlIGFyZSBtb3JlLCB0aGlzIGlzIGFsbCBJIG5lZWQgZm9yIHRoZSBwbHVnaW4uXG4gKi9cbmV4cG9ydCB0eXBlIENzcERpcmVjdGl2ZSA9ICdkZWZhdWx0LXNyYycgfCAnc2NyaXB0LXNyYycgfCAnb2JqZWN0LXNyYyc7XG5cbmV4cG9ydCBjbGFzcyBDb250ZW50U2VjdXJpdHlQb2xpY3kge1xuICBwcml2YXRlIHN0YXRpYyBESVJFQ1RJVkVfT1JERVI6IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IHVuZGVmaW5lZD4gPSB7XG4gICAgJ2RlZmF1bHQtc3JjJzogMCxcbiAgICAnc2NyaXB0LXNyYyc6IDEsXG4gICAgJ29iamVjdC1zcmMnOiAyLFxuICB9O1xuXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcblxuICBjb25zdHJ1Y3Rvcihjc3A/OiBzdHJpbmcpIHtcbiAgICBpZiAoY3NwKSB7XG4gICAgICBjb25zdCBzZWN0aW9ucyA9IGNzcC5zcGxpdCgnOycpLm1hcCgoc2VjdGlvbikgPT4gc2VjdGlvbi50cmltKCkpO1xuICAgICAgdGhpcy5kYXRhID0gc2VjdGlvbnMucmVkdWNlPFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPj4oKGRhdGEsIHNlY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3QgW2tleSwgLi4udmFsdWVzXSA9IHNlY3Rpb24uc3BsaXQoJyAnKS5tYXAoKGl0ZW0pID0+IGl0ZW0udHJpbSgpKTtcbiAgICAgICAgaWYgKGtleSkgZGF0YVtrZXldID0gdmFsdWVzO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0sIHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhID0ge307XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBhIHNldCBvZiB2YWx1ZXMgYXJlIGxpc3RlZCB1bmRlciBhIGRpcmVjdGl2ZS5cbiAgICovXG4gIGFkZChkaXJlY3RpdmU6IENzcERpcmVjdGl2ZSwgLi4ubmV3VmFsdWVzOiBzdHJpbmdbXSk6IENvbnRlbnRTZWN1cml0eVBvbGljeSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5kYXRhW2RpcmVjdGl2ZV0gPz8gW107XG4gICAgbmV3VmFsdWVzLmZvckVhY2goKG5ld1ZhbHVlKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlcy5pbmNsdWRlcyhuZXdWYWx1ZSkpIHZhbHVlcy5wdXNoKG5ld1ZhbHVlKTtcbiAgICB9KTtcbiAgICB0aGlzLmRhdGFbZGlyZWN0aXZlXSA9IHZhbHVlcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyZWN0aXZlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuZGF0YSkuc29ydCgoW2xdLCBbcl0pID0+IHtcbiAgICAgIGNvbnN0IGxvID0gQ29udGVudFNlY3VyaXR5UG9saWN5LkRJUkVDVElWRV9PUkRFUltsXSA/PyAyO1xuICAgICAgY29uc3Qgcm8gPSBDb250ZW50U2VjdXJpdHlQb2xpY3kuRElSRUNUSVZFX09SREVSW3JdID8/IDI7XG4gICAgICByZXR1cm4gbG8gLSBybztcbiAgICB9KTtcbiAgICByZXR1cm4gZGlyZWN0aXZlcy5tYXAoKGVudHJ5KSA9PiBlbnRyeS5mbGF0KCkuam9pbignICcpKS5qb2luKCc7ICcpICsgJzsnO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTWFuaWZlc3QgfSBmcm9tICd3ZWJleHRlbnNpb24tcG9seWZpbGwnO1xuaW1wb3J0IHsgQ29udGVudFNjcmlwdEVudHJ5cG9pbnQgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogUmV0dXJucyBhIHVuaXF1ZSBhbmQgY29uc2lzdGVudCBzdHJpbmcgaGFzaCBiYXNlZCBvbiBhIGNvbnRlbnQgc2NyaXB0cyBvcHRpb25zLlxuICpcbiAqIEl0IGlzIGFibGUgdG8gcmVjb2duaXplIGRlZmF1bHQgdmFsdWVzLFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaENvbnRlbnRTY3JpcHRPcHRpb25zKFxuICBvcHRpb25zOiBDb250ZW50U2NyaXB0RW50cnlwb2ludFsnb3B0aW9ucyddLFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgd2l0aERlZmF1bHRzOiBDb250ZW50U2NyaXB0RW50cnlwb2ludFsnb3B0aW9ucyddID0ge1xuICAgIGV4Y2x1ZGVHbG9iczogW10sXG4gICAgZXhjbHVkZU1hdGNoZXM6IFtdLFxuICAgIGluY2x1ZGVHbG9iczogW10sXG4gICAgbWF0Y2hBYm91dEJsYW5rOiBmYWxzZSxcbiAgICBtYXRjaE9yaWdpbkFzRmFsbGJhY2s6IGZhbHNlLFxuICAgIHJ1bkF0OiAnZG9jdW1lbnRfaWRsZScsXG4gICAgYWxsRnJhbWVzOiBmYWxzZSxcbiAgICB3b3JsZDogJ0lTT0xBVEVEJyxcbiAgICAvLyBUT0RPOiBzdHJpcCB1bmRlZmluZWQgZmllbGRzIGZyb20gb3B0aW9ucyBvYmplY3QgdG8gaW1wcm92ZSBjb250ZW50IHNjcmlwdCBncm91cGluZy5cbiAgICAuLi5vcHRpb25zLFxuICB9O1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMod2l0aERlZmF1bHRzKVxuICAgICAgLy8gU29ydCBhbnkgYXJyYXlzIHNvIHRoZWlyIHZhbHVlcyBhcmUgY29uc2lzdGVudFxuICAgICAgLm1hcDxbc3RyaW5nLCB1bmtub3duXT4oKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBba2V5LCB2YWx1ZS5zb3J0KCldO1xuICAgICAgICBlbHNlIHJldHVybiBba2V5LCB2YWx1ZV07XG4gICAgICB9KVxuICAgICAgLy8gU29ydCBhbGwgdGhlIGZpZWxkcyBhbHBoYWJldGljYWxseVxuICAgICAgLnNvcnQoKGwsIHIpID0+IGxbMF0ubG9jYWxlQ29tcGFyZShyWzBdKSksXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBXeHRPcHRpb25zVG9Db250ZW50U2NyaXB0KFxuICBvcHRpb25zOiBDb250ZW50U2NyaXB0RW50cnlwb2ludFsnb3B0aW9ucyddLFxuKTogT21pdDxNYW5pZmVzdC5Db250ZW50U2NyaXB0LCAnanMnIHwgJ2Nzcyc+IHtcbiAgcmV0dXJuIHtcbiAgICBtYXRjaGVzOiBvcHRpb25zLm1hdGNoZXMsXG4gICAgYWxsX2ZyYW1lczogb3B0aW9ucy5hbGxGcmFtZXMsXG4gICAgbWF0Y2hfYWJvdXRfYmxhbms6IG9wdGlvbnMubWF0Y2hBYm91dEJsYW5rLFxuICAgIGV4Y2x1ZGVfZ2xvYnM6IG9wdGlvbnMuZXhjbHVkZUdsb2JzLFxuICAgIGV4Y2x1ZGVfbWF0Y2hlczogb3B0aW9ucy5leGNsdWRlTWF0Y2hlcyxcbiAgICBpbmNsdWRlX2dsb2JzOiBvcHRpb25zLmluY2x1ZGVHbG9icyxcbiAgICBydW5fYXQ6IG9wdGlvbnMucnVuQXQsXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiB1bnR5cGVkIGNocm9tZSBvcHRpb25zXG4gICAgbWF0Y2hfb3JpZ2luX2FzX2ZhbGxiYWNrOiBvcHRpb25zLm1hdGNoT3JpZ2luQXNGYWxsYmFjayxcbiAgICB3b3JsZDogb3B0aW9ucy53b3JsZCxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcblxuLyoqXG4gKiBSZWFkIHRoZSBwcm9qZWN0J3MgcGFja2FnZS5qc29uLlxuICpcbiAqIFRPRE86IGxvb2sgaW4gcm9vdCBhbmQgdXAgZGlyZWN0b3JpZXMgdW50aWwgaXQncyBmb3VuZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUpzb24oXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPFBhcnRpYWw8UmVjb3JkPHN0cmluZywgYW55Pj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZmlsZSA9IHJlc29sdmUoY29uZmlnLnJvb3QsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMucmVhZEpzb24oZmlsZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoXG4gICAgICBgRmFpbGVkIHRvIHJlYWQgcGFja2FnZS5qc29uIGF0OiAke2ZpbGV9LiBSZXR1cm5pbmcgdW5kZWZpbmVkLmAsXG4gICAgKTtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBNYW5pZmVzdCB9IGZyb20gJ3dlYmV4dGVuc2lvbi1wb2x5ZmlsbCc7XG5pbXBvcnQgeyBCdWlsZE91dHB1dCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgYnVpbGRFbnRyeXBvaW50cyB9IGZyb20gJy4vYnVpbGQvYnVpbGRFbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBmaW5kRW50cnlwb2ludHMgfSBmcm9tICcuL2J1aWxkL2ZpbmRFbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVR5cGVzRGlyIH0gZnJvbSAnLi9idWlsZC9nZW5lcmF0ZVR5cGVzRGlyJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnLCBFbnRyeXBvaW50R3JvdXAgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdlbmVyYXRlTWFpbmZlc3QsIHdyaXRlTWFuaWZlc3QgfSBmcm9tICcuL3V0aWxzL21hbmlmZXN0JztcbmltcG9ydCBwYyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgZ3JvdXBFbnRyeXBvaW50cyB9IGZyb20gJy4vdXRpbHMvZ3JvdXBFbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiB9IGZyb20gJy4vdXRpbHMvZm9ybWF0RHVyYXRpb24nO1xuaW1wb3J0IHsgcHJpbnRCdWlsZFN1bW1hcnkgfSBmcm9tICcuL2xvZy9wcmludEJ1aWxkU3VtbWFyeSc7XG5pbXBvcnQgeyBleGVjYUNvbW1hbmQgfSBmcm9tICdleGVjYSc7XG5pbXBvcnQgZ2xvYiBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgdW5ub3JtYWxpemVQYXRoIH0gZnJvbSAnLi91dGlscy9wYXRocyc7XG5cbi8qKlxuICogQnVpbGRzIHRoZSBleHRlbnNpb24gYmFzZWQgb24gYW4gaW50ZXJuYWwgY29uZmlnLlxuICpcbiAqIFRoaXMgZnVuY3Rpb246XG4gKiAxLiBDbGVhbnMgdGhlIG91dHB1dCBkaXJlY3RvcnlcbiAqIDIuIEV4ZWN1dGVzIHRoZSByZWJ1aWxkIGZ1bmN0aW9uIHdpdGggYSBibGFuayBwcmV2aW91cyBvdXRwdXQgc28gZXZlcnl0aGluZyBpcyBidWlsdCAoc2VlXG4gKiAgICBgcmVidWlsZGAgZm9yIG1vcmUgZGV0YWlscylcbiAqIDMuIFByaW50cyB0aGUgc3VtbWFyeVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJbnRlcm5hbChcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8QnVpbGRPdXRwdXQ+IHtcbiAgY29uc3QgdmVyYiA9IGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnID8gJ1ByZS1yZW5kZXJpbmcnIDogJ0J1aWxkaW5nJztcbiAgY29uc3QgdGFyZ2V0ID0gYCR7Y29uZmlnLmJyb3dzZXJ9LW12JHtjb25maWcubWFuaWZlc3RWZXJzaW9ufWA7XG4gIGNvbmZpZy5sb2dnZXIuaW5mbyhcbiAgICBgJHt2ZXJifSAke3BjLmN5YW4odGFyZ2V0KX0gZm9yICR7cGMuY3lhbihjb25maWcubW9kZSl9IHdpdGggJHtwYy5ncmVlbihcbiAgICAgIGBWaXRlICR7dml0ZS52ZXJzaW9ufWAsXG4gICAgKX1gLFxuICApO1xuICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gIC8vIENsZWFudXBcbiAgYXdhaXQgZnMucm0oY29uZmlnLm91dERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5lbnN1cmVEaXIoY29uZmlnLm91dERpcik7XG5cbiAgY29uc3QgZW50cnlwb2ludHMgPSBhd2FpdCBmaW5kRW50cnlwb2ludHMoY29uZmlnKTtcbiAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnRGV0ZWN0ZWQgZW50cnlwb2ludHM6JywgZW50cnlwb2ludHMpO1xuICBjb25zdCBncm91cHMgPSBncm91cEVudHJ5cG9pbnRzKGVudHJ5cG9pbnRzKTtcbiAgY29uc3QgeyBvdXRwdXQgfSA9IGF3YWl0IHJlYnVpbGQoY29uZmlnLCBncm91cHMsIHVuZGVmaW5lZCk7XG5cbiAgLy8gUG9zdC1idWlsZFxuICBhd2FpdCBwcmludEJ1aWxkU3VtbWFyeShcbiAgICBjb25maWcubG9nZ2VyLnN1Y2Nlc3MsXG4gICAgYEJ1aWx0IGV4dGVuc2lvbiBpbiAke2Zvcm1hdER1cmF0aW9uKERhdGUubm93KCkgLSBzdGFydFRpbWUpfWAsXG4gICAgb3V0cHV0LFxuICAgIGNvbmZpZyxcbiAgKTtcblxuICBpZiAoY29uZmlnLmFuYWx5c2lzLmVuYWJsZWQpIHtcbiAgICBhd2FpdCBjb21iaW5lQW5hbHlzaXNTdGF0cyhjb25maWcpO1xuICAgIGNvbmZpZy5sb2dnZXIuaW5mbyhcbiAgICAgIGBBbmFseXNpcyBjb21wbGV0ZTpcXG4gICR7cGMuZ3JheSgnXHUyNTE0XHUyNTAwJyl9ICR7cGMueWVsbG93KCdzdGF0cy5odG1sJyl9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIGNvbmZpZ3VyYXRpb24sIGxpc3Qgb2YgZW50cnlwb2ludHMsIGFuZCBhbiBleGlzdGluZywgcGFydGlhbCBvdXRwdXQsIGJ1aWxkIHRoZVxuICogZW50cnlwb2ludHMgYW5kIG1lcmdlIHRoZSBuZXcgb3V0cHV0IHdpdGggdGhlIGV4aXN0aW5nIG91dHB1dC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGw6XG4gKiAxLiBHZW5lcmF0ZSB0aGUgLnd4dCBkaXJlY3RvcnkncyB0eXBlc1xuICogMi4gQnVpbGQgdGhlIGBlbnRyeXBvaW50R3JvdXBzYCAoYW5kIGNvcGllcyBwdWJsaWMgZmlsZXMpXG4gKiAzLiBHZW5lcmF0ZSB0aGUgbGF0ZXN0IG1hbmlmZXN0IGZvciBhbGwgZW50cnlwb2ludHNcbiAqIDQuIFdyaXRlIHRoZSBuZXcgbWFuaWZlc3QgdG8gdGhlIGZpbGUgc3lzdGVtXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWJ1aWxkKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBlbnRyeXBvaW50R3JvdXBzOiBFbnRyeXBvaW50R3JvdXBbXSxcbiAgZXhpc3RpbmdPdXRwdXQ6IE9taXQ8QnVpbGRPdXRwdXQsICdtYW5pZmVzdCc+ID0ge1xuICAgIHN0ZXBzOiBbXSxcbiAgICBwdWJsaWNBc3NldHM6IFtdLFxuICB9LFxuKTogUHJvbWlzZTx7IG91dHB1dDogQnVpbGRPdXRwdXQ7IG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCB9PiB7XG4gIGNvbnN0IHsgZGVmYXVsdDogb3JhIH0gPSBhd2FpdCBpbXBvcnQoJ29yYScpO1xuICBjb25zdCBzcGlubmVyID0gb3JhKGBQcmVwYXJpbmcuLi5gKS5zdGFydCgpO1xuXG4gIC8vIFVwZGF0ZSB0eXBlcyBkaXJlY3Rvcnkgd2l0aCBuZXcgZmlsZXMgYW5kIHR5cGVzXG4gIGNvbnN0IGFsbEVudHJ5cG9pbnRzID0gYXdhaXQgZmluZEVudHJ5cG9pbnRzKGNvbmZpZyk7XG4gIGF3YWl0IGdlbmVyYXRlVHlwZXNEaXIoYWxsRW50cnlwb2ludHMsIGNvbmZpZykuY2F0Y2goKGVycikgPT4ge1xuICAgIGNvbmZpZy5sb2dnZXIud2FybignRmFpbGVkIHRvIHVwZGF0ZSAud3h0IGRpcmVjdG9yeTonLCBlcnIpO1xuICAgIC8vIFRocm93IHRoZSBlcnJvciBpZiBkb2luZyBhIHJlZ3VsYXIgYnVpbGQsIGRvbid0IGZvciBkZXYgbW9kZS5cbiAgICBpZiAoY29uZmlnLmNvbW1hbmQgPT09ICdidWlsZCcpIHRocm93IGVycjtcbiAgfSk7XG5cbiAgLy8gQnVpbGQgYW5kIG1lcmdlIHRoZSBvdXRwdXRzXG4gIGNvbnN0IG5ld091dHB1dCA9IGF3YWl0IGJ1aWxkRW50cnlwb2ludHMoZW50cnlwb2ludEdyb3VwcywgY29uZmlnLCBzcGlubmVyKTtcbiAgY29uc3QgbWVyZ2VkT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPiA9IHtcbiAgICBzdGVwczogWy4uLmV4aXN0aW5nT3V0cHV0LnN0ZXBzLCAuLi5uZXdPdXRwdXQuc3RlcHNdLFxuICAgIHB1YmxpY0Fzc2V0czogWy4uLmV4aXN0aW5nT3V0cHV0LnB1YmxpY0Fzc2V0cywgLi4ubmV3T3V0cHV0LnB1YmxpY0Fzc2V0c10sXG4gIH07XG5cbiAgY29uc3QgbmV3TWFuaWZlc3QgPSBhd2FpdCBnZW5lcmF0ZU1haW5mZXN0KFxuICAgIGFsbEVudHJ5cG9pbnRzLFxuICAgIG1lcmdlZE91dHB1dCxcbiAgICBjb25maWcsXG4gICk7XG4gIGNvbnN0IGZpbmFsT3V0cHV0OiBCdWlsZE91dHB1dCA9IHtcbiAgICBtYW5pZmVzdDogbmV3TWFuaWZlc3QsXG4gICAgLi4ubmV3T3V0cHV0LFxuICB9O1xuXG4gIC8vIFdyaXRlIG1hbmlmZXN0XG4gIGF3YWl0IHdyaXRlTWFuaWZlc3QobmV3TWFuaWZlc3QsIGZpbmFsT3V0cHV0LCBjb25maWcpO1xuXG4gIC8vIFN0b3AgdGhlIHNwaW5uZXIgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBDTEkgb3V0cHV0XG4gIHNwaW5uZXIuY2xlYXIoKS5zdG9wKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBvdXRwdXQ6IHtcbiAgICAgIG1hbmlmZXN0OiBuZXdNYW5pZmVzdCxcbiAgICAgIHN0ZXBzOiBbLi4uZXhpc3RpbmdPdXRwdXQuc3RlcHMsIC4uLmZpbmFsT3V0cHV0LnN0ZXBzXSxcbiAgICAgIHB1YmxpY0Fzc2V0czogW1xuICAgICAgICAuLi5leGlzdGluZ091dHB1dC5wdWJsaWNBc3NldHMsXG4gICAgICAgIC4uLmZpbmFsT3V0cHV0LnB1YmxpY0Fzc2V0cyxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBtYW5pZmVzdDogbmV3TWFuaWZlc3QsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbWJpbmVBbmFseXNpc1N0YXRzKGNvbmZpZzogSW50ZXJuYWxDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdW5peEZpbGVzID0gYXdhaXQgZ2xvYihgc3RhdHMtKi5qc29uYCwge1xuICAgIGN3ZDogY29uZmlnLm91dERpcixcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgfSk7XG4gIGNvbnN0IGFic29sdXRlUGF0aHMgPSB1bml4RmlsZXMubWFwKHVubm9ybWFsaXplUGF0aCk7XG5cbiAgYXdhaXQgZXhlY2FDb21tYW5kKFxuICAgIGByb2xsdXAtcGx1Z2luLXZpc3VhbGl6ZXIgJHthYnNvbHV0ZVBhdGhzLmpvaW4oJyAnKX0gLS10ZW1wbGF0ZSAke1xuICAgICAgY29uZmlnLmFuYWx5c2lzLnRlbXBsYXRlXG4gICAgfWAsXG4gICAgeyBjd2Q6IGNvbmZpZy5yb290LCBzdGRpbzogJ2luaGVyaXQnIH0sXG4gICk7XG59XG4iLCAiaW1wb3J0IHsgRW50cnlwb2ludCB9IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IEVudHJ5cG9pbnRHcm91cCB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBFbnRyeXBvaW50cyBjYW4gYmUgYnVpbGQgaW4gZ3JvdXBzLiBIVE1MIHBhZ2VzIGNhbiBhbGwgYmUgYnVpbHQgdG9nZXRoZXIgaW4gYSBzaW5nbGUgc3RlcCwgd2hpbGVcbiAqIGNvbnRlbnQgc2NyaXB0cyBtdXN0IGJlIGJ1aWxkIGluZGl2aWR1YWxseS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGVudHJ5cG9pbnRzIHB1dCBpbnRvIHRoZXNlIHR5cGVzIG9mIGdyb3Vwcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwRW50cnlwb2ludHMoZW50cnlwb2ludHM6IEVudHJ5cG9pbnRbXSk6IEVudHJ5cG9pbnRHcm91cFtdIHtcbiAgY29uc3QgZ3JvdXBJbmRleE1hcDogUGFydGlhbDxSZWNvcmQ8R3JvdXAsIG51bWJlcj4+ID0ge307XG4gIGNvbnN0IGdyb3VwczogRW50cnlwb2ludEdyb3VwW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJ5cG9pbnRzKSB7XG4gICAgY29uc3QgZ3JvdXAgPSBFTlRSWV9UWVBFX1RPX0dST1VQX01BUFtlbnRyeS50eXBlXTtcbiAgICBpZiAoZ3JvdXAgPT09ICduby1ncm91cCcpIHtcbiAgICAgIGdyb3Vwcy5wdXNoKGVudHJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGdyb3VwSW5kZXggPSBncm91cEluZGV4TWFwW2dyb3VwXTtcbiAgICAgIGlmIChncm91cEluZGV4ID09IG51bGwpIHtcbiAgICAgICAgZ3JvdXBJbmRleCA9IGdyb3Vwcy5wdXNoKFtdKSAtIDE7XG4gICAgICAgIGdyb3VwSW5kZXhNYXBbZ3JvdXBdID0gZ3JvdXBJbmRleDtcbiAgICAgIH1cbiAgICAgIChncm91cHNbZ3JvdXBJbmRleF0gYXMgRW50cnlwb2ludFtdKS5wdXNoKGVudHJ5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZ3JvdXBzO1xufVxuXG5jb25zdCBFTlRSWV9UWVBFX1RPX0dST1VQX01BUDogUmVjb3JkPEVudHJ5cG9pbnRbJ3R5cGUnXSwgR3JvdXA+ID0ge1xuICBzYW5kYm94OiAnc2FuZGJveC1wYWdlJyxcblxuICBwb3B1cDogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgbmV3dGFiOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICBoaXN0b3J5OiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICBvcHRpb25zOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICBkZXZ0b29sczogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgYm9va21hcmtzOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICBzaWRlcGFuZWw6ICdleHRlbnNpb24tcGFnZScsXG4gICd1bmxpc3RlZC1wYWdlJzogJ2V4dGVuc2lvbi1wYWdlJyxcblxuICBiYWNrZ3JvdW5kOiAnbm8tZ3JvdXAnLFxuICAnY29udGVudC1zY3JpcHQnOiAnbm8tZ3JvdXAnLFxuICAndW5saXN0ZWQtc2NyaXB0JzogJ25vLWdyb3VwJyxcbiAgJ3VubGlzdGVkLXN0eWxlJzogJ25vLWdyb3VwJyxcbiAgJ2NvbnRlbnQtc2NyaXB0LXN0eWxlJzogJ25vLWdyb3VwJyxcbn07XG5cbnR5cGUgR3JvdXAgPSAnZXh0ZW5zaW9uLXBhZ2UnIHwgJ3NhbmRib3gtcGFnZScgfCAnbm8tZ3JvdXAnO1xuIiwgImV4cG9ydCBmdW5jdGlvbiBmb3JtYXREdXJhdGlvbihkdXJhdGlvbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGR1cmF0aW9uIDwgMWUzKSByZXR1cm4gYCR7ZHVyYXRpb259IG1zYDtcbiAgaWYgKGR1cmF0aW9uIDwgMTBlMykgcmV0dXJuIGAkeyhkdXJhdGlvbiAvIDFlMykudG9GaXhlZCgzKX0gc2A7XG4gIGlmIChkdXJhdGlvbiA8IDYwZTMpIHJldHVybiBgJHsoZHVyYXRpb24gLyAxZTMpLnRvRml4ZWQoMSl9IHNgO1xuICByZXR1cm4gYCR7KGR1cmF0aW9uIC8gMWUzKS50b0ZpeGVkKDApfSBzYDtcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBCdWlsZE91dHB1dCwgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBwcmludEZpbGVMaXN0IH0gZnJvbSAnLi9wcmludEZpbGVMaXN0JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByaW50QnVpbGRTdW1tYXJ5KFxuICBsb2c6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCxcbiAgaGVhZGVyOiBzdHJpbmcsXG4gIG91dHB1dDogQnVpbGRPdXRwdXQsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pIHtcbiAgY29uc3QgY2h1bmtzID0gW1xuICAgIC4uLm91dHB1dC5zdGVwcy5mbGF0TWFwKChzdGVwKSA9PiBzdGVwLmNodW5rcyksXG4gICAgLi4ub3V0cHV0LnB1YmxpY0Fzc2V0cyxcbiAgXS5zb3J0KChsLCByKSA9PiB7XG4gICAgY29uc3QgbFdlaWdodCA9IGdldENodW5rU29ydFdlaWdodChsLmZpbGVOYW1lKTtcbiAgICBjb25zdCByV2VpZ2h0ID0gZ2V0Q2h1bmtTb3J0V2VpZ2h0KHIuZmlsZU5hbWUpO1xuICAgIGNvbnN0IGRpZmYgPSBsV2VpZ2h0IC0gcldlaWdodDtcbiAgICBpZiAoZGlmZiAhPT0gMCkgcmV0dXJuIGRpZmY7XG4gICAgcmV0dXJuIGwuZmlsZU5hbWUubG9jYWxlQ29tcGFyZShyLmZpbGVOYW1lKTtcbiAgfSk7XG5cbiAgY29uc3QgZmlsZXMgPSBjaHVua3MubWFwKChjaHVuaykgPT4gcmVzb2x2ZShjb25maWcub3V0RGlyLCBjaHVuay5maWxlTmFtZSkpO1xuICBhd2FpdCBwcmludEZpbGVMaXN0KGxvZywgaGVhZGVyLCBjb25maWcub3V0RGlyLCBmaWxlcyk7XG59XG5cbmNvbnN0IERFRkFVTFRfU09SVF9XRUlHSFQgPSAxMDA7XG5jb25zdCBDSFVOS19TT1JUX1dFSUdIVFM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gICdtYW5pZmVzdC5qc29uJzogMCxcbiAgJy5odG1sJzogMSxcbiAgJy5qcy5tYXAnOiAyLFxuICAnLmpzJzogMixcbiAgJy5jc3MnOiAzLFxufTtcbmZ1bmN0aW9uIGdldENodW5rU29ydFdlaWdodChmaWxlbmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0LmVudHJpZXMoQ0hVTktfU09SVF9XRUlHSFRTKS5maW5kKChba2V5XSkgPT5cbiAgICAgIGZpbGVuYW1lLmVuZHNXaXRoKGtleSksXG4gICAgKT8uWzFdID8/IERFRkFVTFRfU09SVF9XRUlHSFRcbiAgKTtcbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHBjIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGZpbGVzaXplIH0gZnJvbSAnZmlsZXNpemUnO1xuaW1wb3J0IHsgcHJpbnRUYWJsZSB9IGZyb20gJy4vcHJpbnRUYWJsZSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmludEZpbGVMaXN0KFxuICBsb2c6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQsXG4gIGhlYWRlcjogc3RyaW5nLFxuICBiYXNlRGlyOiBzdHJpbmcsXG4gIGZpbGVzOiBzdHJpbmdbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgdG90YWxTaXplID0gMDtcblxuICBjb25zdCBmaWxlUm93czogc3RyaW5nW11bXSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbGVzLm1hcChhc3luYyAoZmlsZSwgaSkgPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAgIHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgYmFzZURpcikgKyBwYXRoLnNlcCxcbiAgICAgICAgcGF0aC5yZWxhdGl2ZShiYXNlRGlyLCBmaWxlKSxcbiAgICAgIF07XG4gICAgICBjb25zdCBwcmVmaXggPSBpID09PSBmaWxlcy5sZW5ndGggLSAxID8gJyAgXHUyNTE0XHUyNTAwJyA6ICcgIFx1MjUxQ1x1MjUwMCc7XG4gICAgICBjb25zdCBjb2xvciA9IGdldENodW5rQ29sb3IoZmlsZSk7XG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLmxzdGF0KGZpbGUpO1xuICAgICAgdG90YWxTaXplICs9IHN0YXRzLnNpemU7XG4gICAgICBjb25zdCBzaXplID0gU3RyaW5nKGZpbGVzaXplKHN0YXRzLnNpemUpKTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGAke3BjLmdyYXkocHJlZml4KX0gJHtwYy5kaW0ocGFydHNbMF0pfSR7Y29sb3IocGFydHNbMV0pfWAsXG4gICAgICAgIHBjLmRpbShzaXplKSxcbiAgICAgIF07XG4gICAgfSksXG4gICk7XG5cbiAgZmlsZVJvd3MucHVzaChbYCR7cGMuY3lhbignXHUwM0EzIFRvdGFsIHNpemU6Jyl9ICR7U3RyaW5nKGZpbGVzaXplKHRvdGFsU2l6ZSkpfWBdKTtcblxuICBwcmludFRhYmxlKGxvZywgaGVhZGVyLCBmaWxlUm93cyk7XG59XG5cbmNvbnN0IERFRkFVTFRfQ09MT1IgPSBwYy5ibHVlO1xuY29uc3QgQ0hVTktfQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCAodGV4dDogc3RyaW5nKSA9PiBzdHJpbmc+ID0ge1xuICAnLmpzLm1hcCc6IHBjLmdyYXksXG4gICcuaHRtbCc6IHBjLmdyZWVuLFxuICAnLmNzcyc6IHBjLm1hZ2VudGEsXG4gICcuanMnOiBwYy5jeWFuLFxuICAnLnppcCc6IHBjLnllbGxvdyxcbn07XG5mdW5jdGlvbiBnZXRDaHVua0NvbG9yKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIChcbiAgICBPYmplY3QuZW50cmllcyhDSFVOS19DT0xPUlMpLmZpbmQoKFtrZXldKSA9PiBmaWxlbmFtZS5lbmRzV2l0aChrZXkpKT8uWzFdID8/XG4gICAgREVGQVVMVF9DT0xPUlxuICApO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBwcmludFRhYmxlKFxuICBsb2c6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQsXG4gIGhlYWRlcjogc3RyaW5nLFxuICByb3dzOiBzdHJpbmdbXVtdLFxuICBnYXAgPSAyLFxuKTogdm9pZCB7XG4gIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbHVtbldpZHRocyA9IHJvd3MucmVkdWNlKFxuICAgICh3aWR0aHMsIHJvdykgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1heCh3aWR0aHMubGVuZ3RoLCByb3cubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgIHdpZHRoc1tpXSA9IE1hdGgubWF4KHJvd1tpXT8ubGVuZ3RoID8/IDAsIHdpZHRoc1tpXSA/PyAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3aWR0aHM7XG4gICAgfSxcbiAgICByb3dzWzBdLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubGVuZ3RoKSxcbiAgKTtcblxuICBsZXQgc3RyID0gJyc7XG4gIHJvd3MuZm9yRWFjaCgocm93LCBpKSA9PiB7XG4gICAgcm93LmZvckVhY2goKGNvbCwgaikgPT4ge1xuICAgICAgc3RyICs9IGNvbC5wYWRFbmQoY29sdW1uV2lkdGhzW2pdLCAnICcpO1xuICAgICAgaWYgKGogIT09IHJvdy5sZW5ndGggLSAxKSBzdHIgKz0gJycucGFkRW5kKGdhcCwgJyAnKTtcbiAgICB9KTtcbiAgICBpZiAoaSAhPT0gcm93cy5sZW5ndGggLSAxKSBzdHIgKz0gJ1xcbic7XG4gIH0pO1xuXG4gIGxvZyhgJHtoZWFkZXJ9XFxuJHtzdHJ9YCk7XG59XG4iLCAiaW1wb3J0IHtCdWZmZXJ9IGZyb20gJ25vZGU6YnVmZmVyJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IGNyb3NzU3Bhd24gZnJvbSAnY3Jvc3Mtc3Bhd24nO1xuaW1wb3J0IHN0cmlwRmluYWxOZXdsaW5lIGZyb20gJ3N0cmlwLWZpbmFsLW5ld2xpbmUnO1xuaW1wb3J0IHtucG1SdW5QYXRoRW52fSBmcm9tICducG0tcnVuLXBhdGgnO1xuaW1wb3J0IG9uZXRpbWUgZnJvbSAnb25ldGltZSc7XG5pbXBvcnQge21ha2VFcnJvcn0gZnJvbSAnLi9saWIvZXJyb3IuanMnO1xuaW1wb3J0IHtub3JtYWxpemVTdGRpbywgbm9ybWFsaXplU3RkaW9Ob2RlfSBmcm9tICcuL2xpYi9zdGRpby5qcyc7XG5pbXBvcnQge3NwYXduZWRLaWxsLCBzcGF3bmVkQ2FuY2VsLCBzZXR1cFRpbWVvdXQsIHZhbGlkYXRlVGltZW91dCwgc2V0RXhpdEhhbmRsZXJ9IGZyb20gJy4vbGliL2tpbGwuanMnO1xuaW1wb3J0IHthZGRQaXBlTWV0aG9kc30gZnJvbSAnLi9saWIvcGlwZS5qcyc7XG5pbXBvcnQge2hhbmRsZUlucHV0LCBnZXRTcGF3bmVkUmVzdWx0LCBtYWtlQWxsU3RyZWFtLCBoYW5kbGVJbnB1dFN5bmN9IGZyb20gJy4vbGliL3N0cmVhbS5qcyc7XG5pbXBvcnQge21lcmdlUHJvbWlzZSwgZ2V0U3Bhd25lZFByb21pc2V9IGZyb20gJy4vbGliL3Byb21pc2UuanMnO1xuaW1wb3J0IHtqb2luQ29tbWFuZCwgcGFyc2VDb21tYW5kLCBwYXJzZVRlbXBsYXRlcywgZ2V0RXNjYXBlZENvbW1hbmR9IGZyb20gJy4vbGliL2NvbW1hbmQuanMnO1xuaW1wb3J0IHtsb2dDb21tYW5kLCB2ZXJib3NlRGVmYXVsdH0gZnJvbSAnLi9saWIvdmVyYm9zZS5qcyc7XG5cbmNvbnN0IERFRkFVTFRfTUFYX0JVRkZFUiA9IDEwMDAgKiAxMDAwICogMTAwO1xuXG5jb25zdCBnZXRFbnYgPSAoe2VudjogZW52T3B0aW9uLCBleHRlbmRFbnYsIHByZWZlckxvY2FsLCBsb2NhbERpciwgZXhlY1BhdGh9KSA9PiB7XG5cdGNvbnN0IGVudiA9IGV4dGVuZEVudiA/IHsuLi5wcm9jZXNzLmVudiwgLi4uZW52T3B0aW9ufSA6IGVudk9wdGlvbjtcblxuXHRpZiAocHJlZmVyTG9jYWwpIHtcblx0XHRyZXR1cm4gbnBtUnVuUGF0aEVudih7ZW52LCBjd2Q6IGxvY2FsRGlyLCBleGVjUGF0aH0pO1xuXHR9XG5cblx0cmV0dXJuIGVudjtcbn07XG5cbmNvbnN0IGhhbmRsZUFyZ3VtZW50cyA9IChmaWxlLCBhcmdzLCBvcHRpb25zID0ge30pID0+IHtcblx0Y29uc3QgcGFyc2VkID0gY3Jvc3NTcGF3bi5fcGFyc2UoZmlsZSwgYXJncywgb3B0aW9ucyk7XG5cdGZpbGUgPSBwYXJzZWQuY29tbWFuZDtcblx0YXJncyA9IHBhcnNlZC5hcmdzO1xuXHRvcHRpb25zID0gcGFyc2VkLm9wdGlvbnM7XG5cblx0b3B0aW9ucyA9IHtcblx0XHRtYXhCdWZmZXI6IERFRkFVTFRfTUFYX0JVRkZFUixcblx0XHRidWZmZXI6IHRydWUsXG5cdFx0c3RyaXBGaW5hbE5ld2xpbmU6IHRydWUsXG5cdFx0ZXh0ZW5kRW52OiB0cnVlLFxuXHRcdHByZWZlckxvY2FsOiBmYWxzZSxcblx0XHRsb2NhbERpcjogb3B0aW9ucy5jd2QgfHwgcHJvY2Vzcy5jd2QoKSxcblx0XHRleGVjUGF0aDogcHJvY2Vzcy5leGVjUGF0aCxcblx0XHRlbmNvZGluZzogJ3V0ZjgnLFxuXHRcdHJlamVjdDogdHJ1ZSxcblx0XHRjbGVhbnVwOiB0cnVlLFxuXHRcdGFsbDogZmFsc2UsXG5cdFx0d2luZG93c0hpZGU6IHRydWUsXG5cdFx0dmVyYm9zZTogdmVyYm9zZURlZmF1bHQsXG5cdFx0Li4ub3B0aW9ucyxcblx0fTtcblxuXHRvcHRpb25zLmVudiA9IGdldEVudihvcHRpb25zKTtcblxuXHRvcHRpb25zLnN0ZGlvID0gbm9ybWFsaXplU3RkaW8ob3B0aW9ucyk7XG5cblx0aWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgJiYgcGF0aC5iYXNlbmFtZShmaWxlLCAnLmV4ZScpID09PSAnY21kJykge1xuXHRcdC8vICMxMTZcblx0XHRhcmdzLnVuc2hpZnQoJy9xJyk7XG5cdH1cblxuXHRyZXR1cm4ge2ZpbGUsIGFyZ3MsIG9wdGlvbnMsIHBhcnNlZH07XG59O1xuXG5jb25zdCBoYW5kbGVPdXRwdXQgPSAob3B0aW9ucywgdmFsdWUsIGVycm9yKSA9PiB7XG5cdGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG5cdFx0Ly8gV2hlbiBgZXhlY2FTeW5jKClgIGVycm9ycywgd2Ugbm9ybWFsaXplIGl0IHRvICcnIHRvIG1pbWljIGBleGVjYSgpYFxuXHRcdHJldHVybiBlcnJvciA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogJyc7XG5cdH1cblxuXHRpZiAob3B0aW9ucy5zdHJpcEZpbmFsTmV3bGluZSkge1xuXHRcdHJldHVybiBzdHJpcEZpbmFsTmV3bGluZSh2YWx1ZSk7XG5cdH1cblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZXhlY2EoZmlsZSwgYXJncywgb3B0aW9ucykge1xuXHRjb25zdCBwYXJzZWQgPSBoYW5kbGVBcmd1bWVudHMoZmlsZSwgYXJncywgb3B0aW9ucyk7XG5cdGNvbnN0IGNvbW1hbmQgPSBqb2luQ29tbWFuZChmaWxlLCBhcmdzKTtcblx0Y29uc3QgZXNjYXBlZENvbW1hbmQgPSBnZXRFc2NhcGVkQ29tbWFuZChmaWxlLCBhcmdzKTtcblx0bG9nQ29tbWFuZChlc2NhcGVkQ29tbWFuZCwgcGFyc2VkLm9wdGlvbnMpO1xuXG5cdHZhbGlkYXRlVGltZW91dChwYXJzZWQub3B0aW9ucyk7XG5cblx0bGV0IHNwYXduZWQ7XG5cdHRyeSB7XG5cdFx0c3Bhd25lZCA9IGNoaWxkUHJvY2Vzcy5zcGF3bihwYXJzZWQuZmlsZSwgcGFyc2VkLmFyZ3MsIHBhcnNlZC5vcHRpb25zKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBFbnN1cmUgdGhlIHJldHVybmVkIGVycm9yIGlzIGFsd2F5cyBib3RoIGEgcHJvbWlzZSBhbmQgYSBjaGlsZCBwcm9jZXNzXG5cdFx0Y29uc3QgZHVtbXlTcGF3bmVkID0gbmV3IGNoaWxkUHJvY2Vzcy5DaGlsZFByb2Nlc3MoKTtcblx0XHRjb25zdCBlcnJvclByb21pc2UgPSBQcm9taXNlLnJlamVjdChtYWtlRXJyb3Ioe1xuXHRcdFx0ZXJyb3IsXG5cdFx0XHRzdGRvdXQ6ICcnLFxuXHRcdFx0c3RkZXJyOiAnJyxcblx0XHRcdGFsbDogJycsXG5cdFx0XHRjb21tYW5kLFxuXHRcdFx0ZXNjYXBlZENvbW1hbmQsXG5cdFx0XHRwYXJzZWQsXG5cdFx0XHR0aW1lZE91dDogZmFsc2UsXG5cdFx0XHRpc0NhbmNlbGVkOiBmYWxzZSxcblx0XHRcdGtpbGxlZDogZmFsc2UsXG5cdFx0fSkpO1xuXHRcdG1lcmdlUHJvbWlzZShkdW1teVNwYXduZWQsIGVycm9yUHJvbWlzZSk7XG5cdFx0cmV0dXJuIGR1bW15U3Bhd25lZDtcblx0fVxuXG5cdGNvbnN0IHNwYXduZWRQcm9taXNlID0gZ2V0U3Bhd25lZFByb21pc2Uoc3Bhd25lZCk7XG5cdGNvbnN0IHRpbWVkUHJvbWlzZSA9IHNldHVwVGltZW91dChzcGF3bmVkLCBwYXJzZWQub3B0aW9ucywgc3Bhd25lZFByb21pc2UpO1xuXHRjb25zdCBwcm9jZXNzRG9uZSA9IHNldEV4aXRIYW5kbGVyKHNwYXduZWQsIHBhcnNlZC5vcHRpb25zLCB0aW1lZFByb21pc2UpO1xuXG5cdGNvbnN0IGNvbnRleHQgPSB7aXNDYW5jZWxlZDogZmFsc2V9O1xuXG5cdHNwYXduZWQua2lsbCA9IHNwYXduZWRLaWxsLmJpbmQobnVsbCwgc3Bhd25lZC5raWxsLmJpbmQoc3Bhd25lZCkpO1xuXHRzcGF3bmVkLmNhbmNlbCA9IHNwYXduZWRDYW5jZWwuYmluZChudWxsLCBzcGF3bmVkLCBjb250ZXh0KTtcblxuXHRjb25zdCBoYW5kbGVQcm9taXNlID0gYXN5bmMgKCkgPT4ge1xuXHRcdGNvbnN0IFt7ZXJyb3IsIGV4aXRDb2RlLCBzaWduYWwsIHRpbWVkT3V0fSwgc3Rkb3V0UmVzdWx0LCBzdGRlcnJSZXN1bHQsIGFsbFJlc3VsdF0gPSBhd2FpdCBnZXRTcGF3bmVkUmVzdWx0KHNwYXduZWQsIHBhcnNlZC5vcHRpb25zLCBwcm9jZXNzRG9uZSk7XG5cdFx0Y29uc3Qgc3Rkb3V0ID0gaGFuZGxlT3V0cHV0KHBhcnNlZC5vcHRpb25zLCBzdGRvdXRSZXN1bHQpO1xuXHRcdGNvbnN0IHN0ZGVyciA9IGhhbmRsZU91dHB1dChwYXJzZWQub3B0aW9ucywgc3RkZXJyUmVzdWx0KTtcblx0XHRjb25zdCBhbGwgPSBoYW5kbGVPdXRwdXQocGFyc2VkLm9wdGlvbnMsIGFsbFJlc3VsdCk7XG5cblx0XHRpZiAoZXJyb3IgfHwgZXhpdENvZGUgIT09IDAgfHwgc2lnbmFsICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCByZXR1cm5lZEVycm9yID0gbWFrZUVycm9yKHtcblx0XHRcdFx0ZXJyb3IsXG5cdFx0XHRcdGV4aXRDb2RlLFxuXHRcdFx0XHRzaWduYWwsXG5cdFx0XHRcdHN0ZG91dCxcblx0XHRcdFx0c3RkZXJyLFxuXHRcdFx0XHRhbGwsXG5cdFx0XHRcdGNvbW1hbmQsXG5cdFx0XHRcdGVzY2FwZWRDb21tYW5kLFxuXHRcdFx0XHRwYXJzZWQsXG5cdFx0XHRcdHRpbWVkT3V0LFxuXHRcdFx0XHRpc0NhbmNlbGVkOiBjb250ZXh0LmlzQ2FuY2VsZWQgfHwgKHBhcnNlZC5vcHRpb25zLnNpZ25hbCA/IHBhcnNlZC5vcHRpb25zLnNpZ25hbC5hYm9ydGVkIDogZmFsc2UpLFxuXHRcdFx0XHRraWxsZWQ6IHNwYXduZWQua2lsbGVkLFxuXHRcdFx0fSk7XG5cblx0XHRcdGlmICghcGFyc2VkLm9wdGlvbnMucmVqZWN0KSB7XG5cdFx0XHRcdHJldHVybiByZXR1cm5lZEVycm9yO1xuXHRcdFx0fVxuXG5cdFx0XHR0aHJvdyByZXR1cm5lZEVycm9yO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRjb21tYW5kLFxuXHRcdFx0ZXNjYXBlZENvbW1hbmQsXG5cdFx0XHRleGl0Q29kZTogMCxcblx0XHRcdHN0ZG91dCxcblx0XHRcdHN0ZGVycixcblx0XHRcdGFsbCxcblx0XHRcdGZhaWxlZDogZmFsc2UsXG5cdFx0XHR0aW1lZE91dDogZmFsc2UsXG5cdFx0XHRpc0NhbmNlbGVkOiBmYWxzZSxcblx0XHRcdGtpbGxlZDogZmFsc2UsXG5cdFx0fTtcblx0fTtcblxuXHRjb25zdCBoYW5kbGVQcm9taXNlT25jZSA9IG9uZXRpbWUoaGFuZGxlUHJvbWlzZSk7XG5cblx0aGFuZGxlSW5wdXQoc3Bhd25lZCwgcGFyc2VkLm9wdGlvbnMpO1xuXG5cdHNwYXduZWQuYWxsID0gbWFrZUFsbFN0cmVhbShzcGF3bmVkLCBwYXJzZWQub3B0aW9ucyk7XG5cblx0YWRkUGlwZU1ldGhvZHMoc3Bhd25lZCk7XG5cdG1lcmdlUHJvbWlzZShzcGF3bmVkLCBoYW5kbGVQcm9taXNlT25jZSk7XG5cdHJldHVybiBzcGF3bmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhlY2FTeW5jKGZpbGUsIGFyZ3MsIG9wdGlvbnMpIHtcblx0Y29uc3QgcGFyc2VkID0gaGFuZGxlQXJndW1lbnRzKGZpbGUsIGFyZ3MsIG9wdGlvbnMpO1xuXHRjb25zdCBjb21tYW5kID0gam9pbkNvbW1hbmQoZmlsZSwgYXJncyk7XG5cdGNvbnN0IGVzY2FwZWRDb21tYW5kID0gZ2V0RXNjYXBlZENvbW1hbmQoZmlsZSwgYXJncyk7XG5cdGxvZ0NvbW1hbmQoZXNjYXBlZENvbW1hbmQsIHBhcnNlZC5vcHRpb25zKTtcblxuXHRjb25zdCBpbnB1dCA9IGhhbmRsZUlucHV0U3luYyhwYXJzZWQub3B0aW9ucyk7XG5cblx0bGV0IHJlc3VsdDtcblx0dHJ5IHtcblx0XHRyZXN1bHQgPSBjaGlsZFByb2Nlc3Muc3Bhd25TeW5jKHBhcnNlZC5maWxlLCBwYXJzZWQuYXJncywgey4uLnBhcnNlZC5vcHRpb25zLCBpbnB1dH0pO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdHRocm93IG1ha2VFcnJvcih7XG5cdFx0XHRlcnJvcixcblx0XHRcdHN0ZG91dDogJycsXG5cdFx0XHRzdGRlcnI6ICcnLFxuXHRcdFx0YWxsOiAnJyxcblx0XHRcdGNvbW1hbmQsXG5cdFx0XHRlc2NhcGVkQ29tbWFuZCxcblx0XHRcdHBhcnNlZCxcblx0XHRcdHRpbWVkT3V0OiBmYWxzZSxcblx0XHRcdGlzQ2FuY2VsZWQ6IGZhbHNlLFxuXHRcdFx0a2lsbGVkOiBmYWxzZSxcblx0XHR9KTtcblx0fVxuXG5cdGNvbnN0IHN0ZG91dCA9IGhhbmRsZU91dHB1dChwYXJzZWQub3B0aW9ucywgcmVzdWx0LnN0ZG91dCwgcmVzdWx0LmVycm9yKTtcblx0Y29uc3Qgc3RkZXJyID0gaGFuZGxlT3V0cHV0KHBhcnNlZC5vcHRpb25zLCByZXN1bHQuc3RkZXJyLCByZXN1bHQuZXJyb3IpO1xuXG5cdGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCByZXN1bHQuc2lnbmFsICE9PSBudWxsKSB7XG5cdFx0Y29uc3QgZXJyb3IgPSBtYWtlRXJyb3Ioe1xuXHRcdFx0c3Rkb3V0LFxuXHRcdFx0c3RkZXJyLFxuXHRcdFx0ZXJyb3I6IHJlc3VsdC5lcnJvcixcblx0XHRcdHNpZ25hbDogcmVzdWx0LnNpZ25hbCxcblx0XHRcdGV4aXRDb2RlOiByZXN1bHQuc3RhdHVzLFxuXHRcdFx0Y29tbWFuZCxcblx0XHRcdGVzY2FwZWRDb21tYW5kLFxuXHRcdFx0cGFyc2VkLFxuXHRcdFx0dGltZWRPdXQ6IHJlc3VsdC5lcnJvciAmJiByZXN1bHQuZXJyb3IuY29kZSA9PT0gJ0VUSU1FRE9VVCcsXG5cdFx0XHRpc0NhbmNlbGVkOiBmYWxzZSxcblx0XHRcdGtpbGxlZDogcmVzdWx0LnNpZ25hbCAhPT0gbnVsbCxcblx0XHR9KTtcblxuXHRcdGlmICghcGFyc2VkLm9wdGlvbnMucmVqZWN0KSB7XG5cdFx0XHRyZXR1cm4gZXJyb3I7XG5cdFx0fVxuXG5cdFx0dGhyb3cgZXJyb3I7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGNvbW1hbmQsXG5cdFx0ZXNjYXBlZENvbW1hbmQsXG5cdFx0ZXhpdENvZGU6IDAsXG5cdFx0c3Rkb3V0LFxuXHRcdHN0ZGVycixcblx0XHRmYWlsZWQ6IGZhbHNlLFxuXHRcdHRpbWVkT3V0OiBmYWxzZSxcblx0XHRpc0NhbmNlbGVkOiBmYWxzZSxcblx0XHRraWxsZWQ6IGZhbHNlLFxuXHR9O1xufVxuXG5jb25zdCBub3JtYWxpemVTY3JpcHRTdGRpbiA9ICh7aW5wdXQsIGlucHV0RmlsZSwgc3RkaW99KSA9PiBpbnB1dCA9PT0gdW5kZWZpbmVkICYmIGlucHV0RmlsZSA9PT0gdW5kZWZpbmVkICYmIHN0ZGlvID09PSB1bmRlZmluZWRcblx0PyB7c3RkaW46ICdpbmhlcml0J31cblx0OiB7fTtcblxuY29uc3Qgbm9ybWFsaXplU2NyaXB0T3B0aW9ucyA9IChvcHRpb25zID0ge30pID0+ICh7XG5cdHByZWZlckxvY2FsOiB0cnVlLFxuXHQuLi5ub3JtYWxpemVTY3JpcHRTdGRpbihvcHRpb25zKSxcblx0Li4ub3B0aW9ucyxcbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGUkKG9wdGlvbnMpIHtcblx0ZnVuY3Rpb24gJCh0ZW1wbGF0ZXNPck9wdGlvbnMsIC4uLmV4cHJlc3Npb25zKSB7XG5cdFx0aWYgKCFBcnJheS5pc0FycmF5KHRlbXBsYXRlc09yT3B0aW9ucykpIHtcblx0XHRcdHJldHVybiBjcmVhdGUkKHsuLi5vcHRpb25zLCAuLi50ZW1wbGF0ZXNPck9wdGlvbnN9KTtcblx0XHR9XG5cblx0XHRjb25zdCBbZmlsZSwgLi4uYXJnc10gPSBwYXJzZVRlbXBsYXRlcyh0ZW1wbGF0ZXNPck9wdGlvbnMsIGV4cHJlc3Npb25zKTtcblx0XHRyZXR1cm4gZXhlY2EoZmlsZSwgYXJncywgbm9ybWFsaXplU2NyaXB0T3B0aW9ucyhvcHRpb25zKSk7XG5cdH1cblxuXHQkLnN5bmMgPSAodGVtcGxhdGVzLCAuLi5leHByZXNzaW9ucykgPT4ge1xuXHRcdGlmICghQXJyYXkuaXNBcnJheSh0ZW1wbGF0ZXMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdQbGVhc2UgdXNlICQob3B0aW9ucykuc3luY2Bjb21tYW5kYCBpbnN0ZWFkIG9mICQuc3luYyhvcHRpb25zKWBjb21tYW5kYC4nKTtcblx0XHR9XG5cblx0XHRjb25zdCBbZmlsZSwgLi4uYXJnc10gPSBwYXJzZVRlbXBsYXRlcyh0ZW1wbGF0ZXMsIGV4cHJlc3Npb25zKTtcblx0XHRyZXR1cm4gZXhlY2FTeW5jKGZpbGUsIGFyZ3MsIG5vcm1hbGl6ZVNjcmlwdE9wdGlvbnMob3B0aW9ucykpO1xuXHR9O1xuXG5cdHJldHVybiAkO1xufVxuXG5leHBvcnQgY29uc3QgJCA9IGNyZWF0ZSQoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWNhQ29tbWFuZChjb21tYW5kLCBvcHRpb25zKSB7XG5cdGNvbnN0IFtmaWxlLCAuLi5hcmdzXSA9IHBhcnNlQ29tbWFuZChjb21tYW5kKTtcblx0cmV0dXJuIGV4ZWNhKGZpbGUsIGFyZ3MsIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhlY2FDb21tYW5kU3luYyhjb21tYW5kLCBvcHRpb25zKSB7XG5cdGNvbnN0IFtmaWxlLCAuLi5hcmdzXSA9IHBhcnNlQ29tbWFuZChjb21tYW5kKTtcblx0cmV0dXJuIGV4ZWNhU3luYyhmaWxlLCBhcmdzLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWNhTm9kZShzY3JpcHRQYXRoLCBhcmdzLCBvcHRpb25zID0ge30pIHtcblx0aWYgKGFyZ3MgJiYgIUFycmF5LmlzQXJyYXkoYXJncykgJiYgdHlwZW9mIGFyZ3MgPT09ICdvYmplY3QnKSB7XG5cdFx0b3B0aW9ucyA9IGFyZ3M7XG5cdFx0YXJncyA9IFtdO1xuXHR9XG5cblx0Y29uc3Qgc3RkaW8gPSBub3JtYWxpemVTdGRpb05vZGUob3B0aW9ucyk7XG5cdGNvbnN0IGRlZmF1bHRFeGVjQXJndiA9IHByb2Nlc3MuZXhlY0FyZ3YuZmlsdGVyKGFyZyA9PiAhYXJnLnN0YXJ0c1dpdGgoJy0taW5zcGVjdCcpKTtcblxuXHRjb25zdCB7XG5cdFx0bm9kZVBhdGggPSBwcm9jZXNzLmV4ZWNQYXRoLFxuXHRcdG5vZGVPcHRpb25zID0gZGVmYXVsdEV4ZWNBcmd2LFxuXHR9ID0gb3B0aW9ucztcblxuXHRyZXR1cm4gZXhlY2EoXG5cdFx0bm9kZVBhdGgsXG5cdFx0W1xuXHRcdFx0Li4ubm9kZU9wdGlvbnMsXG5cdFx0XHRzY3JpcHRQYXRoLFxuXHRcdFx0Li4uKEFycmF5LmlzQXJyYXkoYXJncykgPyBhcmdzIDogW10pLFxuXHRcdF0sXG5cdFx0e1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdHN0ZGluOiB1bmRlZmluZWQsXG5cdFx0XHRzdGRvdXQ6IHVuZGVmaW5lZCxcblx0XHRcdHN0ZGVycjogdW5kZWZpbmVkLFxuXHRcdFx0c3RkaW8sXG5cdFx0XHRzaGVsbDogZmFsc2UsXG5cdFx0fSxcblx0KTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdHJpcEZpbmFsTmV3bGluZShpbnB1dCkge1xuXHRjb25zdCBMRiA9IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyAnXFxuJyA6ICdcXG4nLmNoYXJDb2RlQXQoKTtcblx0Y29uc3QgQ1IgPSB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnID8gJ1xccicgOiAnXFxyJy5jaGFyQ29kZUF0KCk7XG5cblx0aWYgKGlucHV0W2lucHV0Lmxlbmd0aCAtIDFdID09PSBMRikge1xuXHRcdGlucHV0ID0gaW5wdXQuc2xpY2UoMCwgLTEpO1xuXHR9XG5cblx0aWYgKGlucHV0W2lucHV0Lmxlbmd0aCAtIDFdID09PSBDUikge1xuXHRcdGlucHV0ID0gaW5wdXQuc2xpY2UoMCwgLTEpO1xuXHR9XG5cblx0cmV0dXJuIGlucHV0O1xufVxuIiwgImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHVybCBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgcGF0aEtleSBmcm9tICdwYXRoLWtleSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBucG1SdW5QYXRoKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7XG5cdFx0Y3dkID0gcHJvY2Vzcy5jd2QoKSxcblx0XHRwYXRoOiBwYXRoXyA9IHByb2Nlc3MuZW52W3BhdGhLZXkoKV0sXG5cdFx0ZXhlY1BhdGggPSBwcm9jZXNzLmV4ZWNQYXRoLFxuXHR9ID0gb3B0aW9ucztcblxuXHRsZXQgcHJldmlvdXM7XG5cdGNvbnN0IGN3ZFN0cmluZyA9IGN3ZCBpbnN0YW5jZW9mIFVSTCA/IHVybC5maWxlVVJMVG9QYXRoKGN3ZCkgOiBjd2Q7XG5cdGxldCBjd2RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZFN0cmluZyk7XG5cdGNvbnN0IHJlc3VsdCA9IFtdO1xuXG5cdHdoaWxlIChwcmV2aW91cyAhPT0gY3dkUGF0aCkge1xuXHRcdHJlc3VsdC5wdXNoKHBhdGguam9pbihjd2RQYXRoLCAnbm9kZV9tb2R1bGVzLy5iaW4nKSk7XG5cdFx0cHJldmlvdXMgPSBjd2RQYXRoO1xuXHRcdGN3ZFBhdGggPSBwYXRoLnJlc29sdmUoY3dkUGF0aCwgJy4uJyk7XG5cdH1cblxuXHQvLyBFbnN1cmUgdGhlIHJ1bm5pbmcgYG5vZGVgIGJpbmFyeSBpcyB1c2VkLlxuXHRyZXN1bHQucHVzaChwYXRoLnJlc29sdmUoY3dkU3RyaW5nLCBleGVjUGF0aCwgJy4uJykpO1xuXG5cdHJldHVybiBbLi4ucmVzdWx0LCBwYXRoX10uam9pbihwYXRoLmRlbGltaXRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBucG1SdW5QYXRoRW52KHtlbnYgPSBwcm9jZXNzLmVudiwgLi4ub3B0aW9uc30gPSB7fSkge1xuXHRlbnYgPSB7Li4uZW52fTtcblxuXHRjb25zdCBwYXRoID0gcGF0aEtleSh7ZW52fSk7XG5cdG9wdGlvbnMucGF0aCA9IGVudltwYXRoXTtcblx0ZW52W3BhdGhdID0gbnBtUnVuUGF0aChvcHRpb25zKTtcblxuXHRyZXR1cm4gZW52O1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhdGhLZXkob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHtcblx0XHRlbnYgPSBwcm9jZXNzLmVudixcblx0XHRwbGF0Zm9ybSA9IHByb2Nlc3MucGxhdGZvcm1cblx0fSA9IG9wdGlvbnM7XG5cblx0aWYgKHBsYXRmb3JtICE9PSAnd2luMzInKSB7XG5cdFx0cmV0dXJuICdQQVRIJztcblx0fVxuXG5cdHJldHVybiBPYmplY3Qua2V5cyhlbnYpLnJldmVyc2UoKS5maW5kKGtleSA9PiBrZXkudG9VcHBlckNhc2UoKSA9PT0gJ1BBVEgnKSB8fCAnUGF0aCc7XG59XG4iLCAiY29uc3QgY29weVByb3BlcnR5ID0gKHRvLCBmcm9tLCBwcm9wZXJ0eSwgaWdub3JlTm9uQ29uZmlndXJhYmxlKSA9PiB7XG5cdC8vIGBGdW5jdGlvbiNsZW5ndGhgIHNob3VsZCByZWZsZWN0IHRoZSBwYXJhbWV0ZXJzIG9mIGB0b2Agbm90IGBmcm9tYCBzaW5jZSB3ZSBrZWVwIGl0cyBib2R5LlxuXHQvLyBgRnVuY3Rpb24jcHJvdG90eXBlYCBpcyBub24td3JpdGFibGUgYW5kIG5vbi1jb25maWd1cmFibGUgc28gY2FuIG5ldmVyIGJlIG1vZGlmaWVkLlxuXHRpZiAocHJvcGVydHkgPT09ICdsZW5ndGgnIHx8IHByb3BlcnR5ID09PSAncHJvdG90eXBlJykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIGBGdW5jdGlvbiNhcmd1bWVudHNgIGFuZCBgRnVuY3Rpb24jY2FsbGVyYCBzaG91bGQgbm90IGJlIGNvcGllZC4gVGhleSB3ZXJlIHJlcG9ydGVkIHRvIGJlIHByZXNlbnQgaW4gYFJlZmxlY3Qub3duS2V5c2AgZm9yIHNvbWUgZGV2aWNlcyBpbiBSZWFjdCBOYXRpdmUgKCM0MSksIHNvIHdlIGV4cGxpY2l0bHkgaWdub3JlIHRoZW0gaGVyZS5cblx0aWYgKHByb3BlcnR5ID09PSAnYXJndW1lbnRzJyB8fCBwcm9wZXJ0eSA9PT0gJ2NhbGxlcicpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCB0b0Rlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvLCBwcm9wZXJ0eSk7XG5cdGNvbnN0IGZyb21EZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihmcm9tLCBwcm9wZXJ0eSk7XG5cblx0aWYgKCFjYW5Db3B5UHJvcGVydHkodG9EZXNjcmlwdG9yLCBmcm9tRGVzY3JpcHRvcikgJiYgaWdub3JlTm9uQ29uZmlndXJhYmxlKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRvLCBwcm9wZXJ0eSwgZnJvbURlc2NyaXB0b3IpO1xufTtcblxuLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpYCB0aHJvd3MgaWYgdGhlIHByb3BlcnR5IGV4aXN0cywgaXMgbm90IGNvbmZpZ3VyYWJsZSBhbmQgZWl0aGVyOlxuLy8gLSBvbmUgaXRzIGRlc2NyaXB0b3JzIGlzIGNoYW5nZWRcbi8vIC0gaXQgaXMgbm9uLXdyaXRhYmxlIGFuZCBpdHMgdmFsdWUgaXMgY2hhbmdlZFxuY29uc3QgY2FuQ29weVByb3BlcnR5ID0gZnVuY3Rpb24gKHRvRGVzY3JpcHRvciwgZnJvbURlc2NyaXB0b3IpIHtcblx0cmV0dXJuIHRvRGVzY3JpcHRvciA9PT0gdW5kZWZpbmVkIHx8IHRvRGVzY3JpcHRvci5jb25maWd1cmFibGUgfHwgKFxuXHRcdHRvRGVzY3JpcHRvci53cml0YWJsZSA9PT0gZnJvbURlc2NyaXB0b3Iud3JpdGFibGUgJiZcblx0XHR0b0Rlc2NyaXB0b3IuZW51bWVyYWJsZSA9PT0gZnJvbURlc2NyaXB0b3IuZW51bWVyYWJsZSAmJlxuXHRcdHRvRGVzY3JpcHRvci5jb25maWd1cmFibGUgPT09IGZyb21EZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSAmJlxuXHRcdCh0b0Rlc2NyaXB0b3Iud3JpdGFibGUgfHwgdG9EZXNjcmlwdG9yLnZhbHVlID09PSBmcm9tRGVzY3JpcHRvci52YWx1ZSlcblx0KTtcbn07XG5cbmNvbnN0IGNoYW5nZVByb3RvdHlwZSA9ICh0bywgZnJvbSkgPT4ge1xuXHRjb25zdCBmcm9tUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGZyb20pO1xuXHRpZiAoZnJvbVByb3RvdHlwZSA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRvKSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdE9iamVjdC5zZXRQcm90b3R5cGVPZih0bywgZnJvbVByb3RvdHlwZSk7XG59O1xuXG5jb25zdCB3cmFwcGVkVG9TdHJpbmcgPSAod2l0aE5hbWUsIGZyb21Cb2R5KSA9PiBgLyogV3JhcHBlZCAke3dpdGhOYW1lfSovXFxuJHtmcm9tQm9keX1gO1xuXG5jb25zdCB0b1N0cmluZ0Rlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEZ1bmN0aW9uLnByb3RvdHlwZSwgJ3RvU3RyaW5nJyk7XG5jb25zdCB0b1N0cmluZ05hbWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywgJ25hbWUnKTtcblxuLy8gV2UgY2FsbCBgZnJvbS50b1N0cmluZygpYCBlYXJseSAobm90IGxhemlseSkgdG8gZW5zdXJlIGBmcm9tYCBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4vLyBXZSB1c2UgYGJpbmQoKWAgaW5zdGVhZCBvZiBhIGNsb3N1cmUgZm9yIHRoZSBzYW1lIHJlYXNvbi5cbi8vIENhbGxpbmcgYGZyb20udG9TdHJpbmcoKWAgZWFybHkgYWxzbyBhbGxvd3MgY2FjaGluZyBpdCBpbiBjYXNlIGB0by50b1N0cmluZygpYCBpcyBjYWxsZWQgc2V2ZXJhbCB0aW1lcy5cbmNvbnN0IGNoYW5nZVRvU3RyaW5nID0gKHRvLCBmcm9tLCBuYW1lKSA9PiB7XG5cdGNvbnN0IHdpdGhOYW1lID0gbmFtZSA9PT0gJycgPyAnJyA6IGB3aXRoICR7bmFtZS50cmltKCl9KCkgYDtcblx0Y29uc3QgbmV3VG9TdHJpbmcgPSB3cmFwcGVkVG9TdHJpbmcuYmluZChudWxsLCB3aXRoTmFtZSwgZnJvbS50b1N0cmluZygpKTtcblx0Ly8gRW5zdXJlIGB0by50b1N0cmluZy50b1N0cmluZ2AgaXMgbm9uLWVudW1lcmFibGUgYW5kIGhhcyB0aGUgc2FtZSBgc2FtZWBcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld1RvU3RyaW5nLCAnbmFtZScsIHRvU3RyaW5nTmFtZSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0bywgJ3RvU3RyaW5nJywgey4uLnRvU3RyaW5nRGVzY3JpcHRvciwgdmFsdWU6IG5ld1RvU3RyaW5nfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtaW1pY0Z1bmN0aW9uKHRvLCBmcm9tLCB7aWdub3JlTm9uQ29uZmlndXJhYmxlID0gZmFsc2V9ID0ge30pIHtcblx0Y29uc3Qge25hbWV9ID0gdG87XG5cblx0Zm9yIChjb25zdCBwcm9wZXJ0eSBvZiBSZWZsZWN0Lm93bktleXMoZnJvbSkpIHtcblx0XHRjb3B5UHJvcGVydHkodG8sIGZyb20sIHByb3BlcnR5LCBpZ25vcmVOb25Db25maWd1cmFibGUpO1xuXHR9XG5cblx0Y2hhbmdlUHJvdG90eXBlKHRvLCBmcm9tKTtcblx0Y2hhbmdlVG9TdHJpbmcodG8sIGZyb20sIG5hbWUpO1xuXG5cdHJldHVybiB0bztcbn1cbiIsICJpbXBvcnQgbWltaWNGdW5jdGlvbiBmcm9tICdtaW1pYy1mbic7XG5cbmNvbnN0IGNhbGxlZEZ1bmN0aW9ucyA9IG5ldyBXZWFrTWFwKCk7XG5cbmNvbnN0IG9uZXRpbWUgPSAoZnVuY3Rpb25fLCBvcHRpb25zID0ge30pID0+IHtcblx0aWYgKHR5cGVvZiBmdW5jdGlvbl8gIT09ICdmdW5jdGlvbicpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIGZ1bmN0aW9uJyk7XG5cdH1cblxuXHRsZXQgcmV0dXJuVmFsdWU7XG5cdGxldCBjYWxsQ291bnQgPSAwO1xuXHRjb25zdCBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbl8uZGlzcGxheU5hbWUgfHwgZnVuY3Rpb25fLm5hbWUgfHwgJzxhbm9ueW1vdXM+JztcblxuXHRjb25zdCBvbmV0aW1lID0gZnVuY3Rpb24gKC4uLmFyZ3VtZW50c18pIHtcblx0XHRjYWxsZWRGdW5jdGlvbnMuc2V0KG9uZXRpbWUsICsrY2FsbENvdW50KTtcblxuXHRcdGlmIChjYWxsQ291bnQgPT09IDEpIHtcblx0XHRcdHJldHVyblZhbHVlID0gZnVuY3Rpb25fLmFwcGx5KHRoaXMsIGFyZ3VtZW50c18pO1xuXHRcdFx0ZnVuY3Rpb25fID0gbnVsbDtcblx0XHR9IGVsc2UgaWYgKG9wdGlvbnMudGhyb3cgPT09IHRydWUpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRnVuY3Rpb24gXFxgJHtmdW5jdGlvbk5hbWV9XFxgIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlYCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJldHVyblZhbHVlO1xuXHR9O1xuXG5cdG1pbWljRnVuY3Rpb24ob25ldGltZSwgZnVuY3Rpb25fKTtcblx0Y2FsbGVkRnVuY3Rpb25zLnNldChvbmV0aW1lLCBjYWxsQ291bnQpO1xuXG5cdHJldHVybiBvbmV0aW1lO1xufTtcblxub25ldGltZS5jYWxsQ291bnQgPSBmdW5jdGlvbl8gPT4ge1xuXHRpZiAoIWNhbGxlZEZ1bmN0aW9ucy5oYXMoZnVuY3Rpb25fKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgVGhlIGdpdmVuIGZ1bmN0aW9uIFxcYCR7ZnVuY3Rpb25fLm5hbWV9XFxgIGlzIG5vdCB3cmFwcGVkIGJ5IHRoZSBcXGBvbmV0aW1lXFxgIHBhY2thZ2VgKTtcblx0fVxuXG5cdHJldHVybiBjYWxsZWRGdW5jdGlvbnMuZ2V0KGZ1bmN0aW9uXyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBvbmV0aW1lO1xuIiwgImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQge3NpZ25hbHNCeU5hbWV9IGZyb20gJ2h1bWFuLXNpZ25hbHMnO1xuXG5jb25zdCBnZXRFcnJvclByZWZpeCA9ICh7dGltZWRPdXQsIHRpbWVvdXQsIGVycm9yQ29kZSwgc2lnbmFsLCBzaWduYWxEZXNjcmlwdGlvbiwgZXhpdENvZGUsIGlzQ2FuY2VsZWR9KSA9PiB7XG5cdGlmICh0aW1lZE91dCkge1xuXHRcdHJldHVybiBgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH0gbWlsbGlzZWNvbmRzYDtcblx0fVxuXG5cdGlmIChpc0NhbmNlbGVkKSB7XG5cdFx0cmV0dXJuICd3YXMgY2FuY2VsZWQnO1xuXHR9XG5cblx0aWYgKGVycm9yQ29kZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGBmYWlsZWQgd2l0aCAke2Vycm9yQ29kZX1gO1xuXHR9XG5cblx0aWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGB3YXMga2lsbGVkIHdpdGggJHtzaWduYWx9ICgke3NpZ25hbERlc2NyaXB0aW9ufSlgO1xuXHR9XG5cblx0aWYgKGV4aXRDb2RlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gYGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2V4aXRDb2RlfWA7XG5cdH1cblxuXHRyZXR1cm4gJ2ZhaWxlZCc7XG59O1xuXG5leHBvcnQgY29uc3QgbWFrZUVycm9yID0gKHtcblx0c3Rkb3V0LFxuXHRzdGRlcnIsXG5cdGFsbCxcblx0ZXJyb3IsXG5cdHNpZ25hbCxcblx0ZXhpdENvZGUsXG5cdGNvbW1hbmQsXG5cdGVzY2FwZWRDb21tYW5kLFxuXHR0aW1lZE91dCxcblx0aXNDYW5jZWxlZCxcblx0a2lsbGVkLFxuXHRwYXJzZWQ6IHtvcHRpb25zOiB7dGltZW91dCwgY3dkID0gcHJvY2Vzcy5jd2QoKX19LFxufSkgPT4ge1xuXHQvLyBgc2lnbmFsYCBhbmQgYGV4aXRDb2RlYCBlbWl0dGVkIG9uIGBzcGF3bmVkLm9uKCdleGl0JylgIGV2ZW50IGNhbiBiZSBgbnVsbGAuXG5cdC8vIFdlIG5vcm1hbGl6ZSB0aGVtIHRvIGB1bmRlZmluZWRgXG5cdGV4aXRDb2RlID0gZXhpdENvZGUgPT09IG51bGwgPyB1bmRlZmluZWQgOiBleGl0Q29kZTtcblx0c2lnbmFsID0gc2lnbmFsID09PSBudWxsID8gdW5kZWZpbmVkIDogc2lnbmFsO1xuXHRjb25zdCBzaWduYWxEZXNjcmlwdGlvbiA9IHNpZ25hbCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2lnbmFsc0J5TmFtZVtzaWduYWxdLmRlc2NyaXB0aW9uO1xuXG5cdGNvbnN0IGVycm9yQ29kZSA9IGVycm9yICYmIGVycm9yLmNvZGU7XG5cblx0Y29uc3QgcHJlZml4ID0gZ2V0RXJyb3JQcmVmaXgoe3RpbWVkT3V0LCB0aW1lb3V0LCBlcnJvckNvZGUsIHNpZ25hbCwgc2lnbmFsRGVzY3JpcHRpb24sIGV4aXRDb2RlLCBpc0NhbmNlbGVkfSk7XG5cdGNvbnN0IGV4ZWNhTWVzc2FnZSA9IGBDb21tYW5kICR7cHJlZml4fTogJHtjb21tYW5kfWA7XG5cdGNvbnN0IGlzRXJyb3IgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZXJyb3IpID09PSAnW29iamVjdCBFcnJvcl0nO1xuXHRjb25zdCBzaG9ydE1lc3NhZ2UgPSBpc0Vycm9yID8gYCR7ZXhlY2FNZXNzYWdlfVxcbiR7ZXJyb3IubWVzc2FnZX1gIDogZXhlY2FNZXNzYWdlO1xuXHRjb25zdCBtZXNzYWdlID0gW3Nob3J0TWVzc2FnZSwgc3RkZXJyLCBzdGRvdXRdLmZpbHRlcihCb29sZWFuKS5qb2luKCdcXG4nKTtcblxuXHRpZiAoaXNFcnJvcikge1xuXHRcdGVycm9yLm9yaWdpbmFsTWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG5cdFx0ZXJyb3IubWVzc2FnZSA9IG1lc3NhZ2U7XG5cdH0gZWxzZSB7XG5cdFx0ZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG5cdH1cblxuXHRlcnJvci5zaG9ydE1lc3NhZ2UgPSBzaG9ydE1lc3NhZ2U7XG5cdGVycm9yLmNvbW1hbmQgPSBjb21tYW5kO1xuXHRlcnJvci5lc2NhcGVkQ29tbWFuZCA9IGVzY2FwZWRDb21tYW5kO1xuXHRlcnJvci5leGl0Q29kZSA9IGV4aXRDb2RlO1xuXHRlcnJvci5zaWduYWwgPSBzaWduYWw7XG5cdGVycm9yLnNpZ25hbERlc2NyaXB0aW9uID0gc2lnbmFsRGVzY3JpcHRpb247XG5cdGVycm9yLnN0ZG91dCA9IHN0ZG91dDtcblx0ZXJyb3Iuc3RkZXJyID0gc3RkZXJyO1xuXHRlcnJvci5jd2QgPSBjd2Q7XG5cblx0aWYgKGFsbCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0ZXJyb3IuYWxsID0gYWxsO1xuXHR9XG5cblx0aWYgKCdidWZmZXJlZERhdGEnIGluIGVycm9yKSB7XG5cdFx0ZGVsZXRlIGVycm9yLmJ1ZmZlcmVkRGF0YTtcblx0fVxuXG5cdGVycm9yLmZhaWxlZCA9IHRydWU7XG5cdGVycm9yLnRpbWVkT3V0ID0gQm9vbGVhbih0aW1lZE91dCk7XG5cdGVycm9yLmlzQ2FuY2VsZWQgPSBpc0NhbmNlbGVkO1xuXHRlcnJvci5raWxsZWQgPSBraWxsZWQgJiYgIXRpbWVkT3V0O1xuXG5cdHJldHVybiBlcnJvcjtcbn07XG4iLCAiaW1wb3J0e2NvbnN0YW50c31mcm9tXCJub2RlOm9zXCI7XG5cbmltcG9ydHtTSUdSVE1BWH1mcm9tXCIuL3JlYWx0aW1lLmpzXCI7XG5pbXBvcnR7Z2V0U2lnbmFsc31mcm9tXCIuL3NpZ25hbHMuanNcIjtcblxuXG5cbmNvbnN0IGdldFNpZ25hbHNCeU5hbWU9KCk9PntcbmNvbnN0IHNpZ25hbHM9Z2V0U2lnbmFscygpO1xucmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhzaWduYWxzLm1hcChnZXRTaWduYWxCeU5hbWUpKTtcbn07XG5cbmNvbnN0IGdldFNpZ25hbEJ5TmFtZT0oe1xubmFtZSxcbm51bWJlcixcbmRlc2NyaXB0aW9uLFxuc3VwcG9ydGVkLFxuYWN0aW9uLFxuZm9yY2VkLFxuc3RhbmRhcmRcbn0pPT5bbmFtZSx7bmFtZSxudW1iZXIsZGVzY3JpcHRpb24sc3VwcG9ydGVkLGFjdGlvbixmb3JjZWQsc3RhbmRhcmR9XTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbHNCeU5hbWU9Z2V0U2lnbmFsc0J5TmFtZSgpO1xuXG5cblxuXG5jb25zdCBnZXRTaWduYWxzQnlOdW1iZXI9KCk9PntcbmNvbnN0IHNpZ25hbHM9Z2V0U2lnbmFscygpO1xuY29uc3QgbGVuZ3RoPVNJR1JUTUFYKzE7XG5jb25zdCBzaWduYWxzQT1BcnJheS5mcm9tKHtsZW5ndGh9LCh2YWx1ZSxudW1iZXIpPT5cbmdldFNpZ25hbEJ5TnVtYmVyKG51bWJlcixzaWduYWxzKSk7XG5cbnJldHVybiBPYmplY3QuYXNzaWduKHt9LC4uLnNpZ25hbHNBKTtcbn07XG5cbmNvbnN0IGdldFNpZ25hbEJ5TnVtYmVyPShudW1iZXIsc2lnbmFscyk9PntcbmNvbnN0IHNpZ25hbD1maW5kU2lnbmFsQnlOdW1iZXIobnVtYmVyLHNpZ25hbHMpO1xuXG5pZihzaWduYWw9PT11bmRlZmluZWQpe1xucmV0dXJue307XG59XG5cbmNvbnN0e25hbWUsZGVzY3JpcHRpb24sc3VwcG9ydGVkLGFjdGlvbixmb3JjZWQsc3RhbmRhcmR9PXNpZ25hbDtcbnJldHVybntcbltudW1iZXJdOntcbm5hbWUsXG5udW1iZXIsXG5kZXNjcmlwdGlvbixcbnN1cHBvcnRlZCxcbmFjdGlvbixcbmZvcmNlZCxcbnN0YW5kYXJkXG59XG59O1xufTtcblxuXG5cbmNvbnN0IGZpbmRTaWduYWxCeU51bWJlcj0obnVtYmVyLHNpZ25hbHMpPT57XG5jb25zdCBzaWduYWw9c2lnbmFscy5maW5kKCh7bmFtZX0pPT5jb25zdGFudHMuc2lnbmFsc1tuYW1lXT09PW51bWJlcik7XG5cbmlmKHNpZ25hbCE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gc2lnbmFsO1xufVxuXG5yZXR1cm4gc2lnbmFscy5maW5kKChzaWduYWxBKT0+c2lnbmFsQS5udW1iZXI9PT1udW1iZXIpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbHNCeU51bWJlcj1nZXRTaWduYWxzQnlOdW1iZXIoKTsiLCAiXG5leHBvcnQgY29uc3QgZ2V0UmVhbHRpbWVTaWduYWxzPSgpPT57XG5jb25zdCBsZW5ndGg9U0lHUlRNQVgtU0lHUlRNSU4rMTtcbnJldHVybiBBcnJheS5mcm9tKHtsZW5ndGh9LGdldFJlYWx0aW1lU2lnbmFsKTtcbn07XG5cbmNvbnN0IGdldFJlYWx0aW1lU2lnbmFsPSh2YWx1ZSxpbmRleCk9Pih7XG5uYW1lOmBTSUdSVCR7aW5kZXgrMX1gLFxubnVtYmVyOlNJR1JUTUlOK2luZGV4LFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIkFwcGxpY2F0aW9uLXNwZWNpZmljIHNpZ25hbCAocmVhbHRpbWUpXCIsXG5zdGFuZGFyZDpcInBvc2l4XCJcbn0pO1xuXG5jb25zdCBTSUdSVE1JTj0zNDtcbmV4cG9ydCBjb25zdCBTSUdSVE1BWD02NDsiLCAiaW1wb3J0e2NvbnN0YW50c31mcm9tXCJub2RlOm9zXCI7XG5cbmltcG9ydHtTSUdOQUxTfWZyb21cIi4vY29yZS5qc1wiO1xuaW1wb3J0e2dldFJlYWx0aW1lU2lnbmFsc31mcm9tXCIuL3JlYWx0aW1lLmpzXCI7XG5cblxuXG5leHBvcnQgY29uc3QgZ2V0U2lnbmFscz0oKT0+e1xuY29uc3QgcmVhbHRpbWVTaWduYWxzPWdldFJlYWx0aW1lU2lnbmFscygpO1xuY29uc3Qgc2lnbmFscz1bLi4uU0lHTkFMUywuLi5yZWFsdGltZVNpZ25hbHNdLm1hcChub3JtYWxpemVTaWduYWwpO1xucmV0dXJuIHNpZ25hbHM7XG59O1xuXG5cblxuXG5cblxuXG5jb25zdCBub3JtYWxpemVTaWduYWw9KHtcbm5hbWUsXG5udW1iZXI6ZGVmYXVsdE51bWJlcixcbmRlc2NyaXB0aW9uLFxuYWN0aW9uLFxuZm9yY2VkPWZhbHNlLFxuc3RhbmRhcmRcbn0pPT57XG5jb25zdHtcbnNpZ25hbHM6e1tuYW1lXTpjb25zdGFudFNpZ25hbH1cbn09Y29uc3RhbnRzO1xuY29uc3Qgc3VwcG9ydGVkPWNvbnN0YW50U2lnbmFsIT09dW5kZWZpbmVkO1xuY29uc3QgbnVtYmVyPXN1cHBvcnRlZD9jb25zdGFudFNpZ25hbDpkZWZhdWx0TnVtYmVyO1xucmV0dXJue25hbWUsbnVtYmVyLGRlc2NyaXB0aW9uLHN1cHBvcnRlZCxhY3Rpb24sZm9yY2VkLHN0YW5kYXJkfTtcbn07IiwgIlxuXG5leHBvcnQgY29uc3QgU0lHTkFMUz1bXG57XG5uYW1lOlwiU0lHSFVQXCIsXG5udW1iZXI6MSxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJUZXJtaW5hbCBjbG9zZWRcIixcbnN0YW5kYXJkOlwicG9zaXhcIlxufSxcbntcbm5hbWU6XCJTSUdJTlRcIixcbm51bWJlcjoyLFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIlVzZXIgaW50ZXJydXB0aW9uIHdpdGggQ1RSTC1DXCIsXG5zdGFuZGFyZDpcImFuc2lcIlxufSxcbntcbm5hbWU6XCJTSUdRVUlUXCIsXG5udW1iZXI6MyxcbmFjdGlvbjpcImNvcmVcIixcbmRlc2NyaXB0aW9uOlwiVXNlciBpbnRlcnJ1cHRpb24gd2l0aCBDVFJMLVxcXFxcIixcbnN0YW5kYXJkOlwicG9zaXhcIlxufSxcbntcbm5hbWU6XCJTSUdJTExcIixcbm51bWJlcjo0LFxuYWN0aW9uOlwiY29yZVwiLFxuZGVzY3JpcHRpb246XCJJbnZhbGlkIG1hY2hpbmUgaW5zdHJ1Y3Rpb25cIixcbnN0YW5kYXJkOlwiYW5zaVwiXG59LFxue1xubmFtZTpcIlNJR1RSQVBcIixcbm51bWJlcjo1LFxuYWN0aW9uOlwiY29yZVwiLFxuZGVzY3JpcHRpb246XCJEZWJ1Z2dlciBicmVha3BvaW50XCIsXG5zdGFuZGFyZDpcInBvc2l4XCJcbn0sXG57XG5uYW1lOlwiU0lHQUJSVFwiLFxubnVtYmVyOjYsXG5hY3Rpb246XCJjb3JlXCIsXG5kZXNjcmlwdGlvbjpcIkFib3J0ZWRcIixcbnN0YW5kYXJkOlwiYW5zaVwiXG59LFxue1xubmFtZTpcIlNJR0lPVFwiLFxubnVtYmVyOjYsXG5hY3Rpb246XCJjb3JlXCIsXG5kZXNjcmlwdGlvbjpcIkFib3J0ZWRcIixcbnN0YW5kYXJkOlwiYnNkXCJcbn0sXG57XG5uYW1lOlwiU0lHQlVTXCIsXG5udW1iZXI6NyxcbmFjdGlvbjpcImNvcmVcIixcbmRlc2NyaXB0aW9uOlxuXCJCdXMgZXJyb3IgZHVlIHRvIG1pc2FsaWduZWQsIG5vbi1leGlzdGluZyBhZGRyZXNzIG9yIHBhZ2luZyBlcnJvclwiLFxuc3RhbmRhcmQ6XCJic2RcIlxufSxcbntcbm5hbWU6XCJTSUdFTVRcIixcbm51bWJlcjo3LFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIkNvbW1hbmQgc2hvdWxkIGJlIGVtdWxhdGVkIGJ1dCBpcyBub3QgaW1wbGVtZW50ZWRcIixcbnN0YW5kYXJkOlwib3RoZXJcIlxufSxcbntcbm5hbWU6XCJTSUdGUEVcIixcbm51bWJlcjo4LFxuYWN0aW9uOlwiY29yZVwiLFxuZGVzY3JpcHRpb246XCJGbG9hdGluZyBwb2ludCBhcml0aG1ldGljIGVycm9yXCIsXG5zdGFuZGFyZDpcImFuc2lcIlxufSxcbntcbm5hbWU6XCJTSUdLSUxMXCIsXG5udW1iZXI6OSxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJGb3JjZWQgdGVybWluYXRpb25cIixcbnN0YW5kYXJkOlwicG9zaXhcIixcbmZvcmNlZDp0cnVlXG59LFxue1xubmFtZTpcIlNJR1VTUjFcIixcbm51bWJlcjoxMCxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJBcHBsaWNhdGlvbi1zcGVjaWZpYyBzaWduYWxcIixcbnN0YW5kYXJkOlwicG9zaXhcIlxufSxcbntcbm5hbWU6XCJTSUdTRUdWXCIsXG5udW1iZXI6MTEsXG5hY3Rpb246XCJjb3JlXCIsXG5kZXNjcmlwdGlvbjpcIlNlZ21lbnRhdGlvbiBmYXVsdFwiLFxuc3RhbmRhcmQ6XCJhbnNpXCJcbn0sXG57XG5uYW1lOlwiU0lHVVNSMlwiLFxubnVtYmVyOjEyLFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIkFwcGxpY2F0aW9uLXNwZWNpZmljIHNpZ25hbFwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwiXG59LFxue1xubmFtZTpcIlNJR1BJUEVcIixcbm51bWJlcjoxMyxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJCcm9rZW4gcGlwZSBvciBzb2NrZXRcIixcbnN0YW5kYXJkOlwicG9zaXhcIlxufSxcbntcbm5hbWU6XCJTSUdBTFJNXCIsXG5udW1iZXI6MTQsXG5hY3Rpb246XCJ0ZXJtaW5hdGVcIixcbmRlc2NyaXB0aW9uOlwiVGltZW91dCBvciB0aW1lclwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwiXG59LFxue1xubmFtZTpcIlNJR1RFUk1cIixcbm51bWJlcjoxNSxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJUZXJtaW5hdGlvblwiLFxuc3RhbmRhcmQ6XCJhbnNpXCJcbn0sXG57XG5uYW1lOlwiU0lHU1RLRkxUXCIsXG5udW1iZXI6MTYsXG5hY3Rpb246XCJ0ZXJtaW5hdGVcIixcbmRlc2NyaXB0aW9uOlwiU3RhY2sgaXMgZW1wdHkgb3Igb3ZlcmZsb3dlZFwiLFxuc3RhbmRhcmQ6XCJvdGhlclwiXG59LFxue1xubmFtZTpcIlNJR0NITERcIixcbm51bWJlcjoxNyxcbmFjdGlvbjpcImlnbm9yZVwiLFxuZGVzY3JpcHRpb246XCJDaGlsZCBwcm9jZXNzIHRlcm1pbmF0ZWQsIHBhdXNlZCBvciB1bnBhdXNlZFwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwiXG59LFxue1xubmFtZTpcIlNJR0NMRFwiLFxubnVtYmVyOjE3LFxuYWN0aW9uOlwiaWdub3JlXCIsXG5kZXNjcmlwdGlvbjpcIkNoaWxkIHByb2Nlc3MgdGVybWluYXRlZCwgcGF1c2VkIG9yIHVucGF1c2VkXCIsXG5zdGFuZGFyZDpcIm90aGVyXCJcbn0sXG57XG5uYW1lOlwiU0lHQ09OVFwiLFxubnVtYmVyOjE4LFxuYWN0aW9uOlwidW5wYXVzZVwiLFxuZGVzY3JpcHRpb246XCJVbnBhdXNlZFwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwiLFxuZm9yY2VkOnRydWVcbn0sXG57XG5uYW1lOlwiU0lHU1RPUFwiLFxubnVtYmVyOjE5LFxuYWN0aW9uOlwicGF1c2VcIixcbmRlc2NyaXB0aW9uOlwiUGF1c2VkXCIsXG5zdGFuZGFyZDpcInBvc2l4XCIsXG5mb3JjZWQ6dHJ1ZVxufSxcbntcbm5hbWU6XCJTSUdUU1RQXCIsXG5udW1iZXI6MjAsXG5hY3Rpb246XCJwYXVzZVwiLFxuZGVzY3JpcHRpb246XCJQYXVzZWQgdXNpbmcgQ1RSTC1aIG9yIFxcXCJzdXNwZW5kXFxcIlwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwiXG59LFxue1xubmFtZTpcIlNJR1RUSU5cIixcbm51bWJlcjoyMSxcbmFjdGlvbjpcInBhdXNlXCIsXG5kZXNjcmlwdGlvbjpcIkJhY2tncm91bmQgcHJvY2VzcyBjYW5ub3QgcmVhZCB0ZXJtaW5hbCBpbnB1dFwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwiXG59LFxue1xubmFtZTpcIlNJR0JSRUFLXCIsXG5udW1iZXI6MjEsXG5hY3Rpb246XCJ0ZXJtaW5hdGVcIixcbmRlc2NyaXB0aW9uOlwiVXNlciBpbnRlcnJ1cHRpb24gd2l0aCBDVFJMLUJSRUFLXCIsXG5zdGFuZGFyZDpcIm90aGVyXCJcbn0sXG57XG5uYW1lOlwiU0lHVFRPVVwiLFxubnVtYmVyOjIyLFxuYWN0aW9uOlwicGF1c2VcIixcbmRlc2NyaXB0aW9uOlwiQmFja2dyb3VuZCBwcm9jZXNzIGNhbm5vdCB3cml0ZSB0byB0ZXJtaW5hbCBvdXRwdXRcIixcbnN0YW5kYXJkOlwicG9zaXhcIlxufSxcbntcbm5hbWU6XCJTSUdVUkdcIixcbm51bWJlcjoyMyxcbmFjdGlvbjpcImlnbm9yZVwiLFxuZGVzY3JpcHRpb246XCJTb2NrZXQgcmVjZWl2ZWQgb3V0LW9mLWJhbmQgZGF0YVwiLFxuc3RhbmRhcmQ6XCJic2RcIlxufSxcbntcbm5hbWU6XCJTSUdYQ1BVXCIsXG5udW1iZXI6MjQsXG5hY3Rpb246XCJjb3JlXCIsXG5kZXNjcmlwdGlvbjpcIlByb2Nlc3MgdGltZWQgb3V0XCIsXG5zdGFuZGFyZDpcImJzZFwiXG59LFxue1xubmFtZTpcIlNJR1hGU1pcIixcbm51bWJlcjoyNSxcbmFjdGlvbjpcImNvcmVcIixcbmRlc2NyaXB0aW9uOlwiRmlsZSB0b28gYmlnXCIsXG5zdGFuZGFyZDpcImJzZFwiXG59LFxue1xubmFtZTpcIlNJR1ZUQUxSTVwiLFxubnVtYmVyOjI2LFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIlRpbWVvdXQgb3IgdGltZXJcIixcbnN0YW5kYXJkOlwiYnNkXCJcbn0sXG57XG5uYW1lOlwiU0lHUFJPRlwiLFxubnVtYmVyOjI3LFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIlRpbWVvdXQgb3IgdGltZXJcIixcbnN0YW5kYXJkOlwiYnNkXCJcbn0sXG57XG5uYW1lOlwiU0lHV0lOQ0hcIixcbm51bWJlcjoyOCxcbmFjdGlvbjpcImlnbm9yZVwiLFxuZGVzY3JpcHRpb246XCJUZXJtaW5hbCB3aW5kb3cgc2l6ZSBjaGFuZ2VkXCIsXG5zdGFuZGFyZDpcImJzZFwiXG59LFxue1xubmFtZTpcIlNJR0lPXCIsXG5udW1iZXI6MjksXG5hY3Rpb246XCJ0ZXJtaW5hdGVcIixcbmRlc2NyaXB0aW9uOlwiSS9PIGlzIGF2YWlsYWJsZVwiLFxuc3RhbmRhcmQ6XCJvdGhlclwiXG59LFxue1xubmFtZTpcIlNJR1BPTExcIixcbm51bWJlcjoyOSxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJXYXRjaGVkIGV2ZW50XCIsXG5zdGFuZGFyZDpcIm90aGVyXCJcbn0sXG57XG5uYW1lOlwiU0lHSU5GT1wiLFxubnVtYmVyOjI5LFxuYWN0aW9uOlwiaWdub3JlXCIsXG5kZXNjcmlwdGlvbjpcIlJlcXVlc3QgZm9yIHByb2Nlc3MgaW5mb3JtYXRpb25cIixcbnN0YW5kYXJkOlwib3RoZXJcIlxufSxcbntcbm5hbWU6XCJTSUdQV1JcIixcbm51bWJlcjozMCxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJEZXZpY2UgcnVubmluZyBvdXQgb2YgcG93ZXJcIixcbnN0YW5kYXJkOlwic3lzdGVtdlwiXG59LFxue1xubmFtZTpcIlNJR1NZU1wiLFxubnVtYmVyOjMxLFxuYWN0aW9uOlwiY29yZVwiLFxuZGVzY3JpcHRpb246XCJJbnZhbGlkIHN5c3RlbSBjYWxsXCIsXG5zdGFuZGFyZDpcIm90aGVyXCJcbn0sXG57XG5uYW1lOlwiU0lHVU5VU0VEXCIsXG5udW1iZXI6MzEsXG5hY3Rpb246XCJ0ZXJtaW5hdGVcIixcbmRlc2NyaXB0aW9uOlwiSW52YWxpZCBzeXN0ZW0gY2FsbFwiLFxuc3RhbmRhcmQ6XCJvdGhlclwiXG59XTsiLCAiY29uc3QgYWxpYXNlcyA9IFsnc3RkaW4nLCAnc3Rkb3V0JywgJ3N0ZGVyciddO1xuXG5jb25zdCBoYXNBbGlhcyA9IG9wdGlvbnMgPT4gYWxpYXNlcy5zb21lKGFsaWFzID0+IG9wdGlvbnNbYWxpYXNdICE9PSB1bmRlZmluZWQpO1xuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplU3RkaW8gPSBvcHRpb25zID0+IHtcblx0aWYgKCFvcHRpb25zKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3Qge3N0ZGlvfSA9IG9wdGlvbnM7XG5cblx0aWYgKHN0ZGlvID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gYWxpYXNlcy5tYXAoYWxpYXMgPT4gb3B0aW9uc1thbGlhc10pO1xuXHR9XG5cblx0aWYgKGhhc0FsaWFzKG9wdGlvbnMpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBJdCdzIG5vdCBwb3NzaWJsZSB0byBwcm92aWRlIFxcYHN0ZGlvXFxgIGluIGNvbWJpbmF0aW9uIHdpdGggb25lIG9mICR7YWxpYXNlcy5tYXAoYWxpYXMgPT4gYFxcYCR7YWxpYXN9XFxgYCkuam9pbignLCAnKX1gKTtcblx0fVxuXG5cdGlmICh0eXBlb2Ygc3RkaW8gPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIHN0ZGlvO1xuXHR9XG5cblx0aWYgKCFBcnJheS5pc0FycmF5KHN0ZGlvKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYHN0ZGlvXFxgIHRvIGJlIG9mIHR5cGUgXFxgc3RyaW5nXFxgIG9yIFxcYEFycmF5XFxgLCBnb3QgXFxgJHt0eXBlb2Ygc3RkaW99XFxgYCk7XG5cdH1cblxuXHRjb25zdCBsZW5ndGggPSBNYXRoLm1heChzdGRpby5sZW5ndGgsIGFsaWFzZXMubGVuZ3RoKTtcblx0cmV0dXJuIEFycmF5LmZyb20oe2xlbmd0aH0sICh2YWx1ZSwgaW5kZXgpID0+IHN0ZGlvW2luZGV4XSk7XG59O1xuXG4vLyBgaXBjYCBpcyBwdXNoZWQgdW5sZXNzIGl0IGlzIGFscmVhZHkgcHJlc2VudFxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVN0ZGlvTm9kZSA9IG9wdGlvbnMgPT4ge1xuXHRjb25zdCBzdGRpbyA9IG5vcm1hbGl6ZVN0ZGlvKG9wdGlvbnMpO1xuXG5cdGlmIChzdGRpbyA9PT0gJ2lwYycpIHtcblx0XHRyZXR1cm4gJ2lwYyc7XG5cdH1cblxuXHRpZiAoc3RkaW8gPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Ygc3RkaW8gPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIFtzdGRpbywgc3RkaW8sIHN0ZGlvLCAnaXBjJ107XG5cdH1cblxuXHRpZiAoc3RkaW8uaW5jbHVkZXMoJ2lwYycpKSB7XG5cdFx0cmV0dXJuIHN0ZGlvO1xuXHR9XG5cblx0cmV0dXJuIFsuLi5zdGRpbywgJ2lwYyddO1xufTtcbiIsICJpbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgb25FeGl0IGZyb20gJ3NpZ25hbC1leGl0JztcblxuY29uc3QgREVGQVVMVF9GT1JDRV9LSUxMX1RJTUVPVVQgPSAxMDAwICogNTtcblxuLy8gTW9ua2V5LXBhdGNoZXMgYGNoaWxkUHJvY2Vzcy5raWxsKClgIHRvIGFkZCBgZm9yY2VLaWxsQWZ0ZXJUaW1lb3V0YCBiZWhhdmlvclxuZXhwb3J0IGNvbnN0IHNwYXduZWRLaWxsID0gKGtpbGwsIHNpZ25hbCA9ICdTSUdURVJNJywgb3B0aW9ucyA9IHt9KSA9PiB7XG5cdGNvbnN0IGtpbGxSZXN1bHQgPSBraWxsKHNpZ25hbCk7XG5cdHNldEtpbGxUaW1lb3V0KGtpbGwsIHNpZ25hbCwgb3B0aW9ucywga2lsbFJlc3VsdCk7XG5cdHJldHVybiBraWxsUmVzdWx0O1xufTtcblxuY29uc3Qgc2V0S2lsbFRpbWVvdXQgPSAoa2lsbCwgc2lnbmFsLCBvcHRpb25zLCBraWxsUmVzdWx0KSA9PiB7XG5cdGlmICghc2hvdWxkRm9yY2VLaWxsKHNpZ25hbCwgb3B0aW9ucywga2lsbFJlc3VsdCkpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCB0aW1lb3V0ID0gZ2V0Rm9yY2VLaWxsQWZ0ZXJUaW1lb3V0KG9wdGlvbnMpO1xuXHRjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0a2lsbCgnU0lHS0lMTCcpO1xuXHR9LCB0aW1lb3V0KTtcblxuXHQvLyBHdWFyZGVkIGJlY2F1c2UgdGhlcmUncyBubyBgLnVucmVmKClgIHdoZW4gYGV4ZWNhYCBpcyB1c2VkIGluIHRoZSByZW5kZXJlclxuXHQvLyBwcm9jZXNzIGluIEVsZWN0cm9uLiBUaGlzIGNhbm5vdCBiZSB0ZXN0ZWQgc2luY2Ugd2UgZG9uJ3QgcnVuIHRlc3RzIGluXG5cdC8vIEVsZWN0cm9uLlxuXHQvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuXHRpZiAodC51bnJlZikge1xuXHRcdHQudW5yZWYoKTtcblx0fVxufTtcblxuY29uc3Qgc2hvdWxkRm9yY2VLaWxsID0gKHNpZ25hbCwge2ZvcmNlS2lsbEFmdGVyVGltZW91dH0sIGtpbGxSZXN1bHQpID0+IGlzU2lndGVybShzaWduYWwpICYmIGZvcmNlS2lsbEFmdGVyVGltZW91dCAhPT0gZmFsc2UgJiYga2lsbFJlc3VsdDtcblxuY29uc3QgaXNTaWd0ZXJtID0gc2lnbmFsID0+IHNpZ25hbCA9PT0gb3MuY29uc3RhbnRzLnNpZ25hbHMuU0lHVEVSTVxuXHRcdHx8ICh0eXBlb2Ygc2lnbmFsID09PSAnc3RyaW5nJyAmJiBzaWduYWwudG9VcHBlckNhc2UoKSA9PT0gJ1NJR1RFUk0nKTtcblxuY29uc3QgZ2V0Rm9yY2VLaWxsQWZ0ZXJUaW1lb3V0ID0gKHtmb3JjZUtpbGxBZnRlclRpbWVvdXQgPSB0cnVlfSkgPT4ge1xuXHRpZiAoZm9yY2VLaWxsQWZ0ZXJUaW1lb3V0ID09PSB0cnVlKSB7XG5cdFx0cmV0dXJuIERFRkFVTFRfRk9SQ0VfS0lMTF9USU1FT1VUO1xuXHR9XG5cblx0aWYgKCFOdW1iZXIuaXNGaW5pdGUoZm9yY2VLaWxsQWZ0ZXJUaW1lb3V0KSB8fCBmb3JjZUtpbGxBZnRlclRpbWVvdXQgPCAwKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgdGhlIFxcYGZvcmNlS2lsbEFmdGVyVGltZW91dFxcYCBvcHRpb24gdG8gYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290IFxcYCR7Zm9yY2VLaWxsQWZ0ZXJUaW1lb3V0fVxcYCAoJHt0eXBlb2YgZm9yY2VLaWxsQWZ0ZXJUaW1lb3V0fSlgKTtcblx0fVxuXG5cdHJldHVybiBmb3JjZUtpbGxBZnRlclRpbWVvdXQ7XG59O1xuXG4vLyBgY2hpbGRQcm9jZXNzLmNhbmNlbCgpYFxuZXhwb3J0IGNvbnN0IHNwYXduZWRDYW5jZWwgPSAoc3Bhd25lZCwgY29udGV4dCkgPT4ge1xuXHRjb25zdCBraWxsUmVzdWx0ID0gc3Bhd25lZC5raWxsKCk7XG5cblx0aWYgKGtpbGxSZXN1bHQpIHtcblx0XHRjb250ZXh0LmlzQ2FuY2VsZWQgPSB0cnVlO1xuXHR9XG59O1xuXG5jb25zdCB0aW1lb3V0S2lsbCA9IChzcGF3bmVkLCBzaWduYWwsIHJlamVjdCkgPT4ge1xuXHRzcGF3bmVkLmtpbGwoc2lnbmFsKTtcblx0cmVqZWN0KE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCdUaW1lZCBvdXQnKSwge3RpbWVkT3V0OiB0cnVlLCBzaWduYWx9KSk7XG59O1xuXG4vLyBgdGltZW91dGAgb3B0aW9uIGhhbmRsaW5nXG5leHBvcnQgY29uc3Qgc2V0dXBUaW1lb3V0ID0gKHNwYXduZWQsIHt0aW1lb3V0LCBraWxsU2lnbmFsID0gJ1NJR1RFUk0nfSwgc3Bhd25lZFByb21pc2UpID0+IHtcblx0aWYgKHRpbWVvdXQgPT09IDAgfHwgdGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHNwYXduZWRQcm9taXNlO1xuXHR9XG5cblx0bGV0IHRpbWVvdXRJZDtcblx0Y29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0dGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0aW1lb3V0S2lsbChzcGF3bmVkLCBraWxsU2lnbmFsLCByZWplY3QpO1xuXHRcdH0sIHRpbWVvdXQpO1xuXHR9KTtcblxuXHRjb25zdCBzYWZlU3Bhd25lZFByb21pc2UgPSBzcGF3bmVkUHJvbWlzZS5maW5hbGx5KCgpID0+IHtcblx0XHRjbGVhclRpbWVvdXQodGltZW91dElkKTtcblx0fSk7XG5cblx0cmV0dXJuIFByb21pc2UucmFjZShbdGltZW91dFByb21pc2UsIHNhZmVTcGF3bmVkUHJvbWlzZV0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVGltZW91dCA9ICh7dGltZW91dH0pID0+IHtcblx0aWYgKHRpbWVvdXQgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0Zpbml0ZSh0aW1lb3V0KSB8fCB0aW1lb3V0IDwgMCkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCB0aGUgXFxgdGltZW91dFxcYCBvcHRpb24gdG8gYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290IFxcYCR7dGltZW91dH1cXGAgKCR7dHlwZW9mIHRpbWVvdXR9KWApO1xuXHR9XG59O1xuXG4vLyBgY2xlYW51cGAgb3B0aW9uIGhhbmRsaW5nXG5leHBvcnQgY29uc3Qgc2V0RXhpdEhhbmRsZXIgPSBhc3luYyAoc3Bhd25lZCwge2NsZWFudXAsIGRldGFjaGVkfSwgdGltZWRQcm9taXNlKSA9PiB7XG5cdGlmICghY2xlYW51cCB8fCBkZXRhY2hlZCkge1xuXHRcdHJldHVybiB0aW1lZFByb21pc2U7XG5cdH1cblxuXHRjb25zdCByZW1vdmVFeGl0SGFuZGxlciA9IG9uRXhpdCgoKSA9PiB7XG5cdFx0c3Bhd25lZC5raWxsKCk7XG5cdH0pO1xuXG5cdHJldHVybiB0aW1lZFByb21pc2UuZmluYWxseSgoKSA9PiB7XG5cdFx0cmVtb3ZlRXhpdEhhbmRsZXIoKTtcblx0fSk7XG59O1xuIiwgImltcG9ydCB7Y3JlYXRlV3JpdGVTdHJlYW19IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtDaGlsZFByb2Nlc3N9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge2lzV3JpdGFibGVTdHJlYW19IGZyb20gJ2lzLXN0cmVhbSc7XG5cbmNvbnN0IGlzRXhlY2FDaGlsZFByb2Nlc3MgPSB0YXJnZXQgPT4gdGFyZ2V0IGluc3RhbmNlb2YgQ2hpbGRQcm9jZXNzICYmIHR5cGVvZiB0YXJnZXQudGhlbiA9PT0gJ2Z1bmN0aW9uJztcblxuY29uc3QgcGlwZVRvVGFyZ2V0ID0gKHNwYXduZWQsIHN0cmVhbU5hbWUsIHRhcmdldCkgPT4ge1xuXHRpZiAodHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycpIHtcblx0XHRzcGF3bmVkW3N0cmVhbU5hbWVdLnBpcGUoY3JlYXRlV3JpdGVTdHJlYW0odGFyZ2V0KSk7XG5cdFx0cmV0dXJuIHNwYXduZWQ7XG5cdH1cblxuXHRpZiAoaXNXcml0YWJsZVN0cmVhbSh0YXJnZXQpKSB7XG5cdFx0c3Bhd25lZFtzdHJlYW1OYW1lXS5waXBlKHRhcmdldCk7XG5cdFx0cmV0dXJuIHNwYXduZWQ7XG5cdH1cblxuXHRpZiAoIWlzRXhlY2FDaGlsZFByb2Nlc3ModGFyZ2V0KSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgYSBzdHJlYW0gb3IgYW4gRXhlY2EgY2hpbGQgcHJvY2Vzcy4nKTtcblx0fVxuXG5cdGlmICghaXNXcml0YWJsZVN0cmVhbSh0YXJnZXQuc3RkaW4pKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHRhcmdldCBjaGlsZCBwcm9jZXNzXFwncyBzdGRpbiBtdXN0IGJlIGF2YWlsYWJsZS4nKTtcblx0fVxuXG5cdHNwYXduZWRbc3RyZWFtTmFtZV0ucGlwZSh0YXJnZXQuc3RkaW4pO1xuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFBpcGVNZXRob2RzID0gc3Bhd25lZCA9PiB7XG5cdGlmIChzcGF3bmVkLnN0ZG91dCAhPT0gbnVsbCkge1xuXHRcdHNwYXduZWQucGlwZVN0ZG91dCA9IHBpcGVUb1RhcmdldC5iaW5kKHVuZGVmaW5lZCwgc3Bhd25lZCwgJ3N0ZG91dCcpO1xuXHR9XG5cblx0aWYgKHNwYXduZWQuc3RkZXJyICE9PSBudWxsKSB7XG5cdFx0c3Bhd25lZC5waXBlU3RkZXJyID0gcGlwZVRvVGFyZ2V0LmJpbmQodW5kZWZpbmVkLCBzcGF3bmVkLCAnc3RkZXJyJyk7XG5cdH1cblxuXHRpZiAoc3Bhd25lZC5hbGwgIT09IHVuZGVmaW5lZCkge1xuXHRcdHNwYXduZWQucGlwZUFsbCA9IHBpcGVUb1RhcmdldC5iaW5kKHVuZGVmaW5lZCwgc3Bhd25lZCwgJ2FsbCcpO1xuXHR9XG59O1xuIiwgImV4cG9ydCBmdW5jdGlvbiBpc1N0cmVhbShzdHJlYW0pIHtcblx0cmV0dXJuIHN0cmVhbSAhPT0gbnVsbFxuXHRcdCYmIHR5cGVvZiBzdHJlYW0gPT09ICdvYmplY3QnXG5cdFx0JiYgdHlwZW9mIHN0cmVhbS5waXBlID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXcml0YWJsZVN0cmVhbShzdHJlYW0pIHtcblx0cmV0dXJuIGlzU3RyZWFtKHN0cmVhbSlcblx0XHQmJiBzdHJlYW0ud3JpdGFibGUgIT09IGZhbHNlXG5cdFx0JiYgdHlwZW9mIHN0cmVhbS5fd3JpdGUgPT09ICdmdW5jdGlvbidcblx0XHQmJiB0eXBlb2Ygc3RyZWFtLl93cml0YWJsZVN0YXRlID09PSAnb2JqZWN0Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZGFibGVTdHJlYW0oc3RyZWFtKSB7XG5cdHJldHVybiBpc1N0cmVhbShzdHJlYW0pXG5cdFx0JiYgc3RyZWFtLnJlYWRhYmxlICE9PSBmYWxzZVxuXHRcdCYmIHR5cGVvZiBzdHJlYW0uX3JlYWQgPT09ICdmdW5jdGlvbidcblx0XHQmJiB0eXBlb2Ygc3RyZWFtLl9yZWFkYWJsZVN0YXRlID09PSAnb2JqZWN0Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRHVwbGV4U3RyZWFtKHN0cmVhbSkge1xuXHRyZXR1cm4gaXNXcml0YWJsZVN0cmVhbShzdHJlYW0pXG5cdFx0JiYgaXNSZWFkYWJsZVN0cmVhbShzdHJlYW0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUcmFuc2Zvcm1TdHJlYW0oc3RyZWFtKSB7XG5cdHJldHVybiBpc0R1cGxleFN0cmVhbShzdHJlYW0pXG5cdFx0JiYgdHlwZW9mIHN0cmVhbS5fdHJhbnNmb3JtID09PSAnZnVuY3Rpb24nO1xufVxuIiwgImltcG9ydCB7Y3JlYXRlUmVhZFN0cmVhbSwgcmVhZEZpbGVTeW5jfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7aXNTdHJlYW19IGZyb20gJ2lzLXN0cmVhbSc7XG5pbXBvcnQgZ2V0U3RyZWFtIGZyb20gJ2dldC1zdHJlYW0nO1xuaW1wb3J0IG1lcmdlU3RyZWFtIGZyb20gJ21lcmdlLXN0cmVhbSc7XG5cbmNvbnN0IHZhbGlkYXRlSW5wdXRPcHRpb25zID0gaW5wdXQgPT4ge1xuXHRpZiAoaW5wdXQgIT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBgaW5wdXRgIGFuZCBgaW5wdXRGaWxlYCBvcHRpb25zIGNhbm5vdCBiZSBib3RoIHNldC4nKTtcblx0fVxufTtcblxuY29uc3QgZ2V0SW5wdXRTeW5jID0gKHtpbnB1dCwgaW5wdXRGaWxlfSkgPT4ge1xuXHRpZiAodHlwZW9mIGlucHV0RmlsZSAhPT0gJ3N0cmluZycpIHtcblx0XHRyZXR1cm4gaW5wdXQ7XG5cdH1cblxuXHR2YWxpZGF0ZUlucHV0T3B0aW9ucyhpbnB1dCk7XG5cdHJldHVybiByZWFkRmlsZVN5bmMoaW5wdXRGaWxlKTtcbn07XG5cbi8vIGBpbnB1dGAgYW5kIGBpbnB1dEZpbGVgIG9wdGlvbiBpbiBzeW5jIG1vZGVcbmV4cG9ydCBjb25zdCBoYW5kbGVJbnB1dFN5bmMgPSBvcHRpb25zID0+IHtcblx0Y29uc3QgaW5wdXQgPSBnZXRJbnB1dFN5bmMob3B0aW9ucyk7XG5cblx0aWYgKGlzU3RyZWFtKGlucHV0KSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBgaW5wdXRgIG9wdGlvbiBjYW5ub3QgYmUgYSBzdHJlYW0gaW4gc3luYyBtb2RlJyk7XG5cdH1cblxuXHRyZXR1cm4gaW5wdXQ7XG59O1xuXG5jb25zdCBnZXRJbnB1dCA9ICh7aW5wdXQsIGlucHV0RmlsZX0pID0+IHtcblx0aWYgKHR5cGVvZiBpbnB1dEZpbGUgIT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIGlucHV0O1xuXHR9XG5cblx0dmFsaWRhdGVJbnB1dE9wdGlvbnMoaW5wdXQpO1xuXHRyZXR1cm4gY3JlYXRlUmVhZFN0cmVhbShpbnB1dEZpbGUpO1xufTtcblxuLy8gYGlucHV0YCBhbmQgYGlucHV0RmlsZWAgb3B0aW9uIGluIGFzeW5jIG1vZGVcbmV4cG9ydCBjb25zdCBoYW5kbGVJbnB1dCA9IChzcGF3bmVkLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IGlucHV0ID0gZ2V0SW5wdXQob3B0aW9ucyk7XG5cblx0aWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZiAoaXNTdHJlYW0oaW5wdXQpKSB7XG5cdFx0aW5wdXQucGlwZShzcGF3bmVkLnN0ZGluKTtcblx0fSBlbHNlIHtcblx0XHRzcGF3bmVkLnN0ZGluLmVuZChpbnB1dCk7XG5cdH1cbn07XG5cbi8vIGBhbGxgIGludGVybGVhdmVzIGBzdGRvdXRgIGFuZCBgc3RkZXJyYFxuZXhwb3J0IGNvbnN0IG1ha2VBbGxTdHJlYW0gPSAoc3Bhd25lZCwge2FsbH0pID0+IHtcblx0aWYgKCFhbGwgfHwgKCFzcGF3bmVkLnN0ZG91dCAmJiAhc3Bhd25lZC5zdGRlcnIpKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgbWl4ZWQgPSBtZXJnZVN0cmVhbSgpO1xuXG5cdGlmIChzcGF3bmVkLnN0ZG91dCkge1xuXHRcdG1peGVkLmFkZChzcGF3bmVkLnN0ZG91dCk7XG5cdH1cblxuXHRpZiAoc3Bhd25lZC5zdGRlcnIpIHtcblx0XHRtaXhlZC5hZGQoc3Bhd25lZC5zdGRlcnIpO1xuXHR9XG5cblx0cmV0dXJuIG1peGVkO1xufTtcblxuLy8gT24gZmFpbHVyZSwgYHJlc3VsdC5zdGRvdXR8c3RkZXJyfGFsbGAgc2hvdWxkIGNvbnRhaW4gdGhlIGN1cnJlbnRseSBidWZmZXJlZCBzdHJlYW1cbmNvbnN0IGdldEJ1ZmZlcmVkRGF0YSA9IGFzeW5jIChzdHJlYW0sIHN0cmVhbVByb21pc2UpID0+IHtcblx0Ly8gV2hlbiBgYnVmZmVyYCBpcyBgZmFsc2VgLCBgc3RyZWFtUHJvbWlzZWAgaXMgYHVuZGVmaW5lZGAgYW5kIHRoZXJlIGlzIG5vIGJ1ZmZlcmVkIGRhdGEgdG8gcmV0cmlldmVcblx0aWYgKCFzdHJlYW0gfHwgc3RyZWFtUHJvbWlzZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0c3RyZWFtLmRlc3Ryb3koKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiBhd2FpdCBzdHJlYW1Qcm9taXNlO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdHJldHVybiBlcnJvci5idWZmZXJlZERhdGE7XG5cdH1cbn07XG5cbmNvbnN0IGdldFN0cmVhbVByb21pc2UgPSAoc3RyZWFtLCB7ZW5jb2RpbmcsIGJ1ZmZlciwgbWF4QnVmZmVyfSkgPT4ge1xuXHRpZiAoIXN0cmVhbSB8fCAhYnVmZmVyKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKGVuY29kaW5nKSB7XG5cdFx0cmV0dXJuIGdldFN0cmVhbShzdHJlYW0sIHtlbmNvZGluZywgbWF4QnVmZmVyfSk7XG5cdH1cblxuXHRyZXR1cm4gZ2V0U3RyZWFtLmJ1ZmZlcihzdHJlYW0sIHttYXhCdWZmZXJ9KTtcbn07XG5cbi8vIFJldHJpZXZlIHJlc3VsdCBvZiBjaGlsZCBwcm9jZXNzOiBleGl0IGNvZGUsIHNpZ25hbCwgZXJyb3IsIHN0cmVhbXMgKHN0ZG91dC9zdGRlcnIvYWxsKVxuZXhwb3J0IGNvbnN0IGdldFNwYXduZWRSZXN1bHQgPSBhc3luYyAoe3N0ZG91dCwgc3RkZXJyLCBhbGx9LCB7ZW5jb2RpbmcsIGJ1ZmZlciwgbWF4QnVmZmVyfSwgcHJvY2Vzc0RvbmUpID0+IHtcblx0Y29uc3Qgc3Rkb3V0UHJvbWlzZSA9IGdldFN0cmVhbVByb21pc2Uoc3Rkb3V0LCB7ZW5jb2RpbmcsIGJ1ZmZlciwgbWF4QnVmZmVyfSk7XG5cdGNvbnN0IHN0ZGVyclByb21pc2UgPSBnZXRTdHJlYW1Qcm9taXNlKHN0ZGVyciwge2VuY29kaW5nLCBidWZmZXIsIG1heEJ1ZmZlcn0pO1xuXHRjb25zdCBhbGxQcm9taXNlID0gZ2V0U3RyZWFtUHJvbWlzZShhbGwsIHtlbmNvZGluZywgYnVmZmVyLCBtYXhCdWZmZXI6IG1heEJ1ZmZlciAqIDJ9KTtcblxuXHR0cnkge1xuXHRcdHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChbcHJvY2Vzc0RvbmUsIHN0ZG91dFByb21pc2UsIHN0ZGVyclByb21pc2UsIGFsbFByb21pc2VdKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoW1xuXHRcdFx0e2Vycm9yLCBzaWduYWw6IGVycm9yLnNpZ25hbCwgdGltZWRPdXQ6IGVycm9yLnRpbWVkT3V0fSxcblx0XHRcdGdldEJ1ZmZlcmVkRGF0YShzdGRvdXQsIHN0ZG91dFByb21pc2UpLFxuXHRcdFx0Z2V0QnVmZmVyZWREYXRhKHN0ZGVyciwgc3RkZXJyUHJvbWlzZSksXG5cdFx0XHRnZXRCdWZmZXJlZERhdGEoYWxsLCBhbGxQcm9taXNlKSxcblx0XHRdKTtcblx0fVxufTtcbiIsICIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItdG9wLWxldmVsLWF3YWl0XG5jb25zdCBuYXRpdmVQcm9taXNlUHJvdG90eXBlID0gKGFzeW5jICgpID0+IHt9KSgpLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuY29uc3QgZGVzY3JpcHRvcnMgPSBbJ3RoZW4nLCAnY2F0Y2gnLCAnZmluYWxseSddLm1hcChwcm9wZXJ0eSA9PiBbXG5cdHByb3BlcnR5LFxuXHRSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuYXRpdmVQcm9taXNlUHJvdG90eXBlLCBwcm9wZXJ0eSksXG5dKTtcblxuLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBhIG1peGluIG9mIGBjaGlsZFByb2Nlc3NgIGFuZCBgUHJvbWlzZWBcbmV4cG9ydCBjb25zdCBtZXJnZVByb21pc2UgPSAoc3Bhd25lZCwgcHJvbWlzZSkgPT4ge1xuXHRmb3IgKGNvbnN0IFtwcm9wZXJ0eSwgZGVzY3JpcHRvcl0gb2YgZGVzY3JpcHRvcnMpIHtcblx0XHQvLyBTdGFydGluZyB0aGUgbWFpbiBgcHJvbWlzZWAgaXMgZGVmZXJyZWQgdG8gYXZvaWQgY29uc3VtaW5nIHN0cmVhbXNcblx0XHRjb25zdCB2YWx1ZSA9IHR5cGVvZiBwcm9taXNlID09PSAnZnVuY3Rpb24nXG5cdFx0XHQ/ICguLi5hcmdzKSA9PiBSZWZsZWN0LmFwcGx5KGRlc2NyaXB0b3IudmFsdWUsIHByb21pc2UoKSwgYXJncylcblx0XHRcdDogZGVzY3JpcHRvci52YWx1ZS5iaW5kKHByb21pc2UpO1xuXG5cdFx0UmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShzcGF3bmVkLCBwcm9wZXJ0eSwgey4uLmRlc2NyaXB0b3IsIHZhbHVlfSk7XG5cdH1cbn07XG5cbi8vIFVzZSBwcm9taXNlcyBpbnN0ZWFkIG9mIGBjaGlsZF9wcm9jZXNzYCBldmVudHNcbmV4cG9ydCBjb25zdCBnZXRTcGF3bmVkUHJvbWlzZSA9IHNwYXduZWQgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRzcGF3bmVkLm9uKCdleGl0JywgKGV4aXRDb2RlLCBzaWduYWwpID0+IHtcblx0XHRyZXNvbHZlKHtleGl0Q29kZSwgc2lnbmFsfSk7XG5cdH0pO1xuXG5cdHNwYXduZWQub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xuXHRcdHJlamVjdChlcnJvcik7XG5cdH0pO1xuXG5cdGlmIChzcGF3bmVkLnN0ZGluKSB7XG5cdFx0c3Bhd25lZC5zdGRpbi5vbignZXJyb3InLCBlcnJvciA9PiB7XG5cdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdH0pO1xuXHR9XG59KTtcbiIsICJpbXBvcnQge0J1ZmZlcn0gZnJvbSAnbm9kZTpidWZmZXInO1xuaW1wb3J0IHtDaGlsZFByb2Nlc3N9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmNvbnN0IG5vcm1hbGl6ZUFyZ3MgPSAoZmlsZSwgYXJncyA9IFtdKSA9PiB7XG5cdGlmICghQXJyYXkuaXNBcnJheShhcmdzKSkge1xuXHRcdHJldHVybiBbZmlsZV07XG5cdH1cblxuXHRyZXR1cm4gW2ZpbGUsIC4uLmFyZ3NdO1xufTtcblxuY29uc3QgTk9fRVNDQVBFX1JFR0VYUCA9IC9eW1xcdy4tXSskLztcbmNvbnN0IERPVUJMRV9RVU9URVNfUkVHRVhQID0gL1wiL2c7XG5cbmNvbnN0IGVzY2FwZUFyZyA9IGFyZyA9PiB7XG5cdGlmICh0eXBlb2YgYXJnICE9PSAnc3RyaW5nJyB8fCBOT19FU0NBUEVfUkVHRVhQLnRlc3QoYXJnKSkge1xuXHRcdHJldHVybiBhcmc7XG5cdH1cblxuXHRyZXR1cm4gYFwiJHthcmcucmVwbGFjZShET1VCTEVfUVVPVEVTX1JFR0VYUCwgJ1xcXFxcIicpfVwiYDtcbn07XG5cbmV4cG9ydCBjb25zdCBqb2luQ29tbWFuZCA9IChmaWxlLCBhcmdzKSA9PiBub3JtYWxpemVBcmdzKGZpbGUsIGFyZ3MpLmpvaW4oJyAnKTtcblxuZXhwb3J0IGNvbnN0IGdldEVzY2FwZWRDb21tYW5kID0gKGZpbGUsIGFyZ3MpID0+IG5vcm1hbGl6ZUFyZ3MoZmlsZSwgYXJncykubWFwKGFyZyA9PiBlc2NhcGVBcmcoYXJnKSkuam9pbignICcpO1xuXG5jb25zdCBTUEFDRVNfUkVHRVhQID0gLyArL2c7XG5cbi8vIEhhbmRsZSBgZXhlY2FDb21tYW5kKClgXG5leHBvcnQgY29uc3QgcGFyc2VDb21tYW5kID0gY29tbWFuZCA9PiB7XG5cdGNvbnN0IHRva2VucyA9IFtdO1xuXHRmb3IgKGNvbnN0IHRva2VuIG9mIGNvbW1hbmQudHJpbSgpLnNwbGl0KFNQQUNFU19SRUdFWFApKSB7XG5cdFx0Ly8gQWxsb3cgc3BhY2VzIHRvIGJlIGVzY2FwZWQgYnkgYSBiYWNrc2xhc2ggaWYgbm90IG1lYW50IGFzIGEgZGVsaW1pdGVyXG5cdFx0Y29uc3QgcHJldmlvdXNUb2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG5cdFx0aWYgKHByZXZpb3VzVG9rZW4gJiYgcHJldmlvdXNUb2tlbi5lbmRzV2l0aCgnXFxcXCcpKSB7XG5cdFx0XHQvLyBNZXJnZSBwcmV2aW91cyB0b2tlbiB3aXRoIGN1cnJlbnQgb25lXG5cdFx0XHR0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdID0gYCR7cHJldmlvdXNUb2tlbi5zbGljZSgwLCAtMSl9ICR7dG9rZW59YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dG9rZW5zLnB1c2godG9rZW4pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0b2tlbnM7XG59O1xuXG5jb25zdCBwYXJzZUV4cHJlc3Npb24gPSBleHByZXNzaW9uID0+IHtcblx0Y29uc3QgdHlwZU9mRXhwcmVzc2lvbiA9IHR5cGVvZiBleHByZXNzaW9uO1xuXG5cdGlmICh0eXBlT2ZFeHByZXNzaW9uID09PSAnc3RyaW5nJykge1xuXHRcdHJldHVybiBleHByZXNzaW9uO1xuXHR9XG5cblx0aWYgKHR5cGVPZkV4cHJlc3Npb24gPT09ICdudW1iZXInKSB7XG5cdFx0cmV0dXJuIFN0cmluZyhleHByZXNzaW9uKTtcblx0fVxuXG5cdGlmIChcblx0XHR0eXBlT2ZFeHByZXNzaW9uID09PSAnb2JqZWN0J1xuXHRcdCYmIGV4cHJlc3Npb24gIT09IG51bGxcblx0XHQmJiAhKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDaGlsZFByb2Nlc3MpXG5cdFx0JiYgJ3N0ZG91dCcgaW4gZXhwcmVzc2lvblxuXHQpIHtcblx0XHRjb25zdCB0eXBlT2ZTdGRvdXQgPSB0eXBlb2YgZXhwcmVzc2lvbi5zdGRvdXQ7XG5cblx0XHRpZiAodHlwZU9mU3Rkb3V0ID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIGV4cHJlc3Npb24uc3Rkb3V0O1xuXHRcdH1cblxuXHRcdGlmIChCdWZmZXIuaXNCdWZmZXIoZXhwcmVzc2lvbi5zdGRvdXQpKSB7XG5cdFx0XHRyZXR1cm4gZXhwcmVzc2lvbi5zdGRvdXQudG9TdHJpbmcoKTtcblx0XHR9XG5cblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBVbmV4cGVjdGVkIFwiJHt0eXBlT2ZTdGRvdXR9XCIgc3Rkb3V0IGluIHRlbXBsYXRlIGV4cHJlc3Npb25gKTtcblx0fVxuXG5cdHRocm93IG5ldyBUeXBlRXJyb3IoYFVuZXhwZWN0ZWQgXCIke3R5cGVPZkV4cHJlc3Npb259XCIgaW4gdGVtcGxhdGUgZXhwcmVzc2lvbmApO1xufTtcblxuY29uc3QgY29uY2F0VG9rZW5zID0gKHRva2VucywgbmV4dFRva2VucywgaXNOZXcpID0+IGlzTmV3IHx8IHRva2Vucy5sZW5ndGggPT09IDAgfHwgbmV4dFRva2Vucy5sZW5ndGggPT09IDBcblx0PyBbLi4udG9rZW5zLCAuLi5uZXh0VG9rZW5zXVxuXHQ6IFtcblx0XHQuLi50b2tlbnMuc2xpY2UoMCwgLTEpLFxuXHRcdGAke3Rva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV19JHtuZXh0VG9rZW5zWzBdfWAsXG5cdFx0Li4ubmV4dFRva2Vucy5zbGljZSgxKSxcblx0XTtcblxuY29uc3QgcGFyc2VUZW1wbGF0ZSA9ICh7dGVtcGxhdGVzLCBleHByZXNzaW9ucywgdG9rZW5zLCBpbmRleCwgdGVtcGxhdGV9KSA9PiB7XG5cdGNvbnN0IHRlbXBsYXRlU3RyaW5nID0gdGVtcGxhdGUgPz8gdGVtcGxhdGVzLnJhd1tpbmRleF07XG5cdGNvbnN0IHRlbXBsYXRlVG9rZW5zID0gdGVtcGxhdGVTdHJpbmcuc3BsaXQoU1BBQ0VTX1JFR0VYUCkuZmlsdGVyKEJvb2xlYW4pO1xuXHRjb25zdCBuZXdUb2tlbnMgPSBjb25jYXRUb2tlbnMoXG5cdFx0dG9rZW5zLFxuXHRcdHRlbXBsYXRlVG9rZW5zLFxuXHRcdHRlbXBsYXRlU3RyaW5nLnN0YXJ0c1dpdGgoJyAnKSxcblx0KTtcblxuXHRpZiAoaW5kZXggPT09IGV4cHJlc3Npb25zLmxlbmd0aCkge1xuXHRcdHJldHVybiBuZXdUb2tlbnM7XG5cdH1cblxuXHRjb25zdCBleHByZXNzaW9uID0gZXhwcmVzc2lvbnNbaW5kZXhdO1xuXHRjb25zdCBleHByZXNzaW9uVG9rZW5zID0gQXJyYXkuaXNBcnJheShleHByZXNzaW9uKVxuXHRcdD8gZXhwcmVzc2lvbi5tYXAoZXhwcmVzc2lvbiA9PiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbikpXG5cdFx0OiBbcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb24pXTtcblx0cmV0dXJuIGNvbmNhdFRva2Vucyhcblx0XHRuZXdUb2tlbnMsXG5cdFx0ZXhwcmVzc2lvblRva2Vucyxcblx0XHR0ZW1wbGF0ZVN0cmluZy5lbmRzV2l0aCgnICcpLFxuXHQpO1xufTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlVGVtcGxhdGVzID0gKHRlbXBsYXRlcywgZXhwcmVzc2lvbnMpID0+IHtcblx0bGV0IHRva2VucyA9IFtdO1xuXG5cdGZvciAoY29uc3QgW2luZGV4LCB0ZW1wbGF0ZV0gb2YgdGVtcGxhdGVzLmVudHJpZXMoKSkge1xuXHRcdHRva2VucyA9IHBhcnNlVGVtcGxhdGUoe3RlbXBsYXRlcywgZXhwcmVzc2lvbnMsIHRva2VucywgaW5kZXgsIHRlbXBsYXRlfSk7XG5cdH1cblxuXHRyZXR1cm4gdG9rZW5zO1xufTtcblxuIiwgImltcG9ydCB7ZGVidWdsb2d9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5leHBvcnQgY29uc3QgdmVyYm9zZURlZmF1bHQgPSBkZWJ1Z2xvZygnZXhlY2EnKS5lbmFibGVkO1xuXG5jb25zdCBwYWRGaWVsZCA9IChmaWVsZCwgcGFkZGluZykgPT4gU3RyaW5nKGZpZWxkKS5wYWRTdGFydChwYWRkaW5nLCAnMCcpO1xuXG5jb25zdCBnZXRUaW1lc3RhbXAgPSAoKSA9PiB7XG5cdGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuXHRyZXR1cm4gYCR7cGFkRmllbGQoZGF0ZS5nZXRIb3VycygpLCAyKX06JHtwYWRGaWVsZChkYXRlLmdldE1pbnV0ZXMoKSwgMil9OiR7cGFkRmllbGQoZGF0ZS5nZXRTZWNvbmRzKCksIDIpfS4ke3BhZEZpZWxkKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCksIDMpfWA7XG59O1xuXG5leHBvcnQgY29uc3QgbG9nQ29tbWFuZCA9IChlc2NhcGVkQ29tbWFuZCwge3ZlcmJvc2V9KSA9PiB7XG5cdGlmICghdmVyYm9zZSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHByb2Nlc3Muc3RkZXJyLndyaXRlKGBbJHtnZXRUaW1lc3RhbXAoKX1dICR7ZXNjYXBlZENvbW1hbmR9XFxuYCk7XG59O1xuIiwgImltcG9ydCB7XG4gIEJ1aWxkU3RlcE91dHB1dCxcbiAgRW50cnlwb2ludEdyb3VwLFxuICBJbnRlcm5hbENvbmZpZyxcbiAgV3h0RGV2U2VydmVyLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBTY3JpcHRpbmcgfSBmcm9tICd3ZWJleHRlbnNpb24tcG9seWZpbGwnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGggfSBmcm9tICcuL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCB7XG4gIGdldENvbnRlbnRTY3JpcHRDc3NGaWxlcyxcbiAgZ2V0Q29udGVudFNjcmlwdHNDc3NNYXAsXG59IGZyb20gJy4vdXRpbHMvbWFuaWZlc3QnO1xuaW1wb3J0IHsgYnVpbGRJbnRlcm5hbCB9IGZyb20gJy4vYnVpbGQnO1xuaW1wb3J0IHsgY3JlYXRlRXh0ZW5zaW9uUnVubmVyIH0gZnJvbSAnLi9ydW5uZXJzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNlcnZlckluZm8oKTogUHJvbWlzZTxTZXJ2ZXJJbmZvPiB7XG4gIGNvbnN0IHsgZGVmYXVsdDogZ2V0UG9ydCwgcG9ydE51bWJlcnMgfSA9IGF3YWl0IGltcG9ydCgnZ2V0LXBvcnQnKTtcbiAgY29uc3QgcG9ydCA9IGF3YWl0IGdldFBvcnQoeyBwb3J0OiBwb3J0TnVtYmVycygzMDAwLCAzMDEwKSB9KTtcbiAgY29uc3QgaG9zdG5hbWUgPSAnbG9jYWxob3N0JztcbiAgY29uc3Qgb3JpZ2luID0gYGh0dHA6Ly8ke2hvc3RuYW1lfToke3BvcnR9YDtcbiAgY29uc3Qgc2VydmVyQ29uZmlnOiB2aXRlLklubGluZUNvbmZpZyA9IHtcbiAgICBzZXJ2ZXI6IHtcbiAgICAgIG9yaWdpbixcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcG9ydCxcbiAgICBob3N0bmFtZSxcbiAgICBvcmlnaW4sXG4gICAgdml0ZVNlcnZlckNvbmZpZzogc2VydmVyQ29uZmlnLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBTZXJ2ZXIoXG4gIHNlcnZlckluZm86IFNlcnZlckluZm8sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPFd4dERldlNlcnZlcj4ge1xuICBjb25zdCBydW5uZXIgPSBhd2FpdCBjcmVhdGVFeHRlbnNpb25SdW5uZXIoY29uZmlnKTtcblxuICBjb25zdCB2aXRlU2VydmVyID0gYXdhaXQgdml0ZS5jcmVhdGVTZXJ2ZXIoXG4gICAgdml0ZS5tZXJnZUNvbmZpZyhzZXJ2ZXJJbmZvLCBhd2FpdCBjb25maWcudml0ZShjb25maWcuZW52KSksXG4gICk7XG5cbiAgY29uc3Qgc3RhcnQgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdml0ZVNlcnZlci5saXN0ZW4oc2VydmVyLnBvcnQpO1xuICAgIGNvbmZpZy5sb2dnZXIuc3VjY2VzcyhgU3RhcnRlZCBkZXYgc2VydmVyIEAgJHtzZXJ2ZXJJbmZvLm9yaWdpbn1gKTtcblxuICAgIHNlcnZlci5jdXJyZW50T3V0cHV0ID0gYXdhaXQgYnVpbGRJbnRlcm5hbChjb25maWcpO1xuICAgIGF3YWl0IHJ1bm5lci5vcGVuQnJvd3Nlcihjb25maWcpO1xuICB9O1xuXG4gIGNvbnN0IHJlbG9hZEV4dGVuc2lvbiA9ICgpID0+IHtcbiAgICB2aXRlU2VydmVyLndzLnNlbmQoJ3d4dDpyZWxvYWQtZXh0ZW5zaW9uJyk7XG4gIH07XG4gIGNvbnN0IHJlbG9hZFBhZ2UgPSAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgLy8gQ2FuJ3QgdXNlIFZpdGUncyBidWlsdC1pbiBcImZ1bGwtcmVsb2FkXCIgZXZlbnQgYmVjYXVzZSBpdCBkb2Vzbid0IGxpa2Ugb3VyIHBhdGhzLCBpdCBleHBlY3RzXG4gICAgLy8gcGF0aHMgZW5kaW5nIGluIFwiL2luZGV4Lmh0bWxcIlxuICAgIHZpdGVTZXJ2ZXIud3Muc2VuZCgnd3h0OnJlbG9hZC1wYWdlJywgcGF0aCk7XG4gIH07XG4gIGNvbnN0IHJlbG9hZENvbnRlbnRTY3JpcHQgPSAoXG4gICAgY29udGVudFNjcmlwdDogT21pdDxTY3JpcHRpbmcuUmVnaXN0ZXJlZENvbnRlbnRTY3JpcHQsICdpZCc+LFxuICApID0+IHtcbiAgICB2aXRlU2VydmVyLndzLnNlbmQoJ3d4dDpyZWxvYWQtY29udGVudC1zY3JpcHQnLCBjb250ZW50U2NyaXB0KTtcbiAgfTtcblxuICBjb25zdCBzZXJ2ZXI6IFd4dERldlNlcnZlciA9IHtcbiAgICAuLi52aXRlU2VydmVyLFxuICAgIHN0YXJ0LFxuICAgIGN1cnJlbnRPdXRwdXQ6IHtcbiAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgIG1hbmlmZXN0X3ZlcnNpb246IDMsXG4gICAgICAgIG5hbWU6ICcnLFxuICAgICAgICB2ZXJzaW9uOiAnJyxcbiAgICAgIH0sXG4gICAgICBwdWJsaWNBc3NldHM6IFtdLFxuICAgICAgc3RlcHM6IFtdLFxuICAgIH0sXG4gICAgcG9ydDogc2VydmVySW5mby5wb3J0LFxuICAgIGhvc3RuYW1lOiBzZXJ2ZXJJbmZvLmhvc3RuYW1lLFxuICAgIG9yaWdpbjogc2VydmVySW5mby5vcmlnaW4sXG4gICAgcmVsb2FkRXh0ZW5zaW9uLFxuICAgIHJlbG9hZFBhZ2UsXG4gICAgcmVsb2FkQ29udGVudFNjcmlwdCxcbiAgfTtcblxuICByZXR1cm4gc2VydmVyO1xufVxuXG4vKipcbiAqIEZyb20gdGhlIHNlcnZlciwgdGVsbCB0aGUgY2xpZW50IHRvIHJlbG9hZCBjb250ZW50IHNjcmlwdHMgZnJvbSB0aGUgcHJvdmlkZWQgYnVpbGQgc3RlcCBvdXRwdXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVsb2FkQ29udGVudFNjcmlwdHMoXG4gIHN0ZXBzOiBCdWlsZFN0ZXBPdXRwdXRbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgc2VydmVyOiBXeHREZXZTZXJ2ZXIsXG4pIHtcbiAgaWYgKGNvbmZpZy5tYW5pZmVzdFZlcnNpb24gPT09IDMpIHtcbiAgICBzdGVwcy5mb3JFYWNoKChzdGVwKSA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IHN0ZXAuZW50cnlwb2ludHM7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkgfHwgZW50cnkudHlwZSAhPT0gJ2NvbnRlbnQtc2NyaXB0JykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBqcyA9IFtnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChlbnRyeSwgY29uZmlnLm91dERpciwgJy5qcycpXTtcbiAgICAgIGNvbnN0IGNzc01hcCA9IGdldENvbnRlbnRTY3JpcHRzQ3NzTWFwKHNlcnZlci5jdXJyZW50T3V0cHV0LCBbZW50cnldKTtcbiAgICAgIGNvbnN0IGNzcyA9IGdldENvbnRlbnRTY3JpcHRDc3NGaWxlcyhbZW50cnldLCBjc3NNYXApO1xuXG4gICAgICBzZXJ2ZXIucmVsb2FkQ29udGVudFNjcmlwdCh7XG4gICAgICAgIGFsbEZyYW1lczogZW50cnkub3B0aW9ucy5hbGxGcmFtZXMsXG4gICAgICAgIGV4Y2x1ZGVNYXRjaGVzOiBlbnRyeS5vcHRpb25zLmV4Y2x1ZGVNYXRjaGVzLFxuICAgICAgICBtYXRjaGVzOiBlbnRyeS5vcHRpb25zLm1hdGNoZXMsXG4gICAgICAgIHJ1bkF0OiBlbnRyeS5vcHRpb25zLnJ1bkF0LFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBDaHJvbWUgYWNjZXB0cyB0aGlzLCBub3QgdHlwZWQgaW4gd2ViZXh0ZW5zaW9uLXBvbHlmaWxsIChodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2RvY3MvZXh0ZW5zaW9ucy9yZWZlcmVuY2Uvc2NyaXB0aW5nLyN0eXBlLVJlZ2lzdGVyZWRDb250ZW50U2NyaXB0KVxuICAgICAgICB3b3JsZDogZW50cnkub3B0aW9ucy53b3JsZCxcbiAgICAgICAganMsXG4gICAgICAgIGNzcyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNlcnZlci5yZWxvYWRFeHRlbnNpb24oKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVsb2FkSHRtbFBhZ2VzKFxuICBncm91cHM6IEVudHJ5cG9pbnRHcm91cFtdLFxuICBzZXJ2ZXI6IFd4dERldlNlcnZlcixcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbikge1xuICBncm91cHMuZmxhdCgpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKGVudHJ5LCBjb25maWcub3V0RGlyLCAnLmh0bWwnKTtcbiAgICBzZXJ2ZXIucmVsb2FkUGFnZShwYXRoKTtcbiAgfSk7XG59XG5cbmludGVyZmFjZSBTZXJ2ZXJJbmZvIHtcbiAgcG9ydDogbnVtYmVyO1xuICBob3N0bmFtZTogc3RyaW5nO1xuICBvcmlnaW46IHN0cmluZztcbiAgdml0ZVNlcnZlckNvbmZpZzogdml0ZS5JbmxpbmVDb25maWc7XG59XG4iLCAiaW1wb3J0IHsgRXh0ZW5zaW9uUnVubmVyIH0gZnJvbSAnLi9leHRlbnNpb24tcnVubmVyJztcbmltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBUaGUgV1NMIHJ1bm5lciBqdXN0IGxvZ3MgYSB3YXJuaW5nIG1lc3NhZ2UgYmVjYXVzZSBgd2ViLWV4dGAgZG9lc24ndCB3b3JrIGluIFdTTC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdzbFJ1bm5lcigpOiBFeHRlbnNpb25SdW5uZXIge1xuICByZXR1cm4ge1xuICAgIGFzeW5jIG9wZW5Ccm93c2VyKGNvbmZpZykge1xuICAgICAgY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgICBgQ2Fubm90IG9wZW4gYnJvd3NlciB3aGVuIHVzaW5nIFdTTC4gTG9hZCBcIiR7cmVsYXRpdmUoXG4gICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICBjb25maWcub3V0RGlyLFxuICAgICAgICApfVwiIGFzIGFuIHVucGFja2VkIGV4dGVuc2lvbiBtYW51YWxseWAsXG4gICAgICApO1xuICAgIH0sXG4gICAgYXN5bmMgY2xvc2VCcm93c2VyKCkge1xuICAgICAgLy8gbm9vcFxuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBXZWJFeHRSdW5JbnN0YW5jZSB9IGZyb20gJ3dlYi1leHQtcnVuJztcbmltcG9ydCB7IEV4dGVuc2lvblJ1bm5lciB9IGZyb20gJy4vZXh0ZW5zaW9uLXJ1bm5lcic7XG5cbi8qKlxuICogQ3JlYXRlIGFuIGBFeHRlbnNpb25SdW5uZXJgIGJhY2tlZCBieSBgd2ViLWV4dGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJFeHRSdW5uZXIoKTogRXh0ZW5zaW9uUnVubmVyIHtcbiAgbGV0IHJ1bm5lcjogV2ViRXh0UnVuSW5zdGFuY2UgfCB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBvcGVuQnJvd3Nlcihjb25maWcpIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIuaW5mbygnT3BlbmluZyBicm93c2VyLi4uJyk7XG5cbiAgICAgIC8vIFVzZSB0aGUgcGx1Z2luJ3MgbG9nZ2VyIGluc3RlYWQgb2Ygd2ViLWV4dCdzIGJ1aWx0LWluIG9uZS5cbiAgICAgIGNvbnN0IHdlYkV4dExvZ2dlciA9IGF3YWl0IGltcG9ydCgnd2ViLWV4dC1ydW4vdXRpbC9sb2dnZXInKTtcbiAgICAgIHdlYkV4dExvZ2dlci5jb25zb2xlU3RyZWFtLndyaXRlID0gKHsgbGV2ZWwsIG1zZywgbmFtZSB9KSA9PiB7XG4gICAgICAgIGlmIChsZXZlbCA+PSBFUlJPUl9MT0dfTEVWRUwpIGNvbmZpZy5sb2dnZXIuZXJyb3IobmFtZSwgbXNnKTtcbiAgICAgICAgaWYgKGxldmVsID49IFdBUk5fTE9HX0xFVkVMKSBjb25maWcubG9nZ2VyLndhcm4obXNnKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHd4dFVzZXJDb25maWcgPSBjb25maWcucnVubmVyQ29uZmlnLmNvbmZpZztcbiAgICAgIGNvbnN0IHVzZXJDb25maWcgPSB7XG4gICAgICAgIGNvbnNvbGU6IHd4dFVzZXJDb25maWc/Lm9wZW5Db25zb2xlLFxuICAgICAgICBkZXZ0b29sczogd3h0VXNlckNvbmZpZz8ub3BlbkRldnRvb2xzLFxuICAgICAgICBzdGFydFVybDogd3h0VXNlckNvbmZpZz8uc3RhcnRVcmxzLFxuICAgICAgICAuLi4oY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94J1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBmaXJlZm94OiB3eHRVc2VyQ29uZmlnPy5iaW5hcmllcz8uZmlyZWZveCxcbiAgICAgICAgICAgICAgZmlyZWZveFByb2ZpbGU6IHd4dFVzZXJDb25maWc/LmZpcmVmb3hQcm9maWxlLFxuICAgICAgICAgICAgICBwcmVmczogd3h0VXNlckNvbmZpZz8uZmlyZWZveFByZWZzLFxuICAgICAgICAgICAgICBhcmdzOiB3eHRVc2VyQ29uZmlnPy5maXJlZm94QXJncyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgY2hyb21pdW1CaW5hcnk6IHd4dFVzZXJDb25maWc/LmJpbmFyaWVzPy5bY29uZmlnLmJyb3dzZXJdLFxuICAgICAgICAgICAgICBjaHJvbWl1bVByb2ZpbGU6IHd4dFVzZXJDb25maWc/LmNocm9taXVtUHJvZmlsZSxcbiAgICAgICAgICAgICAgYXJnczogd3h0VXNlckNvbmZpZz8uY2hyb21pdW1BcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5hbENvbmZpZyA9IHtcbiAgICAgICAgLi4udXNlckNvbmZpZyxcbiAgICAgICAgdGFyZ2V0OiBjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnID8gJ2ZpcmVmb3gtZGVza3RvcCcgOiAnY2hyb21pdW0nLFxuICAgICAgICBzb3VyY2VEaXI6IGNvbmZpZy5vdXREaXIsXG4gICAgICAgIC8vIFdYVCBoYW5kbGVzIHJlbG9hZHMsIHNvIGRpc2FibGUgYXV0by1yZWxvYWQgYmVoYXZpb3JzIGluIHdlYi1leHRcbiAgICAgICAgbm9SZWxvYWQ6IHRydWUsXG4gICAgICAgIG5vSW5wdXQ6IHRydWUsXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgLy8gRG9uJ3QgY2FsbCBgcHJvY2Vzcy5leGl0KDApYCBhZnRlciBzdGFydGluZyB3ZWItZXh0XG4gICAgICAgIHNob3VsZEV4aXRQcm9ncmFtOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCd3ZWItZXh0IGNvbmZpZzonLCBmaW5hbENvbmZpZyk7XG4gICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCd3ZWItZXh0IG9wdGlvbnM6Jywgb3B0aW9ucyk7XG5cbiAgICAgIGNvbnN0IHdlYkV4dCA9IGF3YWl0IGltcG9ydCgnd2ViLWV4dC1ydW4nKTtcbiAgICAgIHJ1bm5lciA9IGF3YWl0IHdlYkV4dC5kZWZhdWx0LmNtZC5ydW4oZmluYWxDb25maWcsIG9wdGlvbnMpO1xuXG4gICAgICBjb25maWcubG9nZ2VyLnN1Y2Nlc3MoJ09wZW5lZCEnKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgY2xvc2VCcm93c2VyKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJ1bm5lcj8uZXhpdCgpO1xuICAgIH0sXG4gIH07XG59XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3dlYi1leHQvYmxvYi9lMzdlNjBhMjczODQ3OGY1MTJmMTI1NWM1MzcxMzMzMjFmMzAxNzcxL3NyYy91dGlsL2xvZ2dlci5qcyNMMTJcbmNvbnN0IFdBUk5fTE9HX0xFVkVMID0gNDA7XG5jb25zdCBFUlJPUl9MT0dfTEVWRUwgPSA1MDtcbiIsICJpbXBvcnQgeyBFeHRlbnNpb25SdW5uZXIgfSBmcm9tICcuL2V4dGVuc2lvbi1ydW5uZXInO1xuaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuXG4vKipcbiAqIFRoZSBTYWZhcmkgcnVubmVyIGp1c3QgbG9ncyBhIHdhcm5pbmcgbWVzc2FnZSBiZWNhdXNlIGB3ZWItZXh0YCBkb2Vzbid0IHdvcmsgd2l0aCBTYWZhcmkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTYWZhcmlSdW5uZXIoKTogRXh0ZW5zaW9uUnVubmVyIHtcbiAgcmV0dXJuIHtcbiAgICBhc3luYyBvcGVuQnJvd3Nlcihjb25maWcpIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIud2FybihcbiAgICAgICAgYENhbm5vdCBTYWZhcmkgdXNpbmcgd2ViLWV4dC4gTG9hZCBcIiR7cmVsYXRpdmUoXG4gICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICBjb25maWcub3V0RGlyLFxuICAgICAgICApfVwiIGFzIGFuIHVucGFja2VkIGV4dGVuc2lvbiBtYW51YWxseWAsXG4gICAgICApO1xuICAgIH0sXG4gICAgYXN5bmMgY2xvc2VCcm93c2VyKCkge1xuICAgICAgLy8gbm9vcFxuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHsgRXh0ZW5zaW9uUnVubmVyIH0gZnJvbSAnLi9leHRlbnNpb24tcnVubmVyJztcbmltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBUaGUgbWFudWFsIHJ1bm5lciB0ZWxscyB0aGUgdXNlciB0byBsb2FkIHRoZSB1bnBhY2tlZCBleHRlbnNpb24gbWFudWFsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNYW51YWxSdW5uZXIoKTogRXh0ZW5zaW9uUnVubmVyIHtcbiAgcmV0dXJuIHtcbiAgICBhc3luYyBvcGVuQnJvd3Nlcihjb25maWcpIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIuaW5mbyhcbiAgICAgICAgYExvYWQgXCIke3JlbGF0aXZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICAgKX1cIiBhcyBhbiB1bnBhY2tlZCBleHRlbnNpb24gbWFudWFsbHlgLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGFzeW5jIGNsb3NlQnJvd3NlcigpIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9LFxuICB9O1xufVxuIiwgIi8qKlxuICogUmV0dXJucyB0cnVlIHdoZW4gcnVubmluZyBvbiBXU0wgb3IgV1NMMi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzV3NsKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB7IGRlZmF1bHQ6IGlzV3NsIH0gPSBhd2FpdCBpbXBvcnQoJ2lzLXdzbCcpOyAvLyBFU00gb25seSwgcmVxdWlyZXMgZHluYW1pYyBpbXBvcnRcbiAgcmV0dXJuIGlzV3NsO1xufVxuIiwgImltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uUnVubmVyIH0gZnJvbSAnLi9leHRlbnNpb24tcnVubmVyJztcbmltcG9ydCB7IGNyZWF0ZVdzbFJ1bm5lciB9IGZyb20gJy4vd3NsJztcbmltcG9ydCB7IGNyZWF0ZVdlYkV4dFJ1bm5lciB9IGZyb20gJy4vd2ViLWV4dCc7XG5pbXBvcnQgeyBjcmVhdGVTYWZhcmlSdW5uZXIgfSBmcm9tICcuL3NhZmFyaSc7XG5pbXBvcnQgeyBjcmVhdGVNYW51YWxSdW5uZXIgfSBmcm9tICcuL21hbnVhbCc7XG5pbXBvcnQgeyBpc1dzbCB9IGZyb20gJy4uL3V0aWxzL3dzbCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVFeHRlbnNpb25SdW5uZXIoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPEV4dGVuc2lvblJ1bm5lcj4ge1xuICBpZiAoY29uZmlnLmJyb3dzZXIgPT09ICdzYWZhcmknKSByZXR1cm4gY3JlYXRlU2FmYXJpUnVubmVyKCk7XG5cbiAgaWYgKGF3YWl0IGlzV3NsKCkpIHJldHVybiBjcmVhdGVXc2xSdW5uZXIoKTtcbiAgaWYgKGNvbmZpZy5ydW5uZXJDb25maWcuY29uZmlnPy5kaXNhYmxlZCkgcmV0dXJuIGNyZWF0ZU1hbnVhbFJ1bm5lcigpO1xuXG4gIHJldHVybiBjcmVhdGVXZWJFeHRSdW5uZXIoKTtcbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IGdsb2IgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5pbXBvcnQgcGMgZnJvbSAncGljb2NvbG9ycyc7XG5cbi8qKlxuICogUmVtb3ZlIGdlbmVyYXRlZC90ZW1wIGZpbGVzIGZyb20gdGhlIGRpcmVjdG9yeS5cbiAqXG4gKiBAcGFyYW0gcm9vdCBUaGUgZGlyZWN0b3J5IHRvIGxvb2sgZm9yIGdlbmVyYXRlZC90ZW1wIGZpbGVzIGluLiBEZWZhdWx0cyB0byBgcHJvY2Vzcy5jd2QoKWAuIENhbiBiZSByZWxhdGl2ZSB0byBgcHJvY2Vzcy5jd2QoKWAgb3IgYWJzb2x1dGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhbihyb290ID0gcHJvY2Vzcy5jd2QoKSkge1xuICBjb25zb2xhLmluZm8oJ0NsZWFuaW5nIFByb2plY3QnKTtcblxuICBjb25zdCB0ZW1wRGlycyA9IFtcbiAgICAnbm9kZV9tb2R1bGVzLy52aXRlJyxcbiAgICAnbm9kZV9tb2R1bGVzLy5jYWNoZScsXG4gICAgJyoqLy53eHQnLFxuICAgICcub3V0cHV0LyonLFxuICBdO1xuICBjb25zb2xhLmRlYnVnKCdMb29raW5nIGZvcjonLCB0ZW1wRGlycy5tYXAocGMuY3lhbikuam9pbignLCAnKSk7XG4gIGNvbnN0IGRpcmVjdG9yaWVzID0gYXdhaXQgZ2xvYih0ZW1wRGlycywge1xuICAgIGN3ZDogcGF0aC5yZXNvbHZlKHJvb3QpLFxuICAgIGFic29sdXRlOiB0cnVlLFxuICAgIG9ubHlEaXJlY3RvcmllczogdHJ1ZSxcbiAgICBkZWVwOiAyLFxuICB9KTtcbiAgaWYgKGRpcmVjdG9yaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGEuZGVidWcoJ05vIGdlbmVyYXRlZCBmaWxlcyBmb3VuZC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zb2xhLmRlYnVnKFxuICAgICdGb3VuZDonLFxuICAgIGRpcmVjdG9yaWVzLm1hcCgoZGlyKSA9PiBwYy5jeWFuKHBhdGgucmVsYXRpdmUocm9vdCwgZGlyKSkpLmpvaW4oJywgJyksXG4gICk7XG4gIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgYXdhaXQgZnMucm0oZGlyZWN0b3J5LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgY29uc29sYS5kZWJ1ZygnRGVsZXRlZCAnICsgcGMuY3lhbihwYXRoLnJlbGF0aXZlKHJvb3QsIGRpcmVjdG9yeSkpKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IExvZ0xldmVscywgY29uc29sYSB9IGZyb20gJ2NvbnNvbGEnO1xuaW1wb3J0IHsgcHJpbnRIZWFkZXIgfSBmcm9tICcuLi8uLi9jb3JlL2xvZy9wcmludEhlYWRlcic7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvZm9ybWF0RHVyYXRpb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29tbWFuZDxUQXJncyBleHRlbmRzIGFueVtdPihcbiAgY2I6ICguLi5hcmdzOiBUQXJncykgPT4gdm9pZCB8IGJvb2xlYW4gfCBQcm9taXNlPHZvaWQgfCBib29sZWFuPixcbiAgb3B0aW9ucz86IHtcbiAgICBkaXNhYmxlRmluaXNoZWRMb2c/OiBib29sZWFuO1xuICB9LFxuKSB7XG4gIHJldHVybiBhc3luYyAoLi4uYXJnczogVEFyZ3MpID0+IHtcbiAgICAvLyBFbmFibGUgY29uc29sYSdzIGRlYnVnIG1vZGUgZ2xvYmFsbHkgYXQgdGhlIHN0YXJ0IG9mIGFsbCBjb21tYW5kcyB3aGVuIHRoZSBgLS1kZWJ1Z2AgZmxhZyBpc1xuICAgIC8vIHBhc3NlZFxuICAgIGNvbnN0IGlzRGVidWcgPSAhIWFyZ3MuZmluZCgoYXJnKSA9PiBhcmc/LmRlYnVnKTtcbiAgICBpZiAoaXNEZWJ1Zykge1xuICAgICAgY29uc29sYS5sZXZlbCA9IExvZ0xldmVscy5kZWJ1ZztcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHRyeSB7XG4gICAgICBwcmludEhlYWRlcigpO1xuXG4gICAgICBjb25zdCBvbmdvaW5nID0gYXdhaXQgY2IoLi4uYXJncyk7XG5cbiAgICAgIGlmICghb25nb2luZyAmJiAhb3B0aW9ucz8uZGlzYWJsZUZpbmlzaGVkTG9nKVxuICAgICAgICBjb25zb2xhLnN1Y2Nlc3MoXG4gICAgICAgICAgYEZpbmlzaGVkIGluICR7Zm9ybWF0RHVyYXRpb24oRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSl9YCxcbiAgICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGEuZmFpbChcbiAgICAgICAgYENvbW1hbmQgZmFpbGVkIGFmdGVyICR7Zm9ybWF0RHVyYXRpb24oRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSl9YCxcbiAgICAgICk7XG4gICAgICBjb25zb2xhLmVycm9yKGVycik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9O1xufVxuIiwgImltcG9ydCBwYyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEhlYWRlcigpIHtcbiAgY29uc29sZS5sb2coKTtcbiAgY29uc29sYS5sb2coYCR7cGMuZ3JheSgnV1hUJyl9ICR7cGMuZ3JheShwYy5ib2xkKHZlcnNpb24pKX1gKTtcbn1cbiIsICJpbXBvcnQgKiBhcyB3eHQgZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuXG5leHBvcnQgY29uc3QgYnVpbGQgPSBkZWZpbmVDb21tYW5kPFxuICBbXG4gICAgcm9vdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiB7XG4gICAgICBtb2RlPzogc3RyaW5nO1xuICAgICAgY29uZmlnPzogc3RyaW5nO1xuICAgICAgYnJvd3Nlcj86IHd4dC5UYXJnZXRCcm93c2VyO1xuICAgICAgbXYzPzogYm9vbGVhbjtcbiAgICAgIG12Mj86IGJvb2xlYW47XG4gICAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgICBhbmFseXplPzogYm9vbGVhbjtcbiAgICB9LFxuICBdXG4+KGFzeW5jIChyb290LCBmbGFncykgPT4ge1xuICBjb25zdCBjbGlDb25maWc6IHd4dC5JbmxpbmVDb25maWcgPSB7XG4gICAgcm9vdCxcbiAgICBtb2RlOiBmbGFncy5tb2RlLFxuICAgIGJyb3dzZXI6IGZsYWdzLmJyb3dzZXIsXG4gICAgbWFuaWZlc3RWZXJzaW9uOiBmbGFncy5tdjMgPyAzIDogZmxhZ3MubXYyID8gMiA6IHVuZGVmaW5lZCxcbiAgICBjb25maWdGaWxlOiBmbGFncy5jb25maWcsXG4gICAgZGVidWc6IGZsYWdzLmRlYnVnLFxuICAgIGFuYWx5c2lzOiB7XG4gICAgICBlbmFibGVkOiBmbGFncy5hbmFseXplLFxuICAgIH0sXG4gIH07XG5cbiAgYXdhaXQgd3h0LmJ1aWxkKGNsaUNvbmZpZyk7XG59KTtcbiIsICJpbXBvcnQgKiBhcyB3eHQgZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuXG5leHBvcnQgY29uc3QgZGV2ID0gZGVmaW5lQ29tbWFuZDxcbiAgW1xuICAgIHJvb3Q6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBmbGFnczoge1xuICAgICAgbW9kZT86IHN0cmluZztcbiAgICAgIGNvbmZpZz86IHN0cmluZztcbiAgICAgIGJyb3dzZXI/OiB3eHQuVGFyZ2V0QnJvd3NlcjtcbiAgICAgIG12Mz86IGJvb2xlYW47XG4gICAgICBtdjI/OiBib29sZWFuO1xuICAgICAgZGVidWc/OiBib29sZWFuO1xuICAgIH0sXG4gIF1cbj4oYXN5bmMgKHJvb3QsIGZsYWdzKSA9PiB7XG4gIGNvbnN0IGNsaUNvbmZpZzogd3h0LklubGluZUNvbmZpZyA9IHtcbiAgICByb290LFxuICAgIG1vZGU6IGZsYWdzLm1vZGUsXG4gICAgYnJvd3NlcjogZmxhZ3MuYnJvd3NlcixcbiAgICBtYW5pZmVzdFZlcnNpb246IGZsYWdzLm12MyA/IDMgOiBmbGFncy5tdjIgPyAyIDogdW5kZWZpbmVkLFxuICAgIGNvbmZpZ0ZpbGU6IGZsYWdzLmNvbmZpZyxcbiAgICBkZWJ1ZzogZmxhZ3MuZGVidWcsXG4gIH07XG5cbiAgY29uc3Qgc2VydmVyID0gYXdhaXQgd3h0LmNyZWF0ZVNlcnZlcihjbGlDb25maWcpO1xuICBhd2FpdCBzZXJ2ZXIuc3RhcnQoKTtcblxuICByZXR1cm4gdHJ1ZTtcbn0pO1xuIiwgImltcG9ydCB7IGRlZmluZUNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9kZWZpbmVDb21tYW5kJztcbmltcG9ydCBwcm9tcHRzIGZyb20gJ3Byb21wdHMnO1xuaW1wb3J0IHsgY29uc29sYSB9IGZyb20gJ2NvbnNvbGEnO1xuaW1wb3J0IHsgZG93bmxvYWRUZW1wbGF0ZSB9IGZyb20gJ2dpZ2V0JztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHBjIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0IHsgRm9ybWF0dGVyIH0gZnJvbSAncGljb2NvbG9ycy90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBpbml0ID0gZGVmaW5lQ29tbWFuZDxcbiAgW1xuICAgIGRpcmVjdG9yeTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IHsgdGVtcGxhdGU/OiBzdHJpbmc7IHBtPzogc3RyaW5nOyBkZWJ1Zz86IGJvb2xlYW4gfSxcbiAgXVxuPihcbiAgYXN5bmMgKHVzZXJEaXJlY3RvcnksIGZsYWdzKSA9PiB7XG4gICAgY29uc29sYS5pbmZvKCdJbml0YWxpemluZyBuZXcgcHJvamVjdCcpO1xuXG4gICAgY29uc3QgdGVtcGxhdGVzID0gYXdhaXQgbGlzdFRlbXBsYXRlcygpO1xuICAgIGNvbnN0IGRlZmF1bHRUZW1wbGF0ZSA9IHRlbXBsYXRlcy5maW5kKFxuICAgICAgKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZS5uYW1lID09PSBmbGFncy50ZW1wbGF0ZT8udG9Mb3dlckNhc2UoKS50cmltKCksXG4gICAgKTtcblxuICAgIGNvbnN0IGlucHV0ID0gYXdhaXQgcHJvbXB0cyhcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdkaXJlY3RvcnknLFxuICAgICAgICAgIHR5cGU6ICgpID0+ICh1c2VyRGlyZWN0b3J5ID09IG51bGwgPyAndGV4dCcgOiB1bmRlZmluZWQpLFxuICAgICAgICAgIG1lc3NhZ2U6ICdQcm9qZWN0IERpcmVjdG9yeScsXG4gICAgICAgICAgaW5pdGlhbDogdXNlckRpcmVjdG9yeSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICd0ZW1wbGF0ZScsXG4gICAgICAgICAgdHlwZTogKCkgPT4gKGRlZmF1bHRUZW1wbGF0ZSA9PSBudWxsID8gJ3NlbGVjdCcgOiB1bmRlZmluZWQpLFxuICAgICAgICAgIG1lc3NhZ2U6ICdDaG9vc2UgYSB0ZW1wbGF0ZScsXG4gICAgICAgICAgY2hvaWNlczogdGVtcGxhdGVzLm1hcCgodGVtcGxhdGUpID0+ICh7XG4gICAgICAgICAgICB0aXRsZTpcbiAgICAgICAgICAgICAgVEVNUExBVEVfQ09MT1JTW3RlbXBsYXRlLm5hbWVdPy4odGVtcGxhdGUubmFtZSkgPz8gdGVtcGxhdGUubmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiB0ZW1wbGF0ZSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAncGFja2FnZU1hbmFnZXInLFxuICAgICAgICAgIHR5cGU6ICgpID0+IChmbGFncy5wbSA9PSBudWxsID8gJ3NlbGVjdCcgOiB1bmRlZmluZWQpLFxuICAgICAgICAgIG1lc3NhZ2U6ICdQYWNrYWdlIE1hbmFnZXInLFxuICAgICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICAgIHsgdGl0bGU6ICducG0nLCB2YWx1ZTogJ25wbScgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6ICdwbnBtJywgdmFsdWU6ICdwbnBtJyB9LFxuICAgICAgICAgICAgeyB0aXRsZTogJ3lhcm4nLCB2YWx1ZTogJ3lhcm4nIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIG9uQ2FuY2VsOiAoKSA9PiBwcm9jZXNzLmV4aXQoMSksXG4gICAgICB9LFxuICAgICk7XG4gICAgaW5wdXQuZGlyZWN0b3J5ID8/PSB1c2VyRGlyZWN0b3J5O1xuICAgIGlucHV0LnRlbXBsYXRlID8/PSBkZWZhdWx0VGVtcGxhdGU7XG4gICAgaW5wdXQucGFja2FnZU1hbmFnZXIgPz89IGZsYWdzLnBtO1xuXG4gICAgYXdhaXQgY2xvbmVQcm9qZWN0KGlucHV0KTtcblxuICAgIGNvbnN0IGNkUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aC5yZXNvbHZlKGlucHV0LmRpcmVjdG9yeSkpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sYS5sb2coXG4gICAgICBgXHUyNzI4IFdYVCBwcm9qZWN0IGNyZWF0ZWQgd2l0aCB0aGUgJHtcbiAgICAgICAgVEVNUExBVEVfQ09MT1JTW2lucHV0LnRlbXBsYXRlLm5hbWVdPy4oaW5wdXQudGVtcGxhdGUubmFtZSkgPz9cbiAgICAgICAgaW5wdXQudGVtcGxhdGUubmFtZVxuICAgICAgfSB0ZW1wbGF0ZS5gLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xhLmxvZygnTmV4dCBzdGVwczonKTtcbiAgICBsZXQgc3RlcCA9IDA7XG4gICAgaWYgKGNkUGF0aCAhPT0gJycpIGNvbnNvbGEubG9nKGAgICR7KytzdGVwfS5gLCBwYy5jeWFuKGBjZCAke2NkUGF0aH1gKSk7XG4gICAgY29uc29sYS5sb2coYCAgJHsrK3N0ZXB9LmAsIHBjLmN5YW4oYCR7aW5wdXQucGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgfSxcbiAgeyBkaXNhYmxlRmluaXNoZWRMb2c6IHRydWUgfSxcbik7XG5cbmludGVyZmFjZSBUZW1wbGF0ZSB7XG4gIC8qKlxuICAgKiBUZW1wbGF0ZSdzIG5hbWUuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYXRoIHRvIHRlbXBsYXRlIGRpcmVjdG9yeSBpbiBnaXRodWIgcmVwby5cbiAgICovXG4gIHBhdGg6IHN0cmluZztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdFRlbXBsYXRlcygpOiBQcm9taXNlPFRlbXBsYXRlW10+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3d4dC1kZXYvd3h0L2NvbnRlbnRzL3RlbXBsYXRlcycsXG4gICAgICB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBBY2NlcHQ6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24nLFxuICAgICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBpZiAocmVzLnN0YXR1cyA+PSAzMDApXG4gICAgICB0aHJvdyBFcnJvcihgUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fWApO1xuXG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCByZXMuanNvbigpKSBhcyBBcnJheTx7XG4gICAgICB0eXBlOiAnZmlsZScgfCAnZGlyJztcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIHBhdGg6IHN0cmluZztcbiAgICB9PjtcbiAgICByZXR1cm4gZGF0YVxuICAgICAgLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnR5cGUgPT09ICdkaXInKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gKHsgbmFtZTogaXRlbS5uYW1lLCBwYXRoOiBpdGVtLnBhdGggfSkpXG4gICAgICAuc29ydCgobCwgcikgPT4ge1xuICAgICAgICBjb25zdCBsV2VpZ2h0ID0gVEVNUExBVEVfU09SVF9XRUlHSFRbbC5uYW1lXSA/PyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgY29uc3QgcldlaWdodCA9IFRFTVBMQVRFX1NPUlRfV0VJR0hUW3IubmFtZV0gPz8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBsV2VpZ2h0IC0gcldlaWdodDtcbiAgICAgICAgaWYgKGRpZmYgIT09IDApIHJldHVybiBkaWZmO1xuICAgICAgICByZXR1cm4gbC5uYW1lLmxvY2FsZUNvbXBhcmUoci5uYW1lKTtcbiAgICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBFcnJvcihgQ2Fubm90IGxvYWQgdGVtcGxhdGVzOiAke0pTT04uc3RyaW5naWZ5KGVyciwgbnVsbCwgMil9YCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xvbmVQcm9qZWN0KHtcbiAgZGlyZWN0b3J5LFxuICB0ZW1wbGF0ZSxcbiAgcGFja2FnZU1hbmFnZXIsXG59OiB7XG4gIGRpcmVjdG9yeTogc3RyaW5nO1xuICB0ZW1wbGF0ZTogVGVtcGxhdGU7XG4gIHBhY2thZ2VNYW5hZ2VyOiBzdHJpbmc7XG59KSB7XG4gIGNvbnN0IHsgZGVmYXVsdDogb3JhIH0gPSBhd2FpdCBpbXBvcnQoJ29yYScpO1xuICBjb25zdCBzcGlubmVyID0gb3JhKCdEb3dubG9hZGluZyB0ZW1wbGF0ZScpLnN0YXJ0KCk7XG4gIHRyeSB7XG4gICAgLy8gMS4gQ2xvbmUgcmVwb1xuICAgIGF3YWl0IGRvd25sb2FkVGVtcGxhdGUoYGdoOnd4dC1kZXYvd3h0LyR7dGVtcGxhdGUucGF0aH1gLCB7XG4gICAgICBkaXI6IGRpcmVjdG9yeSxcbiAgICAgIGZvcmNlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gMi4gTW92ZSBfZ2l0aWdub3JlIC0+IC5naXRpZ25vcmVcbiAgICBhd2FpdCBmc1xuICAgICAgLm1vdmUoXG4gICAgICAgIHBhdGguam9pbihkaXJlY3RvcnksICdfZ2l0aWdub3JlJyksXG4gICAgICAgIHBhdGguam9pbihkaXJlY3RvcnksICcuZ2l0aWdub3JlJyksXG4gICAgICApXG4gICAgICAuY2F0Y2goKGVycikgPT5cbiAgICAgICAgY29uc29sYS53YXJuKCdGYWlsZWQgdG8gbW92ZSBfZ2l0aWdub3JlIHRvIC5naXRpZ25vcmU6JywgZXJyKSxcbiAgICAgICk7XG5cbiAgICAvLyAzLiBBZGQgLm5wbXJjIGZvciBwbnBtXG4gICAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAncG5wbScpIHtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgICAgcGF0aC5qb2luKGRpcmVjdG9yeSwgJy5ucG1yYycpLFxuICAgICAgICAnc2hhbWVmdWxseS1ob2lzdD10cnVlXFxuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc3Bpbm5lci5zdWNjZWVkKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHNwaW5uZXIuZmFpbCgpO1xuICAgIHRocm93IEVycm9yKGBGYWlsZWQgdG8gc2V0dXAgbmV3IHByb2plY3Q6ICR7SlNPTi5zdHJpbmdpZnkoZXJyLCBudWxsLCAyKX1gKTtcbiAgfVxufVxuXG5jb25zdCBURU1QTEFURV9DT0xPUlM6IFJlY29yZDxzdHJpbmcsIEZvcm1hdHRlcj4gPSB7XG4gIHZhbmlsbGE6IHBjLmJsdWUsXG4gIHZ1ZTogcGMuZ3JlZW4sXG4gIHJlYWN0OiBwYy5jeWFuLFxuICBzdmVsdGU6IHBjLnJlZCxcbiAgc29saWQ6IHBjLmJsdWUsXG59O1xuXG5jb25zdCBURU1QTEFURV9TT1JUX1dFSUdIVDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgdmFuaWxsYTogMCxcbiAgdnVlOiAxLFxuICByZWFjdDogMixcbn07XG4iLCAiaW1wb3J0IHsgZ2V0SW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2dldEludGVybmFsQ29uZmlnJztcbmltcG9ydCB7IGZpbmRFbnRyeXBvaW50cyB9IGZyb20gJy4uLy4uL2NvcmUvYnVpbGQvZmluZEVudHJ5cG9pbnRzJztcbmltcG9ydCB7IGdlbmVyYXRlVHlwZXNEaXIgfSBmcm9tICcuLi8uLi9jb3JlL2J1aWxkL2dlbmVyYXRlVHlwZXNEaXInO1xuaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuaW1wb3J0ICogYXMgd3h0IGZyb20gJy4uLy4uJztcblxuZXhwb3J0IGNvbnN0IHByZXBhcmUgPSBkZWZpbmVDb21tYW5kPFxuICBbXG4gICAgcm9vdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiB7XG4gICAgICBjb25maWc/OiBzdHJpbmc7XG4gICAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgfSxcbiAgXVxuPihhc3luYyAocm9vdCwgZmxhZ3MpID0+IHtcbiAgY29uc3QgY2xpQ29uZmlnOiB3eHQuSW5saW5lQ29uZmlnID0ge1xuICAgIHJvb3QsXG4gICAgY29uZmlnRmlsZTogZmxhZ3MuY29uZmlnLFxuICAgIGRlYnVnOiBmbGFncy5kZWJ1ZyxcbiAgfTtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgZ2V0SW50ZXJuYWxDb25maWcoY2xpQ29uZmlnLCAnYnVpbGQnKTtcblxuICBjb25maWcubG9nZ2VyLmluZm8oJ0dlbmVyYXRpbmcgdHlwZXMuLi4nKTtcblxuICBjb25zdCBlbnRyeXBvaW50cyA9IGF3YWl0IGZpbmRFbnRyeXBvaW50cyhjb25maWcpO1xuICBhd2FpdCBnZW5lcmF0ZVR5cGVzRGlyKGVudHJ5cG9pbnRzLCBjb25maWcpO1xufSk7XG4iLCAiaW1wb3J0IHsgY29uc29sYSB9IGZyb20gJ2NvbnNvbGEnO1xuaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuXG5leHBvcnQgY29uc3QgcHVibGlzaCA9IGRlZmluZUNvbW1hbmQoXG4gIGFzeW5jIChcbiAgICByb290OiBhbnksXG4gICAgeyBjb25maWc6IGNvbmZpZ0ZpbGUsIGRlYnVnIH06IHsgY29uZmlnPzogc3RyaW5nOyBkZWJ1Zz86IHN0cmluZyB9LFxuICApID0+IHtcbiAgICBjb25zb2xhLndhcm4oJ3d4dCBwdWJsaXNoOiBOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfSxcbik7XG4iLCAiaW1wb3J0IHsgQnVpbGRPdXRwdXQsIEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgemlwZGlyIGZyb20gJ3ppcC1kaXInO1xuaW1wb3J0IHsgZGlybmFtZSwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGtlYmFiQ2FzZUFscGhhbnVtZXJpYyB9IGZyb20gJy4vdXRpbHMvc3RyaW5ncyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlSnNvbiB9IGZyb20gJy4vdXRpbHMvcGFja2FnZSc7XG5pbXBvcnQgeyBtaW5pbWF0Y2ggfSBmcm9tICdtaW5pbWF0Y2gnO1xuaW1wb3J0IHsgZm9ybWF0RHVyYXRpb24gfSBmcm9tICcuL3V0aWxzL2Zvcm1hdER1cmF0aW9uJztcbmltcG9ydCB7IHByaW50RmlsZUxpc3QgfSBmcm9tICcuL2xvZy9wcmludEZpbGVMaXN0JztcblxuLyoqXG4gKiBaaXAgdGhlIGV4dGVuc2lvbiBmb3IgZGlzdHJpYnV0aW9uLiBEb2VzIG5vdCBidWlsZCwganVzdCB6aXBzIHRoZSBvdXRwdXQgdGhhdCBzaG91bGQgZXhpc3QgZm9yXG4gKiB0aGUgZ2l2ZW4gY29uZmlnLlxuICpcbiAqIFJldHVybnMgYSBsaXN0IG9mIFpJUCBmaWxlcyB0aGF0IHdlcmUgY3JlYXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHppcEV4dGVuc2lvbihcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgYnVpbGRPdXRwdXQ6IEJ1aWxkT3V0cHV0LFxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gIGNvbmZpZy5sb2dnZXIuaW5mbygnWmlwcGluZyBleHRlbnNpb24uLi4nKTtcbiAgY29uc3QgemlwRmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3QgcHJvamVjdE5hbWUgPVxuICAgIGNvbmZpZy56aXAubmFtZSA/P1xuICAgIGtlYmFiQ2FzZUFscGhhbnVtZXJpYyhcbiAgICAgIChhd2FpdCBnZXRQYWNrYWdlSnNvbihjb25maWcpKT8ubmFtZSB8fCBkaXJuYW1lKHByb2Nlc3MuY3dkKCkpLFxuICAgICk7XG4gIGNvbnN0IGFwcGx5VGVtcGxhdGUgPSAodGVtcGxhdGU6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIHRlbXBsYXRlXG4gICAgICAucmVwbGFjZUFsbCgne3tuYW1lfX0nLCBwcm9qZWN0TmFtZSlcbiAgICAgIC5yZXBsYWNlQWxsKCd7e2Jyb3dzZXJ9fScsIGNvbmZpZy5icm93c2VyKVxuICAgICAgLnJlcGxhY2VBbGwoXG4gICAgICAgICd7e3ZlcnNpb259fScsXG4gICAgICAgIGJ1aWxkT3V0cHV0Lm1hbmlmZXN0LnZlcnNpb25fbmFtZSA/PyBidWlsZE91dHB1dC5tYW5pZmVzdC52ZXJzaW9uLFxuICAgICAgKVxuICAgICAgLnJlcGxhY2VBbGwoJ3t7bWFuaWZlc3RWZXJzaW9ufX0nLCBgbXYke2NvbmZpZy5tYW5pZmVzdFZlcnNpb259YCk7XG5cbiAgYXdhaXQgZnMuZW5zdXJlRGlyKGNvbmZpZy5vdXRCYXNlRGlyKTtcblxuICAvLyBaSVAgb3V0cHV0IGRpcmVjdG9yeVxuXG4gIGNvbnN0IG91dFppcEZpbGVuYW1lID0gYXBwbHlUZW1wbGF0ZShjb25maWcuemlwLmFydGlmYWN0VGVtcGxhdGUpO1xuICBjb25zdCBvdXRaaXBQYXRoID0gcmVzb2x2ZShjb25maWcub3V0QmFzZURpciwgb3V0WmlwRmlsZW5hbWUpO1xuICBhd2FpdCB6aXBkaXIoY29uZmlnLm91dERpciwge1xuICAgIHNhdmVUbzogb3V0WmlwUGF0aCxcbiAgfSk7XG4gIHppcEZpbGVzLnB1c2gob3V0WmlwUGF0aCk7XG5cbiAgLy8gWklQIHNvdXJjZXMgZm9yIEZpcmVmb3hcblxuICBpZiAoY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94Jykge1xuICAgIGNvbnN0IHNvdXJjZXNaaXBGaWxlbmFtZSA9IGFwcGx5VGVtcGxhdGUoY29uZmlnLnppcC5zb3VyY2VzVGVtcGxhdGUpO1xuICAgIGNvbnN0IHNvdXJjZXNaaXBQYXRoID0gcmVzb2x2ZShjb25maWcub3V0QmFzZURpciwgc291cmNlc1ppcEZpbGVuYW1lKTtcbiAgICBhd2FpdCB6aXBkaXIoY29uZmlnLnppcC5zb3VyY2VzUm9vdCwge1xuICAgICAgc2F2ZVRvOiBzb3VyY2VzWmlwUGF0aCxcbiAgICAgIGZpbHRlcihwYXRoKSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKGNvbmZpZy56aXAuc291cmNlc1Jvb3QsIHBhdGgpO1xuICAgICAgICBjb25zdCBtYXRjaGVkUGF0dGVybiA9IGNvbmZpZy56aXAuaWdub3JlZFNvdXJjZXMuZmluZCgocGF0dGVybikgPT5cbiAgICAgICAgICBtaW5pbWF0Y2gocmVsYXRpdmVQYXRoLCBwYXR0ZXJuKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZWRQYXR0ZXJuID09IG51bGw7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHppcEZpbGVzLnB1c2goc291cmNlc1ppcFBhdGgpO1xuICB9XG5cbiAgYXdhaXQgcHJpbnRGaWxlTGlzdChcbiAgICBjb25maWcubG9nZ2VyLnN1Y2Nlc3MsXG4gICAgYFppcHBlZCBleHRlbnNpb24gaW4gJHtmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnQpfWAsXG4gICAgY29uZmlnLm91dEJhc2VEaXIsXG4gICAgemlwRmlsZXMsXG4gICk7XG5cbiAgcmV0dXJuIHppcEZpbGVzO1xufVxuIiwgImltcG9ydCAqIGFzIHd4dCBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBidWlsZEludGVybmFsIH0gZnJvbSAnLi4vLi4vY29yZS9idWlsZCc7XG5pbXBvcnQgeyBnZXRJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvZ2V0SW50ZXJuYWxDb25maWcnO1xuaW1wb3J0IHsgemlwRXh0ZW5zaW9uIH0gZnJvbSAnLi4vLi4vY29yZS96aXAnO1xuaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuXG5leHBvcnQgY29uc3QgemlwID0gZGVmaW5lQ29tbWFuZDxcbiAgW1xuICAgIHJvb3Q6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBmbGFnczoge1xuICAgICAgbW9kZT86IHN0cmluZztcbiAgICAgIGNvbmZpZz86IHN0cmluZztcbiAgICAgIGJyb3dzZXI/OiB3eHQuVGFyZ2V0QnJvd3NlcjtcbiAgICAgIG12Mz86IGJvb2xlYW47XG4gICAgICBtdjI/OiBib29sZWFuO1xuICAgICAgZGVidWc/OiBib29sZWFuO1xuICAgIH0sXG4gIF1cbj4oYXN5bmMgKHJvb3QsIGZsYWdzKSA9PiB7XG4gIGNvbnN0IGNsaUNvbmZpZzogd3h0LklubGluZUNvbmZpZyA9IHtcbiAgICByb290LFxuICAgIG1vZGU6IGZsYWdzLm1vZGUsXG4gICAgYnJvd3NlcjogZmxhZ3MuYnJvd3NlcixcbiAgICBtYW5pZmVzdFZlcnNpb246IGZsYWdzLm12MyA/IDMgOiBmbGFncy5tdjIgPyAyIDogdW5kZWZpbmVkLFxuICAgIGNvbmZpZ0ZpbGU6IGZsYWdzLmNvbmZpZyxcbiAgICBkZWJ1ZzogZmxhZ3MuZGVidWcsXG4gIH07XG5cbiAgY29uc3QgY29uZmlnID0gYXdhaXQgZ2V0SW50ZXJuYWxDb25maWcoY2xpQ29uZmlnLCAnYnVpbGQnKTtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgYnVpbGRJbnRlcm5hbChjb25maWcpO1xuICBhd2FpdCB6aXBFeHRlbnNpb24oY29uZmlnLCBvdXRwdXQpO1xufSk7XG4iLCAiaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuaW1wb3J0ICogYXMgd3h0IGZyb20gJy4uLy4uJztcblxuZXhwb3J0IGNvbnN0IGNsZWFuID0gZGVmaW5lQ29tbWFuZDxcbiAgW1xuICAgIHJvb3Q6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBmbGFnczoge1xuICAgICAgZGVidWc/OiBib29sZWFuO1xuICAgIH0sXG4gIF1cbj4od3h0LmNsZWFuKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBLDBFQUFBQSxTQUFBO0FBQUE7QUFBQSxJQUFBQSxRQUFPLFVBQVU7QUFDakIsVUFBTSxPQUFPO0FBRWIsUUFBSUMsT0FBSyxR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O0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFDQTtBQUFBLElBQ0EsVUFBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLElBQ1QsUUFBTztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsSUFDVCxRQUFPO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxJQUNULFFBQU87QUFBQSxFQUNQO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsSUFDQSxNQUFLO0FBQUEsSUFDTCxRQUFPO0FBQUEsSUFDUCxRQUFPO0FBQUEsSUFDUCxhQUFZO0FBQUEsSUFDWixVQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxJQUNBLE1BQUs7QUFBQSxJQUNMLFFBQU87QUFBQSxJQUNQLFFBQU87QUFBQSxJQUNQLGFBQVk7QUFBQSxJQUNaLFVBQVM7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLElBQ0EsTUFBSztBQUFBLElBQ0wsUUFBTztBQUFBLElBQ1AsUUFBTztBQUFBLElBQ1AsYUFBWTtBQUFBLElBQ1osVUFBUztBQUFB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U0FBUyxvQkFBb0IsRUFDcEMsT0FBZ0IsR0FBRztBQUd0QixJQUNHLFFBQVEsa0JBQWtCLDRCQUE0QixFQUN0RCxPQUFPLHVCQUF1QiwyQkFBMkIsRUFDekQsT0FBZ0IsT0FBTztBQUcxQixJQUNHLFFBQVEsZ0JBQWdCLGtDQUFrQyxFQUMxRCxNQUFNLFNBQVMsRUFDZixPQUFnQkMsTUFBSztBQUd4QixJQUFJLFFBQVEsa0JBQWtCLG1CQUFtQixFQUFFLE9BQWdCLE9BQU87QUFHMUUsSUFDRyxRQUFRLG9CQUFvQiwwQkFBMEIsRUFDdEQsT0FBTyw2QkFBNkIsaUJBQWlCLEVBQ3JELE9BQU8seUJBQXlCLDhCQUE4QixFQUM5RCxPQUFnQixJQUFJO0FBRXZCLElBQUksTUFBTTsiLAogICJuYW1lcyI6IFsibW9kdWxlIiwgImZzIiwgInBhdGgiLCAibW9kdWxlIiwgImZzIiwgInBhdGgiLCAibW9kdWxlIiwgImZzIiwgInBhdGgiLCAicmVzb2x2ZSIsICJtb2R1bGUiLCAicGF0aCIsICJyZXNvbHZlIiwgIm1vZHVsZSIsICJwYXRoS2V5IiwgIm1vZHVsZSIsICJwYXRoIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInBhdGgiLCAibW9kdWxlIiwgImZzIiwgIm1vZHVsZSIsICJwYXRoIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJwcm9jZXNzIiwgInVubG9hZCIsICJlbWl0IiwgImxvYWQiLCAicHJvY2Vzc1JlYWxseUV4aXQiLCAicHJvY2Vzc0VtaXQiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnZXRTdHJlYW0iLCAic3RyZWFtIiwgInJlc29sdmUiLCAibW9kdWxlIiwgImltcG9ydF9ub2RlX3BhdGgiLCAidml0ZSIsICJpbXBvcnRfZnNfZXh0cmEiLCAiZnMiLCAicGF0aCIsICJmcyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgIm5vcm1hbGl6ZVBhdGgiLCAicGF0aCIsICJub2RlUGF0aCIsICJwYXRoIiwgIm5vcm1hbGl6ZVBhdGgiLCAiaW1wb3J0X3BhdGgiLCAidXJsIiwgImlzT2ZmbGluZSIsICJkbnMiLCAidXJsIiwgInVybCIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJub3JtYWxpemVQYXRoIiwgImZzIiwgImltcG9ydF9wYXRoIiwgInVuaW1wb3J0IiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJub3JtYWxpemVQYXRoIiwgImZzIiwgImNvbnNvbGEiLCAicGF0aCIsICJlbnYiLCAiemlwIiwgImdsb2JhbCIsICJpbXBvcnRfcGljb2NvbG9ycyIsICJub3JtYWxpemVQYXRoIiwgImltcG9ydF9jb25zb2xhIiwgImltcG9ydF9ub2RlX3BhdGgiLCAidml0ZSIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAiZnMiLCAicGF0aCIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImZzIiwgImdsb2IiLCAicGMiLCAiZ2xvYmFsIiwgImZzIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfbGlua2Vkb20iLCAiaW1wb3J0X3VuaW1wb3J0IiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJwYXRoIiwgIm5vcm1hbGl6ZVBhdGgiLCAidW5pbXBvcnQiLCAiZnMiLCAiY3JlYXRlSklUSSIsICJpbXBvcnRfZmFzdF9nbG9iIiwgImdsb2IiLCAicGF0aCIsICJKU09ONSIsICJmcyIsICJpbXBvcnRfdW5pbXBvcnQiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiZnMiLCAidW5pbXBvcnQiLCAibm9ybWFsaXplUGF0aCIsICJwYXRoIiwgImdsb2JhbCIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJpbXBvcnRfZnNfZXh0cmEiLCAiZnMiLCAidml0ZSIsICJmcyIsICJ2ZXJzaW9uIiwgIm9wdGlvbnMiLCAibm9ybWFsaXplUGF0aCIsICJpbXBvcnRfcGljb2NvbG9ycyIsICJ2aXRlIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImltcG9ydF9waWNvY29sb3JzIiwgImltcG9ydF9mc19leHRyYSIsICJwYXRoIiwgImZzIiwgInBjIiwgImltcG9ydF9ub2RlX2J1ZmZlciIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImltcG9ydF9ub2RlX2NoaWxkX3Byb2Nlc3MiLCAiaW1wb3J0X25vZGVfcHJvY2VzcyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgInByb2Nlc3MiLCAidXJsIiwgInBhdGgiLCAib25ldGltZSIsICJpbXBvcnRfbm9kZV9wcm9jZXNzIiwgImltcG9ydF9ub2RlX29zIiwgInByb2Nlc3MiLCAiaW1wb3J0X25vZGVfb3MiLCAib3MiLCAicmVzb2x2ZSIsICJvbkV4aXQiLCAiaW1wb3J0X25vZGVfZnMiLCAibWVyZ2VTdHJlYW0iLCAiZ2V0U3RyZWFtIiwgInJlc29sdmUiLCAiaW1wb3J0X25vZGVfY2hpbGRfcHJvY2VzcyIsICJleHByZXNzaW9uIiwgImltcG9ydF9ub2RlX3Byb2Nlc3MiLCAicHJvY2VzcyIsICJwcm9jZXNzIiwgImNyb3NzU3Bhd24iLCAicGF0aCIsICJjaGlsZFByb2Nlc3MiLCAiJCIsICJpbXBvcnRfZmFzdF9nbG9iIiwgInBjIiwgImZzIiwgImdsb2IiLCAidml0ZSIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJpc1dzbCIsICJwYXRoIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X2Zhc3RfZ2xvYiIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X2NvbnNvbGEiLCAiaW1wb3J0X3BpY29jb2xvcnMiLCAicGMiLCAiZ2xvYiIsICJwYXRoIiwgImZzIiwgImJ1aWxkIiwgImNyZWF0ZVNlcnZlciIsICJwYXRoIiwgInBjIiwgImltcG9ydF9jb25zb2xhIiwgImltcG9ydF9waWNvY29sb3JzIiwgImltcG9ydF9jb25zb2xhIiwgInBjIiwgImJ1aWxkIiwgImNyZWF0ZVNlcnZlciIsICJpbXBvcnRfY29uc29sYSIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJpbXBvcnRfcGljb2NvbG9ycyIsICJwcm9tcHRzIiwgInBhdGgiLCAicGMiLCAiZnMiLCAiaW1wb3J0X2NvbnNvbGEiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X21pbmltYXRjaCIsICJmcyIsICJ6aXBkaXIiLCAicGF0aCIsICJjbGVhbiIsICJjYWMiLCAiYnVpbGQiLCAiY2xlYW4iXQp9Cg==
|