@workflow/world-testing 4.0.1-beta.30 → 4.0.1-beta.31

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.
@@ -23438,7 +23438,7 @@ function parsePort(value, radix = 10) {
23438
23438
  __name(parsePort, "parsePort");
23439
23439
  var join = /* @__PURE__ */ __name((arr, sep) => arr.join(sep), "join");
23440
23440
  var PROC_ROOT = join(["", "proc"], "/");
23441
- async function getLinuxPort(pid) {
23441
+ async function getLinuxPorts(pid) {
23442
23442
  const listenState = "0A";
23443
23443
  const tcpFiles = [`${PROC_ROOT}/net/tcp`, `${PROC_ROOT}/net/tcp6`];
23444
23444
  const socketInodes = [];
@@ -23464,16 +23464,16 @@ async function getLinuxPort(pid) {
23464
23464
  }
23465
23465
  }
23466
23466
  catch {
23467
- return void 0;
23467
+ return [];
23468
23468
  }
23469
23469
  if (socketInodes.length === 0) {
23470
- return void 0;
23470
+ return [];
23471
23471
  }
23472
+ const inodeToPort = /* @__PURE__ */ new Map();
23472
23473
  for (const tcpFile of tcpFiles) {
23473
23474
  try {
23474
23475
  const content = await (0, import_promises.readFile)(tcpFile, "utf8");
23475
23476
  const lines = content.split("\n").slice(1);
23476
- const inodeToPort = /* @__PURE__ */ new Map();
23477
23477
  for (const line of lines) {
23478
23478
  if (!line.trim())
23479
23479
  continue;
@@ -23498,87 +23498,152 @@ async function getLinuxPort(pid) {
23498
23498
  inodeToPort.set(inode, port);
23499
23499
  }
23500
23500
  }
23501
- for (const inode of socketInodes) {
23502
- const port = inodeToPort.get(inode);
23503
- if (port !== void 0) {
23504
- return port;
23505
- }
23506
- }
23507
23501
  }
23508
23502
  catch {
23509
23503
  continue;
23510
23504
  }
23511
23505
  }
23512
- return void 0;
23506
+ const ports = [];
23507
+ for (const inode of socketInodes) {
23508
+ const port = inodeToPort.get(inode);
23509
+ if (port !== void 0) {
23510
+ ports.push(port);
23511
+ }
23512
+ }
23513
+ return ports;
23513
23514
  }
23514
- __name(getLinuxPort, "getLinuxPort");
23515
- async function getPort() {
23516
- const { pid, platform } = process;
23517
- let port;
23515
+ __name(getLinuxPorts, "getLinuxPorts");
23516
+ async function getDarwinPorts(pid) {
23518
23517
  try {
23519
- switch (platform) {
23520
- case "linux": {
23521
- port = await getLinuxPort(pid);
23522
- break;
23523
- }
23524
- case "darwin": {
23525
- const { stdout } = await execFileAsync("lsof", [
23526
- "-a",
23527
- "-i",
23528
- "-P",
23529
- "-n",
23530
- "-p",
23531
- pid.toString()
23532
- ]);
23533
- const lines = stdout.split("\n");
23534
- for (const line of lines) {
23535
- if (line.includes("LISTEN")) {
23536
- const parts = line.trim().split(/\s+/);
23537
- const addr = parts[8];
23538
- if (addr) {
23539
- const colonIndex = addr.lastIndexOf(":");
23540
- if (colonIndex !== -1) {
23541
- port = parsePort(addr.slice(colonIndex + 1));
23542
- if (port !== void 0) {
23543
- break;
23544
- }
23545
- }
23518
+ const { stdout } = await execFileAsync("lsof", [
23519
+ "-a",
23520
+ "-i",
23521
+ "-P",
23522
+ "-n",
23523
+ "-p",
23524
+ pid.toString()
23525
+ ]);
23526
+ const ports = [];
23527
+ const lines = stdout.split("\n");
23528
+ for (const line of lines) {
23529
+ if (line.includes("LISTEN")) {
23530
+ const parts = line.trim().split(/\s+/);
23531
+ const addr = parts[8];
23532
+ if (addr) {
23533
+ const colonIndex = addr.lastIndexOf(":");
23534
+ if (colonIndex !== -1) {
23535
+ const port = parsePort(addr.slice(colonIndex + 1));
23536
+ if (port !== void 0) {
23537
+ ports.push(port);
23546
23538
  }
23547
23539
  }
23548
23540
  }
23549
- break;
23550
23541
  }
23551
- case "win32": {
23552
- const { stdout } = await execFileAsync("cmd", [
23553
- "/c",
23554
- `netstat -ano | findstr ${pid} | findstr LISTENING`
23555
- ]);
23556
- const trimmedOutput = stdout.trim();
23557
- if (trimmedOutput) {
23558
- const lines = trimmedOutput.split("\n");
23559
- for (const line of lines) {
23560
- const match = line.trim().match(/^\s*TCP\s+(?:\[[\da-f:]+\]|[\d.]+):(\d+)\s+/i);
23561
- if (match) {
23562
- port = parsePort(match[1]);
23563
- if (port !== void 0) {
23564
- break;
23565
- }
23566
- }
23542
+ }
23543
+ return ports;
23544
+ }
23545
+ catch {
23546
+ return [];
23547
+ }
23548
+ }
23549
+ __name(getDarwinPorts, "getDarwinPorts");
23550
+ async function getWindowsPorts(pid) {
23551
+ try {
23552
+ const { stdout } = await execFileAsync("cmd", [
23553
+ "/c",
23554
+ `netstat -ano | findstr ${pid} | findstr LISTENING`
23555
+ ]);
23556
+ const ports = [];
23557
+ const trimmedOutput = stdout.trim();
23558
+ if (trimmedOutput) {
23559
+ const lines = trimmedOutput.split("\n");
23560
+ for (const line of lines) {
23561
+ const match = line.trim().match(/^\s*TCP\s+(?:\[[\da-f:]+\]|[\d.]+):(\d+)\s+/i);
23562
+ if (match) {
23563
+ const port = parsePort(match[1]);
23564
+ if (port !== void 0) {
23565
+ ports.push(port);
23567
23566
  }
23568
23567
  }
23569
- break;
23570
23568
  }
23571
23569
  }
23570
+ return ports;
23571
+ }
23572
+ catch {
23573
+ return [];
23574
+ }
23575
+ }
23576
+ __name(getWindowsPorts, "getWindowsPorts");
23577
+ async function getAllPorts() {
23578
+ const { pid, platform } = process;
23579
+ try {
23580
+ switch (platform) {
23581
+ case "linux":
23582
+ return await getLinuxPorts(pid);
23583
+ case "darwin":
23584
+ return await getDarwinPorts(pid);
23585
+ case "win32":
23586
+ return await getWindowsPorts(pid);
23587
+ default:
23588
+ return [];
23589
+ }
23572
23590
  }
23573
23591
  catch (error45) {
23574
23592
  if (process.env.NODE_ENV === "development") {
23575
- console.debug("[getPort] Detection failed:", error45);
23593
+ console.debug("[getAllPorts] Detection failed:", error45);
23576
23594
  }
23577
- return void 0;
23595
+ return [];
23578
23596
  }
23579
- return Number.isNaN(port) ? void 0 : port;
23597
+ }
23598
+ __name(getAllPorts, "getAllPorts");
23599
+ async function getPort() {
23600
+ const ports = await getAllPorts();
23601
+ return ports[0];
23580
23602
  }
23581
23603
  __name(getPort, "getPort");
23604
+ var PROBE_TIMEOUT_MS = 1e3;
23605
+ var PROBE_ENDPOINT = "/.well-known/workflow/v1/flow";
23606
+ async function probePort(port, options = {}) {
23607
+ const { endpoint = PROBE_ENDPOINT, timeout = PROBE_TIMEOUT_MS } = options;
23608
+ const controller = new AbortController();
23609
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
23610
+ try {
23611
+ const response = await fetch(`http://localhost:${port}${endpoint}`, {
23612
+ method: "HEAD",
23613
+ signal: controller.signal
23614
+ });
23615
+ return response.status !== 404;
23616
+ }
23617
+ catch {
23618
+ return false;
23619
+ }
23620
+ finally {
23621
+ clearTimeout(timeoutId);
23622
+ }
23623
+ }
23624
+ __name(probePort, "probePort");
23625
+ async function getWorkflowPort(options) {
23626
+ const ports = await getAllPorts();
23627
+ if (ports.length === 0) {
23628
+ return void 0;
23629
+ }
23630
+ if (ports.length === 1) {
23631
+ return ports[0];
23632
+ }
23633
+ const probeResults = await Promise.all(ports.map(async (port) => ({
23634
+ port,
23635
+ isWorkflow: await probePort(port, options)
23636
+ })));
23637
+ const workflowPort = probeResults.find((r) => r.isWorkflow);
23638
+ if (workflowPort) {
23639
+ return workflowPort.port;
23640
+ }
23641
+ if (process.env.NODE_ENV === "development") {
23642
+ console.debug("[getWorkflowPort] Probing failed, falling back to first port:", ports[0]);
23643
+ }
23644
+ return ports[0];
23645
+ }
23646
+ __name(getWorkflowPort, "getWorkflowPort");
23582
23647
  // ../../node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/classic/external.js
23583
23648
  var external_exports = {};
23584
23649
  __export(external_exports, {
@@ -36994,7 +37059,7 @@ async function resolveBaseUrl(config3) {
36994
37059
  if (process.env.PORT) {
36995
37060
  return `http://localhost:${process.env.PORT}`;
36996
37061
  }
36997
- const detectedPort = await getPort();
37062
+ const detectedPort = await getWorkflowPort();
36998
37063
  if (detectedPort) {
36999
37064
  return `http://localhost:${detectedPort}`;
37000
37065
  }
@@ -39709,7 +39774,7 @@ __name(createLocalWorld, "createLocalWorld");
39709
39774
  var import_node_os = __toESM(require("node:os"), 1);
39710
39775
  var import_oidc2 = __toESM(require_dist(), 1);
39711
39776
  // ../world-vercel/dist/version.js
39712
- var version2 = "4.0.1-beta.18";
39777
+ var version2 = "4.0.1-beta.19";
39713
39778
  // ../world-vercel/dist/utils.js
39714
39779
  var DEFAULT_RESOLVE_DATA_OPTION2 = "all";
39715
39780
  function dateToStringReplacer(_key, value) {
@@ -43238,6 +43303,19 @@ __name(brokenWf, "brokenWf");
43238
43303
  brokenWf.workflowId = "workflow//workflows/noop.ts//brokenWf";
43239
43304
  globalThis.__private_workflows.set("workflow//workflows/noop.ts//brokenWf", brokenWf);
43240
43305
 
43306
+ // workflows/addition.ts
43307
+ var add = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflows/addition.ts//add");
43308
+ async function addition(num, num2) {
43309
+ const result = await add(num, num2);
43310
+ console.log({
43311
+ result
43312
+ });
43313
+ return result;
43314
+ }
43315
+ __name(addition, "addition");
43316
+ addition.workflowId = "workflow//workflows/addition.ts//addition";
43317
+ globalThis.__private_workflows.set("workflow//workflows/addition.ts//addition", addition);
43318
+
43241
43319
  // ../utils/dist/index.js
43242
43320
  var import_ms = __toESM(require_ms(), 1);
43243
43321
 
@@ -46993,29 +47071,6 @@ collectWithHook.workflowId = "workflow//workflows/hooks.ts//collectWithHook";
46993
47071
  globalThis.__private_workflows.set("workflow//workflows/hooks.ts//collectWithHook", collectWithHook);
46994
47072
  var writeEvent = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflows/hooks.ts//writeEvent");
46995
47073
 
46996
- // workflows/null-byte.ts
46997
- var nullByteStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflows/null-byte.ts//nullByteStep");
46998
- async function nullByteWorkflow() {
46999
- const a = await nullByteStep();
47000
- return a;
47001
- }
47002
- __name(nullByteWorkflow, "nullByteWorkflow");
47003
- nullByteWorkflow.workflowId = "workflow//workflows/null-byte.ts//nullByteWorkflow";
47004
- globalThis.__private_workflows.set("workflow//workflows/null-byte.ts//nullByteWorkflow", nullByteWorkflow);
47005
-
47006
- // workflows/addition.ts
47007
- var add = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflows/addition.ts//add");
47008
- async function addition(num, num2) {
47009
- const result = await add(num, num2);
47010
- console.log({
47011
- result
47012
- });
47013
- return result;
47014
- }
47015
- __name(addition, "addition");
47016
- addition.workflowId = "workflow//workflows/addition.ts//addition";
47017
- globalThis.__private_workflows.set("workflow//workflows/addition.ts//addition", addition);
47018
-
47019
47074
  // workflows/retriable-and-fatal.ts
47020
47075
  async function retryableAndFatalErrorWorkflow() {
47021
47076
  const retryableResult = await stepThatThrowsRetryableError();
@@ -47037,7 +47092,17 @@ retryableAndFatalErrorWorkflow.workflowId = "workflow//workflows/retriable-and-f
47037
47092
  globalThis.__private_workflows.set("workflow//workflows/retriable-and-fatal.ts//retryableAndFatalErrorWorkflow", retryableAndFatalErrorWorkflow);
47038
47093
  var stepThatThrowsRetryableError = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflows/retriable-and-fatal.ts//stepThatThrowsRetryableError");
47039
47094
  var stepThatFails = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflows/retriable-and-fatal.ts//stepThatFails");
47040
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21zQDIuMS4zL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJ3b3JrZmxvd3Mvbm9vcC50cyIsICIuLi91dGlscy9zcmMvaW5kZXgudHMiLCAiLi4vZXJyb3JzL3NyYy9pbmRleC50cyIsICIuLi9jb3JlL3NyYy9zeW1ib2xzLnRzIiwgIi4uL2NvcmUvc3JjL3dvcmtmbG93L2NyZWF0ZS1ob29rLnRzIiwgIi4uL2NvcmUvc3JjL3dvcmtmbG93L2RlZmluZS1ob29rLnRzIiwgIi4uL2NvcmUvc3JjL3dvcmtmbG93L3dyaXRhYmxlLXN0cmVhbS50cyIsICIuLi93b3JrZmxvdy9zcmMvc3RkbGliLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9jb3JlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS91dGlsLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9lcnJvcnMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjEuMTEvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3BhcnNlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9yZWdleGVzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9jaGVja3MuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjEuMTEvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL2RvYy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvdmVyc2lvbnMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjEuMTEvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3NjaGVtYXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjEuMTEvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3JlZ2lzdHJpZXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjEuMTEvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL2FwaS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NsYXNzaWMvaXNvLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY2xhc3NpYy9lcnJvcnMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjEuMTEvbm9kZV9tb2R1bGVzL3pvZC92NC9jbGFzc2ljL3BhcnNlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY2xhc3NpYy9zY2hlbWFzLmpzIiwgIndvcmtmbG93cy9ob29rcy50cyIsICJ3b3JrZmxvd3MvbnVsbC1ieXRlLnRzIiwgIndvcmtmbG93cy9hZGRpdGlvbi50cyIsICJ3b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBIZWxwZXJzLlxuICovIHZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB3ID0gZCAqIDc7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqLyBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArIEpTT04uc3RyaW5naWZ5KHZhbCkpO1xufTtcbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovIGZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICAgIHN0ciA9IFN0cmluZyhzdHIpO1xuICAgIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKHN0cik7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gICAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgICBzd2l0Y2godHlwZSl7XG4gICAgICAgIGNhc2UgJ3llYXJzJzpcbiAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgIGNhc2UgJ3lycyc6XG4gICAgICAgIGNhc2UgJ3lyJzpcbiAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHk7XG4gICAgICAgIGNhc2UgJ3dlZWtzJzpcbiAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiB3O1xuICAgICAgICBjYXNlICdkYXlzJzpcbiAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIGQ7XG4gICAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNhc2UgJ2hycyc6XG4gICAgICAgIGNhc2UgJ2hyJzpcbiAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIGg7XG4gICAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICBjYXNlICdtaW5zJzpcbiAgICAgICAgY2FzZSAnbWluJzpcbiAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIG07XG4gICAgICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICBjYXNlICdzZWNzJzpcbiAgICAgICAgY2FzZSAnc2VjJzpcbiAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHM7XG4gICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnbXNlY3MnOlxuICAgICAgICBjYXNlICdtc2VjJzpcbiAgICAgICAgY2FzZSAnbXMnOlxuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi8gZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gICAgaWYgKG1zQWJzID49IGQpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IGgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IG0pIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IHMpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgICB9XG4gICAgcmV0dXJuIG1zICsgJ21zJztcbn1cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqLyBmdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gICAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICAgIGlmIChtc0FicyA+PSBkKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBoKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gbSkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gcykge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICAgIH1cbiAgICByZXR1cm4gbXMgKyAnIG1zJztcbn1cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi8gZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICAgIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG59XG4iLCAiLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJ3b3JrZmxvd3Mvbm9vcC50c1wiOntcImJyb2tlbldmXCI6e1wid29ya2Zsb3dJZFwiOlwid29ya2Zsb3cvL3dvcmtmbG93cy9ub29wLnRzLy9icm9rZW5XZlwifX19LFwic3RlcHNcIjp7XCJ3b3JrZmxvd3Mvbm9vcC50c1wiOntcIm5vb3BcIjp7XCJzdGVwSWRcIjpcInN0ZXAvL3dvcmtmbG93cy9ub29wLnRzLy9ub29wXCJ9fX19Ki87XG5leHBvcnQgdmFyIG5vb3AgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy93b3JrZmxvd3Mvbm9vcC50cy8vbm9vcFwiKTtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBicm9rZW5XZigpIHtcbiAgICBjb25zdCBudW1iZXJzID0gW107XG4gICAge1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgMTA7IGkrKyl7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKG5vb3AoaSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdhd2FpdCAxMCcpO1xuICAgICAgICBudW1iZXJzLnB1c2goLi4uYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKTtcbiAgICB9XG4gICAge1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgMTAwOyBpKyspe1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChub29wKDEwMDAgKyBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ2F3YWl0IDEwMCcpO1xuICAgICAgICBudW1iZXJzLnB1c2goLi4uYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coJ2RvbmUuJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbnVtYmVyc1xuICAgIH07XG59XG5icm9rZW5XZi53b3JrZmxvd0lkID0gXCJ3b3JrZmxvdy8vd29ya2Zsb3dzL25vb3AudHMvL2Jyb2tlbldmXCI7XG5nbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KFwid29ya2Zsb3cvL3dvcmtmbG93cy9ub29wLnRzLy9icm9rZW5XZlwiLCBicm9rZW5XZik7XG4iLCAiaW1wb3J0IHR5cGUgeyBTdHJpbmdWYWx1ZSB9IGZyb20gJ21zJztcbmltcG9ydCBtcyBmcm9tICdtcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICBwcm9taXNlOiBQcm9taXNlPFQ+O1xuICByZXNvbHZlOiAodmFsdWU6IFQpID0+IHZvaWQ7XG4gIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBQb2x5ZmlsbCBmb3IgYFByb21pc2Uud2l0aFJlc29sdmVycygpYC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb21pc2Uvd2l0aFJlc29sdmVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFJlc29sdmVyczxUPigpOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gIGxldCByZXNvbHZlITogKHZhbHVlOiBUKSA9PiB2b2lkO1xuICBsZXQgcmVqZWN0ITogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFQ+KChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuICAgIHJlc29sdmUgPSBfcmVzb2x2ZTtcbiAgICByZWplY3QgPSBfcmVqZWN0O1xuICB9KTtcbiAgcmV0dXJuIHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGxhemlseS1ldmFsdWF0ZWQsIG1lbW9pemVkIHZlcnNpb24gb2YgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLlxuICpcbiAqIFRoZSByZXR1cm5lZCBvYmplY3QgZXhwb3NlcyBhIGB2YWx1ZWAgZ2V0dGVyIHRoYXQgY2FsbHMgYGZuYCBvbmx5IG9uY2UsXG4gKiBjYWNoZXMgaXRzIHJlc3VsdCwgYW5kIHJldHVybnMgdGhlIGNhY2hlZCB2YWx1ZSBvbiBzdWJzZXF1ZW50IGFjY2Vzc2VzLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uXG4gKiBAcGFyYW0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uY2UgYW5kIHdob3NlIHJlc3VsdCB3aWxsIGJlIGNhY2hlZC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGEgYHZhbHVlYCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdGhlIG1lbW9pemVkIHJlc3VsdCBvZiBgZm5gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25jZTxUPihmbjogKCkgPT4gVCkge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgY29uc3QgdmFsdWUgPSBmbigpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgJ3ZhbHVlJywgeyB2YWx1ZSB9KTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICB9O1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIGR1cmF0aW9uIHBhcmFtZXRlciAoc3RyaW5nLCBudW1iZXIsIG9yIERhdGUpIGFuZCByZXR1cm5zIGEgRGF0ZSBvYmplY3RcbiAqIHJlcHJlc2VudGluZyB3aGVuIHRoZSBkdXJhdGlvbiBzaG91bGQgZWxhcHNlLlxuICpcbiAqIC0gRm9yIHN0cmluZ3M6IFBhcnNlcyBkdXJhdGlvbiBzdHJpbmdzIGxpa2UgXCIxc1wiLCBcIjVtXCIsIFwiMWhcIiwgZXRjLiB1c2luZyB0aGUgYG1zYCBsaWJyYXJ5XG4gKiAtIEZvciBudW1iZXJzOiBUcmVhdHMgYXMgbWlsbGlzZWNvbmRzIGZyb20gbm93XG4gKiAtIEZvciBEYXRlIG9iamVjdHM6IFJldHVybnMgdGhlIGRhdGUgZGlyZWN0bHkgKGhhbmRsZXMgYm90aCBEYXRlIGluc3RhbmNlcyBhbmQgZGF0ZS1saWtlIG9iamVjdHMgZnJvbSBkZXNlcmlhbGl6YXRpb24pXG4gKlxuICogQHBhcmFtIHBhcmFtIC0gVGhlIGR1cmF0aW9uIHBhcmFtZXRlciAoU3RyaW5nVmFsdWUsIERhdGUsIG9yIG51bWJlciBvZiBtaWxsaXNlY29uZHMpXG4gKiBAcmV0dXJucyBBIERhdGUgb2JqZWN0IHJlcHJlc2VudGluZyB3aGVuIHRoZSBkdXJhdGlvbiBzaG91bGQgZWxhcHNlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHBhcmFtZXRlciBpcyBpbnZhbGlkIG9yIGNhbm5vdCBiZSBwYXJzZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRHVyYXRpb25Ub0RhdGUocGFyYW06IFN0cmluZ1ZhbHVlIHwgRGF0ZSB8IG51bWJlcik6IERhdGUge1xuICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBtcyhwYXJhbSk7XG4gICAgaWYgKHR5cGVvZiBkdXJhdGlvbk1zICE9PSAnbnVtYmVyJyB8fCBkdXJhdGlvbk1zIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBkdXJhdGlvbjogXCIke3BhcmFtfVwiLiBFeHBlY3RlZCBhIHZhbGlkIGR1cmF0aW9uIHN0cmluZyBsaWtlIFwiMXNcIiwgXCIxbVwiLCBcIjFoXCIsIGV0Yy5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5ub3coKSArIGR1cmF0aW9uTXMpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAocGFyYW0gPCAwIHx8ICFOdW1iZXIuaXNGaW5pdGUocGFyYW0pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGR1cmF0aW9uOiAke3BhcmFtfS4gRXhwZWN0ZWQgYSBub24tbmVnYXRpdmUgZmluaXRlIG51bWJlciBvZiBtaWxsaXNlY29uZHMuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUubm93KCkgKyBwYXJhbSk7XG4gIH0gZWxzZSBpZiAoXG4gICAgcGFyYW0gaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgKHBhcmFtICYmXG4gICAgICB0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnICYmXG4gICAgICB0eXBlb2YgKHBhcmFtIGFzIGFueSkuZ2V0VGltZSA9PT0gJ2Z1bmN0aW9uJylcbiAgKSB7XG4gICAgLy8gSGFuZGxlIGJvdGggRGF0ZSBpbnN0YW5jZXMgYW5kIGRhdGUtbGlrZSBvYmplY3RzIChmcm9tIGRlc2VyaWFsaXphdGlvbilcbiAgICByZXR1cm4gcGFyYW0gaW5zdGFuY2VvZiBEYXRlID8gcGFyYW0gOiBuZXcgRGF0ZSgocGFyYW0gYXMgYW55KS5nZXRUaW1lKCkpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGR1cmF0aW9uIHBhcmFtZXRlci4gRXhwZWN0ZWQgYSBkdXJhdGlvbiBzdHJpbmcsIG51bWJlciAobWlsbGlzZWNvbmRzKSwgb3IgRGF0ZSBvYmplY3QuYFxuICAgICk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBwYXJzZUR1cmF0aW9uVG9EYXRlIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB0eXBlIHsgU3RydWN0dXJlZEVycm9yIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgU3RyaW5nVmFsdWUgfSBmcm9tICdtcyc7XG5cbmNvbnN0IEJBU0VfVVJMID0gJ2h0dHBzOi8vdXNld29ya2Zsb3cuZGV2L2Vycic7XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBDaGVjayBpZiBhIHZhbHVlIGlzIGFuIEVycm9yIHdpdGhvdXQgcmVseWluZyBvbiBOb2RlLmpzIHV0aWxpdGllcy5cbiAqIFRoaXMgaXMgbmVlZGVkIGZvciBlcnJvciBjbGFzc2VzIHRoYXQgY2FuIGJlIHVzZWQgaW4gVk0gY29udGV4dHMgd2hlcmVcbiAqIE5vZGUuanMgaW1wb3J0cyBhcmUgbm90IGF2YWlsYWJsZS5cbiAqL1xuZnVuY3Rpb24gaXNFcnJvcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHsgbmFtZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgJ25hbWUnIGluIHZhbHVlICYmXG4gICAgJ21lc3NhZ2UnIGluIHZhbHVlXG4gICk7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBBbGwgdGhlIHNsdWdzIG9mIHRoZSBlcnJvcnMgdXNlZCBmb3IgZG9jdW1lbnRhdGlvbiBsaW5rcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEVSUk9SX1NMVUdTID0ge1xuICBOT0RFX0pTX01PRFVMRV9JTl9XT1JLRkxPVzogJ25vZGUtanMtbW9kdWxlLWluLXdvcmtmbG93JyxcbiAgU1RBUlRfSU5WQUxJRF9XT1JLRkxPV19GVU5DVElPTjogJ3N0YXJ0LWludmFsaWQtd29ya2Zsb3ctZnVuY3Rpb24nLFxuICBTRVJJQUxJWkFUSU9OX0ZBSUxFRDogJ3NlcmlhbGl6YXRpb24tZmFpbGVkJyxcbiAgV0VCSE9PS19JTlZBTElEX1JFU1BPTkRfV0lUSF9WQUxVRTogJ3dlYmhvb2staW52YWxpZC1yZXNwb25kLXdpdGgtdmFsdWUnLFxuICBXRUJIT09LX1JFU1BPTlNFX05PVF9TRU5UOiAnd2ViaG9vay1yZXNwb25zZS1ub3Qtc2VudCcsXG4gIEZFVENIX0lOX1dPUktGTE9XX0ZVTkNUSU9OOiAnZmV0Y2gtaW4td29ya2Zsb3cnLFxufSBhcyBjb25zdDtcblxudHlwZSBFcnJvclNsdWcgPSAodHlwZW9mIEVSUk9SX1NMVUdTKVtrZXlvZiB0eXBlb2YgRVJST1JfU0xVR1NdO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3dFcnJvck9wdGlvbnMgZXh0ZW5kcyBFcnJvck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHNsdWcgb2YgdGhlIGVycm9yLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBhIGxpbmsgdG8gdGhlIGVycm9yIGRvY3VtZW50YXRpb24uXG4gICAqL1xuICBzbHVnPzogRXJyb3JTbHVnO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgV29ya2Zsb3ctcmVsYXRlZCBlcnJvcnMuXG4gKlxuICogVGhpcyBlcnJvciBpcyB0aHJvd24gYnkgdGhlIFdvcmtmbG93IERldktpdCB3aGVuIGludGVybmFsIG9wZXJhdGlvbnMgZmFpbC5cbiAqIFlvdSBjYW4gdXNlIHRoaXMgY2xhc3Mgd2l0aCBgaW5zdGFuY2VvZmAgdG8gY2F0Y2ggYW55IFdvcmtmbG93IERldktpdCBlcnJvci5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IGdldFJ1bihydW5JZCk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXb3JrZmxvd0Vycm9yKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcignV29ya2Zsb3cgRGV2S2l0IGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IGNhdXNlPzogdW5rbm93bjtcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBXb3JrZmxvd0Vycm9yT3B0aW9ucykge1xuICAgIGNvbnN0IG1zZ0RvY3MgPSBvcHRpb25zPy5zbHVnXG4gICAgICA/IGAke21lc3NhZ2V9XFxuXFxuTGVhcm4gbW9yZTogJHtCQVNFX1VSTH0vJHtvcHRpb25zLnNsdWd9YFxuICAgICAgOiBtZXNzYWdlO1xuICAgIHN1cGVyKG1zZ0RvY3MsIHsgY2F1c2U6IG9wdGlvbnM/LmNhdXNlIH0pO1xuICAgIHRoaXMuY2F1c2UgPSBvcHRpb25zPy5jYXVzZTtcblxuICAgIGlmIChvcHRpb25zPy5jYXVzZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aGlzLnN0YWNrID0gYCR7dGhpcy5zdGFja31cXG5DYXVzZWQgYnk6ICR7b3B0aW9ucy5jYXVzZS5zdGFja31gO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtmbG93RXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIFdvcmtmbG93IEFQSSByZXF1ZXN0IGZhaWxzLlxuICpcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gSFRUUCByZXF1ZXN0cyB0byB0aGUgV29ya2Zsb3cgYmFja2VuZCBmYWlsLFxuICogdHlwaWNhbGx5IGR1ZSB0byBuZXR3b3JrIGlzc3VlcywgaW52YWxpZCByZXF1ZXN0cywgb3Igc2VydmVyIGVycm9ycy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IHN0YXJ0V29ya2Zsb3coJ215V29ya2Zsb3cnLCBpbnB1dCk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXb3JrZmxvd0FQSUVycm9yKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcihgQVBJIGVycm9yICgke2Vycm9yLnN0YXR1c30pOmAsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93QVBJRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd0Vycm9yIHtcbiAgc3RhdHVzPzogbnVtYmVyO1xuICBjb2RlPzogc3RyaW5nO1xuICB1cmw/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IHN0YXR1cz86IG51bWJlcjsgdXJsPzogc3RyaW5nOyBjb2RlPzogc3RyaW5nOyBjYXVzZT86IHVua25vd24gfVxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCB7XG4gICAgICBjYXVzZTogb3B0aW9ucz8uY2F1c2UsXG4gICAgfSk7XG4gICAgdGhpcy5uYW1lID0gJ1dvcmtmbG93QVBJRXJyb3InO1xuICAgIHRoaXMuc3RhdHVzID0gb3B0aW9ucz8uc3RhdHVzO1xuICAgIHRoaXMuY29kZSA9IG9wdGlvbnM/LmNvZGU7XG4gICAgdGhpcy51cmwgPSBvcHRpb25zPy51cmw7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd0FQSUVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ1dvcmtmbG93QVBJRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSB3b3JrZmxvdyBydW4gZmFpbHMgZHVyaW5nIGV4ZWN1dGlvbi5cbiAqXG4gKiBUaGlzIGVycm9yIGluZGljYXRlcyB0aGF0IHRoZSB3b3JrZmxvdyBlbmNvdW50ZXJlZCBhIGZhdGFsIGVycm9yXG4gKiBhbmQgY2Fubm90IGNvbnRpbnVlLiBUaGUgYGNhdXNlYCBwcm9wZXJ0eSBjb250YWlucyB0aGUgdW5kZXJseWluZ1xuICogZXJyb3Igd2l0aCBpdHMgbWVzc2FnZSwgc3RhY2sgdHJhY2UsIGFuZCBvcHRpb25hbCBlcnJvciBjb2RlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIGNvbnN0IHJ1biA9IGF3YWl0IGdldFJ1bihydW5JZCk7XG4gKiBpZiAocnVuLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAqICAgLy8gV29ya2Zsb3dSdW5GYWlsZWRFcnJvciB3aWxsIGJlIHRocm93blxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1J1bkZhaWxlZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIGRlY2xhcmUgY2F1c2U6IEVycm9yICYgeyBjb2RlPzogc3RyaW5nIH07XG5cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZywgZXJyb3I6IFN0cnVjdHVyZWRFcnJvcikge1xuICAgIC8vIENyZWF0ZSBhIHByb3BlciBFcnJvciBpbnN0YW5jZSBmcm9tIHRoZSBTdHJ1Y3R1cmVkRXJyb3IgdG8gc2V0IGFzIGNhdXNlXG4gICAgLy8gTk9URTogY3VzdG9tIGVycm9yIHR5cGVzIGRvIG5vdCBnZXQgc2VyaWFsaXplZC9kZXNlcmlhbGl6ZWQuIEV2ZXJ5dGhpbmcgaXMgYW4gRXJyb3JcbiAgICBjb25zdCBjYXVzZUVycm9yID0gbmV3IEVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgIGlmIChlcnJvci5zdGFjaykge1xuICAgICAgY2F1c2VFcnJvci5zdGFjayA9IGVycm9yLnN0YWNrO1xuICAgIH1cbiAgICBpZiAoZXJyb3IuY29kZSkge1xuICAgICAgKGNhdXNlRXJyb3IgYXMgYW55KS5jb2RlID0gZXJyb3IuY29kZTtcbiAgICB9XG5cbiAgICBzdXBlcihgV29ya2Zsb3cgcnVuIFwiJHtydW5JZH1cIiBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gLCB7XG4gICAgICBjYXVzZTogY2F1c2VFcnJvcixcbiAgICB9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dSdW5GYWlsZWRFcnJvcic7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya2Zsb3dSdW5GYWlsZWRFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd1J1bkZhaWxlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gZ2V0IHJlc3VsdHMgZnJvbSBhbiBpbmNvbXBsZXRlIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBUaGlzIGVycm9yIG9jY3VycyB3aGVuIHlvdSB0cnkgdG8gYWNjZXNzIHRoZSByZXN1bHQgb2YgYSB3b3JrZmxvd1xuICogdGhhdCBpcyBzdGlsbCBydW5uaW5nIG9yIGhhc24ndCBjb21wbGV0ZWQgeWV0LlxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dSdW5Ob3RDb21wbGV0ZWRFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICBydW5JZDogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nLCBzdGF0dXM6IHN0cmluZykge1xuICAgIHN1cGVyKGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIGhhcyBub3QgY29tcGxldGVkYCwge30pO1xuICAgIHRoaXMubmFtZSA9ICdXb3JrZmxvd1J1bk5vdENvbXBsZXRlZEVycm9yJztcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd1J1bk5vdENvbXBsZXRlZEVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ1dvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIFdvcmtmbG93IHJ1bnRpbWUgZW5jb3VudGVycyBhbiBpbnRlcm5hbCBlcnJvci5cbiAqXG4gKiBUaGlzIGVycm9yIGluZGljYXRlcyBhbiBpc3N1ZSB3aXRoIHdvcmtmbG93IGV4ZWN1dGlvbiwgc3VjaCBhc1xuICogc2VyaWFsaXphdGlvbiBmYWlsdXJlcywgc3RhcnRpbmcgYW4gaW52YWxpZCB3b3JrZmxvdyBmdW5jdGlvbiwgb3JcbiAqIG90aGVyIHJ1bnRpbWUgcHJvYmxlbXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1J1bnRpbWVFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBXb3JrZmxvd0Vycm9yT3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gICAgdGhpcy5uYW1lID0gJ1dvcmtmbG93UnVudGltZUVycm9yJztcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtmbG93UnVudGltZUVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ1dvcmtmbG93UnVudGltZUVycm9yJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7XG4gIHJ1bklkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIG5vdCBmb3VuZGAsIHt9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yJztcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICBydW5JZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgV29ya2Zsb3cgcnVuIFwiJHtydW5JZH1cIiBjYW5jZWxsZWRgLCB7fSk7XG4gICAgdGhpcy5uYW1lID0gJ1dvcmtmbG93UnVuQ2FuY2VsbGVkRXJyb3InO1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtmbG93UnVuQ2FuY2VsbGVkRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGZhdGFsIGVycm9yIGlzIGFuIGVycm9yIHRoYXQgY2Fubm90IGJlIHJldHJpZWQuXG4gKiBJdCB3aWxsIGNhdXNlIHRoZSBzdGVwIHRvIGZhaWwgYW5kIHRoZSBlcnJvciB3aWxsXG4gKiBiZSBidWJibGVkIHVwIHRvIHRoZSB3b3JrZmxvdyBsb2dpYy5cbiAqL1xuZXhwb3J0IGNsYXNzIEZhdGFsRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGZhdGFsID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnRmF0YWxFcnJvcic7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBGYXRhbEVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ0ZhdGFsRXJyb3InO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlhYmxlRXJyb3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIHRoZSBzdGVwLlxuICAgKiBDYW4gYWxzbyBiZSBhIGR1cmF0aW9uIHN0cmluZyAoZS5nLiwgXCI1c1wiLCBcIjJtXCIpIG9yIGEgRGF0ZSBvYmplY3QuXG4gICAqIElmIG5vdCBwcm92aWRlZCwgdGhlIHN0ZXAgd2lsbCBiZSByZXRyaWVkIGFmdGVyIDEgc2Vjb25kICgxMDAwIG1pbGxpc2Vjb25kcykuXG4gICAqL1xuICByZXRyeUFmdGVyPzogbnVtYmVyIHwgU3RyaW5nVmFsdWUgfCBEYXRlO1xufVxuXG4vKipcbiAqIEFuIGVycm9yIHRoYXQgY2FuIGhhcHBlbiBkdXJpbmcgYSBzdGVwIGV4ZWN1dGlvbiwgYWxsb3dpbmdcbiAqIGZvciBjb25maWd1cmF0aW9uIG9mIHRoZSByZXRyeSBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFJldHJ5YWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogVGhlIERhdGUgd2hlbiB0aGUgc3RlcCBzaG91bGQgYmUgcmV0cmllZC5cbiAgICovXG4gIHJldHJ5QWZ0ZXI6IERhdGU7XG5cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zOiBSZXRyeWFibGVFcnJvck9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdSZXRyeWFibGVFcnJvcic7XG5cbiAgICBpZiAob3B0aW9ucy5yZXRyeUFmdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmV0cnlBZnRlciA9IHBhcnNlRHVyYXRpb25Ub0RhdGUob3B0aW9ucy5yZXRyeUFmdGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCB0byAxIHNlY29uZCAoMTAwMCBtaWxsaXNlY29uZHMpXG4gICAgICB0aGlzLnJldHJ5QWZ0ZXIgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgMTAwMCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmV0cnlhYmxlRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnUmV0cnlhYmxlRXJyb3InO1xuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IFdPUktGTE9XX1VTRV9TVEVQID0gU3ltYm9sLmZvcignV09SS0ZMT1dfVVNFX1NURVAnKTtcbmV4cG9ydCBjb25zdCBXT1JLRkxPV19DUkVBVEVfSE9PSyA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX0NSRUFURV9IT09LJyk7XG5leHBvcnQgY29uc3QgV09SS0ZMT1dfU0xFRVAgPSBTeW1ib2wuZm9yKCdXT1JLRkxPV19TTEVFUCcpO1xuZXhwb3J0IGNvbnN0IFdPUktGTE9XX0NPTlRFWFQgPSBTeW1ib2wuZm9yKCdXT1JLRkxPV19DT05URVhUJyk7XG5leHBvcnQgY29uc3QgV09SS0ZMT1dfR0VUX1NUUkVBTV9JRCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX0dFVF9TVFJFQU1fSUQnKTtcbmV4cG9ydCBjb25zdCBTVFJFQU1fTkFNRV9TWU1CT0wgPSBTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fTkFNRScpO1xuZXhwb3J0IGNvbnN0IFNUUkVBTV9UWVBFX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9UWVBFJyk7XG5leHBvcnQgY29uc3QgQk9EWV9JTklUX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ0JPRFlfSU5JVCcpO1xuZXhwb3J0IGNvbnN0IFdFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEUgPSBTeW1ib2wuZm9yKFxuICAnV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRSdcbik7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBIb29rLFxuICBIb29rT3B0aW9ucyxcbiAgUmVxdWVzdFdpdGhSZXNwb25zZSxcbiAgV2ViaG9vayxcbiAgV2ViaG9va09wdGlvbnMsXG59IGZyb20gJy4uL2NyZWF0ZS1ob29rLmpzJztcbmltcG9ydCB7IFdPUktGTE9XX0NSRUFURV9IT09LIH0gZnJvbSAnLi4vc3ltYm9scy5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSAnLi9nZXQtd29ya2Zsb3ctbWV0YWRhdGEuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSG9vazxUID0gYW55PihvcHRpb25zPzogSG9va09wdGlvbnMpOiBIb29rPFQ+IHtcbiAgLy8gSW5zaWRlIHRoZSB3b3JrZmxvdyBWTSwgdGhlIGhvb2sgZnVuY3Rpb24gaXMgc3RvcmVkIGluIHRoZSBnbG9iYWxUaGlzIG9iamVjdCBiZWhpbmQgYSBzeW1ib2xcbiAgY29uc3QgY3JlYXRlSG9va0ZuID0gKGdsb2JhbFRoaXMgYXMgYW55KVtcbiAgICBXT1JLRkxPV19DUkVBVEVfSE9PS1xuICBdIGFzIHR5cGVvZiBjcmVhdGVIb29rPFQ+O1xuICBpZiAoIWNyZWF0ZUhvb2tGbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdgY3JlYXRlSG9vaygpYCBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIGEgd29ya2Zsb3cgZnVuY3Rpb24nXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlSG9va0ZuKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViaG9vayhcbiAgb3B0aW9uczogV2ViaG9va09wdGlvbnMgJiB7IHJlc3BvbmRXaXRoOiAnbWFudWFsJyB9XG4pOiBXZWJob29rPFJlcXVlc3RXaXRoUmVzcG9uc2U+O1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYmhvb2sob3B0aW9ucz86IFdlYmhvb2tPcHRpb25zKTogV2ViaG9vazxSZXF1ZXN0PjtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJob29rKFxuICBvcHRpb25zPzogV2ViaG9va09wdGlvbnNcbik6IFdlYmhvb2s8UmVxdWVzdD4gfCBXZWJob29rPFJlcXVlc3RXaXRoUmVzcG9uc2U+IHtcbiAgY29uc3QgeyByZXNwb25kV2l0aCwgLi4ucmVzdCB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgbGV0IG1ldGFkYXRhOiBQaWNrPFdlYmhvb2tPcHRpb25zLCAncmVzcG9uZFdpdGgnPiB8IHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiByZXNwb25kV2l0aCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBtZXRhZGF0YSA9IHsgcmVzcG9uZFdpdGggfTtcbiAgfVxuXG4gIGNvbnN0IGhvb2sgPSBjcmVhdGVIb29rKHsgLi4ucmVzdCwgbWV0YWRhdGEgfSkgYXNcbiAgICB8IFdlYmhvb2s8UmVxdWVzdD5cbiAgICB8IFdlYmhvb2s8UmVxdWVzdFdpdGhSZXNwb25zZT47XG5cbiAgY29uc3QgeyB1cmwgfSA9IGdldFdvcmtmbG93TWV0YWRhdGEoKTtcbiAgaG9vay51cmwgPSBgJHt1cmx9Ly53ZWxsLWtub3duL3dvcmtmbG93L3YxL3dlYmhvb2svJHtlbmNvZGVVUklDb21wb25lbnQoaG9vay50b2tlbil9YDtcblxuICByZXR1cm4gaG9vaztcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEhvb2sgYXMgSG9va0VudGl0eSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tPcHRpb25zIH0gZnJvbSAnLi4vY3JlYXRlLWhvb2suanMnO1xuaW1wb3J0IHsgY3JlYXRlSG9vayB9IGZyb20gJy4vY3JlYXRlLWhvb2suanMnO1xuXG4vKipcbiAqIE5PVEU6IFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBkZWZpbmVIb29rKClgIHRoYXQgaXMgdXNlZCBpbiB3b3JrZmxvdyBjb250ZXh0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUhvb2s8VElucHV0LCBUT3V0cHV0ID0gVElucHV0PigpIHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGUob3B0aW9ucz86IEhvb2tPcHRpb25zKTogSG9vazxUT3V0cHV0PiB7XG4gICAgICByZXR1cm4gY3JlYXRlSG9vazxUT3V0cHV0PihvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgcmVzdW1lKF90b2tlbjogc3RyaW5nLCBfcGF5bG9hZDogVElucHV0KTogUHJvbWlzZTxIb29rRW50aXR5IHwgbnVsbD4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnYGRlZmluZUhvb2soKS5yZXN1bWUoKWAgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gZXh0ZXJuYWwgY29udGV4dHMgKGUuZy4gQVBJIHJvdXRlcykuJ1xuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IFNUUkVBTV9OQU1FX1NZTUJPTCwgV09SS0ZMT1dfR0VUX1NUUkVBTV9JRCB9IGZyb20gJy4uL3N5bWJvbHMuanMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd1dyaXRhYmxlU3RyZWFtT3B0aW9ucyB9IGZyb20gJy4uL3dyaXRhYmxlLXN0cmVhbS5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXcml0YWJsZTxXID0gYW55PihcbiAgb3B0aW9uczogV29ya2Zsb3dXcml0YWJsZVN0cmVhbU9wdGlvbnMgPSB7fVxuKTogV3JpdGFibGVTdHJlYW08Vz4ge1xuICBjb25zdCB7IG5hbWVzcGFjZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgbmFtZSA9IChnbG9iYWxUaGlzIGFzIGFueSlbV09SS0ZMT1dfR0VUX1NUUkVBTV9JRF0obmFtZXNwYWNlKTtcbiAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZ2xvYmFsVGhpcy5Xcml0YWJsZVN0cmVhbS5wcm90b3R5cGUsIHtcbiAgICBbU1RSRUFNX05BTUVfU1lNQk9MXToge1xuICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSxcbiAgfSk7XG59XG4iLCAiLyoqXG4gKiBUaGlzIGlzIHRoZSBcInN0YW5kYXJkIGxpYnJhcnlcIiBvZiBzdGVwcyB0aGF0IHdlIG1ha2UgYXZhaWxhYmxlIHRvIGFsbCB3b3JrZmxvdyB1c2Vycy5cbiAqIFRoZSBjYW4gYmUgaW1wb3J0ZWQgbGlrZSBzbzogYGltcG9ydCB7IGZldGNoIH0gZnJvbSAnd29ya2Zsb3cnYC4gYW5kIHVzZWQgaW4gd29ya2Zsb3cuXG4gKiBUaGUgbmVlZCB0byBiZSBleHBvcnRlZCBkaXJlY3RseSBpbiB0aGlzIHBhY2thZ2UgYW5kIGNhbm5vdCBsaXZlIGluIGBjb3JlYCB0byBwcmV2ZW50XG4gKiBjaXJjdWxhciBkZXBlbmRlbmNpZXMgcG9zdC1jb21waWxhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEEgaG9pc3RlZCBgZmV0Y2goKWAgZnVuY3Rpb24gdGhhdCBpcyBleGVjdXRlZCBhcyBhIFwic3RlcFwiIGZ1bmN0aW9uLFxuICogZm9yIHVzZSB3aXRoaW4gd29ya2Zsb3cgZnVuY3Rpb25zLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZldGNoX0FQSVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2goLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2YgZ2xvYmFsVGhpcy5mZXRjaD4pIHtcbiAgJ3VzZSBzdGVwJztcbiAgcmV0dXJuIGdsb2JhbFRoaXMuZmV0Y2goLi4uYXJncyk7XG59XG4iLCAiLyoqIEEgc3BlY2lhbCBjb25zdGFudCB3aXRoIHR5cGUgYG5ldmVyYCAqLyBleHBvcnQgY29uc3QgTkVWRVIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBzdGF0dXM6IFwiYWJvcnRlZFwiXG59KTtcbmV4cG9ydCAvKkBfX05PX1NJREVfRUZGRUNUU19fKi8gZnVuY3Rpb24gJGNvbnN0cnVjdG9yKG5hbWUsIGluaXRpYWxpemVyLCBwYXJhbXMpIHtcbiAgICBmdW5jdGlvbiBpbml0KGluc3QsIGRlZikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0LCBcIl96b2RcIiwge1xuICAgICAgICAgICAgdmFsdWU6IGluc3QuX3pvZCA/PyB7fSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICAoX2EgPSBpbnN0Ll96b2QpLnRyYWl0cyA/PyAoX2EudHJhaXRzID0gbmV3IFNldCgpKTtcbiAgICAgICAgaW5zdC5fem9kLnRyYWl0cy5hZGQobmFtZSk7XG4gICAgICAgIGluaXRpYWxpemVyKGluc3QsIGRlZik7XG4gICAgICAgIC8vIHN1cHBvcnQgcHJvdG90eXBlIG1vZGlmaWNhdGlvbnNcbiAgICAgICAgZm9yKGNvbnN0IGsgaW4gXy5wcm90b3R5cGUpe1xuICAgICAgICAgICAgaWYgKCEoayBpbiBpbnN0KSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIGssIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogXy5wcm90b3R5cGVba10uYmluZChpbnN0KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5zdC5fem9kLmNvbnN0ciA9IF87XG4gICAgICAgIGluc3QuX3pvZC5kZWYgPSBkZWY7XG4gICAgfVxuICAgIC8vIGRvZXNuJ3Qgd29yayBpZiBQYXJlbnQgaGFzIGEgY29uc3RydWN0b3Igd2l0aCBhcmd1bWVudHNcbiAgICBjb25zdCBQYXJlbnQgPSBwYXJhbXM/LlBhcmVudCA/PyBPYmplY3Q7XG4gICAgY2xhc3MgRGVmaW5pdGlvbiBleHRlbmRzIFBhcmVudCB7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWZpbml0aW9uLCBcIm5hbWVcIiwge1xuICAgICAgICB2YWx1ZTogbmFtZVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIF8oZGVmKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgaW5zdCA9IHBhcmFtcz8uUGFyZW50ID8gbmV3IERlZmluaXRpb24oKSA6IHRoaXM7XG4gICAgICAgIGluaXQoaW5zdCwgZGVmKTtcbiAgICAgICAgKF9hID0gaW5zdC5fem9kKS5kZWZlcnJlZCA/PyAoX2EuZGVmZXJyZWQgPSBbXSk7XG4gICAgICAgIGZvciAoY29uc3QgZm4gb2YgaW5zdC5fem9kLmRlZmVycmVkKXtcbiAgICAgICAgICAgIGZuKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3Q7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfLCBcImluaXRcIiwge1xuICAgICAgICB2YWx1ZTogaW5pdFxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfLCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgICAgICAgdmFsdWU6IChpbnN0KT0+e1xuICAgICAgICAgICAgaWYgKHBhcmFtcz8uUGFyZW50ICYmIGluc3QgaW5zdGFuY2VvZiBwYXJhbXMuUGFyZW50KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBpbnN0Py5fem9kPy50cmFpdHM/LmhhcyhuYW1lKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfLCBcIm5hbWVcIiwge1xuICAgICAgICB2YWx1ZTogbmFtZVxuICAgIH0pO1xuICAgIHJldHVybiBfO1xufVxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgVVRJTElUSUVTICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5leHBvcnQgY29uc3QgJGJyYW5kID0gU3ltYm9sKFwiem9kX2JyYW5kXCIpO1xuZXhwb3J0IGNsYXNzICRab2RBc3luY0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHN1cGVyKGBFbmNvdW50ZXJlZCBQcm9taXNlIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZS4gVXNlIC5wYXJzZUFzeW5jKCkgaW5zdGVhZC5gKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgJFpvZEVuY29kZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG5hbWUpe1xuICAgICAgICBzdXBlcihgRW5jb3VudGVyZWQgdW5pZGlyZWN0aW9uYWwgdHJhbnNmb3JtIGR1cmluZyBlbmNvZGU6ICR7bmFtZX1gKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJab2RFbmNvZGVFcnJvclwiO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBnbG9iYWxDb25maWcgPSB7fTtcbmV4cG9ydCBmdW5jdGlvbiBjb25maWcobmV3Q29uZmlnKSB7XG4gICAgaWYgKG5ld0NvbmZpZykgT2JqZWN0LmFzc2lnbihnbG9iYWxDb25maWcsIG5ld0NvbmZpZyk7XG4gICAgcmV0dXJuIGdsb2JhbENvbmZpZztcbn1cbiIsICIvLyBmdW5jdGlvbnNcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFcXVhbCh2YWwpIHtcbiAgICByZXR1cm4gdmFsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vdEVxdWFsKHZhbCkge1xuICAgIHJldHVybiB2YWw7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXMoX2FyZykge31cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROZXZlcihfeCkge1xuICAgIHRocm93IG5ldyBFcnJvcigpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChfKSB7fVxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudW1WYWx1ZXMoZW50cmllcykge1xuICAgIGNvbnN0IG51bWVyaWNWYWx1ZXMgPSBPYmplY3QudmFsdWVzKGVudHJpZXMpLmZpbHRlcigodik9PnR5cGVvZiB2ID09PSBcIm51bWJlclwiKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3QuZW50cmllcyhlbnRyaWVzKS5maWx0ZXIoKFtrLCBfXSk9Pm51bWVyaWNWYWx1ZXMuaW5kZXhPZigraykgPT09IC0xKS5tYXAoKFtfLCB2XSk9PnYpO1xuICAgIHJldHVybiB2YWx1ZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gam9pblZhbHVlcyhhcnJheSwgc2VwYXJhdG9yID0gXCJ8XCIpIHtcbiAgICByZXR1cm4gYXJyYXkubWFwKCh2YWwpPT5zdHJpbmdpZnlQcmltaXRpdmUodmFsKSkuam9pbihzZXBhcmF0b3IpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGpzb25TdHJpbmdpZnlSZXBsYWNlcihfLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZWQoZ2V0dGVyKSB7XG4gICAgY29uc3Qgc2V0ID0gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0IHZhbHVlICgpIHtcbiAgICAgICAgICAgIGlmICghc2V0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXR0ZXIoKTtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJ2YWx1ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2FjaGVkIHZhbHVlIGFscmVhZHkgc2V0XCIpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudWxsaXNoKGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0ID09PSBudWxsIHx8IGlucHV0ID09PSB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gY2xlYW5SZWdleChzb3VyY2UpIHtcbiAgICBjb25zdCBzdGFydCA9IHNvdXJjZS5zdGFydHNXaXRoKFwiXlwiKSA/IDEgOiAwO1xuICAgIGNvbnN0IGVuZCA9IHNvdXJjZS5lbmRzV2l0aChcIiRcIikgPyBzb3VyY2UubGVuZ3RoIC0gMSA6IHNvdXJjZS5sZW5ndGg7XG4gICAgcmV0dXJuIHNvdXJjZS5zbGljZShzdGFydCwgZW5kKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmbG9hdFNhZmVSZW1haW5kZXIodmFsLCBzdGVwKSB7XG4gICAgY29uc3QgdmFsRGVjQ291bnQgPSAodmFsLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdIHx8IFwiXCIpLmxlbmd0aDtcbiAgICBjb25zdCBzdGVwU3RyaW5nID0gc3RlcC50b1N0cmluZygpO1xuICAgIGxldCBzdGVwRGVjQ291bnQgPSAoc3RlcFN0cmluZy5zcGxpdChcIi5cIilbMV0gfHwgXCJcIikubGVuZ3RoO1xuICAgIGlmIChzdGVwRGVjQ291bnQgPT09IDAgJiYgL1xcZD9lLVxcZD8vLnRlc3Qoc3RlcFN0cmluZykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBzdGVwU3RyaW5nLm1hdGNoKC9cXGQ/ZS0oXFxkPykvKTtcbiAgICAgICAgaWYgKG1hdGNoPy5bMV0pIHtcbiAgICAgICAgICAgIHN0ZXBEZWNDb3VudCA9IE51bWJlci5wYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZGVjQ291bnQgPSB2YWxEZWNDb3VudCA+IHN0ZXBEZWNDb3VudCA/IHZhbERlY0NvdW50IDogc3RlcERlY0NvdW50O1xuICAgIGNvbnN0IHZhbEludCA9IE51bWJlci5wYXJzZUludCh2YWwudG9GaXhlZChkZWNDb3VudCkucmVwbGFjZShcIi5cIiwgXCJcIikpO1xuICAgIGNvbnN0IHN0ZXBJbnQgPSBOdW1iZXIucGFyc2VJbnQoc3RlcC50b0ZpeGVkKGRlY0NvdW50KS5yZXBsYWNlKFwiLlwiLCBcIlwiKSk7XG4gICAgcmV0dXJuIHZhbEludCAlIHN0ZXBJbnQgLyAxMCAqKiBkZWNDb3VudDtcbn1cbmNvbnN0IEVWQUxVQVRJTkcgPSBTeW1ib2woXCJldmFsdWF0aW5nXCIpO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUxhenkob2JqZWN0LCBrZXksIGdldHRlcikge1xuICAgIGxldCB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICAgZ2V0ICgpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gRVZBTFVBVElORykge1xuICAgICAgICAgICAgICAgIC8vIENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCwgcmV0dXJuIHVuZGVmaW5lZCB0byBicmVhayB0aGUgY3ljbGVcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IEVWQUxVQVRJTkc7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXR0ZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0ICh2KSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIC8vIG9iamVjdFtrZXldID0gdjtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0Q2xvbmUob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaiksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9iaikpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2lnblByb3AodGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3AsIHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZnMoLi4uZGVmcykge1xuICAgIGNvbnN0IG1lcmdlZERlc2NyaXB0b3JzID0ge307XG4gICAgZm9yIChjb25zdCBkZWYgb2YgZGVmcyl7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoZGVmKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihtZXJnZWREZXNjcmlwdG9ycywgZGVzY3JpcHRvcnMpO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoe30sIG1lcmdlZERlc2NyaXB0b3JzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZURlZihzY2hlbWEpIHtcbiAgICByZXR1cm4gbWVyZ2VEZWZzKHNjaGVtYS5fem9kLmRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudEF0UGF0aChvYmosIHBhdGgpIHtcbiAgICBpZiAoIXBhdGgpIHJldHVybiBvYmo7XG4gICAgcmV0dXJuIHBhdGgucmVkdWNlKChhY2MsIGtleSk9PmFjYz8uW2tleV0sIG9iaik7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJvbWlzZUFsbE9iamVjdChwcm9taXNlc09iaikge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcm9taXNlc09iaik7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBrZXlzLm1hcCgoa2V5KT0+cHJvbWlzZXNPYmpba2V5XSk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKChyZXN1bHRzKT0+e1xuICAgICAgICBjb25zdCByZXNvbHZlZE9iaiA9IHt9O1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICByZXNvbHZlZE9ialtrZXlzW2ldXSA9IHJlc3VsdHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkT2JqO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbVN0cmluZyhsZW5ndGggPSAxMCkge1xuICAgIGNvbnN0IGNoYXJzID0gXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiO1xuICAgIGxldCBzdHIgPSBcIlwiO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyl7XG4gICAgICAgIHN0ciArPSBjaGFyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFycy5sZW5ndGgpXTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlc2Moc3RyKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHN0cik7XG59XG5leHBvcnQgY29uc3QgY2FwdHVyZVN0YWNrVHJhY2UgPSBcImNhcHR1cmVTdGFja1RyYWNlXCIgaW4gRXJyb3IgPyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA6ICguLi5fYXJncyk9Pnt9O1xuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgZGF0YSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShkYXRhKTtcbn1cbmV4cG9ydCBjb25zdCBhbGxvd3NFdmFsID0gY2FjaGVkKCgpPT57XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvcj8udXNlckFnZW50Py5pbmNsdWRlcyhcIkNsb3VkZmxhcmVcIikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBGID0gRnVuY3Rpb247XG4gICAgICAgIG5ldyBGKFwiXCIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG8pIHtcbiAgICBpZiAoaXNPYmplY3QobykgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gbW9kaWZpZWQgY29uc3RydWN0b3JcbiAgICBjb25zdCBjdG9yID0gby5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoY3RvciA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBtb2RpZmllZCBwcm90b3R5cGVcbiAgICBjb25zdCBwcm90ID0gY3Rvci5wcm90b3R5cGU7XG4gICAgaWYgKGlzT2JqZWN0KHByb3QpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGN0b3IgZG9lc24ndCBoYXZlIHN0YXRpYyBgaXNQcm90b3R5cGVPZmBcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3QsIFwiaXNQcm90b3R5cGVPZlwiKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93Q2xvbmUobykge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KG8pKSByZXR1cm4ge1xuICAgICAgICAuLi5vXG4gICAgfTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvKSkgcmV0dXJuIFtcbiAgICAgICAgLi4ub1xuICAgIF07XG4gICAgcmV0dXJuIG87XG59XG5leHBvcnQgZnVuY3Rpb24gbnVtS2V5cyhkYXRhKSB7XG4gICAgbGV0IGtleUNvdW50ID0gMDtcbiAgICBmb3IoY29uc3Qga2V5IGluIGRhdGEpe1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkpIHtcbiAgICAgICAgICAgIGtleUNvdW50Kys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleUNvdW50O1xufVxuZXhwb3J0IGNvbnN0IGdldFBhcnNlZFR5cGUgPSAoZGF0YSk9PntcbiAgICBjb25zdCB0ID0gdHlwZW9mIGRhdGE7XG4gICAgc3dpdGNoKHQpe1xuICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0YSkgPyBcIm5hblwiIDogXCJudW1iZXJcIjtcbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJmdW5jdGlvblwiO1xuICAgICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJiaWdpbnRcIjtcbiAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwic3ltYm9sXCI7XG4gICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiYXJyYXlcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEudGhlbiAmJiB0eXBlb2YgZGF0YS50aGVuID09PSBcImZ1bmN0aW9uXCIgJiYgZGF0YS5jYXRjaCAmJiB0eXBlb2YgZGF0YS5jYXRjaCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwicHJvbWlzZVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBNYXAgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YSBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm1hcFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBTZXQgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcInNldFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBEYXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiZGF0ZVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBGaWxlICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiZmlsZVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0XCI7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YSB0eXBlOiAke3R9YCk7XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBwcm9wZXJ0eUtleVR5cGVzID0gbmV3IFNldChbXG4gICAgXCJzdHJpbmdcIixcbiAgICBcIm51bWJlclwiLFxuICAgIFwic3ltYm9sXCJcbl0pO1xuZXhwb3J0IGNvbnN0IHByaW1pdGl2ZVR5cGVzID0gbmV3IFNldChbXG4gICAgXCJzdHJpbmdcIixcbiAgICBcIm51bWJlclwiLFxuICAgIFwiYmlnaW50XCIsXG4gICAgXCJib29sZWFuXCIsXG4gICAgXCJzeW1ib2xcIixcbiAgICBcInVuZGVmaW5lZFwiXG5dKTtcbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVSZWdleChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKTtcbn1cbi8vIHpvZC1zcGVjaWZpYyB1dGlsc1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGluc3QsIGRlZiwgcGFyYW1zKSB7XG4gICAgY29uc3QgY2wgPSBuZXcgaW5zdC5fem9kLmNvbnN0cihkZWYgPz8gaW5zdC5fem9kLmRlZik7XG4gICAgaWYgKCFkZWYgfHwgcGFyYW1zPy5wYXJlbnQpIGNsLl96b2QucGFyZW50ID0gaW5zdDtcbiAgICByZXR1cm4gY2w7XG59XG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUGFyYW1zKF9wYXJhbXMpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBfcGFyYW1zO1xuICAgIGlmICghcGFyYW1zKSByZXR1cm4ge307XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09IFwic3RyaW5nXCIpIHJldHVybiB7XG4gICAgICAgIGVycm9yOiAoKT0+cGFyYW1zXG4gICAgfTtcbiAgICBpZiAocGFyYW1zPy5tZXNzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHBhcmFtcz8uZXJyb3IgIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNwZWNpZnkgYm90aCBgbWVzc2FnZWAgYW5kIGBlcnJvcmAgcGFyYW1zXCIpO1xuICAgICAgICBwYXJhbXMuZXJyb3IgPSBwYXJhbXMubWVzc2FnZTtcbiAgICB9XG4gICAgZGVsZXRlIHBhcmFtcy5tZXNzYWdlO1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLmVycm9yID09PSBcInN0cmluZ1wiKSByZXR1cm4ge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIGVycm9yOiAoKT0+cGFyYW1zLmVycm9yXG4gICAgfTtcbiAgICByZXR1cm4gcGFyYW1zO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRyYW5zcGFyZW50UHJveHkoZ2V0dGVyKSB7XG4gICAgbGV0IHRhcmdldDtcbiAgICByZXR1cm4gbmV3IFByb3h5KHt9LCB7XG4gICAgICAgIGdldCAoXywgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgIHRhcmdldCA/PyAodGFyZ2V0ID0gZ2V0dGVyKCkpO1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgKF8sIHByb3AsIHZhbHVlLCByZWNlaXZlcikge1xuICAgICAgICAgICAgdGFyZ2V0ID8/ICh0YXJnZXQgPSBnZXR0ZXIoKSk7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5zZXQodGFyZ2V0LCBwcm9wLCB2YWx1ZSwgcmVjZWl2ZXIpO1xuICAgICAgICB9LFxuICAgICAgICBoYXMgKF8sIHByb3ApIHtcbiAgICAgICAgICAgIHRhcmdldCA/PyAodGFyZ2V0ID0gZ2V0dGVyKCkpO1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlbGV0ZVByb3BlcnR5IChfLCBwcm9wKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICAgIG93bktleXMgKF8pIHtcbiAgICAgICAgICAgIHRhcmdldCA/PyAodGFyZ2V0ID0gZ2V0dGVyKCkpO1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgKF8sIHByb3ApIHtcbiAgICAgICAgICAgIHRhcmdldCA/PyAodGFyZ2V0ID0gZ2V0dGVyKCkpO1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlZmluZVByb3BlcnR5IChfLCBwcm9wLCBkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcCwgZGVzY3JpcHRvcik7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlQcmltaXRpdmUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSByZXR1cm4gdmFsdWUudG9TdHJpbmcoKSArIFwiblwiO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICByZXR1cm4gYCR7dmFsdWV9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbEtleXMoc2hhcGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc2hhcGUpLmZpbHRlcigoayk9PntcbiAgICAgICAgcmV0dXJuIHNoYXBlW2tdLl96b2Qub3B0aW4gPT09IFwib3B0aW9uYWxcIiAmJiBzaGFwZVtrXS5fem9kLm9wdG91dCA9PT0gXCJvcHRpb25hbFwiO1xuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IE5VTUJFUl9GT1JNQVRfUkFOR0VTID0ge1xuICAgIHNhZmVpbnQ6IFtcbiAgICAgICAgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIsXG4gICAgICAgIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG4gICAgXSxcbiAgICBpbnQzMjogW1xuICAgICAgICAtMjE0NzQ4MzY0OCxcbiAgICAgICAgMjE0NzQ4MzY0N1xuICAgIF0sXG4gICAgdWludDMyOiBbXG4gICAgICAgIDAsXG4gICAgICAgIDQyOTQ5NjcyOTVcbiAgICBdLFxuICAgIGZsb2F0MzI6IFtcbiAgICAgICAgLTMuNDAyODIzNDY2Mzg1Mjg4NmUzOCxcbiAgICAgICAgMy40MDI4MjM0NjYzODUyODg2ZTM4XG4gICAgXSxcbiAgICBmbG9hdDY0OiBbXG4gICAgICAgIC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFXG4gICAgXVxufTtcbmV4cG9ydCBjb25zdCBCSUdJTlRfRk9STUFUX1JBTkdFUyA9IHtcbiAgICBpbnQ2NDogW1xuICAgICAgICAvKiBAX19QVVJFX18qLyBCaWdJbnQoXCItOTIyMzM3MjAzNjg1NDc3NTgwOFwiKSxcbiAgICAgICAgLyogQF9fUFVSRV9fKi8gQmlnSW50KFwiOTIyMzM3MjAzNjg1NDc3NTgwN1wiKVxuICAgIF0sXG4gICAgdWludDY0OiBbXG4gICAgICAgIC8qIEBfX1BVUkVfXyovIEJpZ0ludCgwKSxcbiAgICAgICAgLyogQF9fUFVSRV9fKi8gQmlnSW50KFwiMTg0NDY3NDQwNzM3MDk1NTE2MTVcIilcbiAgICBdXG59O1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2soc2NoZW1hLCBtYXNrKSB7XG4gICAgY29uc3QgY3VyckRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBjb25zdCBkZWYgPSBtZXJnZURlZnMoc2NoZW1hLl96b2QuZGVmLCB7XG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdTaGFwZSA9IHt9O1xuICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBtYXNrKXtcbiAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gY3VyckRlZi5zaGFwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQga2V5OiBcIiR7a2V5fVwiYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbWFza1trZXldKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gY3VyckRlZi5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIG5ld1NoYXBlKTsgLy8gc2VsZi1jYWNoaW5nXG4gICAgICAgICAgICByZXR1cm4gbmV3U2hhcGU7XG4gICAgICAgIH0sXG4gICAgICAgIGNoZWNrczogW11cbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmUoc2NoZW1hLCBkZWYpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9taXQoc2NoZW1hLCBtYXNrKSB7XG4gICAgY29uc3QgY3VyckRlZiA9IHNjaGVtYS5fem9kLmRlZjtcbiAgICBjb25zdCBkZWYgPSBtZXJnZURlZnMoc2NoZW1hLl96b2QuZGVmLCB7XG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdTaGFwZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5zY2hlbWEuX3pvZC5kZWYuc2hhcGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IoY29uc3Qga2V5IGluIG1hc2spe1xuICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBjdXJyRGVmLnNoYXBlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBrZXk6IFwiJHtrZXl9XCJgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFtYXNrW2tleV0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdTaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIG5ld1NoYXBlKTsgLy8gc2VsZi1jYWNoaW5nXG4gICAgICAgICAgICByZXR1cm4gbmV3U2hhcGU7XG4gICAgICAgIH0sXG4gICAgICAgIGNoZWNrczogW11cbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmUoc2NoZW1hLCBkZWYpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZChzY2hlbWEsIHNoYXBlKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHNoYXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHRvIGV4dGVuZDogZXhwZWN0ZWQgYSBwbGFpbiBvYmplY3RcIik7XG4gICAgfVxuICAgIGNvbnN0IGNoZWNrcyA9IHNjaGVtYS5fem9kLmRlZi5jaGVja3M7XG4gICAgY29uc3QgaGFzQ2hlY2tzID0gY2hlY2tzICYmIGNoZWNrcy5sZW5ndGggPiAwO1xuICAgIGlmIChoYXNDaGVja3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT2JqZWN0IHNjaGVtYXMgY29udGFpbmluZyByZWZpbmVtZW50cyBjYW5ub3QgYmUgZXh0ZW5kZWQuIFVzZSBgLnNhZmVFeHRlbmQoKWAgaW5zdGVhZC5cIik7XG4gICAgfVxuICAgIGNvbnN0IGRlZiA9IG1lcmdlRGVmcyhzY2hlbWEuX3pvZC5kZWYsIHtcbiAgICAgICAgZ2V0IHNoYXBlICgpIHtcbiAgICAgICAgICAgIGNvbnN0IF9zaGFwZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5zY2hlbWEuX3pvZC5kZWYuc2hhcGUsXG4gICAgICAgICAgICAgICAgLi4uc2hhcGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhc3NpZ25Qcm9wKHRoaXMsIFwic2hhcGVcIiwgX3NoYXBlKTsgLy8gc2VsZi1jYWNoaW5nXG4gICAgICAgICAgICByZXR1cm4gX3NoYXBlO1xuICAgICAgICB9LFxuICAgICAgICBjaGVja3M6IFtdXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lKHNjaGVtYSwgZGVmKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzYWZlRXh0ZW5kKHNjaGVtYSwgc2hhcGUpIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3Qoc2hhcGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQgdG8gc2FmZUV4dGVuZDogZXhwZWN0ZWQgYSBwbGFpbiBvYmplY3RcIik7XG4gICAgfVxuICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgICAgLi4uc2NoZW1hLl96b2QuZGVmLFxuICAgICAgICBnZXQgc2hhcGUgKCkge1xuICAgICAgICAgICAgY29uc3QgX3NoYXBlID0ge1xuICAgICAgICAgICAgICAgIC4uLnNjaGVtYS5fem9kLmRlZi5zaGFwZSxcbiAgICAgICAgICAgICAgICAuLi5zaGFwZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFzc2lnblByb3AodGhpcywgXCJzaGFwZVwiLCBfc2hhcGUpOyAvLyBzZWxmLWNhY2hpbmdcbiAgICAgICAgICAgIHJldHVybiBfc2hhcGU7XG4gICAgICAgIH0sXG4gICAgICAgIGNoZWNrczogc2NoZW1hLl96b2QuZGVmLmNoZWNrc1xuICAgIH07XG4gICAgcmV0dXJuIGNsb25lKHNjaGVtYSwgZGVmKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZShhLCBiKSB7XG4gICAgY29uc3QgZGVmID0gbWVyZ2VEZWZzKGEuX3pvZC5kZWYsIHtcbiAgICAgICAgZ2V0IHNoYXBlICgpIHtcbiAgICAgICAgICAgIGNvbnN0IF9zaGFwZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5hLl96b2QuZGVmLnNoYXBlLFxuICAgICAgICAgICAgICAgIC4uLmIuX3pvZC5kZWYuc2hhcGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhc3NpZ25Qcm9wKHRoaXMsIFwic2hhcGVcIiwgX3NoYXBlKTsgLy8gc2VsZi1jYWNoaW5nXG4gICAgICAgICAgICByZXR1cm4gX3NoYXBlO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgY2F0Y2hhbGwgKCkge1xuICAgICAgICAgICAgcmV0dXJuIGIuX3pvZC5kZWYuY2F0Y2hhbGw7XG4gICAgICAgIH0sXG4gICAgICAgIGNoZWNrczogW11cbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmUoYSwgZGVmKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJ0aWFsKENsYXNzLCBzY2hlbWEsIG1hc2spIHtcbiAgICBjb25zdCBkZWYgPSBtZXJnZURlZnMoc2NoZW1hLl96b2QuZGVmLCB7XG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBvbGRTaGFwZSA9IHNjaGVtYS5fem9kLmRlZi5zaGFwZTtcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlID0ge1xuICAgICAgICAgICAgICAgIC4uLm9sZFNoYXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKG1hc2spIHtcbiAgICAgICAgICAgICAgICBmb3IoY29uc3Qga2V5IGluIG1hc2spe1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gb2xkU2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBrZXk6IFwiJHtrZXl9XCJgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIW1hc2tba2V5XSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChvbGRTaGFwZVtrZXldIS5fem9kLm9wdGluID09PSBcIm9wdGlvbmFsXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gQ2xhc3MgPyBuZXcgQ2xhc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJvcHRpb25hbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJUeXBlOiBvbGRTaGFwZVtrZXldXG4gICAgICAgICAgICAgICAgICAgIH0pIDogb2xkU2hhcGVba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gb2xkU2hhcGUpe1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAob2xkU2hhcGVba2V5XSEuX3pvZC5vcHRpbiA9PT0gXCJvcHRpb25hbFwiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVba2V5XSA9IENsYXNzID8gbmV3IENsYXNzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwib3B0aW9uYWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyVHlwZTogb2xkU2hhcGVba2V5XVxuICAgICAgICAgICAgICAgICAgICB9KSA6IG9sZFNoYXBlW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIHNoYXBlKTsgLy8gc2VsZi1jYWNoaW5nXG4gICAgICAgICAgICByZXR1cm4gc2hhcGU7XG4gICAgICAgIH0sXG4gICAgICAgIGNoZWNrczogW11cbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmUoc2NoZW1hLCBkZWYpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVkKENsYXNzLCBzY2hlbWEsIG1hc2spIHtcbiAgICBjb25zdCBkZWYgPSBtZXJnZURlZnMoc2NoZW1hLl96b2QuZGVmLCB7XG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBvbGRTaGFwZSA9IHNjaGVtYS5fem9kLmRlZi5zaGFwZTtcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlID0ge1xuICAgICAgICAgICAgICAgIC4uLm9sZFNoYXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKG1hc2spIHtcbiAgICAgICAgICAgICAgICBmb3IoY29uc3Qga2V5IGluIG1hc2spe1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gc2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBrZXk6IFwiJHtrZXl9XCJgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIW1hc2tba2V5XSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIG92ZXJ3cml0ZSB3aXRoIG5vbi1vcHRpb25hbFxuICAgICAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gbmV3IENsYXNzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwibm9ub3B0aW9uYWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyVHlwZTogb2xkU2hhcGVba2V5XVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gb2xkU2hhcGUpe1xuICAgICAgICAgICAgICAgICAgICAvLyBvdmVyd3JpdGUgd2l0aCBub24tb3B0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVba2V5XSA9IG5ldyBDbGFzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm5vbm9wdGlvbmFsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lclR5cGU6IG9sZFNoYXBlW2tleV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIHNoYXBlKTsgLy8gc2VsZi1jYWNoaW5nXG4gICAgICAgICAgICByZXR1cm4gc2hhcGU7XG4gICAgICAgIH0sXG4gICAgICAgIGNoZWNrczogW11cbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmUoc2NoZW1hLCBkZWYpO1xufVxuLy8gaW52YWxpZF90eXBlIHwgdG9vX2JpZyB8IHRvb19zbWFsbCB8IGludmFsaWRfZm9ybWF0IHwgbm90X211bHRpcGxlX29mIHwgdW5yZWNvZ25pemVkX2tleXMgfCBpbnZhbGlkX3VuaW9uIHwgaW52YWxpZF9rZXkgfCBpbnZhbGlkX2VsZW1lbnQgfCBpbnZhbGlkX3ZhbHVlIHwgY3VzdG9tXG5leHBvcnQgZnVuY3Rpb24gYWJvcnRlZCh4LCBzdGFydEluZGV4ID0gMCkge1xuICAgIGlmICh4LmFib3J0ZWQgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgIGZvcihsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCB4Lmlzc3Vlcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGlmICh4Lmlzc3Vlc1tpXT8uY29udGludWUgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcmVmaXhJc3N1ZXMocGF0aCwgaXNzdWVzKSB7XG4gICAgcmV0dXJuIGlzc3Vlcy5tYXAoKGlzcyk9PntcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSBpc3MpLnBhdGggPz8gKF9hLnBhdGggPSBbXSk7XG4gICAgICAgIGlzcy5wYXRoLnVuc2hpZnQocGF0aCk7XG4gICAgICAgIHJldHVybiBpc3M7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdW53cmFwTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiID8gbWVzc2FnZSA6IG1lc3NhZ2U/Lm1lc3NhZ2U7XG59XG5leHBvcnQgZnVuY3Rpb24gZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29uZmlnKSB7XG4gICAgY29uc3QgZnVsbCA9IHtcbiAgICAgICAgLi4uaXNzLFxuICAgICAgICBwYXRoOiBpc3MucGF0aCA/PyBbXVxuICAgIH07XG4gICAgLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgaWYgKCFpc3MubWVzc2FnZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gdW53cmFwTWVzc2FnZShpc3MuaW5zdD8uX3pvZC5kZWY/LmVycm9yPy4oaXNzKSkgPz8gdW53cmFwTWVzc2FnZShjdHg/LmVycm9yPy4oaXNzKSkgPz8gdW53cmFwTWVzc2FnZShjb25maWcuY3VzdG9tRXJyb3I/Lihpc3MpKSA/PyB1bndyYXBNZXNzYWdlKGNvbmZpZy5sb2NhbGVFcnJvcj8uKGlzcykpID8/IFwiSW52YWxpZCBpbnB1dFwiO1xuICAgICAgICBmdWxsLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cbiAgICAvLyBkZWxldGUgKGZ1bGwgYXMgYW55KS5kZWY7XG4gICAgZGVsZXRlIGZ1bGwuaW5zdDtcbiAgICBkZWxldGUgZnVsbC5jb250aW51ZTtcbiAgICBpZiAoIWN0eD8ucmVwb3J0SW5wdXQpIHtcbiAgICAgICAgZGVsZXRlIGZ1bGwuaW5wdXQ7XG4gICAgfVxuICAgIHJldHVybiBmdWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpemFibGVPcmlnaW4oaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBTZXQpIHJldHVybiBcInNldFwiO1xuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIE1hcCkgcmV0dXJuIFwibWFwXCI7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEZpbGUpIHJldHVybiBcImZpbGVcIjtcbiAgICByZXR1cm4gXCJ1bmtub3duXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TGVuZ3RoYWJsZU9yaWdpbihpbnB1dCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkgcmV0dXJuIFwiYXJyYXlcIjtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICByZXR1cm4gXCJ1bmtub3duXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNzdWUoLi4uYXJncykge1xuICAgIGNvbnN0IFtpc3MsIGlucHV0LCBpbnN0XSA9IGFyZ3M7XG4gICAgaWYgKHR5cGVvZiBpc3MgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGlzcyxcbiAgICAgICAgICAgIGNvZGU6IFwiY3VzdG9tXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaXNzXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbkVudW0ob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iaikuZmlsdGVyKChbaywgX10pPT57XG4gICAgICAgIC8vIHJldHVybiB0cnVlIGlmIE5hTiwgbWVhbmluZyBpdCdzIG5vdCBhIG51bWJlciwgdGh1cyBhIHN0cmluZyBrZXlcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihOdW1iZXIucGFyc2VJbnQoaywgMTApKTtcbiAgICB9KS5tYXAoKGVsKT0+ZWxbMV0pO1xufVxuLy8gQ29kZWMgdXRpbGl0eSBmdW5jdGlvbnNcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRUb1VpbnQ4QXJyYXkoYmFzZTY0KSB7XG4gICAgY29uc3QgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjQpO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5U3RyaW5nLmxlbmd0aCk7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGJpbmFyeVN0cmluZy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGJ5dGVzW2ldID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiB1aW50OEFycmF5VG9CYXNlNjQoYnl0ZXMpIHtcbiAgICBsZXQgYmluYXJ5U3RyaW5nID0gXCJcIjtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICBiaW5hcnlTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBidG9hKGJpbmFyeVN0cmluZyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0dXJsVG9VaW50OEFycmF5KGJhc2U2NHVybCkge1xuICAgIGNvbnN0IGJhc2U2NCA9IGJhc2U2NHVybC5yZXBsYWNlKC8tL2csIFwiK1wiKS5yZXBsYWNlKC9fL2csIFwiL1wiKTtcbiAgICBjb25zdCBwYWRkaW5nID0gXCI9XCIucmVwZWF0KCg0IC0gYmFzZTY0Lmxlbmd0aCAlIDQpICUgNCk7XG4gICAgcmV0dXJuIGJhc2U2NFRvVWludDhBcnJheShiYXNlNjQgKyBwYWRkaW5nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1aW50OEFycmF5VG9CYXNlNjR1cmwoYnl0ZXMpIHtcbiAgICByZXR1cm4gdWludDhBcnJheVRvQmFzZTY0KGJ5dGVzKS5yZXBsYWNlKC9cXCsvZywgXCItXCIpLnJlcGxhY2UoL1xcLy9nLCBcIl9cIikucmVwbGFjZSgvPS9nLCBcIlwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoZXhUb1VpbnQ4QXJyYXkoaGV4KSB7XG4gICAgY29uc3QgY2xlYW5IZXggPSBoZXgucmVwbGFjZSgvXjB4LywgXCJcIik7XG4gICAgaWYgKGNsZWFuSGV4Lmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBoZXggc3RyaW5nIGxlbmd0aFwiKTtcbiAgICB9XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShjbGVhbkhleC5sZW5ndGggLyAyKTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgY2xlYW5IZXgubGVuZ3RoOyBpICs9IDIpe1xuICAgICAgICBieXRlc1tpIC8gMl0gPSBOdW1iZXIucGFyc2VJbnQoY2xlYW5IZXguc2xpY2UoaSwgaSArIDIpLCAxNik7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiB1aW50OEFycmF5VG9IZXgoYnl0ZXMpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShieXRlcykubWFwKChiKT0+Yi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKS5qb2luKFwiXCIpO1xufVxuLy8gaW5zdGFuY2VvZlxuZXhwb3J0IGNsYXNzIENsYXNzIHtcbiAgICBjb25zdHJ1Y3RvciguLi5fYXJncyl7fVxufVxuIiwgImltcG9ydCB7ICRjb25zdHJ1Y3RvciB9IGZyb20gXCIuL2NvcmUuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuY29uc3QgaW5pdGlhbGl6ZXIgPSAoaW5zdCwgZGVmKT0+e1xuICAgIGluc3QubmFtZSA9IFwiJFpvZEVycm9yXCI7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiX3pvZFwiLCB7XG4gICAgICAgIHZhbHVlOiBpbnN0Ll96b2QsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiaXNzdWVzXCIsIHtcbiAgICAgICAgdmFsdWU6IGRlZixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICB9KTtcbiAgICBpbnN0Lm1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShkZWYsIHV0aWwuanNvblN0cmluZ2lmeVJlcGxhY2VyLCAyKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdCwgXCJ0b1N0cmluZ1wiLCB7XG4gICAgICAgIHZhbHVlOiAoKT0+aW5zdC5tZXNzYWdlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgIH0pO1xufTtcbmV4cG9ydCBjb25zdCAkWm9kRXJyb3IgPSAkY29uc3RydWN0b3IoXCIkWm9kRXJyb3JcIiwgaW5pdGlhbGl6ZXIpO1xuZXhwb3J0IGNvbnN0ICRab2RSZWFsRXJyb3IgPSAkY29uc3RydWN0b3IoXCIkWm9kRXJyb3JcIiwgaW5pdGlhbGl6ZXIsIHtcbiAgICBQYXJlbnQ6IEVycm9yXG59KTtcbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuRXJyb3IoZXJyb3IsIG1hcHBlciA9IChpc3N1ZSk9Pmlzc3VlLm1lc3NhZ2UpIHtcbiAgICBjb25zdCBmaWVsZEVycm9ycyA9IHt9O1xuICAgIGNvbnN0IGZvcm1FcnJvcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHN1YiBvZiBlcnJvci5pc3N1ZXMpe1xuICAgICAgICBpZiAoc3ViLnBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dID0gZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dIHx8IFtdO1xuICAgICAgICAgICAgZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dLnB1c2gobWFwcGVyKHN1YikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybUVycm9ycy5wdXNoKG1hcHBlcihzdWIpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBmb3JtRXJyb3JzLFxuICAgICAgICBmaWVsZEVycm9yc1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RXJyb3IoZXJyb3IsIF9tYXBwZXIpIHtcbiAgICBjb25zdCBtYXBwZXIgPSBfbWFwcGVyIHx8IGZ1bmN0aW9uKGlzc3VlKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZS5tZXNzYWdlO1xuICAgIH07XG4gICAgY29uc3QgZmllbGRFcnJvcnMgPSB7XG4gICAgICAgIF9lcnJvcnM6IFtdXG4gICAgfTtcbiAgICBjb25zdCBwcm9jZXNzRXJyb3IgPSAoZXJyb3IpPT57XG4gICAgICAgIGZvciAoY29uc3QgaXNzdWUgb2YgZXJyb3IuaXNzdWVzKXtcbiAgICAgICAgICAgIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfdW5pb25cIiAmJiBpc3N1ZS5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaXNzdWUuZXJyb3JzLm1hcCgoaXNzdWVzKT0+cHJvY2Vzc0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9rZXlcIikge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogaXNzdWUuaXNzdWVzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9lbGVtZW50XCIpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IGlzc3VlLmlzc3Vlc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc3N1ZS5wYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGZpZWxkRXJyb3JzLl9lcnJvcnMucHVzaChtYXBwZXIoaXNzdWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnIgPSBmaWVsZEVycm9ycztcbiAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUoaSA8IGlzc3VlLnBhdGgubGVuZ3RoKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSBpc3N1ZS5wYXRoW2ldO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXJtaW5hbCA9IGkgPT09IGlzc3VlLnBhdGgubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXJtaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Vycm9yczogW11cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXJyb3JzOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdLl9lcnJvcnMucHVzaChtYXBwZXIoaXNzdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJyID0gY3VycltlbF07XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHByb2Nlc3NFcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIGZpZWxkRXJyb3JzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRyZWVpZnlFcnJvcihlcnJvciwgX21hcHBlcikge1xuICAgIGNvbnN0IG1hcHBlciA9IF9tYXBwZXIgfHwgZnVuY3Rpb24oaXNzdWUpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlLm1lc3NhZ2U7XG4gICAgfTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIGVycm9yczogW11cbiAgICB9O1xuICAgIGNvbnN0IHByb2Nlc3NFcnJvciA9IChlcnJvciwgcGF0aCA9IFtdKT0+e1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBmb3IgKGNvbnN0IGlzc3VlIG9mIGVycm9yLmlzc3Vlcyl7XG4gICAgICAgICAgICBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX3VuaW9uXCIgJiYgaXNzdWUuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIHJlZ3VsYXIgdW5pb24gZXJyb3JcbiAgICAgICAgICAgICAgICBpc3N1ZS5lcnJvcnMubWFwKChpc3N1ZXMpPT5wcm9jZXNzRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH0sIGlzc3VlLnBhdGgpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX2tleVwiKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBpc3N1ZS5pc3N1ZXNcbiAgICAgICAgICAgICAgICB9LCBpc3N1ZS5wYXRoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX2VsZW1lbnRcIikge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogaXNzdWUuaXNzdWVzXG4gICAgICAgICAgICAgICAgfSwgaXNzdWUucGF0aCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gW1xuICAgICAgICAgICAgICAgICAgICAuLi5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAuLi5pc3N1ZS5wYXRoXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBpZiAoZnVsbHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5lcnJvcnMucHVzaChtYXBwZXIoaXNzdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBjdXJyID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICB3aGlsZShpIDwgZnVsbHBhdGgubGVuZ3RoKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSBmdWxscGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVybWluYWwgPSBpID09PSBmdWxscGF0aC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVsID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyLnByb3BlcnRpZXMgPz8gKGN1cnIucHJvcGVydGllcyA9IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIChfYSA9IGN1cnIucHJvcGVydGllcylbZWxdID8/IChfYVtlbF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyID0gY3Vyci5wcm9wZXJ0aWVzW2VsXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnIuaXRlbXMgPz8gKGN1cnIuaXRlbXMgPSBbXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAoX2IgPSBjdXJyLml0ZW1zKVtlbF0gPz8gKF9iW2VsXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyLml0ZW1zW2VsXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGVybWluYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnIuZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcHJvY2Vzc0Vycm9yKGVycm9yKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqIEZvcm1hdCBhIFpvZEVycm9yIGFzIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGluIHRoZSBmb2xsb3dpbmcgZm9ybS5cbiAqXG4gKiBGcm9tXG4gKlxuICogYGBgdHNcbiAqIFpvZEVycm9yIHtcbiAqICAgaXNzdWVzOiBbXG4gKiAgICAge1xuICogICAgICAgZXhwZWN0ZWQ6ICdzdHJpbmcnLFxuICogICAgICAgY29kZTogJ2ludmFsaWRfdHlwZScsXG4gKiAgICAgICBwYXRoOiBbICd1c2VybmFtZScgXSxcbiAqICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGlucHV0OiBleHBlY3RlZCBzdHJpbmcnXG4gKiAgICAgfSxcbiAqICAgICB7XG4gKiAgICAgICBleHBlY3RlZDogJ251bWJlcicsXG4gKiAgICAgICBjb2RlOiAnaW52YWxpZF90eXBlJyxcbiAqICAgICAgIHBhdGg6IFsgJ2Zhdm9yaXRlTnVtYmVycycsIDEgXSxcbiAqICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGlucHV0OiBleHBlY3RlZCBudW1iZXInXG4gKiAgICAgfVxuICogICBdO1xuICogfVxuICogYGBgXG4gKlxuICogdG9cbiAqXG4gKiBgYGBcbiAqIHVzZXJuYW1lXG4gKiAgIFx1MjcxNiBFeHBlY3RlZCBudW1iZXIsIHJlY2VpdmVkIHN0cmluZyBhdCBcInVzZXJuYW1lXG4gKiBmYXZvcml0ZU51bWJlcnNbMF1cbiAqICAgXHUyNzE2IEludmFsaWQgaW5wdXQ6IGV4cGVjdGVkIG51bWJlclxuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHRvRG90UGF0aChfcGF0aCkge1xuICAgIGNvbnN0IHNlZ3MgPSBbXTtcbiAgICBjb25zdCBwYXRoID0gX3BhdGgubWFwKChzZWcpPT50eXBlb2Ygc2VnID09PSBcIm9iamVjdFwiID8gc2VnLmtleSA6IHNlZyk7XG4gICAgZm9yIChjb25zdCBzZWcgb2YgcGF0aCl7XG4gICAgICAgIGlmICh0eXBlb2Ygc2VnID09PSBcIm51bWJlclwiKSBzZWdzLnB1c2goYFske3NlZ31dYCk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBzZWcgPT09IFwic3ltYm9sXCIpIHNlZ3MucHVzaChgWyR7SlNPTi5zdHJpbmdpZnkoU3RyaW5nKHNlZykpfV1gKTtcbiAgICAgICAgZWxzZSBpZiAoL1teXFx3JF0vLnRlc3Qoc2VnKSkgc2Vncy5wdXNoKGBbJHtKU09OLnN0cmluZ2lmeShzZWcpfV1gKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoc2Vncy5sZW5ndGgpIHNlZ3MucHVzaChcIi5cIik7XG4gICAgICAgICAgICBzZWdzLnB1c2goc2VnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2Vncy5qb2luKFwiXCIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByZXR0aWZ5RXJyb3IoZXJyb3IpIHtcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIC8vIHNvcnQgYnkgcGF0aCBsZW5ndGhcbiAgICBjb25zdCBpc3N1ZXMgPSBbXG4gICAgICAgIC4uLmVycm9yLmlzc3Vlc1xuICAgIF0uc29ydCgoYSwgYik9PihhLnBhdGggPz8gW10pLmxlbmd0aCAtIChiLnBhdGggPz8gW10pLmxlbmd0aCk7XG4gICAgLy8gUHJvY2VzcyBlYWNoIGlzc3VlXG4gICAgZm9yIChjb25zdCBpc3N1ZSBvZiBpc3N1ZXMpe1xuICAgICAgICBsaW5lcy5wdXNoKGBcdTI3MTYgJHtpc3N1ZS5tZXNzYWdlfWApO1xuICAgICAgICBpZiAoaXNzdWUucGF0aD8ubGVuZ3RoKSBsaW5lcy5wdXNoKGAgIFx1MjE5MiBhdCAke3RvRG90UGF0aChpc3N1ZS5wYXRoKX1gKTtcbiAgICB9XG4gICAgLy8gQ29udmVydCBNYXAgdG8gZm9ybWF0dGVkIHN0cmluZ1xuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xufVxuIiwgImltcG9ydCAqIGFzIGNvcmUgZnJvbSBcIi4vY29yZS5qc1wiO1xuaW1wb3J0ICogYXMgZXJyb3JzIGZyb20gXCIuL2Vycm9ycy5qc1wiO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tIFwiLi91dGlsLmpzXCI7XG5leHBvcnQgY29uc3QgX3BhcnNlID0gKF9FcnIpPT4oc2NoZW1hLCB2YWx1ZSwgX2N0eCwgX3BhcmFtcyk9PntcbiAgICAgICAgY29uc3QgY3R4ID0gX2N0eCA/IE9iamVjdC5hc3NpZ24oX2N0eCwge1xuICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG4gICAgICAgIH0pIDoge1xuICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHNjaGVtYS5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RBc3luY0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IChfcGFyYW1zPy5FcnIgPz8gX0VycikocmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpKTtcbiAgICAgICAgICAgIHV0aWwuY2FwdHVyZVN0YWNrVHJhY2UoZSwgX3BhcmFtcz8uY2FsbGVlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IHBhcnNlID0gLyogQF9fUFVSRV9fKi8gX3BhcnNlKGVycm9ycy4kWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBfcGFyc2VBc3luYyA9IChfRXJyKT0+YXN5bmMgKHNjaGVtYSwgdmFsdWUsIF9jdHgsIHBhcmFtcyk9PntcbiAgICAgICAgY29uc3QgY3R4ID0gX2N0eCA/IE9iamVjdC5hc3NpZ24oX2N0eCwge1xuICAgICAgICAgICAgYXN5bmM6IHRydWVcbiAgICAgICAgfSkgOiB7XG4gICAgICAgICAgICBhc3luYzogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICBsZXQgcmVzdWx0ID0gc2NoZW1hLl96b2QucnVuKHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICB9LCBjdHgpO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkgcmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xuICAgICAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBuZXcgKHBhcmFtcz8uRXJyID8/IF9FcnIpKHJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKSk7XG4gICAgICAgICAgICB1dGlsLmNhcHR1cmVTdGFja1RyYWNlKGUsIHBhcmFtcz8uY2FsbGVlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IHBhcnNlQXN5bmMgPSAvKiBAX19QVVJFX18qLyBfcGFyc2VBc3luYyhlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX3NhZmVQYXJzZSA9IChfRXJyKT0+KHNjaGVtYSwgdmFsdWUsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyB7XG4gICAgICAgICAgICAuLi5fY3R4LFxuICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG4gICAgICAgIH0gOiB7XG4gICAgICAgICAgICBhc3luYzogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc2NoZW1hLl96b2QucnVuKHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICB9LCBjdHgpO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuJFpvZEFzeW5jRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0Lmlzc3Vlcy5sZW5ndGggPyB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBuZXcgKF9FcnIgPz8gZXJyb3JzLiRab2RFcnJvcikocmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpKVxuICAgICAgICB9IDoge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IHJlc3VsdC52YWx1ZVxuICAgICAgICB9O1xuICAgIH07XG5leHBvcnQgY29uc3Qgc2FmZVBhcnNlID0gLyogQF9fUFVSRV9fKi8gX3NhZmVQYXJzZShlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX3NhZmVQYXJzZUFzeW5jID0gKF9FcnIpPT5hc3luYyAoc2NoZW1hLCB2YWx1ZSwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgY3R4ID0gX2N0eCA/IE9iamVjdC5hc3NpZ24oX2N0eCwge1xuICAgICAgICAgICAgYXN5bmM6IHRydWVcbiAgICAgICAgfSkgOiB7XG4gICAgICAgICAgICBhc3luYzogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICBsZXQgcmVzdWx0ID0gc2NoZW1hLl96b2QucnVuKHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICB9LCBjdHgpO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkgcmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xuICAgICAgICByZXR1cm4gcmVzdWx0Lmlzc3Vlcy5sZW5ndGggPyB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBuZXcgX0VycihyZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSkpXG4gICAgICAgIH0gOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogcmVzdWx0LnZhbHVlXG4gICAgICAgIH07XG4gICAgfTtcbmV4cG9ydCBjb25zdCBzYWZlUGFyc2VBc3luYyA9IC8qIEBfX1BVUkVfXyovIF9zYWZlUGFyc2VBc3luYyhlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX2VuY29kZSA9IChfRXJyKT0+KHNjaGVtYSwgdmFsdWUsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyBPYmplY3QuYXNzaWduKF9jdHgsIHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH0pIDoge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJhY2t3YXJkXCJcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF9wYXJzZShfRXJyKShzY2hlbWEsIHZhbHVlLCBjdHgpO1xuICAgIH07XG5leHBvcnQgY29uc3QgZW5jb2RlID0gLyogQF9fUFVSRV9fKi8gX2VuY29kZShlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX2RlY29kZSA9IChfRXJyKT0+KHNjaGVtYSwgdmFsdWUsIF9jdHgpPT57XG4gICAgICAgIHJldHVybiBfcGFyc2UoX0Vycikoc2NoZW1hLCB2YWx1ZSwgX2N0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBkZWNvZGUgPSAvKiBAX19QVVJFX18qLyBfZGVjb2RlKGVycm9ycy4kWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBfZW5jb2RlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8gT2JqZWN0LmFzc2lnbihfY3R4LCB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfcGFyc2VBc3luYyhfRXJyKShzY2hlbWEsIHZhbHVlLCBjdHgpO1xuICAgIH07XG5leHBvcnQgY29uc3QgZW5jb2RlQXN5bmMgPSAvKiBAX19QVVJFX18qLyBfZW5jb2RlQXN5bmMoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9kZWNvZGVBc3luYyA9IChfRXJyKT0+YXN5bmMgKHNjaGVtYSwgdmFsdWUsIF9jdHgpPT57XG4gICAgICAgIHJldHVybiBfcGFyc2VBc3luYyhfRXJyKShzY2hlbWEsIHZhbHVlLCBfY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IGRlY29kZUFzeW5jID0gLyogQF9fUFVSRV9fKi8gX2RlY29kZUFzeW5jKGVycm9ycy4kWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBfc2FmZUVuY29kZSA9IChfRXJyKT0+KHNjaGVtYSwgdmFsdWUsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyBPYmplY3QuYXNzaWduKF9jdHgsIHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH0pIDoge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJhY2t3YXJkXCJcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF9zYWZlUGFyc2UoX0Vycikoc2NoZW1hLCB2YWx1ZSwgY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IHNhZmVFbmNvZGUgPSAvKiBAX19QVVJFX18qLyBfc2FmZUVuY29kZShlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX3NhZmVEZWNvZGUgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICByZXR1cm4gX3NhZmVQYXJzZShfRXJyKShzY2hlbWEsIHZhbHVlLCBfY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IHNhZmVEZWNvZGUgPSAvKiBAX19QVVJFX18qLyBfc2FmZURlY29kZShlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX3NhZmVFbmNvZGVBc3luYyA9IChfRXJyKT0+YXN5bmMgKHNjaGVtYSwgdmFsdWUsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyBPYmplY3QuYXNzaWduKF9jdHgsIHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH0pIDoge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJhY2t3YXJkXCJcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF9zYWZlUGFyc2VBc3luYyhfRXJyKShzY2hlbWEsIHZhbHVlLCBjdHgpO1xuICAgIH07XG5leHBvcnQgY29uc3Qgc2FmZUVuY29kZUFzeW5jID0gLyogQF9fUFVSRV9fKi8gX3NhZmVFbmNvZGVBc3luYyhlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX3NhZmVEZWNvZGVBc3luYyA9IChfRXJyKT0+YXN5bmMgKHNjaGVtYSwgdmFsdWUsIF9jdHgpPT57XG4gICAgICAgIHJldHVybiBfc2FmZVBhcnNlQXN5bmMoX0Vycikoc2NoZW1hLCB2YWx1ZSwgX2N0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBzYWZlRGVjb2RlQXN5bmMgPSAvKiBAX19QVVJFX18qLyBfc2FmZURlY29kZUFzeW5jKGVycm9ycy4kWm9kUmVhbEVycm9yKTtcbiIsICJleHBvcnQgY29uc3QgY3VpZCA9IC9eW2NDXVteXFxzLV17OCx9JC87XG5leHBvcnQgY29uc3QgY3VpZDIgPSAvXlswLTlhLXpdKyQvO1xuZXhwb3J0IGNvbnN0IHVsaWQgPSAvXlswLTlBLUhKS01OUC1UVi1aYS1oamttbnAtdHYtel17MjZ9JC87XG5leHBvcnQgY29uc3QgeGlkID0gL15bMC05YS12QS1WXXsyMH0kLztcbmV4cG9ydCBjb25zdCBrc3VpZCA9IC9eW0EtWmEtejAtOV17Mjd9JC87XG5leHBvcnQgY29uc3QgbmFub2lkID0gL15bYS16QS1aMC05Xy1dezIxfSQvO1xuLyoqIElTTyA4NjAxLTEgZHVyYXRpb24gcmVnZXguIERvZXMgbm90IHN1cHBvcnQgdGhlIDg2MDEtMiBleHRlbnNpb25zIGxpa2UgbmVnYXRpdmUgZHVyYXRpb25zIG9yIGZyYWN0aW9uYWwvbmVnYXRpdmUgY29tcG9uZW50cy4gKi8gZXhwb3J0IGNvbnN0IGR1cmF0aW9uID0gL15QKD86KFxcZCtXKXwoPyEuKlcpKD89XFxkfFRcXGQpKFxcZCtZKT8oXFxkK00pPyhcXGQrRCk/KFQoPz1cXGQpKFxcZCtIKT8oXFxkK00pPyhcXGQrKFsuLF1cXGQrKT9TKT8pPykkLztcbi8qKiBJbXBsZW1lbnRzIElTTyA4NjAxLTIgZXh0ZW5zaW9ucyBsaWtlIGV4cGxpY2l0ICstIHByZWZpeGVzLCBtaXhpbmcgd2Vla3Mgd2l0aCBvdGhlciB1bml0cywgYW5kIGZyYWN0aW9uYWwvbmVnYXRpdmUgY29tcG9uZW50cy4gKi8gZXhwb3J0IGNvbnN0IGV4dGVuZGVkRHVyYXRpb24gPSAvXlstK10/UCg/ISQpKD86KD86Wy0rXT9cXGQrWSl8KD86Wy0rXT9cXGQrWy4sXVxcZCtZJCkpPyg/Oig/OlstK10/XFxkK00pfCg/OlstK10/XFxkK1suLF1cXGQrTSQpKT8oPzooPzpbLStdP1xcZCtXKXwoPzpbLStdP1xcZCtbLixdXFxkK1ckKSk/KD86KD86Wy0rXT9cXGQrRCl8KD86Wy0rXT9cXGQrWy4sXVxcZCtEJCkpPyg/OlQoPz1bXFxkKy1dKSg/Oig/OlstK10/XFxkK0gpfCg/OlstK10/XFxkK1suLF1cXGQrSCQpKT8oPzooPzpbLStdP1xcZCtNKXwoPzpbLStdP1xcZCtbLixdXFxkK00kKSk/KD86Wy0rXT9cXGQrKD86Wy4sXVxcZCspP1MpPyk/PyQvO1xuLyoqIEEgcmVnZXggZm9yIGFueSBVVUlELWxpa2UgaWRlbnRpZmllcjogOC00LTQtNC0xMiBoZXggcGF0dGVybiAqLyBleHBvcnQgY29uc3QgZ3VpZCA9IC9eKFswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSkkLztcbi8qKiBSZXR1cm5zIGEgcmVnZXggZm9yIHZhbGlkYXRpbmcgYW4gUkZDIDk1NjIvNDEyMiBVVUlELlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIE9wdGlvbmFsbHkgc3BlY2lmeSBhIHZlcnNpb24gMS04LiBJZiBubyB2ZXJzaW9uIGlzIHNwZWNpZmllZCwgYWxsIHZlcnNpb25zIGFyZSBzdXBwb3J0ZWQuICovIGV4cG9ydCBjb25zdCB1dWlkID0gKHZlcnNpb24pPT57XG4gICAgaWYgKCF2ZXJzaW9uKSByZXR1cm4gL14oWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzEtOF1bMC05YS1mQS1GXXszfS1bODlhYkFCXVswLTlhLWZBLUZdezN9LVswLTlhLWZBLUZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDB8ZmZmZmZmZmYtZmZmZi1mZmZmLWZmZmYtZmZmZmZmZmZmZmZmKSQvO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeKFswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LSR7dmVyc2lvbn1bMC05YS1mQS1GXXszfS1bODlhYkFCXVswLTlhLWZBLUZdezN9LVswLTlhLWZBLUZdezEyfSkkYCk7XG59O1xuZXhwb3J0IGNvbnN0IHV1aWQ0ID0gLypAX19QVVJFX18qLyB1dWlkKDQpO1xuZXhwb3J0IGNvbnN0IHV1aWQ2ID0gLypAX19QVVJFX18qLyB1dWlkKDYpO1xuZXhwb3J0IGNvbnN0IHV1aWQ3ID0gLypAX19QVVJFX18qLyB1dWlkKDcpO1xuLyoqIFByYWN0aWNhbCBlbWFpbCB2YWxpZGF0aW9uICovIGV4cG9ydCBjb25zdCBlbWFpbCA9IC9eKD8hXFwuKSg/IS4qXFwuXFwuKShbQS1aYS16MC05XycrXFwtXFwuXSopW0EtWmEtejAtOV8rLV1AKFtBLVphLXowLTldW0EtWmEtejAtOVxcLV0qXFwuKStbQS1aYS16XXsyLH0kLztcbi8qKiBFcXVpdmFsZW50IHRvIHRoZSBIVE1MNSBpbnB1dFt0eXBlPWVtYWlsXSB2YWxpZGF0aW9uIGltcGxlbWVudGVkIGJ5IGJyb3dzZXJzLiBTb3VyY2U6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pbnB1dC9lbWFpbCAqLyBleHBvcnQgY29uc3QgaHRtbDVFbWFpbCA9IC9eW2EtekEtWjAtOS4hIyQlJicqKy89P15fYHt8fX4tXStAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSokLztcbi8qKiBUaGUgY2xhc3NpYyBlbWFpbHJlZ2V4LmNvbSByZWdleCBmb3IgUkZDIDUzMjItY29tcGxpYW50IGVtYWlscyAqLyBleHBvcnQgY29uc3QgcmZjNTMyMkVtYWlsID0gL14oKFtePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSsoXFwuW148PigpXFxbXFxdXFxcXC4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKChcXFtbMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XSl8KChbYS16QS1aXFwtMC05XStcXC4pK1thLXpBLVpdezIsfSkpJC87XG4vKiogQSBsb29zZSByZWdleCB0aGF0IGFsbG93cyBVbmljb2RlIGNoYXJhY3RlcnMsIGVuZm9yY2VzIGxlbmd0aCBsaW1pdHMsIGFuZCB0aGF0J3MgYWJvdXQgaXQuICovIGV4cG9ydCBjb25zdCB1bmljb2RlRW1haWwgPSAvXlteXFxzQFwiXXsxLDY0fUBbXlxcc0BdezEsMjU1fSQvdTtcbmV4cG9ydCBjb25zdCBpZG5FbWFpbCA9IHVuaWNvZGVFbWFpbDtcbmV4cG9ydCBjb25zdCBicm93c2VyRW1haWwgPSAvXlthLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC87XG4vLyBmcm9tIGh0dHBzOi8vdGhla2V2aW5zY290dC5jb20vZW1vamlzLWluLWphdmFzY3JpcHQvI3dyaXRpbmctYS1yZWd1bGFyLWV4cHJlc3Npb25cbmNvbnN0IF9lbW9qaSA9IGBeKFxcXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxcXHB7RW1vamlfQ29tcG9uZW50fSkrJGA7XG5leHBvcnQgZnVuY3Rpb24gZW1vamkoKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoX2Vtb2ppLCBcInVcIik7XG59XG5leHBvcnQgY29uc3QgaXB2NCA9IC9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pJC87XG5leHBvcnQgY29uc3QgaXB2NiA9IC9eKChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318OikpJC87XG5leHBvcnQgY29uc3QgY2lkcnY0ID0gL14oKDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSlcXC4pezN9KDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSlcXC8oWzAtOV18WzEtMl1bMC05XXwzWzAtMl0pJC87XG5leHBvcnQgY29uc3QgY2lkcnY2ID0gL14oKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18Ojp8KFswLTlhLWZBLUZdezEsNH0pPzo6KFswLTlhLWZBLUZdezEsNH06Pyl7MCw2fSlcXC8oMTJbMC04XXwxWzAxXVswLTldfFsxLTldP1swLTldKSQvO1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzg2MDM5Mi9kZXRlcm1pbmUtaWYtc3RyaW5nLWlzLWluLWJhc2U2NC11c2luZy1qYXZhc2NyaXB0XG5leHBvcnQgY29uc3QgYmFzZTY0ID0gL14kfF4oPzpbMC05YS16QS1aKy9dezR9KSooPzooPzpbMC05YS16QS1aKy9dezJ9PT0pfCg/OlswLTlhLXpBLVorL117M309KSk/JC87XG5leHBvcnQgY29uc3QgYmFzZTY0dXJsID0gL15bQS1aYS16MC05Xy1dKiQvO1xuLy8gYmFzZWQgb24gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA2MTc5L3JlZ3VsYXItZXhwcmVzc2lvbi10by1tYXRjaC1kbnMtaG9zdG5hbWUtb3ItaXAtYWRkcmVzc1xuLy8gZXhwb3J0IGNvbnN0IGhvc3RuYW1lOiBSZWdFeHAgPSAvXihbYS16QS1aMC05LV0rXFwuKSpbYS16QS1aMC05LV0rJC87XG5leHBvcnQgY29uc3QgaG9zdG5hbWUgPSAvXig/PS57MSwyNTN9XFwuPyQpW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbLTAtOWEtekEtWl17MCw2MX1bMC05YS16QS1aXSk/KSpcXC4/JC87XG5leHBvcnQgY29uc3QgZG9tYWluID0gL14oW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/XFwuKStbYS16QS1aXXsyLH0kLztcbi8vIGh0dHBzOi8vYmxvZy5zdGV2ZW5sZXZpdGhhbi5jb20vYXJjaGl2ZXMvdmFsaWRhdGUtcGhvbmUtbnVtYmVyI3I0LTMgKHJlZ2V4IHNhbnMgc3BhY2VzKVxuZXhwb3J0IGNvbnN0IGUxNjQgPSAvXlxcKyg/OlswLTldKXs2LDE0fVswLTldJC87XG4vLyBjb25zdCBkYXRlU291cmNlID0gYCgoXFxcXGRcXFxcZFsyNDY4XVswNDhdfFxcXFxkXFxcXGRbMTM1NzldWzI2XXxcXFxcZFxcXFxkMFs0OF18WzAyNDY4XVswNDhdMDB8WzEzNTc5XVsyNl0wMCktMDItMjl8XFxcXGR7NH0tKCgwWzEzNTc4XXwxWzAyXSktKDBbMS05XXxbMTJdXFxcXGR8M1swMV0pfCgwWzQ2OV18MTEpLSgwWzEtOV18WzEyXVxcXFxkfDMwKXwoMDIpLSgwWzEtOV18MVxcXFxkfDJbMC04XSkpKWA7XG5jb25zdCBkYXRlU291cmNlID0gYCg/Oig/OlxcXFxkXFxcXGRbMjQ2OF1bMDQ4XXxcXFxcZFxcXFxkWzEzNTc5XVsyNl18XFxcXGRcXFxcZDBbNDhdfFswMjQ2OF1bMDQ4XTAwfFsxMzU3OV1bMjZdMDApLTAyLTI5fFxcXFxkezR9LSg/Oig/OjBbMTM1NzhdfDFbMDJdKS0oPzowWzEtOV18WzEyXVxcXFxkfDNbMDFdKXwoPzowWzQ2OV18MTEpLSg/OjBbMS05XXxbMTJdXFxcXGR8MzApfCg/OjAyKS0oPzowWzEtOV18MVxcXFxkfDJbMC04XSkpKWA7XG5leHBvcnQgY29uc3QgZGF0ZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFJlZ0V4cChgXiR7ZGF0ZVNvdXJjZX0kYCk7XG5mdW5jdGlvbiB0aW1lU291cmNlKGFyZ3MpIHtcbiAgICBjb25zdCBoaG1tID0gYCg/OlswMV1cXFxcZHwyWzAtM10pOlswLTVdXFxcXGRgO1xuICAgIGNvbnN0IHJlZ2V4ID0gdHlwZW9mIGFyZ3MucHJlY2lzaW9uID09PSBcIm51bWJlclwiID8gYXJncy5wcmVjaXNpb24gPT09IC0xID8gYCR7aGhtbX1gIDogYXJncy5wcmVjaXNpb24gPT09IDAgPyBgJHtoaG1tfTpbMC01XVxcXFxkYCA6IGAke2hobW19OlswLTVdXFxcXGRcXFxcLlxcXFxkeyR7YXJncy5wcmVjaXNpb259fWAgOiBgJHtoaG1tfSg/OjpbMC01XVxcXFxkKD86XFxcXC5cXFxcZCspPyk/YDtcbiAgICByZXR1cm4gcmVnZXg7XG59XG5leHBvcnQgZnVuY3Rpb24gdGltZShhcmdzKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3RpbWVTb3VyY2UoYXJncyl9JGApO1xufVxuLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zMTQzMjMxXG5leHBvcnQgZnVuY3Rpb24gZGF0ZXRpbWUoYXJncykge1xuICAgIGNvbnN0IHRpbWUgPSB0aW1lU291cmNlKHtcbiAgICAgICAgcHJlY2lzaW9uOiBhcmdzLnByZWNpc2lvblxuICAgIH0pO1xuICAgIGNvbnN0IG9wdHMgPSBbXG4gICAgICAgIFwiWlwiXG4gICAgXTtcbiAgICBpZiAoYXJncy5sb2NhbCkgb3B0cy5wdXNoKFwiXCIpO1xuICAgIC8vIGlmIChhcmdzLm9mZnNldCkgb3B0cy5wdXNoKGAoWystXVxcXFxkezJ9OlxcXFxkezJ9KWApO1xuICAgIGlmIChhcmdzLm9mZnNldCkgb3B0cy5wdXNoKGAoWystXSg/OlswMV1cXFxcZHwyWzAtM10pOlswLTVdXFxcXGQpYCk7XG4gICAgY29uc3QgdGltZVJlZ2V4ID0gYCR7dGltZX0oPzoke29wdHMuam9pbihcInxcIil9KWA7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke2RhdGVTb3VyY2V9VCg/OiR7dGltZVJlZ2V4fSkkYCk7XG59XG5leHBvcnQgY29uc3Qgc3RyaW5nID0gKHBhcmFtcyk9PntcbiAgICBjb25zdCByZWdleCA9IHBhcmFtcyA/IGBbXFxcXHNcXFxcU117JHtwYXJhbXM/Lm1pbmltdW0gPz8gMH0sJHtwYXJhbXM/Lm1heGltdW0gPz8gXCJcIn19YCA6IGBbXFxcXHNcXFxcU10qYDtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7cmVnZXh9JGApO1xufTtcbmV4cG9ydCBjb25zdCBiaWdpbnQgPSAvXi0/XFxkK24/JC87XG5leHBvcnQgY29uc3QgaW50ZWdlciA9IC9eLT9cXGQrJC87XG5leHBvcnQgY29uc3QgbnVtYmVyID0gL14tP1xcZCsoPzpcXC5cXGQrKT8vO1xuZXhwb3J0IGNvbnN0IGJvb2xlYW4gPSAvXig/OnRydWV8ZmFsc2UpJC9pO1xuY29uc3QgX251bGwgPSAvXm51bGwkL2k7XG5leHBvcnQgeyBfbnVsbCBhcyBudWxsIH07XG5jb25zdCBfdW5kZWZpbmVkID0gL151bmRlZmluZWQkL2k7XG5leHBvcnQgeyBfdW5kZWZpbmVkIGFzIHVuZGVmaW5lZCB9O1xuLy8gcmVnZXggZm9yIHN0cmluZyB3aXRoIG5vIHVwcGVyY2FzZSBsZXR0ZXJzXG5leHBvcnQgY29uc3QgbG93ZXJjYXNlID0gL15bXkEtWl0qJC87XG4vLyByZWdleCBmb3Igc3RyaW5nIHdpdGggbm8gbG93ZXJjYXNlIGxldHRlcnNcbmV4cG9ydCBjb25zdCB1cHBlcmNhc2UgPSAvXlteYS16XSokLztcbi8vIHJlZ2V4IGZvciBoZXhhZGVjaW1hbCBzdHJpbmdzIChhbnkgbGVuZ3RoKVxuZXhwb3J0IGNvbnN0IGhleCA9IC9eWzAtOWEtZkEtRl0qJC87XG4vLyBIYXNoIHJlZ2V4ZXMgZm9yIGRpZmZlcmVudCBhbGdvcml0aG1zIGFuZCBlbmNvZGluZ3Ncbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYmFzZTY0IHJlZ2V4IHdpdGggZXhhY3QgbGVuZ3RoIGFuZCBwYWRkaW5nXG5mdW5jdGlvbiBmaXhlZEJhc2U2NChib2R5TGVuZ3RoLCBwYWRkaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF5bQS1aYS16MC05Ky9deyR7Ym9keUxlbmd0aH19JHtwYWRkaW5nfSRgKTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYmFzZTY0dXJsIHJlZ2V4IHdpdGggZXhhY3QgbGVuZ3RoIChubyBwYWRkaW5nKVxuZnVuY3Rpb24gZml4ZWRCYXNlNjR1cmwobGVuZ3RoKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF5bQS1aYS16MC05Xy1deyR7bGVuZ3RofX0kYCk7XG59XG4vLyBNRDUgKDE2IGJ5dGVzKTogYmFzZTY0ID0gMjQgY2hhcnMgdG90YWwgKDIyICsgXCI9PVwiKVxuZXhwb3J0IGNvbnN0IG1kNV9oZXggPSAvXlswLTlhLWZBLUZdezMyfSQvO1xuZXhwb3J0IGNvbnN0IG1kNV9iYXNlNjQgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0KDIyLCBcIj09XCIpO1xuZXhwb3J0IGNvbnN0IG1kNV9iYXNlNjR1cmwgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0dXJsKDIyKTtcbi8vIFNIQTEgKDIwIGJ5dGVzKTogYmFzZTY0ID0gMjggY2hhcnMgdG90YWwgKDI3ICsgXCI9XCIpXG5leHBvcnQgY29uc3Qgc2hhMV9oZXggPSAvXlswLTlhLWZBLUZdezQwfSQvO1xuZXhwb3J0IGNvbnN0IHNoYTFfYmFzZTY0ID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NCgyNywgXCI9XCIpO1xuZXhwb3J0IGNvbnN0IHNoYTFfYmFzZTY0dXJsID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NHVybCgyNyk7XG4vLyBTSEEyNTYgKDMyIGJ5dGVzKTogYmFzZTY0ID0gNDQgY2hhcnMgdG90YWwgKDQzICsgXCI9XCIpXG5leHBvcnQgY29uc3Qgc2hhMjU2X2hleCA9IC9eWzAtOWEtZkEtRl17NjR9JC87XG5leHBvcnQgY29uc3Qgc2hhMjU2X2Jhc2U2NCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjQoNDMsIFwiPVwiKTtcbmV4cG9ydCBjb25zdCBzaGEyNTZfYmFzZTY0dXJsID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NHVybCg0Myk7XG4vLyBTSEEzODQgKDQ4IGJ5dGVzKTogYmFzZTY0ID0gNjQgY2hhcnMgdG90YWwgKG5vIHBhZGRpbmcpXG5leHBvcnQgY29uc3Qgc2hhMzg0X2hleCA9IC9eWzAtOWEtZkEtRl17OTZ9JC87XG5leHBvcnQgY29uc3Qgc2hhMzg0X2Jhc2U2NCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjQoNjQsIFwiXCIpO1xuZXhwb3J0IGNvbnN0IHNoYTM4NF9iYXNlNjR1cmwgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0dXJsKDY0KTtcbi8vIFNIQTUxMiAoNjQgYnl0ZXMpOiBiYXNlNjQgPSA4OCBjaGFycyB0b3RhbCAoODYgKyBcIj09XCIpXG5leHBvcnQgY29uc3Qgc2hhNTEyX2hleCA9IC9eWzAtOWEtZkEtRl17MTI4fSQvO1xuZXhwb3J0IGNvbnN0IHNoYTUxMl9iYXNlNjQgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0KDg2LCBcIj09XCIpO1xuZXhwb3J0IGNvbnN0IHNoYTUxMl9iYXNlNjR1cmwgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0dXJsKDg2KTtcbiIsICIvLyBpbXBvcnQgeyAkWm9kVHlwZSB9IGZyb20gXCIuL3NjaGVtYXMuanNcIjtcbmltcG9ydCAqIGFzIGNvcmUgZnJvbSBcIi4vY29yZS5qc1wiO1xuaW1wb3J0ICogYXMgcmVnZXhlcyBmcm9tIFwiLi9yZWdleGVzLmpzXCI7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gXCIuL3V0aWwuanNcIjtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2sgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrXCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hO1xuICAgIGluc3QuX3pvZCA/PyAoaW5zdC5fem9kID0ge30pO1xuICAgIGluc3QuX3pvZC5kZWYgPSBkZWY7XG4gICAgKF9hID0gaW5zdC5fem9kKS5vbmF0dGFjaCA/PyAoX2Eub25hdHRhY2ggPSBbXSk7XG59KTtcbmNvbnN0IG51bWVyaWNPcmlnaW5NYXAgPSB7XG4gICAgbnVtYmVyOiBcIm51bWJlclwiLFxuICAgIGJpZ2ludDogXCJiaWdpbnRcIixcbiAgICBvYmplY3Q6IFwiZGF0ZVwiXG59O1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja0xlc3NUaGFuID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja0xlc3NUaGFuXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCBvcmlnaW4gPSBudW1lcmljT3JpZ2luTWFwW3R5cGVvZiBkZWYudmFsdWVdO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgICAgICBjb25zdCBjdXJyID0gKGRlZi5pbmNsdXNpdmUgPyBiYWcubWF4aW11bSA6IGJhZy5leGNsdXNpdmVNYXhpbXVtKSA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIGlmIChkZWYudmFsdWUgPCBjdXJyKSB7XG4gICAgICAgICAgICBpZiAoZGVmLmluY2x1c2l2ZSkgYmFnLm1heGltdW0gPSBkZWYudmFsdWU7XG4gICAgICAgICAgICBlbHNlIGJhZy5leGNsdXNpdmVNYXhpbXVtID0gZGVmLnZhbHVlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmIChkZWYuaW5jbHVzaXZlID8gcGF5bG9hZC52YWx1ZSA8PSBkZWYudmFsdWUgOiBwYXlsb2FkLnZhbHVlIDwgZGVmLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgIG1heGltdW06IGRlZi52YWx1ZSxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBkZWYuaW5jbHVzaXZlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tHcmVhdGVyVGhhbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tHcmVhdGVyVGhhblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3Qgb3JpZ2luID0gbnVtZXJpY09yaWdpbk1hcFt0eXBlb2YgZGVmLnZhbHVlXTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgY29uc3QgY3VyciA9IChkZWYuaW5jbHVzaXZlID8gYmFnLm1pbmltdW0gOiBiYWcuZXhjbHVzaXZlTWluaW11bSkgPz8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICBpZiAoZGVmLnZhbHVlID4gY3Vycikge1xuICAgICAgICAgICAgaWYgKGRlZi5pbmNsdXNpdmUpIGJhZy5taW5pbXVtID0gZGVmLnZhbHVlO1xuICAgICAgICAgICAgZWxzZSBiYWcuZXhjbHVzaXZlTWluaW11bSA9IGRlZi52YWx1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAoZGVmLmluY2x1c2l2ZSA/IHBheWxvYWQudmFsdWUgPj0gZGVmLnZhbHVlIDogcGF5bG9hZC52YWx1ZSA+IGRlZi52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgY29kZTogXCJ0b29fc21hbGxcIixcbiAgICAgICAgICAgIG1pbmltdW06IGRlZi52YWx1ZSxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBkZWYuaW5jbHVzaXZlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tNdWx0aXBsZU9mID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja011bHRpcGxlT2ZcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IGluc3QuX3pvZC5iYWcpLm11bHRpcGxlT2YgPz8gKF9hLm11bHRpcGxlT2YgPSBkZWYudmFsdWUpO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQudmFsdWUgIT09IHR5cGVvZiBkZWYudmFsdWUpIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBtaXggbnVtYmVyIGFuZCBiaWdpbnQgaW4gbXVsdGlwbGVfb2YgY2hlY2suXCIpO1xuICAgICAgICBjb25zdCBpc011bHRpcGxlID0gdHlwZW9mIHBheWxvYWQudmFsdWUgPT09IFwiYmlnaW50XCIgPyBwYXlsb2FkLnZhbHVlICUgZGVmLnZhbHVlID09PSBCaWdJbnQoMCkgOiB1dGlsLmZsb2F0U2FmZVJlbWFpbmRlcihwYXlsb2FkLnZhbHVlLCBkZWYudmFsdWUpID09PSAwO1xuICAgICAgICBpZiAoaXNNdWx0aXBsZSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogdHlwZW9mIHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBjb2RlOiBcIm5vdF9tdWx0aXBsZV9vZlwiLFxuICAgICAgICAgICAgZGl2aXNvcjogZGVmLnZhbHVlLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja051bWJlckZvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tOdW1iZXJGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpOyAvLyBubyBmb3JtYXQgY2hlY2tzXG4gICAgZGVmLmZvcm1hdCA9IGRlZi5mb3JtYXQgfHwgXCJmbG9hdDY0XCI7XG4gICAgY29uc3QgaXNJbnQgPSBkZWYuZm9ybWF0Py5pbmNsdWRlcyhcImludFwiKTtcbiAgICBjb25zdCBvcmlnaW4gPSBpc0ludCA/IFwiaW50XCIgOiBcIm51bWJlclwiO1xuICAgIGNvbnN0IFttaW5pbXVtLCBtYXhpbXVtXSA9IHV0aWwuTlVNQkVSX0ZPUk1BVF9SQU5HRVNbZGVmLmZvcm1hdF07XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5mb3JtYXQgPSBkZWYuZm9ybWF0O1xuICAgICAgICBiYWcubWluaW11bSA9IG1pbmltdW07XG4gICAgICAgIGJhZy5tYXhpbXVtID0gbWF4aW11bTtcbiAgICAgICAgaWYgKGlzSW50KSBiYWcucGF0dGVybiA9IHJlZ2V4ZXMuaW50ZWdlcjtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoaXNJbnQpIHtcbiAgICAgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICAvLyBpbnZhbGlkX2Zvcm1hdCBpc3N1ZVxuICAgICAgICAgICAgICAgIC8vIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIC8vICAgZXhwZWN0ZWQ6IGRlZi5mb3JtYXQsXG4gICAgICAgICAgICAgICAgLy8gICBmb3JtYXQ6IGRlZi5mb3JtYXQsXG4gICAgICAgICAgICAgICAgLy8gICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgLy8gICBpbnB1dCxcbiAgICAgICAgICAgICAgICAvLyAgIGluc3QsXG4gICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgLy8gaW52YWxpZF90eXBlIGlzc3VlXG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBvcmlnaW4sXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogZGVmLmZvcm1hdCxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIG5vdF9tdWx0aXBsZV9vZiBpc3N1ZVxuICAgICAgICAgICAgLy8gcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAvLyAgIGNvZGU6IFwibm90X211bHRpcGxlX29mXCIsXG4gICAgICAgICAgICAvLyAgIG9yaWdpbjogXCJudW1iZXJcIixcbiAgICAgICAgICAgIC8vICAgaW5wdXQsXG4gICAgICAgICAgICAvLyAgIGluc3QsXG4gICAgICAgICAgICAvLyAgIGRpdmlzb3I6IDEsXG4gICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0b29fYmlnXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJJbnRlZ2VycyBtdXN0IGJlIHdpdGhpbiB0aGUgc2FmZSBpbnRlZ2VyIHJhbmdlLlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvb19zbWFsbFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJ0b29fc21hbGxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJJbnRlZ2VycyBtdXN0IGJlIHdpdGhpbiB0aGUgc2FmZSBpbnRlZ2VyIHJhbmdlLlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0IDwgbWluaW11bSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgb3JpZ2luOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICAgICAgbWluaW11bSxcbiAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0ID4gbWF4aW11bSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgb3JpZ2luOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgICAgIG1heGltdW0sXG4gICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrQmlnSW50Rm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja0JpZ0ludEZvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7IC8vIG5vIGZvcm1hdCBjaGVja3NcbiAgICBjb25zdCBbbWluaW11bSwgbWF4aW11bV0gPSB1dGlsLkJJR0lOVF9GT1JNQVRfUkFOR0VTW2RlZi5mb3JtYXRdO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgICAgICBiYWcuZm9ybWF0ID0gZGVmLmZvcm1hdDtcbiAgICAgICAgYmFnLm1pbmltdW0gPSBtaW5pbXVtO1xuICAgICAgICBiYWcubWF4aW11bSA9IG1heGltdW07XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKGlucHV0IDwgbWluaW11bSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgb3JpZ2luOiBcImJpZ2ludFwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICAgICAgbWluaW11bTogbWluaW11bSxcbiAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0ID4gbWF4aW11bSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgb3JpZ2luOiBcImJpZ2ludFwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgICAgIG1heGltdW0sXG4gICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTWF4U2l6ZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tNYXhTaXplXCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hO1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgKF9hID0gaW5zdC5fem9kLmRlZikud2hlbiA/PyAoX2Eud2hlbiA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCB2YWwgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICByZXR1cm4gIXV0aWwubnVsbGlzaCh2YWwpICYmIHZhbC5zaXplICE9PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGN1cnIgPSBpbnN0Ll96b2QuYmFnLm1heGltdW0gPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICBpZiAoZGVmLm1heGltdW0gPCBjdXJyKSBpbnN0Ll96b2QuYmFnLm1heGltdW0gPSBkZWYubWF4aW11bTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBzaXplID0gaW5wdXQuc2l6ZTtcbiAgICAgICAgaWYgKHNpemUgPD0gZGVmLm1heGltdW0pIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IHV0aWwuZ2V0U2l6YWJsZU9yaWdpbihpbnB1dCksXG4gICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgIG1heGltdW06IGRlZi5tYXhpbXVtLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja01pblNpemUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTWluU2l6ZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIHZhciBfYTtcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIChfYSA9IGluc3QuX3pvZC5kZWYpLndoZW4gPz8gKF9hLndoZW4gPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgdmFsID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgcmV0dXJuICF1dGlsLm51bGxpc2godmFsKSAmJiB2YWwuc2l6ZSAhPT0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBjdXJyID0gaW5zdC5fem9kLmJhZy5taW5pbXVtID8/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgICAgaWYgKGRlZi5taW5pbXVtID4gY3VycikgaW5zdC5fem9kLmJhZy5taW5pbXVtID0gZGVmLm1pbmltdW07XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IGlucHV0LnNpemU7XG4gICAgICAgIGlmIChzaXplID49IGRlZi5taW5pbXVtKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luOiB1dGlsLmdldFNpemFibGVPcmlnaW4oaW5wdXQpLFxuICAgICAgICAgICAgY29kZTogXCJ0b29fc21hbGxcIixcbiAgICAgICAgICAgIG1pbmltdW06IGRlZi5taW5pbXVtLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja1NpemVFcXVhbHMgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrU2l6ZUVxdWFsc1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIHZhciBfYTtcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIChfYSA9IGluc3QuX3pvZC5kZWYpLndoZW4gPz8gKF9hLndoZW4gPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgdmFsID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgcmV0dXJuICF1dGlsLm51bGxpc2godmFsKSAmJiB2YWwuc2l6ZSAhPT0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgICAgICBiYWcubWluaW11bSA9IGRlZi5zaXplO1xuICAgICAgICBiYWcubWF4aW11bSA9IGRlZi5zaXplO1xuICAgICAgICBiYWcuc2l6ZSA9IGRlZi5zaXplO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IHNpemUgPSBpbnB1dC5zaXplO1xuICAgICAgICBpZiAoc2l6ZSA9PT0gZGVmLnNpemUpIHJldHVybjtcbiAgICAgICAgY29uc3QgdG9vQmlnID0gc2l6ZSA+IGRlZi5zaXplO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogdXRpbC5nZXRTaXphYmxlT3JpZ2luKGlucHV0KSxcbiAgICAgICAgICAgIC4uLnRvb0JpZyA/IHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgICAgICBtYXhpbXVtOiBkZWYuc2l6ZVxuICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgICAgIG1pbmltdW06IGRlZi5zaXplXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTWF4TGVuZ3RoID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja01heExlbmd0aFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIHZhciBfYTtcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIChfYSA9IGluc3QuX3pvZC5kZWYpLndoZW4gPz8gKF9hLndoZW4gPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgdmFsID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgcmV0dXJuICF1dGlsLm51bGxpc2godmFsKSAmJiB2YWwubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGN1cnIgPSBpbnN0Ll96b2QuYmFnLm1heGltdW0gPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICBpZiAoZGVmLm1heGltdW0gPCBjdXJyKSBpbnN0Ll96b2QuYmFnLm1heGltdW0gPSBkZWYubWF4aW11bTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPD0gZGVmLm1heGltdW0pIHJldHVybjtcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gdXRpbC5nZXRMZW5ndGhhYmxlT3JpZ2luKGlucHV0KTtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgIG1heGltdW06IGRlZi5tYXhpbXVtLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja01pbkxlbmd0aCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tNaW5MZW5ndGhcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICAoX2EgPSBpbnN0Ll96b2QuZGVmKS53aGVuID8/IChfYS53aGVuID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IHZhbCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIHJldHVybiAhdXRpbC5udWxsaXNoKHZhbCkgJiYgdmFsLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBjdXJyID0gaW5zdC5fem9kLmJhZy5taW5pbXVtID8/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgICAgaWYgKGRlZi5taW5pbXVtID4gY3VycikgaW5zdC5fem9kLmJhZy5taW5pbXVtID0gZGVmLm1pbmltdW07XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICAgICAgICBpZiAobGVuZ3RoID49IGRlZi5taW5pbXVtKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IHV0aWwuZ2V0TGVuZ3RoYWJsZU9yaWdpbihpbnB1dCk7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgY29kZTogXCJ0b29fc21hbGxcIixcbiAgICAgICAgICAgIG1pbmltdW06IGRlZi5taW5pbXVtLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja0xlbmd0aEVxdWFscyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tMZW5ndGhFcXVhbHNcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICAoX2EgPSBpbnN0Ll96b2QuZGVmKS53aGVuID8/IChfYS53aGVuID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IHZhbCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIHJldHVybiAhdXRpbC5udWxsaXNoKHZhbCkgJiYgdmFsLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgICAgICBiYWcubWluaW11bSA9IGRlZi5sZW5ndGg7XG4gICAgICAgIGJhZy5tYXhpbXVtID0gZGVmLmxlbmd0aDtcbiAgICAgICAgYmFnLmxlbmd0aCA9IGRlZi5sZW5ndGg7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICAgICAgICBpZiAobGVuZ3RoID09PSBkZWYubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IHV0aWwuZ2V0TGVuZ3RoYWJsZU9yaWdpbihpbnB1dCk7XG4gICAgICAgIGNvbnN0IHRvb0JpZyA9IGxlbmd0aCA+IGRlZi5sZW5ndGg7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgLi4udG9vQmlnID8ge1xuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgICAgIG1heGltdW06IGRlZi5sZW5ndGhcbiAgICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICAgICAgY29kZTogXCJ0b29fc21hbGxcIixcbiAgICAgICAgICAgICAgICBtaW5pbXVtOiBkZWYubGVuZ3RoXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrU3RyaW5nRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja1N0cmluZ0Zvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIHZhciBfYSwgX2I7XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLmZvcm1hdCA9IGRlZi5mb3JtYXQ7XG4gICAgICAgIGlmIChkZWYucGF0dGVybikge1xuICAgICAgICAgICAgYmFnLnBhdHRlcm5zID8/IChiYWcucGF0dGVybnMgPSBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgYmFnLnBhdHRlcm5zLmFkZChkZWYucGF0dGVybik7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoZGVmLnBhdHRlcm4pIChfYSA9IGluc3QuX3pvZCkuY2hlY2sgPz8gKF9hLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGRlZi5wYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIGlmIChkZWYucGF0dGVybi50ZXN0KHBheWxvYWQudmFsdWUpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBkZWYuZm9ybWF0LFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAuLi5kZWYucGF0dGVybiA/IHtcbiAgICAgICAgICAgICAgICBwYXR0ZXJuOiBkZWYucGF0dGVybi50b1N0cmluZygpXG4gICAgICAgICAgICB9IDoge30sXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgZWxzZSAoX2IgPSBpbnN0Ll96b2QpLmNoZWNrID8/IChfYi5jaGVjayA9ICgpPT57fSk7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tSZWdleCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tSZWdleFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVja1N0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGRlZi5wYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIGlmIChkZWYucGF0dGVybi50ZXN0KHBheWxvYWQudmFsdWUpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBcInJlZ2V4XCIsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIHBhdHRlcm46IGRlZi5wYXR0ZXJuLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja0xvd2VyQ2FzZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tMb3dlckNhc2VcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmxvd2VyY2FzZSk7XG4gICAgJFpvZENoZWNrU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja1VwcGVyQ2FzZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tVcHBlckNhc2VcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLnVwcGVyY2FzZSk7XG4gICAgJFpvZENoZWNrU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja0luY2x1ZGVzID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja0luY2x1ZGVzXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCBlc2NhcGVkUmVnZXggPSB1dGlsLmVzY2FwZVJlZ2V4KGRlZi5pbmNsdWRlcyk7XG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAodHlwZW9mIGRlZi5wb3NpdGlvbiA9PT0gXCJudW1iZXJcIiA/IGBeLnske2RlZi5wb3NpdGlvbn19JHtlc2NhcGVkUmVnZXh9YCA6IGVzY2FwZWRSZWdleCk7XG4gICAgZGVmLnBhdHRlcm4gPSBwYXR0ZXJuO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgICAgICBiYWcucGF0dGVybnMgPz8gKGJhZy5wYXR0ZXJucyA9IG5ldyBTZXQoKSk7XG4gICAgICAgIGJhZy5wYXR0ZXJucy5hZGQocGF0dGVybik7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmIChwYXlsb2FkLnZhbHVlLmluY2x1ZGVzKGRlZi5pbmNsdWRlcywgZGVmLnBvc2l0aW9uKSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogXCJpbmNsdWRlc1wiLFxuICAgICAgICAgICAgaW5jbHVkZXM6IGRlZi5pbmNsdWRlcyxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tTdGFydHNXaXRoID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja1N0YXJ0c1dpdGhcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeJHt1dGlsLmVzY2FwZVJlZ2V4KGRlZi5wcmVmaXgpfS4qYCk7XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcGF0dGVybik7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5wYXR0ZXJucyA/PyAoYmFnLnBhdHRlcm5zID0gbmV3IFNldCgpKTtcbiAgICAgICAgYmFnLnBhdHRlcm5zLmFkZChwYXR0ZXJuKTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKHBheWxvYWQudmFsdWUuc3RhcnRzV2l0aChkZWYucHJlZml4KSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogXCJzdGFydHNfd2l0aFwiLFxuICAgICAgICAgICAgcHJlZml4OiBkZWYucHJlZml4LFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja0VuZHNXaXRoID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja0VuZHNXaXRoXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChgLioke3V0aWwuZXNjYXBlUmVnZXgoZGVmLnN1ZmZpeCl9JGApO1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHBhdHRlcm4pO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgICAgICBiYWcucGF0dGVybnMgPz8gKGJhZy5wYXR0ZXJucyA9IG5ldyBTZXQoKSk7XG4gICAgICAgIGJhZy5wYXR0ZXJucy5hZGQocGF0dGVybik7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmIChwYXlsb2FkLnZhbHVlLmVuZHNXaXRoKGRlZi5zdWZmaXgpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBcImVuZHNfd2l0aFwiLFxuICAgICAgICAgICAgc3VmZml4OiBkZWYuc3VmZml4LFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLy8vICAgICRab2RDaGVja1Byb3BlcnR5ICAgIC8vLy8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZnVuY3Rpb24gaGFuZGxlQ2hlY2tQcm9wZXJ0eVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIHByb3BlcnR5KSB7XG4gICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMocHJvcGVydHksIHJlc3VsdC5pc3N1ZXMpKTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgJFpvZENoZWNrUHJvcGVydHkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrUHJvcGVydHlcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuc2NoZW1hLl96b2QucnVuKHtcbiAgICAgICAgICAgIHZhbHVlOiBwYXlsb2FkLnZhbHVlW2RlZi5wcm9wZXJ0eV0sXG4gICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzdWx0KT0+aGFuZGxlQ2hlY2tQcm9wZXJ0eVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGRlZi5wcm9wZXJ0eSkpO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZUNoZWNrUHJvcGVydHlSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBkZWYucHJvcGVydHkpO1xuICAgICAgICByZXR1cm47XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja01pbWVUeXBlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja01pbWVUeXBlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCBtaW1lU2V0ID0gbmV3IFNldChkZWYubWltZSk7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGluc3QuX3pvZC5iYWcubWltZSA9IGRlZi5taW1lO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAobWltZVNldC5oYXMocGF5bG9hZC52YWx1ZS50eXBlKSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF92YWx1ZVwiLFxuICAgICAgICAgICAgdmFsdWVzOiBkZWYubWltZSxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLnR5cGUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja092ZXJ3cml0ZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tPdmVyd3JpdGVcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBwYXlsb2FkLnZhbHVlID0gZGVmLnR4KHBheWxvYWQudmFsdWUpO1xuICAgIH07XG59KTtcbiIsICJleHBvcnQgY2xhc3MgRG9jIHtcbiAgICBjb25zdHJ1Y3RvcihhcmdzID0gW10pe1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBbXTtcbiAgICAgICAgdGhpcy5pbmRlbnQgPSAwO1xuICAgICAgICBpZiAodGhpcykgdGhpcy5hcmdzID0gYXJncztcbiAgICB9XG4gICAgaW5kZW50ZWQoZm4pIHtcbiAgICAgICAgdGhpcy5pbmRlbnQgKz0gMTtcbiAgICAgICAgZm4odGhpcyk7XG4gICAgICAgIHRoaXMuaW5kZW50IC09IDE7XG4gICAgfVxuICAgIHdyaXRlKGFyZykge1xuICAgICAgICBpZiAodHlwZW9mIGFyZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBhcmcodGhpcywge1xuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbjogXCJzeW5jXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXJnKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBleGVjdXRpb246IFwiYXN5bmNcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udGVudCA9IGFyZztcbiAgICAgICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpLmZpbHRlcigoeCk9PngpO1xuICAgICAgICBjb25zdCBtaW5JbmRlbnQgPSBNYXRoLm1pbiguLi5saW5lcy5tYXAoKHgpPT54Lmxlbmd0aCAtIHgudHJpbVN0YXJ0KCkubGVuZ3RoKSk7XG4gICAgICAgIGNvbnN0IGRlZGVudGVkID0gbGluZXMubWFwKCh4KT0+eC5zbGljZShtaW5JbmRlbnQpKS5tYXAoKHgpPT5cIiBcIi5yZXBlYXQodGhpcy5pbmRlbnQgKiAyKSArIHgpO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZGVkZW50ZWQpe1xuICAgICAgICAgICAgdGhpcy5jb250ZW50LnB1c2gobGluZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgY29uc3QgRiA9IEZ1bmN0aW9uO1xuICAgICAgICBjb25zdCBhcmdzID0gdGhpcz8uYXJncztcbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXM/LmNvbnRlbnQgPz8gW1xuICAgICAgICAgICAgYGBcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgbGluZXMgPSBbXG4gICAgICAgICAgICAuLi5jb250ZW50Lm1hcCgoeCk9PmAgICR7eH1gKVxuICAgICAgICBdO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhsaW5lcy5qb2luKFwiXFxuXCIpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBGKC4uLmFyZ3MsIGxpbmVzLmpvaW4oXCJcXG5cIikpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgdmVyc2lvbiA9IHtcbiAgICBtYWpvcjogNCxcbiAgICBtaW5vcjogMSxcbiAgICBwYXRjaDogMTFcbn07XG4iLCAiaW1wb3J0ICogYXMgY2hlY2tzIGZyb20gXCIuL2NoZWNrcy5qc1wiO1xuaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi9jb3JlLmpzXCI7XG5pbXBvcnQgeyBEb2MgfSBmcm9tIFwiLi9kb2MuanNcIjtcbmltcG9ydCB7IHBhcnNlLCBwYXJzZUFzeW5jLCBzYWZlUGFyc2UsIHNhZmVQYXJzZUFzeW5jIH0gZnJvbSBcIi4vcGFyc2UuanNcIjtcbmltcG9ydCAqIGFzIHJlZ2V4ZXMgZnJvbSBcIi4vcmVnZXhlcy5qc1wiO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tIFwiLi91dGlsLmpzXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vdmVyc2lvbnMuanNcIjtcbmV4cG9ydCBjb25zdCAkWm9kVHlwZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVHlwZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIHZhciBfYTtcbiAgICBpbnN0ID8/IChpbnN0ID0ge30pO1xuICAgIGluc3QuX3pvZC5kZWYgPSBkZWY7IC8vIHNldCBfZGVmIHByb3BlcnR5XG4gICAgaW5zdC5fem9kLmJhZyA9IGluc3QuX3pvZC5iYWcgfHwge307IC8vIGluaXRpYWxpemUgX2JhZyBvYmplY3RcbiAgICBpbnN0Ll96b2QudmVyc2lvbiA9IHZlcnNpb247XG4gICAgY29uc3QgY2hlY2tzID0gW1xuICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLmNoZWNrcyA/PyBbXVxuICAgIF07XG4gICAgLy8gaWYgaW5zdCBpcyBpdHNlbGYgYSBjaGVja3MuJFpvZENoZWNrLCBydW4gaXQgYXMgYSBjaGVja1xuICAgIGlmIChpbnN0Ll96b2QudHJhaXRzLmhhcyhcIiRab2RDaGVja1wiKSkge1xuICAgICAgICBjaGVja3MudW5zaGlmdChpbnN0KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjaCBvZiBjaGVja3Mpe1xuICAgICAgICBmb3IgKGNvbnN0IGZuIG9mIGNoLl96b2Qub25hdHRhY2gpe1xuICAgICAgICAgICAgZm4oaW5zdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoZWNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gZGVmZXJyZWQgaW5pdGlhbGl6ZXJcbiAgICAgICAgLy8gaW5zdC5fem9kLnBhcnNlIGlzIG5vdCB5ZXQgZGVmaW5lZFxuICAgICAgICAoX2EgPSBpbnN0Ll96b2QpLmRlZmVycmVkID8/IChfYS5kZWZlcnJlZCA9IFtdKTtcbiAgICAgICAgaW5zdC5fem9kLmRlZmVycmVkPy5wdXNoKCgpPT57XG4gICAgICAgICAgICBpbnN0Ll96b2QucnVuID0gaW5zdC5fem9kLnBhcnNlO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBydW5DaGVja3MgPSAocGF5bG9hZCwgY2hlY2tzLCBjdHgpPT57XG4gICAgICAgICAgICBsZXQgaXNBYm9ydGVkID0gdXRpbC5hYm9ydGVkKHBheWxvYWQpO1xuICAgICAgICAgICAgbGV0IGFzeW5jUmVzdWx0O1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaCBvZiBjaGVja3Mpe1xuICAgICAgICAgICAgICAgIGlmIChjaC5fem9kLmRlZi53aGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZFJ1biA9IGNoLl96b2QuZGVmLndoZW4ocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2hvdWxkUnVuKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzQWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY3VyckxlbiA9IHBheWxvYWQuaXNzdWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBfID0gY2guX3pvZC5jaGVjayhwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICBpZiAoXyBpbnN0YW5jZW9mIFByb21pc2UgJiYgY3R4Py5hc3luYyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuJFpvZEFzeW5jRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFzeW5jUmVzdWx0IHx8IF8gaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzdWx0ID0gKGFzeW5jUmVzdWx0ID8/IFByb21pc2UucmVzb2x2ZSgpKS50aGVuKGFzeW5jICgpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBfO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dExlbiA9IHBheWxvYWQuaXNzdWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0TGVuID09PSBjdXJyTGVuKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQWJvcnRlZCkgaXNBYm9ydGVkID0gdXRpbC5hYm9ydGVkKHBheWxvYWQsIGN1cnJMZW4pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0TGVuID0gcGF5bG9hZC5pc3N1ZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dExlbiA9PT0gY3VyckxlbikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNBYm9ydGVkKSBpc0Fib3J0ZWQgPSB1dGlsLmFib3J0ZWQocGF5bG9hZCwgY3Vyckxlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFzeW5jUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFzeW5jUmVzdWx0LnRoZW4oKCk9PntcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gY29uc3QgaGFuZGxlQ2hlY2tzUmVzdWx0ID0gKFxuICAgICAgICAvLyAgIGNoZWNrUmVzdWx0OiBQYXJzZVBheWxvYWQsXG4gICAgICAgIC8vICAgb3JpZ2luYWxSZXN1bHQ6IFBhcnNlUGF5bG9hZCxcbiAgICAgICAgLy8gICBjdHg6IFBhcnNlQ29udGV4dEludGVybmFsXG4gICAgICAgIC8vICk6IHV0aWwuTWF5YmVBc3luYzxQYXJzZVBheWxvYWQ+ID0+IHtcbiAgICAgICAgLy8gICAvLyBpZiB0aGUgY2hlY2tzIG11dGF0ZWQgdGhlIHZhbHVlICYmIHRoZXJlIGFyZSBubyBpc3N1ZXMsIHJlLXBhcnNlIHRoZSByZXN1bHRcbiAgICAgICAgLy8gICBpZiAoY2hlY2tSZXN1bHQudmFsdWUgIT09IG9yaWdpbmFsUmVzdWx0LnZhbHVlICYmICFjaGVja1Jlc3VsdC5pc3N1ZXMubGVuZ3RoKVxuICAgICAgICAvLyAgICAgcmV0dXJuIGluc3QuX3pvZC5wYXJzZShjaGVja1Jlc3VsdCwgY3R4KTtcbiAgICAgICAgLy8gICByZXR1cm4gb3JpZ2luYWxSZXN1bHQ7XG4gICAgICAgIC8vIH07XG4gICAgICAgIGNvbnN0IGhhbmRsZUNhbmFyeVJlc3VsdCA9IChjYW5hcnksIHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgICAgIC8vIGFib3J0IGlmIHRoZSBjYW5hcnkgaXMgYWJvcnRlZFxuICAgICAgICAgICAgaWYgKHV0aWwuYWJvcnRlZChjYW5hcnkpKSB7XG4gICAgICAgICAgICAgICAgY2FuYXJ5LmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYW5hcnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBydW4gY2hlY2tzIGZpcnN0LCB0aGVuXG4gICAgICAgICAgICBjb25zdCBjaGVja1Jlc3VsdCA9IHJ1bkNoZWNrcyhwYXlsb2FkLCBjaGVja3MsIGN0eCk7XG4gICAgICAgICAgICBpZiAoY2hlY2tSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN0eC5hc3luYyA9PT0gZmFsc2UpIHRocm93IG5ldyBjb3JlLiRab2RBc3luY0Vycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrUmVzdWx0LnRoZW4oKGNoZWNrUmVzdWx0KT0+aW5zdC5fem9kLnBhcnNlKGNoZWNrUmVzdWx0LCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpbnN0Ll96b2QucGFyc2UoY2hlY2tSZXN1bHQsIGN0eCk7XG4gICAgICAgIH07XG4gICAgICAgIGluc3QuX3pvZC5ydW4gPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICAgICAgaWYgKGN0eC5za2lwQ2hlY2tzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3QuX3pvZC5wYXJzZShwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgICAgIC8vIHJ1biBjYW5hcnlcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsIHBhc3MgKG5vIGNoZWNrcylcbiAgICAgICAgICAgICAgICBjb25zdCBjYW5hcnkgPSBpbnN0Ll96b2QucGFyc2Uoe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgICAgICAgICBza2lwQ2hlY2tzOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmFyeSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbmFyeS50aGVuKChjYW5hcnkpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlQ2FuYXJ5UmVzdWx0KGNhbmFyeSwgcGF5bG9hZCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVDYW5hcnlSZXN1bHQoY2FuYXJ5LCBwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZm9yd2FyZFxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gaW5zdC5fem9kLnBhcnNlKHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIGlmIChjdHguYXN5bmMgPT09IGZhbHNlKSB0aHJvdyBuZXcgY29yZS4kWm9kQXN5bmNFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzdWx0KT0+cnVuQ2hlY2tzKHJlc3VsdCwgY2hlY2tzLCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBydW5DaGVja3MocmVzdWx0LCBjaGVja3MsIGN0eCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGluc3RbXCJ+c3RhbmRhcmRcIl0gPSB7XG4gICAgICAgIHZhbGlkYXRlOiAodmFsdWUpPT57XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBzYWZlUGFyc2UoaW5zdCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiByLnN1Y2Nlc3MgPyB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLmRhdGFcbiAgICAgICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IHIuZXJyb3I/Lmlzc3Vlc1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNhZmVQYXJzZUFzeW5jKGluc3QsIHZhbHVlKS50aGVuKChyKT0+ci5zdWNjZXNzID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHIuZGF0YVxuICAgICAgICAgICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiByLmVycm9yPy5pc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZlbmRvcjogXCJ6b2RcIixcbiAgICAgICAgdmVyc2lvbjogMVxuICAgIH07XG59KTtcbmV4cG9ydCB7IGNsb25lIH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuZXhwb3J0IGNvbnN0ICRab2RTdHJpbmcgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFN0cmluZ1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IFtcbiAgICAgICAgLi4uaW5zdD8uX3pvZC5iYWc/LnBhdHRlcm5zID8/IFtdXG4gICAgXS5wb3AoKSA/PyByZWdleGVzLnN0cmluZyhpbnN0Ll96b2QuYmFnKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgXyk9PntcbiAgICAgICAgaWYgKGRlZi5jb2VyY2UpIHRyeSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gU3RyaW5nKHBheWxvYWQudmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQudmFsdWUgPT09IFwic3RyaW5nXCIpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RTdHJpbmdGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFN0cmluZ0Zvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIGNoZWNrIGluaXRpYWxpemF0aW9uIG11c3QgY29tZSBmaXJzdFxuICAgIGNoZWNrcy4kWm9kQ2hlY2tTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgICRab2RTdHJpbmcuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEdVSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEdVSURcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmd1aWQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFVVSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFVVSURcIiwgKGluc3QsIGRlZik9PntcbiAgICBpZiAoZGVmLnZlcnNpb24pIHtcbiAgICAgICAgY29uc3QgdmVyc2lvbk1hcCA9IHtcbiAgICAgICAgICAgIHYxOiAxLFxuICAgICAgICAgICAgdjI6IDIsXG4gICAgICAgICAgICB2MzogMyxcbiAgICAgICAgICAgIHY0OiA0LFxuICAgICAgICAgICAgdjU6IDUsXG4gICAgICAgICAgICB2NjogNixcbiAgICAgICAgICAgIHY3OiA3LFxuICAgICAgICAgICAgdjg6IDhcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdiA9IHZlcnNpb25NYXBbZGVmLnZlcnNpb25dO1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgVVVJRCB2ZXJzaW9uOiBcIiR7ZGVmLnZlcnNpb259XCJgKTtcbiAgICAgICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy51dWlkKHYpKTtcbiAgICB9IGVsc2UgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy51dWlkKCkpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEVtYWlsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RFbWFpbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuZW1haWwpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFVSTCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVVJMXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBUcmltIHdoaXRlc3BhY2UgZnJvbSBpbnB1dFxuICAgICAgICAgICAgY29uc3QgdHJpbW1lZCA9IHBheWxvYWQudmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh0cmltbWVkKTtcbiAgICAgICAgICAgIGlmIChkZWYuaG9zdG5hbWUpIHtcbiAgICAgICAgICAgICAgICBkZWYuaG9zdG5hbWUubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoIWRlZi5ob3N0bmFtZS50ZXN0KHVybC5ob3N0bmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFwidXJsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkludmFsaWQgaG9zdG5hbWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm46IHJlZ2V4ZXMuaG9zdG5hbWUuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlZi5wcm90b2NvbCkge1xuICAgICAgICAgICAgICAgIGRlZi5wcm90b2NvbC5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIGlmICghZGVmLnByb3RvY29sLnRlc3QodXJsLnByb3RvY29sLmVuZHNXaXRoKFwiOlwiKSA/IHVybC5wcm90b2NvbC5zbGljZSgwLCAtMSkgOiB1cmwucHJvdG9jb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBcInVybFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJJbnZhbGlkIHByb3RvY29sXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuOiBkZWYucHJvdG9jb2wuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2V0IHRoZSBvdXRwdXQgdmFsdWUgYmFzZWQgb24gbm9ybWFsaXplIGZsYWdcbiAgICAgICAgICAgIGlmIChkZWYubm9ybWFsaXplKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIG5vcm1hbGl6ZWQgVVJMXG4gICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHVybC5ocmVmO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgaW5wdXQgKHRyaW1tZWQpXG4gICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHRyaW1tZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IFwidXJsXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEVtb2ppID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RFbW9qaVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuZW1vamkoKSk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTmFub0lEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROYW5vSURcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLm5hbm9pZCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ1VJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ1VJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuY3VpZCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ1VJRDIgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENVSUQyXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5jdWlkMik7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kVUxJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVUxJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMudWxpZCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kWElEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RYSURcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLnhpZCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kS1NVSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEtTVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5rc3VpZCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kSVNPRGF0ZVRpbWUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZElTT0RhdGVUaW1lXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5kYXRldGltZShkZWYpKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RJU09EYXRlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJU09EYXRlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5kYXRlKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RJU09UaW1lID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJU09UaW1lXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy50aW1lKGRlZikpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZElTT0R1cmF0aW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJU09EdXJhdGlvblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuZHVyYXRpb24pO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZElQdjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZElQdjRcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmlwdjQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgICAgICBiYWcuZm9ybWF0ID0gYGlwdjRgO1xuICAgIH0pO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZElQdjYgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZElQdjZcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmlwdjYpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgICAgICBiYWcuZm9ybWF0ID0gYGlwdjZgO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3IFVSTChgaHR0cDovL1ske3BheWxvYWQudmFsdWV9XWApO1xuICAgICAgICAvLyByZXR1cm47XG4gICAgICAgIH0gY2F0Y2ggIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IFwiaXB2NlwiLFxuICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDSURSdjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENJRFJ2NFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuY2lkcnY0KTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDSURSdjYgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENJRFJ2NlwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuY2lkcnY2KTsgLy8gbm90IHVzZWQgZm9yIHZhbGlkYXRpb25cbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXlsb2FkLnZhbHVlLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDIpIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgICAgY29uc3QgW2FkZHJlc3MsIHByZWZpeF0gPSBwYXJ0cztcbiAgICAgICAgICAgIGlmICghcHJlZml4KSB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeE51bSA9IE51bWJlcihwcmVmaXgpO1xuICAgICAgICAgICAgaWYgKGAke3ByZWZpeE51bX1gICE9PSBwcmVmaXgpIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgICAgaWYgKHByZWZpeE51bSA8IDAgfHwgcHJlZml4TnVtID4gMTI4KSB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ldyBVUkwoYGh0dHA6Ly9bJHthZGRyZXNzfV1gKTtcbiAgICAgICAgfSBjYXRjaCAge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgICAgIGZvcm1hdDogXCJjaWRydjZcIixcbiAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59KTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIFpvZEJhc2U2NCAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRCYXNlNjQoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIlwiKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZGF0YS5sZW5ndGggJSA0ICE9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBhdG9iKGRhdGEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoICB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgJFpvZEJhc2U2NCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQmFzZTY0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5iYXNlNjQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBpbnN0Ll96b2QuYmFnLmNvbnRlbnRFbmNvZGluZyA9IFwiYmFzZTY0XCI7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmIChpc1ZhbGlkQmFzZTY0KHBheWxvYWQudmFsdWUpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBcImJhc2U2NFwiLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgWm9kQmFzZTY0ICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEJhc2U2NFVSTChkYXRhKSB7XG4gICAgaWYgKCFyZWdleGVzLmJhc2U2NHVybC50ZXN0KGRhdGEpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgYmFzZTY0ID0gZGF0YS5yZXBsYWNlKC9bLV9dL2csIChjKT0+YyA9PT0gXCItXCIgPyBcIitcIiA6IFwiL1wiKTtcbiAgICBjb25zdCBwYWRkZWQgPSBiYXNlNjQucGFkRW5kKE1hdGguY2VpbChiYXNlNjQubGVuZ3RoIC8gNCkgKiA0LCBcIj1cIik7XG4gICAgcmV0dXJuIGlzVmFsaWRCYXNlNjQocGFkZGVkKTtcbn1cbmV4cG9ydCBjb25zdCAkWm9kQmFzZTY0VVJMID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RCYXNlNjRVUkxcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmJhc2U2NHVybCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGluc3QuX3pvZC5iYWcuY29udGVudEVuY29kaW5nID0gXCJiYXNlNjR1cmxcIjtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKGlzVmFsaWRCYXNlNjRVUkwocGF5bG9hZC52YWx1ZSkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IFwiYmFzZTY0dXJsXCIsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEUxNjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEUxNjRcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmUxNjQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICBab2RKV1QgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkSldUKHRva2VuLCBhbGdvcml0aG0gPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdG9rZW5zUGFydHMgPSB0b2tlbi5zcGxpdChcIi5cIik7XG4gICAgICAgIGlmICh0b2tlbnNQYXJ0cy5sZW5ndGggIT09IDMpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgW2hlYWRlcl0gPSB0b2tlbnNQYXJ0cztcbiAgICAgICAgaWYgKCFoZWFkZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBwYXJzZWRIZWFkZXIgPSBKU09OLnBhcnNlKGF0b2IoaGVhZGVyKSk7XG4gICAgICAgIGlmIChcInR5cFwiIGluIHBhcnNlZEhlYWRlciAmJiBwYXJzZWRIZWFkZXI/LnR5cCAhPT0gXCJKV1RcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXBhcnNlZEhlYWRlci5hbGcpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGFsZ29yaXRobSAmJiAoIShcImFsZ1wiIGluIHBhcnNlZEhlYWRlcikgfHwgcGFyc2VkSGVhZGVyLmFsZyAhPT0gYWxnb3JpdGhtKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoICB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgJFpvZEpXVCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kSldUXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmIChpc1ZhbGlkSldUKHBheWxvYWQudmFsdWUsIGRlZi5hbGcpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBcImp3dFwiLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDdXN0b21TdHJpbmdGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEN1c3RvbVN0cmluZ0Zvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAoZGVmLmZuKHBheWxvYWQudmFsdWUpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBkZWYuZm9ybWF0LFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2ROdW1iZXIgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE51bWJlclwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IGluc3QuX3pvZC5iYWcucGF0dGVybiA/PyByZWdleGVzLm51bWJlcjtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKGRlZi5jb2VyY2UpIHRyeSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gTnVtYmVyKHBheWxvYWQudmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwibnVtYmVyXCIgJiYgIU51bWJlci5pc05hTihpbnB1dCkgJiYgTnVtYmVyLmlzRmluaXRlKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVjZWl2ZWQgPSB0eXBlb2YgaW5wdXQgPT09IFwibnVtYmVyXCIgPyBOdW1iZXIuaXNOYU4oaW5wdXQpID8gXCJOYU5cIiA6ICFOdW1iZXIuaXNGaW5pdGUoaW5wdXQpID8gXCJJbmZpbml0eVwiIDogdW5kZWZpbmVkIDogdW5kZWZpbmVkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIC4uLnJlY2VpdmVkID8ge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkXG4gICAgICAgICAgICB9IDoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTnVtYmVyRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROdW1iZXJcIiwgKGluc3QsIGRlZik9PntcbiAgICBjaGVja3MuJFpvZENoZWNrTnVtYmVyRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICAkWm9kTnVtYmVyLmluaXQoaW5zdCwgZGVmKTsgLy8gbm8gZm9ybWF0IGNoZWNrc3Bcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RCb29sZWFuID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RCb29sZWFuXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gcmVnZXhlcy5ib29sZWFuO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBpZiAoZGVmLmNvZXJjZSkgdHJ5IHtcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBCb29sZWFuKHBheWxvYWQudmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJib29sZWFuXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEJpZ0ludCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQmlnSW50XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gcmVnZXhlcy5iaWdpbnQ7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGlmIChkZWYuY29lcmNlKSB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IEJpZ0ludChwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLnZhbHVlID09PSBcImJpZ2ludFwiKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJiaWdpbnRcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQmlnSW50Rm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RCaWdJbnRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjaGVja3MuJFpvZENoZWNrQmlnSW50Rm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICAkWm9kQmlnSW50LmluaXQoaW5zdCwgZGVmKTsgLy8gbm8gZm9ybWF0IGNoZWNrc1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFN5bWJvbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kU3ltYm9sXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3ltYm9sXCIpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcInN5bWJvbFwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RVbmRlZmluZWQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFVuZGVmaW5lZFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IHJlZ2V4ZXMudW5kZWZpbmVkO1xuICAgIGluc3QuX3pvZC52YWx1ZXMgPSBuZXcgU2V0KFtcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgXSk7XG4gICAgaW5zdC5fem9kLm9wdGluID0gXCJvcHRpb25hbFwiO1xuICAgIGluc3QuX3pvZC5vcHRvdXQgPSBcIm9wdGlvbmFsXCI7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwidW5kZWZpbmVkXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE51bGwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE51bGxcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSByZWdleGVzLm51bGw7XG4gICAgaW5zdC5fem9kLnZhbHVlcyA9IG5ldyBTZXQoW1xuICAgICAgICBudWxsXG4gICAgXSk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKGlucHV0ID09PSBudWxsKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJudWxsXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEFueSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQW55XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkKT0+cGF5bG9hZDtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RVbmtub3duID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RVbmtub3duXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkKT0+cGF5bG9hZDtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2ROZXZlciA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTmV2ZXJcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwibmV2ZXJcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kVm9pZCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVm9pZFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJ2b2lkXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZERhdGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZERhdGVcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGlmIChkZWYuY29lcmNlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBuZXcgRGF0ZShwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKF9lcnIpIHt9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBpc0RhdGUgPSBpbnB1dCBpbnN0YW5jZW9mIERhdGU7XG4gICAgICAgIGNvbnN0IGlzVmFsaWREYXRlID0gaXNEYXRlICYmICFOdW1iZXIuaXNOYU4oaW5wdXQuZ2V0VGltZSgpKTtcbiAgICAgICAgaWYgKGlzVmFsaWREYXRlKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJkYXRlXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAuLi5pc0RhdGUgPyB7XG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IFwiSW52YWxpZCBEYXRlXCJcbiAgICAgICAgICAgIH0gOiB7fSxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZUFycmF5UmVzdWx0KHJlc3VsdCwgZmluYWwsIGluZGV4KSB7XG4gICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIGZpbmFsLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKGluZGV4LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgfVxuICAgIGZpbmFsLnZhbHVlW2luZGV4XSA9IHJlc3VsdC52YWx1ZTtcbn1cbmV4cG9ydCBjb25zdCAkWm9kQXJyYXkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEFycmF5XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwiYXJyYXlcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IEFycmF5KGlucHV0Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHByb21zID0gW107XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gaW5wdXRbaV07XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuZWxlbWVudC5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcHJvbXMucHVzaChyZXN1bHQudGhlbigocmVzdWx0KT0+aGFuZGxlQXJyYXlSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBpKSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVBcnJheVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9tcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9tcykudGhlbigoKT0+cGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7IC8vaGFuZGxlQXJyYXlSZXN1bHRzQXN5bmMocGFyc2VSZXN1bHRzLCBmaW5hbCk7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlUHJvcGVydHlSZXN1bHQocmVzdWx0LCBmaW5hbCwga2V5LCBpbnB1dCkge1xuICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3VlcyhrZXksIHJlc3VsdC5pc3N1ZXMpKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChrZXkgaW4gaW5wdXQpIHtcbiAgICAgICAgICAgIGZpbmFsLnZhbHVlW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmaW5hbC52YWx1ZVtrZXldID0gcmVzdWx0LnZhbHVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZURlZihkZWYpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGVmLnNoYXBlKTtcbiAgICBmb3IgKGNvbnN0IGsgb2Yga2V5cyl7XG4gICAgICAgIGlmICghZGVmLnNoYXBlPy5ba10/Ll96b2Q/LnRyYWl0cz8uaGFzKFwiJFpvZFR5cGVcIikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IGF0IGtleSBcIiR7a31cIjogZXhwZWN0ZWQgYSBab2Qgc2NoZW1hYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb2tleXMgPSB1dGlsLm9wdGlvbmFsS2V5cyhkZWYuc2hhcGUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRlZixcbiAgICAgICAga2V5cyxcbiAgICAgICAga2V5U2V0OiBuZXcgU2V0KGtleXMpLFxuICAgICAgICBudW1LZXlzOiBrZXlzLmxlbmd0aCxcbiAgICAgICAgb3B0aW9uYWxLZXlzOiBuZXcgU2V0KG9rZXlzKVxuICAgIH07XG59XG5mdW5jdGlvbiBoYW5kbGVDYXRjaGFsbChwcm9tcywgaW5wdXQsIHBheWxvYWQsIGN0eCwgZGVmLCBpbnN0KSB7XG4gICAgY29uc3QgdW5yZWNvZ25pemVkID0gW107XG4gICAgLy8gaXRlcmF0ZSBvdmVyIGlucHV0IGtleXNcbiAgICBjb25zdCBrZXlTZXQgPSBkZWYua2V5U2V0O1xuICAgIGNvbnN0IF9jYXRjaGFsbCA9IGRlZi5jYXRjaGFsbC5fem9kO1xuICAgIGNvbnN0IHQgPSBfY2F0Y2hhbGwuZGVmLnR5cGU7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoaW5wdXQpKXtcbiAgICAgICAgaWYgKGtleVNldC5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICAgIGlmICh0ID09PSBcIm5ldmVyXCIpIHtcbiAgICAgICAgICAgIHVucmVjb2duaXplZC5wdXNoKGtleSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByID0gX2NhdGNoYWxsLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZTogaW5wdXRba2V5XSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICBwcm9tcy5wdXNoKHIudGhlbigocik9PmhhbmRsZVByb3BlcnR5UmVzdWx0KHIsIHBheWxvYWQsIGtleSwgaW5wdXQpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVQcm9wZXJ0eVJlc3VsdChyLCBwYXlsb2FkLCBrZXksIGlucHV0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodW5yZWNvZ25pemVkLmxlbmd0aCkge1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwidW5yZWNvZ25pemVkX2tleXNcIixcbiAgICAgICAgICAgIGtleXM6IHVucmVjb2duaXplZCxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFwcm9tcy5sZW5ndGgpIHJldHVybiBwYXlsb2FkO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9tcykudGhlbigoKT0+e1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCAkWm9kT2JqZWN0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RPYmplY3RcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyByZXF1aXJlcyBjYXN0IGJlY2F1c2UgdGVjaG5pY2FsbHkgJFpvZE9iamVjdCBkb2Vzbid0IGV4dGVuZFxuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICAvLyBjb25zdCBzaCA9IGRlZi5zaGFwZTtcbiAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWYsIFwic2hhcGVcIik7XG4gICAgaWYgKCFkZXNjPy5nZXQpIHtcbiAgICAgICAgY29uc3Qgc2ggPSBkZWYuc2hhcGU7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWYsIFwic2hhcGVcIiwge1xuICAgICAgICAgICAgZ2V0OiAoKT0+e1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1NoID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5zaFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlZiwgXCJzaGFwZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXdTaFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXdTaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IF9ub3JtYWxpemVkID0gdXRpbC5jYWNoZWQoKCk9Pm5vcm1hbGl6ZURlZihkZWYpKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9PntcbiAgICAgICAgY29uc3Qgc2hhcGUgPSBkZWYuc2hhcGU7XG4gICAgICAgIGNvbnN0IHByb3BWYWx1ZXMgPSB7fTtcbiAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBzaGFwZSl7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHNoYXBlW2tleV0uX3pvZDtcbiAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBwcm9wVmFsdWVzW2tleV0gPz8gKHByb3BWYWx1ZXNba2V5XSA9IG5ldyBTZXQoKSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIGZpZWxkLnZhbHVlcylwcm9wVmFsdWVzW2tleV0uYWRkKHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wVmFsdWVzO1xuICAgIH0pO1xuICAgIGNvbnN0IGlzT2JqZWN0ID0gdXRpbC5pc09iamVjdDtcbiAgICBjb25zdCBjYXRjaGFsbCA9IGRlZi5jYXRjaGFsbDtcbiAgICBsZXQgdmFsdWU7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgdmFsdWUgPz8gKHZhbHVlID0gX25vcm1hbGl6ZWQudmFsdWUpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICghaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHt9O1xuICAgICAgICBjb25zdCBwcm9tcyA9IFtdO1xuICAgICAgICBjb25zdCBzaGFwZSA9IHZhbHVlLnNoYXBlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB2YWx1ZS5rZXlzKXtcbiAgICAgICAgICAgIGNvbnN0IGVsID0gc2hhcGVba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBlbC5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGlucHV0W2tleV0sXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHByb21zLnB1c2goci50aGVuKChyKT0+aGFuZGxlUHJvcGVydHlSZXN1bHQociwgcGF5bG9hZCwga2V5LCBpbnB1dCkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlUHJvcGVydHlSZXN1bHQociwgcGF5bG9hZCwga2V5LCBpbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjYXRjaGFsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21zLmxlbmd0aCA/IFByb21pc2UuYWxsKHByb21zKS50aGVuKCgpPT5wYXlsb2FkKSA6IHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZUNhdGNoYWxsKHByb21zLCBpbnB1dCwgcGF5bG9hZCwgY3R4LCBfbm9ybWFsaXplZC52YWx1ZSwgaW5zdCk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RPYmplY3RKSVQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE9iamVjdEpJVFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIHJlcXVpcmVzIGNhc3QgYmVjYXVzZSB0ZWNobmljYWxseSAkWm9kT2JqZWN0IGRvZXNuJ3QgZXh0ZW5kXG4gICAgJFpvZE9iamVjdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3Qgc3VwZXJQYXJzZSA9IGluc3QuX3pvZC5wYXJzZTtcbiAgICBjb25zdCBfbm9ybWFsaXplZCA9IHV0aWwuY2FjaGVkKCgpPT5ub3JtYWxpemVEZWYoZGVmKSk7XG4gICAgY29uc3QgZ2VuZXJhdGVGYXN0cGFzcyA9IChzaGFwZSk9PntcbiAgICAgICAgY29uc3QgZG9jID0gbmV3IERvYyhbXG4gICAgICAgICAgICBcInNoYXBlXCIsXG4gICAgICAgICAgICBcInBheWxvYWRcIixcbiAgICAgICAgICAgIFwiY3R4XCJcbiAgICAgICAgXSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBfbm9ybWFsaXplZC52YWx1ZTtcbiAgICAgICAgY29uc3QgcGFyc2VTdHIgPSAoa2V5KT0+e1xuICAgICAgICAgICAgY29uc3QgayA9IHV0aWwuZXNjKGtleSk7XG4gICAgICAgICAgICByZXR1cm4gYHNoYXBlWyR7a31dLl96b2QucnVuKHsgdmFsdWU6IGlucHV0WyR7a31dLCBpc3N1ZXM6IFtdIH0sIGN0eClgO1xuICAgICAgICB9O1xuICAgICAgICBkb2Mud3JpdGUoYGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtgKTtcbiAgICAgICAgY29uc3QgaWRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBub3JtYWxpemVkLmtleXMpe1xuICAgICAgICAgICAgaWRzW2tleV0gPSBga2V5XyR7Y291bnRlcisrfWA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQTogcHJlc2VydmUga2V5IG9yZGVyIHtcbiAgICAgICAgZG9jLndyaXRlKGBjb25zdCBuZXdSZXN1bHQgPSB7fTtgKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Ygbm9ybWFsaXplZC5rZXlzKXtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gaWRzW2tleV07XG4gICAgICAgICAgICBjb25zdCBrID0gdXRpbC5lc2Moa2V5KTtcbiAgICAgICAgICAgIGRvYy53cml0ZShgY29uc3QgJHtpZH0gPSAke3BhcnNlU3RyKGtleSl9O2ApO1xuICAgICAgICAgICAgZG9jLndyaXRlKGBcbiAgICAgICAgaWYgKCR7aWR9Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICBwYXlsb2FkLmlzc3VlcyA9IHBheWxvYWQuaXNzdWVzLmNvbmNhdCgke2lkfS5pc3N1ZXMubWFwKGlzcyA9PiAoe1xuICAgICAgICAgICAgLi4uaXNzLFxuICAgICAgICAgICAgcGF0aDogaXNzLnBhdGggPyBbJHtrfSwgLi4uaXNzLnBhdGhdIDogWyR7a31dXG4gICAgICAgICAgfSkpKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIGlmICgke2lkfS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKCR7a30gaW4gaW5wdXQpIHtcbiAgICAgICAgICAgIG5ld1Jlc3VsdFske2t9XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3UmVzdWx0WyR7a31dID0gJHtpZH0udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICBgKTtcbiAgICAgICAgfVxuICAgICAgICBkb2Mud3JpdGUoYHBheWxvYWQudmFsdWUgPSBuZXdSZXN1bHQ7YCk7XG4gICAgICAgIGRvYy53cml0ZShgcmV0dXJuIHBheWxvYWQ7YCk7XG4gICAgICAgIGNvbnN0IGZuID0gZG9jLmNvbXBpbGUoKTtcbiAgICAgICAgcmV0dXJuIChwYXlsb2FkLCBjdHgpPT5mbihzaGFwZSwgcGF5bG9hZCwgY3R4KTtcbiAgICB9O1xuICAgIGxldCBmYXN0cGFzcztcbiAgICBjb25zdCBpc09iamVjdCA9IHV0aWwuaXNPYmplY3Q7XG4gICAgY29uc3Qgaml0ID0gIWNvcmUuZ2xvYmFsQ29uZmlnLmppdGxlc3M7XG4gICAgY29uc3QgYWxsb3dzRXZhbCA9IHV0aWwuYWxsb3dzRXZhbDtcbiAgICBjb25zdCBmYXN0RW5hYmxlZCA9IGppdCAmJiBhbGxvd3NFdmFsLnZhbHVlOyAvLyAmJiAhZGVmLmNhdGNoYWxsO1xuICAgIGNvbnN0IGNhdGNoYWxsID0gZGVmLmNhdGNoYWxsO1xuICAgIGxldCB2YWx1ZTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICB2YWx1ZSA/PyAodmFsdWUgPSBfbm9ybWFsaXplZC52YWx1ZSk7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKCFpc09iamVjdChpbnB1dCkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaml0ICYmIGZhc3RFbmFibGVkICYmIGN0eD8uYXN5bmMgPT09IGZhbHNlICYmIGN0eC5qaXRsZXNzICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAvLyBhbHdheXMgc3luY2hyb25vdXNcbiAgICAgICAgICAgIGlmICghZmFzdHBhc3MpIGZhc3RwYXNzID0gZ2VuZXJhdGVGYXN0cGFzcyhkZWYuc2hhcGUpO1xuICAgICAgICAgICAgcGF5bG9hZCA9IGZhc3RwYXNzKHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICBpZiAoIWNhdGNoYWxsKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVDYXRjaGFsbChbXSwgaW5wdXQsIHBheWxvYWQsIGN0eCwgdmFsdWUsIGluc3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlclBhcnNlKHBheWxvYWQsIGN0eCk7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlVW5pb25SZXN1bHRzKHJlc3VsdHMsIGZpbmFsLCBpbnN0LCBjdHgpIHtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKXtcbiAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBmaW5hbC52YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBmaW5hbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBub25hYm9ydGVkID0gcmVzdWx0cy5maWx0ZXIoKHIpPT4hdXRpbC5hYm9ydGVkKHIpKTtcbiAgICBpZiAobm9uYWJvcnRlZC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZmluYWwudmFsdWUgPSBub25hYm9ydGVkWzBdLnZhbHVlO1xuICAgICAgICByZXR1cm4gbm9uYWJvcnRlZFswXTtcbiAgICB9XG4gICAgZmluYWwuaXNzdWVzLnB1c2goe1xuICAgICAgICBjb2RlOiBcImludmFsaWRfdW5pb25cIixcbiAgICAgICAgaW5wdXQ6IGZpbmFsLnZhbHVlLFxuICAgICAgICBpbnN0LFxuICAgICAgICBlcnJvcnM6IHJlc3VsdHMubWFwKChyZXN1bHQpPT5yZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSkpXG4gICAgfSk7XG4gICAgcmV0dXJuIGZpbmFsO1xufVxuZXhwb3J0IGNvbnN0ICRab2RVbmlvbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVW5pb25cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRpblwiLCAoKT0+ZGVmLm9wdGlvbnMuc29tZSgobyk9Pm8uX3pvZC5vcHRpbiA9PT0gXCJvcHRpb25hbFwiKSA/IFwib3B0aW9uYWxcIiA6IHVuZGVmaW5lZCk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRvdXRcIiwgKCk9PmRlZi5vcHRpb25zLnNvbWUoKG8pPT5vLl96b2Qub3B0b3V0ID09PSBcIm9wdGlvbmFsXCIpID8gXCJvcHRpb25hbFwiIDogdW5kZWZpbmVkKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+e1xuICAgICAgICBpZiAoZGVmLm9wdGlvbnMuZXZlcnkoKG8pPT5vLl96b2QudmFsdWVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXQoZGVmLm9wdGlvbnMuZmxhdE1hcCgob3B0aW9uKT0+QXJyYXkuZnJvbShvcHRpb24uX3pvZC52YWx1ZXMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInBhdHRlcm5cIiwgKCk9PntcbiAgICAgICAgaWYgKGRlZi5vcHRpb25zLmV2ZXJ5KChvKT0+by5fem9kLnBhdHRlcm4pKSB7XG4gICAgICAgICAgICBjb25zdCBwYXR0ZXJucyA9IGRlZi5vcHRpb25zLm1hcCgobyk9Pm8uX3pvZC5wYXR0ZXJuKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeKCR7cGF0dGVybnMubWFwKChwKT0+dXRpbC5jbGVhblJlZ2V4KHAuc291cmNlKSkuam9pbihcInxcIil9KSRgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGNvbnN0IHNpbmdsZSA9IGRlZi5vcHRpb25zLmxlbmd0aCA9PT0gMTtcbiAgICBjb25zdCBmaXJzdCA9IGRlZi5vcHRpb25zWzBdLl96b2QucnVuO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGlmIChzaW5nbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdChwYXlsb2FkLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhc3luYyA9IGZhbHNlO1xuICAgICAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGRlZi5vcHRpb25zKXtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvbi5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgYXN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGggPT09IDApIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhc3luYykgcmV0dXJuIGhhbmRsZVVuaW9uUmVzdWx0cyhyZXN1bHRzLCBwYXlsb2FkLCBpbnN0LCBjdHgpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVzdWx0cykudGhlbigocmVzdWx0cyk9PntcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVVbmlvblJlc3VsdHMocmVzdWx0cywgcGF5bG9hZCwgaW5zdCwgY3R4KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2REaXNjcmltaW5hdGVkVW5pb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZERpc2NyaW1pbmF0ZWRVbmlvblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RVbmlvbi5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgX3N1cGVyID0gaW5zdC5fem9kLnBhcnNlO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwicHJvcFZhbHVlc1wiLCAoKT0+e1xuICAgICAgICBjb25zdCBwcm9wVmFsdWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGRlZi5vcHRpb25zKXtcbiAgICAgICAgICAgIGNvbnN0IHB2ID0gb3B0aW9uLl96b2QucHJvcFZhbHVlcztcbiAgICAgICAgICAgIGlmICghcHYgfHwgT2JqZWN0LmtleXMocHYpLmxlbmd0aCA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRpc2NyaW1pbmF0ZWQgdW5pb24gb3B0aW9uIGF0IGluZGV4IFwiJHtkZWYub3B0aW9ucy5pbmRleE9mKG9wdGlvbil9XCJgKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHB2KSl7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9wVmFsdWVzW2tdKSBwcm9wVmFsdWVzW2tdID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHYpe1xuICAgICAgICAgICAgICAgICAgICBwcm9wVmFsdWVzW2tdLmFkZCh2YWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcFZhbHVlcztcbiAgICB9KTtcbiAgICBjb25zdCBkaXNjID0gdXRpbC5jYWNoZWQoKCk9PntcbiAgICAgICAgY29uc3Qgb3B0cyA9IGRlZi5vcHRpb25zO1xuICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgbyBvZiBvcHRzKXtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG8uX3pvZC5wcm9wVmFsdWVzPy5bZGVmLmRpc2NyaW1pbmF0b3JdO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZXMgfHwgdmFsdWVzLnNpemUgPT09IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkaXNjcmltaW5hdGVkIHVuaW9uIG9wdGlvbiBhdCBpbmRleCBcIiR7ZGVmLm9wdGlvbnMuaW5kZXhPZihvKX1cImApO1xuICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIHZhbHVlcyl7XG4gICAgICAgICAgICAgICAgaWYgKG1hcC5oYXModikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgZGlzY3JpbWluYXRvciB2YWx1ZSBcIiR7U3RyaW5nKHYpfVwiYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcC5zZXQodiwgbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICghdXRpbC5pc09iamVjdChpbnB1dCkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHQgPSBkaXNjLnZhbHVlLmdldChpbnB1dD8uW2RlZi5kaXNjcmltaW5hdG9yXSk7XG4gICAgICAgIGlmIChvcHQpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHQuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLnVuaW9uRmFsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBfc3VwZXIocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBubyBtYXRjaGluZyBkaXNjcmltaW5hdG9yXG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3VuaW9uXCIsXG4gICAgICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICAgICAgbm90ZTogXCJObyBtYXRjaGluZyBkaXNjcmltaW5hdG9yXCIsXG4gICAgICAgICAgICBkaXNjcmltaW5hdG9yOiBkZWYuZGlzY3JpbWluYXRvcixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgcGF0aDogW1xuICAgICAgICAgICAgICAgIGRlZi5kaXNjcmltaW5hdG9yXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RJbnRlcnNlY3Rpb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEludGVyc2VjdGlvblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBkZWYubGVmdC5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZTogaW5wdXQsXG4gICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgIH0sIGN0eCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gZGVmLnJpZ2h0Ll96b2QucnVuKHtcbiAgICAgICAgICAgIHZhbHVlOiBpbnB1dCxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgY29uc3QgYXN5bmMgPSBsZWZ0IGluc3RhbmNlb2YgUHJvbWlzZSB8fCByaWdodCBpbnN0YW5jZW9mIFByb21pc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICBsZWZ0LFxuICAgICAgICAgICAgICAgIHJpZ2h0XG4gICAgICAgICAgICBdKS50aGVuKChbbGVmdCwgcmlnaHRdKT0+e1xuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVJbnRlcnNlY3Rpb25SZXN1bHRzKHBheWxvYWQsIGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVJbnRlcnNlY3Rpb25SZXN1bHRzKHBheWxvYWQsIGxlZnQsIHJpZ2h0KTtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBtZXJnZVZhbHVlcyhhLCBiKSB7XG4gICAgLy8gY29uc3QgYVR5cGUgPSBwYXJzZS50KGEpO1xuICAgIC8vIGNvbnN0IGJUeXBlID0gcGFyc2UudChiKTtcbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBkYXRhOiBhXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChhIGluc3RhbmNlb2YgRGF0ZSAmJiBiIGluc3RhbmNlb2YgRGF0ZSAmJiArYSA9PT0gK2IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogYVxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAodXRpbC5pc1BsYWluT2JqZWN0KGEpICYmIHV0aWwuaXNQbGFpbk9iamVjdChiKSkge1xuICAgICAgICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICAgICAgICBjb25zdCBzaGFyZWRLZXlzID0gT2JqZWN0LmtleXMoYSkuZmlsdGVyKChrZXkpPT5iS2V5cy5pbmRleE9mKGtleSkgIT09IC0xKTtcbiAgICAgICAgY29uc3QgbmV3T2JqID0ge1xuICAgICAgICAgICAgLi4uYSxcbiAgICAgICAgICAgIC4uLmJcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Ygc2hhcmVkS2V5cyl7XG4gICAgICAgICAgICBjb25zdCBzaGFyZWRWYWx1ZSA9IG1lcmdlVmFsdWVzKGFba2V5XSwgYltrZXldKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkVmFsdWUudmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1lcmdlRXJyb3JQYXRoOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5zaGFyZWRWYWx1ZS5tZXJnZUVycm9yUGF0aFxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld09ialtrZXldID0gc2hhcmVkVmFsdWUuZGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBkYXRhOiBuZXdPYmpcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgICAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBtZXJnZUVycm9yUGF0aDogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3QXJyYXkgPSBbXTtcbiAgICAgICAgZm9yKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYS5sZW5ndGg7IGluZGV4Kyspe1xuICAgICAgICAgICAgY29uc3QgaXRlbUEgPSBhW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1CID0gYltpbmRleF07XG4gICAgICAgICAgICBjb25zdCBzaGFyZWRWYWx1ZSA9IG1lcmdlVmFsdWVzKGl0ZW1BLCBpdGVtQik7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZFZhbHVlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXJnZUVycm9yUGF0aDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5zaGFyZWRWYWx1ZS5tZXJnZUVycm9yUGF0aFxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0FycmF5LnB1c2goc2hhcmVkVmFsdWUuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogbmV3QXJyYXlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICBtZXJnZUVycm9yUGF0aDogW11cbiAgICB9O1xufVxuZnVuY3Rpb24gaGFuZGxlSW50ZXJzZWN0aW9uUmVzdWx0cyhyZXN1bHQsIGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKGxlZnQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICByZXN1bHQuaXNzdWVzLnB1c2goLi4ubGVmdC5pc3N1ZXMpO1xuICAgIH1cbiAgICBpZiAocmlnaHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICByZXN1bHQuaXNzdWVzLnB1c2goLi4ucmlnaHQuaXNzdWVzKTtcbiAgICB9XG4gICAgaWYgKHV0aWwuYWJvcnRlZChyZXN1bHQpKSByZXR1cm4gcmVzdWx0O1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlVmFsdWVzKGxlZnQudmFsdWUsIHJpZ2h0LnZhbHVlKTtcbiAgICBpZiAoIW1lcmdlZC52YWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVubWVyZ2FibGUgaW50ZXJzZWN0aW9uLiBFcnJvciBwYXRoOiBgICsgYCR7SlNPTi5zdHJpbmdpZnkobWVyZ2VkLm1lcmdlRXJyb3JQYXRoKX1gKTtcbiAgICB9XG4gICAgcmVzdWx0LnZhbHVlID0gbWVyZ2VkLmRhdGE7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCAkWm9kVHVwbGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFR1cGxlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IGl0ZW1zID0gZGVmLml0ZW1zO1xuICAgIGNvbnN0IG9wdFN0YXJ0ID0gaXRlbXMubGVuZ3RoIC0gW1xuICAgICAgICAuLi5pdGVtc1xuICAgIF0ucmV2ZXJzZSgpLmZpbmRJbmRleCgoaXRlbSk9Pml0ZW0uX3pvZC5vcHRpbiAhPT0gXCJvcHRpb25hbFwiKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwidHVwbGVcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSBbXTtcbiAgICAgICAgY29uc3QgcHJvbXMgPSBbXTtcbiAgICAgICAgaWYgKCFkZWYucmVzdCkge1xuICAgICAgICAgICAgY29uc3QgdG9vQmlnID0gaW5wdXQubGVuZ3RoID4gaXRlbXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBpbnB1dC5sZW5ndGggPCBvcHRTdGFydCAtIDE7XG4gICAgICAgICAgICBpZiAodG9vQmlnIHx8IHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRvb0JpZyA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogaXRlbXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogaXRlbXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW46IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBpID0gLTE7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcyl7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBpZiAoaSA+PSBpbnB1dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA+PSBvcHRTdGFydCkgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBpdGVtLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaW5wdXRbaV0sXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcHJvbXMucHVzaChyZXN1bHQudGhlbigocmVzdWx0KT0+aGFuZGxlVHVwbGVSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBpKSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVUdXBsZVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYucmVzdCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdCA9IGlucHV0LnNsaWNlKGl0ZW1zLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIHJlc3Qpe1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYucmVzdC5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlbCxcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbXMucHVzaChyZXN1bHQudGhlbigocmVzdWx0KT0+aGFuZGxlVHVwbGVSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBpKSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVR1cGxlUmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9tcy5sZW5ndGgpIHJldHVybiBQcm9taXNlLmFsbChwcm9tcykudGhlbigoKT0+cGF5bG9hZCk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVR1cGxlUmVzdWx0KHJlc3VsdCwgZmluYWwsIGluZGV4KSB7XG4gICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIGZpbmFsLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKGluZGV4LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgfVxuICAgIGZpbmFsLnZhbHVlW2luZGV4XSA9IHJlc3VsdC52YWx1ZTtcbn1cbmV4cG9ydCBjb25zdCAkWm9kUmVjb3JkID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RSZWNvcmRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIXV0aWwuaXNQbGFpbk9iamVjdChpbnB1dCkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcInJlY29yZFwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9tcyA9IFtdO1xuICAgICAgICBpZiAoZGVmLmtleVR5cGUuX3pvZC52YWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IGRlZi5rZXlUeXBlLl96b2QudmFsdWVzO1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdmFsdWVzKXtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2Yga2V5ID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnZhbHVlVHlwZS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaW5wdXRba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21zLnB1c2gocmVzdWx0LnRoZW4oKHJlc3VsdCk9PntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3VlcyhrZXksIHJlc3VsdC5pc3N1ZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZVtrZXldID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3VlcyhrZXksIHJlc3VsdC5pc3N1ZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWVba2V5XSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB1bnJlY29nbml6ZWQ7XG4gICAgICAgICAgICBmb3IoY29uc3Qga2V5IGluIGlucHV0KXtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB1bnJlY29nbml6ZWQgPSB1bnJlY29nbml6ZWQgPz8gW107XG4gICAgICAgICAgICAgICAgICAgIHVucmVjb2duaXplZC5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVucmVjb2duaXplZCAmJiB1bnJlY29nbml6ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBcInVucmVjb2duaXplZF9rZXlzXCIsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgICAgICBrZXlzOiB1bnJlY29nbml6ZWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhpbnB1dCkpe1xuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiX19wcm90b19fXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleVJlc3VsdCA9IGRlZi5rZXlUeXBlLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICAgICAgaWYgKGtleVJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXN5bmMgc2NoZW1hcyBub3Qgc3VwcG9ydGVkIGluIG9iamVjdCBrZXlzIGN1cnJlbnRseVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGtleVJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2tleVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBcInJlY29yZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBrZXlSZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDoga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWVba2V5UmVzdWx0LnZhbHVlXSA9IGtleVJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi52YWx1ZVR5cGUuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaW5wdXRba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbXMucHVzaChyZXN1bHQudGhlbigocmVzdWx0KT0+e1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3VlcyhrZXksIHJlc3VsdC5pc3N1ZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWVba2V5UmVzdWx0LnZhbHVlXSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3VlcyhrZXksIHJlc3VsdC5pc3N1ZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlW2tleVJlc3VsdC52YWx1ZV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9tcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9tcykudGhlbigoKT0+cGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RNYXAgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE1hcFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICghKGlucHV0IGluc3RhbmNlb2YgTWFwKSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwibWFwXCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21zID0gW107XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGlucHV0KXtcbiAgICAgICAgICAgIGNvbnN0IGtleVJlc3VsdCA9IGRlZi5rZXlUeXBlLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZToga2V5LFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZVJlc3VsdCA9IGRlZi52YWx1ZVR5cGUuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgaWYgKGtleVJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UgfHwgdmFsdWVSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcHJvbXMucHVzaChQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgIGtleVJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVSZXN1bHRcbiAgICAgICAgICAgICAgICBdKS50aGVuKChba2V5UmVzdWx0LCB2YWx1ZVJlc3VsdF0pPT57XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZU1hcFJlc3VsdChrZXlSZXN1bHQsIHZhbHVlUmVzdWx0LCBwYXlsb2FkLCBrZXksIGlucHV0LCBpbnN0LCBjdHgpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlTWFwUmVzdWx0KGtleVJlc3VsdCwgdmFsdWVSZXN1bHQsIHBheWxvYWQsIGtleSwgaW5wdXQsIGluc3QsIGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb21zLmxlbmd0aCkgcmV0dXJuIFByb21pc2UuYWxsKHByb21zKS50aGVuKCgpPT5wYXlsb2FkKTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlTWFwUmVzdWx0KGtleVJlc3VsdCwgdmFsdWVSZXN1bHQsIGZpbmFsLCBrZXksIGlucHV0LCBpbnN0LCBjdHgpIHtcbiAgICBpZiAoa2V5UmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHV0aWwucHJvcGVydHlLZXlUeXBlcy5oYXModHlwZW9mIGtleSkpIHtcbiAgICAgICAgICAgIGZpbmFsLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKGtleSwga2V5UmVzdWx0Lmlzc3VlcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9rZXlcIixcbiAgICAgICAgICAgICAgICBvcmlnaW46IFwibWFwXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IGtleVJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZhbHVlUmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHV0aWwucHJvcGVydHlLZXlUeXBlcy5oYXModHlwZW9mIGtleSkpIHtcbiAgICAgICAgICAgIGZpbmFsLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKGtleSwgdmFsdWVSZXN1bHQuaXNzdWVzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgb3JpZ2luOiBcIm1hcFwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9lbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IHZhbHVlUmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5hbC52YWx1ZS5zZXQoa2V5UmVzdWx0LnZhbHVlLCB2YWx1ZVJlc3VsdC52YWx1ZSk7XG59XG5leHBvcnQgY29uc3QgJFpvZFNldCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kU2V0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBTZXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcInNldFwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbXMgPSBbXTtcbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IG5ldyBTZXQoKTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGlucHV0KXtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi52YWx1ZVR5cGUuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHByb21zLnB1c2gocmVzdWx0LnRoZW4oKHJlc3VsdCk9PmhhbmRsZVNldFJlc3VsdChyZXN1bHQsIHBheWxvYWQpKSk7XG4gICAgICAgICAgICB9IGVsc2UgaGFuZGxlU2V0UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb21zLmxlbmd0aCkgcmV0dXJuIFByb21pc2UuYWxsKHByb21zKS50aGVuKCgpPT5wYXlsb2FkKTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlU2V0UmVzdWx0KHJlc3VsdCwgZmluYWwpIHtcbiAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goLi4ucmVzdWx0Lmlzc3Vlcyk7XG4gICAgfVxuICAgIGZpbmFsLnZhbHVlLmFkZChyZXN1bHQudmFsdWUpO1xufVxuZXhwb3J0IGNvbnN0ICRab2RFbnVtID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RFbnVtXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHV0aWwuZ2V0RW51bVZhbHVlcyhkZWYuZW50cmllcyk7XG4gICAgY29uc3QgdmFsdWVzU2V0ID0gbmV3IFNldCh2YWx1ZXMpO1xuICAgIGluc3QuX3pvZC52YWx1ZXMgPSB2YWx1ZXNTZXQ7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeKCR7dmFsdWVzLmZpbHRlcigoayk9PnV0aWwucHJvcGVydHlLZXlUeXBlcy5oYXModHlwZW9mIGspKS5tYXAoKG8pPT50eXBlb2YgbyA9PT0gXCJzdHJpbmdcIiA/IHV0aWwuZXNjYXBlUmVnZXgobykgOiBvLnRvU3RyaW5nKCkpLmpvaW4oXCJ8XCIpfSkkYCk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlc1NldC5oYXMoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF92YWx1ZVwiLFxuICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZExpdGVyYWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZExpdGVyYWxcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaWYgKGRlZi52YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjcmVhdGUgbGl0ZXJhbCBzY2hlbWEgd2l0aCBubyB2YWxpZCB2YWx1ZXNcIik7XG4gICAgfVxuICAgIGluc3QuX3pvZC52YWx1ZXMgPSBuZXcgU2V0KGRlZi52YWx1ZXMpO1xuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gbmV3IFJlZ0V4cChgXigke2RlZi52YWx1ZXMubWFwKChvKT0+dHlwZW9mIG8gPT09IFwic3RyaW5nXCIgPyB1dGlsLmVzY2FwZVJlZ2V4KG8pIDogbyA/IHV0aWwuZXNjYXBlUmVnZXgoby50b1N0cmluZygpKSA6IFN0cmluZyhvKSkuam9pbihcInxcIil9KSRgKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoaW5zdC5fem9kLnZhbHVlcy5oYXMoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF92YWx1ZVwiLFxuICAgICAgICAgICAgdmFsdWVzOiBkZWYudmFsdWVzLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEZpbGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEZpbGVcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJmaWxlXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFRyYW5zZm9ybSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVHJhbnNmb3JtXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGlmIChjdHguZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RFbmNvZGVFcnJvcihpbnN0LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IF9vdXQgPSBkZWYudHJhbnNmb3JtKHBheWxvYWQudmFsdWUsIHBheWxvYWQpO1xuICAgICAgICBpZiAoY3R4LmFzeW5jKSB7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBfb3V0IGluc3RhbmNlb2YgUHJvbWlzZSA/IF9vdXQgOiBQcm9taXNlLnJlc29sdmUoX291dCk7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0LnRoZW4oKG91dHB1dCk9PntcbiAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9vdXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS4kWm9kQXN5bmNFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSBfb3V0O1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVPcHRpb25hbFJlc3VsdChyZXN1bHQsIGlucHV0KSB7XG4gICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoICYmIGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgJFpvZE9wdGlvbmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RPcHRpb25hbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2Qub3B0aW4gPSBcIm9wdGlvbmFsXCI7XG4gICAgaW5zdC5fem9kLm9wdG91dCA9IFwib3B0aW9uYWxcIjtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+e1xuICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcyA/IG5ldyBTZXQoW1xuICAgICAgICAgICAgLi4uZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcyxcbiAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICBdKSA6IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInBhdHRlcm5cIiwgKCk9PntcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IGRlZi5pbm5lclR5cGUuX3pvZC5wYXR0ZXJuO1xuICAgICAgICByZXR1cm4gcGF0dGVybiA/IG5ldyBSZWdFeHAoYF4oJHt1dGlsLmNsZWFuUmVnZXgocGF0dGVybi5zb3VyY2UpfSk/JGApIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGlmIChkZWYuaW5uZXJUeXBlLl96b2Qub3B0aW4gPT09IFwib3B0aW9uYWxcIikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHJldHVybiByZXN1bHQudGhlbigocik9PmhhbmRsZU9wdGlvbmFsUmVzdWx0KHIsIHBheWxvYWQudmFsdWUpKTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVPcHRpb25hbFJlc3VsdChyZXN1bHQsIHBheWxvYWQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXlsb2FkLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2ROdWxsYWJsZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTnVsbGFibGVcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRpblwiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLm9wdGluKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdG91dFwiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLm9wdG91dCk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwYXR0ZXJuXCIsICgpPT57XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBkZWYuaW5uZXJUeXBlLl96b2QucGF0dGVybjtcbiAgICAgICAgcmV0dXJuIHBhdHRlcm4gPyBuZXcgUmVnRXhwKGBeKCR7dXRpbC5jbGVhblJlZ2V4KHBhdHRlcm4uc291cmNlKX18bnVsbCkkYCkgOiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PntcbiAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC52YWx1ZXMgPyBuZXcgU2V0KFtcbiAgICAgICAgICAgIC4uLmRlZi5pbm5lclR5cGUuX3pvZC52YWx1ZXMsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgIF0pIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIC8vIEZvcndhcmQgZGlyZWN0aW9uIChkZWNvZGUpOiBhbGxvdyBudWxsIHRvIHBhc3MgdGhyb3VnaFxuICAgICAgICBpZiAocGF5bG9hZC52YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHJldHVybiBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2REZWZhdWx0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2REZWZhdWx0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIC8vIGluc3QuX3pvZC5xaW4gPSBcInRydWVcIjtcbiAgICBpbnN0Ll96b2Qub3B0aW4gPSBcIm9wdGlvbmFsXCI7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGlmIChjdHguZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yd2FyZCBkaXJlY3Rpb24gKGRlY29kZSk6IGFwcGx5IGRlZmF1bHRzIGZvciB1bmRlZmluZWQgaW5wdXRcbiAgICAgICAgaWYgKHBheWxvYWQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IGRlZi5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqICRab2REZWZhdWx0IHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgaW1tZWRpYXRlbHkgaW4gZm9yd2FyZCBkaXJlY3Rpb24uXG4gICAgICAgICAgICAgKiBJdCBkb2Vzbid0IHBhc3MgdGhlIGRlZmF1bHQgdmFsdWUgaW50byB0aGUgdmFsaWRhdG9yIChcInByZWZhdWx0XCIpLiBUaGVyZSdzIG5vIHJlYXNvbiB0byBwYXNzIHRoZSBkZWZhdWx0IHZhbHVlIHRocm91Z2ggdmFsaWRhdGlvbi4gVGhlIHZhbGlkaXR5IG9mIHRoZSBkZWZhdWx0IGlzIGVuZm9yY2VkIGJ5IFR5cGVTY3JpcHQgc3RhdGljYWxseS4gT3RoZXJ3aXNlLCBpdCdzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdXNlciB0byBlbnN1cmUgdGhlIGRlZmF1bHQgaXMgdmFsaWQuIEluIHRoZSBjYXNlIG9mIHBpcGVzIHdpdGggZGl2ZXJnZW50IGluL291dCB0eXBlcywgeW91IGNhbiBzcGVjaWZ5IHRoZSBkZWZhdWx0IG9uIHRoZSBgaW5gIHNjaGVtYSBvZiB5b3VyIFpvZFBpcGUgdG8gc2V0IGEgXCJwcmVmYXVsdFwiIGZvciB0aGUgcGlwZS4gICAqLyByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3J3YXJkIGRpcmVjdGlvbjogY29udGludWUgd2l0aCBkZWZhdWx0IGhhbmRsaW5nXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzdWx0KT0+aGFuZGxlRGVmYXVsdFJlc3VsdChyZXN1bHQsIGRlZikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVEZWZhdWx0UmVzdWx0KHJlc3VsdCwgZGVmKTtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVEZWZhdWx0UmVzdWx0KHBheWxvYWQsIGRlZikge1xuICAgIGlmIChwYXlsb2FkLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IGRlZi5kZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBwYXlsb2FkO1xufVxuZXhwb3J0IGNvbnN0ICRab2RQcmVmYXVsdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kUHJlZmF1bHRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLm9wdGluID0gXCJvcHRpb25hbFwiO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvcndhcmQgZGlyZWN0aW9uIChkZWNvZGUpOiBhcHBseSBwcmVmYXVsdCBmb3IgdW5kZWZpbmVkIGlucHV0XG4gICAgICAgIGlmIChwYXlsb2FkLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBkZWYuZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2ROb25PcHRpb25hbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTm9uT3B0aW9uYWxcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PntcbiAgICAgICAgY29uc3QgdiA9IGRlZi5pbm5lclR5cGUuX3pvZC52YWx1ZXM7XG4gICAgICAgIHJldHVybiB2ID8gbmV3IFNldChbXG4gICAgICAgICAgICAuLi52XG4gICAgICAgIF0uZmlsdGVyKCh4KT0+eCAhPT0gdW5kZWZpbmVkKSkgOiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyZXN1bHQpPT5oYW5kbGVOb25PcHRpb25hbFJlc3VsdChyZXN1bHQsIGluc3QpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlTm9uT3B0aW9uYWxSZXN1bHQocmVzdWx0LCBpbnN0KTtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVOb25PcHRpb25hbFJlc3VsdChwYXlsb2FkLCBpbnN0KSB7XG4gICAgaWYgKCFwYXlsb2FkLmlzc3Vlcy5sZW5ndGggJiYgcGF5bG9hZC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcIm5vbm9wdGlvbmFsXCIsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBwYXlsb2FkO1xufVxuZXhwb3J0IGNvbnN0ICRab2RTdWNjZXNzID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RTdWNjZXNzXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGlmIChjdHguZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RFbmNvZGVFcnJvcihcIlpvZFN1Y2Nlc3NcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyZXN1bHQpPT57XG4gICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHJlc3VsdC5pc3N1ZXMubGVuZ3RoID09PSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHJlc3VsdC5pc3N1ZXMubGVuZ3RoID09PSAwO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENhdGNoID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDYXRjaFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdGluXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2Qub3B0aW4pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0b3V0XCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2Qub3B0b3V0KTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcyk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3J3YXJkIGRpcmVjdGlvbiAoZGVjb2RlKTogYXBwbHkgY2F0Y2ggbG9naWNcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyZXN1bHQpPT57XG4gICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IGRlZi5jYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlczogcmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gZGVmLmNhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiByZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2ROYU4gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE5hTlwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLnZhbHVlICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNOYU4ocGF5bG9hZC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwibmFuXCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFBpcGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFBpcGVcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PmRlZi5pbi5fem9kLnZhbHVlcyk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRpblwiLCAoKT0+ZGVmLmluLl96b2Qub3B0aW4pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0b3V0XCIsICgpPT5kZWYub3V0Ll96b2Qub3B0b3V0KTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9PmRlZi5pbi5fem9kLnByb3BWYWx1ZXMpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGlmIChjdHguZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZGVmLm91dC5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgaWYgKHJpZ2h0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByaWdodC50aGVuKChyaWdodCk9PmhhbmRsZVBpcGVSZXN1bHQocmlnaHQsIGRlZi5pbiwgY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlUGlwZVJlc3VsdChyaWdodCwgZGVmLmluLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxlZnQgPSBkZWYuaW4uX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgaWYgKGxlZnQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbGVmdC50aGVuKChsZWZ0KT0+aGFuZGxlUGlwZVJlc3VsdChsZWZ0LCBkZWYub3V0LCBjdHgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlUGlwZVJlc3VsdChsZWZ0LCBkZWYub3V0LCBjdHgpO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVBpcGVSZXN1bHQobGVmdCwgbmV4dCwgY3R4KSB7XG4gICAgaWYgKGxlZnQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAvLyBwcmV2ZW50IGZ1cnRoZXIgY2hlY2tzXG4gICAgICAgIGxlZnQuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBsZWZ0O1xuICAgIH1cbiAgICByZXR1cm4gbmV4dC5fem9kLnJ1bih7XG4gICAgICAgIHZhbHVlOiBsZWZ0LnZhbHVlLFxuICAgICAgICBpc3N1ZXM6IGxlZnQuaXNzdWVzXG4gICAgfSwgY3R4KTtcbn1cbmV4cG9ydCBjb25zdCAkWm9kQ29kZWMgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENvZGVjXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT5kZWYuaW4uX3pvZC52YWx1ZXMpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9PmRlZi5pbi5fem9kLm9wdGluKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdG91dFwiLCAoKT0+ZGVmLm91dC5fem9kLm9wdG91dCk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwcm9wVmFsdWVzXCIsICgpPT5kZWYuaW4uX3pvZC5wcm9wVmFsdWVzKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBjdHguZGlyZWN0aW9uIHx8IFwiZm9yd2FyZFwiO1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBcImZvcndhcmRcIikge1xuICAgICAgICAgICAgY29uc3QgbGVmdCA9IGRlZi5pbi5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgaWYgKGxlZnQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQudGhlbigobGVmdCk9PmhhbmRsZUNvZGVjQVJlc3VsdChsZWZ0LCBkZWYsIGN0eCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUNvZGVjQVJlc3VsdChsZWZ0LCBkZWYsIGN0eCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByaWdodCA9IGRlZi5vdXQuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgICAgIGlmIChyaWdodCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmlnaHQudGhlbigocmlnaHQpPT5oYW5kbGVDb2RlY0FSZXN1bHQocmlnaHQsIGRlZiwgY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQ29kZWNBUmVzdWx0KHJpZ2h0LCBkZWYsIGN0eCk7XG4gICAgICAgIH1cbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVDb2RlY0FSZXN1bHQocmVzdWx0LCBkZWYsIGN0eCkge1xuICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAvLyBwcmV2ZW50IGZ1cnRoZXIgY2hlY2tzXG4gICAgICAgIHJlc3VsdC5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY29uc3QgZGlyZWN0aW9uID0gY3R4LmRpcmVjdGlvbiB8fCBcImZvcndhcmRcIjtcbiAgICBpZiAoZGlyZWN0aW9uID09PSBcImZvcndhcmRcIikge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IGRlZi50cmFuc2Zvcm0ocmVzdWx0LnZhbHVlLCByZXN1bHQpO1xuICAgICAgICBpZiAodHJhbnNmb3JtZWQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQudGhlbigodmFsdWUpPT5oYW5kbGVDb2RlY1R4UmVzdWx0KHJlc3VsdCwgdmFsdWUsIGRlZi5vdXQsIGN0eCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVDb2RlY1R4UmVzdWx0KHJlc3VsdCwgdHJhbnNmb3JtZWQsIGRlZi5vdXQsIGN0eCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSBkZWYucmV2ZXJzZVRyYW5zZm9ybShyZXN1bHQudmFsdWUsIHJlc3VsdCk7XG4gICAgICAgIGlmICh0cmFuc2Zvcm1lZCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZC50aGVuKCh2YWx1ZSk9PmhhbmRsZUNvZGVjVHhSZXN1bHQocmVzdWx0LCB2YWx1ZSwgZGVmLmluLCBjdHgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlQ29kZWNUeFJlc3VsdChyZXN1bHQsIHRyYW5zZm9ybWVkLCBkZWYuaW4sIGN0eCk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFuZGxlQ29kZWNUeFJlc3VsdChsZWZ0LCB2YWx1ZSwgbmV4dFNjaGVtYSwgY3R4KSB7XG4gICAgLy8gQ2hlY2sgaWYgdHJhbnNmb3JtIGFkZGVkIGFueSBpc3N1ZXNcbiAgICBpZiAobGVmdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIGxlZnQuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBsZWZ0O1xuICAgIH1cbiAgICByZXR1cm4gbmV4dFNjaGVtYS5fem9kLnJ1bih7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpc3N1ZXM6IGxlZnQuaXNzdWVzXG4gICAgfSwgY3R4KTtcbn1cbmV4cG9ydCBjb25zdCAkWm9kUmVhZG9ubHkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFJlYWRvbmx5XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwicHJvcFZhbHVlc1wiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLnByb3BWYWx1ZXMpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdGluXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2Qub3B0aW4pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0b3V0XCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2Qub3B0b3V0KTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbihoYW5kbGVSZWFkb25seVJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZVJlYWRvbmx5UmVzdWx0KHJlc3VsdCk7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlUmVhZG9ubHlSZXN1bHQocGF5bG9hZCkge1xuICAgIHBheWxvYWQudmFsdWUgPSBPYmplY3QuZnJlZXplKHBheWxvYWQudmFsdWUpO1xuICAgIHJldHVybiBwYXlsb2FkO1xufVxuZXhwb3J0IGNvbnN0ICRab2RUZW1wbGF0ZUxpdGVyYWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFRlbXBsYXRlTGl0ZXJhbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCByZWdleFBhcnRzID0gW107XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIGRlZi5wYXJ0cyl7XG4gICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIiAmJiBwYXJ0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBpcyBab2Qgc2NoZW1hXG4gICAgICAgICAgICBpZiAoIXBhcnQuX3pvZC5wYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgKCFzb3VyY2UpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRlbXBsYXRlIGxpdGVyYWwgcGFydCwgbm8gcGF0dGVybiBmb3VuZDogJHtbXG4gICAgICAgICAgICAgICAgICAgIC4uLnBhcnQuX3pvZC50cmFpdHNcbiAgICAgICAgICAgICAgICBdLnNoaWZ0KCl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBwYXJ0Ll96b2QucGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCA/IHBhcnQuX3pvZC5wYXR0ZXJuLnNvdXJjZSA6IHBhcnQuX3pvZC5wYXR0ZXJuO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0ZW1wbGF0ZSBsaXRlcmFsIHBhcnQ6ICR7cGFydC5fem9kLnRyYWl0c31gKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gc291cmNlLnN0YXJ0c1dpdGgoXCJeXCIpID8gMSA6IDA7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBzb3VyY2UuZW5kc1dpdGgoXCIkXCIpID8gc291cmNlLmxlbmd0aCAtIDEgOiBzb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgcmVnZXhQYXJ0cy5wdXNoKHNvdXJjZS5zbGljZShzdGFydCwgZW5kKSk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gbnVsbCB8fCB1dGlsLnByaW1pdGl2ZVR5cGVzLmhhcyh0eXBlb2YgcGFydCkpIHtcbiAgICAgICAgICAgIHJlZ2V4UGFydHMucHVzaCh1dGlsLmVzY2FwZVJlZ2V4KGAke3BhcnR9YCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRlbXBsYXRlIGxpdGVyYWwgcGFydDogJHtwYXJ0fWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gbmV3IFJlZ0V4cChgXiR7cmVnZXhQYXJ0cy5qb2luKFwiXCIpfSRgKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLnZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcInRlbXBsYXRlX2xpdGVyYWxcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIGluc3QuX3pvZC5wYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIGlmICghaW5zdC5fem9kLnBhdHRlcm4udGVzdChwYXlsb2FkLnZhbHVlKSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBkZWYuZm9ybWF0ID8/IFwidGVtcGxhdGVfbGl0ZXJhbFwiLFxuICAgICAgICAgICAgICAgIHBhdHRlcm46IGluc3QuX3pvZC5wYXR0ZXJuLnNvdXJjZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEZ1bmN0aW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RGdW5jdGlvblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll9kZWYgPSBkZWY7XG4gICAgaW5zdC5fem9kLmRlZiA9IGRlZjtcbiAgICBpbnN0LmltcGxlbWVudCA9IChmdW5jKT0+e1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW1wbGVtZW50KCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIGZ1bmN0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gaW5zdC5fZGVmLmlucHV0ID8gcGFyc2UoaW5zdC5fZGVmLmlucHV0LCBhcmdzKSA6IGFyZ3M7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmFwcGx5KGZ1bmMsIHRoaXMsIHBhcnNlZEFyZ3MpO1xuICAgICAgICAgICAgaWYgKGluc3QuX2RlZi5vdXRwdXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2UoaW5zdC5fZGVmLm91dHB1dCwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICBpbnN0LmltcGxlbWVudEFzeW5jID0gKGZ1bmMpPT57XG4gICAgICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbXBsZW1lbnRBc3luYygpIG11c3QgYmUgY2FsbGVkIHdpdGggYSBmdW5jdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQXJncyA9IGluc3QuX2RlZi5pbnB1dCA/IGF3YWl0IHBhcnNlQXN5bmMoaW5zdC5fZGVmLmlucHV0LCBhcmdzKSA6IGFyZ3M7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBSZWZsZWN0LmFwcGx5KGZ1bmMsIHRoaXMsIHBhcnNlZEFyZ3MpO1xuICAgICAgICAgICAgaWYgKGluc3QuX2RlZi5vdXRwdXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcGFyc2VBc3luYyhpbnN0Ll9kZWYub3V0cHV0LCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQudmFsdWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgaWYgb3V0cHV0IGlzIGEgcHJvbWlzZSB0eXBlIHRvIGRldGVybWluZSBpZiB3ZSBzaG91bGQgdXNlIGFzeW5jIGltcGxlbWVudGF0aW9uXG4gICAgICAgIGNvbnN0IGhhc1Byb21pc2VPdXRwdXQgPSBpbnN0Ll9kZWYub3V0cHV0ICYmIGluc3QuX2RlZi5vdXRwdXQuX3pvZC5kZWYudHlwZSA9PT0gXCJwcm9taXNlXCI7XG4gICAgICAgIGlmIChoYXNQcm9taXNlT3V0cHV0KSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gaW5zdC5pbXBsZW1lbnRBc3luYyhwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBpbnN0LmltcGxlbWVudChwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xuICAgIGluc3QuaW5wdXQgPSAoLi4uYXJncyk9PntcbiAgICAgICAgY29uc3QgRiA9IGluc3QuY29uc3RydWN0b3I7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEYoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICBpbnB1dDogbmV3ICRab2RUdXBsZSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidHVwbGVcIixcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IGFyZ3NbMF0sXG4gICAgICAgICAgICAgICAgICAgIHJlc3Q6IGFyZ3NbMV1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IGluc3QuX2RlZi5vdXRwdXRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRih7XG4gICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICBpbnB1dDogYXJnc1swXSxcbiAgICAgICAgICAgIG91dHB1dDogaW5zdC5fZGVmLm91dHB1dFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGluc3Qub3V0cHV0ID0gKG91dHB1dCk9PntcbiAgICAgICAgY29uc3QgRiA9IGluc3QuY29uc3RydWN0b3I7XG4gICAgICAgIHJldHVybiBuZXcgRih7XG4gICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICBpbnB1dDogaW5zdC5fZGVmLmlucHV0LFxuICAgICAgICAgICAgb3V0cHV0XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIGluc3Q7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kUHJvbWlzZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kUHJvbWlzZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBheWxvYWQudmFsdWUpLnRoZW4oKGlubmVyKT0+ZGVmLmlubmVyVHlwZS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGlubmVyLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCkpO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTGF6eSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTGF6eVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICAvLyBsZXQgX2lubmVyVHlwZSE6IGFueTtcbiAgICAvLyB1dGlsLmRlZmluZUxhenkoZGVmLCBcImdldHRlclwiLCAoKSA9PiB7XG4gICAgLy8gICBpZiAoIV9pbm5lclR5cGUpIHtcbiAgICAvLyAgICAgX2lubmVyVHlwZSA9IGRlZi5nZXR0ZXIoKTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIHJldHVybiAoKSA9PiBfaW5uZXJUeXBlO1xuICAgIC8vIH0pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwiaW5uZXJUeXBlXCIsICgpPT5kZWYuZ2V0dGVyKCkpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwicGF0dGVyblwiLCAoKT0+aW5zdC5fem9kLmlubmVyVHlwZS5fem9kLnBhdHRlcm4pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwicHJvcFZhbHVlc1wiLCAoKT0+aW5zdC5fem9kLmlubmVyVHlwZS5fem9kLnByb3BWYWx1ZXMpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9Pmluc3QuX3pvZC5pbm5lclR5cGUuX3pvZC5vcHRpbiA/PyB1bmRlZmluZWQpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0b3V0XCIsICgpPT5pbnN0Ll96b2QuaW5uZXJUeXBlLl96b2Qub3B0b3V0ID8/IHVuZGVmaW5lZCk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5uZXIgPSBpbnN0Ll96b2QuaW5uZXJUeXBlO1xuICAgICAgICByZXR1cm4gaW5uZXIuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEN1c3RvbSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ3VzdG9tXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY2hlY2tzLiRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfKT0+e1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IHIgPSBkZWYuZm4oaW5wdXQpO1xuICAgICAgICBpZiAociBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByLnRoZW4oKHIpPT5oYW5kbGVSZWZpbmVSZXN1bHQociwgcGF5bG9hZCwgaW5wdXQsIGluc3QpKTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVSZWZpbmVSZXN1bHQociwgcGF5bG9hZCwgaW5wdXQsIGluc3QpO1xuICAgICAgICByZXR1cm47XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlUmVmaW5lUmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgaW5wdXQsIGluc3QpIHtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICBjb25zdCBfaXNzID0ge1xuICAgICAgICAgICAgY29kZTogXCJjdXN0b21cIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIHBhdGg6IFtcbiAgICAgICAgICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLnBhdGggPz8gW11cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBjb250aW51ZTogIWluc3QuX3pvZC5kZWYuYWJvcnRcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGluc3QuX3pvZC5kZWYucGFyYW1zKSBfaXNzLnBhcmFtcyA9IGluc3QuX3pvZC5kZWYucGFyYW1zO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHV0aWwuaXNzdWUoX2lzcykpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgJG91dHB1dCA9IFN5bWJvbChcIlpvZE91dHB1dFwiKTtcbmV4cG9ydCBjb25zdCAkaW5wdXQgPSBTeW1ib2woXCJab2RJbnB1dFwiKTtcbmV4cG9ydCBjbGFzcyAkWm9kUmVnaXN0cnkge1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMuX2lkbWFwID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBhZGQoc2NoZW1hLCAuLi5fbWV0YSkge1xuICAgICAgICBjb25zdCBtZXRhID0gX21ldGFbMF07XG4gICAgICAgIHRoaXMuX21hcC5zZXQoc2NoZW1hLCBtZXRhKTtcbiAgICAgICAgaWYgKG1ldGEgJiYgdHlwZW9mIG1ldGEgPT09IFwib2JqZWN0XCIgJiYgXCJpZFwiIGluIG1ldGEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pZG1hcC5oYXMobWV0YS5pZCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElEICR7bWV0YS5pZH0gYWxyZWFkeSBleGlzdHMgaW4gdGhlIHJlZ2lzdHJ5YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9pZG1hcC5zZXQobWV0YS5pZCwgc2NoZW1hKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMuX2lkbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVtb3ZlKHNjaGVtYSkge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fbWFwLmdldChzY2hlbWEpO1xuICAgICAgICBpZiAobWV0YSAmJiB0eXBlb2YgbWV0YSA9PT0gXCJvYmplY3RcIiAmJiBcImlkXCIgaW4gbWV0YSkge1xuICAgICAgICAgICAgdGhpcy5faWRtYXAuZGVsZXRlKG1ldGEuaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoc2NoZW1hKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGdldChzY2hlbWEpIHtcbiAgICAgICAgLy8gcmV0dXJuIHRoaXMuX21hcC5nZXQoc2NoZW1hKSBhcyBhbnk7XG4gICAgICAgIC8vIGluaGVyaXQgbWV0YWRhdGFcbiAgICAgICAgY29uc3QgcCA9IHNjaGVtYS5fem9kLnBhcmVudDtcbiAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgIGNvbnN0IHBtID0ge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0KHApID8/IHt9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGVsZXRlIHBtLmlkOyAvLyBkbyBub3QgaW5oZXJpdCBpZFxuICAgICAgICAgICAgY29uc3QgZiA9IHtcbiAgICAgICAgICAgICAgICAuLi5wbSxcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9tYXAuZ2V0KHNjaGVtYSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZikubGVuZ3RoID8gZiA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmdldChzY2hlbWEpO1xuICAgIH1cbiAgICBoYXMoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKHNjaGVtYSk7XG4gICAgfVxufVxuLy8gcmVnaXN0cmllc1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdHJ5KCkge1xuICAgIHJldHVybiBuZXcgJFpvZFJlZ2lzdHJ5KCk7XG59XG5leHBvcnQgY29uc3QgZ2xvYmFsUmVnaXN0cnkgPSAvKkBfX1BVUkVfXyovIHJlZ2lzdHJ5KCk7XG4iLCAiaW1wb3J0ICogYXMgY2hlY2tzIGZyb20gXCIuL2NoZWNrcy5qc1wiO1xuaW1wb3J0ICogYXMgc2NoZW1hcyBmcm9tIFwiLi9zY2hlbWFzLmpzXCI7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gXCIuL3V0aWwuanNcIjtcbmV4cG9ydCBmdW5jdGlvbiBfc3RyaW5nKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9jb2VyY2VkU3RyaW5nKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgY29lcmNlOiB0cnVlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2VtYWlsKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImVtYWlsXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2d1aWQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZ3VpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF91dWlkKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcInV1aWRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdXVpZHY0KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcInV1aWRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIHZlcnNpb246IFwidjRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF91dWlkdjYoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwidXVpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgdmVyc2lvbjogXCJ2NlwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3V1aWR2NyhDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ1dWlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICB2ZXJzaW9uOiBcInY3XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdXJsKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcInVybFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9lbW9qaShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJlbW9qaVwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9uYW5vaWQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwibmFub2lkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2N1aWQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiY3VpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9jdWlkMihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJjdWlkMlwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF91bGlkKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcInVsaWRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfeGlkKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcInhpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9rc3VpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJrc3VpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9pcHY0KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImlwdjRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfaXB2NihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJpcHY2XCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2NpZHJ2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJjaWRydjRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY2lkcnY2KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImNpZHJ2NlwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9iYXNlNjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiYmFzZTY0XCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2Jhc2U2NHVybChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJiYXNlNjR1cmxcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZTE2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJlMTY0XCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2p3dChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJqd3RcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBUaW1lUHJlY2lzaW9uID0ge1xuICAgIEFueTogbnVsbCxcbiAgICBNaW51dGU6IC0xLFxuICAgIFNlY29uZDogMCxcbiAgICBNaWxsaXNlY29uZDogMyxcbiAgICBNaWNyb3NlY29uZDogNlxufTtcbmV4cG9ydCBmdW5jdGlvbiBfaXNvRGF0ZVRpbWUoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZGF0ZXRpbWVcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBvZmZzZXQ6IGZhbHNlLFxuICAgICAgICBsb2NhbDogZmFsc2UsXG4gICAgICAgIHByZWNpc2lvbjogbnVsbCxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9pc29EYXRlKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImRhdGVcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2lzb1RpbWUoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwidGltZVwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIHByZWNpc2lvbjogbnVsbCxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9pc29EdXJhdGlvbihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJkdXJhdGlvblwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbnVtYmVyKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9jb2VyY2VkTnVtYmVyKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgY29lcmNlOiB0cnVlLFxuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2ludChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrOiBcIm51bWJlcl9mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6IFwic2FmZWludFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2Zsb2F0MzIoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBjaGVjazogXCJudW1iZXJfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiBcImZsb2F0MzJcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9mbG9hdDY0KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgY2hlY2s6IFwibnVtYmVyX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogXCJmbG9hdDY0XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfaW50MzIoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBjaGVjazogXCJudW1iZXJfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiBcImludDMyXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdWludDMyKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgY2hlY2s6IFwibnVtYmVyX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogXCJ1aW50MzJcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9ib29sZWFuKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY29lcmNlZEJvb2xlYW4oQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgY29lcmNlOiB0cnVlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2JpZ2ludChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY29lcmNlZEJpZ2ludChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgIGNvZXJjZTogdHJ1ZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9pbnQ2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgIGNoZWNrOiBcImJpZ2ludF9mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6IFwiaW50NjRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF91aW50NjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICBjaGVjazogXCJiaWdpbnRfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiBcInVpbnQ2NFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3N5bWJvbChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3ltYm9sXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdW5kZWZpbmVkKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ1bmRlZmluZWRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9udWxsKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJudWxsXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfYW55KENsYXNzKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiYW55XCJcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdW5rbm93bihDbGFzcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInVua25vd25cIlxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9uZXZlcihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibmV2ZXJcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF92b2lkKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ2b2lkXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZGF0ZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiZGF0ZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2NvZXJjZWREYXRlKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJkYXRlXCIsXG4gICAgICAgIGNvZXJjZTogdHJ1ZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9uYW4oQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm5hblwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2x0KHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tMZXNzVGhhbih7XG4gICAgICAgIGNoZWNrOiBcImxlc3NfdGhhblwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaW5jbHVzaXZlOiBmYWxzZVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9sdGUodmFsdWUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja0xlc3NUaGFuKHtcbiAgICAgICAgY2hlY2s6IFwibGVzc190aGFuXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpbmNsdXNpdmU6IHRydWVcbiAgICB9KTtcbn1cbmV4cG9ydCB7IC8qKiBAZGVwcmVjYXRlZCBVc2UgYHoubHRlKClgIGluc3RlYWQuICovIF9sdGUgYXMgX21heCB9O1xuZXhwb3J0IGZ1bmN0aW9uIF9ndCh2YWx1ZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrR3JlYXRlclRoYW4oe1xuICAgICAgICBjaGVjazogXCJncmVhdGVyX3RoYW5cIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGluY2x1c2l2ZTogZmFsc2VcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZ3RlKHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tHcmVhdGVyVGhhbih7XG4gICAgICAgIGNoZWNrOiBcImdyZWF0ZXJfdGhhblwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaW5jbHVzaXZlOiB0cnVlXG4gICAgfSk7XG59XG5leHBvcnQgeyAvKiogQGRlcHJlY2F0ZWQgVXNlIGB6Lmd0ZSgpYCBpbnN0ZWFkLiAqLyBfZ3RlIGFzIF9taW4gfTtcbmV4cG9ydCBmdW5jdGlvbiBfcG9zaXRpdmUocGFyYW1zKSB7XG4gICAgcmV0dXJuIF9ndCgwLCBwYXJhbXMpO1xufVxuLy8gbmVnYXRpdmVcbmV4cG9ydCBmdW5jdGlvbiBfbmVnYXRpdmUocGFyYW1zKSB7XG4gICAgcmV0dXJuIF9sdCgwLCBwYXJhbXMpO1xufVxuLy8gbm9ucG9zaXRpdmVcbmV4cG9ydCBmdW5jdGlvbiBfbm9ucG9zaXRpdmUocGFyYW1zKSB7XG4gICAgcmV0dXJuIF9sdGUoMCwgcGFyYW1zKTtcbn1cbi8vIG5vbm5lZ2F0aXZlXG5leHBvcnQgZnVuY3Rpb24gX25vbm5lZ2F0aXZlKHBhcmFtcykge1xuICAgIHJldHVybiBfZ3RlKDAsIHBhcmFtcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gX211bHRpcGxlT2YodmFsdWUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja011bHRpcGxlT2Yoe1xuICAgICAgICBjaGVjazogXCJtdWx0aXBsZV9vZlwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB2YWx1ZVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9tYXhTaXplKG1heGltdW0sIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja01heFNpemUoe1xuICAgICAgICBjaGVjazogXCJtYXhfc2l6ZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBtYXhpbXVtXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX21pblNpemUobWluaW11bSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrTWluU2l6ZSh7XG4gICAgICAgIGNoZWNrOiBcIm1pbl9zaXplXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIG1pbmltdW1cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfc2l6ZShzaXplLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tTaXplRXF1YWxzKHtcbiAgICAgICAgY2hlY2s6IFwic2l6ZV9lcXVhbHNcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgc2l6ZVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9tYXhMZW5ndGgobWF4aW11bSwgcGFyYW1zKSB7XG4gICAgY29uc3QgY2ggPSBuZXcgY2hlY2tzLiRab2RDaGVja01heExlbmd0aCh7XG4gICAgICAgIGNoZWNrOiBcIm1heF9sZW5ndGhcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgbWF4aW11bVxuICAgIH0pO1xuICAgIHJldHVybiBjaDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbWluTGVuZ3RoKG1pbmltdW0sIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja01pbkxlbmd0aCh7XG4gICAgICAgIGNoZWNrOiBcIm1pbl9sZW5ndGhcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgbWluaW11bVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9sZW5ndGgobGVuZ3RoLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tMZW5ndGhFcXVhbHMoe1xuICAgICAgICBjaGVjazogXCJsZW5ndGhfZXF1YWxzXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIGxlbmd0aFxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9yZWdleChwYXR0ZXJuLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tSZWdleCh7XG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgZm9ybWF0OiBcInJlZ2V4XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIHBhdHRlcm5cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbG93ZXJjYXNlKHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja0xvd2VyQ2FzZSh7XG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgZm9ybWF0OiBcImxvd2VyY2FzZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3VwcGVyY2FzZShwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tVcHBlckNhc2Uoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJ1cHBlcmNhc2VcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9pbmNsdWRlcyhpbmNsdWRlcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrSW5jbHVkZXMoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJpbmNsdWRlc1wiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBpbmNsdWRlc1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9zdGFydHNXaXRoKHByZWZpeCwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrU3RhcnRzV2l0aCh7XG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgZm9ybWF0OiBcInN0YXJ0c193aXRoXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIHByZWZpeFxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9lbmRzV2l0aChzdWZmaXgsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja0VuZHNXaXRoKHtcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBmb3JtYXQ6IFwiZW5kc193aXRoXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIHN1ZmZpeFxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9wcm9wZXJ0eShwcm9wZXJ0eSwgc2NoZW1hLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tQcm9wZXJ0eSh7XG4gICAgICAgIGNoZWNrOiBcInByb3BlcnR5XCIsXG4gICAgICAgIHByb3BlcnR5LFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbWltZSh0eXBlcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrTWltZVR5cGUoe1xuICAgICAgICBjaGVjazogXCJtaW1lX3R5cGVcIixcbiAgICAgICAgbWltZTogdHlwZXMsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfb3ZlcndyaXRlKHR4KSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrT3ZlcndyaXRlKHtcbiAgICAgICAgY2hlY2s6IFwib3ZlcndyaXRlXCIsXG4gICAgICAgIHR4XG4gICAgfSk7XG59XG4vLyBub3JtYWxpemVcbmV4cG9ydCBmdW5jdGlvbiBfbm9ybWFsaXplKGZvcm0pIHtcbiAgICByZXR1cm4gX292ZXJ3cml0ZSgoaW5wdXQpPT5pbnB1dC5ub3JtYWxpemUoZm9ybSkpO1xufVxuLy8gdHJpbVxuZXhwb3J0IGZ1bmN0aW9uIF90cmltKCkge1xuICAgIHJldHVybiBfb3ZlcndyaXRlKChpbnB1dCk9PmlucHV0LnRyaW0oKSk7XG59XG4vLyB0b0xvd2VyQ2FzZVxuZXhwb3J0IGZ1bmN0aW9uIF90b0xvd2VyQ2FzZSgpIHtcbiAgICByZXR1cm4gX292ZXJ3cml0ZSgoaW5wdXQpPT5pbnB1dC50b0xvd2VyQ2FzZSgpKTtcbn1cbi8vIHRvVXBwZXJDYXNlXG5leHBvcnQgZnVuY3Rpb24gX3RvVXBwZXJDYXNlKCkge1xuICAgIHJldHVybiBfb3ZlcndyaXRlKChpbnB1dCk9PmlucHV0LnRvVXBwZXJDYXNlKCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9hcnJheShDbGFzcywgZWxlbWVudCwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgLy8gZ2V0IGVsZW1lbnQoKSB7XG4gICAgICAgIC8vICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIC8vIH0sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdW5pb24oQ2xhc3MsIG9wdGlvbnMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInVuaW9uXCIsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZGlzY3JpbWluYXRlZFVuaW9uKENsYXNzLCBkaXNjcmltaW5hdG9yLCBvcHRpb25zLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ1bmlvblwiLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBkaXNjcmltaW5hdG9yLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2ludGVyc2VjdGlvbihDbGFzcywgbGVmdCwgcmlnaHQpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJpbnRlcnNlY3Rpb25cIixcbiAgICAgICAgbGVmdCxcbiAgICAgICAgcmlnaHRcbiAgICB9KTtcbn1cbi8vIGV4cG9ydCBmdW5jdGlvbiBfdHVwbGUoXG4vLyAgIENsYXNzOiB1dGlsLlNjaGVtYUNsYXNzPHNjaGVtYXMuJFpvZFR1cGxlPixcbi8vICAgaXRlbXM6IFtdLFxuLy8gICBwYXJhbXM/OiBzdHJpbmcgfCAkWm9kVHVwbGVQYXJhbXNcbi8vICk6IHNjaGVtYXMuJFpvZFR1cGxlPFtdLCBudWxsPjtcbmV4cG9ydCBmdW5jdGlvbiBfdHVwbGUoQ2xhc3MsIGl0ZW1zLCBfcGFyYW1zT3JSZXN0LCBfcGFyYW1zKSB7XG4gICAgY29uc3QgaGFzUmVzdCA9IF9wYXJhbXNPclJlc3QgaW5zdGFuY2VvZiBzY2hlbWFzLiRab2RUeXBlO1xuICAgIGNvbnN0IHBhcmFtcyA9IGhhc1Jlc3QgPyBfcGFyYW1zIDogX3BhcmFtc09yUmVzdDtcbiAgICBjb25zdCByZXN0ID0gaGFzUmVzdCA/IF9wYXJhbXNPclJlc3QgOiBudWxsO1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInR1cGxlXCIsXG4gICAgICAgIGl0ZW1zLFxuICAgICAgICByZXN0LFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3JlY29yZChDbGFzcywga2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJyZWNvcmRcIixcbiAgICAgICAga2V5VHlwZSxcbiAgICAgICAgdmFsdWVUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX21hcChDbGFzcywga2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJtYXBcIixcbiAgICAgICAga2V5VHlwZSxcbiAgICAgICAgdmFsdWVUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3NldChDbGFzcywgdmFsdWVUeXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgICAgdmFsdWVUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2VudW0oQ2xhc3MsIHZhbHVlcywgcGFyYW1zKSB7XG4gICAgY29uc3QgZW50cmllcyA9IEFycmF5LmlzQXJyYXkodmFsdWVzKSA/IE9iamVjdC5mcm9tRW50cmllcyh2YWx1ZXMubWFwKCh2KT0+W1xuICAgICAgICAgICAgdixcbiAgICAgICAgICAgIHZcbiAgICAgICAgXSkpIDogdmFsdWVzO1xuICAgIC8vIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAvLyAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgLy8gICAgIGVudHJpZXNbdmFsdWVdID0gdmFsdWU7XG4gICAgLy8gICB9XG4gICAgLy8gfSBlbHNlIHtcbiAgICAvLyAgIE9iamVjdC5hc3NpZ24oZW50cmllcywgdmFsdWVzKTtcbiAgICAvLyB9XG4gICAgLy8gY29uc3QgZW50cmllczogdXRpbC5FbnVtTGlrZSA9IHt9O1xuICAgIC8vIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlcykge1xuICAgIC8vICAgZW50cmllc1t2YWxdID0gdmFsO1xuICAgIC8vIH1cbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgIGVudHJpZXMsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCBUaGlzIEFQSSBoYXMgYmVlbiBtZXJnZWQgaW50byBgei5lbnVtKClgLiBVc2UgYHouZW51bSgpYCBpbnN0ZWFkLlxuICpcbiAqIGBgYHRzXG4gKiBlbnVtIENvbG9ycyB7IHJlZCwgZ3JlZW4sIGJsdWUgfVxuICogei5lbnVtKENvbG9ycyk7XG4gKiBgYGBcbiAqLyBleHBvcnQgZnVuY3Rpb24gX25hdGl2ZUVudW0oQ2xhc3MsIGVudHJpZXMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgZW50cmllcyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9saXRlcmFsKENsYXNzLCB2YWx1ZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibGl0ZXJhbFwiLFxuICAgICAgICB2YWx1ZXM6IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICBdLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2ZpbGUoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF90cmFuc2Zvcm0oQ2xhc3MsIGZuKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwidHJhbnNmb3JtXCIsXG4gICAgICAgIHRyYW5zZm9ybTogZm5cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfb3B0aW9uYWwoQ2xhc3MsIGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm9wdGlvbmFsXCIsXG4gICAgICAgIGlubmVyVHlwZVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9udWxsYWJsZShDbGFzcywgaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVsbGFibGVcIixcbiAgICAgICAgaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2RlZmF1bHQoQ2xhc3MsIGlubmVyVHlwZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiZGVmYXVsdFwiLFxuICAgICAgICBpbm5lclR5cGUsXG4gICAgICAgIGdldCBkZWZhdWx0VmFsdWUgKCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGRlZmF1bHRWYWx1ZSgpIDogdXRpbC5zaGFsbG93Q2xvbmUoZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9ub25vcHRpb25hbChDbGFzcywgaW5uZXJUeXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJub25vcHRpb25hbFwiLFxuICAgICAgICBpbm5lclR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfc3VjY2VzcyhDbGFzcywgaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3VjY2Vzc1wiLFxuICAgICAgICBpbm5lclR5cGVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY2F0Y2goQ2xhc3MsIGlubmVyVHlwZSwgY2F0Y2hWYWx1ZSkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImNhdGNoXCIsXG4gICAgICAgIGlubmVyVHlwZSxcbiAgICAgICAgY2F0Y2hWYWx1ZTogdHlwZW9mIGNhdGNoVmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGNhdGNoVmFsdWUgOiAoKT0+Y2F0Y2hWYWx1ZVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9waXBlKENsYXNzLCBpbl8sIG91dCkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInBpcGVcIixcbiAgICAgICAgaW46IGluXyxcbiAgICAgICAgb3V0XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3JlYWRvbmx5KENsYXNzLCBpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJyZWFkb25seVwiLFxuICAgICAgICBpbm5lclR5cGVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdGVtcGxhdGVMaXRlcmFsKENsYXNzLCBwYXJ0cywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwidGVtcGxhdGVfbGl0ZXJhbFwiLFxuICAgICAgICBwYXJ0cyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9sYXp5KENsYXNzLCBnZXR0ZXIpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJsYXp5XCIsXG4gICAgICAgIGdldHRlclxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9wcm9taXNlKENsYXNzLCBpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJwcm9taXNlXCIsXG4gICAgICAgIGlubmVyVHlwZVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9jdXN0b20oQ2xhc3MsIGZuLCBfcGFyYW1zKSB7XG4gICAgY29uc3Qgbm9ybSA9IHV0aWwubm9ybWFsaXplUGFyYW1zKF9wYXJhbXMpO1xuICAgIG5vcm0uYWJvcnQgPz8gKG5vcm0uYWJvcnQgPSB0cnVlKTsgLy8gZGVmYXVsdCB0byBhYm9ydDpmYWxzZVxuICAgIGNvbnN0IHNjaGVtYSA9IG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgICAgIGNoZWNrOiBcImN1c3RvbVwiLFxuICAgICAgICBmbjogZm4sXG4gICAgICAgIC4uLm5vcm1cbiAgICB9KTtcbiAgICByZXR1cm4gc2NoZW1hO1xufVxuLy8gc2FtZSBhcyBfY3VzdG9tIGJ1dCBkZWZhdWx0cyB0byBhYm9ydDpmYWxzZVxuZXhwb3J0IGZ1bmN0aW9uIF9yZWZpbmUoQ2xhc3MsIGZuLCBfcGFyYW1zKSB7XG4gICAgY29uc3Qgc2NoZW1hID0gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJjdXN0b21cIixcbiAgICAgICAgY2hlY2s6IFwiY3VzdG9tXCIsXG4gICAgICAgIGZuOiBmbixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMoX3BhcmFtcylcbiAgICB9KTtcbiAgICByZXR1cm4gc2NoZW1hO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9zdXBlclJlZmluZShmbikge1xuICAgIGNvbnN0IGNoID0gX2NoZWNrKChwYXlsb2FkKT0+e1xuICAgICAgICBwYXlsb2FkLmFkZElzc3VlID0gKGlzc3VlKT0+e1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpc3N1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2godXRpbC5pc3N1ZShpc3N1ZSwgcGF5bG9hZC52YWx1ZSwgY2guX3pvZC5kZWYpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZm9yIFpvZCAzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICAgICAgY29uc3QgX2lzc3VlID0gaXNzdWU7XG4gICAgICAgICAgICAgICAgaWYgKF9pc3N1ZS5mYXRhbCkgX2lzc3VlLmNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgX2lzc3VlLmNvZGUgPz8gKF9pc3N1ZS5jb2RlID0gXCJjdXN0b21cIik7XG4gICAgICAgICAgICAgICAgX2lzc3VlLmlucHV0ID8/IChfaXNzdWUuaW5wdXQgPSBwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuaW5zdCA/PyAoX2lzc3VlLmluc3QgPSBjaCk7XG4gICAgICAgICAgICAgICAgX2lzc3VlLmNvbnRpbnVlID8/IChfaXNzdWUuY29udGludWUgPSAhY2guX3pvZC5kZWYuYWJvcnQpOyAvLyBhYm9ydCBpcyBhbHdheXMgdW5kZWZpbmVkLCBzbyB0aGlzIGlzIGFsd2F5cyB0cnVlLi4uXG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh1dGlsLmlzc3VlKF9pc3N1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZm4ocGF5bG9hZC52YWx1ZSwgcGF5bG9hZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9jaGVjayhmbiwgcGFyYW1zKSB7XG4gICAgY29uc3QgY2ggPSBuZXcgY2hlY2tzLiRab2RDaGVjayh7XG4gICAgICAgIGNoZWNrOiBcImN1c3RvbVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG4gICAgY2guX3pvZC5jaGVjayA9IGZuO1xuICAgIHJldHVybiBjaDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfc3RyaW5nYm9vbChDbGFzc2VzLCBfcGFyYW1zKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdXRpbC5ub3JtYWxpemVQYXJhbXMoX3BhcmFtcyk7XG4gICAgbGV0IHRydXRoeUFycmF5ID0gcGFyYW1zLnRydXRoeSA/PyBbXG4gICAgICAgIFwidHJ1ZVwiLFxuICAgICAgICBcIjFcIixcbiAgICAgICAgXCJ5ZXNcIixcbiAgICAgICAgXCJvblwiLFxuICAgICAgICBcInlcIixcbiAgICAgICAgXCJlbmFibGVkXCJcbiAgICBdO1xuICAgIGxldCBmYWxzeUFycmF5ID0gcGFyYW1zLmZhbHN5ID8/IFtcbiAgICAgICAgXCJmYWxzZVwiLFxuICAgICAgICBcIjBcIixcbiAgICAgICAgXCJub1wiLFxuICAgICAgICBcIm9mZlwiLFxuICAgICAgICBcIm5cIixcbiAgICAgICAgXCJkaXNhYmxlZFwiXG4gICAgXTtcbiAgICBpZiAocGFyYW1zLmNhc2UgIT09IFwic2Vuc2l0aXZlXCIpIHtcbiAgICAgICAgdHJ1dGh5QXJyYXkgPSB0cnV0aHlBcnJheS5tYXAoKHYpPT50eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiA/IHYudG9Mb3dlckNhc2UoKSA6IHYpO1xuICAgICAgICBmYWxzeUFycmF5ID0gZmFsc3lBcnJheS5tYXAoKHYpPT50eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiA/IHYudG9Mb3dlckNhc2UoKSA6IHYpO1xuICAgIH1cbiAgICBjb25zdCB0cnV0aHlTZXQgPSBuZXcgU2V0KHRydXRoeUFycmF5KTtcbiAgICBjb25zdCBmYWxzeVNldCA9IG5ldyBTZXQoZmFsc3lBcnJheSk7XG4gICAgY29uc3QgX0NvZGVjID0gQ2xhc3Nlcy5Db2RlYyA/PyBzY2hlbWFzLiRab2RDb2RlYztcbiAgICBjb25zdCBfQm9vbGVhbiA9IENsYXNzZXMuQm9vbGVhbiA/PyBzY2hlbWFzLiRab2RCb29sZWFuO1xuICAgIGNvbnN0IF9TdHJpbmcgPSBDbGFzc2VzLlN0cmluZyA/PyBzY2hlbWFzLiRab2RTdHJpbmc7XG4gICAgY29uc3Qgc3RyaW5nU2NoZW1hID0gbmV3IF9TdHJpbmcoe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBlcnJvcjogcGFyYW1zLmVycm9yXG4gICAgfSk7XG4gICAgY29uc3QgYm9vbGVhblNjaGVtYSA9IG5ldyBfQm9vbGVhbih7XG4gICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICBlcnJvcjogcGFyYW1zLmVycm9yXG4gICAgfSk7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgX0NvZGVjKHtcbiAgICAgICAgdHlwZTogXCJwaXBlXCIsXG4gICAgICAgIGluOiBzdHJpbmdTY2hlbWEsXG4gICAgICAgIG91dDogYm9vbGVhblNjaGVtYSxcbiAgICAgICAgdHJhbnNmb3JtOiAoaW5wdXQsIHBheWxvYWQpPT57XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGlucHV0O1xuICAgICAgICAgICAgaWYgKHBhcmFtcy5jYXNlICE9PSBcInNlbnNpdGl2ZVwiKSBkYXRhID0gZGF0YS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHRydXRoeVNldC5oYXMoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFsc3lTZXQuaGFzKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3ZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcInN0cmluZ2Jvb2xcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50cnV0aHlTZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5mYWxzeVNldFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5zdDogY29kZWMsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmV2ZXJzZVRyYW5zZm9ybTogKGlucHV0LCBfcGF5bG9hZCk9PntcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnV0aHlBcnJheVswXSB8fCBcInRydWVcIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHN5QXJyYXlbMF0gfHwgXCJmYWxzZVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogcGFyYW1zLmVycm9yXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvZGVjO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9zdHJpbmdGb3JtYXQoQ2xhc3MsIGZvcm1hdCwgZm5PclJlZ2V4LCBfcGFyYW1zID0ge30pIHtcbiAgICBjb25zdCBwYXJhbXMgPSB1dGlsLm5vcm1hbGl6ZVBhcmFtcyhfcGFyYW1zKTtcbiAgICBjb25zdCBkZWYgPSB7XG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKF9wYXJhbXMpLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdCxcbiAgICAgICAgZm46IHR5cGVvZiBmbk9yUmVnZXggPT09IFwiZnVuY3Rpb25cIiA/IGZuT3JSZWdleCA6ICh2YWwpPT5mbk9yUmVnZXgudGVzdCh2YWwpLFxuICAgICAgICAuLi5wYXJhbXNcbiAgICB9O1xuICAgIGlmIChmbk9yUmVnZXggaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgZGVmLnBhdHRlcm4gPSBmbk9yUmVnZXg7XG4gICAgfVxuICAgIGNvbnN0IGluc3QgPSBuZXcgQ2xhc3MoZGVmKTtcbiAgICByZXR1cm4gaW5zdDtcbn1cbiIsICJpbXBvcnQgKiBhcyBjb3JlIGZyb20gXCIuLi9jb3JlL2luZGV4LmpzXCI7XG5pbXBvcnQgKiBhcyBzY2hlbWFzIGZyb20gXCIuL3NjaGVtYXMuanNcIjtcbmV4cG9ydCBjb25zdCBab2RJU09EYXRlVGltZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RJU09EYXRlVGltZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZElTT0RhdGVUaW1lLmluaXQoaW5zdCwgZGVmKTtcbiAgICBzY2hlbWFzLlpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBkYXRldGltZShwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faXNvRGF0ZVRpbWUoWm9kSVNPRGF0ZVRpbWUsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kSVNPRGF0ZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RJU09EYXRlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kSVNPRGF0ZS5pbml0KGluc3QsIGRlZik7XG4gICAgc2NoZW1hcy5ab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZGF0ZShwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faXNvRGF0ZShab2RJU09EYXRlLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZElTT1RpbWUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVNPVGltZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZElTT1RpbWUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHNjaGVtYXMuWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHRpbWUocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lzb1RpbWUoWm9kSVNPVGltZSwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RJU09EdXJhdGlvbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RJU09EdXJhdGlvblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZElTT0R1cmF0aW9uLmluaXQoaW5zdCwgZGVmKTtcbiAgICBzY2hlbWFzLlpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBkdXJhdGlvbihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faXNvRHVyYXRpb24oWm9kSVNPRHVyYXRpb24sIHBhcmFtcyk7XG59XG4iLCAiaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi4vY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgJFpvZEVycm9yIH0gZnJvbSBcIi4uL2NvcmUvaW5kZXguanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4uL2NvcmUvdXRpbC5qc1wiO1xuY29uc3QgaW5pdGlhbGl6ZXIgPSAoaW5zdCwgaXNzdWVzKT0+e1xuICAgICRab2RFcnJvci5pbml0KGluc3QsIGlzc3Vlcyk7XG4gICAgaW5zdC5uYW1lID0gXCJab2RFcnJvclwiO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGluc3QsIHtcbiAgICAgICAgZm9ybWF0OiB7XG4gICAgICAgICAgICB2YWx1ZTogKG1hcHBlcik9PmNvcmUuZm9ybWF0RXJyb3IoaW5zdCwgbWFwcGVyKVxuICAgICAgICB9LFxuICAgICAgICBmbGF0dGVuOiB7XG4gICAgICAgICAgICB2YWx1ZTogKG1hcHBlcik9PmNvcmUuZmxhdHRlbkVycm9yKGluc3QsIG1hcHBlcilcbiAgICAgICAgfSxcbiAgICAgICAgYWRkSXNzdWU6IHtcbiAgICAgICAgICAgIHZhbHVlOiAoaXNzdWUpPT57XG4gICAgICAgICAgICAgICAgaW5zdC5pc3N1ZXMucHVzaChpc3N1ZSk7XG4gICAgICAgICAgICAgICAgaW5zdC5tZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoaW5zdC5pc3N1ZXMsIHV0aWwuanNvblN0cmluZ2lmeVJlcGxhY2VyLCAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYWRkSXNzdWVzOiB7XG4gICAgICAgICAgICB2YWx1ZTogKGlzc3Vlcyk9PntcbiAgICAgICAgICAgICAgICBpbnN0Lmlzc3Vlcy5wdXNoKC4uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgaW5zdC5tZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoaW5zdC5pc3N1ZXMsIHV0aWwuanNvblN0cmluZ2lmeVJlcGxhY2VyLCAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaXNFbXB0eToge1xuICAgICAgICAgICAgZ2V0ICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdC5pc3N1ZXMubGVuZ3RoID09PSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4vLyBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdCwgXCJpc0VtcHR5XCIsIHtcbi8vICAgZ2V0KCkge1xuLy8gICAgIHJldHVybiBpbnN0Lmlzc3Vlcy5sZW5ndGggPT09IDA7XG4vLyAgIH0sXG4vLyB9KTtcbn07XG5leHBvcnQgY29uc3QgWm9kRXJyb3IgPSBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEVycm9yXCIsIGluaXRpYWxpemVyKTtcbmV4cG9ydCBjb25zdCBab2RSZWFsRXJyb3IgPSBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEVycm9yXCIsIGluaXRpYWxpemVyLCB7XG4gICAgUGFyZW50OiBFcnJvclxufSk7IC8vIC8qKiBAZGVwcmVjYXRlZCBVc2UgYHouY29yZS4kWm9kRXJyb3JNYXBDdHhgIGluc3RlYWQuICovXG4gLy8gZXhwb3J0IHR5cGUgRXJyb3JNYXBDdHggPSBjb3JlLiRab2RFcnJvck1hcEN0eDtcbiIsICJpbXBvcnQgKiBhcyBjb3JlIGZyb20gXCIuLi9jb3JlL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBab2RSZWFsRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmV4cG9ydCBjb25zdCBwYXJzZSA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9wYXJzZShab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IHBhcnNlQXN5bmMgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fcGFyc2VBc3luYyhab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IHNhZmVQYXJzZSA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9zYWZlUGFyc2UoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBzYWZlUGFyc2VBc3luYyA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9zYWZlUGFyc2VBc3luYyhab2RSZWFsRXJyb3IpO1xuLy8gQ29kZWMgZnVuY3Rpb25zXG5leHBvcnQgY29uc3QgZW5jb2RlID0gLyogQF9fUFVSRV9fICovIGNvcmUuX2VuY29kZShab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IGRlY29kZSA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9kZWNvZGUoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBlbmNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9lbmNvZGVBc3luYyhab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IGRlY29kZUFzeW5jID0gLyogQF9fUFVSRV9fICovIGNvcmUuX2RlY29kZUFzeW5jKFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3Qgc2FmZUVuY29kZSA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9zYWZlRW5jb2RlKFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3Qgc2FmZURlY29kZSA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9zYWZlRGVjb2RlKFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3Qgc2FmZUVuY29kZUFzeW5jID0gLyogQF9fUFVSRV9fICovIGNvcmUuX3NhZmVFbmNvZGVBc3luYyhab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IHNhZmVEZWNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9zYWZlRGVjb2RlQXN5bmMoWm9kUmVhbEVycm9yKTtcbiIsICJpbXBvcnQgKiBhcyBjb3JlIGZyb20gXCIuLi9jb3JlL2luZGV4LmpzXCI7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSBcIi4uL2NvcmUvaW5kZXguanNcIjtcbmltcG9ydCAqIGFzIGNoZWNrcyBmcm9tIFwiLi9jaGVja3MuanNcIjtcbmltcG9ydCAqIGFzIGlzbyBmcm9tIFwiLi9pc28uanNcIjtcbmltcG9ydCAqIGFzIHBhcnNlIGZyb20gXCIuL3BhcnNlLmpzXCI7XG5leHBvcnQgY29uc3QgWm9kVHlwZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RUeXBlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5kZWYgPSBkZWY7XG4gICAgaW5zdC50eXBlID0gZGVmLnR5cGU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiX2RlZlwiLCB7XG4gICAgICAgIHZhbHVlOiBkZWZcbiAgICB9KTtcbiAgICAvLyBiYXNlIG1ldGhvZHNcbiAgICBpbnN0LmNoZWNrID0gKC4uLmNoZWNrcyk9PntcbiAgICAgICAgcmV0dXJuIGluc3QuY2xvbmUodXRpbC5tZXJnZURlZnMoZGVmLCB7XG4gICAgICAgICAgICBjaGVja3M6IFtcbiAgICAgICAgICAgICAgICAuLi5kZWYuY2hlY2tzID8/IFtdLFxuICAgICAgICAgICAgICAgIC4uLmNoZWNrcy5tYXAoKGNoKT0+dHlwZW9mIGNoID09PSBcImZ1bmN0aW9uXCIgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfem9kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2s6IGNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjazogXCJjdXN0b21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25hdHRhY2g6IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gOiBjaClcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSkpO1xuICAgIH07XG4gICAgaW5zdC5jbG9uZSA9IChkZWYsIHBhcmFtcyk9PmNvcmUuY2xvbmUoaW5zdCwgZGVmLCBwYXJhbXMpO1xuICAgIGluc3QuYnJhbmQgPSAoKT0+aW5zdDtcbiAgICBpbnN0LnJlZ2lzdGVyID0gKHJlZywgbWV0YSk9PntcbiAgICAgICAgcmVnLmFkZChpbnN0LCBtZXRhKTtcbiAgICAgICAgcmV0dXJuIGluc3Q7XG4gICAgfTtcbiAgICAvLyBwYXJzaW5nXG4gICAgaW5zdC5wYXJzZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5wYXJzZShpbnN0LCBkYXRhLCBwYXJhbXMsIHtcbiAgICAgICAgICAgIGNhbGxlZTogaW5zdC5wYXJzZVxuICAgICAgICB9KTtcbiAgICBpbnN0LnNhZmVQYXJzZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5zYWZlUGFyc2UoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LnBhcnNlQXN5bmMgPSBhc3luYyAoZGF0YSwgcGFyYW1zKT0+cGFyc2UucGFyc2VBc3luYyhpbnN0LCBkYXRhLCBwYXJhbXMsIHtcbiAgICAgICAgICAgIGNhbGxlZTogaW5zdC5wYXJzZUFzeW5jXG4gICAgICAgIH0pO1xuICAgIGluc3Quc2FmZVBhcnNlQXN5bmMgPSBhc3luYyAoZGF0YSwgcGFyYW1zKT0+cGFyc2Uuc2FmZVBhcnNlQXN5bmMoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LnNwYSA9IGluc3Quc2FmZVBhcnNlQXN5bmM7XG4gICAgLy8gZW5jb2RpbmcvZGVjb2RpbmdcbiAgICBpbnN0LmVuY29kZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5lbmNvZGUoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LmRlY29kZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5kZWNvZGUoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LmVuY29kZUFzeW5jID0gYXN5bmMgKGRhdGEsIHBhcmFtcyk9PnBhcnNlLmVuY29kZUFzeW5jKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5kZWNvZGVBc3luYyA9IGFzeW5jIChkYXRhLCBwYXJhbXMpPT5wYXJzZS5kZWNvZGVBc3luYyhpbnN0LCBkYXRhLCBwYXJhbXMpO1xuICAgIGluc3Quc2FmZUVuY29kZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5zYWZlRW5jb2RlKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5zYWZlRGVjb2RlID0gKGRhdGEsIHBhcmFtcyk9PnBhcnNlLnNhZmVEZWNvZGUoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LnNhZmVFbmNvZGVBc3luYyA9IGFzeW5jIChkYXRhLCBwYXJhbXMpPT5wYXJzZS5zYWZlRW5jb2RlQXN5bmMoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LnNhZmVEZWNvZGVBc3luYyA9IGFzeW5jIChkYXRhLCBwYXJhbXMpPT5wYXJzZS5zYWZlRGVjb2RlQXN5bmMoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICAvLyByZWZpbmVtZW50c1xuICAgIGluc3QucmVmaW5lID0gKGNoZWNrLCBwYXJhbXMpPT5pbnN0LmNoZWNrKHJlZmluZShjaGVjaywgcGFyYW1zKSk7XG4gICAgaW5zdC5zdXBlclJlZmluZSA9IChyZWZpbmVtZW50KT0+aW5zdC5jaGVjayhzdXBlclJlZmluZShyZWZpbmVtZW50KSk7XG4gICAgaW5zdC5vdmVyd3JpdGUgPSAoZm4pPT5pbnN0LmNoZWNrKGNoZWNrcy5vdmVyd3JpdGUoZm4pKTtcbiAgICAvLyB3cmFwcGVyc1xuICAgIGluc3Qub3B0aW9uYWwgPSAoKT0+b3B0aW9uYWwoaW5zdCk7XG4gICAgaW5zdC5udWxsYWJsZSA9ICgpPT5udWxsYWJsZShpbnN0KTtcbiAgICBpbnN0Lm51bGxpc2ggPSAoKT0+b3B0aW9uYWwobnVsbGFibGUoaW5zdCkpO1xuICAgIGluc3Qubm9ub3B0aW9uYWwgPSAocGFyYW1zKT0+bm9ub3B0aW9uYWwoaW5zdCwgcGFyYW1zKTtcbiAgICBpbnN0LmFycmF5ID0gKCk9PmFycmF5KGluc3QpO1xuICAgIGluc3Qub3IgPSAoYXJnKT0+dW5pb24oW1xuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGFyZ1xuICAgICAgICBdKTtcbiAgICBpbnN0LmFuZCA9IChhcmcpPT5pbnRlcnNlY3Rpb24oaW5zdCwgYXJnKTtcbiAgICBpbnN0LnRyYW5zZm9ybSA9ICh0eCk9PnBpcGUoaW5zdCwgdHJhbnNmb3JtKHR4KSk7XG4gICAgaW5zdC5kZWZhdWx0ID0gKGRlZik9Pl9kZWZhdWx0KGluc3QsIGRlZik7XG4gICAgaW5zdC5wcmVmYXVsdCA9IChkZWYpPT5wcmVmYXVsdChpbnN0LCBkZWYpO1xuICAgIC8vIGluc3QuY29hbGVzY2UgPSAoZGVmLCBwYXJhbXMpID0+IGNvYWxlc2NlKGluc3QsIGRlZiwgcGFyYW1zKTtcbiAgICBpbnN0LmNhdGNoID0gKHBhcmFtcyk9Pl9jYXRjaChpbnN0LCBwYXJhbXMpO1xuICAgIGluc3QucGlwZSA9ICh0YXJnZXQpPT5waXBlKGluc3QsIHRhcmdldCk7XG4gICAgaW5zdC5yZWFkb25seSA9ICgpPT5yZWFkb25seShpbnN0KTtcbiAgICAvLyBtZXRhXG4gICAgaW5zdC5kZXNjcmliZSA9IChkZXNjcmlwdGlvbik9PntcbiAgICAgICAgY29uc3QgY2wgPSBpbnN0LmNsb25lKCk7XG4gICAgICAgIGNvcmUuZ2xvYmFsUmVnaXN0cnkuYWRkKGNsLCB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvblxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiZGVzY3JpcHRpb25cIiwge1xuICAgICAgICBnZXQgKCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvcmUuZ2xvYmFsUmVnaXN0cnkuZ2V0KGluc3QpPy5kZXNjcmlwdGlvbjtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgaW5zdC5tZXRhID0gKC4uLmFyZ3MpPT57XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvcmUuZ2xvYmFsUmVnaXN0cnkuZ2V0KGluc3QpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsID0gaW5zdC5jbG9uZSgpO1xuICAgICAgICBjb3JlLmdsb2JhbFJlZ2lzdHJ5LmFkZChjbCwgYXJnc1swXSk7XG4gICAgICAgIHJldHVybiBjbDtcbiAgICB9O1xuICAgIC8vIGhlbHBlcnNcbiAgICBpbnN0LmlzT3B0aW9uYWwgPSAoKT0+aW5zdC5zYWZlUGFyc2UodW5kZWZpbmVkKS5zdWNjZXNzO1xuICAgIGluc3QuaXNOdWxsYWJsZSA9ICgpPT5pbnN0LnNhZmVQYXJzZShudWxsKS5zdWNjZXNzO1xuICAgIHJldHVybiBpbnN0O1xufSk7XG4vKiogQGludGVybmFsICovIGV4cG9ydCBjb25zdCBfWm9kU3RyaW5nID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIl9ab2RTdHJpbmdcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RTdHJpbmcuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgaW5zdC5mb3JtYXQgPSBiYWcuZm9ybWF0ID8/IG51bGw7XG4gICAgaW5zdC5taW5MZW5ndGggPSBiYWcubWluaW11bSA/PyBudWxsO1xuICAgIGluc3QubWF4TGVuZ3RoID0gYmFnLm1heGltdW0gPz8gbnVsbDtcbiAgICAvLyB2YWxpZGF0aW9uc1xuICAgIGluc3QucmVnZXggPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLnJlZ2V4KC4uLmFyZ3MpKTtcbiAgICBpbnN0LmluY2x1ZGVzID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5pbmNsdWRlcyguLi5hcmdzKSk7XG4gICAgaW5zdC5zdGFydHNXaXRoID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5zdGFydHNXaXRoKC4uLmFyZ3MpKTtcbiAgICBpbnN0LmVuZHNXaXRoID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5lbmRzV2l0aCguLi5hcmdzKSk7XG4gICAgaW5zdC5taW4gPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLm1pbkxlbmd0aCguLi5hcmdzKSk7XG4gICAgaW5zdC5tYXggPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLm1heExlbmd0aCguLi5hcmdzKSk7XG4gICAgaW5zdC5sZW5ndGggPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLmxlbmd0aCguLi5hcmdzKSk7XG4gICAgaW5zdC5ub25lbXB0eSA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MubWluTGVuZ3RoKDEsIC4uLmFyZ3MpKTtcbiAgICBpbnN0Lmxvd2VyY2FzZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sb3dlcmNhc2UocGFyYW1zKSk7XG4gICAgaW5zdC51cHBlcmNhc2UgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MudXBwZXJjYXNlKHBhcmFtcykpO1xuICAgIC8vIHRyYW5zZm9ybXNcbiAgICBpbnN0LnRyaW0gPSAoKT0+aW5zdC5jaGVjayhjaGVja3MudHJpbSgpKTtcbiAgICBpbnN0Lm5vcm1hbGl6ZSA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3Mubm9ybWFsaXplKC4uLmFyZ3MpKTtcbiAgICBpbnN0LnRvTG93ZXJDYXNlID0gKCk9Pmluc3QuY2hlY2soY2hlY2tzLnRvTG93ZXJDYXNlKCkpO1xuICAgIGluc3QudG9VcHBlckNhc2UgPSAoKT0+aW5zdC5jaGVjayhjaGVja3MudG9VcHBlckNhc2UoKSk7XG59KTtcbmV4cG9ydCBjb25zdCBab2RTdHJpbmcgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kU3RyaW5nXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kU3RyaW5nLmluaXQoaW5zdCwgZGVmKTtcbiAgICBfWm9kU3RyaW5nLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LmVtYWlsID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fZW1haWwoWm9kRW1haWwsIHBhcmFtcykpO1xuICAgIGluc3QudXJsID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fdXJsKFpvZFVSTCwgcGFyYW1zKSk7XG4gICAgaW5zdC5qd3QgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9qd3QoWm9kSldULCBwYXJhbXMpKTtcbiAgICBpbnN0LmVtb2ppID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fZW1vamkoWm9kRW1vamksIHBhcmFtcykpO1xuICAgIGluc3QuZ3VpZCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2d1aWQoWm9kR1VJRCwgcGFyYW1zKSk7XG4gICAgaW5zdC51dWlkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fdXVpZChab2RVVUlELCBwYXJhbXMpKTtcbiAgICBpbnN0LnV1aWR2NCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX3V1aWR2NChab2RVVUlELCBwYXJhbXMpKTtcbiAgICBpbnN0LnV1aWR2NiA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX3V1aWR2Nihab2RVVUlELCBwYXJhbXMpKTtcbiAgICBpbnN0LnV1aWR2NyA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX3V1aWR2Nyhab2RVVUlELCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5hbm9pZCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX25hbm9pZChab2ROYW5vSUQsIHBhcmFtcykpO1xuICAgIGluc3QuZ3VpZCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2d1aWQoWm9kR1VJRCwgcGFyYW1zKSk7XG4gICAgaW5zdC5jdWlkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fY3VpZChab2RDVUlELCBwYXJhbXMpKTtcbiAgICBpbnN0LmN1aWQyID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fY3VpZDIoWm9kQ1VJRDIsIHBhcmFtcykpO1xuICAgIGluc3QudWxpZCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX3VsaWQoWm9kVUxJRCwgcGFyYW1zKSk7XG4gICAgaW5zdC5iYXNlNjQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9iYXNlNjQoWm9kQmFzZTY0LCBwYXJhbXMpKTtcbiAgICBpbnN0LmJhc2U2NHVybCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2Jhc2U2NHVybChab2RCYXNlNjRVUkwsIHBhcmFtcykpO1xuICAgIGluc3QueGlkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5feGlkKFpvZFhJRCwgcGFyYW1zKSk7XG4gICAgaW5zdC5rc3VpZCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2tzdWlkKFpvZEtTVUlELCBwYXJhbXMpKTtcbiAgICBpbnN0LmlwdjQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9pcHY0KFpvZElQdjQsIHBhcmFtcykpO1xuICAgIGluc3QuaXB2NiA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2lwdjYoWm9kSVB2NiwgcGFyYW1zKSk7XG4gICAgaW5zdC5jaWRydjQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9jaWRydjQoWm9kQ0lEUnY0LCBwYXJhbXMpKTtcbiAgICBpbnN0LmNpZHJ2NiA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2NpZHJ2Nihab2RDSURSdjYsIHBhcmFtcykpO1xuICAgIGluc3QuZTE2NCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2UxNjQoWm9kRTE2NCwgcGFyYW1zKSk7XG4gICAgLy8gaXNvXG4gICAgaW5zdC5kYXRldGltZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGlzby5kYXRldGltZShwYXJhbXMpKTtcbiAgICBpbnN0LmRhdGUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhpc28uZGF0ZShwYXJhbXMpKTtcbiAgICBpbnN0LnRpbWUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhpc28udGltZShwYXJhbXMpKTtcbiAgICBpbnN0LmR1cmF0aW9uID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soaXNvLmR1cmF0aW9uKHBhcmFtcykpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9zdHJpbmcoWm9kU3RyaW5nLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFN0cmluZ0Zvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RTdHJpbmdGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIF9ab2RTdHJpbmcuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgWm9kRW1haWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRW1haWxcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEVtYWlsLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZW1haWwocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2VtYWlsKFpvZEVtYWlsLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEdVSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kR1VJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kR1VJRC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGd1aWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2d1aWQoWm9kR1VJRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RVVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFVVSURcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZFVVSUQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB1dWlkKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl91dWlkKFpvZFVVSUQsIHBhcmFtcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gdXVpZHY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl91dWlkdjQoWm9kVVVJRCwgcGFyYW1zKTtcbn1cbi8vIFpvZFVVSUR2NlxuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdXVpZHY2KFpvZFVVSUQsIHBhcmFtcyk7XG59XG4vLyBab2RVVUlEdjdcbmV4cG9ydCBmdW5jdGlvbiB1dWlkdjcocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3V1aWR2Nyhab2RVVUlELCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVSTCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RVUkxcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZFVSTC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHVybChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdXJsKFpvZFVSTCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBodHRwVXJsKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl91cmwoWm9kVVJMLCB7XG4gICAgICAgIHByb3RvY29sOiAvXmh0dHBzPyQvLFxuICAgICAgICBob3N0bmFtZTogY29yZS5yZWdleGVzLmRvbWFpbixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZEVtb2ppID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEVtb2ppXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RFbW9qaS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGVtb2ppKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9lbW9qaShab2RFbW9qaSwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2ROYW5vSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTmFub0lEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2ROYW5vSUQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBuYW5vaWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX25hbm9pZChab2ROYW5vSUQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQ1VJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RDVUlELmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gY3VpZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fY3VpZChab2RDVUlELCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZENVSUQyID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZENVSUQyXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RDVUlEMi5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGN1aWQyKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9jdWlkMihab2RDVUlEMiwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RVTElEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFVMSURcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZFVMSUQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB1bGlkKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl91bGlkKFpvZFVMSUQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kWElEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFhJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kWElELmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24geGlkKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl94aWQoWm9kWElELCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEtTVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEtTVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RLU1VJRC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGtzdWlkKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9rc3VpZChab2RLU1VJRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RJUHY0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZElQdjRcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZElQdjQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBpcHY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9pcHY0KFpvZElQdjQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kSVB2NiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RJUHY2XCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RJUHY2LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gaXB2NihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faXB2Nihab2RJUHY2LCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZENJRFJ2NCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDSURSdjRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RDSURSdjQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBjaWRydjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2NpZHJ2NChab2RDSURSdjQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQ0lEUnY2ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZENJRFJ2NlwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZENJRFJ2Ni5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGNpZHJ2NihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fY2lkcnY2KFpvZENJRFJ2NiwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RCYXNlNjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQmFzZTY0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RCYXNlNjQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2Jhc2U2NChab2RCYXNlNjQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQmFzZTY0VVJMID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEJhc2U2NFVSTFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kQmFzZTY0VVJMLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0dXJsKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9iYXNlNjR1cmwoWm9kQmFzZTY0VVJMLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEUxNjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRTE2NFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kRTE2NC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGUxNjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2UxNjQoWm9kRTE2NCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RKV1QgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSldUXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RKV1QuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBqd3QocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2p3dChab2RKV1QsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQ3VzdG9tU3RyaW5nRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEN1c3RvbVN0cmluZ0Zvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kQ3VzdG9tU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nRm9ybWF0KGZvcm1hdCwgZm5PclJlZ2V4LCBfcGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gY29yZS5fc3RyaW5nRm9ybWF0KFpvZEN1c3RvbVN0cmluZ0Zvcm1hdCwgZm9ybWF0LCBmbk9yUmVnZXgsIF9wYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhvc3RuYW1lKF9wYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fc3RyaW5nRm9ybWF0KFpvZEN1c3RvbVN0cmluZ0Zvcm1hdCwgXCJob3N0bmFtZVwiLCBjb3JlLnJlZ2V4ZXMuaG9zdG5hbWUsIF9wYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhleChfcGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3N0cmluZ0Zvcm1hdChab2RDdXN0b21TdHJpbmdGb3JtYXQsIFwiaGV4XCIsIGNvcmUucmVnZXhlcy5oZXgsIF9wYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc2goYWxnLCBwYXJhbXMpIHtcbiAgICBjb25zdCBlbmMgPSBwYXJhbXM/LmVuYyA/PyBcImhleFwiO1xuICAgIGNvbnN0IGZvcm1hdCA9IGAke2FsZ31fJHtlbmN9YDtcbiAgICBjb25zdCByZWdleCA9IGNvcmUucmVnZXhlc1tmb3JtYXRdO1xuICAgIGlmICghcmVnZXgpIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGhhc2ggZm9ybWF0OiAke2Zvcm1hdH1gKTtcbiAgICByZXR1cm4gY29yZS5fc3RyaW5nRm9ybWF0KFpvZEN1c3RvbVN0cmluZ0Zvcm1hdCwgZm9ybWF0LCByZWdleCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2ROdW1iZXIgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTnVtYmVyXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTnVtYmVyLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Lmd0ID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndCh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5ndGUgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5taW4gPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5sdCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHQodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubHRlID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubWF4ID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QuaW50ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soaW50KHBhcmFtcykpO1xuICAgIGluc3Quc2FmZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGludChwYXJhbXMpKTtcbiAgICBpbnN0LnBvc2l0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0KDAsIHBhcmFtcykpO1xuICAgIGluc3Qubm9ubmVnYXRpdmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKDAsIHBhcmFtcykpO1xuICAgIGluc3QubmVnYXRpdmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHQoMCwgcGFyYW1zKSk7XG4gICAgaW5zdC5ub25wb3NpdGl2ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdGUoMCwgcGFyYW1zKSk7XG4gICAgaW5zdC5tdWx0aXBsZU9mID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5tdWx0aXBsZU9mKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0LnN0ZXAgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLm11bHRpcGxlT2YodmFsdWUsIHBhcmFtcykpO1xuICAgIC8vIGluc3QuZmluaXRlID0gKHBhcmFtcykgPT4gaW5zdC5jaGVjayhjb3JlLmZpbml0ZShwYXJhbXMpKTtcbiAgICBpbnN0LmZpbml0ZSA9ICgpPT5pbnN0O1xuICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgaW5zdC5taW5WYWx1ZSA9IE1hdGgubWF4KGJhZy5taW5pbXVtID8/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSwgYmFnLmV4Y2x1c2l2ZU1pbmltdW0gPz8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKSA/PyBudWxsO1xuICAgIGluc3QubWF4VmFsdWUgPSBNYXRoLm1pbihiYWcubWF4aW11bSA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIGJhZy5leGNsdXNpdmVNYXhpbXVtID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkgPz8gbnVsbDtcbiAgICBpbnN0LmlzSW50ID0gKGJhZy5mb3JtYXQgPz8gXCJcIikuaW5jbHVkZXMoXCJpbnRcIikgfHwgTnVtYmVyLmlzU2FmZUludGVnZXIoYmFnLm11bHRpcGxlT2YgPz8gMC41KTtcbiAgICBpbnN0LmlzRmluaXRlID0gdHJ1ZTtcbiAgICBpbnN0LmZvcm1hdCA9IGJhZy5mb3JtYXQgPz8gbnVsbDtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG51bWJlcihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fbnVtYmVyKFpvZE51bWJlciwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2ROdW1iZXJGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTnVtYmVyRm9ybWF0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTnVtYmVyRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2ROdW1iZXIuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gaW50KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9pbnQoWm9kTnVtYmVyRm9ybWF0LCBwYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZsb2F0MzIocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2Zsb2F0MzIoWm9kTnVtYmVyRm9ybWF0LCBwYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZsb2F0NjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2Zsb2F0NjQoWm9kTnVtYmVyRm9ybWF0LCBwYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGludDMyKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9pbnQzMihab2ROdW1iZXJGb3JtYXQsIHBhcmFtcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gdWludDMyKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl91aW50MzIoWm9kTnVtYmVyRm9ybWF0LCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEJvb2xlYW4gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQm9vbGVhblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZEJvb2xlYW4uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gYm9vbGVhbihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fYm9vbGVhbihab2RCb29sZWFuLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEJpZ0ludCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RCaWdJbnRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RCaWdJbnQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuZ3RlID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubWluID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QuZ3QgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0KHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmd0ZSA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1pbiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmx0ID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdCh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5sdGUgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5tYXggPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5wb3NpdGl2ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndChCaWdJbnQoMCksIHBhcmFtcykpO1xuICAgIGluc3QubmVnYXRpdmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHQoQmlnSW50KDApLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5vbnBvc2l0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0ZShCaWdJbnQoMCksIHBhcmFtcykpO1xuICAgIGluc3Qubm9ubmVnYXRpdmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKEJpZ0ludCgwKSwgcGFyYW1zKSk7XG4gICAgaW5zdC5tdWx0aXBsZU9mID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5tdWx0aXBsZU9mKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgIGluc3QubWluVmFsdWUgPSBiYWcubWluaW11bSA/PyBudWxsO1xuICAgIGluc3QubWF4VmFsdWUgPSBiYWcubWF4aW11bSA/PyBudWxsO1xuICAgIGluc3QuZm9ybWF0ID0gYmFnLmZvcm1hdCA/PyBudWxsO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gYmlnaW50KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9iaWdpbnQoWm9kQmlnSW50LCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEJpZ0ludEZvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RCaWdJbnRGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RCaWdJbnRGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZEJpZ0ludC5pbml0KGluc3QsIGRlZik7XG59KTtcbi8vIGludDY0XG5leHBvcnQgZnVuY3Rpb24gaW50NjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2ludDY0KFpvZEJpZ0ludEZvcm1hdCwgcGFyYW1zKTtcbn1cbi8vIHVpbnQ2NFxuZXhwb3J0IGZ1bmN0aW9uIHVpbnQ2NChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdWludDY0KFpvZEJpZ0ludEZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RTeW1ib2wgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kU3ltYm9sXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kU3ltYm9sLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHN5bWJvbChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fc3ltYm9sKFpvZFN5bWJvbCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RVbmRlZmluZWQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVW5kZWZpbmVkXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kVW5kZWZpbmVkLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZnVuY3Rpb24gX3VuZGVmaW5lZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdW5kZWZpbmVkKFpvZFVuZGVmaW5lZCwgcGFyYW1zKTtcbn1cbmV4cG9ydCB7IF91bmRlZmluZWQgYXMgdW5kZWZpbmVkIH07XG5leHBvcnQgY29uc3QgWm9kTnVsbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROdWxsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTnVsbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmZ1bmN0aW9uIF9udWxsKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9udWxsKFpvZE51bGwsIHBhcmFtcyk7XG59XG5leHBvcnQgeyBfbnVsbCBhcyBudWxsIH07XG5leHBvcnQgY29uc3QgWm9kQW55ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEFueVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZEFueS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBhbnkoKSB7XG4gICAgcmV0dXJuIGNvcmUuX2FueShab2RBbnkpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVua25vd24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVW5rbm93blwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFVua25vd24uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdW5rbm93bigpIHtcbiAgICByZXR1cm4gY29yZS5fdW5rbm93bihab2RVbmtub3duKTtcbn1cbmV4cG9ydCBjb25zdCBab2ROZXZlciA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROZXZlclwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE5ldmVyLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG5ldmVyKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9uZXZlcihab2ROZXZlciwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RWb2lkID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFZvaWRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RWb2lkLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZnVuY3Rpb24gX3ZvaWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3ZvaWQoWm9kVm9pZCwgcGFyYW1zKTtcbn1cbmV4cG9ydCB7IF92b2lkIGFzIHZvaWQgfTtcbmV4cG9ydCBjb25zdCBab2REYXRlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZERhdGVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2REYXRlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Lm1pbiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1heCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBjb25zdCBjID0gaW5zdC5fem9kLmJhZztcbiAgICBpbnN0Lm1pbkRhdGUgPSBjLm1pbmltdW0gPyBuZXcgRGF0ZShjLm1pbmltdW0pIDogbnVsbDtcbiAgICBpbnN0Lm1heERhdGUgPSBjLm1heGltdW0gPyBuZXcgRGF0ZShjLm1heGltdW0pIDogbnVsbDtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGUocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2RhdGUoWm9kRGF0ZSwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RBcnJheSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RBcnJheVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZEFycmF5LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LmVsZW1lbnQgPSBkZWYuZWxlbWVudDtcbiAgICBpbnN0Lm1pbiA9IChtaW5MZW5ndGgsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLm1pbkxlbmd0aChtaW5MZW5ndGgsIHBhcmFtcykpO1xuICAgIGluc3Qubm9uZW1wdHkgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubWluTGVuZ3RoKDEsIHBhcmFtcykpO1xuICAgIGluc3QubWF4ID0gKG1heExlbmd0aCwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubWF4TGVuZ3RoKG1heExlbmd0aCwgcGFyYW1zKSk7XG4gICAgaW5zdC5sZW5ndGggPSAobGVuLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sZW5ndGgobGVuLCBwYXJhbXMpKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0LmVsZW1lbnQ7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBhcnJheShlbGVtZW50LCBwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fYXJyYXkoWm9kQXJyYXksIGVsZW1lbnQsIHBhcmFtcyk7XG59XG4vLyAua2V5b2ZcbmV4cG9ydCBmdW5jdGlvbiBrZXlvZihzY2hlbWEpIHtcbiAgICBjb25zdCBzaGFwZSA9IHNjaGVtYS5fem9kLmRlZi5zaGFwZTtcbiAgICByZXR1cm4gX2VudW0oT2JqZWN0LmtleXMoc2hhcGUpKTtcbn1cbmV4cG9ydCBjb25zdCBab2RPYmplY3QgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kT2JqZWN0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kT2JqZWN0SklULmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdCwgXCJzaGFwZVwiLCAoKT0+e1xuICAgICAgICByZXR1cm4gZGVmLnNoYXBlO1xuICAgIH0pO1xuICAgIGluc3Qua2V5b2YgPSAoKT0+X2VudW0oT2JqZWN0LmtleXMoaW5zdC5fem9kLmRlZi5zaGFwZSkpO1xuICAgIGluc3QuY2F0Y2hhbGwgPSAoY2F0Y2hhbGwpPT5pbnN0LmNsb25lKHtcbiAgICAgICAgICAgIC4uLmluc3QuX3pvZC5kZWYsXG4gICAgICAgICAgICBjYXRjaGFsbDogY2F0Y2hhbGxcbiAgICAgICAgfSk7XG4gICAgaW5zdC5wYXNzdGhyb3VnaCA9ICgpPT5pbnN0LmNsb25lKHtcbiAgICAgICAgICAgIC4uLmluc3QuX3pvZC5kZWYsXG4gICAgICAgICAgICBjYXRjaGFsbDogdW5rbm93bigpXG4gICAgICAgIH0pO1xuICAgIGluc3QubG9vc2UgPSAoKT0+aW5zdC5jbG9uZSh7XG4gICAgICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IHVua25vd24oKVxuICAgICAgICB9KTtcbiAgICBpbnN0LnN0cmljdCA9ICgpPT5pbnN0LmNsb25lKHtcbiAgICAgICAgICAgIC4uLmluc3QuX3pvZC5kZWYsXG4gICAgICAgICAgICBjYXRjaGFsbDogbmV2ZXIoKVxuICAgICAgICB9KTtcbiAgICBpbnN0LnN0cmlwID0gKCk9Pmluc3QuY2xvbmUoe1xuICAgICAgICAgICAgLi4uaW5zdC5fem9kLmRlZixcbiAgICAgICAgICAgIGNhdGNoYWxsOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgaW5zdC5leHRlbmQgPSAoaW5jb21pbmcpPT57XG4gICAgICAgIHJldHVybiB1dGlsLmV4dGVuZChpbnN0LCBpbmNvbWluZyk7XG4gICAgfTtcbiAgICBpbnN0LnNhZmVFeHRlbmQgPSAoaW5jb21pbmcpPT57XG4gICAgICAgIHJldHVybiB1dGlsLnNhZmVFeHRlbmQoaW5zdCwgaW5jb21pbmcpO1xuICAgIH07XG4gICAgaW5zdC5tZXJnZSA9IChvdGhlcik9PnV0aWwubWVyZ2UoaW5zdCwgb3RoZXIpO1xuICAgIGluc3QucGljayA9IChtYXNrKT0+dXRpbC5waWNrKGluc3QsIG1hc2spO1xuICAgIGluc3Qub21pdCA9IChtYXNrKT0+dXRpbC5vbWl0KGluc3QsIG1hc2spO1xuICAgIGluc3QucGFydGlhbCA9ICguLi5hcmdzKT0+dXRpbC5wYXJ0aWFsKFpvZE9wdGlvbmFsLCBpbnN0LCBhcmdzWzBdKTtcbiAgICBpbnN0LnJlcXVpcmVkID0gKC4uLmFyZ3MpPT51dGlsLnJlcXVpcmVkKFpvZE5vbk9wdGlvbmFsLCBpbnN0LCBhcmdzWzBdKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdChzaGFwZSwgcGFyYW1zKSB7XG4gICAgY29uc3QgZGVmID0ge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBzaGFwZTogc2hhcGUgPz8ge30sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9O1xuICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KGRlZik7XG59XG4vLyBzdHJpY3RPYmplY3RcbmV4cG9ydCBmdW5jdGlvbiBzdHJpY3RPYmplY3Qoc2hhcGUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgc2hhcGUsXG4gICAgICAgIGNhdGNoYWxsOiBuZXZlcigpLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyBsb29zZU9iamVjdFxuZXhwb3J0IGZ1bmN0aW9uIGxvb3NlT2JqZWN0KHNoYXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHNoYXBlLFxuICAgICAgICBjYXRjaGFsbDogdW5rbm93bigpLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kVW5pb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVW5pb25cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RVbmlvbi5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5vcHRpb25zID0gZGVmLm9wdGlvbnM7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB1bmlvbihvcHRpb25zLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZFVuaW9uKHtcbiAgICAgICAgdHlwZTogXCJ1bmlvblwiLFxuICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kRGlzY3JpbWluYXRlZFVuaW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIFpvZFVuaW9uLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2REaXNjcmltaW5hdGVkVW5pb24uaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZGlzY3JpbWluYXRlZFVuaW9uKGRpc2NyaW1pbmF0b3IsIG9wdGlvbnMsIHBhcmFtcykge1xuICAgIC8vIGNvbnN0IFtvcHRpb25zLCBwYXJhbXNdID0gYXJncztcbiAgICByZXR1cm4gbmV3IFpvZERpc2NyaW1pbmF0ZWRVbmlvbih7XG4gICAgICAgIHR5cGU6IFwidW5pb25cIixcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgZGlzY3JpbWluYXRvcixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZEludGVyc2VjdGlvbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RJbnRlcnNlY3Rpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RJbnRlcnNlY3Rpb24uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gaW50ZXJzZWN0aW9uKGxlZnQsIHJpZ2h0KSB7XG4gICAgcmV0dXJuIG5ldyBab2RJbnRlcnNlY3Rpb24oe1xuICAgICAgICB0eXBlOiBcImludGVyc2VjdGlvblwiLFxuICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICByaWdodDogcmlnaHRcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RUdXBsZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RUdXBsZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFR1cGxlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnJlc3QgPSAocmVzdCk9Pmluc3QuY2xvbmUoe1xuICAgICAgICAgICAgLi4uaW5zdC5fem9kLmRlZixcbiAgICAgICAgICAgIHJlc3Q6IHJlc3RcbiAgICAgICAgfSk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB0dXBsZShpdGVtcywgX3BhcmFtc09yUmVzdCwgX3BhcmFtcykge1xuICAgIGNvbnN0IGhhc1Jlc3QgPSBfcGFyYW1zT3JSZXN0IGluc3RhbmNlb2YgY29yZS4kWm9kVHlwZTtcbiAgICBjb25zdCBwYXJhbXMgPSBoYXNSZXN0ID8gX3BhcmFtcyA6IF9wYXJhbXNPclJlc3Q7XG4gICAgY29uc3QgcmVzdCA9IGhhc1Jlc3QgPyBfcGFyYW1zT3JSZXN0IDogbnVsbDtcbiAgICByZXR1cm4gbmV3IFpvZFR1cGxlKHtcbiAgICAgICAgdHlwZTogXCJ0dXBsZVwiLFxuICAgICAgICBpdGVtczogaXRlbXMsXG4gICAgICAgIHJlc3QsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RSZWNvcmQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kUmVjb3JkXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kUmVjb3JkLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LmtleVR5cGUgPSBkZWYua2V5VHlwZTtcbiAgICBpbnN0LnZhbHVlVHlwZSA9IGRlZi52YWx1ZVR5cGU7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiByZWNvcmQoa2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZFJlY29yZCh7XG4gICAgICAgIHR5cGU6IFwicmVjb3JkXCIsXG4gICAgICAgIGtleVR5cGUsXG4gICAgICAgIHZhbHVlVHlwZTogdmFsdWVUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vLyB0eXBlIGFsa3NqZiA9IGNvcmUub3V0cHV0PGNvcmUuJFpvZFJlY29yZEtleT47XG5leHBvcnQgZnVuY3Rpb24gcGFydGlhbFJlY29yZChrZXlUeXBlLCB2YWx1ZVR5cGUsIHBhcmFtcykge1xuICAgIGNvbnN0IGsgPSBjb3JlLmNsb25lKGtleVR5cGUpO1xuICAgIGsuX3pvZC52YWx1ZXMgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG5ldyBab2RSZWNvcmQoe1xuICAgICAgICB0eXBlOiBcInJlY29yZFwiLFxuICAgICAgICBrZXlUeXBlOiBrLFxuICAgICAgICB2YWx1ZVR5cGU6IHZhbHVlVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZE1hcCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RNYXBcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RNYXAuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3Qua2V5VHlwZSA9IGRlZi5rZXlUeXBlO1xuICAgIGluc3QudmFsdWVUeXBlID0gZGVmLnZhbHVlVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG1hcChrZXlUeXBlLCB2YWx1ZVR5cGUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kTWFwKHtcbiAgICAgICAgdHlwZTogXCJtYXBcIixcbiAgICAgICAga2V5VHlwZToga2V5VHlwZSxcbiAgICAgICAgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RTZXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kU2V0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kU2V0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Lm1pbiA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjb3JlLl9taW5TaXplKC4uLmFyZ3MpKTtcbiAgICBpbnN0Lm5vbmVtcHR5ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fbWluU2l6ZSgxLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1heCA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjb3JlLl9tYXhTaXplKC4uLmFyZ3MpKTtcbiAgICBpbnN0LnNpemUgPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY29yZS5fc2l6ZSguLi5hcmdzKSk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBzZXQodmFsdWVUeXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZFNldCh7XG4gICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgIHZhbHVlVHlwZTogdmFsdWVUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kRW51bSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RFbnVtXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kRW51bS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5lbnVtID0gZGVmLmVudHJpZXM7XG4gICAgaW5zdC5vcHRpb25zID0gT2JqZWN0LnZhbHVlcyhkZWYuZW50cmllcyk7XG4gICAgY29uc3Qga2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoZGVmLmVudHJpZXMpKTtcbiAgICBpbnN0LmV4dHJhY3QgPSAodmFsdWVzLCBwYXJhbXMpPT57XG4gICAgICAgIGNvbnN0IG5ld0VudHJpZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpe1xuICAgICAgICAgICAgaWYgKGtleXMuaGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIG5ld0VudHJpZXNbdmFsdWVdID0gZGVmLmVudHJpZXNbdmFsdWVdO1xuICAgICAgICAgICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihgS2V5ICR7dmFsdWV9IG5vdCBmb3VuZCBpbiBlbnVtYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RFbnVtKHtcbiAgICAgICAgICAgIC4uLmRlZixcbiAgICAgICAgICAgIGNoZWNrczogW10sXG4gICAgICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICAgICAgZW50cmllczogbmV3RW50cmllc1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGluc3QuZXhjbHVkZSA9ICh2YWx1ZXMsIHBhcmFtcyk9PntcbiAgICAgICAgY29uc3QgbmV3RW50cmllcyA9IHtcbiAgICAgICAgICAgIC4uLmRlZi5lbnRyaWVzXG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKXtcbiAgICAgICAgICAgIGlmIChrZXlzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbmV3RW50cmllc1t2YWx1ZV07XG4gICAgICAgICAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKGBLZXkgJHt2YWx1ZX0gbm90IGZvdW5kIGluIGVudW1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFpvZEVudW0oe1xuICAgICAgICAgICAgLi4uZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgICAgICBlbnRyaWVzOiBuZXdFbnRyaWVzXG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIF9lbnVtKHZhbHVlcywgcGFyYW1zKSB7XG4gICAgY29uc3QgZW50cmllcyA9IEFycmF5LmlzQXJyYXkodmFsdWVzKSA/IE9iamVjdC5mcm9tRW50cmllcyh2YWx1ZXMubWFwKCh2KT0+W1xuICAgICAgICAgICAgdixcbiAgICAgICAgICAgIHZcbiAgICAgICAgXSkpIDogdmFsdWVzO1xuICAgIHJldHVybiBuZXcgWm9kRW51bSh7XG4gICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICBlbnRyaWVzLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgeyBfZW51bSBhcyBlbnVtIH07XG4vKiogQGRlcHJlY2F0ZWQgVGhpcyBBUEkgaGFzIGJlZW4gbWVyZ2VkIGludG8gYHouZW51bSgpYC4gVXNlIGB6LmVudW0oKWAgaW5zdGVhZC5cbiAqXG4gKiBgYGB0c1xuICogZW51bSBDb2xvcnMgeyByZWQsIGdyZWVuLCBibHVlIH1cbiAqIHouZW51bShDb2xvcnMpO1xuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUVudW0oZW50cmllcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RFbnVtKHtcbiAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgIGVudHJpZXMsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RMaXRlcmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZExpdGVyYWxcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RMaXRlcmFsLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnZhbHVlcyA9IG5ldyBTZXQoZGVmLnZhbHVlcyk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwidmFsdWVcIiwge1xuICAgICAgICBnZXQgKCkge1xuICAgICAgICAgICAgaWYgKGRlZi52YWx1ZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgc2NoZW1hIGNvbnRhaW5zIG11bHRpcGxlIHZhbGlkIGxpdGVyYWwgdmFsdWVzLiBVc2UgYC52YWx1ZXNgIGluc3RlYWQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlZi52YWx1ZXNbMF07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGxpdGVyYWwodmFsdWUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kTGl0ZXJhbCh7XG4gICAgICAgIHR5cGU6IFwibGl0ZXJhbFwiLFxuICAgICAgICB2YWx1ZXM6IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICBdLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kRmlsZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RGaWxlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kRmlsZS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5taW4gPSAoc2l6ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9taW5TaXplKHNpemUsIHBhcmFtcykpO1xuICAgIGluc3QubWF4ID0gKHNpemUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fbWF4U2l6ZShzaXplLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1pbWUgPSAodHlwZXMsIHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fbWltZShBcnJheS5pc0FycmF5KHR5cGVzKSA/IHR5cGVzIDogW1xuICAgICAgICAgICAgdHlwZXNcbiAgICAgICAgXSwgcGFyYW1zKSk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBmaWxlKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9maWxlKFpvZEZpbGUsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kVHJhbnNmb3JtID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFRyYW5zZm9ybVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFRyYW5zZm9ybS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGlmIChfY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS4kWm9kRW5jb2RlRXJyb3IoaW5zdC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLmFkZElzc3VlID0gKGlzc3VlKT0+e1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpc3N1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2godXRpbC5pc3N1ZShpc3N1ZSwgcGF5bG9hZC52YWx1ZSwgZGVmKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZvciBab2QgMyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgICAgIGNvbnN0IF9pc3N1ZSA9IGlzc3VlO1xuICAgICAgICAgICAgICAgIGlmIChfaXNzdWUuZmF0YWwpIF9pc3N1ZS5jb250aW51ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIF9pc3N1ZS5jb2RlID8/IChfaXNzdWUuY29kZSA9IFwiY3VzdG9tXCIpO1xuICAgICAgICAgICAgICAgIF9pc3N1ZS5pbnB1dCA/PyAoX2lzc3VlLmlucHV0ID0gcGF5bG9hZC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgX2lzc3VlLmluc3QgPz8gKF9pc3N1ZS5pbnN0ID0gaW5zdCk7XG4gICAgICAgICAgICAgICAgLy8gX2lzc3VlLmNvbnRpbnVlID8/PSB0cnVlO1xuICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2godXRpbC5pc3N1ZShfaXNzdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gZGVmLnRyYW5zZm9ybShwYXlsb2FkLnZhbHVlLCBwYXlsb2FkKTtcbiAgICAgICAgaWYgKG91dHB1dCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQudGhlbigob3V0cHV0KT0+e1xuICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0gb3V0cHV0O1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtKGZuKSB7XG4gICAgcmV0dXJuIG5ldyBab2RUcmFuc2Zvcm0oe1xuICAgICAgICB0eXBlOiBcInRyYW5zZm9ybVwiLFxuICAgICAgICB0cmFuc2Zvcm06IGZuXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kT3B0aW9uYWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kT3B0aW9uYWxcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RPcHRpb25hbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5pbm5lclR5cGU7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbChpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IFpvZE9wdGlvbmFsKHtcbiAgICAgICAgdHlwZTogXCJvcHRpb25hbFwiLFxuICAgICAgICBpbm5lclR5cGU6IGlubmVyVHlwZVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZE51bGxhYmxlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE51bGxhYmxlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTnVsbGFibGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuX3pvZC5kZWYuaW5uZXJUeXBlO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbnVsbGFibGUoaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBab2ROdWxsYWJsZSh7XG4gICAgICAgIHR5cGU6IFwibnVsbGFibGVcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGVcbiAgICB9KTtcbn1cbi8vIG51bGxpc2hcbmV4cG9ydCBmdW5jdGlvbiBudWxsaXNoKGlubmVyVHlwZSkge1xuICAgIHJldHVybiBvcHRpb25hbChudWxsYWJsZShpbm5lclR5cGUpKTtcbn1cbmV4cG9ydCBjb25zdCBab2REZWZhdWx0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZERlZmF1bHRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2REZWZhdWx0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbiAgICBpbnN0LnJlbW92ZURlZmF1bHQgPSBpbnN0LnVud3JhcDtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIF9kZWZhdWx0KGlubmVyVHlwZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBab2REZWZhdWx0KHtcbiAgICAgICAgdHlwZTogXCJkZWZhdWx0XCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlLFxuICAgICAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBkZWZhdWx0VmFsdWUoKSA6IHV0aWwuc2hhbGxvd0Nsb25lKGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RQcmVmYXVsdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RQcmVmYXVsdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFByZWZhdWx0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHByZWZhdWx0KGlubmVyVHlwZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBab2RQcmVmYXVsdCh7XG4gICAgICAgIHR5cGU6IFwicHJlZmF1bHRcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGUsXG4gICAgICAgIGdldCBkZWZhdWx0VmFsdWUgKCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGRlZmF1bHRWYWx1ZSgpIDogdXRpbC5zaGFsbG93Q2xvbmUoZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZE5vbk9wdGlvbmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE5vbk9wdGlvbmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTm9uT3B0aW9uYWwuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuX3pvZC5kZWYuaW5uZXJUeXBlO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbm9ub3B0aW9uYWwoaW5uZXJUeXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZE5vbk9wdGlvbmFsKHtcbiAgICAgICAgdHlwZTogXCJub25vcHRpb25hbFwiLFxuICAgICAgICBpbm5lclR5cGU6IGlubmVyVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFN1Y2Nlc3MgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kU3VjY2Vzc1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFN1Y2Nlc3MuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuX3pvZC5kZWYuaW5uZXJUeXBlO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gc3VjY2Vzcyhpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IFpvZFN1Y2Nlc3Moe1xuICAgICAgICB0eXBlOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGVcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RDYXRjaCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDYXRjaFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZENhdGNoLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbiAgICBpbnN0LnJlbW92ZUNhdGNoID0gaW5zdC51bndyYXA7XG59KTtcbmZ1bmN0aW9uIF9jYXRjaChpbm5lclR5cGUsIGNhdGNoVmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IFpvZENhdGNoKHtcbiAgICAgICAgdHlwZTogXCJjYXRjaFwiLFxuICAgICAgICBpbm5lclR5cGU6IGlubmVyVHlwZSxcbiAgICAgICAgY2F0Y2hWYWx1ZTogdHlwZW9mIGNhdGNoVmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGNhdGNoVmFsdWUgOiAoKT0+Y2F0Y2hWYWx1ZVxuICAgIH0pO1xufVxuZXhwb3J0IHsgX2NhdGNoIGFzIGNhdGNoIH07XG5leHBvcnQgY29uc3QgWm9kTmFOID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE5hTlwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE5hTi5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBuYW4ocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX25hbihab2ROYU4sIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kUGlwZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RQaXBlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kUGlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5pbiA9IGRlZi5pbjtcbiAgICBpbnN0Lm91dCA9IGRlZi5vdXQ7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBwaXBlKGluXywgb3V0KSB7XG4gICAgcmV0dXJuIG5ldyBab2RQaXBlKHtcbiAgICAgICAgdHlwZTogXCJwaXBlXCIsXG4gICAgICAgIGluOiBpbl8sXG4gICAgICAgIG91dDogb3V0XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kQ29kZWMgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQ29kZWNcIiwgKGluc3QsIGRlZik9PntcbiAgICBab2RQaXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RDb2RlYy5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBjb2RlYyhpbl8sIG91dCwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RDb2RlYyh7XG4gICAgICAgIHR5cGU6IFwicGlwZVwiLFxuICAgICAgICBpbjogaW5fLFxuICAgICAgICBvdXQ6IG91dCxcbiAgICAgICAgdHJhbnNmb3JtOiBwYXJhbXMuZGVjb2RlLFxuICAgICAgICByZXZlcnNlVHJhbnNmb3JtOiBwYXJhbXMuZW5jb2RlXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kUmVhZG9ubHkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kUmVhZG9ubHlcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RSZWFkb25seS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5pbm5lclR5cGU7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiByZWFkb25seShpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IFpvZFJlYWRvbmx5KHtcbiAgICAgICAgdHlwZTogXCJyZWFkb25seVwiLFxuICAgICAgICBpbm5lclR5cGU6IGlubmVyVHlwZVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFRlbXBsYXRlTGl0ZXJhbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RUZW1wbGF0ZUxpdGVyYWxcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RUZW1wbGF0ZUxpdGVyYWwuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVMaXRlcmFsKHBhcnRzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZFRlbXBsYXRlTGl0ZXJhbCh7XG4gICAgICAgIHR5cGU6IFwidGVtcGxhdGVfbGl0ZXJhbFwiLFxuICAgICAgICBwYXJ0cyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZExhenkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTGF6eVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZExhenkuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuX3pvZC5kZWYuZ2V0dGVyKCk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBsYXp5KGdldHRlcikge1xuICAgIHJldHVybiBuZXcgWm9kTGF6eSh7XG4gICAgICAgIHR5cGU6IFwibGF6eVwiLFxuICAgICAgICBnZXR0ZXI6IGdldHRlclxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFByb21pc2UgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kUHJvbWlzZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFByb21pc2UuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuX3pvZC5kZWYuaW5uZXJUeXBlO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gcHJvbWlzZShpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IFpvZFByb21pc2Uoe1xuICAgICAgICB0eXBlOiBcInByb21pc2VcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGVcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RGdW5jdGlvbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RGdW5jdGlvblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZEZ1bmN0aW9uLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIF9mdW5jdGlvbihwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZEZ1bmN0aW9uKHtcbiAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICBpbnB1dDogQXJyYXkuaXNBcnJheShwYXJhbXM/LmlucHV0KSA/IHR1cGxlKHBhcmFtcz8uaW5wdXQpIDogcGFyYW1zPy5pbnB1dCA/PyBhcnJheSh1bmtub3duKCkpLFxuICAgICAgICBvdXRwdXQ6IHBhcmFtcz8ub3V0cHV0ID8/IHVua25vd24oKVxuICAgIH0pO1xufVxuZXhwb3J0IHsgX2Z1bmN0aW9uIGFzIGZ1bmN0aW9uIH07XG5leHBvcnQgY29uc3QgWm9kQ3VzdG9tID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEN1c3RvbVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZEN1c3RvbS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbi8vIGN1c3RvbSBjaGVja3NcbmV4cG9ydCBmdW5jdGlvbiBjaGVjayhmbikge1xuICAgIGNvbnN0IGNoID0gbmV3IGNvcmUuJFpvZENoZWNrKHtcbiAgICAgICAgY2hlY2s6IFwiY3VzdG9tXCJcbiAgICB9KTtcbiAgICBjaC5fem9kLmNoZWNrID0gZm47XG4gICAgcmV0dXJuIGNoO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGN1c3RvbShmbiwgX3BhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9jdXN0b20oWm9kQ3VzdG9tLCBmbiA/PyAoKCk9PnRydWUpLCBfcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWZpbmUoZm4sIF9wYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiBjb3JlLl9yZWZpbmUoWm9kQ3VzdG9tLCBmbiwgX3BhcmFtcyk7XG59XG4vLyBzdXBlclJlZmluZVxuZXhwb3J0IGZ1bmN0aW9uIHN1cGVyUmVmaW5lKGZuKSB7XG4gICAgcmV0dXJuIGNvcmUuX3N1cGVyUmVmaW5lKGZuKTtcbn1cbmZ1bmN0aW9uIF9pbnN0YW5jZW9mKGNscywgcGFyYW1zID0ge1xuICAgIGVycm9yOiBgSW5wdXQgbm90IGluc3RhbmNlIG9mICR7Y2xzLm5hbWV9YFxufSkge1xuICAgIGNvbnN0IGluc3QgPSBuZXcgWm9kQ3VzdG9tKHtcbiAgICAgICAgdHlwZTogXCJjdXN0b21cIixcbiAgICAgICAgY2hlY2s6IFwiY3VzdG9tXCIsXG4gICAgICAgIGZuOiAoZGF0YSk9PmRhdGEgaW5zdGFuY2VvZiBjbHMsXG4gICAgICAgIGFib3J0OiB0cnVlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmJhZy5DbGFzcyA9IGNscztcbiAgICByZXR1cm4gaW5zdDtcbn1cbmV4cG9ydCB7IF9pbnN0YW5jZW9mIGFzIGluc3RhbmNlb2YgfTtcbi8vIHN0cmluZ2Jvb2xcbmV4cG9ydCBjb25zdCBzdHJpbmdib29sID0gKC4uLmFyZ3MpPT5jb3JlLl9zdHJpbmdib29sKHtcbiAgICAgICAgQ29kZWM6IFpvZENvZGVjLFxuICAgICAgICBCb29sZWFuOiBab2RCb29sZWFuLFxuICAgICAgICBTdHJpbmc6IFpvZFN0cmluZ1xuICAgIH0sIC4uLmFyZ3MpO1xuZXhwb3J0IGZ1bmN0aW9uIGpzb24ocGFyYW1zKSB7XG4gICAgY29uc3QganNvblNjaGVtYSA9IGxhenkoKCk9PntcbiAgICAgICAgcmV0dXJuIHVuaW9uKFtcbiAgICAgICAgICAgIHN0cmluZyhwYXJhbXMpLFxuICAgICAgICAgICAgbnVtYmVyKCksXG4gICAgICAgICAgICBib29sZWFuKCksXG4gICAgICAgICAgICBfbnVsbCgpLFxuICAgICAgICAgICAgYXJyYXkoanNvblNjaGVtYSksXG4gICAgICAgICAgICByZWNvcmQoc3RyaW5nKCksIGpzb25TY2hlbWEpXG4gICAgICAgIF0pO1xuICAgIH0pO1xuICAgIHJldHVybiBqc29uU2NoZW1hO1xufVxuLy8gcHJlcHJvY2Vzc1xuLy8gLyoqIEBkZXByZWNhdGVkIFVzZSBgei5waXBlKClgIGFuZCBgei50cmFuc2Zvcm0oKWAgaW5zdGVhZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwcm9jZXNzKGZuLCBzY2hlbWEpIHtcbiAgICByZXR1cm4gcGlwZSh0cmFuc2Zvcm0oZm4pLCBzY2hlbWEpO1xufVxuIiwgImltcG9ydCB7IGRlZmluZUhvb2ssIGdldFdyaXRhYmxlIH0gZnJvbSBcIndvcmtmbG93XCI7XG5pbXBvcnQgKiBhcyB6IGZyb20gXCJ6b2RcIjtcbi8qKl9faW50ZXJuYWxfd29ya2Zsb3dze1wid29ya2Zsb3dzXCI6e1wid29ya2Zsb3dzL2hvb2tzLnRzXCI6e1wiY29sbGVjdFdpdGhIb29rXCI6e1wid29ya2Zsb3dJZFwiOlwid29ya2Zsb3cvL3dvcmtmbG93cy9ob29rcy50cy8vY29sbGVjdFdpdGhIb29rXCJ9fX0sXCJzdGVwc1wiOntcIndvcmtmbG93cy9ob29rcy50c1wiOntcIndyaXRlRXZlbnRcIjp7XCJzdGVwSWRcIjpcInN0ZXAvL3dvcmtmbG93cy9ob29rcy50cy8vd3JpdGVFdmVudFwifX19fSovO1xuZXhwb3J0IGNvbnN0IEhvb2sgPSBkZWZpbmVIb29rKHtcbiAgICBzY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgICAgZGF0YTogei5zdHJpbmcoKSxcbiAgICAgICAgZG9uZTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgICAgbWV0YWRhdGE6IHoudW5rbm93bigpXG4gICAgfSlcbn0pO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RXaXRoSG9vayh0b2tlbiwgY3VzdG9tRGF0YSkge1xuICAgIGNvbnN0IGhvb2sgPSBIb29rLmNyZWF0ZSh7XG4gICAgICAgIHRva2VuLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgY3VzdG9tRGF0YVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY29sbGVjdGVkID0gW107XG4gICAgY29uc3Qgd2YgPSBnZXRXcml0YWJsZSgpO1xuICAgIGF3YWl0IHdyaXRlRXZlbnQod2YsICdob29rQ3JlYXRlZCcpO1xuICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2YgaG9vayl7XG4gICAgICAgIGF3YWl0IHdyaXRlRXZlbnQod2YsICdob29rUmVzdW1lZCcsIGV2ZW50KTtcbiAgICAgICAgY29sbGVjdGVkLnB1c2goZXZlbnQpO1xuICAgICAgICBpZiAoZXZlbnQuZG9uZSkgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbGxlY3RlZFxuICAgIH07XG59XG5jb2xsZWN0V2l0aEhvb2sud29ya2Zsb3dJZCA9IFwid29ya2Zsb3cvL3dvcmtmbG93cy9ob29rcy50cy8vY29sbGVjdFdpdGhIb29rXCI7XG5nbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KFwid29ya2Zsb3cvL3dvcmtmbG93cy9ob29rcy50cy8vY29sbGVjdFdpdGhIb29rXCIsIGNvbGxlY3RXaXRoSG9vayk7XG52YXIgd3JpdGVFdmVudCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvL3dvcmtmbG93cy9ob29rcy50cy8vd3JpdGVFdmVudFwiKTtcbiIsICIvKipfX2ludGVybmFsX3dvcmtmbG93c3tcIndvcmtmbG93c1wiOntcIndvcmtmbG93cy9udWxsLWJ5dGUudHNcIjp7XCJudWxsQnl0ZVdvcmtmbG93XCI6e1wid29ya2Zsb3dJZFwiOlwid29ya2Zsb3cvL3dvcmtmbG93cy9udWxsLWJ5dGUudHMvL251bGxCeXRlV29ya2Zsb3dcIn19fSxcInN0ZXBzXCI6e1wid29ya2Zsb3dzL251bGwtYnl0ZS50c1wiOntcIm51bGxCeXRlU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vd29ya2Zsb3dzL251bGwtYnl0ZS50cy8vbnVsbEJ5dGVTdGVwXCJ9fX19Ki87XG52YXIgbnVsbEJ5dGVTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vd29ya2Zsb3dzL251bGwtYnl0ZS50cy8vbnVsbEJ5dGVTdGVwXCIpO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG51bGxCeXRlV29ya2Zsb3coKSB7XG4gICAgY29uc3QgYSA9IGF3YWl0IG51bGxCeXRlU3RlcCgpO1xuICAgIHJldHVybiBhO1xufVxubnVsbEJ5dGVXb3JrZmxvdy53b3JrZmxvd0lkID0gXCJ3b3JrZmxvdy8vd29ya2Zsb3dzL251bGwtYnl0ZS50cy8vbnVsbEJ5dGVXb3JrZmxvd1wiO1xuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldChcIndvcmtmbG93Ly93b3JrZmxvd3MvbnVsbC1ieXRlLnRzLy9udWxsQnl0ZVdvcmtmbG93XCIsIG51bGxCeXRlV29ya2Zsb3cpO1xuIiwgIi8qKl9faW50ZXJuYWxfd29ya2Zsb3dze1wid29ya2Zsb3dzXCI6e1wid29ya2Zsb3dzL2FkZGl0aW9uLnRzXCI6e1wiYWRkaXRpb25cIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vd29ya2Zsb3dzL2FkZGl0aW9uLnRzLy9hZGRpdGlvblwifX19LFwic3RlcHNcIjp7XCJ3b3JrZmxvd3MvYWRkaXRpb24udHNcIjp7XCJhZGRcIjp7XCJzdGVwSWRcIjpcInN0ZXAvL3dvcmtmbG93cy9hZGRpdGlvbi50cy8vYWRkXCJ9fX19Ki87XG52YXIgYWRkID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vd29ya2Zsb3dzL2FkZGl0aW9uLnRzLy9hZGRcIik7XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkaXRpb24obnVtLCBudW0yKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYWRkKG51bSwgbnVtMik7XG4gICAgY29uc29sZS5sb2coe1xuICAgICAgICByZXN1bHRcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuYWRkaXRpb24ud29ya2Zsb3dJZCA9IFwid29ya2Zsb3cvL3dvcmtmbG93cy9hZGRpdGlvbi50cy8vYWRkaXRpb25cIjtcbmdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cy5zZXQoXCJ3b3JrZmxvdy8vd29ya2Zsb3dzL2FkZGl0aW9uLnRzLy9hZGRpdGlvblwiLCBhZGRpdGlvbik7XG4iLCAiaW1wb3J0IHsgRmF0YWxFcnJvciB9IGZyb20gXCJ3b3JrZmxvd1wiO1xuLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJ3b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50c1wiOntcInJldHJ5YWJsZUFuZEZhdGFsRXJyb3JXb3JrZmxvd1wiOntcIndvcmtmbG93SWRcIjpcIndvcmtmbG93Ly93b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50cy8vcmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93XCJ9fX0sXCJzdGVwc1wiOntcIndvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLnRzXCI6e1wic3RlcFRoYXRGYWlsc1wiOntcInN0ZXBJZFwiOlwic3RlcC8vd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwudHMvL3N0ZXBUaGF0RmFpbHNcIn0sXCJzdGVwVGhhdFRocm93c1JldHJ5YWJsZUVycm9yXCI6e1wic3RlcElkXCI6XCJzdGVwLy93b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50cy8vc3RlcFRoYXRUaHJvd3NSZXRyeWFibGVFcnJvclwifX19fSovO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJldHJ5YWJsZUFuZEZhdGFsRXJyb3JXb3JrZmxvdygpIHtcbiAgICBjb25zdCByZXRyeWFibGVSZXN1bHQgPSBhd2FpdCBzdGVwVGhhdFRocm93c1JldHJ5YWJsZUVycm9yKCk7XG4gICAgbGV0IGdvdEZhdGFsRXJyb3IgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdGVwVGhhdEZhaWxzKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKEZhdGFsRXJyb3IuaXMoZXJyb3IpKSB7XG4gICAgICAgICAgICBnb3RGYXRhbEVycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICByZXRyeWFibGVSZXN1bHQsXG4gICAgICAgIGdvdEZhdGFsRXJyb3JcbiAgICB9O1xufVxucmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93LndvcmtmbG93SWQgPSBcIndvcmtmbG93Ly93b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50cy8vcmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93XCI7XG5nbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KFwid29ya2Zsb3cvL3dvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLnRzLy9yZXRyeWFibGVBbmRGYXRhbEVycm9yV29ya2Zsb3dcIiwgcmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93KTtcbnZhciBzdGVwVGhhdFRocm93c1JldHJ5YWJsZUVycm9yID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwudHMvL3N0ZXBUaGF0VGhyb3dzUmV0cnlhYmxlRXJyb3JcIik7XG52YXIgc3RlcFRoYXRGYWlscyA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvL3dvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLnRzLy9zdGVwVGhhdEZhaWxzXCIpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQSx3RUFBQUEsU0FBQTtBQUVJLFFBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJ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U1QsU0FBUyxNQUFNQSxRQUFPLFFBQVE7QUFDakMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxNQUFNQSxRQUFPLFFBQVE7QUFDakMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxRQUFRQSxRQUFPLFFBQVE7QUFDbkMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBVGdCO0FBVVQsU0FBUyxRQUFRQSxRQUFPLFFBQVE7QUFDbkMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBVGdCO0FBVVQsU0FBUyxRQUFRQSxRQUFPLFFBQVE7QUFDbkMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBVGdCO0FBVVQsU0FBUyxLQUFLQSxRQUFPLFFBQVE7QUFDaEMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBU0MsUUFBT0QsUUFBTyxRQUFRO0FBQ2xDLFNBQU8sSUFBSUEsT0FBTTtBQUFBLElBQ2IsTUFBTTtBQUFBLElBQ04sUUFBUTtBQUFBLElBQ1IsT0FBTztBQUFBLElBQ1AsT0FBTztBQUFBLElBQ1AsR0FBUSxnQkFBZ0IsTUFBTTtBQUFBLEVBQ2xDLENBQUM7QUFDTDtBQVJnQixPQUFBQyxTQUFBO0FBU1QsU0FBUyxRQUFRRCxRQUFPLFFBQVE7QUFDbkMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxNQUFNQSxRQUFPLFFBQVE7QUFDakMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxPQUFPQSxRQUFPLFFBQVE7QUFDbEMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxNQUFNQSxRQUFPLFFBQVE7QUFDakMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxLQUFLQSxRQUFPLFFBQVE7QUFDaEMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxPQUFPQSxRQUFPLFFBQVE7QUFDbEMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxNQUFNQSxRQUFPLFFBQVE7QUFDakMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxNQUFNQSxRQUFPLFFBQVE7QUFDakMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxRQUFRQSxRQUFPLFFBQVE7QUFDbkMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxRQUFRQSxRQUFPLFFBQVE7QUFDbkMsU0FBTyxJQUFJQSxPQUFNO0FBQUEs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M0UsRUFBSyxTQUFTLEtBQUssTUFBTSxHQUFHO0FBQzVCLGtCQUFnQixLQUFLLE1BQU0sR0FBRztBQUNsQyxDQUFDO0FBSU0sSUFBTSxVQUF3QixnQkFBSyxhQUFhLFdBQVcsQ0FBQyxNQUFNLFFBQU07QUFFM0UsRUFBSyxTQUFTLEtBQUssTUFBTSxHQUFHO0FBQzVCLGtCQUFnQixLQUFLLE1BQU0sR0FBRztBQUNsQyxDQUFDO0FBZU0sSUFBTSxTQUF1QixnQkFBSyxhQUFhLFVBQVUsQ0FBQyxNQUFNLFFBQU07QUFFekUsRUFBSyxRQUFRLEtBQUssTUFBTSxHQUFHO0FBQzNCLGtCQUFnQixLQUFLLE1BQU0sR0FBRztBQUNsQyxDQUFDO0FBV00sSUFBTSxXQUF5QixnQkFBSyxhQUFhLFlBQVksQ0FBQyxNQUFNLFFBQU07QUFFN0UsRUFBSyxVQUFVLEtBQUssTUFBTSxHQUFHO0FBQzdCLGtCQUFnQixLQUFLLE1BQU0sR0FBRztBQUNsQyxDQUFDO0FBSU0sSUFBTSxZQUEwQixnQkFBSyxhQUFhLGFBQWEsQ0FBQyxNQUFNLFFBQU07QUFFL0UsRUFBSyxXQUFXLEtBQUssTUFBTSxHQUFHO0FBQzlCLGtCQUFnQixLQUFLLE1BQU0sR0FBRztBQUNsQyxDQUFDO0FBSU0sSUFBTSxVQUF3QixnQkFBSyxhQUFhLFdBQVcsQ0FBQyxNQUFNLFFBQU07QUFFM0UsRUFBSyxTQUFTLEtBQUssTUFBTSxHQUFHO0FBQzVCLGtCQUFnQixLQUFLLE1BQU0sR0FBRztBQUNsQyxDQUFDO0FBSU0sSUFBTSxXQUF5QixnQkFBSyxhQUFhLFlBQVksQ0FBQyxNQUFNLFFBQU07QUFFN0UsRUFBSyxVQUFVLEtBQUssTUFBTSxHQUFHO0FBQzdCLGtCQUFnQixLQUFLLE1BQU0sR0FBRztBQUNsQyxDQUFDO0FBSU0sSUFBTSxVQUF3QixnQkFBSyxhQUFhLFdBQVcsQ0FBQyxNQUFNLFFBQU07QUFFM0UsRUFBSyxTQUFTLEtBQUssTUFBTSxHQUFHO0FBQzVCLGtCQUFnQixLQUFLLE1BQU0sR0FBRztBQUNsQyxDQUFDO0FBSU0sSUFBTSxTQUF1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QUFJLG1CQUFtQixDQUFDLEVBQUUsNENBQTRDO0FBQzNHLGVBQXNCLG1CQUFtQjtBQUNyQyxRQUFNLElBQUksTUFBTSxhQUFhO0FBQzdCLFNBQU87QUFDWDtBQUhzQjtBQUl0QixpQkFBaUIsYUFBYTtBQUM5QixXQUFXLG9CQUFvQixJQUFJLHNEQUFzRCxnQkFBZ0I7OztBQ056RyxJQUFJLE1BQU0sV0FBVyxPQUFPLElBQUksbUJBQW1CLENBQUMsRUFBRSxrQ0FBa0M7QUFDeEYsZUFBc0IsU0FBUyxLQUFLLE1BQU07QUFDdEMsUUFBTSxTQUFTLE1BQU0sSUFBSSxLQUFLLElBQUk7QUFDbEMsVUFBUSxJQUFJO0FBQUEsSUFDUjtBQUFBLEVBQ0osQ0FBQztBQUNELFNBQU87QUFDWDtBQU5zQjtBQU90QixTQUFTLGFBQWE7QUFDdEIsV0FBVyxvQkFBb0IsSUFBSSw2Q0FBNkMsUUFBUTs7O0FDUnhGLGVBQXNCLGlDQUFpQztBQUNuRCxRQUFNLGtCQUFrQixNQUFNLDZCQUE2QjtBQUMzRCxNQUFJLGdCQUFnQjtBQUNwQixNQUFJO0FBQ0EsVUFBTSxjQUFjO0FBQUEsRUFDeEIsU0FBUyxPQUFPO0FBQ1osUUFBSSxXQUFXLEdBQUcsS0FBSyxHQUFHO0FBQ3RCLHNCQUFnQjtBQUFBLElBQ3BCO0FBQUEsRUFDSjtBQUNBLFNBQU87QUFBQSxJQUNIO0FBQUEsSUFDQTtBQUFBLEVBQ0o7QUFDSjtBQWRzQjtBQWV0QiwrQkFBK0IsYUFBYTtBQUM1QyxXQUFXLG9CQUFvQixJQUFJLDhFQUE4RSw4QkFBOEI7QUFDL0ksSUFBSSwrQkFBK0IsV0FBVyxPQUFPLElBQUksbUJBQW1CLENBQUMsRUFBRSxzRUFBc0U7QUFDckosSUFBSSxnQkFBZ0IsV0FBVyxPQUFPLElBQUksbUJBQW1CLENBQUMsRUFBRSx1REFBdUQ7IiwKICAibmFtZXMiOiBbIm1vZHVsZSIsICJwYXJzZSIsICJtcyIsICJpbml0aWFsaXplciIsICJhcnJheSIsICJvYmplY3QiLCAiQ2xhc3MiLCAiY29uZmlnIiwgImJhc2U2NCIsICJiYXNlNjR1cmwiLCAiaXNzdWUiLCAiZXJyb3IiLCAidmVyc2lvbiIsICJ0aW1lIiwgImluc3QiLCAiY2hlY2tzIiwgImNoZWNrUmVzdWx0IiwgImNhbmFyeSIsICJyZXN1bHQiLCAiXyIsICJpbnN0IiwgImJhc2U2NCIsICJyZXN1bHQiLCAiciIsICJpc09iamVjdCIsICJhbGxvd3NFdmFsIiwgInJlc3VsdHMiLCAibGVmdCIsICJyaWdodCIsICJvdXRwdXQiLCAicmVzdWx0IiwgInJlc3VsdCIsICJyaWdodCIsICJsZWZ0IiwgInIiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiX2Vtb2ppIiwgIkNsYXNzIiwgIkNsYXNzIiwgIkNsYXNzIiwgIkNsYXNzIiwgIkNsYXNzIiwgImlzc3VlIiwgImRhdGV0aW1lIiwgImRhdGUiLCAidGltZSIsICJkdXJhdGlvbiIsICJpbml0aWFsaXplciIsICJpc3N1ZSIsICJpc3N1ZXMiLCAicGFyc2UiLCAicGFyc2VBc3luYyIsICJzYWZlUGFyc2UiLCAic2FmZVBhcnNlQXN5bmMiLCAiZGVmIiwgInBhcnNlIiwgInNhZmVQYXJzZSIsICJwYXJzZUFzeW5jIiwgInNhZmVQYXJzZUFzeW5jIiwgIl9lbW9qaSIsICJkYXRldGltZSIsICJkYXRlIiwgInRpbWUiLCAiZHVyYXRpb24iLCAic3RyaW5nIiwgImJvb2xlYW4iLCAiaXNzdWUiLCAib3V0cHV0IiwgInN0cmluZyIsICJib29sZWFuIl0KfQo=
47095
+
47096
+ // workflows/null-byte.ts
47097
+ var nullByteStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflows/null-byte.ts//nullByteStep");
47098
+ async function nullByteWorkflow() {
47099
+ const a = await nullByteStep();
47100
+ return a;
47101
+ }
47102
+ __name(nullByteWorkflow, "nullByteWorkflow");
47103
+ nullByteWorkflow.workflowId = "workflow//workflows/null-byte.ts//nullByteWorkflow";
47104
+ globalThis.__private_workflows.set("workflow//workflows/null-byte.ts//nullByteWorkflow", nullByteWorkflow);
47105
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21zQDIuMS4zL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJ3b3JrZmxvd3Mvbm9vcC50cyIsICJ3b3JrZmxvd3MvYWRkaXRpb24udHMiLCAiLi4vdXRpbHMvc3JjL2luZGV4LnRzIiwgIi4uL2Vycm9ycy9zcmMvaW5kZXgudHMiLCAiLi4vY29yZS9zcmMvc3ltYm9scy50cyIsICIuLi9jb3JlL3NyYy93b3JrZmxvdy9jcmVhdGUtaG9vay50cyIsICIuLi9jb3JlL3NyYy93b3JrZmxvdy9kZWZpbmUtaG9vay50cyIsICIuLi9jb3JlL3NyYy93b3JrZmxvdy93cml0YWJsZS1zdHJlYW0udHMiLCAiLi4vd29ya2Zsb3cvc3JjL3N0ZGxpYi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvY29yZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvdXRpbC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvZXJyb3JzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9wYXJzZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvcmVnZXhlcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvY2hlY2tzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9kb2MuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjEuMTEvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3ZlcnNpb25zLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9zY2hlbWFzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9yZWdpc3RyaWVzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9hcGkuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjEuMTEvbm9kZV9tb2R1bGVzL3pvZC92NC9jbGFzc2ljL2lzby5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NsYXNzaWMvZXJyb3JzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY2xhc3NpYy9wYXJzZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NsYXNzaWMvc2NoZW1hcy5qcyIsICJ3b3JrZmxvd3MvaG9va3MudHMiLCAid29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwudHMiLCAid29ya2Zsb3dzL251bGwtYnl0ZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBIZWxwZXJzLlxuICovIHZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB3ID0gZCAqIDc7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqLyBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArIEpTT04uc3RyaW5naWZ5KHZhbCkpO1xufTtcbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovIGZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICAgIHN0ciA9IFN0cmluZyhzdHIpO1xuICAgIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKHN0cik7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gICAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgICBzd2l0Y2godHlwZSl7XG4gICAgICAgIGNhc2UgJ3llYXJzJzpcbiAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgIGNhc2UgJ3lycyc6XG4gICAgICAgIGNhc2UgJ3lyJzpcbiAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHk7XG4gICAgICAgIGNhc2UgJ3dlZWtzJzpcbiAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiB3O1xuICAgICAgICBjYXNlICdkYXlzJzpcbiAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIGQ7XG4gICAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNhc2UgJ2hycyc6XG4gICAgICAgIGNhc2UgJ2hyJzpcbiAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIGg7XG4gICAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICBjYXNlICdtaW5zJzpcbiAgICAgICAgY2FzZSAnbWluJzpcbiAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIG07XG4gICAgICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICBjYXNlICdzZWNzJzpcbiAgICAgICAgY2FzZSAnc2VjJzpcbiAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHM7XG4gICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnbXNlY3MnOlxuICAgICAgICBjYXNlICdtc2VjJzpcbiAgICAgICAgY2FzZSAnbXMnOlxuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi8gZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gICAgaWYgKG1zQWJzID49IGQpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IGgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IG0pIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IHMpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgICB9XG4gICAgcmV0dXJuIG1zICsgJ21zJztcbn1cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqLyBmdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gICAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICAgIGlmIChtc0FicyA+PSBkKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBoKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gbSkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gcykge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICAgIH1cbiAgICByZXR1cm4gbXMgKyAnIG1zJztcbn1cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi8gZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICAgIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG59XG4iLCAiLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJ3b3JrZmxvd3Mvbm9vcC50c1wiOntcImJyb2tlbldmXCI6e1wid29ya2Zsb3dJZFwiOlwid29ya2Zsb3cvL3dvcmtmbG93cy9ub29wLnRzLy9icm9rZW5XZlwifX19LFwic3RlcHNcIjp7XCJ3b3JrZmxvd3Mvbm9vcC50c1wiOntcIm5vb3BcIjp7XCJzdGVwSWRcIjpcInN0ZXAvL3dvcmtmbG93cy9ub29wLnRzLy9ub29wXCJ9fX19Ki87XG5leHBvcnQgdmFyIG5vb3AgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy93b3JrZmxvd3Mvbm9vcC50cy8vbm9vcFwiKTtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBicm9rZW5XZigpIHtcbiAgICBjb25zdCBudW1iZXJzID0gW107XG4gICAge1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgMTA7IGkrKyl7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKG5vb3AoaSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdhd2FpdCAxMCcpO1xuICAgICAgICBudW1iZXJzLnB1c2goLi4uYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKTtcbiAgICB9XG4gICAge1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgMTAwOyBpKyspe1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChub29wKDEwMDAgKyBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ2F3YWl0IDEwMCcpO1xuICAgICAgICBudW1iZXJzLnB1c2goLi4uYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coJ2RvbmUuJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbnVtYmVyc1xuICAgIH07XG59XG5icm9rZW5XZi53b3JrZmxvd0lkID0gXCJ3b3JrZmxvdy8vd29ya2Zsb3dzL25vb3AudHMvL2Jyb2tlbldmXCI7XG5nbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KFwid29ya2Zsb3cvL3dvcmtmbG93cy9ub29wLnRzLy9icm9rZW5XZlwiLCBicm9rZW5XZik7XG4iLCAiLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJ3b3JrZmxvd3MvYWRkaXRpb24udHNcIjp7XCJhZGRpdGlvblwiOntcIndvcmtmbG93SWRcIjpcIndvcmtmbG93Ly93b3JrZmxvd3MvYWRkaXRpb24udHMvL2FkZGl0aW9uXCJ9fX0sXCJzdGVwc1wiOntcIndvcmtmbG93cy9hZGRpdGlvbi50c1wiOntcImFkZFwiOntcInN0ZXBJZFwiOlwic3RlcC8vd29ya2Zsb3dzL2FkZGl0aW9uLnRzLy9hZGRcIn19fX0qLztcbnZhciBhZGQgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy93b3JrZmxvd3MvYWRkaXRpb24udHMvL2FkZFwiKTtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRpdGlvbihudW0sIG51bTIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhZGQobnVtLCBudW0yKTtcbiAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgIHJlc3VsdFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5hZGRpdGlvbi53b3JrZmxvd0lkID0gXCJ3b3JrZmxvdy8vd29ya2Zsb3dzL2FkZGl0aW9uLnRzLy9hZGRpdGlvblwiO1xuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldChcIndvcmtmbG93Ly93b3JrZmxvd3MvYWRkaXRpb24udHMvL2FkZGl0aW9uXCIsIGFkZGl0aW9uKTtcbiIsICJpbXBvcnQgdHlwZSB7IFN0cmluZ1ZhbHVlIH0gZnJvbSAnbXMnO1xuaW1wb3J0IG1zIGZyb20gJ21zJztcblxuZXhwb3J0IGludGVyZmFjZSBQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gIHByb21pc2U6IFByb21pc2U8VD47XG4gIHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBvbHlmaWxsIGZvciBgUHJvbWlzZS53aXRoUmVzb2x2ZXJzKClgLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJvbWlzZS93aXRoUmVzb2x2ZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUmVzb2x2ZXJzPFQ+KCk6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+IHtcbiAgbGV0IHJlc29sdmUhOiAodmFsdWU6IFQpID0+IHZvaWQ7XG4gIGxldCByZWplY3QhOiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgcmVzb2x2ZSA9IF9yZXNvbHZlO1xuICAgIHJlamVjdCA9IF9yZWplY3Q7XG4gIH0pO1xuICByZXR1cm4geyBwcm9taXNlLCByZXNvbHZlLCByZWplY3QgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF6aWx5LWV2YWx1YXRlZCwgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uXG4gKlxuICogVGhlIHJldHVybmVkIG9iamVjdCBleHBvc2VzIGEgYHZhbHVlYCBnZXR0ZXIgdGhhdCBjYWxscyBgZm5gIG9ubHkgb25jZSxcbiAqIGNhY2hlcyBpdHMgcmVzdWx0LCBhbmQgcmV0dXJucyB0aGUgY2FjaGVkIHZhbHVlIG9uIHN1YnNlcXVlbnQgYWNjZXNzZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBwcm92aWRlZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmbiAtIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb25jZSBhbmQgd2hvc2UgcmVzdWx0IHdpbGwgYmUgY2FjaGVkLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBgdmFsdWVgIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0aGUgbWVtb2l6ZWQgcmVzdWx0IG9mIGBmbmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmNlPFQ+KGZuOiAoKSA9PiBUKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZuKCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCAndmFsdWUnLCB7IHZhbHVlIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gIH07XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgZHVyYXRpb24gcGFyYW1ldGVyIChzdHJpbmcsIG51bWJlciwgb3IgRGF0ZSkgYW5kIHJldHVybnMgYSBEYXRlIG9iamVjdFxuICogcmVwcmVzZW50aW5nIHdoZW4gdGhlIGR1cmF0aW9uIHNob3VsZCBlbGFwc2UuXG4gKlxuICogLSBGb3Igc3RyaW5nczogUGFyc2VzIGR1cmF0aW9uIHN0cmluZ3MgbGlrZSBcIjFzXCIsIFwiNW1cIiwgXCIxaFwiLCBldGMuIHVzaW5nIHRoZSBgbXNgIGxpYnJhcnlcbiAqIC0gRm9yIG51bWJlcnM6IFRyZWF0cyBhcyBtaWxsaXNlY29uZHMgZnJvbSBub3dcbiAqIC0gRm9yIERhdGUgb2JqZWN0czogUmV0dXJucyB0aGUgZGF0ZSBkaXJlY3RseSAoaGFuZGxlcyBib3RoIERhdGUgaW5zdGFuY2VzIGFuZCBkYXRlLWxpa2Ugb2JqZWN0cyBmcm9tIGRlc2VyaWFsaXphdGlvbilcbiAqXG4gKiBAcGFyYW0gcGFyYW0gLSBUaGUgZHVyYXRpb24gcGFyYW1ldGVyIChTdHJpbmdWYWx1ZSwgRGF0ZSwgb3IgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcylcbiAqIEByZXR1cm5zIEEgRGF0ZSBvYmplY3QgcmVwcmVzZW50aW5nIHdoZW4gdGhlIGR1cmF0aW9uIHNob3VsZCBlbGFwc2VcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcGFyYW1ldGVyIGlzIGludmFsaWQgb3IgY2Fubm90IGJlIHBhcnNlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEdXJhdGlvblRvRGF0ZShwYXJhbTogU3RyaW5nVmFsdWUgfCBEYXRlIHwgbnVtYmVyKTogRGF0ZSB7XG4gIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZHVyYXRpb25NcyA9IG1zKHBhcmFtKTtcbiAgICBpZiAodHlwZW9mIGR1cmF0aW9uTXMgIT09ICdudW1iZXInIHx8IGR1cmF0aW9uTXMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGR1cmF0aW9uOiBcIiR7cGFyYW19XCIuIEV4cGVjdGVkIGEgdmFsaWQgZHVyYXRpb24gc3RyaW5nIGxpa2UgXCIxc1wiLCBcIjFtXCIsIFwiMWhcIiwgZXRjLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpICsgZHVyYXRpb25Ncyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnbnVtYmVyJykge1xuICAgIGlmIChwYXJhbSA8IDAgfHwgIU51bWJlci5pc0Zpbml0ZShwYXJhbSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgZHVyYXRpb246ICR7cGFyYW19LiBFeHBlY3RlZCBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5ub3coKSArIHBhcmFtKTtcbiAgfSBlbHNlIGlmIChcbiAgICBwYXJhbSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAocGFyYW0gJiZcbiAgICAgIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHR5cGVvZiAocGFyYW0gYXMgYW55KS5nZXRUaW1lID09PSAnZnVuY3Rpb24nKVxuICApIHtcbiAgICAvLyBIYW5kbGUgYm90aCBEYXRlIGluc3RhbmNlcyBhbmQgZGF0ZS1saWtlIG9iamVjdHMgKGZyb20gZGVzZXJpYWxpemF0aW9uKVxuICAgIHJldHVybiBwYXJhbSBpbnN0YW5jZW9mIERhdGUgPyBwYXJhbSA6IG5ldyBEYXRlKChwYXJhbSBhcyBhbnkpLmdldFRpbWUoKSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgZHVyYXRpb24gcGFyYW1ldGVyLiBFeHBlY3RlZCBhIGR1cmF0aW9uIHN0cmluZywgbnVtYmVyIChtaWxsaXNlY29uZHMpLCBvciBEYXRlIG9iamVjdC5gXG4gICAgKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IHBhcnNlRHVyYXRpb25Ub0RhdGUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBTdHJ1Y3R1cmVkRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHR5cGUgeyBTdHJpbmdWYWx1ZSB9IGZyb20gJ21zJztcblxuY29uc3QgQkFTRV9VUkwgPSAnaHR0cHM6Ly91c2V3b3JrZmxvdy5kZXYvZXJyJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIENoZWNrIGlmIGEgdmFsdWUgaXMgYW4gRXJyb3Igd2l0aG91dCByZWx5aW5nIG9uIE5vZGUuanMgdXRpbGl0aWVzLlxuICogVGhpcyBpcyBuZWVkZWQgZm9yIGVycm9yIGNsYXNzZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBWTSBjb250ZXh0cyB3aGVyZVxuICogTm9kZS5qcyBpbXBvcnRzIGFyZSBub3QgYXZhaWxhYmxlLlxuICovXG5mdW5jdGlvbiBpc0Vycm9yKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgeyBuYW1lOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAnbmFtZScgaW4gdmFsdWUgJiZcbiAgICAnbWVzc2FnZScgaW4gdmFsdWVcbiAgKTtcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEFsbCB0aGUgc2x1Z3Mgb2YgdGhlIGVycm9ycyB1c2VkIGZvciBkb2N1bWVudGF0aW9uIGxpbmtzLlxuICovXG5leHBvcnQgY29uc3QgRVJST1JfU0xVR1MgPSB7XG4gIE5PREVfSlNfTU9EVUxFX0lOX1dPUktGTE9XOiAnbm9kZS1qcy1tb2R1bGUtaW4td29ya2Zsb3cnLFxuICBTVEFSVF9JTlZBTElEX1dPUktGTE9XX0ZVTkNUSU9OOiAnc3RhcnQtaW52YWxpZC13b3JrZmxvdy1mdW5jdGlvbicsXG4gIFNFUklBTElaQVRJT05fRkFJTEVEOiAnc2VyaWFsaXphdGlvbi1mYWlsZWQnLFxuICBXRUJIT09LX0lOVkFMSURfUkVTUE9ORF9XSVRIX1ZBTFVFOiAnd2ViaG9vay1pbnZhbGlkLXJlc3BvbmQtd2l0aC12YWx1ZScsXG4gIFdFQkhPT0tfUkVTUE9OU0VfTk9UX1NFTlQ6ICd3ZWJob29rLXJlc3BvbnNlLW5vdC1zZW50JyxcbiAgRkVUQ0hfSU5fV09SS0ZMT1dfRlVOQ1RJT046ICdmZXRjaC1pbi13b3JrZmxvdycsXG59IGFzIGNvbnN0O1xuXG50eXBlIEVycm9yU2x1ZyA9ICh0eXBlb2YgRVJST1JfU0xVR1MpW2tleW9mIHR5cGVvZiBFUlJPUl9TTFVHU107XG5cbmludGVyZmFjZSBXb3JrZmxvd0Vycm9yT3B0aW9ucyBleHRlbmRzIEVycm9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgc2x1ZyBvZiB0aGUgZXJyb3IuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgbGluayB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbi5cbiAgICovXG4gIHNsdWc/OiBFcnJvclNsdWc7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBXb3JrZmxvdy1yZWxhdGVkIGVycm9ycy5cbiAqXG4gKiBUaGlzIGVycm9yIGlzIHRocm93biBieSB0aGUgV29ya2Zsb3cgRGV2S2l0IHdoZW4gaW50ZXJuYWwgb3BlcmF0aW9ucyBmYWlsLlxuICogWW91IGNhbiB1c2UgdGhpcyBjbGFzcyB3aXRoIGBpbnN0YW5jZW9mYCB0byBjYXRjaCBhbnkgV29ya2Zsb3cgRGV2S2l0IGVycm9yLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogdHJ5IHtcbiAqICAgYXdhaXQgZ2V0UnVuKHJ1bklkKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdvcmtmbG93RXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdXb3JrZmxvdyBEZXZLaXQgZXJyb3I6JywgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgY2F1c2U/OiB1bmtub3duO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IFdvcmtmbG93RXJyb3JPcHRpb25zKSB7XG4gICAgY29uc3QgbXNnRG9jcyA9IG9wdGlvbnM/LnNsdWdcbiAgICAgID8gYCR7bWVzc2FnZX1cXG5cXG5MZWFybiBtb3JlOiAke0JBU0VfVVJMfS8ke29wdGlvbnMuc2x1Z31gXG4gICAgICA6IG1lc3NhZ2U7XG4gICAgc3VwZXIobXNnRG9jcywgeyBjYXVzZTogb3B0aW9ucz8uY2F1c2UgfSk7XG4gICAgdGhpcy5jYXVzZSA9IG9wdGlvbnM/LmNhdXNlO1xuXG4gICAgaWYgKG9wdGlvbnM/LmNhdXNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRoaXMuc3RhY2sgPSBgJHt0aGlzLnN0YWNrfVxcbkNhdXNlZCBieTogJHtvcHRpb25zLmNhdXNlLnN0YWNrfWA7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya2Zsb3dFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd0Vycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgV29ya2Zsb3cgQVBJIHJlcXVlc3QgZmFpbHMuXG4gKlxuICogVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBIVFRQIHJlcXVlc3RzIHRvIHRoZSBXb3JrZmxvdyBiYWNrZW5kIGZhaWwsXG4gKiB0eXBpY2FsbHkgZHVlIHRvIG5ldHdvcmsgaXNzdWVzLCBpbnZhbGlkIHJlcXVlc3RzLCBvciBzZXJ2ZXIgZXJyb3JzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogdHJ5IHtcbiAqICAgYXdhaXQgc3RhcnRXb3JrZmxvdygnbXlXb3JrZmxvdycsIGlucHV0KTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdvcmtmbG93QVBJRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKGBBUEkgZXJyb3IgKCR7ZXJyb3Iuc3RhdHVzfSk6YCwgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dBUElFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICBzdGF0dXM/OiBudW1iZXI7XG4gIGNvZGU/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgc3RhdHVzPzogbnVtYmVyOyB1cmw/OiBzdHJpbmc7IGNvZGU/OiBzdHJpbmc7IGNhdXNlPzogdW5rbm93biB9XG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIHtcbiAgICAgIGNhdXNlOiBvcHRpb25zPy5jYXVzZSxcbiAgICB9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dBUElFcnJvcic7XG4gICAgdGhpcy5zdGF0dXMgPSBvcHRpb25zPy5zdGF0dXM7XG4gICAgdGhpcy5jb2RlID0gb3B0aW9ucz8uY29kZTtcbiAgICB0aGlzLnVybCA9IG9wdGlvbnM/LnVybDtcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtmbG93QVBJRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dBUElFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHdvcmtmbG93IHJ1biBmYWlscyBkdXJpbmcgZXhlY3V0aW9uLlxuICpcbiAqIFRoaXMgZXJyb3IgaW5kaWNhdGVzIHRoYXQgdGhlIHdvcmtmbG93IGVuY291bnRlcmVkIGEgZmF0YWwgZXJyb3JcbiAqIGFuZCBjYW5ub3QgY29udGludWUuIFRoZSBgY2F1c2VgIHByb3BlcnR5IGNvbnRhaW5zIHRoZSB1bmRlcmx5aW5nXG4gKiBlcnJvciB3aXRoIGl0cyBtZXNzYWdlLCBzdGFjayB0cmFjZSwgYW5kIG9wdGlvbmFsIGVycm9yIGNvZGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICogY29uc3QgcnVuID0gYXdhaXQgZ2V0UnVuKHJ1bklkKTtcbiAqIGlmIChydW4uc3RhdHVzID09PSAnZmFpbGVkJykge1xuICogICAvLyBXb3JrZmxvd1J1bkZhaWxlZEVycm9yIHdpbGwgYmUgdGhyb3duXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93UnVuRmFpbGVkRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd0Vycm9yIHtcbiAgcnVuSWQ6IHN0cmluZztcbiAgZGVjbGFyZSBjYXVzZTogRXJyb3IgJiB7IGNvZGU/OiBzdHJpbmcgfTtcblxuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nLCBlcnJvcjogU3RydWN0dXJlZEVycm9yKSB7XG4gICAgLy8gQ3JlYXRlIGEgcHJvcGVyIEVycm9yIGluc3RhbmNlIGZyb20gdGhlIFN0cnVjdHVyZWRFcnJvciB0byBzZXQgYXMgY2F1c2VcbiAgICAvLyBOT1RFOiBjdXN0b20gZXJyb3IgdHlwZXMgZG8gbm90IGdldCBzZXJpYWxpemVkL2Rlc2VyaWFsaXplZC4gRXZlcnl0aGluZyBpcyBhbiBFcnJvclxuICAgIGNvbnN0IGNhdXNlRXJyb3IgPSBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgaWYgKGVycm9yLnN0YWNrKSB7XG4gICAgICBjYXVzZUVycm9yLnN0YWNrID0gZXJyb3Iuc3RhY2s7XG4gICAgfVxuICAgIGlmIChlcnJvci5jb2RlKSB7XG4gICAgICAoY2F1c2VFcnJvciBhcyBhbnkpLmNvZGUgPSBlcnJvci5jb2RlO1xuICAgIH1cblxuICAgIHN1cGVyKGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIGZhaWxlZDogJHtlcnJvci5tZXNzYWdlfWAsIHtcbiAgICAgIGNhdXNlOiBjYXVzZUVycm9yLFxuICAgIH0pO1xuICAgIHRoaXMubmFtZSA9ICdXb3JrZmxvd1J1bkZhaWxlZEVycm9yJztcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd1J1bkZhaWxlZEVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ1dvcmtmbG93UnVuRmFpbGVkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBnZXQgcmVzdWx0cyBmcm9tIGFuIGluY29tcGxldGUgd29ya2Zsb3cgcnVuLlxuICpcbiAqIFRoaXMgZXJyb3Igb2NjdXJzIHdoZW4geW91IHRyeSB0byBhY2Nlc3MgdGhlIHJlc3VsdCBvZiBhIHdvcmtmbG93XG4gKiB0aGF0IGlzIHN0aWxsIHJ1bm5pbmcgb3IgaGFzbid0IGNvbXBsZXRlZCB5ZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1J1bk5vdENvbXBsZXRlZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcsIHN0YXR1czogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFdvcmtmbG93IHJ1biBcIiR7cnVuSWR9XCIgaGFzIG5vdCBjb21wbGV0ZWRgLCB7fSk7XG4gICAgdGhpcy5uYW1lID0gJ1dvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3InO1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dSdW5Ob3RDb21wbGV0ZWRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgV29ya2Zsb3cgcnVudGltZSBlbmNvdW50ZXJzIGFuIGludGVybmFsIGVycm9yLlxuICpcbiAqIFRoaXMgZXJyb3IgaW5kaWNhdGVzIGFuIGlzc3VlIHdpdGggd29ya2Zsb3cgZXhlY3V0aW9uLCBzdWNoIGFzXG4gKiBzZXJpYWxpemF0aW9uIGZhaWx1cmVzLCBzdGFydGluZyBhbiBpbnZhbGlkIHdvcmtmbG93IGZ1bmN0aW9uLCBvclxuICogb3RoZXIgcnVudGltZSBwcm9ibGVtcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93UnVudGltZUVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IFdvcmtmbG93RXJyb3JPcHRpb25zKSB7XG4gICAgc3VwZXIobWVzc2FnZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dSdW50aW1lRXJyb3InO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya2Zsb3dSdW50aW1lRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dSdW50aW1lRXJyb3InO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd0Vycm9yIHtcbiAgcnVuSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFdvcmtmbG93IHJ1biBcIiR7cnVuSWR9XCIgbm90IGZvdW5kYCwge30pO1xuICAgIHRoaXMubmFtZSA9ICdXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3InO1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3InO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1J1bkNhbmNlbGxlZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7XG4gIHJ1bklkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIGNhbmNlbGxlZGAsIHt9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvcic7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd1J1bkNhbmNlbGxlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEEgZmF0YWwgZXJyb3IgaXMgYW4gZXJyb3IgdGhhdCBjYW5ub3QgYmUgcmV0cmllZC5cbiAqIEl0IHdpbGwgY2F1c2UgdGhlIHN0ZXAgdG8gZmFpbCBhbmQgdGhlIGVycm9yIHdpbGxcbiAqIGJlIGJ1YmJsZWQgdXAgdG8gdGhlIHdvcmtmbG93IGxvZ2ljLlxuICovXG5leHBvcnQgY2xhc3MgRmF0YWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgZmF0YWwgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdGYXRhbEVycm9yJztcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEZhdGFsRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnRmF0YWxFcnJvcic7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeWFibGVFcnJvck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgdGhlIHN0ZXAuXG4gICAqIENhbiBhbHNvIGJlIGEgZHVyYXRpb24gc3RyaW5nIChlLmcuLCBcIjVzXCIsIFwiMm1cIikgb3IgYSBEYXRlIG9iamVjdC5cbiAgICogSWYgbm90IHByb3ZpZGVkLCB0aGUgc3RlcCB3aWxsIGJlIHJldHJpZWQgYWZ0ZXIgMSBzZWNvbmQgKDEwMDAgbWlsbGlzZWNvbmRzKS5cbiAgICovXG4gIHJldHJ5QWZ0ZXI/OiBudW1iZXIgfCBTdHJpbmdWYWx1ZSB8IERhdGU7XG59XG5cbi8qKlxuICogQW4gZXJyb3IgdGhhdCBjYW4gaGFwcGVuIGR1cmluZyBhIHN0ZXAgZXhlY3V0aW9uLCBhbGxvd2luZ1xuICogZm9yIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHJldHJ5IGJlaGF2aW9yLlxuICovXG5leHBvcnQgY2xhc3MgUmV0cnlhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgRGF0ZSB3aGVuIHRoZSBzdGVwIHNob3VsZCBiZSByZXRyaWVkLlxuICAgKi9cbiAgcmV0cnlBZnRlcjogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM6IFJldHJ5YWJsZUVycm9yT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1JldHJ5YWJsZUVycm9yJztcblxuICAgIGlmIChvcHRpb25zLnJldHJ5QWZ0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yZXRyeUFmdGVyID0gcGFyc2VEdXJhdGlvblRvRGF0ZShvcHRpb25zLnJldHJ5QWZ0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIDEgc2Vjb25kICgxMDAwIG1pbGxpc2Vjb25kcylcbiAgICAgIHRoaXMucmV0cnlBZnRlciA9IG5ldyBEYXRlKERhdGUubm93KCkgKyAxMDAwKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZXRyeWFibGVFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdSZXRyeWFibGVFcnJvcic7XG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgV09SS0ZMT1dfVVNFX1NURVAgPSBTeW1ib2wuZm9yKCdXT1JLRkxPV19VU0VfU1RFUCcpO1xuZXhwb3J0IGNvbnN0IFdPUktGTE9XX0NSRUFURV9IT09LID0gU3ltYm9sLmZvcignV09SS0ZMT1dfQ1JFQVRFX0hPT0snKTtcbmV4cG9ydCBjb25zdCBXT1JLRkxPV19TTEVFUCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX1NMRUVQJyk7XG5leHBvcnQgY29uc3QgV09SS0ZMT1dfQ09OVEVYVCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX0NPTlRFWFQnKTtcbmV4cG9ydCBjb25zdCBXT1JLRkxPV19HRVRfU1RSRUFNX0lEID0gU3ltYm9sLmZvcignV09SS0ZMT1dfR0VUX1NUUkVBTV9JRCcpO1xuZXhwb3J0IGNvbnN0IFNUUkVBTV9OQU1FX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9OQU1FJyk7XG5leHBvcnQgY29uc3QgU1RSRUFNX1RZUEVfU1lNQk9MID0gU3ltYm9sLmZvcignV09SS0ZMT1dfU1RSRUFNX1RZUEUnKTtcbmV4cG9ydCBjb25zdCBCT0RZX0lOSVRfU1lNQk9MID0gU3ltYm9sLmZvcignQk9EWV9JTklUJyk7XG5leHBvcnQgY29uc3QgV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRSA9IFN5bWJvbC5mb3IoXG4gICdXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFJ1xuKTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEhvb2ssXG4gIEhvb2tPcHRpb25zLFxuICBSZXF1ZXN0V2l0aFJlc3BvbnNlLFxuICBXZWJob29rLFxuICBXZWJob29rT3B0aW9ucyxcbn0gZnJvbSAnLi4vY3JlYXRlLWhvb2suanMnO1xuaW1wb3J0IHsgV09SS0ZMT1dfQ1JFQVRFX0hPT0sgfSBmcm9tICcuLi9zeW1ib2xzLmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tICcuL2dldC13b3JrZmxvdy1tZXRhZGF0YS5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIb29rPFQgPSBhbnk+KG9wdGlvbnM/OiBIb29rT3B0aW9ucyk6IEhvb2s8VD4ge1xuICAvLyBJbnNpZGUgdGhlIHdvcmtmbG93IFZNLCB0aGUgaG9vayBmdW5jdGlvbiBpcyBzdG9yZWQgaW4gdGhlIGdsb2JhbFRoaXMgb2JqZWN0IGJlaGluZCBhIHN5bWJvbFxuICBjb25zdCBjcmVhdGVIb29rRm4gPSAoZ2xvYmFsVGhpcyBhcyBhbnkpW1xuICAgIFdPUktGTE9XX0NSRUFURV9IT09LXG4gIF0gYXMgdHlwZW9mIGNyZWF0ZUhvb2s8VD47XG4gIGlmICghY3JlYXRlSG9va0ZuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ2BjcmVhdGVIb29rKClgIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgYSB3b3JrZmxvdyBmdW5jdGlvbidcbiAgICApO1xuICB9XG4gIHJldHVybiBjcmVhdGVIb29rRm4ob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJob29rKFxuICBvcHRpb25zOiBXZWJob29rT3B0aW9ucyAmIHsgcmVzcG9uZFdpdGg6ICdtYW51YWwnIH1cbik6IFdlYmhvb2s8UmVxdWVzdFdpdGhSZXNwb25zZT47XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViaG9vayhvcHRpb25zPzogV2ViaG9va09wdGlvbnMpOiBXZWJob29rPFJlcXVlc3Q+O1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYmhvb2soXG4gIG9wdGlvbnM/OiBXZWJob29rT3B0aW9uc1xuKTogV2ViaG9vazxSZXF1ZXN0PiB8IFdlYmhvb2s8UmVxdWVzdFdpdGhSZXNwb25zZT4ge1xuICBjb25zdCB7IHJlc3BvbmRXaXRoLCAuLi5yZXN0IH0gPSBvcHRpb25zID8/IHt9O1xuICBsZXQgbWV0YWRhdGE6IFBpY2s8V2ViaG9va09wdGlvbnMsICdyZXNwb25kV2l0aCc+IHwgdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIHJlc3BvbmRXaXRoICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1ldGFkYXRhID0geyByZXNwb25kV2l0aCB9O1xuICB9XG5cbiAgY29uc3QgaG9vayA9IGNyZWF0ZUhvb2soeyAuLi5yZXN0LCBtZXRhZGF0YSB9KSBhc1xuICAgIHwgV2ViaG9vazxSZXF1ZXN0PlxuICAgIHwgV2ViaG9vazxSZXF1ZXN0V2l0aFJlc3BvbnNlPjtcblxuICBjb25zdCB7IHVybCB9ID0gZ2V0V29ya2Zsb3dNZXRhZGF0YSgpO1xuICBob29rLnVybCA9IGAke3VybH0vLndlbGwta25vd24vd29ya2Zsb3cvdjEvd2ViaG9vay8ke2VuY29kZVVSSUNvbXBvbmVudChob29rLnRva2VuKX1gO1xuXG4gIHJldHVybiBob29rO1xufVxuIiwgImltcG9ydCB0eXBlIHsgSG9vayBhcyBIb29rRW50aXR5IH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va09wdGlvbnMgfSBmcm9tICcuLi9jcmVhdGUtaG9vay5qcyc7XG5pbXBvcnQgeyBjcmVhdGVIb29rIH0gZnJvbSAnLi9jcmVhdGUtaG9vay5qcyc7XG5cbi8qKlxuICogTk9URTogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGRlZmluZUhvb2soKWAgdGhhdCBpcyB1c2VkIGluIHdvcmtmbG93IGNvbnRleHRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lSG9vazxUSW5wdXQsIFRPdXRwdXQgPSBUSW5wdXQ+KCkge1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZShvcHRpb25zPzogSG9va09wdGlvbnMpOiBIb29rPFRPdXRwdXQ+IHtcbiAgICAgIHJldHVybiBjcmVhdGVIb29rPFRPdXRwdXQ+KG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICByZXN1bWUoX3Rva2VuOiBzdHJpbmcsIF9wYXlsb2FkOiBUSW5wdXQpOiBQcm9taXNlPEhvb2tFbnRpdHkgfCBudWxsPiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdgZGVmaW5lSG9vaygpLnJlc3VtZSgpYCBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBleHRlcm5hbCBjb250ZXh0cyAoZS5nLiBBUEkgcm91dGVzKS4nXG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHsgU1RSRUFNX05BTUVfU1lNQk9MLCBXT1JLRkxPV19HRVRfU1RSRUFNX0lEIH0gZnJvbSAnLi4vc3ltYm9scy5qcyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93V3JpdGFibGVTdHJlYW1PcHRpb25zIH0gZnJvbSAnLi4vd3JpdGFibGUtc3RyZWFtLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdyaXRhYmxlPFcgPSBhbnk+KFxuICBvcHRpb25zOiBXb3JrZmxvd1dyaXRhYmxlU3RyZWFtT3B0aW9ucyA9IHt9XG4pOiBXcml0YWJsZVN0cmVhbTxXPiB7XG4gIGNvbnN0IHsgbmFtZXNwYWNlIH0gPSBvcHRpb25zO1xuICBjb25zdCBuYW1lID0gKGdsb2JhbFRoaXMgYXMgYW55KVtXT1JLRkxPV19HRVRfU1RSRUFNX0lEXShuYW1lc3BhY2UpO1xuICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWxUaGlzLldyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgIFtTVFJFQU1fTkFNRV9TWU1CT0xdOiB7XG4gICAgICB2YWx1ZTogbmFtZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9LFxuICB9KTtcbn1cbiIsICIvKipcbiAqIFRoaXMgaXMgdGhlIFwic3RhbmRhcmQgbGlicmFyeVwiIG9mIHN0ZXBzIHRoYXQgd2UgbWFrZSBhdmFpbGFibGUgdG8gYWxsIHdvcmtmbG93IHVzZXJzLlxuICogVGhlIGNhbiBiZSBpbXBvcnRlZCBsaWtlIHNvOiBgaW1wb3J0IHsgZmV0Y2ggfSBmcm9tICd3b3JrZmxvdydgLiBhbmQgdXNlZCBpbiB3b3JrZmxvdy5cbiAqIFRoZSBuZWVkIHRvIGJlIGV4cG9ydGVkIGRpcmVjdGx5IGluIHRoaXMgcGFja2FnZSBhbmQgY2Fubm90IGxpdmUgaW4gYGNvcmVgIHRvIHByZXZlbnRcbiAqIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBwb3N0LWNvbXBpbGF0aW9uLlxuICovXG5cbi8qKlxuICogQSBob2lzdGVkIGBmZXRjaCgpYCBmdW5jdGlvbiB0aGF0IGlzIGV4ZWN1dGVkIGFzIGEgXCJzdGVwXCIgZnVuY3Rpb24sXG4gKiBmb3IgdXNlIHdpdGhpbiB3b3JrZmxvdyBmdW5jdGlvbnMuXG4gKlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmV0Y2hfQVBJXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaCguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBnbG9iYWxUaGlzLmZldGNoPikge1xuICAndXNlIHN0ZXAnO1xuICByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaCguLi5hcmdzKTtcbn1cbiIsICIvKiogQSBzcGVjaWFsIGNvbnN0YW50IHdpdGggdHlwZSBgbmV2ZXJgICovIGV4cG9ydCBjb25zdCBORVZFUiA9IE9iamVjdC5mcmVlemUoe1xuICAgIHN0YXR1czogXCJhYm9ydGVkXCJcbn0pO1xuZXhwb3J0IC8qQF9fTk9fU0lERV9FRkZFQ1RTX18qLyBmdW5jdGlvbiAkY29uc3RydWN0b3IobmFtZSwgaW5pdGlhbGl6ZXIsIHBhcmFtcykge1xuICAgIGZ1bmN0aW9uIGluaXQoaW5zdCwgZGVmKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiX3pvZFwiLCB7XG4gICAgICAgICAgICB2YWx1ZTogaW5zdC5fem9kID8/IHt9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIChfYSA9IGluc3QuX3pvZCkudHJhaXRzID8/IChfYS50cmFpdHMgPSBuZXcgU2V0KCkpO1xuICAgICAgICBpbnN0Ll96b2QudHJhaXRzLmFkZChuYW1lKTtcbiAgICAgICAgaW5pdGlhbGl6ZXIoaW5zdCwgZGVmKTtcbiAgICAgICAgLy8gc3VwcG9ydCBwcm90b3R5cGUgbW9kaWZpY2F0aW9uc1xuICAgICAgICBmb3IoY29uc3QgayBpbiBfLnByb3RvdHlwZSl7XG4gICAgICAgICAgICBpZiAoIShrIGluIGluc3QpKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdCwgaywge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBfLnByb3RvdHlwZVtrXS5iaW5kKGluc3QpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0Ll96b2QuY29uc3RyID0gXztcbiAgICAgICAgaW5zdC5fem9kLmRlZiA9IGRlZjtcbiAgICB9XG4gICAgLy8gZG9lc24ndCB3b3JrIGlmIFBhcmVudCBoYXMgYSBjb25zdHJ1Y3RvciB3aXRoIGFyZ3VtZW50c1xuICAgIGNvbnN0IFBhcmVudCA9IHBhcmFtcz8uUGFyZW50ID8/IE9iamVjdDtcbiAgICBjbGFzcyBEZWZpbml0aW9uIGV4dGVuZHMgUGFyZW50IHtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlZmluaXRpb24sIFwibmFtZVwiLCB7XG4gICAgICAgIHZhbHVlOiBuYW1lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gXyhkZWYpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBpbnN0ID0gcGFyYW1zPy5QYXJlbnQgPyBuZXcgRGVmaW5pdGlvbigpIDogdGhpcztcbiAgICAgICAgaW5pdChpbnN0LCBkZWYpO1xuICAgICAgICAoX2EgPSBpbnN0Ll96b2QpLmRlZmVycmVkID8/IChfYS5kZWZlcnJlZCA9IFtdKTtcbiAgICAgICAgZm9yIChjb25zdCBmbiBvZiBpbnN0Ll96b2QuZGVmZXJyZWQpe1xuICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zdDtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF8sIFwiaW5pdFwiLCB7XG4gICAgICAgIHZhbHVlOiBpbml0XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF8sIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgICAgICB2YWx1ZTogKGluc3QpPT57XG4gICAgICAgICAgICBpZiAocGFyYW1zPy5QYXJlbnQgJiYgaW5zdCBpbnN0YW5jZW9mIHBhcmFtcy5QYXJlbnQpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGluc3Q/Ll96b2Q/LnRyYWl0cz8uaGFzKG5hbWUpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF8sIFwibmFtZVwiLCB7XG4gICAgICAgIHZhbHVlOiBuYW1lXG4gICAgfSk7XG4gICAgcmV0dXJuIF87XG59XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICBVVElMSVRJRVMgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmV4cG9ydCBjb25zdCAkYnJhbmQgPSBTeW1ib2woXCJ6b2RfYnJhbmRcIik7XG5leHBvcnQgY2xhc3MgJFpvZEFzeW5jRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgc3VwZXIoYEVuY291bnRlcmVkIFByb21pc2UgZHVyaW5nIHN5bmNocm9ub3VzIHBhcnNlLiBVc2UgLnBhcnNlQXN5bmMoKSBpbnN0ZWFkLmApO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyAkWm9kRW5jb2RlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobmFtZSl7XG4gICAgICAgIHN1cGVyKGBFbmNvdW50ZXJlZCB1bmlkaXJlY3Rpb25hbCB0cmFuc2Zvcm0gZHVyaW5nIGVuY29kZTogJHtuYW1lfWApO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlpvZEVuY29kZUVycm9yXCI7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IGdsb2JhbENvbmZpZyA9IHt9O1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZyhuZXdDb25maWcpIHtcbiAgICBpZiAobmV3Q29uZmlnKSBPYmplY3QuYXNzaWduKGdsb2JhbENvbmZpZywgbmV3Q29uZmlnKTtcbiAgICByZXR1cm4gZ2xvYmFsQ29uZmlnO1xufVxuIiwgIi8vIGZ1bmN0aW9uc1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEVxdWFsKHZhbCkge1xuICAgIHJldHVybiB2YWw7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Tm90RXF1YWwodmFsKSB7XG4gICAgcmV0dXJuIHZhbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJcyhfYXJnKSB7fVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5ldmVyKF94KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0KF8pIHt9XG5leHBvcnQgZnVuY3Rpb24gZ2V0RW51bVZhbHVlcyhlbnRyaWVzKSB7XG4gICAgY29uc3QgbnVtZXJpY1ZhbHVlcyA9IE9iamVjdC52YWx1ZXMoZW50cmllcykuZmlsdGVyKCh2KT0+dHlwZW9mIHYgPT09IFwibnVtYmVyXCIpO1xuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKGVudHJpZXMpLmZpbHRlcigoW2ssIF9dKT0+bnVtZXJpY1ZhbHVlcy5pbmRleE9mKCtrKSA9PT0gLTEpLm1hcCgoW18sIHZdKT0+dik7XG4gICAgcmV0dXJuIHZhbHVlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBqb2luVmFsdWVzKGFycmF5LCBzZXBhcmF0b3IgPSBcInxcIikge1xuICAgIHJldHVybiBhcnJheS5tYXAoKHZhbCk9PnN0cmluZ2lmeVByaW1pdGl2ZSh2YWwpKS5qb2luKHNlcGFyYXRvcik7XG59XG5leHBvcnQgZnVuY3Rpb24ganNvblN0cmluZ2lmeVJlcGxhY2VyKF8sIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlZChnZXR0ZXIpIHtcbiAgICBjb25zdCBzZXQgPSBmYWxzZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQgdmFsdWUgKCkge1xuICAgICAgICAgICAgaWYgKCFzZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldHRlcigpO1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInZhbHVlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYWNoZWQgdmFsdWUgYWxyZWFkeSBzZXRcIik7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG51bGxpc2goaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblJlZ2V4KHNvdXJjZSkge1xuICAgIGNvbnN0IHN0YXJ0ID0gc291cmNlLnN0YXJ0c1dpdGgoXCJeXCIpID8gMSA6IDA7XG4gICAgY29uc3QgZW5kID0gc291cmNlLmVuZHNXaXRoKFwiJFwiKSA/IHNvdXJjZS5sZW5ndGggLSAxIDogc291cmNlLmxlbmd0aDtcbiAgICByZXR1cm4gc291cmNlLnNsaWNlKHN0YXJ0LCBlbmQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZsb2F0U2FmZVJlbWFpbmRlcih2YWwsIHN0ZXApIHtcbiAgICBjb25zdCB2YWxEZWNDb3VudCA9ICh2YWwudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV0gfHwgXCJcIikubGVuZ3RoO1xuICAgIGNvbnN0IHN0ZXBTdHJpbmcgPSBzdGVwLnRvU3RyaW5nKCk7XG4gICAgbGV0IHN0ZXBEZWNDb3VudCA9IChzdGVwU3RyaW5nLnNwbGl0KFwiLlwiKVsxXSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgaWYgKHN0ZXBEZWNDb3VudCA9PT0gMCAmJiAvXFxkP2UtXFxkPy8udGVzdChzdGVwU3RyaW5nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHN0ZXBTdHJpbmcubWF0Y2goL1xcZD9lLShcXGQ/KS8pO1xuICAgICAgICBpZiAobWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgc3RlcERlY0NvdW50ID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkZWNDb3VudCA9IHZhbERlY0NvdW50ID4gc3RlcERlY0NvdW50ID8gdmFsRGVjQ291bnQgOiBzdGVwRGVjQ291bnQ7XG4gICAgY29uc3QgdmFsSW50ID0gTnVtYmVyLnBhcnNlSW50KHZhbC50b0ZpeGVkKGRlY0NvdW50KS5yZXBsYWNlKFwiLlwiLCBcIlwiKSk7XG4gICAgY29uc3Qgc3RlcEludCA9IE51bWJlci5wYXJzZUludChzdGVwLnRvRml4ZWQoZGVjQ291bnQpLnJlcGxhY2UoXCIuXCIsIFwiXCIpKTtcbiAgICByZXR1cm4gdmFsSW50ICUgc3RlcEludCAvIDEwICoqIGRlY0NvdW50O1xufVxuY29uc3QgRVZBTFVBVElORyA9IFN5bWJvbChcImV2YWx1YXRpbmdcIik7XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lTGF6eShvYmplY3QsIGtleSwgZ2V0dGVyKSB7XG4gICAgbGV0IHZhbHVlID0gdW5kZWZpbmVkO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgICBnZXQgKCkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBFVkFMVUFUSU5HKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkLCByZXR1cm4gdW5kZWZpbmVkIHRvIGJyZWFrIHRoZSBjeWNsZVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gRVZBTFVBVElORztcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldHRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgKHYpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgLy8gb2JqZWN0W2tleV0gPSB2O1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RDbG9uZShvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzaWduUHJvcCh0YXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcCwge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVmcyguLi5kZWZzKSB7XG4gICAgY29uc3QgbWVyZ2VkRGVzY3JpcHRvcnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKXtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhkZWYpO1xuICAgICAgICBPYmplY3QuYXNzaWduKG1lcmdlZERlc2NyaXB0b3JzLCBkZXNjcmlwdG9ycyk7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh7fSwgbWVyZ2VkRGVzY3JpcHRvcnMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lRGVmKHNjaGVtYSkge1xuICAgIHJldHVybiBtZXJnZURlZnMoc2NoZW1hLl96b2QuZGVmKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50QXRQYXRoKG9iaiwgcGF0aCkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIG9iajtcbiAgICByZXR1cm4gcGF0aC5yZWR1Y2UoKGFjYywga2V5KT0+YWNjPy5ba2V5XSwgb2JqKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcm9taXNlQWxsT2JqZWN0KHByb21pc2VzT2JqKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb21pc2VzT2JqKTtcbiAgICBjb25zdCBwcm9taXNlcyA9IGtleXMubWFwKChrZXkpPT5wcm9taXNlc09ialtrZXldKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKHJlc3VsdHMpPT57XG4gICAgICAgIGNvbnN0IHJlc29sdmVkT2JqID0ge307XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIHJlc29sdmVkT2JqW2tleXNbaV1dID0gcmVzdWx0c1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWRPYmo7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tU3RyaW5nKGxlbmd0aCA9IDEwKSB7XG4gICAgY29uc3QgY2hhcnMgPSBcImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7XG4gICAgbGV0IHN0ciA9IFwiXCI7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKXtcbiAgICAgICAgc3RyICs9IGNoYXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCldO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVzYyhzdHIpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc3RyKTtcbn1cbmV4cG9ydCBjb25zdCBjYXB0dXJlU3RhY2tUcmFjZSA9IFwiY2FwdHVyZVN0YWNrVHJhY2VcIiBpbiBFcnJvciA/IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlIDogKC4uLl9hcmdzKT0+e307XG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QoZGF0YSkge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiBkYXRhICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KGRhdGEpO1xufVxuZXhwb3J0IGNvbnN0IGFsbG93c0V2YWwgPSBjYWNoZWQoKCk9PntcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgbmF2aWdhdG9yPy51c2VyQWdlbnQ/LmluY2x1ZGVzKFwiQ2xvdWRmbGFyZVwiKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IEYgPSBGdW5jdGlvbjtcbiAgICAgICAgbmV3IEYoXCJcIik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qobykge1xuICAgIGlmIChpc09iamVjdChvKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAvLyBtb2RpZmllZCBjb25zdHJ1Y3RvclxuICAgIGNvbnN0IGN0b3IgPSBvLmNvbnN0cnVjdG9yO1xuICAgIGlmIChjdG9yID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgIC8vIG1vZGlmaWVkIHByb3RvdHlwZVxuICAgIGNvbnN0IHByb3QgPSBjdG9yLnByb3RvdHlwZTtcbiAgICBpZiAoaXNPYmplY3QocHJvdCkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gY3RvciBkb2Vzbid0IGhhdmUgc3RhdGljIGBpc1Byb3RvdHlwZU9mYFxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvdCwgXCJpc1Byb3RvdHlwZU9mXCIpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNoYWxsb3dDbG9uZShvKSB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QobykpIHJldHVybiB7XG4gICAgICAgIC4uLm9cbiAgICB9O1xuICAgIGlmIChBcnJheS5pc0FycmF5KG8pKSByZXR1cm4gW1xuICAgICAgICAuLi5vXG4gICAgXTtcbiAgICByZXR1cm4gbztcbn1cbmV4cG9ydCBmdW5jdGlvbiBudW1LZXlzKGRhdGEpIHtcbiAgICBsZXQga2V5Q291bnQgPSAwO1xuICAgIGZvcihjb25zdCBrZXkgaW4gZGF0YSl7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICAgICAga2V5Q291bnQrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5Q291bnQ7XG59XG5leHBvcnQgY29uc3QgZ2V0UGFyc2VkVHlwZSA9IChkYXRhKT0+e1xuICAgIGNvbnN0IHQgPSB0eXBlb2YgZGF0YTtcbiAgICBzd2l0Y2godCl7XG4gICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihkYXRhKSA/IFwibmFuXCIgOiBcIm51bWJlclwiO1xuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgIHJldHVybiBcImZ1bmN0aW9uXCI7XG4gICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICAgIHJldHVybiBcImJpZ2ludFwiO1xuICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJzeW1ib2xcIjtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJhcnJheVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS50aGVuICYmIHR5cGVvZiBkYXRhLnRoZW4gPT09IFwiZnVuY3Rpb25cIiAmJiBkYXRhLmNhdGNoICYmIHR5cGVvZiBkYXRhLmNhdGNoID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJwcm9taXNlXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwibWFwXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIFNldCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic2V0XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIERhdGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJkYXRlXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAodHlwZW9mIEZpbGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJmaWxlXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gXCJvYmplY3RcIjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhIHR5cGU6ICR7dH1gKTtcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHByb3BlcnR5S2V5VHlwZXMgPSBuZXcgU2V0KFtcbiAgICBcInN0cmluZ1wiLFxuICAgIFwibnVtYmVyXCIsXG4gICAgXCJzeW1ib2xcIlxuXSk7XG5leHBvcnQgY29uc3QgcHJpbWl0aXZlVHlwZXMgPSBuZXcgU2V0KFtcbiAgICBcInN0cmluZ1wiLFxuICAgIFwibnVtYmVyXCIsXG4gICAgXCJiaWdpbnRcIixcbiAgICBcImJvb2xlYW5cIixcbiAgICBcInN5bWJvbFwiLFxuICAgIFwidW5kZWZpbmVkXCJcbl0pO1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ2V4KHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpO1xufVxuLy8gem9kLXNwZWNpZmljIHV0aWxzXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoaW5zdCwgZGVmLCBwYXJhbXMpIHtcbiAgICBjb25zdCBjbCA9IG5ldyBpbnN0Ll96b2QuY29uc3RyKGRlZiA/PyBpbnN0Ll96b2QuZGVmKTtcbiAgICBpZiAoIWRlZiB8fCBwYXJhbXM/LnBhcmVudCkgY2wuX3pvZC5wYXJlbnQgPSBpbnN0O1xuICAgIHJldHVybiBjbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVQYXJhbXMoX3BhcmFtcykge1xuICAgIGNvbnN0IHBhcmFtcyA9IF9wYXJhbXM7XG4gICAgaWYgKCFwYXJhbXMpIHJldHVybiB7fTtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6ICgpPT5wYXJhbXNcbiAgICB9O1xuICAgIGlmIChwYXJhbXM/Lm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAocGFyYW1zPy5lcnJvciAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSBib3RoIGBtZXNzYWdlYCBhbmQgYGVycm9yYCBwYXJhbXNcIik7XG4gICAgICAgIHBhcmFtcy5lcnJvciA9IHBhcmFtcy5tZXNzYWdlO1xuICAgIH1cbiAgICBkZWxldGUgcGFyYW1zLm1lc3NhZ2U7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMuZXJyb3IgPT09IFwic3RyaW5nXCIpIHJldHVybiB7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgZXJyb3I6ICgpPT5wYXJhbXMuZXJyb3JcbiAgICB9O1xuICAgIHJldHVybiBwYXJhbXM7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHJhbnNwYXJlbnRQcm94eShnZXR0ZXIpIHtcbiAgICBsZXQgdGFyZ2V0O1xuICAgIHJldHVybiBuZXcgUHJveHkoe30sIHtcbiAgICAgICAgZ2V0IChfLCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICAgICAgdGFyZ2V0ID8/ICh0YXJnZXQgPSBnZXR0ZXIoKSk7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCAoXywgcHJvcCwgdmFsdWUsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LnNldCh0YXJnZXQsIHByb3AsIHZhbHVlLCByZWNlaXZlcik7XG4gICAgICAgIH0sXG4gICAgICAgIGhhcyAoXywgcHJvcCkge1xuICAgICAgICAgICAgdGFyZ2V0ID8/ICh0YXJnZXQgPSBnZXR0ZXIoKSk7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVsZXRlUHJvcGVydHkgKF8sIHByb3ApIHtcbiAgICAgICAgICAgIHRhcmdldCA/PyAodGFyZ2V0ID0gZ2V0dGVyKCkpO1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3duS2V5cyAoXykge1xuICAgICAgICAgICAgdGFyZ2V0ID8/ICh0YXJnZXQgPSBnZXR0ZXIoKSk7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvciAoXywgcHJvcCkge1xuICAgICAgICAgICAgdGFyZ2V0ID8/ICh0YXJnZXQgPSBnZXR0ZXIoKSk7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVmaW5lUHJvcGVydHkgKF8sIHByb3AsIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIHRhcmdldCA/PyAodGFyZ2V0ID0gZ2V0dGVyKCkpO1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wLCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeVByaW1pdGl2ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHJldHVybiB2YWx1ZS50b1N0cmluZygpICsgXCJuXCI7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsS2V5cyhzaGFwZSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzaGFwZSkuZmlsdGVyKChrKT0+e1xuICAgICAgICByZXR1cm4gc2hhcGVba10uX3pvZC5vcHRpbiA9PT0gXCJvcHRpb25hbFwiICYmIHNoYXBlW2tdLl96b2Qub3B0b3V0ID09PSBcIm9wdGlvbmFsXCI7XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgTlVNQkVSX0ZPUk1BVF9SQU5HRVMgPSB7XG4gICAgc2FmZWludDogW1xuICAgICAgICBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUixcbiAgICAgICAgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbiAgICBdLFxuICAgIGludDMyOiBbXG4gICAgICAgIC0yMTQ3NDgzNjQ4LFxuICAgICAgICAyMTQ3NDgzNjQ3XG4gICAgXSxcbiAgICB1aW50MzI6IFtcbiAgICAgICAgMCxcbiAgICAgICAgNDI5NDk2NzI5NVxuICAgIF0sXG4gICAgZmxvYXQzMjogW1xuICAgICAgICAtMy40MDI4MjM0NjYzODUyODg2ZTM4LFxuICAgICAgICAzLjQwMjgyMzQ2NjM4NTI4ODZlMzhcbiAgICBdLFxuICAgIGZsb2F0NjQ6IFtcbiAgICAgICAgLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgIE51bWJlci5NQVhfVkFMVUVcbiAgICBdXG59O1xuZXhwb3J0IGNvbnN0IEJJR0lOVF9GT1JNQVRfUkFOR0VTID0ge1xuICAgIGludDY0OiBbXG4gICAgICAgIC8qIEBfX1BVUkVfXyovIEJpZ0ludChcIi05MjIzMzcyMDM2ODU0Nzc1ODA4XCIpLFxuICAgICAgICAvKiBAX19QVVJFX18qLyBCaWdJbnQoXCI5MjIzMzcyMDM2ODU0Nzc1ODA3XCIpXG4gICAgXSxcbiAgICB1aW50NjQ6IFtcbiAgICAgICAgLyogQF9fUFVSRV9fKi8gQmlnSW50KDApLFxuICAgICAgICAvKiBAX19QVVJFX18qLyBCaWdJbnQoXCIxODQ0Njc0NDA3MzcwOTU1MTYxNVwiKVxuICAgIF1cbn07XG5leHBvcnQgZnVuY3Rpb24gcGljayhzY2hlbWEsIG1hc2spIHtcbiAgICBjb25zdCBjdXJyRGVmID0gc2NoZW1hLl96b2QuZGVmO1xuICAgIGNvbnN0IGRlZiA9IG1lcmdlRGVmcyhzY2hlbWEuX3pvZC5kZWYsIHtcbiAgICAgICAgZ2V0IHNoYXBlICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1NoYXBlID0ge307XG4gICAgICAgICAgICBmb3IoY29uc3Qga2V5IGluIG1hc2spe1xuICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBjdXJyRGVmLnNoYXBlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBrZXk6IFwiJHtrZXl9XCJgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFtYXNrW2tleV0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSBjdXJyRGVmLnNoYXBlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NpZ25Qcm9wKHRoaXMsIFwic2hhcGVcIiwgbmV3U2hhcGUpOyAvLyBzZWxmLWNhY2hpbmdcbiAgICAgICAgICAgIHJldHVybiBuZXdTaGFwZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tzOiBbXVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gb21pdChzY2hlbWEsIG1hc2spIHtcbiAgICBjb25zdCBjdXJyRGVmID0gc2NoZW1hLl96b2QuZGVmO1xuICAgIGNvbnN0IGRlZiA9IG1lcmdlRGVmcyhzY2hlbWEuX3pvZC5kZWYsIHtcbiAgICAgICAgZ2V0IHNoYXBlICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1NoYXBlID0ge1xuICAgICAgICAgICAgICAgIC4uLnNjaGVtYS5fem9kLmRlZi5zaGFwZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gbWFzayl7XG4gICAgICAgICAgICAgICAgaWYgKCEoa2V5IGluIGN1cnJEZWYuc2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogXCIke2tleX1cImApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW1hc2tba2V5XSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5ld1NoYXBlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NpZ25Qcm9wKHRoaXMsIFwic2hhcGVcIiwgbmV3U2hhcGUpOyAvLyBzZWxmLWNhY2hpbmdcbiAgICAgICAgICAgIHJldHVybiBuZXdTaGFwZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tzOiBbXVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHNjaGVtYSwgc2hhcGUpIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3Qoc2hhcGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQgdG8gZXh0ZW5kOiBleHBlY3RlZCBhIHBsYWluIG9iamVjdFwiKTtcbiAgICB9XG4gICAgY29uc3QgY2hlY2tzID0gc2NoZW1hLl96b2QuZGVmLmNoZWNrcztcbiAgICBjb25zdCBoYXNDaGVja3MgPSBjaGVja3MgJiYgY2hlY2tzLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc0NoZWNrcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3Qgc2NoZW1hcyBjb250YWluaW5nIHJlZmluZW1lbnRzIGNhbm5vdCBiZSBleHRlbmRlZC4gVXNlIGAuc2FmZUV4dGVuZCgpYCBpbnN0ZWFkLlwiKTtcbiAgICB9XG4gICAgY29uc3QgZGVmID0gbWVyZ2VEZWZzKHNjaGVtYS5fem9kLmRlZiwge1xuICAgICAgICBnZXQgc2hhcGUgKCkge1xuICAgICAgICAgICAgY29uc3QgX3NoYXBlID0ge1xuICAgICAgICAgICAgICAgIC4uLnNjaGVtYS5fem9kLmRlZi5zaGFwZSxcbiAgICAgICAgICAgICAgICAuLi5zaGFwZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFzc2lnblByb3AodGhpcywgXCJzaGFwZVwiLCBfc2hhcGUpOyAvLyBzZWxmLWNhY2hpbmdcbiAgICAgICAgICAgIHJldHVybiBfc2hhcGU7XG4gICAgICAgIH0sXG4gICAgICAgIGNoZWNrczogW11cbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmUoc2NoZW1hLCBkZWYpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNhZmVFeHRlbmQoc2NoZW1hLCBzaGFwZSkge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChzaGFwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCB0byBzYWZlRXh0ZW5kOiBleHBlY3RlZCBhIHBsYWluIG9iamVjdFwiKTtcbiAgICB9XG4gICAgY29uc3QgZGVmID0ge1xuICAgICAgICAuLi5zY2hlbWEuX3pvZC5kZWYsXG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBfc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4uc2NoZW1hLl96b2QuZGVmLnNoYXBlLFxuICAgICAgICAgICAgICAgIC4uLnNoYXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIF9zaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIF9zaGFwZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tzOiBzY2hlbWEuX3pvZC5kZWYuY2hlY2tzXG4gICAgfTtcbiAgICByZXR1cm4gY2xvbmUoc2NoZW1hLCBkZWYpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlKGEsIGIpIHtcbiAgICBjb25zdCBkZWYgPSBtZXJnZURlZnMoYS5fem9kLmRlZiwge1xuICAgICAgICBnZXQgc2hhcGUgKCkge1xuICAgICAgICAgICAgY29uc3QgX3NoYXBlID0ge1xuICAgICAgICAgICAgICAgIC4uLmEuX3pvZC5kZWYuc2hhcGUsXG4gICAgICAgICAgICAgICAgLi4uYi5fem9kLmRlZi5zaGFwZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFzc2lnblByb3AodGhpcywgXCJzaGFwZVwiLCBfc2hhcGUpOyAvLyBzZWxmLWNhY2hpbmdcbiAgICAgICAgICAgIHJldHVybiBfc2hhcGU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBjYXRjaGFsbCAoKSB7XG4gICAgICAgICAgICByZXR1cm4gYi5fem9kLmRlZi5jYXRjaGFsbDtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tzOiBbXVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShhLCBkZWYpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnRpYWwoQ2xhc3MsIHNjaGVtYSwgbWFzaykge1xuICAgIGNvbnN0IGRlZiA9IG1lcmdlRGVmcyhzY2hlbWEuX3pvZC5kZWYsIHtcbiAgICAgICAgZ2V0IHNoYXBlICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFNoYXBlID0gc2NoZW1hLl96b2QuZGVmLnNoYXBlO1xuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4ub2xkU2hhcGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAobWFzaykge1xuICAgICAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gbWFzayl7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBvbGRTaGFwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogXCIke2tleX1cImApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWFza1trZXldKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG9sZFNoYXBlW2tleV0hLl96b2Qub3B0aW4gPT09IFwib3B0aW9uYWxcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSBDbGFzcyA/IG5ldyBDbGFzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm9wdGlvbmFsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lclR5cGU6IG9sZFNoYXBlW2tleV1cbiAgICAgICAgICAgICAgICAgICAgfSkgOiBvbGRTaGFwZVtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBvbGRTaGFwZSl7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChvbGRTaGFwZVtrZXldIS5fem9kLm9wdGluID09PSBcIm9wdGlvbmFsXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gQ2xhc3MgPyBuZXcgQ2xhc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJvcHRpb25hbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJUeXBlOiBvbGRTaGFwZVtrZXldXG4gICAgICAgICAgICAgICAgICAgIH0pIDogb2xkU2hhcGVba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NpZ25Qcm9wKHRoaXMsIFwic2hhcGVcIiwgc2hhcGUpOyAvLyBzZWxmLWNhY2hpbmdcbiAgICAgICAgICAgIHJldHVybiBzaGFwZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tzOiBbXVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWQoQ2xhc3MsIHNjaGVtYSwgbWFzaykge1xuICAgIGNvbnN0IGRlZiA9IG1lcmdlRGVmcyhzY2hlbWEuX3pvZC5kZWYsIHtcbiAgICAgICAgZ2V0IHNoYXBlICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFNoYXBlID0gc2NoZW1hLl96b2QuZGVmLnNoYXBlO1xuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4ub2xkU2hhcGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAobWFzaykge1xuICAgICAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gbWFzayl7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBzaGFwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogXCIke2tleX1cImApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWFza1trZXldKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcndyaXRlIHdpdGggbm9uLW9wdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSBuZXcgQ2xhc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJub25vcHRpb25hbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJUeXBlOiBvbGRTaGFwZVtrZXldXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBvbGRTaGFwZSl7XG4gICAgICAgICAgICAgICAgICAgIC8vIG92ZXJ3cml0ZSB3aXRoIG5vbi1vcHRpb25hbFxuICAgICAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gbmV3IENsYXNzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwibm9ub3B0aW9uYWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyVHlwZTogb2xkU2hhcGVba2V5XVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NpZ25Qcm9wKHRoaXMsIFwic2hhcGVcIiwgc2hhcGUpOyAvLyBzZWxmLWNhY2hpbmdcbiAgICAgICAgICAgIHJldHVybiBzaGFwZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tzOiBbXVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG4vLyBpbnZhbGlkX3R5cGUgfCB0b29fYmlnIHwgdG9vX3NtYWxsIHwgaW52YWxpZF9mb3JtYXQgfCBub3RfbXVsdGlwbGVfb2YgfCB1bnJlY29nbml6ZWRfa2V5cyB8IGludmFsaWRfdW5pb24gfCBpbnZhbGlkX2tleSB8IGludmFsaWRfZWxlbWVudCB8IGludmFsaWRfdmFsdWUgfCBjdXN0b21cbmV4cG9ydCBmdW5jdGlvbiBhYm9ydGVkKHgsIHN0YXJ0SW5kZXggPSAwKSB7XG4gICAgaWYgKHguYWJvcnRlZCA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgZm9yKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IHguaXNzdWVzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgaWYgKHguaXNzdWVzW2ldPy5jb250aW51ZSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByZWZpeElzc3VlcyhwYXRoLCBpc3N1ZXMpIHtcbiAgICByZXR1cm4gaXNzdWVzLm1hcCgoaXNzKT0+e1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IGlzcykucGF0aCA/PyAoX2EucGF0aCA9IFtdKTtcbiAgICAgICAgaXNzLnBhdGgudW5zaGlmdChwYXRoKTtcbiAgICAgICAgcmV0dXJuIGlzcztcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlIDogbWVzc2FnZT8ubWVzc2FnZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb25maWcpIHtcbiAgICBjb25zdCBmdWxsID0ge1xuICAgICAgICAuLi5pc3MsXG4gICAgICAgIHBhdGg6IGlzcy5wYXRoID8/IFtdXG4gICAgfTtcbiAgICAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICBpZiAoIWlzcy5tZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB1bndyYXBNZXNzYWdlKGlzcy5pbnN0Py5fem9kLmRlZj8uZXJyb3I/Lihpc3MpKSA/PyB1bndyYXBNZXNzYWdlKGN0eD8uZXJyb3I/Lihpc3MpKSA/PyB1bndyYXBNZXNzYWdlKGNvbmZpZy5jdXN0b21FcnJvcj8uKGlzcykpID8/IHVud3JhcE1lc3NhZ2UoY29uZmlnLmxvY2FsZUVycm9yPy4oaXNzKSkgPz8gXCJJbnZhbGlkIGlucHV0XCI7XG4gICAgICAgIGZ1bGwubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfVxuICAgIC8vIGRlbGV0ZSAoZnVsbCBhcyBhbnkpLmRlZjtcbiAgICBkZWxldGUgZnVsbC5pbnN0O1xuICAgIGRlbGV0ZSBmdWxsLmNvbnRpbnVlO1xuICAgIGlmICghY3R4Py5yZXBvcnRJbnB1dCkge1xuICAgICAgICBkZWxldGUgZnVsbC5pbnB1dDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U2l6YWJsZU9yaWdpbihpbnB1dCkge1xuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFNldCkgcmV0dXJuIFwic2V0XCI7XG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgTWFwKSByZXR1cm4gXCJtYXBcIjtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZSkgcmV0dXJuIFwiZmlsZVwiO1xuICAgIHJldHVybiBcInVua25vd25cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRMZW5ndGhhYmxlT3JpZ2luKGlucHV0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSByZXR1cm4gXCJhcnJheVwiO1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHJldHVybiBcInN0cmluZ1wiO1xuICAgIHJldHVybiBcInVua25vd25cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc3N1ZSguLi5hcmdzKSB7XG4gICAgY29uc3QgW2lzcywgaW5wdXQsIGluc3RdID0gYXJncztcbiAgICBpZiAodHlwZW9mIGlzcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogaXNzLFxuICAgICAgICAgICAgY29kZTogXCJjdXN0b21cIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5pc3NcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuRW51bShvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMob2JqKS5maWx0ZXIoKFtrLCBfXSk9PntcbiAgICAgICAgLy8gcmV0dXJuIHRydWUgaWYgTmFOLCBtZWFuaW5nIGl0J3Mgbm90IGEgbnVtYmVyLCB0aHVzIGEgc3RyaW5nIGtleVxuICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKE51bWJlci5wYXJzZUludChrLCAxMCkpO1xuICAgIH0pLm1hcCgoZWwpPT5lbFsxXSk7XG59XG4vLyBDb2RlYyB1dGlsaXR5IGZ1bmN0aW9uc1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NFRvVWludDhBcnJheShiYXNlNjQpIHtcbiAgICBjb25zdCBiaW5hcnlTdHJpbmcgPSBhdG9iKGJhc2U2NCk7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnlTdHJpbmcubGVuZ3RoKTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgYmluYXJ5U3RyaW5nLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgYnl0ZXNbaV0gPSBiaW5hcnlTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVpbnQ4QXJyYXlUb0Jhc2U2NChieXRlcykge1xuICAgIGxldCBiaW5hcnlTdHJpbmcgPSBcIlwiO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGJpbmFyeVN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ0b2EoYmluYXJ5U3RyaW5nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjR1cmxUb1VpbnQ4QXJyYXkoYmFzZTY0dXJsKSB7XG4gICAgY29uc3QgYmFzZTY0ID0gYmFzZTY0dXJsLnJlcGxhY2UoLy0vZywgXCIrXCIpLnJlcGxhY2UoL18vZywgXCIvXCIpO1xuICAgIGNvbnN0IHBhZGRpbmcgPSBcIj1cIi5yZXBlYXQoKDQgLSBiYXNlNjQubGVuZ3RoICUgNCkgJSA0KTtcbiAgICByZXR1cm4gYmFzZTY0VG9VaW50OEFycmF5KGJhc2U2NCArIHBhZGRpbmcpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVpbnQ4QXJyYXlUb0Jhc2U2NHVybChieXRlcykge1xuICAgIHJldHVybiB1aW50OEFycmF5VG9CYXNlNjQoYnl0ZXMpLnJlcGxhY2UoL1xcKy9nLCBcIi1cIikucmVwbGFjZSgvXFwvL2csIFwiX1wiKS5yZXBsYWNlKC89L2csIFwiXCIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhleFRvVWludDhBcnJheShoZXgpIHtcbiAgICBjb25zdCBjbGVhbkhleCA9IGhleC5yZXBsYWNlKC9eMHgvLCBcIlwiKTtcbiAgICBpZiAoY2xlYW5IZXgubGVuZ3RoICUgMiAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGhleCBzdHJpbmcgbGVuZ3RoXCIpO1xuICAgIH1cbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGNsZWFuSGV4Lmxlbmd0aCAvIDIpO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBjbGVhbkhleC5sZW5ndGg7IGkgKz0gMil7XG4gICAgICAgIGJ5dGVzW2kgLyAyXSA9IE51bWJlci5wYXJzZUludChjbGVhbkhleC5zbGljZShpLCBpICsgMiksIDE2KTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVpbnQ4QXJyYXlUb0hleChieXRlcykge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKS5tYXAoKGIpPT5iLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpLmpvaW4oXCJcIik7XG59XG4vLyBpbnN0YW5jZW9mXG5leHBvcnQgY2xhc3MgQ2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKC4uLl9hcmdzKXt9XG59XG4iLCAiaW1wb3J0IHsgJGNvbnN0cnVjdG9yIH0gZnJvbSBcIi4vY29yZS5qc1wiO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tIFwiLi91dGlsLmpzXCI7XG5jb25zdCBpbml0aWFsaXplciA9IChpbnN0LCBkZWYpPT57XG4gICAgaW5zdC5uYW1lID0gXCIkWm9kRXJyb3JcIjtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdCwgXCJfem9kXCIsIHtcbiAgICAgICAgdmFsdWU6IGluc3QuX3pvZCxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdCwgXCJpc3N1ZXNcIiwge1xuICAgICAgICB2YWx1ZTogZGVmLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgIH0pO1xuICAgIGluc3QubWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KGRlZiwgdXRpbC5qc29uU3RyaW5naWZ5UmVwbGFjZXIsIDIpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0LCBcInRvU3RyaW5nXCIsIHtcbiAgICAgICAgdmFsdWU6ICgpPT5pbnN0Lm1lc3NhZ2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgfSk7XG59O1xuZXhwb3J0IGNvbnN0ICRab2RFcnJvciA9ICRjb25zdHJ1Y3RvcihcIiRab2RFcnJvclwiLCBpbml0aWFsaXplcik7XG5leHBvcnQgY29uc3QgJFpvZFJlYWxFcnJvciA9ICRjb25zdHJ1Y3RvcihcIiRab2RFcnJvclwiLCBpbml0aWFsaXplciwge1xuICAgIFBhcmVudDogRXJyb3Jcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5FcnJvcihlcnJvciwgbWFwcGVyID0gKGlzc3VlKT0+aXNzdWUubWVzc2FnZSkge1xuICAgIGNvbnN0IGZpZWxkRXJyb3JzID0ge307XG4gICAgY29uc3QgZm9ybUVycm9ycyA9IFtdO1xuICAgIGZvciAoY29uc3Qgc3ViIG9mIGVycm9yLmlzc3Vlcyl7XG4gICAgICAgIGlmIChzdWIucGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0gPSBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0gfHwgW107XG4gICAgICAgICAgICBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0ucHVzaChtYXBwZXIoc3ViKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3JtRXJyb3JzLnB1c2gobWFwcGVyKHN1YikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGZvcm1FcnJvcnMsXG4gICAgICAgIGZpZWxkRXJyb3JzXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRFcnJvcihlcnJvciwgX21hcHBlcikge1xuICAgIGNvbnN0IG1hcHBlciA9IF9tYXBwZXIgfHwgZnVuY3Rpb24oaXNzdWUpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlLm1lc3NhZ2U7XG4gICAgfTtcbiAgICBjb25zdCBmaWVsZEVycm9ycyA9IHtcbiAgICAgICAgX2Vycm9yczogW11cbiAgICB9O1xuICAgIGNvbnN0IHByb2Nlc3NFcnJvciA9IChlcnJvcik9PntcbiAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBlcnJvci5pc3N1ZXMpe1xuICAgICAgICAgICAgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF91bmlvblwiICYmIGlzc3VlLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpc3N1ZS5lcnJvcnMubWFwKChpc3N1ZXMpPT5wcm9jZXNzRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX2tleVwiKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBpc3N1ZS5pc3N1ZXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX2VsZW1lbnRcIikge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogaXNzdWUuaXNzdWVzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzc3VlLnBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZmllbGRFcnJvcnMuX2Vycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgY3VyciA9IGZpZWxkRXJyb3JzO1xuICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICB3aGlsZShpIDwgaXNzdWUucGF0aC5sZW5ndGgpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGlzc3VlLnBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsID0gaSA9PT0gaXNzdWUucGF0aC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRlcm1pbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXJyb3JzOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lcnJvcnM6IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycltlbF0uX2Vycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyW2VsXTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcHJvY2Vzc0Vycm9yKGVycm9yKTtcbiAgICByZXR1cm4gZmllbGRFcnJvcnM7XG59XG5leHBvcnQgZnVuY3Rpb24gdHJlZWlmeUVycm9yKGVycm9yLCBfbWFwcGVyKSB7XG4gICAgY29uc3QgbWFwcGVyID0gX21hcHBlciB8fCBmdW5jdGlvbihpc3N1ZSkge1xuICAgICAgICByZXR1cm4gaXNzdWUubWVzc2FnZTtcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgZXJyb3JzOiBbXVxuICAgIH07XG4gICAgY29uc3QgcHJvY2Vzc0Vycm9yID0gKGVycm9yLCBwYXRoID0gW10pPT57XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGZvciAoY29uc3QgaXNzdWUgb2YgZXJyb3IuaXNzdWVzKXtcbiAgICAgICAgICAgIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfdW5pb25cIiAmJiBpc3N1ZS5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVndWxhciB1bmlvbiBlcnJvclxuICAgICAgICAgICAgICAgIGlzc3VlLmVycm9ycy5tYXAoKGlzc3Vlcyk9PnByb2Nlc3NFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfSwgaXNzdWUucGF0aCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfa2V5XCIpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IGlzc3VlLmlzc3Vlc1xuICAgICAgICAgICAgICAgIH0sIGlzc3VlLnBhdGgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfZWxlbWVudFwiKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBpc3N1ZS5pc3N1ZXNcbiAgICAgICAgICAgICAgICB9LCBpc3N1ZS5wYXRoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbHBhdGggPSBbXG4gICAgICAgICAgICAgICAgICAgIC4uLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIC4uLmlzc3VlLnBhdGhcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGlmIChmdWxscGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGN1cnIgPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlKGkgPCBmdWxscGF0aC5sZW5ndGgpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGZ1bGxwYXRoW2ldO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXJtaW5hbCA9IGkgPT09IGZ1bGxwYXRoLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnIucHJvcGVydGllcyA/PyAoY3Vyci5wcm9wZXJ0aWVzID0ge30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgKF9hID0gY3Vyci5wcm9wZXJ0aWVzKVtlbF0gPz8gKF9hW2VsXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyLnByb3BlcnRpZXNbZWxdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyci5pdGVtcyA/PyAoY3Vyci5pdGVtcyA9IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIChfYiA9IGN1cnIuaXRlbXMpW2VsXSA/PyAoX2JbZWxdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yczogW11cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyciA9IGN1cnIuaXRlbXNbZWxdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyci5lcnJvcnMucHVzaChtYXBwZXIoaXNzdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBwcm9jZXNzRXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKiogRm9ybWF0IGEgWm9kRXJyb3IgYXMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgaW4gdGhlIGZvbGxvd2luZyBmb3JtLlxuICpcbiAqIEZyb21cbiAqXG4gKiBgYGB0c1xuICogWm9kRXJyb3Ige1xuICogICBpc3N1ZXM6IFtcbiAqICAgICB7XG4gKiAgICAgICBleHBlY3RlZDogJ3N0cmluZycsXG4gKiAgICAgICBjb2RlOiAnaW52YWxpZF90eXBlJyxcbiAqICAgICAgIHBhdGg6IFsgJ3VzZXJuYW1lJyBdLFxuICogICAgICAgbWVzc2FnZTogJ0ludmFsaWQgaW5wdXQ6IGV4cGVjdGVkIHN0cmluZydcbiAqICAgICB9LFxuICogICAgIHtcbiAqICAgICAgIGV4cGVjdGVkOiAnbnVtYmVyJyxcbiAqICAgICAgIGNvZGU6ICdpbnZhbGlkX3R5cGUnLFxuICogICAgICAgcGF0aDogWyAnZmF2b3JpdGVOdW1iZXJzJywgMSBdLFxuICogICAgICAgbWVzc2FnZTogJ0ludmFsaWQgaW5wdXQ6IGV4cGVjdGVkIG51bWJlcidcbiAqICAgICB9XG4gKiAgIF07XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiB0b1xuICpcbiAqIGBgYFxuICogdXNlcm5hbWVcbiAqICAgXHUyNzE2IEV4cGVjdGVkIG51bWJlciwgcmVjZWl2ZWQgc3RyaW5nIGF0IFwidXNlcm5hbWVcbiAqIGZhdm9yaXRlTnVtYmVyc1swXVxuICogICBcdTI3MTYgSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgbnVtYmVyXG4gKiBgYGBcbiAqLyBleHBvcnQgZnVuY3Rpb24gdG9Eb3RQYXRoKF9wYXRoKSB7XG4gICAgY29uc3Qgc2VncyA9IFtdO1xuICAgIGNvbnN0IHBhdGggPSBfcGF0aC5tYXAoKHNlZyk9PnR5cGVvZiBzZWcgPT09IFwib2JqZWN0XCIgPyBzZWcua2V5IDogc2VnKTtcbiAgICBmb3IgKGNvbnN0IHNlZyBvZiBwYXRoKXtcbiAgICAgICAgaWYgKHR5cGVvZiBzZWcgPT09IFwibnVtYmVyXCIpIHNlZ3MucHVzaChgWyR7c2VnfV1gKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNlZyA9PT0gXCJzeW1ib2xcIikgc2Vncy5wdXNoKGBbJHtKU09OLnN0cmluZ2lmeShTdHJpbmcoc2VnKSl9XWApO1xuICAgICAgICBlbHNlIGlmICgvW15cXHckXS8udGVzdChzZWcpKSBzZWdzLnB1c2goYFske0pTT04uc3RyaW5naWZ5KHNlZyl9XWApO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzZWdzLmxlbmd0aCkgc2Vncy5wdXNoKFwiLlwiKTtcbiAgICAgICAgICAgIHNlZ3MucHVzaChzZWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZWdzLmpvaW4oXCJcIik7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJldHRpZnlFcnJvcihlcnJvcikge1xuICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgLy8gc29ydCBieSBwYXRoIGxlbmd0aFxuICAgIGNvbnN0IGlzc3VlcyA9IFtcbiAgICAgICAgLi4uZXJyb3IuaXNzdWVzXG4gICAgXS5zb3J0KChhLCBiKT0+KGEucGF0aCA/PyBbXSkubGVuZ3RoIC0gKGIucGF0aCA/PyBbXSkubGVuZ3RoKTtcbiAgICAvLyBQcm9jZXNzIGVhY2ggaXNzdWVcbiAgICBmb3IgKGNvbnN0IGlzc3VlIG9mIGlzc3Vlcyl7XG4gICAgICAgIGxpbmVzLnB1c2goYFx1MjcxNiAke2lzc3VlLm1lc3NhZ2V9YCk7XG4gICAgICAgIGlmIChpc3N1ZS5wYXRoPy5sZW5ndGgpIGxpbmVzLnB1c2goYCAgXHUyMTkyIGF0ICR7dG9Eb3RQYXRoKGlzc3VlLnBhdGgpfWApO1xuICAgIH1cbiAgICAvLyBDb252ZXJ0IE1hcCB0byBmb3JtYXR0ZWQgc3RyaW5nXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG59XG4iLCAiaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi9jb3JlLmpzXCI7XG5pbXBvcnQgKiBhcyBlcnJvcnMgZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gXCIuL3V0aWwuanNcIjtcbmV4cG9ydCBjb25zdCBfcGFyc2UgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4LCBfcGFyYW1zKT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8gT2JqZWN0LmFzc2lnbihfY3R4LCB7XG4gICAgICAgICAgICBhc3luYzogZmFsc2VcbiAgICAgICAgfSkgOiB7XG4gICAgICAgICAgICBhc3luYzogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc2NoZW1hLl96b2QucnVuKHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICB9LCBjdHgpO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuJFpvZEFzeW5jRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBuZXcgKF9wYXJhbXM/LkVyciA/PyBfRXJyKShyZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSkpO1xuICAgICAgICAgICAgdXRpbC5jYXB0dXJlU3RhY2tUcmFjZShlLCBfcGFyYW1zPy5jYWxsZWUpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgIH07XG5leHBvcnQgY29uc3QgcGFyc2UgPSAvKiBAX19QVVJFX18qLyBfcGFyc2UoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9wYXJzZUFzeW5jID0gKF9FcnIpPT5hc3luYyAoc2NoZW1hLCB2YWx1ZSwgX2N0eCwgcGFyYW1zKT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8gT2JqZWN0LmFzc2lnbihfY3R4LCB7XG4gICAgICAgICAgICBhc3luYzogdHJ1ZVxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGFzeW5jOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIGxldCByZXN1bHQgPSBzY2hlbWEuX3pvZC5ydW4oe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgIH0sIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSByZXN1bHQgPSBhd2FpdCByZXN1bHQ7XG4gICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyAocGFyYW1zPy5FcnIgPz8gX0VycikocmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpKTtcbiAgICAgICAgICAgIHV0aWwuY2FwdHVyZVN0YWNrVHJhY2UoZSwgcGFyYW1zPy5jYWxsZWUpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgIH07XG5leHBvcnQgY29uc3QgcGFyc2VBc3luYyA9IC8qIEBfX1BVUkVfXyovIF9wYXJzZUFzeW5jKGVycm9ycy4kWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBfc2FmZVBhcnNlID0gKF9FcnIpPT4oc2NoZW1hLCB2YWx1ZSwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgY3R4ID0gX2N0eCA/IHtcbiAgICAgICAgICAgIC4uLl9jdHgsXG4gICAgICAgICAgICBhc3luYzogZmFsc2VcbiAgICAgICAgfSA6IHtcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzY2hlbWEuX3pvZC5ydW4oe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgIH0sIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS4kWm9kQXN5bmNFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQuaXNzdWVzLmxlbmd0aCA/IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IG5ldyAoX0VyciA/PyBlcnJvcnMuJFpvZEVycm9yKShyZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSkpXG4gICAgICAgIH0gOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogcmVzdWx0LnZhbHVlXG4gICAgICAgIH07XG4gICAgfTtcbmV4cG9ydCBjb25zdCBzYWZlUGFyc2UgPSAvKiBAX19QVVJFX18qLyBfc2FmZVBhcnNlKGVycm9ycy4kWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBfc2FmZVBhcnNlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8gT2JqZWN0LmFzc2lnbihfY3R4LCB7XG4gICAgICAgICAgICBhc3luYzogdHJ1ZVxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGFzeW5jOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIGxldCByZXN1bHQgPSBzY2hlbWEuX3pvZC5ydW4oe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgIH0sIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSByZXN1bHQgPSBhd2FpdCByZXN1bHQ7XG4gICAgICAgIHJldHVybiByZXN1bHQuaXNzdWVzLmxlbmd0aCA/IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IG5ldyBfRXJyKHJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKSlcbiAgICAgICAgfSA6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBkYXRhOiByZXN1bHQudmFsdWVcbiAgICAgICAgfTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IHNhZmVQYXJzZUFzeW5jID0gLyogQF9fUFVSRV9fKi8gX3NhZmVQYXJzZUFzeW5jKGVycm9ycy4kWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBfZW5jb2RlID0gKF9FcnIpPT4oc2NoZW1hLCB2YWx1ZSwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgY3R4ID0gX2N0eCA/IE9iamVjdC5hc3NpZ24oX2N0eCwge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJhY2t3YXJkXCJcbiAgICAgICAgfSkgOiB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3BhcnNlKF9FcnIpKHNjaGVtYSwgdmFsdWUsIGN0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBlbmNvZGUgPSAvKiBAX19QVVJFX18qLyBfZW5jb2RlKGVycm9ycy4kWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBfZGVjb2RlID0gKF9FcnIpPT4oc2NoZW1hLCB2YWx1ZSwgX2N0eCk9PntcbiAgICAgICAgcmV0dXJuIF9wYXJzZShfRXJyKShzY2hlbWEsIHZhbHVlLCBfY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IGRlY29kZSA9IC8qIEBfX1BVUkVfXyovIF9kZWNvZGUoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9lbmNvZGVBc3luYyA9IChfRXJyKT0+YXN5bmMgKHNjaGVtYSwgdmFsdWUsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyBPYmplY3QuYXNzaWduKF9jdHgsIHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH0pIDoge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJhY2t3YXJkXCJcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF9wYXJzZUFzeW5jKF9FcnIpKHNjaGVtYSwgdmFsdWUsIGN0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBlbmNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyovIF9lbmNvZGVBc3luYyhlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX2RlY29kZUFzeW5jID0gKF9FcnIpPT5hc3luYyAoc2NoZW1hLCB2YWx1ZSwgX2N0eCk9PntcbiAgICAgICAgcmV0dXJuIF9wYXJzZUFzeW5jKF9FcnIpKHNjaGVtYSwgdmFsdWUsIF9jdHgpO1xuICAgIH07XG5leHBvcnQgY29uc3QgZGVjb2RlQXN5bmMgPSAvKiBAX19QVVJFX18qLyBfZGVjb2RlQXN5bmMoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlRW5jb2RlID0gKF9FcnIpPT4oc2NoZW1hLCB2YWx1ZSwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgY3R4ID0gX2N0eCA/IE9iamVjdC5hc3NpZ24oX2N0eCwge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJhY2t3YXJkXCJcbiAgICAgICAgfSkgOiB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3NhZmVQYXJzZShfRXJyKShzY2hlbWEsIHZhbHVlLCBjdHgpO1xuICAgIH07XG5leHBvcnQgY29uc3Qgc2FmZUVuY29kZSA9IC8qIEBfX1BVUkVfXyovIF9zYWZlRW5jb2RlKGVycm9ycy4kWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBfc2FmZURlY29kZSA9IChfRXJyKT0+KHNjaGVtYSwgdmFsdWUsIF9jdHgpPT57XG4gICAgICAgIHJldHVybiBfc2FmZVBhcnNlKF9FcnIpKHNjaGVtYSwgdmFsdWUsIF9jdHgpO1xuICAgIH07XG5leHBvcnQgY29uc3Qgc2FmZURlY29kZSA9IC8qIEBfX1BVUkVfXyovIF9zYWZlRGVjb2RlKGVycm9ycy4kWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBfc2FmZUVuY29kZUFzeW5jID0gKF9FcnIpPT5hc3luYyAoc2NoZW1hLCB2YWx1ZSwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgY3R4ID0gX2N0eCA/IE9iamVjdC5hc3NpZ24oX2N0eCwge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJhY2t3YXJkXCJcbiAgICAgICAgfSkgOiB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3NhZmVQYXJzZUFzeW5jKF9FcnIpKHNjaGVtYSwgdmFsdWUsIGN0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBzYWZlRW5jb2RlQXN5bmMgPSAvKiBAX19QVVJFX18qLyBfc2FmZUVuY29kZUFzeW5jKGVycm9ycy4kWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBfc2FmZURlY29kZUFzeW5jID0gKF9FcnIpPT5hc3luYyAoc2NoZW1hLCB2YWx1ZSwgX2N0eCk9PntcbiAgICAgICAgcmV0dXJuIF9zYWZlUGFyc2VBc3luYyhfRXJyKShzY2hlbWEsIHZhbHVlLCBfY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IHNhZmVEZWNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyovIF9zYWZlRGVjb2RlQXN5bmMoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuIiwgImV4cG9ydCBjb25zdCBjdWlkID0gL15bY0NdW15cXHMtXXs4LH0kLztcbmV4cG9ydCBjb25zdCBjdWlkMiA9IC9eWzAtOWEtel0rJC87XG5leHBvcnQgY29uc3QgdWxpZCA9IC9eWzAtOUEtSEpLTU5QLVRWLVphLWhqa21ucC10di16XXsyNn0kLztcbmV4cG9ydCBjb25zdCB4aWQgPSAvXlswLTlhLXZBLVZdezIwfSQvO1xuZXhwb3J0IGNvbnN0IGtzdWlkID0gL15bQS1aYS16MC05XXsyN30kLztcbmV4cG9ydCBjb25zdCBuYW5vaWQgPSAvXlthLXpBLVowLTlfLV17MjF9JC87XG4vKiogSVNPIDg2MDEtMSBkdXJhdGlvbiByZWdleC4gRG9lcyBub3Qgc3VwcG9ydCB0aGUgODYwMS0yIGV4dGVuc2lvbnMgbGlrZSBuZWdhdGl2ZSBkdXJhdGlvbnMgb3IgZnJhY3Rpb25hbC9uZWdhdGl2ZSBjb21wb25lbnRzLiAqLyBleHBvcnQgY29uc3QgZHVyYXRpb24gPSAvXlAoPzooXFxkK1cpfCg/IS4qVykoPz1cXGR8VFxcZCkoXFxkK1kpPyhcXGQrTSk/KFxcZCtEKT8oVCg/PVxcZCkoXFxkK0gpPyhcXGQrTSk/KFxcZCsoWy4sXVxcZCspP1MpPyk/KSQvO1xuLyoqIEltcGxlbWVudHMgSVNPIDg2MDEtMiBleHRlbnNpb25zIGxpa2UgZXhwbGljaXQgKy0gcHJlZml4ZXMsIG1peGluZyB3ZWVrcyB3aXRoIG90aGVyIHVuaXRzLCBhbmQgZnJhY3Rpb25hbC9uZWdhdGl2ZSBjb21wb25lbnRzLiAqLyBleHBvcnQgY29uc3QgZXh0ZW5kZWREdXJhdGlvbiA9IC9eWy0rXT9QKD8hJCkoPzooPzpbLStdP1xcZCtZKXwoPzpbLStdP1xcZCtbLixdXFxkK1kkKSk/KD86KD86Wy0rXT9cXGQrTSl8KD86Wy0rXT9cXGQrWy4sXVxcZCtNJCkpPyg/Oig/OlstK10/XFxkK1cpfCg/OlstK10/XFxkK1suLF1cXGQrVyQpKT8oPzooPzpbLStdP1xcZCtEKXwoPzpbLStdP1xcZCtbLixdXFxkK0QkKSk/KD86VCg/PVtcXGQrLV0pKD86KD86Wy0rXT9cXGQrSCl8KD86Wy0rXT9cXGQrWy4sXVxcZCtIJCkpPyg/Oig/OlstK10/XFxkK00pfCg/OlstK10/XFxkK1suLF1cXGQrTSQpKT8oPzpbLStdP1xcZCsoPzpbLixdXFxkKyk/Uyk/KT8/JC87XG4vKiogQSByZWdleCBmb3IgYW55IFVVSUQtbGlrZSBpZGVudGlmaWVyOiA4LTQtNC00LTEyIGhleCBwYXR0ZXJuICovIGV4cG9ydCBjb25zdCBndWlkID0gL14oWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9KSQvO1xuLyoqIFJldHVybnMgYSByZWdleCBmb3IgdmFsaWRhdGluZyBhbiBSRkMgOTU2Mi80MTIyIFVVSUQuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gT3B0aW9uYWxseSBzcGVjaWZ5IGEgdmVyc2lvbiAxLTguIElmIG5vIHZlcnNpb24gaXMgc3BlY2lmaWVkLCBhbGwgdmVyc2lvbnMgYXJlIHN1cHBvcnRlZC4gKi8gZXhwb3J0IGNvbnN0IHV1aWQgPSAodmVyc2lvbik9PntcbiAgICBpZiAoIXZlcnNpb24pIHJldHVybiAvXihbMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMS04XVswLTlhLWZBLUZdezN9LVs4OWFiQUJdWzAtOWEtZkEtRl17M30tWzAtOWEtZkEtRl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMHxmZmZmZmZmZi1mZmZmLWZmZmYtZmZmZi1mZmZmZmZmZmZmZmYpJC87XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4oWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tJHt2ZXJzaW9ufVswLTlhLWZBLUZdezN9LVs4OWFiQUJdWzAtOWEtZkEtRl17M30tWzAtOWEtZkEtRl17MTJ9KSRgKTtcbn07XG5leHBvcnQgY29uc3QgdXVpZDQgPSAvKkBfX1BVUkVfXyovIHV1aWQoNCk7XG5leHBvcnQgY29uc3QgdXVpZDYgPSAvKkBfX1BVUkVfXyovIHV1aWQoNik7XG5leHBvcnQgY29uc3QgdXVpZDcgPSAvKkBfX1BVUkVfXyovIHV1aWQoNyk7XG4vKiogUHJhY3RpY2FsIGVtYWlsIHZhbGlkYXRpb24gKi8gZXhwb3J0IGNvbnN0IGVtYWlsID0gL14oPyFcXC4pKD8hLipcXC5cXC4pKFtBLVphLXowLTlfJytcXC1cXC5dKilbQS1aYS16MC05XystXUAoW0EtWmEtejAtOV1bQS1aYS16MC05XFwtXSpcXC4pK1tBLVphLXpdezIsfSQvO1xuLyoqIEVxdWl2YWxlbnQgdG8gdGhlIEhUTUw1IGlucHV0W3R5cGU9ZW1haWxdIHZhbGlkYXRpb24gaW1wbGVtZW50ZWQgYnkgYnJvd3NlcnMuIFNvdXJjZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lucHV0L2VtYWlsICovIGV4cG9ydCBjb25zdCBodG1sNUVtYWlsID0gL15bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvO1xuLyoqIFRoZSBjbGFzc2ljIGVtYWlscmVnZXguY29tIHJlZ2V4IGZvciBSRkMgNTMyMi1jb21wbGlhbnQgZW1haWxzICovIGV4cG9ydCBjb25zdCByZmM1MzIyRW1haWwgPSAvXigoW148PigpXFxbXFxdXFxcXC4sOzpcXHNAXCJdKyhcXC5bXjw+KClcXFtcXF1cXFxcLiw7Olxcc0BcIl0rKSopfChcIi4rXCIpKUAoKFxcW1swLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31dKXwoKFthLXpBLVpcXC0wLTldK1xcLikrW2EtekEtWl17Mix9KSkkLztcbi8qKiBBIGxvb3NlIHJlZ2V4IHRoYXQgYWxsb3dzIFVuaWNvZGUgY2hhcmFjdGVycywgZW5mb3JjZXMgbGVuZ3RoIGxpbWl0cywgYW5kIHRoYXQncyBhYm91dCBpdC4gKi8gZXhwb3J0IGNvbnN0IHVuaWNvZGVFbWFpbCA9IC9eW15cXHNAXCJdezEsNjR9QFteXFxzQF17MSwyNTV9JC91O1xuZXhwb3J0IGNvbnN0IGlkbkVtYWlsID0gdW5pY29kZUVtYWlsO1xuZXhwb3J0IGNvbnN0IGJyb3dzZXJFbWFpbCA9IC9eW2EtekEtWjAtOS4hIyQlJicqKy89P15fYHt8fX4tXStAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSokLztcbi8vIGZyb20gaHR0cHM6Ly90aGVrZXZpbnNjb3R0LmNvbS9lbW9qaXMtaW4tamF2YXNjcmlwdC8jd3JpdGluZy1hLXJlZ3VsYXItZXhwcmVzc2lvblxuY29uc3QgX2Vtb2ppID0gYF4oXFxcXHB7RXh0ZW5kZWRfUGljdG9ncmFwaGljfXxcXFxccHtFbW9qaV9Db21wb25lbnR9KSskYDtcbmV4cG9ydCBmdW5jdGlvbiBlbW9qaSgpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChfZW1vamksIFwidVwiKTtcbn1cbmV4cG9ydCBjb25zdCBpcHY0ID0gL14oPzooPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSkkLztcbmV4cG9ydCBjb25zdCBpcHY2ID0gL14oKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KSkkLztcbmV4cG9ydCBjb25zdCBjaWRydjQgPSAvXigoMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLil7M30oMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLyhbMC05XXxbMS0yXVswLTldfDNbMC0yXSkkLztcbmV4cG9ydCBjb25zdCBjaWRydjYgPSAvXigoWzAtOWEtZkEtRl17MSw0fTopezd9WzAtOWEtZkEtRl17MSw0fXw6OnwoWzAtOWEtZkEtRl17MSw0fSk/OjooWzAtOWEtZkEtRl17MSw0fTo/KXswLDZ9KVxcLygxMlswLThdfDFbMDFdWzAtOV18WzEtOV0/WzAtOV0pJC87XG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83ODYwMzkyL2RldGVybWluZS1pZi1zdHJpbmctaXMtaW4tYmFzZTY0LXVzaW5nLWphdmFzY3JpcHRcbmV4cG9ydCBjb25zdCBiYXNlNjQgPSAvXiR8Xig/OlswLTlhLXpBLVorL117NH0pKig/Oig/OlswLTlhLXpBLVorL117Mn09PSl8KD86WzAtOWEtekEtWisvXXszfT0pKT8kLztcbmV4cG9ydCBjb25zdCBiYXNlNjR1cmwgPSAvXltBLVphLXowLTlfLV0qJC87XG4vLyBiYXNlZCBvbiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDYxNzkvcmVndWxhci1leHByZXNzaW9uLXRvLW1hdGNoLWRucy1ob3N0bmFtZS1vci1pcC1hZGRyZXNzXG4vLyBleHBvcnQgY29uc3QgaG9zdG5hbWU6IFJlZ0V4cCA9IC9eKFthLXpBLVowLTktXStcXC4pKlthLXpBLVowLTktXSskLztcbmV4cG9ydCBjb25zdCBob3N0bmFtZSA9IC9eKD89LnsxLDI1M31cXC4/JClbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlstMC05YS16QS1aXXswLDYxfVswLTlhLXpBLVpdKT8pKlxcLj8kLztcbmV4cG9ydCBjb25zdCBkb21haW4gPSAvXihbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT9cXC4pK1thLXpBLVpdezIsfSQvO1xuLy8gaHR0cHM6Ly9ibG9nLnN0ZXZlbmxldml0aGFuLmNvbS9hcmNoaXZlcy92YWxpZGF0ZS1waG9uZS1udW1iZXIjcjQtMyAocmVnZXggc2FucyBzcGFjZXMpXG5leHBvcnQgY29uc3QgZTE2NCA9IC9eXFwrKD86WzAtOV0pezYsMTR9WzAtOV0kLztcbi8vIGNvbnN0IGRhdGVTb3VyY2UgPSBgKChcXFxcZFxcXFxkWzI0NjhdWzA0OF18XFxcXGRcXFxcZFsxMzU3OV1bMjZdfFxcXFxkXFxcXGQwWzQ4XXxbMDI0NjhdWzA0OF0wMHxbMTM1NzldWzI2XTAwKS0wMi0yOXxcXFxcZHs0fS0oKDBbMTM1NzhdfDFbMDJdKS0oMFsxLTldfFsxMl1cXFxcZHwzWzAxXSl8KDBbNDY5XXwxMSktKDBbMS05XXxbMTJdXFxcXGR8MzApfCgwMiktKDBbMS05XXwxXFxcXGR8MlswLThdKSkpYDtcbmNvbnN0IGRhdGVTb3VyY2UgPSBgKD86KD86XFxcXGRcXFxcZFsyNDY4XVswNDhdfFxcXFxkXFxcXGRbMTM1NzldWzI2XXxcXFxcZFxcXFxkMFs0OF18WzAyNDY4XVswNDhdMDB8WzEzNTc5XVsyNl0wMCktMDItMjl8XFxcXGR7NH0tKD86KD86MFsxMzU3OF18MVswMl0pLSg/OjBbMS05XXxbMTJdXFxcXGR8M1swMV0pfCg/OjBbNDY5XXwxMSktKD86MFsxLTldfFsxMl1cXFxcZHwzMCl8KD86MDIpLSg/OjBbMS05XXwxXFxcXGR8MlswLThdKSkpYDtcbmV4cG9ydCBjb25zdCBkYXRlID0gLypAX19QVVJFX18qLyBuZXcgUmVnRXhwKGBeJHtkYXRlU291cmNlfSRgKTtcbmZ1bmN0aW9uIHRpbWVTb3VyY2UoYXJncykge1xuICAgIGNvbnN0IGhobW0gPSBgKD86WzAxXVxcXFxkfDJbMC0zXSk6WzAtNV1cXFxcZGA7XG4gICAgY29uc3QgcmVnZXggPSB0eXBlb2YgYXJncy5wcmVjaXNpb24gPT09IFwibnVtYmVyXCIgPyBhcmdzLnByZWNpc2lvbiA9PT0gLTEgPyBgJHtoaG1tfWAgOiBhcmdzLnByZWNpc2lvbiA9PT0gMCA/IGAke2hobW19OlswLTVdXFxcXGRgIDogYCR7aGhtbX06WzAtNV1cXFxcZFxcXFwuXFxcXGR7JHthcmdzLnByZWNpc2lvbn19YCA6IGAke2hobW19KD86OlswLTVdXFxcXGQoPzpcXFxcLlxcXFxkKyk/KT9gO1xuICAgIHJldHVybiByZWdleDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0aW1lKGFyZ3MpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7dGltZVNvdXJjZShhcmdzKX0kYCk7XG59XG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzMxNDMyMzFcbmV4cG9ydCBmdW5jdGlvbiBkYXRldGltZShhcmdzKSB7XG4gICAgY29uc3QgdGltZSA9IHRpbWVTb3VyY2Uoe1xuICAgICAgICBwcmVjaXNpb246IGFyZ3MucHJlY2lzaW9uXG4gICAgfSk7XG4gICAgY29uc3Qgb3B0cyA9IFtcbiAgICAgICAgXCJaXCJcbiAgICBdO1xuICAgIGlmIChhcmdzLmxvY2FsKSBvcHRzLnB1c2goXCJcIik7XG4gICAgLy8gaWYgKGFyZ3Mub2Zmc2V0KSBvcHRzLnB1c2goYChbKy1dXFxcXGR7Mn06XFxcXGR7Mn0pYCk7XG4gICAgaWYgKGFyZ3Mub2Zmc2V0KSBvcHRzLnB1c2goYChbKy1dKD86WzAxXVxcXFxkfDJbMC0zXSk6WzAtNV1cXFxcZClgKTtcbiAgICBjb25zdCB0aW1lUmVnZXggPSBgJHt0aW1lfSg/OiR7b3B0cy5qb2luKFwifFwiKX0pYDtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7ZGF0ZVNvdXJjZX1UKD86JHt0aW1lUmVnZXh9KSRgKTtcbn1cbmV4cG9ydCBjb25zdCBzdHJpbmcgPSAocGFyYW1zKT0+e1xuICAgIGNvbnN0IHJlZ2V4ID0gcGFyYW1zID8gYFtcXFxcc1xcXFxTXXske3BhcmFtcz8ubWluaW11bSA/PyAwfSwke3BhcmFtcz8ubWF4aW11bSA/PyBcIlwifX1gIDogYFtcXFxcc1xcXFxTXSpgO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHtyZWdleH0kYCk7XG59O1xuZXhwb3J0IGNvbnN0IGJpZ2ludCA9IC9eLT9cXGQrbj8kLztcbmV4cG9ydCBjb25zdCBpbnRlZ2VyID0gL14tP1xcZCskLztcbmV4cG9ydCBjb25zdCBudW1iZXIgPSAvXi0/XFxkKyg/OlxcLlxcZCspPy87XG5leHBvcnQgY29uc3QgYm9vbGVhbiA9IC9eKD86dHJ1ZXxmYWxzZSkkL2k7XG5jb25zdCBfbnVsbCA9IC9ebnVsbCQvaTtcbmV4cG9ydCB7IF9udWxsIGFzIG51bGwgfTtcbmNvbnN0IF91bmRlZmluZWQgPSAvXnVuZGVmaW5lZCQvaTtcbmV4cG9ydCB7IF91bmRlZmluZWQgYXMgdW5kZWZpbmVkIH07XG4vLyByZWdleCBmb3Igc3RyaW5nIHdpdGggbm8gdXBwZXJjYXNlIGxldHRlcnNcbmV4cG9ydCBjb25zdCBsb3dlcmNhc2UgPSAvXlteQS1aXSokLztcbi8vIHJlZ2V4IGZvciBzdHJpbmcgd2l0aCBubyBsb3dlcmNhc2UgbGV0dGVyc1xuZXhwb3J0IGNvbnN0IHVwcGVyY2FzZSA9IC9eW15hLXpdKiQvO1xuLy8gcmVnZXggZm9yIGhleGFkZWNpbWFsIHN0cmluZ3MgKGFueSBsZW5ndGgpXG5leHBvcnQgY29uc3QgaGV4ID0gL15bMC05YS1mQS1GXSokLztcbi8vIEhhc2ggcmVnZXhlcyBmb3IgZGlmZmVyZW50IGFsZ29yaXRobXMgYW5kIGVuY29kaW5nc1xuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBiYXNlNjQgcmVnZXggd2l0aCBleGFjdCBsZW5ndGggYW5kIHBhZGRpbmdcbmZ1bmN0aW9uIGZpeGVkQmFzZTY0KGJvZHlMZW5ndGgsIHBhZGRpbmcpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXltBLVphLXowLTkrL117JHtib2R5TGVuZ3RofX0ke3BhZGRpbmd9JGApO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBiYXNlNjR1cmwgcmVnZXggd2l0aCBleGFjdCBsZW5ndGggKG5vIHBhZGRpbmcpXG5mdW5jdGlvbiBmaXhlZEJhc2U2NHVybChsZW5ndGgpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXltBLVphLXowLTlfLV17JHtsZW5ndGh9fSRgKTtcbn1cbi8vIE1ENSAoMTYgYnl0ZXMpOiBiYXNlNjQgPSAyNCBjaGFycyB0b3RhbCAoMjIgKyBcIj09XCIpXG5leHBvcnQgY29uc3QgbWQ1X2hleCA9IC9eWzAtOWEtZkEtRl17MzJ9JC87XG5leHBvcnQgY29uc3QgbWQ1X2Jhc2U2NCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjQoMjIsIFwiPT1cIik7XG5leHBvcnQgY29uc3QgbWQ1X2Jhc2U2NHVybCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjR1cmwoMjIpO1xuLy8gU0hBMSAoMjAgYnl0ZXMpOiBiYXNlNjQgPSAyOCBjaGFycyB0b3RhbCAoMjcgKyBcIj1cIilcbmV4cG9ydCBjb25zdCBzaGExX2hleCA9IC9eWzAtOWEtZkEtRl17NDB9JC87XG5leHBvcnQgY29uc3Qgc2hhMV9iYXNlNjQgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0KDI3LCBcIj1cIik7XG5leHBvcnQgY29uc3Qgc2hhMV9iYXNlNjR1cmwgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0dXJsKDI3KTtcbi8vIFNIQTI1NiAoMzIgYnl0ZXMpOiBiYXNlNjQgPSA0NCBjaGFycyB0b3RhbCAoNDMgKyBcIj1cIilcbmV4cG9ydCBjb25zdCBzaGEyNTZfaGV4ID0gL15bMC05YS1mQS1GXXs2NH0kLztcbmV4cG9ydCBjb25zdCBzaGEyNTZfYmFzZTY0ID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NCg0MywgXCI9XCIpO1xuZXhwb3J0IGNvbnN0IHNoYTI1Nl9iYXNlNjR1cmwgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0dXJsKDQzKTtcbi8vIFNIQTM4NCAoNDggYnl0ZXMpOiBiYXNlNjQgPSA2NCBjaGFycyB0b3RhbCAobm8gcGFkZGluZylcbmV4cG9ydCBjb25zdCBzaGEzODRfaGV4ID0gL15bMC05YS1mQS1GXXs5Nn0kLztcbmV4cG9ydCBjb25zdCBzaGEzODRfYmFzZTY0ID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NCg2NCwgXCJcIik7XG5leHBvcnQgY29uc3Qgc2hhMzg0X2Jhc2U2NHVybCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjR1cmwoNjQpO1xuLy8gU0hBNTEyICg2NCBieXRlcyk6IGJhc2U2NCA9IDg4IGNoYXJzIHRvdGFsICg4NiArIFwiPT1cIilcbmV4cG9ydCBjb25zdCBzaGE1MTJfaGV4ID0gL15bMC05YS1mQS1GXXsxMjh9JC87XG5leHBvcnQgY29uc3Qgc2hhNTEyX2Jhc2U2NCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjQoODYsIFwiPT1cIik7XG5leHBvcnQgY29uc3Qgc2hhNTEyX2Jhc2U2NHVybCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjR1cmwoODYpO1xuIiwgIi8vIGltcG9ydCB7ICRab2RUeXBlIH0gZnJvbSBcIi4vc2NoZW1hcy5qc1wiO1xuaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi9jb3JlLmpzXCI7XG5pbXBvcnQgKiBhcyByZWdleGVzIGZyb20gXCIuL3JlZ2V4ZXMuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVjayA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgaW5zdC5fem9kID8/IChpbnN0Ll96b2QgPSB7fSk7XG4gICAgaW5zdC5fem9kLmRlZiA9IGRlZjtcbiAgICAoX2EgPSBpbnN0Ll96b2QpLm9uYXR0YWNoID8/IChfYS5vbmF0dGFjaCA9IFtdKTtcbn0pO1xuY29uc3QgbnVtZXJpY09yaWdpbk1hcCA9IHtcbiAgICBudW1iZXI6IFwibnVtYmVyXCIsXG4gICAgYmlnaW50OiBcImJpZ2ludFwiLFxuICAgIG9iamVjdDogXCJkYXRlXCJcbn07XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTGVzc1RoYW4gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTGVzc1RoYW5cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IG9yaWdpbiA9IG51bWVyaWNPcmlnaW5NYXBbdHlwZW9mIGRlZi52YWx1ZV07XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGNvbnN0IGN1cnIgPSAoZGVmLmluY2x1c2l2ZSA/IGJhZy5tYXhpbXVtIDogYmFnLmV4Y2x1c2l2ZU1heGltdW0pID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgaWYgKGRlZi52YWx1ZSA8IGN1cnIpIHtcbiAgICAgICAgICAgIGlmIChkZWYuaW5jbHVzaXZlKSBiYWcubWF4aW11bSA9IGRlZi52YWx1ZTtcbiAgICAgICAgICAgIGVsc2UgYmFnLmV4Y2x1c2l2ZU1heGltdW0gPSBkZWYudmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKGRlZi5pbmNsdXNpdmUgPyBwYXlsb2FkLnZhbHVlIDw9IGRlZi52YWx1ZSA6IHBheWxvYWQudmFsdWUgPCBkZWYudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgbWF4aW11bTogZGVmLnZhbHVlLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGRlZi5pbmNsdXNpdmUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja0dyZWF0ZXJUaGFuID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja0dyZWF0ZXJUaGFuXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCBvcmlnaW4gPSBudW1lcmljT3JpZ2luTWFwW3R5cGVvZiBkZWYudmFsdWVdO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgICAgICBjb25zdCBjdXJyID0gKGRlZi5pbmNsdXNpdmUgPyBiYWcubWluaW11bSA6IGJhZy5leGNsdXNpdmVNaW5pbXVtKSA/PyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIGlmIChkZWYudmFsdWUgPiBjdXJyKSB7XG4gICAgICAgICAgICBpZiAoZGVmLmluY2x1c2l2ZSkgYmFnLm1pbmltdW0gPSBkZWYudmFsdWU7XG4gICAgICAgICAgICBlbHNlIGJhZy5leGNsdXNpdmVNaW5pbXVtID0gZGVmLnZhbHVlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmIChkZWYuaW5jbHVzaXZlID8gcGF5bG9hZC52YWx1ZSA+PSBkZWYudmFsdWUgOiBwYXlsb2FkLnZhbHVlID4gZGVmLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgbWluaW11bTogZGVmLnZhbHVlLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGRlZi5pbmNsdXNpdmUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja011bHRpcGxlT2YgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTXVsdGlwbGVPZlwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gaW5zdC5fem9kLmJhZykubXVsdGlwbGVPZiA/PyAoX2EubXVsdGlwbGVPZiA9IGRlZi52YWx1ZSk7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC52YWx1ZSAhPT0gdHlwZW9mIGRlZi52YWx1ZSkgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IG1peCBudW1iZXIgYW5kIGJpZ2ludCBpbiBtdWx0aXBsZV9vZiBjaGVjay5cIik7XG4gICAgICAgIGNvbnN0IGlzTXVsdGlwbGUgPSB0eXBlb2YgcGF5bG9hZC52YWx1ZSA9PT0gXCJiaWdpbnRcIiA/IHBheWxvYWQudmFsdWUgJSBkZWYudmFsdWUgPT09IEJpZ0ludCgwKSA6IHV0aWwuZmxvYXRTYWZlUmVtYWluZGVyKHBheWxvYWQudmFsdWUsIGRlZi52YWx1ZSkgPT09IDA7XG4gICAgICAgIGlmIChpc011bHRpcGxlKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luOiB0eXBlb2YgcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGNvZGU6IFwibm90X211bHRpcGxlX29mXCIsXG4gICAgICAgICAgICBkaXZpc29yOiBkZWYudmFsdWUsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTnVtYmVyRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja051bWJlckZvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7IC8vIG5vIGZvcm1hdCBjaGVja3NcbiAgICBkZWYuZm9ybWF0ID0gZGVmLmZvcm1hdCB8fCBcImZsb2F0NjRcIjtcbiAgICBjb25zdCBpc0ludCA9IGRlZi5mb3JtYXQ/LmluY2x1ZGVzKFwiaW50XCIpO1xuICAgIGNvbnN0IG9yaWdpbiA9IGlzSW50ID8gXCJpbnRcIiA6IFwibnVtYmVyXCI7XG4gICAgY29uc3QgW21pbmltdW0sIG1heGltdW1dID0gdXRpbC5OVU1CRVJfRk9STUFUX1JBTkdFU1tkZWYuZm9ybWF0XTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLmZvcm1hdCA9IGRlZi5mb3JtYXQ7XG4gICAgICAgIGJhZy5taW5pbXVtID0gbWluaW11bTtcbiAgICAgICAgYmFnLm1heGltdW0gPSBtYXhpbXVtO1xuICAgICAgICBpZiAoaXNJbnQpIGJhZy5wYXR0ZXJuID0gcmVnZXhlcy5pbnRlZ2VyO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmIChpc0ludCkge1xuICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlucHV0KSkge1xuICAgICAgICAgICAgICAgIC8vIGludmFsaWRfZm9ybWF0IGlzc3VlXG4gICAgICAgICAgICAgICAgLy8gcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgLy8gICBleHBlY3RlZDogZGVmLmZvcm1hdCxcbiAgICAgICAgICAgICAgICAvLyAgIGZvcm1hdDogZGVmLmZvcm1hdCxcbiAgICAgICAgICAgICAgICAvLyAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgICAgICAvLyAgIGlucHV0LFxuICAgICAgICAgICAgICAgIC8vICAgaW5zdCxcbiAgICAgICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgICAgICAvLyBpbnZhbGlkX3R5cGUgaXNzdWVcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IG9yaWdpbixcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBkZWYuZm9ybWF0LFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gbm90X211bHRpcGxlX29mIGlzc3VlXG4gICAgICAgICAgICAvLyBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIC8vICAgY29kZTogXCJub3RfbXVsdGlwbGVfb2ZcIixcbiAgICAgICAgICAgIC8vICAgb3JpZ2luOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgLy8gICBpbnB1dCxcbiAgICAgICAgICAgIC8vICAgaW5zdCxcbiAgICAgICAgICAgIC8vICAgZGl2aXNvcjogMSxcbiAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvb19iaWdcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkludGVnZXJzIG11c3QgYmUgd2l0aGluIHRoZSBzYWZlIGludGVnZXIgcmFuZ2UuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdG9vX3NtYWxsXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIsXG4gICAgICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkludGVnZXJzIG11c3QgYmUgd2l0aGluIHRoZSBzYWZlIGludGVnZXIgcmFuZ2UuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXQgPCBtaW5pbXVtKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBvcmlnaW46IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgY29kZTogXCJ0b29fc21hbGxcIixcbiAgICAgICAgICAgICAgICBtaW5pbXVtLFxuICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXQgPiBtYXhpbXVtKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBvcmlnaW46IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgY29kZTogXCJ0b29fYmlnXCIsXG4gICAgICAgICAgICAgICAgbWF4aW11bSxcbiAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tCaWdJbnRGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrQmlnSW50Rm9ybWF0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTsgLy8gbm8gZm9ybWF0IGNoZWNrc1xuICAgIGNvbnN0IFttaW5pbXVtLCBtYXhpbXVtXSA9IHV0aWwuQklHSU5UX0ZPUk1BVF9SQU5HRVNbZGVmLmZvcm1hdF07XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5mb3JtYXQgPSBkZWYuZm9ybWF0O1xuICAgICAgICBiYWcubWluaW11bSA9IG1pbmltdW07XG4gICAgICAgIGJhZy5tYXhpbXVtID0gbWF4aW11bTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoaW5wdXQgPCBtaW5pbXVtKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBvcmlnaW46IFwiYmlnaW50XCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgY29kZTogXCJ0b29fc21hbGxcIixcbiAgICAgICAgICAgICAgICBtaW5pbXVtOiBtaW5pbXVtLFxuICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXQgPiBtYXhpbXVtKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBvcmlnaW46IFwiYmlnaW50XCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgY29kZTogXCJ0b29fYmlnXCIsXG4gICAgICAgICAgICAgICAgbWF4aW11bSxcbiAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tNYXhTaXplID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja01heFNpemVcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICAoX2EgPSBpbnN0Ll96b2QuZGVmKS53aGVuID8/IChfYS53aGVuID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IHZhbCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIHJldHVybiAhdXRpbC5udWxsaXNoKHZhbCkgJiYgdmFsLnNpemUgIT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgY3VyciA9IGluc3QuX3pvZC5iYWcubWF4aW11bSA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIGlmIChkZWYubWF4aW11bSA8IGN1cnIpIGluc3QuX3pvZC5iYWcubWF4aW11bSA9IGRlZi5tYXhpbXVtO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IHNpemUgPSBpbnB1dC5zaXplO1xuICAgICAgICBpZiAoc2l6ZSA8PSBkZWYubWF4aW11bSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogdXRpbC5nZXRTaXphYmxlT3JpZ2luKGlucHV0KSxcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heGltdW0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTWluU2l6ZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tNaW5TaXplXCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hO1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgKF9hID0gaW5zdC5fem9kLmRlZikud2hlbiA/PyAoX2Eud2hlbiA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCB2YWwgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICByZXR1cm4gIXV0aWwubnVsbGlzaCh2YWwpICYmIHZhbC5zaXplICE9PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGN1cnIgPSBpbnN0Ll96b2QuYmFnLm1pbmltdW0gPz8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICBpZiAoZGVmLm1pbmltdW0gPiBjdXJyKSBpbnN0Ll96b2QuYmFnLm1pbmltdW0gPSBkZWYubWluaW11bTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBzaXplID0gaW5wdXQuc2l6ZTtcbiAgICAgICAgaWYgKHNpemUgPj0gZGVmLm1pbmltdW0pIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IHV0aWwuZ2V0U2l6YWJsZU9yaWdpbihpbnB1dCksXG4gICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgbWluaW11bTogZGVmLm1pbmltdW0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrU2l6ZUVxdWFscyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tTaXplRXF1YWxzXCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hO1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgKF9hID0gaW5zdC5fem9kLmRlZikud2hlbiA/PyAoX2Eud2hlbiA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCB2YWwgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICByZXR1cm4gIXV0aWwubnVsbGlzaCh2YWwpICYmIHZhbC5zaXplICE9PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5taW5pbXVtID0gZGVmLnNpemU7XG4gICAgICAgIGJhZy5tYXhpbXVtID0gZGVmLnNpemU7XG4gICAgICAgIGJhZy5zaXplID0gZGVmLnNpemU7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IGlucHV0LnNpemU7XG4gICAgICAgIGlmIChzaXplID09PSBkZWYuc2l6ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0b29CaWcgPSBzaXplID4gZGVmLnNpemU7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luOiB1dGlsLmdldFNpemFibGVPcmlnaW4oaW5wdXQpLFxuICAgICAgICAgICAgLi4udG9vQmlnID8ge1xuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgICAgIG1heGltdW06IGRlZi5zaXplXG4gICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICAgICAgbWluaW11bTogZGVmLnNpemVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tNYXhMZW5ndGggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTWF4TGVuZ3RoXCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hO1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgKF9hID0gaW5zdC5fem9kLmRlZikud2hlbiA/PyAoX2Eud2hlbiA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCB2YWwgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICByZXR1cm4gIXV0aWwubnVsbGlzaCh2YWwpICYmIHZhbC5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgY3VyciA9IGluc3QuX3pvZC5iYWcubWF4aW11bSA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIGlmIChkZWYubWF4aW11bSA8IGN1cnIpIGluc3QuX3pvZC5iYWcubWF4aW11bSA9IGRlZi5tYXhpbXVtO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA8PSBkZWYubWF4aW11bSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBvcmlnaW4gPSB1dGlsLmdldExlbmd0aGFibGVPcmlnaW4oaW5wdXQpO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX2JpZ1wiLFxuICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heGltdW0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTWluTGVuZ3RoID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja01pbkxlbmd0aFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIHZhciBfYTtcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIChfYSA9IGluc3QuX3pvZC5kZWYpLndoZW4gPz8gKF9hLndoZW4gPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgdmFsID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgcmV0dXJuICF1dGlsLm51bGxpc2godmFsKSAmJiB2YWwubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGN1cnIgPSBpbnN0Ll96b2QuYmFnLm1pbmltdW0gPz8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICBpZiAoZGVmLm1pbmltdW0gPiBjdXJyKSBpbnN0Ll96b2QuYmFnLm1pbmltdW0gPSBkZWYubWluaW11bTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPj0gZGVmLm1pbmltdW0pIHJldHVybjtcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gdXRpbC5nZXRMZW5ndGhhYmxlT3JpZ2luKGlucHV0KTtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgbWluaW11bTogZGVmLm1pbmltdW0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTGVuZ3RoRXF1YWxzID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja0xlbmd0aEVxdWFsc1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIHZhciBfYTtcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIChfYSA9IGluc3QuX3pvZC5kZWYpLndoZW4gPz8gKF9hLndoZW4gPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgdmFsID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgcmV0dXJuICF1dGlsLm51bGxpc2godmFsKSAmJiB2YWwubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5taW5pbXVtID0gZGVmLmxlbmd0aDtcbiAgICAgICAgYmFnLm1heGltdW0gPSBkZWYubGVuZ3RoO1xuICAgICAgICBiYWcubGVuZ3RoID0gZGVmLmxlbmd0aDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPT09IGRlZi5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gdXRpbC5nZXRMZW5ndGhhYmxlT3JpZ2luKGlucHV0KTtcbiAgICAgICAgY29uc3QgdG9vQmlnID0gbGVuZ3RoID4gZGVmLmxlbmd0aDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICAuLi50b29CaWcgPyB7XG4gICAgICAgICAgICAgICAgY29kZTogXCJ0b29fYmlnXCIsXG4gICAgICAgICAgICAgICAgbWF4aW11bTogZGVmLmxlbmd0aFxuICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgICAgIG1pbmltdW06IGRlZi5sZW5ndGhcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tTdHJpbmdGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrU3RyaW5nRm9ybWF0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hLCBfYjtcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgICAgICBiYWcuZm9ybWF0ID0gZGVmLmZvcm1hdDtcbiAgICAgICAgaWYgKGRlZi5wYXR0ZXJuKSB7XG4gICAgICAgICAgICBiYWcucGF0dGVybnMgPz8gKGJhZy5wYXR0ZXJucyA9IG5ldyBTZXQoKSk7XG4gICAgICAgICAgICBiYWcucGF0dGVybnMuYWRkKGRlZi5wYXR0ZXJuKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChkZWYucGF0dGVybikgKF9hID0gaW5zdC5fem9kKS5jaGVjayA/PyAoX2EuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgZGVmLnBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICAgICAgaWYgKGRlZi5wYXR0ZXJuLnRlc3QocGF5bG9hZC52YWx1ZSkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IGRlZi5mb3JtYXQsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIC4uLmRlZi5wYXR0ZXJuID8ge1xuICAgICAgICAgICAgICAgIHBhdHRlcm46IGRlZi5wYXR0ZXJuLnRvU3RyaW5nKClcbiAgICAgICAgICAgIH0gOiB7fSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBlbHNlIChfYiA9IGluc3QuX3pvZCkuY2hlY2sgPz8gKF9iLmNoZWNrID0gKCk9Pnt9KTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja1JlZ2V4ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja1JlZ2V4XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgZGVmLnBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICAgICAgaWYgKGRlZi5wYXR0ZXJuLnRlc3QocGF5bG9hZC52YWx1ZSkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IFwicmVnZXhcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgcGF0dGVybjogZGVmLnBhdHRlcm4udG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTG93ZXJDYXNlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja0xvd2VyQ2FzZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMubG93ZXJjYXNlKTtcbiAgICAkWm9kQ2hlY2tTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrVXBwZXJDYXNlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja1VwcGVyQ2FzZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMudXBwZXJjYXNlKTtcbiAgICAkWm9kQ2hlY2tTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrSW5jbHVkZXMgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrSW5jbHVkZXNcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IGVzY2FwZWRSZWdleCA9IHV0aWwuZXNjYXBlUmVnZXgoZGVmLmluY2x1ZGVzKTtcbiAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cCh0eXBlb2YgZGVmLnBvc2l0aW9uID09PSBcIm51bWJlclwiID8gYF4ueyR7ZGVmLnBvc2l0aW9ufX0ke2VzY2FwZWRSZWdleH1gIDogZXNjYXBlZFJlZ2V4KTtcbiAgICBkZWYucGF0dGVybiA9IHBhdHRlcm47XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5wYXR0ZXJucyA/PyAoYmFnLnBhdHRlcm5zID0gbmV3IFNldCgpKTtcbiAgICAgICAgYmFnLnBhdHRlcm5zLmFkZChwYXR0ZXJuKTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKHBheWxvYWQudmFsdWUuaW5jbHVkZXMoZGVmLmluY2x1ZGVzLCBkZWYucG9zaXRpb24pKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBcImluY2x1ZGVzXCIsXG4gICAgICAgICAgICBpbmNsdWRlczogZGVmLmluY2x1ZGVzLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja1N0YXJ0c1dpdGggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrU3RhcnRzV2l0aFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke3V0aWwuZXNjYXBlUmVnZXgoZGVmLnByZWZpeCl9LipgKTtcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSBwYXR0ZXJuKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLnBhdHRlcm5zID8/IChiYWcucGF0dGVybnMgPSBuZXcgU2V0KCkpO1xuICAgICAgICBiYWcucGF0dGVybnMuYWRkKHBhdHRlcm4pO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAocGF5bG9hZC52YWx1ZS5zdGFydHNXaXRoKGRlZi5wcmVmaXgpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBcInN0YXJ0c193aXRoXCIsXG4gICAgICAgICAgICBwcmVmaXg6IGRlZi5wcmVmaXgsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrRW5kc1dpdGggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrRW5kc1dpdGhcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKGAuKiR7dXRpbC5lc2NhcGVSZWdleChkZWYuc3VmZml4KX0kYCk7XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcGF0dGVybik7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5wYXR0ZXJucyA/PyAoYmFnLnBhdHRlcm5zID0gbmV3IFNldCgpKTtcbiAgICAgICAgYmFnLnBhdHRlcm5zLmFkZChwYXR0ZXJuKTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKHBheWxvYWQudmFsdWUuZW5kc1dpdGgoZGVmLnN1ZmZpeCkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IFwiZW5kc193aXRoXCIsXG4gICAgICAgICAgICBzdWZmaXg6IGRlZi5zdWZmaXgsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8gICAgJFpvZENoZWNrUHJvcGVydHkgICAgLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5mdW5jdGlvbiBoYW5kbGVDaGVja1Byb3BlcnR5UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgcHJvcGVydHkpIHtcbiAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3Vlcyhwcm9wZXJ0eSwgcmVzdWx0Lmlzc3VlcykpO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tQcm9wZXJ0eSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tQcm9wZXJ0eVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5zY2hlbWEuX3pvZC5ydW4oe1xuICAgICAgICAgICAgdmFsdWU6IHBheWxvYWQudmFsdWVbZGVmLnByb3BlcnR5XSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwge30pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyZXN1bHQpPT5oYW5kbGVDaGVja1Byb3BlcnR5UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgZGVmLnByb3BlcnR5KSk7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlQ2hlY2tQcm9wZXJ0eVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGRlZi5wcm9wZXJ0eSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTWltZVR5cGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTWltZVR5cGVcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IG1pbWVTZXQgPSBuZXcgU2V0KGRlZi5taW1lKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgaW5zdC5fem9kLmJhZy5taW1lID0gZGVmLm1pbWU7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmIChtaW1lU2V0LmhhcyhwYXlsb2FkLnZhbHVlLnR5cGUpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3ZhbHVlXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IGRlZi5taW1lLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUudHlwZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrT3ZlcndyaXRlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja092ZXJ3cml0ZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSBkZWYudHgocGF5bG9hZC52YWx1ZSk7XG4gICAgfTtcbn0pO1xuIiwgImV4cG9ydCBjbGFzcyBEb2Mge1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MgPSBbXSl7XG4gICAgICAgIHRoaXMuY29udGVudCA9IFtdO1xuICAgICAgICB0aGlzLmluZGVudCA9IDA7XG4gICAgICAgIGlmICh0aGlzKSB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cbiAgICBpbmRlbnRlZChmbikge1xuICAgICAgICB0aGlzLmluZGVudCArPSAxO1xuICAgICAgICBmbih0aGlzKTtcbiAgICAgICAgdGhpcy5pbmRlbnQgLT0gMTtcbiAgICB9XG4gICAgd3JpdGUoYXJnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXJnID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGFyZyh0aGlzLCB7XG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uOiBcInN5bmNcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhcmcodGhpcywge1xuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbjogXCJhc3luY1wiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250ZW50ID0gYXJnO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIikuZmlsdGVyKCh4KT0+eCk7XG4gICAgICAgIGNvbnN0IG1pbkluZGVudCA9IE1hdGgubWluKC4uLmxpbmVzLm1hcCgoeCk9PngubGVuZ3RoIC0geC50cmltU3RhcnQoKS5sZW5ndGgpKTtcbiAgICAgICAgY29uc3QgZGVkZW50ZWQgPSBsaW5lcy5tYXAoKHgpPT54LnNsaWNlKG1pbkluZGVudCkpLm1hcCgoeCk9PlwiIFwiLnJlcGVhdCh0aGlzLmluZGVudCAqIDIpICsgeCk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBkZWRlbnRlZCl7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQucHVzaChsaW5lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICBjb25zdCBGID0gRnVuY3Rpb247XG4gICAgICAgIGNvbnN0IGFyZ3MgPSB0aGlzPy5hcmdzO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcz8uY29udGVudCA/PyBbXG4gICAgICAgICAgICBgYFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgICAgICAgIC4uLmNvbnRlbnQubWFwKCh4KT0+YCAgJHt4fWApXG4gICAgICAgIF07XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGxpbmVzLmpvaW4oXCJcXG5cIikpO1xuICAgICAgICByZXR1cm4gbmV3IEYoLi4uYXJncywgbGluZXMuam9pbihcIlxcblwiKSk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCB2ZXJzaW9uID0ge1xuICAgIG1ham9yOiA0LFxuICAgIG1pbm9yOiAxLFxuICAgIHBhdGNoOiAxMVxufTtcbiIsICJpbXBvcnQgKiBhcyBjaGVja3MgZnJvbSBcIi4vY2hlY2tzLmpzXCI7XG5pbXBvcnQgKiBhcyBjb3JlIGZyb20gXCIuL2NvcmUuanNcIjtcbmltcG9ydCB7IERvYyB9IGZyb20gXCIuL2RvYy5qc1wiO1xuaW1wb3J0IHsgcGFyc2UsIHBhcnNlQXN5bmMsIHNhZmVQYXJzZSwgc2FmZVBhcnNlQXN5bmMgfSBmcm9tIFwiLi9wYXJzZS5qc1wiO1xuaW1wb3J0ICogYXMgcmVnZXhlcyBmcm9tIFwiLi9yZWdleGVzLmpzXCI7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gXCIuL3V0aWwuanNcIjtcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tIFwiLi92ZXJzaW9ucy5qc1wiO1xuZXhwb3J0IGNvbnN0ICRab2RUeXBlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RUeXBlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hO1xuICAgIGluc3QgPz8gKGluc3QgPSB7fSk7XG4gICAgaW5zdC5fem9kLmRlZiA9IGRlZjsgLy8gc2V0IF9kZWYgcHJvcGVydHlcbiAgICBpbnN0Ll96b2QuYmFnID0gaW5zdC5fem9kLmJhZyB8fCB7fTsgLy8gaW5pdGlhbGl6ZSBfYmFnIG9iamVjdFxuICAgIGluc3QuX3pvZC52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICBjb25zdCBjaGVja3MgPSBbXG4gICAgICAgIC4uLmluc3QuX3pvZC5kZWYuY2hlY2tzID8/IFtdXG4gICAgXTtcbiAgICAvLyBpZiBpbnN0IGlzIGl0c2VsZiBhIGNoZWNrcy4kWm9kQ2hlY2ssIHJ1biBpdCBhcyBhIGNoZWNrXG4gICAgaWYgKGluc3QuX3pvZC50cmFpdHMuaGFzKFwiJFpvZENoZWNrXCIpKSB7XG4gICAgICAgIGNoZWNrcy51bnNoaWZ0KGluc3QpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNoIG9mIGNoZWNrcyl7XG4gICAgICAgIGZvciAoY29uc3QgZm4gb2YgY2guX3pvZC5vbmF0dGFjaCl7XG4gICAgICAgICAgICBmbihpbnN0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hlY2tzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBkZWZlcnJlZCBpbml0aWFsaXplclxuICAgICAgICAvLyBpbnN0Ll96b2QucGFyc2UgaXMgbm90IHlldCBkZWZpbmVkXG4gICAgICAgIChfYSA9IGluc3QuX3pvZCkuZGVmZXJyZWQgPz8gKF9hLmRlZmVycmVkID0gW10pO1xuICAgICAgICBpbnN0Ll96b2QuZGVmZXJyZWQ/LnB1c2goKCk9PntcbiAgICAgICAgICAgIGluc3QuX3pvZC5ydW4gPSBpbnN0Ll96b2QucGFyc2U7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJ1bkNoZWNrcyA9IChwYXlsb2FkLCBjaGVja3MsIGN0eCk9PntcbiAgICAgICAgICAgIGxldCBpc0Fib3J0ZWQgPSB1dGlsLmFib3J0ZWQocGF5bG9hZCk7XG4gICAgICAgICAgICBsZXQgYXN5bmNSZXN1bHQ7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIGNoZWNrcyl7XG4gICAgICAgICAgICAgICAgaWYgKGNoLl96b2QuZGVmLndoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkUnVuID0gY2guX3pvZC5kZWYud2hlbihwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRSdW4pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNBYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyTGVuID0gcGF5bG9hZC5pc3N1ZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IF8gPSBjaC5fem9kLmNoZWNrKHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIGlmIChfIGluc3RhbmNlb2YgUHJvbWlzZSAmJiBjdHg/LmFzeW5jID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS4kWm9kQXN5bmNFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXN5bmNSZXN1bHQgfHwgXyBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXN1bHQgPSAoYXN5bmNSZXN1bHQgPz8gUHJvbWlzZS5yZXNvbHZlKCkpLnRoZW4oYXN5bmMgKCk9PntcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IF87XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0TGVuID0gcGF5bG9hZC5pc3N1ZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRMZW4gPT09IGN1cnJMZW4pIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNBYm9ydGVkKSBpc0Fib3J0ZWQgPSB1dGlsLmFib3J0ZWQocGF5bG9hZCwgY3Vyckxlbik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRMZW4gPSBwYXlsb2FkLmlzc3Vlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0TGVuID09PSBjdXJyTGVuKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Fib3J0ZWQpIGlzQWJvcnRlZCA9IHV0aWwuYWJvcnRlZChwYXlsb2FkLCBjdXJyTGVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXN5bmNSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXN5bmNSZXN1bHQudGhlbigoKT0+e1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9O1xuICAgICAgICAvLyBjb25zdCBoYW5kbGVDaGVja3NSZXN1bHQgPSAoXG4gICAgICAgIC8vICAgY2hlY2tSZXN1bHQ6IFBhcnNlUGF5bG9hZCxcbiAgICAgICAgLy8gICBvcmlnaW5hbFJlc3VsdDogUGFyc2VQYXlsb2FkLFxuICAgICAgICAvLyAgIGN0eDogUGFyc2VDb250ZXh0SW50ZXJuYWxcbiAgICAgICAgLy8gKTogdXRpbC5NYXliZUFzeW5jPFBhcnNlUGF5bG9hZD4gPT4ge1xuICAgICAgICAvLyAgIC8vIGlmIHRoZSBjaGVja3MgbXV0YXRlZCB0aGUgdmFsdWUgJiYgdGhlcmUgYXJlIG5vIGlzc3VlcywgcmUtcGFyc2UgdGhlIHJlc3VsdFxuICAgICAgICAvLyAgIGlmIChjaGVja1Jlc3VsdC52YWx1ZSAhPT0gb3JpZ2luYWxSZXN1bHQudmFsdWUgJiYgIWNoZWNrUmVzdWx0Lmlzc3Vlcy5sZW5ndGgpXG4gICAgICAgIC8vICAgICByZXR1cm4gaW5zdC5fem9kLnBhcnNlKGNoZWNrUmVzdWx0LCBjdHgpO1xuICAgICAgICAvLyAgIHJldHVybiBvcmlnaW5hbFJlc3VsdDtcbiAgICAgICAgLy8gfTtcbiAgICAgICAgY29uc3QgaGFuZGxlQ2FuYXJ5UmVzdWx0ID0gKGNhbmFyeSwgcGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICAgICAgLy8gYWJvcnQgaWYgdGhlIGNhbmFyeSBpcyBhYm9ydGVkXG4gICAgICAgICAgICBpZiAodXRpbC5hYm9ydGVkKGNhbmFyeSkpIHtcbiAgICAgICAgICAgICAgICBjYW5hcnkuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbmFyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJ1biBjaGVja3MgZmlyc3QsIHRoZW5cbiAgICAgICAgICAgIGNvbnN0IGNoZWNrUmVzdWx0ID0gcnVuQ2hlY2tzKHBheWxvYWQsIGNoZWNrcywgY3R4KTtcbiAgICAgICAgICAgIGlmIChjaGVja1Jlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3R4LmFzeW5jID09PSBmYWxzZSkgdGhyb3cgbmV3IGNvcmUuJFpvZEFzeW5jRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tSZXN1bHQudGhlbigoY2hlY2tSZXN1bHQpPT5pbnN0Ll96b2QucGFyc2UoY2hlY2tSZXN1bHQsIGN0eCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGluc3QuX3pvZC5wYXJzZShjaGVja1Jlc3VsdCwgY3R4KTtcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdC5fem9kLnJ1biA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgICAgICBpZiAoY3R4LnNraXBDaGVja3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdC5fem9kLnBhcnNlKHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICAgICAgLy8gcnVuIGNhbmFyeVxuICAgICAgICAgICAgICAgIC8vIGluaXRpYWwgcGFzcyAobm8gY2hlY2tzKVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmFyeSA9IGluc3QuX3pvZC5wYXJzZSh7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAuLi5jdHgsXG4gICAgICAgICAgICAgICAgICAgIHNraXBDaGVja3M6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoY2FuYXJ5IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FuYXJ5LnRoZW4oKGNhbmFyeSk9PntcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVDYW5hcnlSZXN1bHQoY2FuYXJ5LCBwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUNhbmFyeVJlc3VsdChjYW5hcnksIHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmb3J3YXJkXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBpbnN0Ll96b2QucGFyc2UocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN0eC5hc3luYyA9PT0gZmFsc2UpIHRocm93IG5ldyBjb3JlLiRab2RBc3luY0Vycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyZXN1bHQpPT5ydW5DaGVja3MocmVzdWx0LCBjaGVja3MsIGN0eCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJ1bkNoZWNrcyhyZXN1bHQsIGNoZWNrcywgY3R4KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaW5zdFtcIn5zdGFuZGFyZFwiXSA9IHtcbiAgICAgICAgdmFsaWRhdGU6ICh2YWx1ZSk9PntcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHNhZmVQYXJzZShpbnN0LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHIuc3VjY2VzcyA/IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHIuZGF0YVxuICAgICAgICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICAgICAgICAgIGlzc3Vlczogci5lcnJvcj8uaXNzdWVzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2FmZVBhcnNlQXN5bmMoaW5zdCwgdmFsdWUpLnRoZW4oKHIpPT5yLnN1Y2Nlc3MgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogci5kYXRhXG4gICAgICAgICAgICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IHIuZXJyb3I/Lmlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmVuZG9yOiBcInpvZFwiLFxuICAgICAgICB2ZXJzaW9uOiAxXG4gICAgfTtcbn0pO1xuZXhwb3J0IHsgY2xvbmUgfSBmcm9tIFwiLi91dGlsLmpzXCI7XG5leHBvcnQgY29uc3QgJFpvZFN0cmluZyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kU3RyaW5nXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gW1xuICAgICAgICAuLi5pbnN0Py5fem9kLmJhZz8ucGF0dGVybnMgPz8gW11cbiAgICBdLnBvcCgpID8/IHJlZ2V4ZXMuc3RyaW5nKGluc3QuX3pvZC5iYWcpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfKT0+e1xuICAgICAgICBpZiAoZGVmLmNvZXJjZSkgdHJ5IHtcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBTdHJpbmcocGF5bG9hZC52YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC52YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFN0cmluZ0Zvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kU3RyaW5nRm9ybWF0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gY2hlY2sgaW5pdGlhbGl6YXRpb24gbXVzdCBjb21lIGZpcnN0XG4gICAgY2hlY2tzLiRab2RDaGVja1N0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgJFpvZFN0cmluZy5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kR1VJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kR1VJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuZ3VpZCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kVVVJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVVVJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGlmIChkZWYudmVyc2lvbikge1xuICAgICAgICBjb25zdCB2ZXJzaW9uTWFwID0ge1xuICAgICAgICAgICAgdjE6IDEsXG4gICAgICAgICAgICB2MjogMixcbiAgICAgICAgICAgIHYzOiAzLFxuICAgICAgICAgICAgdjQ6IDQsXG4gICAgICAgICAgICB2NTogNSxcbiAgICAgICAgICAgIHY2OiA2LFxuICAgICAgICAgICAgdjc6IDcsXG4gICAgICAgICAgICB2ODogOFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB2ID0gdmVyc2lvbk1hcFtkZWYudmVyc2lvbl07XG4gICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBVVUlEIHZlcnNpb246IFwiJHtkZWYudmVyc2lvbn1cImApO1xuICAgICAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLnV1aWQodikpO1xuICAgIH0gZWxzZSBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLnV1aWQoKSk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kRW1haWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEVtYWlsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5lbWFpbCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kVVJMID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RVUkxcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFRyaW0gd2hpdGVzcGFjZSBmcm9tIGlucHV0XG4gICAgICAgICAgICBjb25zdCB0cmltbWVkID0gcGF5bG9hZC52YWx1ZS50cmltKCk7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHRyaW1tZWQpO1xuICAgICAgICAgICAgaWYgKGRlZi5ob3N0bmFtZSkge1xuICAgICAgICAgICAgICAgIGRlZi5ob3N0bmFtZS5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIGlmICghZGVmLmhvc3RuYW1lLnRlc3QodXJsLmhvc3RuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogXCJ1cmxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiSW52YWxpZCBob3N0bmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybjogcmVnZXhlcy5ob3N0bmFtZS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVmLnByb3RvY29sKSB7XG4gICAgICAgICAgICAgICAgZGVmLnByb3RvY29sLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKCFkZWYucHJvdG9jb2wudGVzdCh1cmwucHJvdG9jb2wuZW5kc1dpdGgoXCI6XCIpID8gdXJsLnByb3RvY29sLnNsaWNlKDAsIC0xKSA6IHVybC5wcm90b2NvbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFwidXJsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkludmFsaWQgcHJvdG9jb2xcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm46IGRlZi5wcm90b2NvbC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTZXQgdGhlIG91dHB1dCB2YWx1ZSBiYXNlZCBvbiBub3JtYWxpemUgZmxhZ1xuICAgICAgICAgICAgaWYgKGRlZi5ub3JtYWxpemUpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2Ugbm9ybWFsaXplZCBVUkxcbiAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gdXJsLmhyZWY7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFByZXNlcnZlIHRoZSBvcmlnaW5hbCBpbnB1dCAodHJpbW1lZClcbiAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gdHJpbW1lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgICAgIGZvcm1hdDogXCJ1cmxcIixcbiAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kRW1vamkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEVtb2ppXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5lbW9qaSgpKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2ROYW5vSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE5hbm9JRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMubmFub2lkKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5jdWlkKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDVUlEMiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ1VJRDJcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmN1aWQyKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RVTElEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RVTElEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy51bGlkKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RYSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFhJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMueGlkKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RLU1VJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kS1NVSURcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmtzdWlkKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RJU09EYXRlVGltZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kSVNPRGF0ZVRpbWVcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmRhdGV0aW1lKGRlZikpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZElTT0RhdGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZElTT0RhdGVcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmRhdGUpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZElTT1RpbWUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZElTT1RpbWVcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLnRpbWUoZGVmKSk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kSVNPRHVyYXRpb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZElTT0R1cmF0aW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5kdXJhdGlvbik7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kSVB2NCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kSVB2NFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuaXB2NCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5mb3JtYXQgPSBgaXB2NGA7XG4gICAgfSk7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kSVB2NiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kSVB2NlwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuaXB2Nik7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5mb3JtYXQgPSBgaXB2NmA7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBuZXcgVVJMKGBodHRwOi8vWyR7cGF5bG9hZC52YWx1ZX1dYCk7XG4gICAgICAgIC8vIHJldHVybjtcbiAgICAgICAgfSBjYXRjaCAge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgICAgIGZvcm1hdDogXCJpcHY2XCIsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENJRFJ2NCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ0lEUnY0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5jaWRydjQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENJRFJ2NiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ0lEUnY2XCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5jaWRydjYpOyAvLyBub3QgdXNlZCBmb3IgdmFsaWRhdGlvblxuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHBheWxvYWQudmFsdWUuc3BsaXQoXCIvXCIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMikgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICBjb25zdCBbYWRkcmVzcywgcHJlZml4XSA9IHBhcnRzO1xuICAgICAgICAgICAgaWYgKCFwcmVmaXgpIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgICAgY29uc3QgcHJlZml4TnVtID0gTnVtYmVyKHByZWZpeCk7XG4gICAgICAgICAgICBpZiAoYCR7cHJlZml4TnVtfWAgIT09IHByZWZpeCkgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICBpZiAocHJlZml4TnVtIDwgMCB8fCBwcmVmaXhOdW0gPiAxMjgpIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3IFVSTChgaHR0cDovL1ske2FkZHJlc3N9XWApO1xuICAgICAgICB9IGNhdGNoICB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcImNpZHJ2NlwiLFxuICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgWm9kQmFzZTY0ICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEJhc2U2NChkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09IFwiXCIpIHJldHVybiB0cnVlO1xuICAgIGlmIChkYXRhLmxlbmd0aCAlIDQgIT09IDApIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGF0b2IoZGF0YSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCAkWm9kQmFzZTY0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RCYXNlNjRcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmJhc2U2NCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGluc3QuX3pvZC5iYWcuY29udGVudEVuY29kaW5nID0gXCJiYXNlNjRcIjtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKGlzVmFsaWRCYXNlNjQocGF5bG9hZC52YWx1ZSkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IFwiYmFzZTY0XCIsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICBab2RCYXNlNjQgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQmFzZTY0VVJMKGRhdGEpIHtcbiAgICBpZiAoIXJlZ2V4ZXMuYmFzZTY0dXJsLnRlc3QoZGF0YSkpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBiYXNlNjQgPSBkYXRhLnJlcGxhY2UoL1stX10vZywgKGMpPT5jID09PSBcIi1cIiA/IFwiK1wiIDogXCIvXCIpO1xuICAgIGNvbnN0IHBhZGRlZCA9IGJhc2U2NC5wYWRFbmQoTWF0aC5jZWlsKGJhc2U2NC5sZW5ndGggLyA0KSAqIDQsIFwiPVwiKTtcbiAgICByZXR1cm4gaXNWYWxpZEJhc2U2NChwYWRkZWQpO1xufVxuZXhwb3J0IGNvbnN0ICRab2RCYXNlNjRVUkwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEJhc2U2NFVSTFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuYmFzZTY0dXJsKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgaW5zdC5fem9kLmJhZy5jb250ZW50RW5jb2RpbmcgPSBcImJhc2U2NHVybFwiO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAoaXNWYWxpZEJhc2U2NFVSTChwYXlsb2FkLnZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogXCJiYXNlNjR1cmxcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kRTE2NCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRTE2NFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuZTE2NCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIFpvZEpXVCAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRKV1QodG9rZW4sIGFsZ29yaXRobSA9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB0b2tlbnNQYXJ0cyA9IHRva2VuLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgaWYgKHRva2Vuc1BhcnRzLmxlbmd0aCAhPT0gMykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBbaGVhZGVyXSA9IHRva2Vuc1BhcnRzO1xuICAgICAgICBpZiAoIWhlYWRlcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IHBhcnNlZEhlYWRlciA9IEpTT04ucGFyc2UoYXRvYihoZWFkZXIpKTtcbiAgICAgICAgaWYgKFwidHlwXCIgaW4gcGFyc2VkSGVhZGVyICYmIHBhcnNlZEhlYWRlcj8udHlwICE9PSBcIkpXVFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghcGFyc2VkSGVhZGVyLmFsZykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoYWxnb3JpdGhtICYmICghKFwiYWxnXCIgaW4gcGFyc2VkSGVhZGVyKSB8fCBwYXJzZWRIZWFkZXIuYWxnICE9PSBhbGdvcml0aG0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCAkWm9kSldUID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RKV1RcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKGlzVmFsaWRKV1QocGF5bG9hZC52YWx1ZSwgZGVmLmFsZykpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IFwiand0XCIsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEN1c3RvbVN0cmluZ0Zvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ3VzdG9tU3RyaW5nRm9ybWF0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmIChkZWYuZm4ocGF5bG9hZC52YWx1ZSkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IGRlZi5mb3JtYXQsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE51bWJlciA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTnVtYmVyXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gaW5zdC5fem9kLmJhZy5wYXR0ZXJuID8/IHJlZ2V4ZXMubnVtYmVyO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBpZiAoZGVmLmNvZXJjZSkgdHJ5IHtcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBOdW1iZXIocGF5bG9hZC52YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJudW1iZXJcIiAmJiAhTnVtYmVyLmlzTmFOKGlucHV0KSAmJiBOdW1iZXIuaXNGaW5pdGUoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWNlaXZlZCA9IHR5cGVvZiBpbnB1dCA9PT0gXCJudW1iZXJcIiA/IE51bWJlci5pc05hTihpbnB1dCkgPyBcIk5hTlwiIDogIU51bWJlci5pc0Zpbml0ZShpbnB1dCkgPyBcIkluZmluaXR5XCIgOiB1bmRlZmluZWQgOiB1bmRlZmluZWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwibnVtYmVyXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgLi4ucmVjZWl2ZWQgPyB7XG4gICAgICAgICAgICAgICAgcmVjZWl2ZWRcbiAgICAgICAgICAgIH0gOiB7fVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2ROdW1iZXJGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE51bWJlclwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNoZWNrcy4kWm9kQ2hlY2tOdW1iZXJGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgICRab2ROdW1iZXIuaW5pdChpbnN0LCBkZWYpOyAvLyBubyBmb3JtYXQgY2hlY2tzcFxufSk7XG5leHBvcnQgY29uc3QgJFpvZEJvb2xlYW4gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEJvb2xlYW5cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSByZWdleGVzLmJvb2xlYW47XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGlmIChkZWYuY29lcmNlKSB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IEJvb2xlYW4ocGF5bG9hZC52YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJib29sZWFuXCIpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcImJvb2xlYW5cIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQmlnSW50ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RCaWdJbnRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSByZWdleGVzLmJpZ2ludDtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKGRlZi5jb2VyY2UpIHRyeSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gQmlnSW50KHBheWxvYWQudmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQudmFsdWUgPT09IFwiYmlnaW50XCIpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcImJpZ2ludFwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RCaWdJbnRGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEJpZ0ludFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNoZWNrcy4kWm9kQ2hlY2tCaWdJbnRGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgICRab2RCaWdJbnQuaW5pdChpbnN0LCBkZWYpOyAvLyBubyBmb3JtYXQgY2hlY2tzXG59KTtcbmV4cG9ydCBjb25zdCAkWm9kU3ltYm9sID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RTeW1ib2xcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzeW1ib2xcIikgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwic3ltYm9sXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFVuZGVmaW5lZCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVW5kZWZpbmVkXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gcmVnZXhlcy51bmRlZmluZWQ7XG4gICAgaW5zdC5fem9kLnZhbHVlcyA9IG5ldyBTZXQoW1xuICAgICAgICB1bmRlZmluZWRcbiAgICBdKTtcbiAgICBpbnN0Ll96b2Qub3B0aW4gPSBcIm9wdGlvbmFsXCI7XG4gICAgaW5zdC5fem9kLm9wdG91dCA9IFwib3B0aW9uYWxcIjtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJ1bmRlZmluZWRcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTnVsbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTnVsbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IHJlZ2V4ZXMubnVsbDtcbiAgICBpbnN0Ll96b2QudmFsdWVzID0gbmV3IFNldChbXG4gICAgICAgIG51bGxcbiAgICBdKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcIm51bGxcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQW55ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RBbnlcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQpPT5wYXlsb2FkO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFVua25vd24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFVua25vd25cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQpPT5wYXlsb2FkO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE5ldmVyID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROZXZlclwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJuZXZlclwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RWb2lkID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RWb2lkXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcInZvaWRcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kRGF0ZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRGF0ZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKGRlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IG5ldyBEYXRlKHBheWxvYWQudmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoX2Vycikge31cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IGlzRGF0ZSA9IGlucHV0IGluc3RhbmNlb2YgRGF0ZTtcbiAgICAgICAgY29uc3QgaXNWYWxpZERhdGUgPSBpc0RhdGUgJiYgIU51bWJlci5pc05hTihpbnB1dC5nZXRUaW1lKCkpO1xuICAgICAgICBpZiAoaXNWYWxpZERhdGUpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcImRhdGVcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIC4uLmlzRGF0ZSA/IHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogXCJJbnZhbGlkIERhdGVcIlxuICAgICAgICAgICAgfSA6IHt9LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlQXJyYXlSZXN1bHQocmVzdWx0LCBmaW5hbCwgaW5kZXgpIHtcbiAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoaW5kZXgsIHJlc3VsdC5pc3N1ZXMpKTtcbiAgICB9XG4gICAgZmluYWwudmFsdWVbaW5kZXhdID0gcmVzdWx0LnZhbHVlO1xufVxuZXhwb3J0IGNvbnN0ICRab2RBcnJheSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQXJyYXlcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0gQXJyYXkoaW5wdXQubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgcHJvbXMgPSBbXTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpbnB1dFtpXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5lbGVtZW50Ll96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbSxcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKHJlc3VsdC50aGVuKChyZXN1bHQpPT5oYW5kbGVBcnJheVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGkpKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZUFycmF5UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb21zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21zKS50aGVuKCgpPT5wYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF5bG9hZDsgLy9oYW5kbGVBcnJheVJlc3VsdHNBc3luYyhwYXJzZVJlc3VsdHMsIGZpbmFsKTtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVQcm9wZXJ0eVJlc3VsdChyZXN1bHQsIGZpbmFsLCBrZXksIGlucHV0KSB7XG4gICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIGZpbmFsLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKGtleSwgcmVzdWx0Lmlzc3VlcykpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGtleSBpbiBpbnB1dCkge1xuICAgICAgICAgICAgZmluYWwudmFsdWVba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbmFsLnZhbHVlW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgfVxufVxuZnVuY3Rpb24gbm9ybWFsaXplRGVmKGRlZikge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkZWYuc2hhcGUpO1xuICAgIGZvciAoY29uc3QgayBvZiBrZXlzKXtcbiAgICAgICAgaWYgKCFkZWYuc2hhcGU/LltrXT8uX3pvZD8udHJhaXRzPy5oYXMoXCIkWm9kVHlwZVwiKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgYXQga2V5IFwiJHtrfVwiOiBleHBlY3RlZCBhIFpvZCBzY2hlbWFgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBva2V5cyA9IHV0aWwub3B0aW9uYWxLZXlzKGRlZi5zaGFwZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmLFxuICAgICAgICBrZXlzLFxuICAgICAgICBrZXlTZXQ6IG5ldyBTZXQoa2V5cyksXG4gICAgICAgIG51bUtleXM6IGtleXMubGVuZ3RoLFxuICAgICAgICBvcHRpb25hbEtleXM6IG5ldyBTZXQob2tleXMpXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUNhdGNoYWxsKHByb21zLCBpbnB1dCwgcGF5bG9hZCwgY3R4LCBkZWYsIGluc3QpIHtcbiAgICBjb25zdCB1bnJlY29nbml6ZWQgPSBbXTtcbiAgICAvLyBpdGVyYXRlIG92ZXIgaW5wdXQga2V5c1xuICAgIGNvbnN0IGtleVNldCA9IGRlZi5rZXlTZXQ7XG4gICAgY29uc3QgX2NhdGNoYWxsID0gZGVmLmNhdGNoYWxsLl96b2Q7XG4gICAgY29uc3QgdCA9IF9jYXRjaGFsbC5kZWYudHlwZTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhpbnB1dCkpe1xuICAgICAgICBpZiAoa2V5U2V0LmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHQgPT09IFwibmV2ZXJcIikge1xuICAgICAgICAgICAgdW5yZWNvZ25pemVkLnB1c2goa2V5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHIgPSBfY2F0Y2hhbGwucnVuKHtcbiAgICAgICAgICAgIHZhbHVlOiBpbnB1dFtrZXldLFxuICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICB9LCBjdHgpO1xuICAgICAgICBpZiAociBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHByb21zLnB1c2goci50aGVuKChyKT0+aGFuZGxlUHJvcGVydHlSZXN1bHQociwgcGF5bG9hZCwga2V5LCBpbnB1dCkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhhbmRsZVByb3BlcnR5UmVzdWx0KHIsIHBheWxvYWQsIGtleSwgaW5wdXQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh1bnJlY29nbml6ZWQubGVuZ3RoKSB7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJ1bnJlY29nbml6ZWRfa2V5c1wiLFxuICAgICAgICAgICAga2V5czogdW5yZWNvZ25pemVkLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIXByb21zLmxlbmd0aCkgcmV0dXJuIHBheWxvYWQ7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21zKS50aGVuKCgpPT57XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0ICRab2RPYmplY3QgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE9iamVjdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIHJlcXVpcmVzIGNhc3QgYmVjYXVzZSB0ZWNobmljYWxseSAkWm9kT2JqZWN0IGRvZXNuJ3QgZXh0ZW5kXG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIC8vIGNvbnN0IHNoID0gZGVmLnNoYXBlO1xuICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZiwgXCJzaGFwZVwiKTtcbiAgICBpZiAoIWRlc2M/LmdldCkge1xuICAgICAgICBjb25zdCBzaCA9IGRlZi5zaGFwZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlZiwgXCJzaGFwZVwiLCB7XG4gICAgICAgICAgICBnZXQ6ICgpPT57XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U2ggPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnNoXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVmLCBcInNoYXBlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ld1NoXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld1NoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgX25vcm1hbGl6ZWQgPSB1dGlsLmNhY2hlZCgoKT0+bm9ybWFsaXplRGVmKGRlZikpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwicHJvcFZhbHVlc1wiLCAoKT0+e1xuICAgICAgICBjb25zdCBzaGFwZSA9IGRlZi5zaGFwZTtcbiAgICAgICAgY29uc3QgcHJvcFZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IoY29uc3Qga2V5IGluIHNoYXBlKXtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gc2hhcGVba2V5XS5fem9kO1xuICAgICAgICAgICAgaWYgKGZpZWxkLnZhbHVlcykge1xuICAgICAgICAgICAgICAgIHByb3BWYWx1ZXNba2V5XSA/PyAocHJvcFZhbHVlc1trZXldID0gbmV3IFNldCgpKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgZmllbGQudmFsdWVzKXByb3BWYWx1ZXNba2V5XS5hZGQodik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BWYWx1ZXM7XG4gICAgfSk7XG4gICAgY29uc3QgaXNPYmplY3QgPSB1dGlsLmlzT2JqZWN0O1xuICAgIGNvbnN0IGNhdGNoYWxsID0gZGVmLmNhdGNoYWxsO1xuICAgIGxldCB2YWx1ZTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICB2YWx1ZSA/PyAodmFsdWUgPSBfbm9ybWFsaXplZC52YWx1ZSk7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKCFpc09iamVjdChpbnB1dCkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0ge307XG4gICAgICAgIGNvbnN0IHByb21zID0gW107XG4gICAgICAgIGNvbnN0IHNoYXBlID0gdmFsdWUuc2hhcGU7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHZhbHVlLmtleXMpe1xuICAgICAgICAgICAgY29uc3QgZWwgPSBzaGFwZVtrZXldO1xuICAgICAgICAgICAgY29uc3QgciA9IGVsLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaW5wdXRba2V5XSxcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcHJvbXMucHVzaChyLnRoZW4oKHIpPT5oYW5kbGVQcm9wZXJ0eVJlc3VsdChyLCBwYXlsb2FkLCBrZXksIGlucHV0KSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVQcm9wZXJ0eVJlc3VsdChyLCBwYXlsb2FkLCBrZXksIGlucHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNhdGNoYWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbXMubGVuZ3RoID8gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PnBheWxvYWQpIDogcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlQ2F0Y2hhbGwocHJvbXMsIGlucHV0LCBwYXlsb2FkLCBjdHgsIF9ub3JtYWxpemVkLnZhbHVlLCBpbnN0KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE9iamVjdEpJVCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kT2JqZWN0SklUXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gcmVxdWlyZXMgY2FzdCBiZWNhdXNlIHRlY2huaWNhbGx5ICRab2RPYmplY3QgZG9lc24ndCBleHRlbmRcbiAgICAkWm9kT2JqZWN0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCBzdXBlclBhcnNlID0gaW5zdC5fem9kLnBhcnNlO1xuICAgIGNvbnN0IF9ub3JtYWxpemVkID0gdXRpbC5jYWNoZWQoKCk9Pm5vcm1hbGl6ZURlZihkZWYpKTtcbiAgICBjb25zdCBnZW5lcmF0ZUZhc3RwYXNzID0gKHNoYXBlKT0+e1xuICAgICAgICBjb25zdCBkb2MgPSBuZXcgRG9jKFtcbiAgICAgICAgICAgIFwic2hhcGVcIixcbiAgICAgICAgICAgIFwicGF5bG9hZFwiLFxuICAgICAgICAgICAgXCJjdHhcIlxuICAgICAgICBdKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IF9ub3JtYWxpemVkLnZhbHVlO1xuICAgICAgICBjb25zdCBwYXJzZVN0ciA9IChrZXkpPT57XG4gICAgICAgICAgICBjb25zdCBrID0gdXRpbC5lc2Moa2V5KTtcbiAgICAgICAgICAgIHJldHVybiBgc2hhcGVbJHtrfV0uX3pvZC5ydW4oeyB2YWx1ZTogaW5wdXRbJHtrfV0sIGlzc3VlczogW10gfSwgY3R4KWA7XG4gICAgICAgIH07XG4gICAgICAgIGRvYy53cml0ZShgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO2ApO1xuICAgICAgICBjb25zdCBpZHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIG5vcm1hbGl6ZWQua2V5cyl7XG4gICAgICAgICAgICBpZHNba2V5XSA9IGBrZXlfJHtjb3VudGVyKyt9YDtcbiAgICAgICAgfVxuICAgICAgICAvLyBBOiBwcmVzZXJ2ZSBrZXkgb3JkZXIge1xuICAgICAgICBkb2Mud3JpdGUoYGNvbnN0IG5ld1Jlc3VsdCA9IHt9O2ApO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBub3JtYWxpemVkLmtleXMpe1xuICAgICAgICAgICAgY29uc3QgaWQgPSBpZHNba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGsgPSB1dGlsLmVzYyhrZXkpO1xuICAgICAgICAgICAgZG9jLndyaXRlKGBjb25zdCAke2lkfSA9ICR7cGFyc2VTdHIoa2V5KX07YCk7XG4gICAgICAgICAgICBkb2Mud3JpdGUoYFxuICAgICAgICBpZiAoJHtpZH0uaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgIHBheWxvYWQuaXNzdWVzID0gcGF5bG9hZC5pc3N1ZXMuY29uY2F0KCR7aWR9Lmlzc3Vlcy5tYXAoaXNzID0+ICh7XG4gICAgICAgICAgICAuLi5pc3MsXG4gICAgICAgICAgICBwYXRoOiBpc3MucGF0aCA/IFske2t9LCAuLi5pc3MucGF0aF0gOiBbJHtrfV1cbiAgICAgICAgICB9KSkpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAgaWYgKCR7aWR9LnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoJHtrfSBpbiBpbnB1dCkge1xuICAgICAgICAgICAgbmV3UmVzdWx0WyR7a31dID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdSZXN1bHRbJHtrfV0gPSAke2lkfS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgIGApO1xuICAgICAgICB9XG4gICAgICAgIGRvYy53cml0ZShgcGF5bG9hZC52YWx1ZSA9IG5ld1Jlc3VsdDtgKTtcbiAgICAgICAgZG9jLndyaXRlKGByZXR1cm4gcGF5bG9hZDtgKTtcbiAgICAgICAgY29uc3QgZm4gPSBkb2MuY29tcGlsZSgpO1xuICAgICAgICByZXR1cm4gKHBheWxvYWQsIGN0eCk9PmZuKHNoYXBlLCBwYXlsb2FkLCBjdHgpO1xuICAgIH07XG4gICAgbGV0IGZhc3RwYXNzO1xuICAgIGNvbnN0IGlzT2JqZWN0ID0gdXRpbC5pc09iamVjdDtcbiAgICBjb25zdCBqaXQgPSAhY29yZS5nbG9iYWxDb25maWcuaml0bGVzcztcbiAgICBjb25zdCBhbGxvd3NFdmFsID0gdXRpbC5hbGxvd3NFdmFsO1xuICAgIGNvbnN0IGZhc3RFbmFibGVkID0gaml0ICYmIGFsbG93c0V2YWwudmFsdWU7IC8vICYmICFkZWYuY2F0Y2hhbGw7XG4gICAgY29uc3QgY2F0Y2hhbGwgPSBkZWYuY2F0Y2hhbGw7XG4gICAgbGV0IHZhbHVlO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIHZhbHVlID8/ICh2YWx1ZSA9IF9ub3JtYWxpemVkLnZhbHVlKTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGlucHV0KSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChqaXQgJiYgZmFzdEVuYWJsZWQgJiYgY3R4Py5hc3luYyA9PT0gZmFsc2UgJiYgY3R4LmppdGxlc3MgIT09IHRydWUpIHtcbiAgICAgICAgICAgIC8vIGFsd2F5cyBzeW5jaHJvbm91c1xuICAgICAgICAgICAgaWYgKCFmYXN0cGFzcykgZmFzdHBhc3MgPSBnZW5lcmF0ZUZhc3RwYXNzKGRlZi5zaGFwZSk7XG4gICAgICAgICAgICBwYXlsb2FkID0gZmFzdHBhc3MocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgICAgIGlmICghY2F0Y2hhbGwpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUNhdGNoYWxsKFtdLCBpbnB1dCwgcGF5bG9hZCwgY3R4LCB2YWx1ZSwgaW5zdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyUGFyc2UocGF5bG9hZCwgY3R4KTtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVVbmlvblJlc3VsdHMocmVzdWx0cywgZmluYWwsIGluc3QsIGN0eCkge1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpe1xuICAgICAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGZpbmFsLnZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIGZpbmFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5vbmFib3J0ZWQgPSByZXN1bHRzLmZpbHRlcigocik9PiF1dGlsLmFib3J0ZWQocikpO1xuICAgIGlmIChub25hYm9ydGVkLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBmaW5hbC52YWx1ZSA9IG5vbmFib3J0ZWRbMF0udmFsdWU7XG4gICAgICAgIHJldHVybiBub25hYm9ydGVkWzBdO1xuICAgIH1cbiAgICBmaW5hbC5pc3N1ZXMucHVzaCh7XG4gICAgICAgIGNvZGU6IFwiaW52YWxpZF91bmlvblwiLFxuICAgICAgICBpbnB1dDogZmluYWwudmFsdWUsXG4gICAgICAgIGluc3QsXG4gICAgICAgIGVycm9yczogcmVzdWx0cy5tYXAoKHJlc3VsdCk9PnJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKSlcbiAgICB9KTtcbiAgICByZXR1cm4gZmluYWw7XG59XG5leHBvcnQgY29uc3QgJFpvZFVuaW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RVbmlvblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdGluXCIsICgpPT5kZWYub3B0aW9ucy5zb21lKChvKT0+by5fem9kLm9wdGluID09PSBcIm9wdGlvbmFsXCIpID8gXCJvcHRpb25hbFwiIDogdW5kZWZpbmVkKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdG91dFwiLCAoKT0+ZGVmLm9wdGlvbnMuc29tZSgobyk9Pm8uX3pvZC5vcHRvdXQgPT09IFwib3B0aW9uYWxcIikgPyBcIm9wdGlvbmFsXCIgOiB1bmRlZmluZWQpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT57XG4gICAgICAgIGlmIChkZWYub3B0aW9ucy5ldmVyeSgobyk9Pm8uX3pvZC52YWx1ZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNldChkZWYub3B0aW9ucy5mbGF0TWFwKChvcHRpb24pPT5BcnJheS5mcm9tKG9wdGlvbi5fem9kLnZhbHVlcykpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwicGF0dGVyblwiLCAoKT0+e1xuICAgICAgICBpZiAoZGVmLm9wdGlvbnMuZXZlcnkoKG8pPT5vLl96b2QucGF0dGVybikpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5zID0gZGVmLm9wdGlvbnMubWFwKChvKT0+by5fem9kLnBhdHRlcm4pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4oJHtwYXR0ZXJucy5tYXAoKHApPT51dGlsLmNsZWFuUmVnZXgocC5zb3VyY2UpKS5qb2luKFwifFwiKX0pJGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgY29uc3Qgc2luZ2xlID0gZGVmLm9wdGlvbnMubGVuZ3RoID09PSAxO1xuICAgIGNvbnN0IGZpcnN0ID0gZGVmLm9wdGlvbnNbMF0uX3pvZC5ydW47XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKHNpbmdsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0KHBheWxvYWQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFzeW5jID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgZGVmLm9wdGlvbnMpe1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9uLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICAgICAgICBhc3luYyA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFzeW5jKSByZXR1cm4gaGFuZGxlVW5pb25SZXN1bHRzKHJlc3VsdHMsIHBheWxvYWQsIGluc3QsIGN0eCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChyZXN1bHRzKS50aGVuKChyZXN1bHRzKT0+e1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVVuaW9uUmVzdWx0cyhyZXN1bHRzLCBwYXlsb2FkLCBpbnN0LCBjdHgpO1xuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZERpc2NyaW1pbmF0ZWRVbmlvbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRGlzY3JpbWluYXRlZFVuaW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFVuaW9uLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCBfc3VwZXIgPSBpbnN0Ll96b2QucGFyc2U7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwcm9wVmFsdWVzXCIsICgpPT57XG4gICAgICAgIGNvbnN0IHByb3BWYWx1ZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgZGVmLm9wdGlvbnMpe1xuICAgICAgICAgICAgY29uc3QgcHYgPSBvcHRpb24uX3pvZC5wcm9wVmFsdWVzO1xuICAgICAgICAgICAgaWYgKCFwdiB8fCBPYmplY3Qua2V5cyhwdikubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGlzY3JpbWluYXRlZCB1bmlvbiBvcHRpb24gYXQgaW5kZXggXCIke2RlZi5vcHRpb25zLmluZGV4T2Yob3B0aW9uKX1cImApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMocHYpKXtcbiAgICAgICAgICAgICAgICBpZiAoIXByb3BWYWx1ZXNba10pIHByb3BWYWx1ZXNba10gPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWwgb2Ygdil7XG4gICAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZXNba10uYWRkKHZhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wVmFsdWVzO1xuICAgIH0pO1xuICAgIGNvbnN0IGRpc2MgPSB1dGlsLmNhY2hlZCgoKT0+e1xuICAgICAgICBjb25zdCBvcHRzID0gZGVmLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgZm9yIChjb25zdCBvIG9mIG9wdHMpe1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gby5fem9kLnByb3BWYWx1ZXM/LltkZWYuZGlzY3JpbWluYXRvcl07XG4gICAgICAgICAgICBpZiAoIXZhbHVlcyB8fCB2YWx1ZXMuc2l6ZSA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRpc2NyaW1pbmF0ZWQgdW5pb24gb3B0aW9uIGF0IGluZGV4IFwiJHtkZWYub3B0aW9ucy5pbmRleE9mKG8pfVwiYCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsdWVzKXtcbiAgICAgICAgICAgICAgICBpZiAobWFwLmhhcyh2KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSBkaXNjcmltaW5hdG9yIHZhbHVlIFwiJHtTdHJpbmcodil9XCJgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFwLnNldCh2LCBvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKCF1dGlsLmlzT2JqZWN0KGlucHV0KSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdCA9IGRpc2MudmFsdWUuZ2V0KGlucHV0Py5bZGVmLmRpc2NyaW1pbmF0b3JdKTtcbiAgICAgICAgaWYgKG9wdCkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdC5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYudW5pb25GYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIF9zdXBlcihwYXlsb2FkLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vIG1hdGNoaW5nIGRpc2NyaW1pbmF0b3JcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdW5pb25cIixcbiAgICAgICAgICAgIGVycm9yczogW10sXG4gICAgICAgICAgICBub3RlOiBcIk5vIG1hdGNoaW5nIGRpc2NyaW1pbmF0b3JcIixcbiAgICAgICAgICAgIGRpc2NyaW1pbmF0b3I6IGRlZi5kaXNjcmltaW5hdG9yLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAgICAgZGVmLmRpc2NyaW1pbmF0b3JcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEludGVyc2VjdGlvbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kSW50ZXJzZWN0aW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgY29uc3QgbGVmdCA9IGRlZi5sZWZ0Ll96b2QucnVuKHtcbiAgICAgICAgICAgIHZhbHVlOiBpbnB1dCxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBkZWYucmlnaHQuX3pvZC5ydW4oe1xuICAgICAgICAgICAgdmFsdWU6IGlucHV0LFxuICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICB9LCBjdHgpO1xuICAgICAgICBjb25zdCBhc3luYyA9IGxlZnQgaW5zdGFuY2VvZiBQcm9taXNlIHx8IHJpZ2h0IGluc3RhbmNlb2YgUHJvbWlzZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICAgICAgcmlnaHRcbiAgICAgICAgICAgIF0pLnRoZW4oKFtsZWZ0LCByaWdodF0pPT57XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUludGVyc2VjdGlvblJlc3VsdHMocGF5bG9hZCwgbGVmdCwgcmlnaHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZUludGVyc2VjdGlvblJlc3VsdHMocGF5bG9hZCwgbGVmdCwgcmlnaHQpO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIG1lcmdlVmFsdWVzKGEsIGIpIHtcbiAgICAvLyBjb25zdCBhVHlwZSA9IHBhcnNlLnQoYSk7XG4gICAgLy8gY29uc3QgYlR5cGUgPSBwYXJzZS50KGIpO1xuICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IGFcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGEgaW5zdGFuY2VvZiBEYXRlICYmIGIgaW5zdGFuY2VvZiBEYXRlICYmICthID09PSArYikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBkYXRhOiBhXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmICh1dGlsLmlzUGxhaW5PYmplY3QoYSkgJiYgdXRpbC5pc1BsYWluT2JqZWN0KGIpKSB7XG4gICAgICAgIGNvbnN0IGJLZXlzID0gT2JqZWN0LmtleXMoYik7XG4gICAgICAgIGNvbnN0IHNoYXJlZEtleXMgPSBPYmplY3Qua2V5cyhhKS5maWx0ZXIoKGtleSk9PmJLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEpO1xuICAgICAgICBjb25zdCBuZXdPYmogPSB7XG4gICAgICAgICAgICAuLi5hLFxuICAgICAgICAgICAgLi4uYlxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBzaGFyZWRLZXlzKXtcbiAgICAgICAgICAgIGNvbnN0IHNoYXJlZFZhbHVlID0gbWVyZ2VWYWx1ZXMoYVtrZXldLCBiW2tleV0pO1xuICAgICAgICAgICAgaWYgKCFzaGFyZWRWYWx1ZS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VFcnJvclBhdGg6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnNoYXJlZFZhbHVlLm1lcmdlRXJyb3JQYXRoXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3T2JqW2tleV0gPSBzaGFyZWRWYWx1ZS5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IG5ld09ialxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBBcnJheS5pc0FycmF5KGIpKSB7XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lcmdlRXJyb3JQYXRoOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdBcnJheSA9IFtdO1xuICAgICAgICBmb3IobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhLmxlbmd0aDsgaW5kZXgrKyl7XG4gICAgICAgICAgICBjb25zdCBpdGVtQSA9IGFbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgaXRlbUIgPSBiW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHNoYXJlZFZhbHVlID0gbWVyZ2VWYWx1ZXMoaXRlbUEsIGl0ZW1CKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkVmFsdWUudmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1lcmdlRXJyb3JQYXRoOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnNoYXJlZFZhbHVlLm1lcmdlRXJyb3JQYXRoXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3QXJyYXkucHVzaChzaGFyZWRWYWx1ZS5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBkYXRhOiBuZXdBcnJheVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgIG1lcmdlRXJyb3JQYXRoOiBbXVxuICAgIH07XG59XG5mdW5jdGlvbiBoYW5kbGVJbnRlcnNlY3Rpb25SZXN1bHRzKHJlc3VsdCwgbGVmdCwgcmlnaHQpIHtcbiAgICBpZiAobGVmdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdC5pc3N1ZXMucHVzaCguLi5sZWZ0Lmlzc3Vlcyk7XG4gICAgfVxuICAgIGlmIChyaWdodC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdC5pc3N1ZXMucHVzaCguLi5yaWdodC5pc3N1ZXMpO1xuICAgIH1cbiAgICBpZiAodXRpbC5hYm9ydGVkKHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VWYWx1ZXMobGVmdC52YWx1ZSwgcmlnaHQudmFsdWUpO1xuICAgIGlmICghbWVyZ2VkLnZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5tZXJnYWJsZSBpbnRlcnNlY3Rpb24uIEVycm9yIHBhdGg6IGAgKyBgJHtKU09OLnN0cmluZ2lmeShtZXJnZWQubWVyZ2VFcnJvclBhdGgpfWApO1xuICAgIH1cbiAgICByZXN1bHQudmFsdWUgPSBtZXJnZWQuZGF0YTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0ICRab2RUdXBsZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVHVwbGVcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgaXRlbXMgPSBkZWYuaXRlbXM7XG4gICAgY29uc3Qgb3B0U3RhcnQgPSBpdGVtcy5sZW5ndGggLSBbXG4gICAgICAgIC4uLml0ZW1zXG4gICAgXS5yZXZlcnNlKCkuZmluZEluZGV4KChpdGVtKT0+aXRlbS5fem9kLm9wdGluICE9PSBcIm9wdGlvbmFsXCIpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJ0dXBsZVwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IFtdO1xuICAgICAgICBjb25zdCBwcm9tcyA9IFtdO1xuICAgICAgICBpZiAoIWRlZi5yZXN0KSB7XG4gICAgICAgICAgICBjb25zdCB0b29CaWcgPSBpbnB1dC5sZW5ndGggPiBpdGVtcy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGlucHV0Lmxlbmd0aCA8IG9wdFN0YXJ0IC0gMTtcbiAgICAgICAgICAgIGlmICh0b29CaWcgfHwgdG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgLi4udG9vQmlnID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJ0b29fYmlnXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBpdGVtcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBpdGVtcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbjogXCJhcnJheVwiXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGkgPSAtMTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKXtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGlmIChpID49IGlucHV0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChpID49IG9wdFN0YXJ0KSBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZW0uX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBpbnB1dFtpXSxcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKHJlc3VsdC50aGVuKChyZXN1bHQpPT5oYW5kbGVUdXBsZVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGkpKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZVR1cGxlUmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5yZXN0KSB7XG4gICAgICAgICAgICBjb25zdCByZXN0ID0gaW5wdXQuc2xpY2UoaXRlbXMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2YgcmVzdCl7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5yZXN0Ll96b2QucnVuKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVsLFxuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKHJlc3VsdC50aGVuKChyZXN1bHQpPT5oYW5kbGVUdXBsZVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGkpKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlVHVwbGVSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb21zLmxlbmd0aCkgcmV0dXJuIFByb21pc2UuYWxsKHByb21zKS50aGVuKCgpPT5wYXlsb2FkKTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlVHVwbGVSZXN1bHQocmVzdWx0LCBmaW5hbCwgaW5kZXgpIHtcbiAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoaW5kZXgsIHJlc3VsdC5pc3N1ZXMpKTtcbiAgICB9XG4gICAgZmluYWwudmFsdWVbaW5kZXhdID0gcmVzdWx0LnZhbHVlO1xufVxuZXhwb3J0IGNvbnN0ICRab2RSZWNvcmQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFJlY29yZFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICghdXRpbC5pc1BsYWluT2JqZWN0KGlucHV0KSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwicmVjb3JkXCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21zID0gW107XG4gICAgICAgIGlmIChkZWYua2V5VHlwZS5fem9kLnZhbHVlcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gZGVmLmtleVR5cGUuX3pvZC52YWx1ZXM7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB2YWx1ZXMpe1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBrZXkgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYudmFsdWVUeXBlLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpbnB1dFtrZXldLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbXMucHVzaChyZXN1bHQudGhlbigocmVzdWx0KT0+e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKGtleSwgcmVzdWx0Lmlzc3VlcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKGtleSwgcmVzdWx0Lmlzc3VlcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZVtrZXldID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHVucmVjb2duaXplZDtcbiAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gaW5wdXQpe1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWVzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVucmVjb2duaXplZCA9IHVucmVjb2duaXplZCA/PyBbXTtcbiAgICAgICAgICAgICAgICAgICAgdW5yZWNvZ25pemVkLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodW5yZWNvZ25pemVkICYmIHVucmVjb2duaXplZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFwidW5yZWNvZ25pemVkX2tleXNcIixcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgICAgIGtleXM6IHVucmVjb2duaXplZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKGlucHV0KSl7XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gXCJfX3Byb3RvX19cIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5UmVzdWx0ID0gZGVmLmtleVR5cGUuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZToga2V5LFxuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5UmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBc3luYyBzY2hlbWFzIG5vdCBzdXBwb3J0ZWQgaW4gb2JqZWN0IGtleXMgY3VycmVudGx5XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoa2V5UmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfa2V5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46IFwicmVjb3JkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IGtleVJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZVtrZXlSZXN1bHQudmFsdWVdID0ga2V5UmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnZhbHVlVHlwZS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpbnB1dFtrZXldLFxuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKHJlc3VsdC50aGVuKChyZXN1bHQpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKGtleSwgcmVzdWx0Lmlzc3VlcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZVtrZXlSZXN1bHQudmFsdWVdID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKGtleSwgcmVzdWx0Lmlzc3VlcykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWVba2V5UmVzdWx0LnZhbHVlXSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb21zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21zKS50aGVuKCgpPT5wYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE1hcCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTWFwXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJtYXBcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbXMgPSBbXTtcbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaW5wdXQpe1xuICAgICAgICAgICAgY29uc3Qga2V5UmVzdWx0ID0gZGVmLmtleVR5cGUuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBrZXksXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlUmVzdWx0ID0gZGVmLnZhbHVlVHlwZS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBpZiAoa2V5UmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSB8fCB2YWx1ZVJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAga2V5UmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVJlc3VsdFxuICAgICAgICAgICAgICAgIF0pLnRoZW4oKFtrZXlSZXN1bHQsIHZhbHVlUmVzdWx0XSk9PntcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlTWFwUmVzdWx0KGtleVJlc3VsdCwgdmFsdWVSZXN1bHQsIHBheWxvYWQsIGtleSwgaW5wdXQsIGluc3QsIGN0eCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVNYXBSZXN1bHQoa2V5UmVzdWx0LCB2YWx1ZVJlc3VsdCwgcGF5bG9hZCwga2V5LCBpbnB1dCwgaW5zdCwgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvbXMubGVuZ3RoKSByZXR1cm4gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PnBheWxvYWQpO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVNYXBSZXN1bHQoa2V5UmVzdWx0LCB2YWx1ZVJlc3VsdCwgZmluYWwsIGtleSwgaW5wdXQsIGluc3QsIGN0eCkge1xuICAgIGlmIChrZXlSZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBpZiAodXRpbC5wcm9wZXJ0eUtleVR5cGVzLmhhcyh0eXBlb2Yga2V5KSkge1xuICAgICAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCBrZXlSZXN1bHQuaXNzdWVzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2tleVwiLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJtYXBcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGlzc3Vlczoga2V5UmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFsdWVSZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBpZiAodXRpbC5wcm9wZXJ0eUtleVR5cGVzLmhhcyh0eXBlb2Yga2V5KSkge1xuICAgICAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCB2YWx1ZVJlc3VsdC5pc3N1ZXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbmFsLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBvcmlnaW46IFwibWFwXCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2VsZW1lbnRcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgIGlzc3VlczogdmFsdWVSZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZpbmFsLnZhbHVlLnNldChrZXlSZXN1bHQudmFsdWUsIHZhbHVlUmVzdWx0LnZhbHVlKTtcbn1cbmV4cG9ydCBjb25zdCAkWm9kU2V0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RTZXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIShpbnB1dCBpbnN0YW5jZW9mIFNldCkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwic2V0XCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9tcyA9IFtdO1xuICAgICAgICBwYXlsb2FkLnZhbHVlID0gbmV3IFNldCgpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW5wdXQpe1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnZhbHVlVHlwZS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcHJvbXMucHVzaChyZXN1bHQudGhlbigocmVzdWx0KT0+aGFuZGxlU2V0UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBoYW5kbGVTZXRSZXN1bHQocmVzdWx0LCBwYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvbXMubGVuZ3RoKSByZXR1cm4gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PnBheWxvYWQpO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVTZXRSZXN1bHQocmVzdWx0LCBmaW5hbCkge1xuICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCguLi5yZXN1bHQuaXNzdWVzKTtcbiAgICB9XG4gICAgZmluYWwudmFsdWUuYWRkKHJlc3VsdC52YWx1ZSk7XG59XG5leHBvcnQgY29uc3QgJFpvZEVudW0gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEVudW1cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgdmFsdWVzID0gdXRpbC5nZXRFbnVtVmFsdWVzKGRlZi5lbnRyaWVzKTtcbiAgICBjb25zdCB2YWx1ZXNTZXQgPSBuZXcgU2V0KHZhbHVlcyk7XG4gICAgaW5zdC5fem9kLnZhbHVlcyA9IHZhbHVlc1NldDtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IG5ldyBSZWdFeHAoYF4oJHt2YWx1ZXMuZmlsdGVyKChrKT0+dXRpbC5wcm9wZXJ0eUtleVR5cGVzLmhhcyh0eXBlb2YgaykpLm1hcCgobyk9PnR5cGVvZiBvID09PSBcInN0cmluZ1wiID8gdXRpbC5lc2NhcGVSZWdleChvKSA6IG8udG9TdHJpbmcoKSkuam9pbihcInxcIil9KSRgKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAodmFsdWVzU2V0LmhhcyhpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3ZhbHVlXCIsXG4gICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTGl0ZXJhbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTGl0ZXJhbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpZiAoZGVmLnZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNyZWF0ZSBsaXRlcmFsIHNjaGVtYSB3aXRoIG5vIHZhbGlkIHZhbHVlc1wiKTtcbiAgICB9XG4gICAgaW5zdC5fem9kLnZhbHVlcyA9IG5ldyBTZXQoZGVmLnZhbHVlcyk7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeKCR7ZGVmLnZhbHVlcy5tYXAoKG8pPT50eXBlb2YgbyA9PT0gXCJzdHJpbmdcIiA/IHV0aWwuZXNjYXBlUmVnZXgobykgOiBvID8gdXRpbC5lc2NhcGVSZWdleChvLnRvU3RyaW5nKCkpIDogU3RyaW5nKG8pKS5qb2luKFwifFwiKX0pJGApO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmIChpbnN0Ll96b2QudmFsdWVzLmhhcyhpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3ZhbHVlXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IGRlZi52YWx1ZXMsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kRmlsZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRmlsZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEZpbGUpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcImZpbGVcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kVHJhbnNmb3JtID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RUcmFuc2Zvcm1cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuJFpvZEVuY29kZUVycm9yKGluc3QuY29uc3RydWN0b3IubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgX291dCA9IGRlZi50cmFuc2Zvcm0ocGF5bG9hZC52YWx1ZSwgcGF5bG9hZCk7XG4gICAgICAgIGlmIChjdHguYXN5bmMpIHtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IF9vdXQgaW5zdGFuY2VvZiBQcm9taXNlID8gX291dCA6IFByb21pc2UucmVzb2x2ZShfb3V0KTtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQudGhlbigob3V0cHV0KT0+e1xuICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX291dCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RBc3luY0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IF9vdXQ7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZU9wdGlvbmFsUmVzdWx0KHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGggJiYgaW5wdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCAkWm9kT3B0aW9uYWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE9wdGlvbmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5vcHRpbiA9IFwib3B0aW9uYWxcIjtcbiAgICBpbnN0Ll96b2Qub3B0b3V0ID0gXCJvcHRpb25hbFwiO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT57XG4gICAgICAgIHJldHVybiBkZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzID8gbmV3IFNldChbXG4gICAgICAgICAgICAuLi5kZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzLFxuICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgIF0pIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwicGF0dGVyblwiLCAoKT0+e1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gZGVmLmlubmVyVHlwZS5fem9kLnBhdHRlcm47XG4gICAgICAgIHJldHVybiBwYXR0ZXJuID8gbmV3IFJlZ0V4cChgXigke3V0aWwuY2xlYW5SZWdleChwYXR0ZXJuLnNvdXJjZSl9KT8kYCkgOiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGRlZi5pbm5lclR5cGUuX3pvZC5vcHRpbiA9PT0gXCJvcHRpb25hbFwiKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkgcmV0dXJuIHJlc3VsdC50aGVuKChyKT0+aGFuZGxlT3B0aW9uYWxSZXN1bHQociwgcGF5bG9hZC52YWx1ZSkpO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZU9wdGlvbmFsUmVzdWx0KHJlc3VsdCwgcGF5bG9hZC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBheWxvYWQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE51bGxhYmxlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROdWxsYWJsZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdGluXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2Qub3B0aW4pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0b3V0XCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2Qub3B0b3V0KTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInBhdHRlcm5cIiwgKCk9PntcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IGRlZi5pbm5lclR5cGUuX3pvZC5wYXR0ZXJuO1xuICAgICAgICByZXR1cm4gcGF0dGVybiA/IG5ldyBSZWdFeHAoYF4oJHt1dGlsLmNsZWFuUmVnZXgocGF0dGVybi5zb3VyY2UpfXxudWxsKSRgKSA6IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+e1xuICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcyA/IG5ldyBTZXQoW1xuICAgICAgICAgICAgLi4uZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcyxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgXSkgOiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgLy8gRm9yd2FyZCBkaXJlY3Rpb24gKGRlY29kZSk6IGFsbG93IG51bGwgdG8gcGFzcyB0aHJvdWdoXG4gICAgICAgIGlmIChwYXlsb2FkLnZhbHVlID09PSBudWxsKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZERlZmF1bHQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZERlZmF1bHRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgLy8gaW5zdC5fem9kLnFpbiA9IFwidHJ1ZVwiO1xuICAgIGluc3QuX3pvZC5vcHRpbiA9IFwib3B0aW9uYWxcIjtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcyk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3J3YXJkIGRpcmVjdGlvbiAoZGVjb2RlKTogYXBwbHkgZGVmYXVsdHMgZm9yIHVuZGVmaW5lZCBpbnB1dFxuICAgICAgICBpZiAocGF5bG9hZC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gZGVmLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogJFpvZERlZmF1bHQgcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBpbW1lZGlhdGVseSBpbiBmb3J3YXJkIGRpcmVjdGlvbi5cbiAgICAgICAgICAgICAqIEl0IGRvZXNuJ3QgcGFzcyB0aGUgZGVmYXVsdCB2YWx1ZSBpbnRvIHRoZSB2YWxpZGF0b3IgKFwicHJlZmF1bHRcIikuIFRoZXJlJ3Mgbm8gcmVhc29uIHRvIHBhc3MgdGhlIGRlZmF1bHQgdmFsdWUgdGhyb3VnaCB2YWxpZGF0aW9uLiBUaGUgdmFsaWRpdHkgb2YgdGhlIGRlZmF1bHQgaXMgZW5mb3JjZWQgYnkgVHlwZVNjcmlwdCBzdGF0aWNhbGx5LiBPdGhlcndpc2UsIGl0J3MgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyIHRvIGVuc3VyZSB0aGUgZGVmYXVsdCBpcyB2YWxpZC4gSW4gdGhlIGNhc2Ugb2YgcGlwZXMgd2l0aCBkaXZlcmdlbnQgaW4vb3V0IHR5cGVzLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGRlZmF1bHQgb24gdGhlIGBpbmAgc2NoZW1hIG9mIHlvdXIgWm9kUGlwZSB0byBzZXQgYSBcInByZWZhdWx0XCIgZm9yIHRoZSBwaXBlLiAgICovIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvcndhcmQgZGlyZWN0aW9uOiBjb250aW51ZSB3aXRoIGRlZmF1bHQgaGFuZGxpbmdcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyZXN1bHQpPT5oYW5kbGVEZWZhdWx0UmVzdWx0KHJlc3VsdCwgZGVmKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZURlZmF1bHRSZXN1bHQocmVzdWx0LCBkZWYpO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZURlZmF1bHRSZXN1bHQocGF5bG9hZCwgZGVmKSB7XG4gICAgaWYgKHBheWxvYWQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXlsb2FkLnZhbHVlID0gZGVmLmRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQ7XG59XG5leHBvcnQgY29uc3QgJFpvZFByZWZhdWx0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RQcmVmYXVsdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2Qub3B0aW4gPSBcIm9wdGlvbmFsXCI7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGlmIChjdHguZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yd2FyZCBkaXJlY3Rpb24gKGRlY29kZSk6IGFwcGx5IHByZWZhdWx0IGZvciB1bmRlZmluZWQgaW5wdXRcbiAgICAgICAgaWYgKHBheWxvYWQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IGRlZi5kZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE5vbk9wdGlvbmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROb25PcHRpb25hbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+e1xuICAgICAgICBjb25zdCB2ID0gZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcztcbiAgICAgICAgcmV0dXJuIHYgPyBuZXcgU2V0KFtcbiAgICAgICAgICAgIC4uLnZcbiAgICAgICAgXS5maWx0ZXIoKHgpPT54ICE9PSB1bmRlZmluZWQpKSA6IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCk9PmhhbmRsZU5vbk9wdGlvbmFsUmVzdWx0KHJlc3VsdCwgaW5zdCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVOb25PcHRpb25hbFJlc3VsdChyZXN1bHQsIGluc3QpO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZU5vbk9wdGlvbmFsUmVzdWx0KHBheWxvYWQsIGluc3QpIHtcbiAgICBpZiAoIXBheWxvYWQuaXNzdWVzLmxlbmd0aCAmJiBwYXlsb2FkLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwibm9ub3B0aW9uYWxcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQ7XG59XG5leHBvcnQgY29uc3QgJFpvZFN1Y2Nlc3MgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFN1Y2Nlc3NcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuJFpvZEVuY29kZUVycm9yKFwiWm9kU3VjY2Vzc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCk9PntcbiAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gcmVzdWx0Lmlzc3Vlcy5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0gcmVzdWx0Lmlzc3Vlcy5sZW5ndGggPT09IDA7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2F0Y2ggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENhdGNoXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC5vcHRpbik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRvdXRcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC5vcHRvdXQpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvcndhcmQgZGlyZWN0aW9uIChkZWNvZGUpOiBhcHBseSBjYXRjaCBsb2dpY1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCk9PntcbiAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gZGVmLmNhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiByZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBkZWYuY2F0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgLi4ucGF5bG9hZCxcbiAgICAgICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IHJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE5hTiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTmFOXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQudmFsdWUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc05hTihwYXlsb2FkLnZhbHVlKSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJuYW5cIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kUGlwZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kUGlwZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+ZGVmLmluLl96b2QudmFsdWVzKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdGluXCIsICgpPT5kZWYuaW4uX3pvZC5vcHRpbik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRvdXRcIiwgKCk9PmRlZi5vdXQuX3pvZC5vcHRvdXQpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwicHJvcFZhbHVlc1wiLCAoKT0+ZGVmLmluLl96b2QucHJvcFZhbHVlcyk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgY29uc3QgcmlnaHQgPSBkZWYub3V0Ll96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICBpZiAocmlnaHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJpZ2h0LnRoZW4oKHJpZ2h0KT0+aGFuZGxlUGlwZVJlc3VsdChyaWdodCwgZGVmLmluLCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVQaXBlUmVzdWx0KHJpZ2h0LCBkZWYuaW4sIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVmdCA9IGRlZi5pbi5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICBpZiAobGVmdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBsZWZ0LnRoZW4oKGxlZnQpPT5oYW5kbGVQaXBlUmVzdWx0KGxlZnQsIGRlZi5vdXQsIGN0eCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVQaXBlUmVzdWx0KGxlZnQsIGRlZi5vdXQsIGN0eCk7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlUGlwZVJlc3VsdChsZWZ0LCBuZXh0LCBjdHgpIHtcbiAgICBpZiAobGVmdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIHByZXZlbnQgZnVydGhlciBjaGVja3NcbiAgICAgICAgbGVmdC5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGxlZnQ7XG4gICAgfVxuICAgIHJldHVybiBuZXh0Ll96b2QucnVuKHtcbiAgICAgICAgdmFsdWU6IGxlZnQudmFsdWUsXG4gICAgICAgIGlzc3VlczogbGVmdC5pc3N1ZXNcbiAgICB9LCBjdHgpO1xufVxuZXhwb3J0IGNvbnN0ICRab2RDb2RlYyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ29kZWNcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PmRlZi5pbi5fem9kLnZhbHVlcyk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRpblwiLCAoKT0+ZGVmLmluLl96b2Qub3B0aW4pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0b3V0XCIsICgpPT5kZWYub3V0Ll96b2Qub3B0b3V0KTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9PmRlZi5pbi5fem9kLnByb3BWYWx1ZXMpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGN0eC5kaXJlY3Rpb24gfHwgXCJmb3J3YXJkXCI7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IFwiZm9yd2FyZFwiKSB7XG4gICAgICAgICAgICBjb25zdCBsZWZ0ID0gZGVmLmluLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICBpZiAobGVmdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdC50aGVuKChsZWZ0KT0+aGFuZGxlQ29kZWNBUmVzdWx0KGxlZnQsIGRlZiwgY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQ29kZWNBUmVzdWx0KGxlZnQsIGRlZiwgY3R4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZGVmLm91dC5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgaWYgKHJpZ2h0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByaWdodC50aGVuKChyaWdodCk9PmhhbmRsZUNvZGVjQVJlc3VsdChyaWdodCwgZGVmLCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVDb2RlY0FSZXN1bHQocmlnaHQsIGRlZiwgY3R4KTtcbiAgICAgICAgfVxuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZUNvZGVjQVJlc3VsdChyZXN1bHQsIGRlZiwgY3R4KSB7XG4gICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIHByZXZlbnQgZnVydGhlciBjaGVja3NcbiAgICAgICAgcmVzdWx0LmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjb25zdCBkaXJlY3Rpb24gPSBjdHguZGlyZWN0aW9uIHx8IFwiZm9yd2FyZFwiO1xuICAgIGlmIChkaXJlY3Rpb24gPT09IFwiZm9yd2FyZFwiKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gZGVmLnRyYW5zZm9ybShyZXN1bHQudmFsdWUsIHJlc3VsdCk7XG4gICAgICAgIGlmICh0cmFuc2Zvcm1lZCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZC50aGVuKCh2YWx1ZSk9PmhhbmRsZUNvZGVjVHhSZXN1bHQocmVzdWx0LCB2YWx1ZSwgZGVmLm91dCwgY3R4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZUNvZGVjVHhSZXN1bHQocmVzdWx0LCB0cmFuc2Zvcm1lZCwgZGVmLm91dCwgY3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IGRlZi5yZXZlcnNlVHJhbnNmb3JtKHJlc3VsdC52YWx1ZSwgcmVzdWx0KTtcbiAgICAgICAgaWYgKHRyYW5zZm9ybWVkIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkLnRoZW4oKHZhbHVlKT0+aGFuZGxlQ29kZWNUeFJlc3VsdChyZXN1bHQsIHZhbHVlLCBkZWYuaW4sIGN0eCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVDb2RlY1R4UmVzdWx0KHJlc3VsdCwgdHJhbnNmb3JtZWQsIGRlZi5pbiwgY3R4KTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYW5kbGVDb2RlY1R4UmVzdWx0KGxlZnQsIHZhbHVlLCBuZXh0U2NoZW1hLCBjdHgpIHtcbiAgICAvLyBDaGVjayBpZiB0cmFuc2Zvcm0gYWRkZWQgYW55IGlzc3Vlc1xuICAgIGlmIChsZWZ0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgbGVmdC5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGxlZnQ7XG4gICAgfVxuICAgIHJldHVybiBuZXh0U2NoZW1hLl96b2QucnVuKHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGlzc3VlczogbGVmdC5pc3N1ZXNcbiAgICB9LCBjdHgpO1xufVxuZXhwb3J0IGNvbnN0ICRab2RSZWFkb25seSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kUmVhZG9ubHlcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwcm9wVmFsdWVzXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2QucHJvcFZhbHVlcyk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC5vcHRpbik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRvdXRcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC5vcHRvdXQpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGlmIChjdHguZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKGhhbmRsZVJlYWRvbmx5UmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlUmVhZG9ubHlSZXN1bHQocmVzdWx0KTtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVSZWFkb25seVJlc3VsdChwYXlsb2FkKSB7XG4gICAgcGF5bG9hZC52YWx1ZSA9IE9iamVjdC5mcmVlemUocGF5bG9hZC52YWx1ZSk7XG4gICAgcmV0dXJuIHBheWxvYWQ7XG59XG5leHBvcnQgY29uc3QgJFpvZFRlbXBsYXRlTGl0ZXJhbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVGVtcGxhdGVMaXRlcmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IHJlZ2V4UGFydHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgZGVmLnBhcnRzKXtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiICYmIHBhcnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIGlzIFpvZCBzY2hlbWFcbiAgICAgICAgICAgIGlmICghcGFydC5fem9kLnBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICAvLyBpZiAoIXNvdXJjZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVtcGxhdGUgbGl0ZXJhbCBwYXJ0LCBubyBwYXR0ZXJuIGZvdW5kOiAke1tcbiAgICAgICAgICAgICAgICAgICAgLi4ucGFydC5fem9kLnRyYWl0c1xuICAgICAgICAgICAgICAgIF0uc2hpZnQoKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHBhcnQuX3pvZC5wYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwID8gcGFydC5fem9kLnBhdHRlcm4uc291cmNlIDogcGFydC5fem9kLnBhdHRlcm47XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRlbXBsYXRlIGxpdGVyYWwgcGFydDogJHtwYXJ0Ll96b2QudHJhaXRzfWApO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBzb3VyY2Uuc3RhcnRzV2l0aChcIl5cIikgPyAxIDogMDtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHNvdXJjZS5lbmRzV2l0aChcIiRcIikgPyBzb3VyY2UubGVuZ3RoIC0gMSA6IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICByZWdleFBhcnRzLnB1c2goc291cmNlLnNsaWNlKHN0YXJ0LCBlbmQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0ID09PSBudWxsIHx8IHV0aWwucHJpbWl0aXZlVHlwZXMuaGFzKHR5cGVvZiBwYXJ0KSkge1xuICAgICAgICAgICAgcmVnZXhQYXJ0cy5wdXNoKHV0aWwuZXNjYXBlUmVnZXgoYCR7cGFydH1gKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVtcGxhdGUgbGl0ZXJhbCBwYXJ0OiAke3BhcnR9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeJHtyZWdleFBhcnRzLmpvaW4oXCJcIil9JGApO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQudmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwidGVtcGxhdGVfbGl0ZXJhbFwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgaW5zdC5fem9kLnBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICAgICAgaWYgKCFpbnN0Ll96b2QucGF0dGVybi50ZXN0KHBheWxvYWQudmFsdWUpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IGRlZi5mb3JtYXQgPz8gXCJ0ZW1wbGF0ZV9saXRlcmFsXCIsXG4gICAgICAgICAgICAgICAgcGF0dGVybjogaW5zdC5fem9kLnBhdHRlcm4uc291cmNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kRnVuY3Rpb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEZ1bmN0aW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX2RlZiA9IGRlZjtcbiAgICBpbnN0Ll96b2QuZGVmID0gZGVmO1xuICAgIGluc3QuaW1wbGVtZW50ID0gKGZ1bmMpPT57XG4gICAgICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbXBsZW1lbnQoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgZnVuY3Rpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBpbnN0Ll9kZWYuaW5wdXQgPyBwYXJzZShpbnN0Ll9kZWYuaW5wdXQsIGFyZ3MpIDogYXJncztcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkoZnVuYywgdGhpcywgcGFyc2VkQXJncyk7XG4gICAgICAgICAgICBpZiAoaW5zdC5fZGVmLm91dHB1dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZShpbnN0Ll9kZWYub3V0cHV0LCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGluc3QuaW1wbGVtZW50QXN5bmMgPSAoZnVuYyk9PntcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImltcGxlbWVudEFzeW5jKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIGZ1bmN0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gaW5zdC5fZGVmLmlucHV0ID8gYXdhaXQgcGFyc2VBc3luYyhpbnN0Ll9kZWYuaW5wdXQsIGFyZ3MpIDogYXJncztcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFJlZmxlY3QuYXBwbHkoZnVuYywgdGhpcywgcGFyc2VkQXJncyk7XG4gICAgICAgICAgICBpZiAoaW5zdC5fZGVmLm91dHB1dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBwYXJzZUFzeW5jKGluc3QuX2RlZi5vdXRwdXQsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH07XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC52YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiBvdXRwdXQgaXMgYSBwcm9taXNlIHR5cGUgdG8gZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCB1c2UgYXN5bmMgaW1wbGVtZW50YXRpb25cbiAgICAgICAgY29uc3QgaGFzUHJvbWlzZU91dHB1dCA9IGluc3QuX2RlZi5vdXRwdXQgJiYgaW5zdC5fZGVmLm91dHB1dC5fem9kLmRlZi50eXBlID09PSBcInByb21pc2VcIjtcbiAgICAgICAgaWYgKGhhc1Byb21pc2VPdXRwdXQpIHtcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBpbnN0LmltcGxlbWVudEFzeW5jKHBheWxvYWQudmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IGluc3QuaW1wbGVtZW50KHBheWxvYWQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG4gICAgaW5zdC5pbnB1dCA9ICguLi5hcmdzKT0+e1xuICAgICAgICBjb25zdCBGID0gaW5zdC5jb25zdHJ1Y3RvcjtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnc1swXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRih7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgIGlucHV0OiBuZXcgJFpvZFR1cGxlKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0dXBsZVwiLFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogYXJnc1swXSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdDogYXJnc1sxXVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG91dHB1dDogaW5zdC5fZGVmLm91dHB1dFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGKHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIGlucHV0OiBhcmdzWzBdLFxuICAgICAgICAgICAgb3V0cHV0OiBpbnN0Ll9kZWYub3V0cHV0XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgaW5zdC5vdXRwdXQgPSAob3V0cHV0KT0+e1xuICAgICAgICBjb25zdCBGID0gaW5zdC5jb25zdHJ1Y3RvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBGKHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIGlucHV0OiBpbnN0Ll9kZWYuaW5wdXQsXG4gICAgICAgICAgICBvdXRwdXRcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gaW5zdDtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RQcm9taXNlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RQcm9taXNlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocGF5bG9hZC52YWx1ZSkudGhlbigoaW5uZXIpPT5kZWYuaW5uZXJUeXBlLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaW5uZXIsXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RMYXp5ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RMYXp5XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIC8vIGxldCBfaW5uZXJUeXBlITogYW55O1xuICAgIC8vIHV0aWwuZGVmaW5lTGF6eShkZWYsIFwiZ2V0dGVyXCIsICgpID0+IHtcbiAgICAvLyAgIGlmICghX2lubmVyVHlwZSkge1xuICAgIC8vICAgICBfaW5uZXJUeXBlID0gZGVmLmdldHRlcigpO1xuICAgIC8vICAgfVxuICAgIC8vICAgcmV0dXJuICgpID0+IF9pbm5lclR5cGU7XG4gICAgLy8gfSk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJpbm5lclR5cGVcIiwgKCk9PmRlZi5nZXR0ZXIoKSk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwYXR0ZXJuXCIsICgpPT5pbnN0Ll96b2QuaW5uZXJUeXBlLl96b2QucGF0dGVybik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwcm9wVmFsdWVzXCIsICgpPT5pbnN0Ll96b2QuaW5uZXJUeXBlLl96b2QucHJvcFZhbHVlcyk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRpblwiLCAoKT0+aW5zdC5fem9kLmlubmVyVHlwZS5fem9kLm9wdGluID8/IHVuZGVmaW5lZCk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRvdXRcIiwgKCk9Pmluc3QuX3pvZC5pbm5lclR5cGUuX3pvZC5vcHRvdXQgPz8gdW5kZWZpbmVkKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBjb25zdCBpbm5lciA9IGluc3QuX3pvZC5pbm5lclR5cGU7XG4gICAgICAgIHJldHVybiBpbm5lci5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ3VzdG9tID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDdXN0b21cIiwgKGluc3QsIGRlZik9PntcbiAgICBjaGVja3MuJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF8pPT57XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgY29uc3QgciA9IGRlZi5mbihpbnB1dCk7XG4gICAgICAgIGlmIChyIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHIudGhlbigocik9PmhhbmRsZVJlZmluZVJlc3VsdChyLCBwYXlsb2FkLCBpbnB1dCwgaW5zdCkpO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZVJlZmluZVJlc3VsdChyLCBwYXlsb2FkLCBpbnB1dCwgaW5zdCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVSZWZpbmVSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBpbnB1dCwgaW5zdCkge1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IF9pc3MgPSB7XG4gICAgICAgICAgICBjb2RlOiBcImN1c3RvbVwiLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgcGF0aDogW1xuICAgICAgICAgICAgICAgIC4uLmluc3QuX3pvZC5kZWYucGF0aCA/PyBbXVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhaW5zdC5fem9kLmRlZi5hYm9ydFxuICAgICAgICB9O1xuICAgICAgICBpZiAoaW5zdC5fem9kLmRlZi5wYXJhbXMpIF9pc3MucGFyYW1zID0gaW5zdC5fem9kLmRlZi5wYXJhbXM7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2godXRpbC5pc3N1ZShfaXNzKSk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCAkb3V0cHV0ID0gU3ltYm9sKFwiWm9kT3V0cHV0XCIpO1xuZXhwb3J0IGNvbnN0ICRpbnB1dCA9IFN5bWJvbChcIlpvZElucHV0XCIpO1xuZXhwb3J0IGNsYXNzICRab2RSZWdpc3RyeSB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5fbWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgdGhpcy5faWRtYXAgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIGFkZChzY2hlbWEsIC4uLl9tZXRhKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSBfbWV0YVswXTtcbiAgICAgICAgdGhpcy5fbWFwLnNldChzY2hlbWEsIG1ldGEpO1xuICAgICAgICBpZiAobWV0YSAmJiB0eXBlb2YgbWV0YSA9PT0gXCJvYmplY3RcIiAmJiBcImlkXCIgaW4gbWV0YSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lkbWFwLmhhcyhtZXRhLmlkKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSUQgJHttZXRhLmlkfSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcmVnaXN0cnlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2lkbWFwLnNldChtZXRhLmlkLCBzY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgdGhpcy5faWRtYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZW1vdmUoc2NoZW1hKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9tYXAuZ2V0KHNjaGVtYSk7XG4gICAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmIFwiaWRcIiBpbiBtZXRhKSB7XG4gICAgICAgICAgICB0aGlzLl9pZG1hcC5kZWxldGUobWV0YS5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShzY2hlbWEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZ2V0KHNjaGVtYSkge1xuICAgICAgICAvLyByZXR1cm4gdGhpcy5fbWFwLmdldChzY2hlbWEpIGFzIGFueTtcbiAgICAgICAgLy8gaW5oZXJpdCBtZXRhZGF0YVxuICAgICAgICBjb25zdCBwID0gc2NoZW1hLl96b2QucGFyZW50O1xuICAgICAgICBpZiAocCkge1xuICAgICAgICAgICAgY29uc3QgcG0gPSB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5nZXQocCkgPz8ge31cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkZWxldGUgcG0uaWQ7IC8vIGRvIG5vdCBpbmhlcml0IGlkXG4gICAgICAgICAgICBjb25zdCBmID0ge1xuICAgICAgICAgICAgICAgIC4uLnBtLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuX21hcC5nZXQoc2NoZW1hKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhmKS5sZW5ndGggPyBmIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuZ2V0KHNjaGVtYSk7XG4gICAgfVxuICAgIGhhcyhzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcC5oYXMoc2NoZW1hKTtcbiAgICB9XG59XG4vLyByZWdpc3RyaWVzXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0cnkoKSB7XG4gICAgcmV0dXJuIG5ldyAkWm9kUmVnaXN0cnkoKTtcbn1cbmV4cG9ydCBjb25zdCBnbG9iYWxSZWdpc3RyeSA9IC8qQF9fUFVSRV9fKi8gcmVnaXN0cnkoKTtcbiIsICJpbXBvcnQgKiBhcyBjaGVja3MgZnJvbSBcIi4vY2hlY2tzLmpzXCI7XG5pbXBvcnQgKiBhcyBzY2hlbWFzIGZyb20gXCIuL3NjaGVtYXMuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIF9zdHJpbmcoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2NvZXJjZWRTdHJpbmcoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBjb2VyY2U6IHRydWUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZW1haWwoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZW1haWxcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZ3VpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJndWlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3V1aWQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwidXVpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF91dWlkdjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwidXVpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgdmVyc2lvbjogXCJ2NFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3V1aWR2NihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ1dWlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICB2ZXJzaW9uOiBcInY2XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdXVpZHY3KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcInV1aWRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIHZlcnNpb246IFwidjdcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF91cmwoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwidXJsXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2Vtb2ppKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImVtb2ppXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX25hbm9pZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJuYW5vaWRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY3VpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJjdWlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2N1aWQyKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImN1aWQyXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3VsaWQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwidWxpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF94aWQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwieGlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2tzdWlkKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImtzdWlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2lwdjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiaXB2NFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9pcHY2KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImlwdjZcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY2lkcnY0KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImNpZHJ2NFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9jaWRydjYoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiY2lkcnY2XCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2Jhc2U2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJiYXNlNjRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfYmFzZTY0dXJsKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImJhc2U2NHVybFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9lMTY0KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImUxNjRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfand0KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImp3dFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFRpbWVQcmVjaXNpb24gPSB7XG4gICAgQW55OiBudWxsLFxuICAgIE1pbnV0ZTogLTEsXG4gICAgU2Vjb25kOiAwLFxuICAgIE1pbGxpc2Vjb25kOiAzLFxuICAgIE1pY3Jvc2Vjb25kOiA2XG59O1xuZXhwb3J0IGZ1bmN0aW9uIF9pc29EYXRlVGltZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJkYXRldGltZVwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIG9mZnNldDogZmFsc2UsXG4gICAgICAgIGxvY2FsOiBmYWxzZSxcbiAgICAgICAgcHJlY2lzaW9uOiBudWxsLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2lzb0RhdGUoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZGF0ZVwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfaXNvVGltZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ0aW1lXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgcHJlY2lzaW9uOiBudWxsLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2lzb0R1cmF0aW9uKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImR1cmF0aW9uXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9udW1iZXIoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2NvZXJjZWROdW1iZXIoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBjb2VyY2U6IHRydWUsXG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfaW50KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgY2hlY2s6IFwibnVtYmVyX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogXCJzYWZlaW50XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZmxvYXQzMihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrOiBcIm51bWJlcl9mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6IFwiZmxvYXQzMlwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2Zsb2F0NjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBjaGVjazogXCJudW1iZXJfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiBcImZsb2F0NjRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9pbnQzMihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrOiBcIm51bWJlcl9mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6IFwiaW50MzJcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF91aW50MzIoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBjaGVjazogXCJudW1iZXJfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiBcInVpbnQzMlwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2Jvb2xlYW4oQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9jb2VyY2VkQm9vbGVhbihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICBjb2VyY2U6IHRydWUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfYmlnaW50KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9jb2VyY2VkQmlnaW50KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgY29lcmNlOiB0cnVlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2ludDY0KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgY2hlY2s6IFwiYmlnaW50X2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogXCJpbnQ2NFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3VpbnQ2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgIGNoZWNrOiBcImJpZ2ludF9mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6IFwidWludDY0XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfc3ltYm9sKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzeW1ib2xcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF91bmRlZmluZWQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInVuZGVmaW5lZFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX251bGwoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bGxcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9hbnkoQ2xhc3MpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJhbnlcIlxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF91bmtub3duKENsYXNzKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwidW5rbm93blwiXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX25ldmVyKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJuZXZlclwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3ZvaWQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInZvaWRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9kYXRlKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJkYXRlXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY29lcmNlZERhdGUoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImRhdGVcIixcbiAgICAgICAgY29lcmNlOiB0cnVlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX25hbihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibmFuXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbHQodmFsdWUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja0xlc3NUaGFuKHtcbiAgICAgICAgY2hlY2s6IFwibGVzc190aGFuXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpbmNsdXNpdmU6IGZhbHNlXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2x0ZSh2YWx1ZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrTGVzc1RoYW4oe1xuICAgICAgICBjaGVjazogXCJsZXNzX3RoYW5cIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGluY2x1c2l2ZTogdHJ1ZVxuICAgIH0pO1xufVxuZXhwb3J0IHsgLyoqIEBkZXByZWNhdGVkIFVzZSBgei5sdGUoKWAgaW5zdGVhZC4gKi8gX2x0ZSBhcyBfbWF4IH07XG5leHBvcnQgZnVuY3Rpb24gX2d0KHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tHcmVhdGVyVGhhbih7XG4gICAgICAgIGNoZWNrOiBcImdyZWF0ZXJfdGhhblwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaW5jbHVzaXZlOiBmYWxzZVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9ndGUodmFsdWUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja0dyZWF0ZXJUaGFuKHtcbiAgICAgICAgY2hlY2s6IFwiZ3JlYXRlcl90aGFuXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpbmNsdXNpdmU6IHRydWVcbiAgICB9KTtcbn1cbmV4cG9ydCB7IC8qKiBAZGVwcmVjYXRlZCBVc2UgYHouZ3RlKClgIGluc3RlYWQuICovIF9ndGUgYXMgX21pbiB9O1xuZXhwb3J0IGZ1bmN0aW9uIF9wb3NpdGl2ZShwYXJhbXMpIHtcbiAgICByZXR1cm4gX2d0KDAsIHBhcmFtcyk7XG59XG4vLyBuZWdhdGl2ZVxuZXhwb3J0IGZ1bmN0aW9uIF9uZWdhdGl2ZShwYXJhbXMpIHtcbiAgICByZXR1cm4gX2x0KDAsIHBhcmFtcyk7XG59XG4vLyBub25wb3NpdGl2ZVxuZXhwb3J0IGZ1bmN0aW9uIF9ub25wb3NpdGl2ZShwYXJhbXMpIHtcbiAgICByZXR1cm4gX2x0ZSgwLCBwYXJhbXMpO1xufVxuLy8gbm9ubmVnYXRpdmVcbmV4cG9ydCBmdW5jdGlvbiBfbm9ubmVnYXRpdmUocGFyYW1zKSB7XG4gICAgcmV0dXJuIF9ndGUoMCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbXVsdGlwbGVPZih2YWx1ZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrTXVsdGlwbGVPZih7XG4gICAgICAgIGNoZWNrOiBcIm11bHRpcGxlX29mXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIHZhbHVlXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX21heFNpemUobWF4aW11bSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrTWF4U2l6ZSh7XG4gICAgICAgIGNoZWNrOiBcIm1heF9zaXplXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIG1heGltdW1cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbWluU2l6ZShtaW5pbXVtLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tNaW5TaXplKHtcbiAgICAgICAgY2hlY2s6IFwibWluX3NpemVcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgbWluaW11bVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9zaXplKHNpemUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja1NpemVFcXVhbHMoe1xuICAgICAgICBjaGVjazogXCJzaXplX2VxdWFsc1wiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBzaXplXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX21heExlbmd0aChtYXhpbXVtLCBwYXJhbXMpIHtcbiAgICBjb25zdCBjaCA9IG5ldyBjaGVja3MuJFpvZENoZWNrTWF4TGVuZ3RoKHtcbiAgICAgICAgY2hlY2s6IFwibWF4X2xlbmd0aFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBtYXhpbXVtXG4gICAgfSk7XG4gICAgcmV0dXJuIGNoO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9taW5MZW5ndGgobWluaW11bSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrTWluTGVuZ3RoKHtcbiAgICAgICAgY2hlY2s6IFwibWluX2xlbmd0aFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBtaW5pbXVtXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2xlbmd0aChsZW5ndGgsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja0xlbmd0aEVxdWFscyh7XG4gICAgICAgIGNoZWNrOiBcImxlbmd0aF9lcXVhbHNcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgbGVuZ3RoXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3JlZ2V4KHBhdHRlcm4sIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja1JlZ2V4KHtcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBmb3JtYXQ6IFwicmVnZXhcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgcGF0dGVyblxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9sb3dlcmNhc2UocGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrTG93ZXJDYXNlKHtcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBmb3JtYXQ6IFwibG93ZXJjYXNlXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdXBwZXJjYXNlKHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja1VwcGVyQ2FzZSh7XG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgZm9ybWF0OiBcInVwcGVyY2FzZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2luY2x1ZGVzKGluY2x1ZGVzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tJbmNsdWRlcyh7XG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgZm9ybWF0OiBcImluY2x1ZGVzXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIGluY2x1ZGVzXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3N0YXJ0c1dpdGgocHJlZml4LCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tTdGFydHNXaXRoKHtcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBmb3JtYXQ6IFwic3RhcnRzX3dpdGhcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgcHJlZml4XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2VuZHNXaXRoKHN1ZmZpeCwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrRW5kc1dpdGgoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJlbmRzX3dpdGhcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgc3VmZml4XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3Byb3BlcnR5KHByb3BlcnR5LCBzY2hlbWEsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja1Byb3BlcnR5KHtcbiAgICAgICAgY2hlY2s6IFwicHJvcGVydHlcIixcbiAgICAgICAgcHJvcGVydHksXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9taW1lKHR5cGVzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tNaW1lVHlwZSh7XG4gICAgICAgIGNoZWNrOiBcIm1pbWVfdHlwZVwiLFxuICAgICAgICBtaW1lOiB0eXBlcyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9vdmVyd3JpdGUodHgpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tPdmVyd3JpdGUoe1xuICAgICAgICBjaGVjazogXCJvdmVyd3JpdGVcIixcbiAgICAgICAgdHhcbiAgICB9KTtcbn1cbi8vIG5vcm1hbGl6ZVxuZXhwb3J0IGZ1bmN0aW9uIF9ub3JtYWxpemUoZm9ybSkge1xuICAgIHJldHVybiBfb3ZlcndyaXRlKChpbnB1dCk9PmlucHV0Lm5vcm1hbGl6ZShmb3JtKSk7XG59XG4vLyB0cmltXG5leHBvcnQgZnVuY3Rpb24gX3RyaW0oKSB7XG4gICAgcmV0dXJuIF9vdmVyd3JpdGUoKGlucHV0KT0+aW5wdXQudHJpbSgpKTtcbn1cbi8vIHRvTG93ZXJDYXNlXG5leHBvcnQgZnVuY3Rpb24gX3RvTG93ZXJDYXNlKCkge1xuICAgIHJldHVybiBfb3ZlcndyaXRlKChpbnB1dCk9PmlucHV0LnRvTG93ZXJDYXNlKCkpO1xufVxuLy8gdG9VcHBlckNhc2VcbmV4cG9ydCBmdW5jdGlvbiBfdG9VcHBlckNhc2UoKSB7XG4gICAgcmV0dXJuIF9vdmVyd3JpdGUoKGlucHV0KT0+aW5wdXQudG9VcHBlckNhc2UoKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2FycmF5KENsYXNzLCBlbGVtZW50LCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICAvLyBnZXQgZWxlbWVudCgpIHtcbiAgICAgICAgLy8gICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF91bmlvbihDbGFzcywgb3B0aW9ucywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwidW5pb25cIixcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9kaXNjcmltaW5hdGVkVW5pb24oQ2xhc3MsIGRpc2NyaW1pbmF0b3IsIG9wdGlvbnMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInVuaW9uXCIsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIGRpc2NyaW1pbmF0b3IsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfaW50ZXJzZWN0aW9uKENsYXNzLCBsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImludGVyc2VjdGlvblwiLFxuICAgICAgICBsZWZ0LFxuICAgICAgICByaWdodFxuICAgIH0pO1xufVxuLy8gZXhwb3J0IGZ1bmN0aW9uIF90dXBsZShcbi8vICAgQ2xhc3M6IHV0aWwuU2NoZW1hQ2xhc3M8c2NoZW1hcy4kWm9kVHVwbGU+LFxuLy8gICBpdGVtczogW10sXG4vLyAgIHBhcmFtcz86IHN0cmluZyB8ICRab2RUdXBsZVBhcmFtc1xuLy8gKTogc2NoZW1hcy4kWm9kVHVwbGU8W10sIG51bGw+O1xuZXhwb3J0IGZ1bmN0aW9uIF90dXBsZShDbGFzcywgaXRlbXMsIF9wYXJhbXNPclJlc3QsIF9wYXJhbXMpIHtcbiAgICBjb25zdCBoYXNSZXN0ID0gX3BhcmFtc09yUmVzdCBpbnN0YW5jZW9mIHNjaGVtYXMuJFpvZFR5cGU7XG4gICAgY29uc3QgcGFyYW1zID0gaGFzUmVzdCA/IF9wYXJhbXMgOiBfcGFyYW1zT3JSZXN0O1xuICAgIGNvbnN0IHJlc3QgPSBoYXNSZXN0ID8gX3BhcmFtc09yUmVzdCA6IG51bGw7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwidHVwbGVcIixcbiAgICAgICAgaXRlbXMsXG4gICAgICAgIHJlc3QsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfcmVjb3JkKENsYXNzLCBrZXlUeXBlLCB2YWx1ZVR5cGUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInJlY29yZFwiLFxuICAgICAgICBrZXlUeXBlLFxuICAgICAgICB2YWx1ZVR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbWFwKENsYXNzLCBrZXlUeXBlLCB2YWx1ZVR5cGUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm1hcFwiLFxuICAgICAgICBrZXlUeXBlLFxuICAgICAgICB2YWx1ZVR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfc2V0KENsYXNzLCB2YWx1ZVR5cGUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICB2YWx1ZVR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZW51bShDbGFzcywgdmFsdWVzLCBwYXJhbXMpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpID8gT2JqZWN0LmZyb21FbnRyaWVzKHZhbHVlcy5tYXAoKHYpPT5bXG4gICAgICAgICAgICB2LFxuICAgICAgICAgICAgdlxuICAgICAgICBdKSkgOiB2YWx1ZXM7XG4gICAgLy8gaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIC8vICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAvLyAgICAgZW50cmllc1t2YWx1ZV0gPSB2YWx1ZTtcbiAgICAvLyAgIH1cbiAgICAvLyB9IGVsc2Uge1xuICAgIC8vICAgT2JqZWN0LmFzc2lnbihlbnRyaWVzLCB2YWx1ZXMpO1xuICAgIC8vIH1cbiAgICAvLyBjb25zdCBlbnRyaWVzOiB1dGlsLkVudW1MaWtlID0ge307XG4gICAgLy8gZm9yIChjb25zdCB2YWwgb2YgdmFsdWVzKSB7XG4gICAgLy8gICBlbnRyaWVzW3ZhbF0gPSB2YWw7XG4gICAgLy8gfVxuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgZW50cmllcyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLyoqIEBkZXByZWNhdGVkIFRoaXMgQVBJIGhhcyBiZWVuIG1lcmdlZCBpbnRvIGB6LmVudW0oKWAuIFVzZSBgei5lbnVtKClgIGluc3RlYWQuXG4gKlxuICogYGBgdHNcbiAqIGVudW0gQ29sb3JzIHsgcmVkLCBncmVlbiwgYmx1ZSB9XG4gKiB6LmVudW0oQ29sb3JzKTtcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiBfbmF0aXZlRW51bShDbGFzcywgZW50cmllcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICBlbnRyaWVzLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2xpdGVyYWwoQ2xhc3MsIHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJsaXRlcmFsXCIsXG4gICAgICAgIHZhbHVlczogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgIF0sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZmlsZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3RyYW5zZm9ybShDbGFzcywgZm4pIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgdHJhbnNmb3JtOiBmblxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9vcHRpb25hbChDbGFzcywgaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwib3B0aW9uYWxcIixcbiAgICAgICAgaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX251bGxhYmxlKENsYXNzLCBpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJudWxsYWJsZVwiLFxuICAgICAgICBpbm5lclR5cGVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZGVmYXVsdChDbGFzcywgaW5uZXJUeXBlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJkZWZhdWx0XCIsXG4gICAgICAgIGlubmVyVHlwZSxcbiAgICAgICAgZ2V0IGRlZmF1bHRWYWx1ZSAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gZGVmYXVsdFZhbHVlKCkgOiB1dGlsLnNoYWxsb3dDbG9uZShkZWZhdWx0VmFsdWUpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX25vbm9wdGlvbmFsKENsYXNzLCBpbm5lclR5cGUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm5vbm9wdGlvbmFsXCIsXG4gICAgICAgIGlubmVyVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9zdWNjZXNzKENsYXNzLCBpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdWNjZXNzXCIsXG4gICAgICAgIGlubmVyVHlwZVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9jYXRjaChDbGFzcywgaW5uZXJUeXBlLCBjYXRjaFZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiY2F0Y2hcIixcbiAgICAgICAgaW5uZXJUeXBlLFxuICAgICAgICBjYXRjaFZhbHVlOiB0eXBlb2YgY2F0Y2hWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gY2F0Y2hWYWx1ZSA6ICgpPT5jYXRjaFZhbHVlXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3BpcGUoQ2xhc3MsIGluXywgb3V0KSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwicGlwZVwiLFxuICAgICAgICBpbjogaW5fLFxuICAgICAgICBvdXRcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfcmVhZG9ubHkoQ2xhc3MsIGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInJlYWRvbmx5XCIsXG4gICAgICAgIGlubmVyVHlwZVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF90ZW1wbGF0ZUxpdGVyYWwoQ2xhc3MsIHBhcnRzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ0ZW1wbGF0ZV9saXRlcmFsXCIsXG4gICAgICAgIHBhcnRzLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2xhenkoQ2xhc3MsIGdldHRlcikge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImxhenlcIixcbiAgICAgICAgZ2V0dGVyXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3Byb21pc2UoQ2xhc3MsIGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInByb21pc2VcIixcbiAgICAgICAgaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2N1c3RvbShDbGFzcywgZm4sIF9wYXJhbXMpIHtcbiAgICBjb25zdCBub3JtID0gdXRpbC5ub3JtYWxpemVQYXJhbXMoX3BhcmFtcyk7XG4gICAgbm9ybS5hYm9ydCA/PyAobm9ybS5hYm9ydCA9IHRydWUpOyAvLyBkZWZhdWx0IHRvIGFib3J0OmZhbHNlXG4gICAgY29uc3Qgc2NoZW1hID0gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJjdXN0b21cIixcbiAgICAgICAgY2hlY2s6IFwiY3VzdG9tXCIsXG4gICAgICAgIGZuOiBmbixcbiAgICAgICAgLi4ubm9ybVxuICAgIH0pO1xuICAgIHJldHVybiBzY2hlbWE7XG59XG4vLyBzYW1lIGFzIF9jdXN0b20gYnV0IGRlZmF1bHRzIHRvIGFib3J0OmZhbHNlXG5leHBvcnQgZnVuY3Rpb24gX3JlZmluZShDbGFzcywgZm4sIF9wYXJhbXMpIHtcbiAgICBjb25zdCBzY2hlbWEgPSBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgICBjaGVjazogXCJjdXN0b21cIixcbiAgICAgICAgZm46IGZuLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhfcGFyYW1zKVxuICAgIH0pO1xuICAgIHJldHVybiBzY2hlbWE7XG59XG5leHBvcnQgZnVuY3Rpb24gX3N1cGVyUmVmaW5lKGZuKSB7XG4gICAgY29uc3QgY2ggPSBfY2hlY2soKHBheWxvYWQpPT57XG4gICAgICAgIHBheWxvYWQuYWRkSXNzdWUgPSAoaXNzdWUpPT57XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlzc3VlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh1dGlsLmlzc3VlKGlzc3VlLCBwYXlsb2FkLnZhbHVlLCBjaC5fem9kLmRlZikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmb3IgWm9kIDMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgICAgICBjb25zdCBfaXNzdWUgPSBpc3N1ZTtcbiAgICAgICAgICAgICAgICBpZiAoX2lzc3VlLmZhdGFsKSBfaXNzdWUuY29udGludWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuY29kZSA/PyAoX2lzc3VlLmNvZGUgPSBcImN1c3RvbVwiKTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuaW5wdXQgPz8gKF9pc3N1ZS5pbnB1dCA9IHBheWxvYWQudmFsdWUpO1xuICAgICAgICAgICAgICAgIF9pc3N1ZS5pbnN0ID8/IChfaXNzdWUuaW5zdCA9IGNoKTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuY29udGludWUgPz8gKF9pc3N1ZS5jb250aW51ZSA9ICFjaC5fem9kLmRlZi5hYm9ydCk7IC8vIGFib3J0IGlzIGFsd2F5cyB1bmRlZmluZWQsIHNvIHRoaXMgaXMgYWx3YXlzIHRydWUuLi5cbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHV0aWwuaXNzdWUoX2lzc3VlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBmbihwYXlsb2FkLnZhbHVlLCBwYXlsb2FkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2g7XG59XG5leHBvcnQgZnVuY3Rpb24gX2NoZWNrKGZuLCBwYXJhbXMpIHtcbiAgICBjb25zdCBjaCA9IG5ldyBjaGVja3MuJFpvZENoZWNrKHtcbiAgICAgICAgY2hlY2s6IFwiY3VzdG9tXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbiAgICBjaC5fem9kLmNoZWNrID0gZm47XG4gICAgcmV0dXJuIGNoO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9zdHJpbmdib29sKENsYXNzZXMsIF9wYXJhbXMpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB1dGlsLm5vcm1hbGl6ZVBhcmFtcyhfcGFyYW1zKTtcbiAgICBsZXQgdHJ1dGh5QXJyYXkgPSBwYXJhbXMudHJ1dGh5ID8/IFtcbiAgICAgICAgXCJ0cnVlXCIsXG4gICAgICAgIFwiMVwiLFxuICAgICAgICBcInllc1wiLFxuICAgICAgICBcIm9uXCIsXG4gICAgICAgIFwieVwiLFxuICAgICAgICBcImVuYWJsZWRcIlxuICAgIF07XG4gICAgbGV0IGZhbHN5QXJyYXkgPSBwYXJhbXMuZmFsc3kgPz8gW1xuICAgICAgICBcImZhbHNlXCIsXG4gICAgICAgIFwiMFwiLFxuICAgICAgICBcIm5vXCIsXG4gICAgICAgIFwib2ZmXCIsXG4gICAgICAgIFwiblwiLFxuICAgICAgICBcImRpc2FibGVkXCJcbiAgICBdO1xuICAgIGlmIChwYXJhbXMuY2FzZSAhPT0gXCJzZW5zaXRpdmVcIikge1xuICAgICAgICB0cnV0aHlBcnJheSA9IHRydXRoeUFycmF5Lm1hcCgodik9PnR5cGVvZiB2ID09PSBcInN0cmluZ1wiID8gdi50b0xvd2VyQ2FzZSgpIDogdik7XG4gICAgICAgIGZhbHN5QXJyYXkgPSBmYWxzeUFycmF5Lm1hcCgodik9PnR5cGVvZiB2ID09PSBcInN0cmluZ1wiID8gdi50b0xvd2VyQ2FzZSgpIDogdik7XG4gICAgfVxuICAgIGNvbnN0IHRydXRoeVNldCA9IG5ldyBTZXQodHJ1dGh5QXJyYXkpO1xuICAgIGNvbnN0IGZhbHN5U2V0ID0gbmV3IFNldChmYWxzeUFycmF5KTtcbiAgICBjb25zdCBfQ29kZWMgPSBDbGFzc2VzLkNvZGVjID8/IHNjaGVtYXMuJFpvZENvZGVjO1xuICAgIGNvbnN0IF9Cb29sZWFuID0gQ2xhc3Nlcy5Cb29sZWFuID8/IHNjaGVtYXMuJFpvZEJvb2xlYW47XG4gICAgY29uc3QgX1N0cmluZyA9IENsYXNzZXMuU3RyaW5nID8/IHNjaGVtYXMuJFpvZFN0cmluZztcbiAgICBjb25zdCBzdHJpbmdTY2hlbWEgPSBuZXcgX1N0cmluZyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGVycm9yOiBwYXJhbXMuZXJyb3JcbiAgICB9KTtcbiAgICBjb25zdCBib29sZWFuU2NoZW1hID0gbmV3IF9Cb29sZWFuKHtcbiAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgIGVycm9yOiBwYXJhbXMuZXJyb3JcbiAgICB9KTtcbiAgICBjb25zdCBjb2RlYyA9IG5ldyBfQ29kZWMoe1xuICAgICAgICB0eXBlOiBcInBpcGVcIixcbiAgICAgICAgaW46IHN0cmluZ1NjaGVtYSxcbiAgICAgICAgb3V0OiBib29sZWFuU2NoZW1hLFxuICAgICAgICB0cmFuc2Zvcm06IChpbnB1dCwgcGF5bG9hZCk9PntcbiAgICAgICAgICAgIGxldCBkYXRhID0gaW5wdXQ7XG4gICAgICAgICAgICBpZiAocGFyYW1zLmNhc2UgIT09IFwic2Vuc2l0aXZlXCIpIGRhdGEgPSBkYXRhLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodHJ1dGh5U2V0LmhhcyhkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmYWxzeVNldC5oYXMoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwic3RyaW5nYm9vbFwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRydXRoeVNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmZhbHN5U2V0XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBpbnN0OiBjb2RlYyxcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZXZlcnNlVHJhbnNmb3JtOiAoaW5wdXQsIF9wYXlsb2FkKT0+e1xuICAgICAgICAgICAgaWYgKGlucHV0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydXRoeUFycmF5WzBdIHx8IFwidHJ1ZVwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc3lBcnJheVswXSB8fCBcImZhbHNlXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBwYXJhbXMuZXJyb3JcbiAgICB9KTtcbiAgICByZXR1cm4gY29kZWM7XG59XG5leHBvcnQgZnVuY3Rpb24gX3N0cmluZ0Zvcm1hdChDbGFzcywgZm9ybWF0LCBmbk9yUmVnZXgsIF9wYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHV0aWwubm9ybWFsaXplUGFyYW1zKF9wYXJhbXMpO1xuICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMoX3BhcmFtcyksXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0LFxuICAgICAgICBmbjogdHlwZW9mIGZuT3JSZWdleCA9PT0gXCJmdW5jdGlvblwiID8gZm5PclJlZ2V4IDogKHZhbCk9PmZuT3JSZWdleC50ZXN0KHZhbCksXG4gICAgICAgIC4uLnBhcmFtc1xuICAgIH07XG4gICAgaWYgKGZuT3JSZWdleCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICBkZWYucGF0dGVybiA9IGZuT3JSZWdleDtcbiAgICB9XG4gICAgY29uc3QgaW5zdCA9IG5ldyBDbGFzcyhkZWYpO1xuICAgIHJldHVybiBpbnN0O1xufVxuIiwgImltcG9ydCAqIGFzIGNvcmUgZnJvbSBcIi4uL2NvcmUvaW5kZXguanNcIjtcbmltcG9ydCAqIGFzIHNjaGVtYXMgZnJvbSBcIi4vc2NoZW1hcy5qc1wiO1xuZXhwb3J0IGNvbnN0IFpvZElTT0RhdGVUaW1lID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZElTT0RhdGVUaW1lXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kSVNPRGF0ZVRpbWUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHNjaGVtYXMuWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGV0aW1lKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9pc29EYXRlVGltZShab2RJU09EYXRlVGltZSwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RJU09EYXRlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZElTT0RhdGVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RJU09EYXRlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBzY2hlbWFzLlpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBkYXRlKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9pc29EYXRlKFpvZElTT0RhdGUsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kSVNPVGltZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RJU09UaW1lXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kSVNPVGltZS5pbml0KGluc3QsIGRlZik7XG4gICAgc2NoZW1hcy5ab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdGltZShwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faXNvVGltZShab2RJU09UaW1lLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZElTT0R1cmF0aW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZElTT0R1cmF0aW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kSVNPRHVyYXRpb24uaW5pdChpbnN0LCBkZWYpO1xuICAgIHNjaGVtYXMuWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGR1cmF0aW9uKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9pc29EdXJhdGlvbihab2RJU09EdXJhdGlvbiwgcGFyYW1zKTtcbn1cbiIsICJpbXBvcnQgKiBhcyBjb3JlIGZyb20gXCIuLi9jb3JlL2luZGV4LmpzXCI7XG5pbXBvcnQgeyAkWm9kRXJyb3IgfSBmcm9tIFwiLi4vY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tIFwiLi4vY29yZS91dGlsLmpzXCI7XG5jb25zdCBpbml0aWFsaXplciA9IChpbnN0LCBpc3N1ZXMpPT57XG4gICAgJFpvZEVycm9yLmluaXQoaW5zdCwgaXNzdWVzKTtcbiAgICBpbnN0Lm5hbWUgPSBcIlpvZEVycm9yXCI7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaW5zdCwge1xuICAgICAgICBmb3JtYXQ6IHtcbiAgICAgICAgICAgIHZhbHVlOiAobWFwcGVyKT0+Y29yZS5mb3JtYXRFcnJvcihpbnN0LCBtYXBwZXIpXG4gICAgICAgIH0sXG4gICAgICAgIGZsYXR0ZW46IHtcbiAgICAgICAgICAgIHZhbHVlOiAobWFwcGVyKT0+Y29yZS5mbGF0dGVuRXJyb3IoaW5zdCwgbWFwcGVyKVxuICAgICAgICB9LFxuICAgICAgICBhZGRJc3N1ZToge1xuICAgICAgICAgICAgdmFsdWU6IChpc3N1ZSk9PntcbiAgICAgICAgICAgICAgICBpbnN0Lmlzc3Vlcy5wdXNoKGlzc3VlKTtcbiAgICAgICAgICAgICAgICBpbnN0Lm1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShpbnN0Lmlzc3VlcywgdXRpbC5qc29uU3RyaW5naWZ5UmVwbGFjZXIsIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBhZGRJc3N1ZXM6IHtcbiAgICAgICAgICAgIHZhbHVlOiAoaXNzdWVzKT0+e1xuICAgICAgICAgICAgICAgIGluc3QuaXNzdWVzLnB1c2goLi4uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICBpbnN0Lm1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShpbnN0Lmlzc3VlcywgdXRpbC5qc29uU3RyaW5naWZ5UmVwbGFjZXIsIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpc0VtcHR5OiB7XG4gICAgICAgICAgICBnZXQgKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0Lmlzc3Vlcy5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbi8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0LCBcImlzRW1wdHlcIiwge1xuLy8gICBnZXQoKSB7XG4vLyAgICAgcmV0dXJuIGluc3QuaXNzdWVzLmxlbmd0aCA9PT0gMDtcbi8vICAgfSxcbi8vIH0pO1xufTtcbmV4cG9ydCBjb25zdCBab2RFcnJvciA9IGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRXJyb3JcIiwgaW5pdGlhbGl6ZXIpO1xuZXhwb3J0IGNvbnN0IFpvZFJlYWxFcnJvciA9IGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRXJyb3JcIiwgaW5pdGlhbGl6ZXIsIHtcbiAgICBQYXJlbnQ6IEVycm9yXG59KTsgLy8gLyoqIEBkZXByZWNhdGVkIFVzZSBgei5jb3JlLiRab2RFcnJvck1hcEN0eGAgaW5zdGVhZC4gKi9cbiAvLyBleHBvcnQgdHlwZSBFcnJvck1hcEN0eCA9IGNvcmUuJFpvZEVycm9yTWFwQ3R4O1xuIiwgImltcG9ydCAqIGFzIGNvcmUgZnJvbSBcIi4uL2NvcmUvaW5kZXguanNcIjtcbmltcG9ydCB7IFpvZFJlYWxFcnJvciB9IGZyb20gXCIuL2Vycm9ycy5qc1wiO1xuZXhwb3J0IGNvbnN0IHBhcnNlID0gLyogQF9fUFVSRV9fICovIGNvcmUuX3BhcnNlKFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgcGFyc2VBc3luYyA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9wYXJzZUFzeW5jKFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3Qgc2FmZVBhcnNlID0gLyogQF9fUFVSRV9fICovIGNvcmUuX3NhZmVQYXJzZShab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IHNhZmVQYXJzZUFzeW5jID0gLyogQF9fUFVSRV9fICovIGNvcmUuX3NhZmVQYXJzZUFzeW5jKFpvZFJlYWxFcnJvcik7XG4vLyBDb2RlYyBmdW5jdGlvbnNcbmV4cG9ydCBjb25zdCBlbmNvZGUgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fZW5jb2RlKFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgZGVjb2RlID0gLyogQF9fUFVSRV9fICovIGNvcmUuX2RlY29kZShab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IGVuY29kZUFzeW5jID0gLyogQF9fUFVSRV9fICovIGNvcmUuX2VuY29kZUFzeW5jKFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgZGVjb2RlQXN5bmMgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fZGVjb2RlQXN5bmMoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBzYWZlRW5jb2RlID0gLyogQF9fUFVSRV9fICovIGNvcmUuX3NhZmVFbmNvZGUoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBzYWZlRGVjb2RlID0gLyogQF9fUFVSRV9fICovIGNvcmUuX3NhZmVEZWNvZGUoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBzYWZlRW5jb2RlQXN5bmMgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZUVuY29kZUFzeW5jKFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3Qgc2FmZURlY29kZUFzeW5jID0gLyogQF9fUFVSRV9fICovIGNvcmUuX3NhZmVEZWNvZGVBc3luYyhab2RSZWFsRXJyb3IpO1xuIiwgImltcG9ydCAqIGFzIGNvcmUgZnJvbSBcIi4uL2NvcmUvaW5kZXguanNcIjtcbmltcG9ydCB7IHV0aWwgfSBmcm9tIFwiLi4vY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0ICogYXMgY2hlY2tzIGZyb20gXCIuL2NoZWNrcy5qc1wiO1xuaW1wb3J0ICogYXMgaXNvIGZyb20gXCIuL2lzby5qc1wiO1xuaW1wb3J0ICogYXMgcGFyc2UgZnJvbSBcIi4vcGFyc2UuanNcIjtcbmV4cG9ydCBjb25zdCBab2RUeXBlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFR5cGVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LmRlZiA9IGRlZjtcbiAgICBpbnN0LnR5cGUgPSBkZWYudHlwZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdCwgXCJfZGVmXCIsIHtcbiAgICAgICAgdmFsdWU6IGRlZlxuICAgIH0pO1xuICAgIC8vIGJhc2UgbWV0aG9kc1xuICAgIGluc3QuY2hlY2sgPSAoLi4uY2hlY2tzKT0+e1xuICAgICAgICByZXR1cm4gaW5zdC5jbG9uZSh1dGlsLm1lcmdlRGVmcyhkZWYsIHtcbiAgICAgICAgICAgIGNoZWNrczogW1xuICAgICAgICAgICAgICAgIC4uLmRlZi5jaGVja3MgPz8gW10sXG4gICAgICAgICAgICAgICAgLi4uY2hlY2tzLm1hcCgoY2gpPT50eXBlb2YgY2ggPT09IFwiZnVuY3Rpb25cIiA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF96b2Q6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjazogY2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrOiBcImN1c3RvbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmF0dGFjaDogW11cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSA6IGNoKVxuICAgICAgICAgICAgXVxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICBpbnN0LmNsb25lID0gKGRlZiwgcGFyYW1zKT0+Y29yZS5jbG9uZShpbnN0LCBkZWYsIHBhcmFtcyk7XG4gICAgaW5zdC5icmFuZCA9ICgpPT5pbnN0O1xuICAgIGluc3QucmVnaXN0ZXIgPSAocmVnLCBtZXRhKT0+e1xuICAgICAgICByZWcuYWRkKGluc3QsIG1ldGEpO1xuICAgICAgICByZXR1cm4gaW5zdDtcbiAgICB9O1xuICAgIC8vIHBhcnNpbmdcbiAgICBpbnN0LnBhcnNlID0gKGRhdGEsIHBhcmFtcyk9PnBhcnNlLnBhcnNlKGluc3QsIGRhdGEsIHBhcmFtcywge1xuICAgICAgICAgICAgY2FsbGVlOiBpbnN0LnBhcnNlXG4gICAgICAgIH0pO1xuICAgIGluc3Quc2FmZVBhcnNlID0gKGRhdGEsIHBhcmFtcyk9PnBhcnNlLnNhZmVQYXJzZShpbnN0LCBkYXRhLCBwYXJhbXMpO1xuICAgIGluc3QucGFyc2VBc3luYyA9IGFzeW5jIChkYXRhLCBwYXJhbXMpPT5wYXJzZS5wYXJzZUFzeW5jKGluc3QsIGRhdGEsIHBhcmFtcywge1xuICAgICAgICAgICAgY2FsbGVlOiBpbnN0LnBhcnNlQXN5bmNcbiAgICAgICAgfSk7XG4gICAgaW5zdC5zYWZlUGFyc2VBc3luYyA9IGFzeW5jIChkYXRhLCBwYXJhbXMpPT5wYXJzZS5zYWZlUGFyc2VBc3luYyhpbnN0LCBkYXRhLCBwYXJhbXMpO1xuICAgIGluc3Quc3BhID0gaW5zdC5zYWZlUGFyc2VBc3luYztcbiAgICAvLyBlbmNvZGluZy9kZWNvZGluZ1xuICAgIGluc3QuZW5jb2RlID0gKGRhdGEsIHBhcmFtcyk9PnBhcnNlLmVuY29kZShpbnN0LCBkYXRhLCBwYXJhbXMpO1xuICAgIGluc3QuZGVjb2RlID0gKGRhdGEsIHBhcmFtcyk9PnBhcnNlLmRlY29kZShpbnN0LCBkYXRhLCBwYXJhbXMpO1xuICAgIGluc3QuZW5jb2RlQXN5bmMgPSBhc3luYyAoZGF0YSwgcGFyYW1zKT0+cGFyc2UuZW5jb2RlQXN5bmMoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LmRlY29kZUFzeW5jID0gYXN5bmMgKGRhdGEsIHBhcmFtcyk9PnBhcnNlLmRlY29kZUFzeW5jKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5zYWZlRW5jb2RlID0gKGRhdGEsIHBhcmFtcyk9PnBhcnNlLnNhZmVFbmNvZGUoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LnNhZmVEZWNvZGUgPSAoZGF0YSwgcGFyYW1zKT0+cGFyc2Uuc2FmZURlY29kZShpbnN0LCBkYXRhLCBwYXJhbXMpO1xuICAgIGluc3Quc2FmZUVuY29kZUFzeW5jID0gYXN5bmMgKGRhdGEsIHBhcmFtcyk9PnBhcnNlLnNhZmVFbmNvZGVBc3luYyhpbnN0LCBkYXRhLCBwYXJhbXMpO1xuICAgIGluc3Quc2FmZURlY29kZUFzeW5jID0gYXN5bmMgKGRhdGEsIHBhcmFtcyk9PnBhcnNlLnNhZmVEZWNvZGVBc3luYyhpbnN0LCBkYXRhLCBwYXJhbXMpO1xuICAgIC8vIHJlZmluZW1lbnRzXG4gICAgaW5zdC5yZWZpbmUgPSAoY2hlY2ssIHBhcmFtcyk9Pmluc3QuY2hlY2socmVmaW5lKGNoZWNrLCBwYXJhbXMpKTtcbiAgICBpbnN0LnN1cGVyUmVmaW5lID0gKHJlZmluZW1lbnQpPT5pbnN0LmNoZWNrKHN1cGVyUmVmaW5lKHJlZmluZW1lbnQpKTtcbiAgICBpbnN0Lm92ZXJ3cml0ZSA9IChmbik9Pmluc3QuY2hlY2soY2hlY2tzLm92ZXJ3cml0ZShmbikpO1xuICAgIC8vIHdyYXBwZXJzXG4gICAgaW5zdC5vcHRpb25hbCA9ICgpPT5vcHRpb25hbChpbnN0KTtcbiAgICBpbnN0Lm51bGxhYmxlID0gKCk9Pm51bGxhYmxlKGluc3QpO1xuICAgIGluc3QubnVsbGlzaCA9ICgpPT5vcHRpb25hbChudWxsYWJsZShpbnN0KSk7XG4gICAgaW5zdC5ub25vcHRpb25hbCA9IChwYXJhbXMpPT5ub25vcHRpb25hbChpbnN0LCBwYXJhbXMpO1xuICAgIGluc3QuYXJyYXkgPSAoKT0+YXJyYXkoaW5zdCk7XG4gICAgaW5zdC5vciA9IChhcmcpPT51bmlvbihbXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgYXJnXG4gICAgICAgIF0pO1xuICAgIGluc3QuYW5kID0gKGFyZyk9PmludGVyc2VjdGlvbihpbnN0LCBhcmcpO1xuICAgIGluc3QudHJhbnNmb3JtID0gKHR4KT0+cGlwZShpbnN0LCB0cmFuc2Zvcm0odHgpKTtcbiAgICBpbnN0LmRlZmF1bHQgPSAoZGVmKT0+X2RlZmF1bHQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnByZWZhdWx0ID0gKGRlZik9PnByZWZhdWx0KGluc3QsIGRlZik7XG4gICAgLy8gaW5zdC5jb2FsZXNjZSA9IChkZWYsIHBhcmFtcykgPT4gY29hbGVzY2UoaW5zdCwgZGVmLCBwYXJhbXMpO1xuICAgIGluc3QuY2F0Y2ggPSAocGFyYW1zKT0+X2NhdGNoKGluc3QsIHBhcmFtcyk7XG4gICAgaW5zdC5waXBlID0gKHRhcmdldCk9PnBpcGUoaW5zdCwgdGFyZ2V0KTtcbiAgICBpbnN0LnJlYWRvbmx5ID0gKCk9PnJlYWRvbmx5KGluc3QpO1xuICAgIC8vIG1ldGFcbiAgICBpbnN0LmRlc2NyaWJlID0gKGRlc2NyaXB0aW9uKT0+e1xuICAgICAgICBjb25zdCBjbCA9IGluc3QuY2xvbmUoKTtcbiAgICAgICAgY29yZS5nbG9iYWxSZWdpc3RyeS5hZGQoY2wsIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2w7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdCwgXCJkZXNjcmlwdGlvblwiLCB7XG4gICAgICAgIGdldCAoKSB7XG4gICAgICAgICAgICByZXR1cm4gY29yZS5nbG9iYWxSZWdpc3RyeS5nZXQoaW5zdCk/LmRlc2NyaXB0aW9uO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBpbnN0Lm1ldGEgPSAoLi4uYXJncyk9PntcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29yZS5nbG9iYWxSZWdpc3RyeS5nZXQoaW5zdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2wgPSBpbnN0LmNsb25lKCk7XG4gICAgICAgIGNvcmUuZ2xvYmFsUmVnaXN0cnkuYWRkKGNsLCBhcmdzWzBdKTtcbiAgICAgICAgcmV0dXJuIGNsO1xuICAgIH07XG4gICAgLy8gaGVscGVyc1xuICAgIGluc3QuaXNPcHRpb25hbCA9ICgpPT5pbnN0LnNhZmVQYXJzZSh1bmRlZmluZWQpLnN1Y2Nlc3M7XG4gICAgaW5zdC5pc051bGxhYmxlID0gKCk9Pmluc3Quc2FmZVBhcnNlKG51bGwpLnN1Y2Nlc3M7XG4gICAgcmV0dXJuIGluc3Q7XG59KTtcbi8qKiBAaW50ZXJuYWwgKi8gZXhwb3J0IGNvbnN0IF9ab2RTdHJpbmcgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiX1pvZFN0cmluZ1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFN0cmluZy5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICBpbnN0LmZvcm1hdCA9IGJhZy5mb3JtYXQgPz8gbnVsbDtcbiAgICBpbnN0Lm1pbkxlbmd0aCA9IGJhZy5taW5pbXVtID8/IG51bGw7XG4gICAgaW5zdC5tYXhMZW5ndGggPSBiYWcubWF4aW11bSA/PyBudWxsO1xuICAgIC8vIHZhbGlkYXRpb25zXG4gICAgaW5zdC5yZWdleCA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MucmVnZXgoLi4uYXJncykpO1xuICAgIGluc3QuaW5jbHVkZXMgPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLmluY2x1ZGVzKC4uLmFyZ3MpKTtcbiAgICBpbnN0LnN0YXJ0c1dpdGggPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLnN0YXJ0c1dpdGgoLi4uYXJncykpO1xuICAgIGluc3QuZW5kc1dpdGggPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLmVuZHNXaXRoKC4uLmFyZ3MpKTtcbiAgICBpbnN0Lm1pbiA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MubWluTGVuZ3RoKC4uLmFyZ3MpKTtcbiAgICBpbnN0Lm1heCA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MubWF4TGVuZ3RoKC4uLmFyZ3MpKTtcbiAgICBpbnN0Lmxlbmd0aCA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MubGVuZ3RoKC4uLmFyZ3MpKTtcbiAgICBpbnN0Lm5vbmVtcHR5ID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5taW5MZW5ndGgoMSwgLi4uYXJncykpO1xuICAgIGluc3QubG93ZXJjYXNlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmxvd2VyY2FzZShwYXJhbXMpKTtcbiAgICBpbnN0LnVwcGVyY2FzZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy51cHBlcmNhc2UocGFyYW1zKSk7XG4gICAgLy8gdHJhbnNmb3Jtc1xuICAgIGluc3QudHJpbSA9ICgpPT5pbnN0LmNoZWNrKGNoZWNrcy50cmltKCkpO1xuICAgIGluc3Qubm9ybWFsaXplID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5ub3JtYWxpemUoLi4uYXJncykpO1xuICAgIGluc3QudG9Mb3dlckNhc2UgPSAoKT0+aW5zdC5jaGVjayhjaGVja3MudG9Mb3dlckNhc2UoKSk7XG4gICAgaW5zdC50b1VwcGVyQ2FzZSA9ICgpPT5pbnN0LmNoZWNrKGNoZWNrcy50b1VwcGVyQ2FzZSgpKTtcbn0pO1xuZXhwb3J0IGNvbnN0IFpvZFN0cmluZyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RTdHJpbmdcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RTdHJpbmcuaW5pdChpbnN0LCBkZWYpO1xuICAgIF9ab2RTdHJpbmcuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuZW1haWwgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9lbWFpbChab2RFbWFpbCwgcGFyYW1zKSk7XG4gICAgaW5zdC51cmwgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl91cmwoWm9kVVJMLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmp3dCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2p3dChab2RKV1QsIHBhcmFtcykpO1xuICAgIGluc3QuZW1vamkgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9lbW9qaShab2RFbW9qaSwgcGFyYW1zKSk7XG4gICAgaW5zdC5ndWlkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fZ3VpZChab2RHVUlELCBwYXJhbXMpKTtcbiAgICBpbnN0LnV1aWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl91dWlkKFpvZFVVSUQsIHBhcmFtcykpO1xuICAgIGluc3QudXVpZHY0ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fdXVpZHY0KFpvZFVVSUQsIHBhcmFtcykpO1xuICAgIGluc3QudXVpZHY2ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fdXVpZHY2KFpvZFVVSUQsIHBhcmFtcykpO1xuICAgIGluc3QudXVpZHY3ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fdXVpZHY3KFpvZFVVSUQsIHBhcmFtcykpO1xuICAgIGluc3QubmFub2lkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fbmFub2lkKFpvZE5hbm9JRCwgcGFyYW1zKSk7XG4gICAgaW5zdC5ndWlkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fZ3VpZChab2RHVUlELCBwYXJhbXMpKTtcbiAgICBpbnN0LmN1aWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9jdWlkKFpvZENVSUQsIHBhcmFtcykpO1xuICAgIGluc3QuY3VpZDIgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9jdWlkMihab2RDVUlEMiwgcGFyYW1zKSk7XG4gICAgaW5zdC51bGlkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fdWxpZChab2RVTElELCBwYXJhbXMpKTtcbiAgICBpbnN0LmJhc2U2NCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2Jhc2U2NChab2RCYXNlNjQsIHBhcmFtcykpO1xuICAgIGluc3QuYmFzZTY0dXJsID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fYmFzZTY0dXJsKFpvZEJhc2U2NFVSTCwgcGFyYW1zKSk7XG4gICAgaW5zdC54aWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl94aWQoWm9kWElELCBwYXJhbXMpKTtcbiAgICBpbnN0LmtzdWlkID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fa3N1aWQoWm9kS1NVSUQsIHBhcmFtcykpO1xuICAgIGluc3QuaXB2NCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2lwdjQoWm9kSVB2NCwgcGFyYW1zKSk7XG4gICAgaW5zdC5pcHY2ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5faXB2Nihab2RJUHY2LCBwYXJhbXMpKTtcbiAgICBpbnN0LmNpZHJ2NCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2NpZHJ2NChab2RDSURSdjQsIHBhcmFtcykpO1xuICAgIGluc3QuY2lkcnY2ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fY2lkcnY2KFpvZENJRFJ2NiwgcGFyYW1zKSk7XG4gICAgaW5zdC5lMTY0ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fZTE2NChab2RFMTY0LCBwYXJhbXMpKTtcbiAgICAvLyBpc29cbiAgICBpbnN0LmRhdGV0aW1lID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soaXNvLmRhdGV0aW1lKHBhcmFtcykpO1xuICAgIGluc3QuZGF0ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGlzby5kYXRlKHBhcmFtcykpO1xuICAgIGluc3QudGltZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGlzby50aW1lKHBhcmFtcykpO1xuICAgIGluc3QuZHVyYXRpb24gPSAocGFyYW1zKT0+aW5zdC5jaGVjayhpc28uZHVyYXRpb24ocGFyYW1zKSk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmcocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3N0cmluZyhab2RTdHJpbmcsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kU3RyaW5nRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFN0cmluZ0Zvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgX1pvZFN0cmluZy5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCBab2RFbWFpbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RFbWFpbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kRW1haWwuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBlbWFpbChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fZW1haWwoWm9kRW1haWwsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kR1VJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RHVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RHVUlELmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZ3VpZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fZ3VpZChab2RHVUlELCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVVSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVVVJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kVVVJRC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHV1aWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3V1aWQoWm9kVVVJRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1dWlkdjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3V1aWR2NChab2RVVUlELCBwYXJhbXMpO1xufVxuLy8gWm9kVVVJRHY2XG5leHBvcnQgZnVuY3Rpb24gdXVpZHY2KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl91dWlkdjYoWm9kVVVJRCwgcGFyYW1zKTtcbn1cbi8vIFpvZFVVSUR2N1xuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NyhwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdXVpZHY3KFpvZFVVSUQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kVVJMID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFVSTFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kVVJMLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdXJsKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl91cmwoWm9kVVJMLCBwYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGh0dHBVcmwocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3VybChab2RVUkwsIHtcbiAgICAgICAgcHJvdG9jb2w6IC9eaHR0cHM/JC8sXG4gICAgICAgIGhvc3RuYW1lOiBjb3JlLnJlZ2V4ZXMuZG9tYWluLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kRW1vamkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRW1vamlcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEVtb2ppLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZW1vamkocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2Vtb2ppKFpvZEVtb2ppLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZE5hbm9JRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROYW5vSURcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZE5hbm9JRC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG5hbm9pZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fbmFub2lkKFpvZE5hbm9JRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RDVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZENVSURcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZENVSUQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBjdWlkKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9jdWlkKFpvZENVSUQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQ1VJRDIgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQ1VJRDJcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZENVSUQyLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gY3VpZDIocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2N1aWQyKFpvZENVSUQyLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVMSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVUxJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kVUxJRC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHVsaWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3VsaWQoWm9kVUxJRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RYSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kWElEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RYSUQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB4aWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3hpZChab2RYSUQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kS1NVSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kS1NVSURcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEtTVUlELmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24ga3N1aWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2tzdWlkKFpvZEtTVUlELCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZElQdjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVB2NFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kSVB2NC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGlwdjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lwdjQoWm9kSVB2NCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RJUHY2ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZElQdjZcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZElQdjYuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBpcHY2KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9pcHY2KFpvZElQdjYsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQ0lEUnY0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZENJRFJ2NFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZENJRFJ2NC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGNpZHJ2NChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fY2lkcnY0KFpvZENJRFJ2NCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RDSURSdjYgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQ0lEUnY2XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQ0lEUnY2LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gY2lkcnY2KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9jaWRydjYoWm9kQ0lEUnY2LCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEJhc2U2NCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RCYXNlNjRcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEJhc2U2NC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fYmFzZTY0KFpvZEJhc2U2NCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RCYXNlNjRVUkwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQmFzZTY0VVJMXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RCYXNlNjRVUkwuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjR1cmwocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2Jhc2U2NHVybChab2RCYXNlNjRVUkwsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kRTE2NCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RFMTY0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RFMTY0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZTE2NChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fZTE2NChab2RFMTY0LCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEpXVCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RKV1RcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEpXVC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGp3dChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fand0KFpvZEpXVCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RDdXN0b21TdHJpbmdGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQ3VzdG9tU3RyaW5nRm9ybWF0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RDdXN0b21TdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdGb3JtYXQoZm9ybWF0LCBmbk9yUmVnZXgsIF9wYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiBjb3JlLl9zdHJpbmdGb3JtYXQoWm9kQ3VzdG9tU3RyaW5nRm9ybWF0LCBmb3JtYXQsIGZuT3JSZWdleCwgX3BhcmFtcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaG9zdG5hbWUoX3BhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9zdHJpbmdGb3JtYXQoWm9kQ3VzdG9tU3RyaW5nRm9ybWF0LCBcImhvc3RuYW1lXCIsIGNvcmUucmVnZXhlcy5ob3N0bmFtZSwgX3BhcmFtcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGV4KF9wYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fc3RyaW5nRm9ybWF0KFpvZEN1c3RvbVN0cmluZ0Zvcm1hdCwgXCJoZXhcIiwgY29yZS5yZWdleGVzLmhleCwgX3BhcmFtcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzaChhbGcsIHBhcmFtcykge1xuICAgIGNvbnN0IGVuYyA9IHBhcmFtcz8uZW5jID8/IFwiaGV4XCI7XG4gICAgY29uc3QgZm9ybWF0ID0gYCR7YWxnfV8ke2VuY31gO1xuICAgIGNvbnN0IHJlZ2V4ID0gY29yZS5yZWdleGVzW2Zvcm1hdF07XG4gICAgaWYgKCFyZWdleCkgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgaGFzaCBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xuICAgIHJldHVybiBjb3JlLl9zdHJpbmdGb3JtYXQoWm9kQ3VzdG9tU3RyaW5nRm9ybWF0LCBmb3JtYXQsIHJlZ2V4LCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZE51bWJlciA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROdW1iZXJcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2ROdW1iZXIuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuZ3QgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0KHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmd0ZSA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1pbiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmx0ID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdCh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5sdGUgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5tYXggPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5pbnQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhpbnQocGFyYW1zKSk7XG4gICAgaW5zdC5zYWZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soaW50KHBhcmFtcykpO1xuICAgIGluc3QucG9zaXRpdmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3QoMCwgcGFyYW1zKSk7XG4gICAgaW5zdC5ub25uZWdhdGl2ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndGUoMCwgcGFyYW1zKSk7XG4gICAgaW5zdC5uZWdhdGl2ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdCgwLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5vbnBvc2l0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0ZSgwLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm11bHRpcGxlT2YgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLm11bHRpcGxlT2YodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3Quc3RlcCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubXVsdGlwbGVPZih2YWx1ZSwgcGFyYW1zKSk7XG4gICAgLy8gaW5zdC5maW5pdGUgPSAocGFyYW1zKSA9PiBpbnN0LmNoZWNrKGNvcmUuZmluaXRlKHBhcmFtcykpO1xuICAgIGluc3QuZmluaXRlID0gKCk9Pmluc3Q7XG4gICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICBpbnN0Lm1pblZhbHVlID0gTWF0aC5tYXgoYmFnLm1pbmltdW0gPz8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLCBiYWcuZXhjbHVzaXZlTWluaW11bSA/PyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpID8/IG51bGw7XG4gICAgaW5zdC5tYXhWYWx1ZSA9IE1hdGgubWluKGJhZy5tYXhpbXVtID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgYmFnLmV4Y2x1c2l2ZU1heGltdW0gPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSA/PyBudWxsO1xuICAgIGluc3QuaXNJbnQgPSAoYmFnLmZvcm1hdCA/PyBcIlwiKS5pbmNsdWRlcyhcImludFwiKSB8fCBOdW1iZXIuaXNTYWZlSW50ZWdlcihiYWcubXVsdGlwbGVPZiA/PyAwLjUpO1xuICAgIGluc3QuaXNGaW5pdGUgPSB0cnVlO1xuICAgIGluc3QuZm9ybWF0ID0gYmFnLmZvcm1hdCA/PyBudWxsO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9udW1iZXIoWm9kTnVtYmVyLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZE51bWJlckZvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROdW1iZXJGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2ROdW1iZXJGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZE51bWJlci5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBpbnQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2ludChab2ROdW1iZXJGb3JtYXQsIHBhcmFtcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZmxvYXQzMihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fZmxvYXQzMihab2ROdW1iZXJGb3JtYXQsIHBhcmFtcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZmxvYXQ2NChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fZmxvYXQ2NChab2ROdW1iZXJGb3JtYXQsIHBhcmFtcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW50MzIocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2ludDMyKFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1aW50MzIocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3VpbnQzMihab2ROdW1iZXJGb3JtYXQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQm9vbGVhbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RCb29sZWFuXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQm9vbGVhbi5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBib29sZWFuKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9ib29sZWFuKFpvZEJvb2xlYW4sIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQmlnSW50ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEJpZ0ludFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZEJpZ0ludC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5ndGUgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5taW4gPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5ndCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3QodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QuZ3RlID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubWluID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubHQgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0KHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmx0ZSA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1heCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0LnBvc2l0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0KEJpZ0ludCgwKSwgcGFyYW1zKSk7XG4gICAgaW5zdC5uZWdhdGl2ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdChCaWdJbnQoMCksIHBhcmFtcykpO1xuICAgIGluc3Qubm9ucG9zaXRpdmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKEJpZ0ludCgwKSwgcGFyYW1zKSk7XG4gICAgaW5zdC5ub25uZWdhdGl2ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndGUoQmlnSW50KDApLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm11bHRpcGxlT2YgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLm11bHRpcGxlT2YodmFsdWUsIHBhcmFtcykpO1xuICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgaW5zdC5taW5WYWx1ZSA9IGJhZy5taW5pbXVtID8/IG51bGw7XG4gICAgaW5zdC5tYXhWYWx1ZSA9IGJhZy5tYXhpbXVtID8/IG51bGw7XG4gICAgaW5zdC5mb3JtYXQgPSBiYWcuZm9ybWF0ID8/IG51bGw7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBiaWdpbnQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2JpZ2ludChab2RCaWdJbnQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQmlnSW50Rm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEJpZ0ludEZvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZEJpZ0ludEZvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kQmlnSW50LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuLy8gaW50NjRcbmV4cG9ydCBmdW5jdGlvbiBpbnQ2NChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faW50NjQoWm9kQmlnSW50Rm9ybWF0LCBwYXJhbXMpO1xufVxuLy8gdWludDY0XG5leHBvcnQgZnVuY3Rpb24gdWludDY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl91aW50NjQoWm9kQmlnSW50Rm9ybWF0LCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFN5bWJvbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RTeW1ib2xcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RTeW1ib2wuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gc3ltYm9sKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9zeW1ib2woWm9kU3ltYm9sLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVuZGVmaW5lZCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RVbmRlZmluZWRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RVbmRlZmluZWQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5mdW5jdGlvbiBfdW5kZWZpbmVkKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl91bmRlZmluZWQoWm9kVW5kZWZpbmVkLCBwYXJhbXMpO1xufVxuZXhwb3J0IHsgX3VuZGVmaW5lZCBhcyB1bmRlZmluZWQgfTtcbmV4cG9ydCBjb25zdCBab2ROdWxsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE51bGxcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2ROdWxsLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZnVuY3Rpb24gX251bGwocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX251bGwoWm9kTnVsbCwgcGFyYW1zKTtcbn1cbmV4cG9ydCB7IF9udWxsIGFzIG51bGwgfTtcbmV4cG9ydCBjb25zdCBab2RBbnkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQW55XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQW55LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGFueSgpIHtcbiAgICByZXR1cm4gY29yZS5fYW55KFpvZEFueSk7XG59XG5leHBvcnQgY29uc3QgWm9kVW5rbm93biA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RVbmtub3duXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kVW5rbm93bi5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB1bmtub3duKCkge1xuICAgIHJldHVybiBjb3JlLl91bmtub3duKFpvZFVua25vd24pO1xufVxuZXhwb3J0IGNvbnN0IFpvZE5ldmVyID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE5ldmVyXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTmV2ZXIuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbmV2ZXIocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX25ldmVyKFpvZE5ldmVyLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFZvaWQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVm9pZFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFZvaWQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5mdW5jdGlvbiBfdm9pZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdm9pZChab2RWb2lkLCBwYXJhbXMpO1xufVxuZXhwb3J0IHsgX3ZvaWQgYXMgdm9pZCB9O1xuZXhwb3J0IGNvbnN0IFpvZERhdGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRGF0ZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZERhdGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QubWluID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubWF4ID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGNvbnN0IGMgPSBpbnN0Ll96b2QuYmFnO1xuICAgIGluc3QubWluRGF0ZSA9IGMubWluaW11bSA/IG5ldyBEYXRlKGMubWluaW11bSkgOiBudWxsO1xuICAgIGluc3QubWF4RGF0ZSA9IGMubWF4aW11bSA/IG5ldyBEYXRlKGMubWF4aW11bSkgOiBudWxsO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZGF0ZShwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fZGF0ZShab2REYXRlLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEFycmF5ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEFycmF5XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQXJyYXkuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuZWxlbWVudCA9IGRlZi5lbGVtZW50O1xuICAgIGluc3QubWluID0gKG1pbkxlbmd0aCwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubWluTGVuZ3RoKG1pbkxlbmd0aCwgcGFyYW1zKSk7XG4gICAgaW5zdC5ub25lbXB0eSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5taW5MZW5ndGgoMSwgcGFyYW1zKSk7XG4gICAgaW5zdC5tYXggPSAobWF4TGVuZ3RoLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5tYXhMZW5ndGgobWF4TGVuZ3RoLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmxlbmd0aCA9IChsZW4sIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmxlbmd0aChsZW4sIHBhcmFtcykpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuZWxlbWVudDtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5KGVsZW1lbnQsIHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9hcnJheShab2RBcnJheSwgZWxlbWVudCwgcGFyYW1zKTtcbn1cbi8vIC5rZXlvZlxuZXhwb3J0IGZ1bmN0aW9uIGtleW9mKHNjaGVtYSkge1xuICAgIGNvbnN0IHNoYXBlID0gc2NoZW1hLl96b2QuZGVmLnNoYXBlO1xuICAgIHJldHVybiBfZW51bShPYmplY3Qua2V5cyhzaGFwZSkpO1xufVxuZXhwb3J0IGNvbnN0IFpvZE9iamVjdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RPYmplY3RcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RPYmplY3RKSVQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0LCBcInNoYXBlXCIsICgpPT57XG4gICAgICAgIHJldHVybiBkZWYuc2hhcGU7XG4gICAgfSk7XG4gICAgaW5zdC5rZXlvZiA9ICgpPT5fZW51bShPYmplY3Qua2V5cyhpbnN0Ll96b2QuZGVmLnNoYXBlKSk7XG4gICAgaW5zdC5jYXRjaGFsbCA9IChjYXRjaGFsbCk9Pmluc3QuY2xvbmUoe1xuICAgICAgICAgICAgLi4uaW5zdC5fem9kLmRlZixcbiAgICAgICAgICAgIGNhdGNoYWxsOiBjYXRjaGFsbFxuICAgICAgICB9KTtcbiAgICBpbnN0LnBhc3N0aHJvdWdoID0gKCk9Pmluc3QuY2xvbmUoe1xuICAgICAgICAgICAgLi4uaW5zdC5fem9kLmRlZixcbiAgICAgICAgICAgIGNhdGNoYWxsOiB1bmtub3duKClcbiAgICAgICAgfSk7XG4gICAgaW5zdC5sb29zZSA9ICgpPT5pbnN0LmNsb25lKHtcbiAgICAgICAgICAgIC4uLmluc3QuX3pvZC5kZWYsXG4gICAgICAgICAgICBjYXRjaGFsbDogdW5rbm93bigpXG4gICAgICAgIH0pO1xuICAgIGluc3Quc3RyaWN0ID0gKCk9Pmluc3QuY2xvbmUoe1xuICAgICAgICAgICAgLi4uaW5zdC5fem9kLmRlZixcbiAgICAgICAgICAgIGNhdGNoYWxsOiBuZXZlcigpXG4gICAgICAgIH0pO1xuICAgIGluc3Quc3RyaXAgPSAoKT0+aW5zdC5jbG9uZSh7XG4gICAgICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICBpbnN0LmV4dGVuZCA9IChpbmNvbWluZyk9PntcbiAgICAgICAgcmV0dXJuIHV0aWwuZXh0ZW5kKGluc3QsIGluY29taW5nKTtcbiAgICB9O1xuICAgIGluc3Quc2FmZUV4dGVuZCA9IChpbmNvbWluZyk9PntcbiAgICAgICAgcmV0dXJuIHV0aWwuc2FmZUV4dGVuZChpbnN0LCBpbmNvbWluZyk7XG4gICAgfTtcbiAgICBpbnN0Lm1lcmdlID0gKG90aGVyKT0+dXRpbC5tZXJnZShpbnN0LCBvdGhlcik7XG4gICAgaW5zdC5waWNrID0gKG1hc2spPT51dGlsLnBpY2soaW5zdCwgbWFzayk7XG4gICAgaW5zdC5vbWl0ID0gKG1hc2spPT51dGlsLm9taXQoaW5zdCwgbWFzayk7XG4gICAgaW5zdC5wYXJ0aWFsID0gKC4uLmFyZ3MpPT51dGlsLnBhcnRpYWwoWm9kT3B0aW9uYWwsIGluc3QsIGFyZ3NbMF0pO1xuICAgIGluc3QucmVxdWlyZWQgPSAoLi4uYXJncyk9PnV0aWwucmVxdWlyZWQoWm9kTm9uT3B0aW9uYWwsIGluc3QsIGFyZ3NbMF0pO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0KHNoYXBlLCBwYXJhbXMpIHtcbiAgICBjb25zdCBkZWYgPSB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHNoYXBlOiBzaGFwZSA/PyB7fSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3QoZGVmKTtcbn1cbi8vIHN0cmljdE9iamVjdFxuZXhwb3J0IGZ1bmN0aW9uIHN0cmljdE9iamVjdChzaGFwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBzaGFwZSxcbiAgICAgICAgY2F0Y2hhbGw6IG5ldmVyKCksXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIGxvb3NlT2JqZWN0XG5leHBvcnQgZnVuY3Rpb24gbG9vc2VPYmplY3Qoc2hhcGUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgc2hhcGUsXG4gICAgICAgIGNhdGNoYWxsOiB1bmtub3duKCksXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RVbmlvbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RVbmlvblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFVuaW9uLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Lm9wdGlvbnMgPSBkZWYub3B0aW9ucztcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uKG9wdGlvbnMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kVW5pb24oe1xuICAgICAgICB0eXBlOiBcInVuaW9uXCIsXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2REaXNjcmltaW5hdGVkVW5pb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRGlzY3JpbWluYXRlZFVuaW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgWm9kVW5pb24uaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZERpc2NyaW1pbmF0ZWRVbmlvbi5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBkaXNjcmltaW5hdGVkVW5pb24oZGlzY3JpbWluYXRvciwgb3B0aW9ucywgcGFyYW1zKSB7XG4gICAgLy8gY29uc3QgW29wdGlvbnMsIHBhcmFtc10gPSBhcmdzO1xuICAgIHJldHVybiBuZXcgWm9kRGlzY3JpbWluYXRlZFVuaW9uKHtcbiAgICAgICAgdHlwZTogXCJ1bmlvblwiLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBkaXNjcmltaW5hdG9yLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kSW50ZXJzZWN0aW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEludGVyc2VjdGlvblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZEludGVyc2VjdGlvbi5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnNlY3Rpb24obGVmdCwgcmlnaHQpIHtcbiAgICByZXR1cm4gbmV3IFpvZEludGVyc2VjdGlvbih7XG4gICAgICAgIHR5cGU6IFwiaW50ZXJzZWN0aW9uXCIsXG4gICAgICAgIGxlZnQ6IGxlZnQsXG4gICAgICAgIHJpZ2h0OiByaWdodFxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFR1cGxlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFR1cGxlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kVHVwbGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QucmVzdCA9IChyZXN0KT0+aW5zdC5jbG9uZSh7XG4gICAgICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLFxuICAgICAgICAgICAgcmVzdDogcmVzdFxuICAgICAgICB9KTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHR1cGxlKGl0ZW1zLCBfcGFyYW1zT3JSZXN0LCBfcGFyYW1zKSB7XG4gICAgY29uc3QgaGFzUmVzdCA9IF9wYXJhbXNPclJlc3QgaW5zdGFuY2VvZiBjb3JlLiRab2RUeXBlO1xuICAgIGNvbnN0IHBhcmFtcyA9IGhhc1Jlc3QgPyBfcGFyYW1zIDogX3BhcmFtc09yUmVzdDtcbiAgICBjb25zdCByZXN0ID0gaGFzUmVzdCA/IF9wYXJhbXNPclJlc3QgOiBudWxsO1xuICAgIHJldHVybiBuZXcgWm9kVHVwbGUoe1xuICAgICAgICB0eXBlOiBcInR1cGxlXCIsXG4gICAgICAgIGl0ZW1zOiBpdGVtcyxcbiAgICAgICAgcmVzdCxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFJlY29yZCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RSZWNvcmRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RSZWNvcmQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3Qua2V5VHlwZSA9IGRlZi5rZXlUeXBlO1xuICAgIGluc3QudmFsdWVUeXBlID0gZGVmLnZhbHVlVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZChrZXlUeXBlLCB2YWx1ZVR5cGUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kUmVjb3JkKHtcbiAgICAgICAgdHlwZTogXCJyZWNvcmRcIixcbiAgICAgICAga2V5VHlwZSxcbiAgICAgICAgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbi8vIHR5cGUgYWxrc2pmID0gY29yZS5vdXRwdXQ8Y29yZS4kWm9kUmVjb3JkS2V5PjtcbmV4cG9ydCBmdW5jdGlvbiBwYXJ0aWFsUmVjb3JkKGtleVR5cGUsIHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgY29uc3QgayA9IGNvcmUuY2xvbmUoa2V5VHlwZSk7XG4gICAgay5fem9kLnZhbHVlcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbmV3IFpvZFJlY29yZCh7XG4gICAgICAgIHR5cGU6IFwicmVjb3JkXCIsXG4gICAgICAgIGtleVR5cGU6IGssXG4gICAgICAgIHZhbHVlVHlwZTogdmFsdWVUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kTWFwID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE1hcFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE1hcC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5rZXlUeXBlID0gZGVmLmtleVR5cGU7XG4gICAgaW5zdC52YWx1ZVR5cGUgPSBkZWYudmFsdWVUeXBlO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbWFwKGtleVR5cGUsIHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RNYXAoe1xuICAgICAgICB0eXBlOiBcIm1hcFwiLFxuICAgICAgICBrZXlUeXBlOiBrZXlUeXBlLFxuICAgICAgICB2YWx1ZVR5cGU6IHZhbHVlVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFNldCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RTZXRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RTZXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QubWluID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNvcmUuX21pblNpemUoLi4uYXJncykpO1xuICAgIGluc3Qubm9uZW1wdHkgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9taW5TaXplKDEsIHBhcmFtcykpO1xuICAgIGluc3QubWF4ID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNvcmUuX21heFNpemUoLi4uYXJncykpO1xuICAgIGluc3Quc2l6ZSA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjb3JlLl9zaXplKC4uLmFyZ3MpKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHNldCh2YWx1ZVR5cGUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kU2V0KHtcbiAgICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgICAgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RFbnVtID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEVudW1cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RFbnVtLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LmVudW0gPSBkZWYuZW50cmllcztcbiAgICBpbnN0Lm9wdGlvbnMgPSBPYmplY3QudmFsdWVzKGRlZi5lbnRyaWVzKTtcbiAgICBjb25zdCBrZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhkZWYuZW50cmllcykpO1xuICAgIGluc3QuZXh0cmFjdCA9ICh2YWx1ZXMsIHBhcmFtcyk9PntcbiAgICAgICAgY29uc3QgbmV3RW50cmllcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyl7XG4gICAgICAgICAgICBpZiAoa2V5cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgbmV3RW50cmllc1t2YWx1ZV0gPSBkZWYuZW50cmllc1t2YWx1ZV07XG4gICAgICAgICAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKGBLZXkgJHt2YWx1ZX0gbm90IGZvdW5kIGluIGVudW1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFpvZEVudW0oe1xuICAgICAgICAgICAgLi4uZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgICAgICBlbnRyaWVzOiBuZXdFbnRyaWVzXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgaW5zdC5leGNsdWRlID0gKHZhbHVlcywgcGFyYW1zKT0+e1xuICAgICAgICBjb25zdCBuZXdFbnRyaWVzID0ge1xuICAgICAgICAgICAgLi4uZGVmLmVudHJpZXNcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpe1xuICAgICAgICAgICAgaWYgKGtleXMuaGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdFbnRyaWVzW3ZhbHVlXTtcbiAgICAgICAgICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoYEtleSAke3ZhbHVlfSBub3QgZm91bmQgaW4gZW51bWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kRW51bSh7XG4gICAgICAgICAgICAuLi5kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgICAgIGVudHJpZXM6IG5ld0VudHJpZXNcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gX2VudW0odmFsdWVzLCBwYXJhbXMpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpID8gT2JqZWN0LmZyb21FbnRyaWVzKHZhbHVlcy5tYXAoKHYpPT5bXG4gICAgICAgICAgICB2LFxuICAgICAgICAgICAgdlxuICAgICAgICBdKSkgOiB2YWx1ZXM7XG4gICAgcmV0dXJuIG5ldyBab2RFbnVtKHtcbiAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgIGVudHJpZXMsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCB7IF9lbnVtIGFzIGVudW0gfTtcbi8qKiBAZGVwcmVjYXRlZCBUaGlzIEFQSSBoYXMgYmVlbiBtZXJnZWQgaW50byBgei5lbnVtKClgLiBVc2UgYHouZW51bSgpYCBpbnN0ZWFkLlxuICpcbiAqIGBgYHRzXG4gKiBlbnVtIENvbG9ycyB7IHJlZCwgZ3JlZW4sIGJsdWUgfVxuICogei5lbnVtKENvbG9ycyk7XG4gKiBgYGBcbiAqLyBleHBvcnQgZnVuY3Rpb24gbmF0aXZlRW51bShlbnRyaWVzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZEVudW0oe1xuICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgZW50cmllcyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZExpdGVyYWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTGl0ZXJhbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZExpdGVyYWwuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QudmFsdWVzID0gbmV3IFNldChkZWYudmFsdWVzKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdCwgXCJ2YWx1ZVwiLCB7XG4gICAgICAgIGdldCAoKSB7XG4gICAgICAgICAgICBpZiAoZGVmLnZhbHVlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBzY2hlbWEgY29udGFpbnMgbXVsdGlwbGUgdmFsaWQgbGl0ZXJhbCB2YWx1ZXMuIFVzZSBgLnZhbHVlc2AgaW5zdGVhZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVmLnZhbHVlc1swXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbGl0ZXJhbCh2YWx1ZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RMaXRlcmFsKHtcbiAgICAgICAgdHlwZTogXCJsaXRlcmFsXCIsXG4gICAgICAgIHZhbHVlczogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgIF0sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RGaWxlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEZpbGVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RGaWxlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Lm1pbiA9IChzaXplLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX21pblNpemUoc2l6ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5tYXggPSAoc2l6ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9tYXhTaXplKHNpemUsIHBhcmFtcykpO1xuICAgIGluc3QubWltZSA9ICh0eXBlcywgcGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9taW1lKEFycmF5LmlzQXJyYXkodHlwZXMpID8gdHlwZXMgOiBbXG4gICAgICAgICAgICB0eXBlc1xuICAgICAgICBdLCBwYXJhbXMpKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGUocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2ZpbGUoWm9kRmlsZSwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RUcmFuc2Zvcm0gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVHJhbnNmb3JtXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kVHJhbnNmb3JtLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKF9jdHguZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RFbmNvZGVFcnJvcihpbnN0LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQuYWRkSXNzdWUgPSAoaXNzdWUpPT57XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlzc3VlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh1dGlsLmlzc3VlKGlzc3VlLCBwYXlsb2FkLnZhbHVlLCBkZWYpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZm9yIFpvZCAzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICAgICAgY29uc3QgX2lzc3VlID0gaXNzdWU7XG4gICAgICAgICAgICAgICAgaWYgKF9pc3N1ZS5mYXRhbCkgX2lzc3VlLmNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgX2lzc3VlLmNvZGUgPz8gKF9pc3N1ZS5jb2RlID0gXCJjdXN0b21cIik7XG4gICAgICAgICAgICAgICAgX2lzc3VlLmlucHV0ID8/IChfaXNzdWUuaW5wdXQgPSBwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuaW5zdCA/PyAoX2lzc3VlLmluc3QgPSBpbnN0KTtcbiAgICAgICAgICAgICAgICAvLyBfaXNzdWUuY29udGludWUgPz89IHRydWU7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh1dGlsLmlzc3VlKF9pc3N1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBkZWYudHJhbnNmb3JtKHBheWxvYWQudmFsdWUsIHBheWxvYWQpO1xuICAgICAgICBpZiAob3V0cHV0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dC50aGVuKChvdXRwdXQpPT57XG4gICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSBvdXRwdXQ7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm0oZm4pIHtcbiAgICByZXR1cm4gbmV3IFpvZFRyYW5zZm9ybSh7XG4gICAgICAgIHR5cGU6IFwidHJhbnNmb3JtXCIsXG4gICAgICAgIHRyYW5zZm9ybTogZm5cbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RPcHRpb25hbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RPcHRpb25hbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE9wdGlvbmFsLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsKGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgWm9kT3B0aW9uYWwoe1xuICAgICAgICB0eXBlOiBcIm9wdGlvbmFsXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kTnVsbGFibGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTnVsbGFibGVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2ROdWxsYWJsZS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5pbm5lclR5cGU7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBudWxsYWJsZShpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IFpvZE51bGxhYmxlKHtcbiAgICAgICAgdHlwZTogXCJudWxsYWJsZVwiLFxuICAgICAgICBpbm5lclR5cGU6IGlubmVyVHlwZVxuICAgIH0pO1xufVxuLy8gbnVsbGlzaFxuZXhwb3J0IGZ1bmN0aW9uIG51bGxpc2goaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG9wdGlvbmFsKG51bGxhYmxlKGlubmVyVHlwZSkpO1xufVxuZXhwb3J0IGNvbnN0IFpvZERlZmF1bHQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRGVmYXVsdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZERlZmF1bHQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuX3pvZC5kZWYuaW5uZXJUeXBlO1xuICAgIGluc3QucmVtb3ZlRGVmYXVsdCA9IGluc3QudW53cmFwO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gX2RlZmF1bHQoaW5uZXJUeXBlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IFpvZERlZmF1bHQoe1xuICAgICAgICB0eXBlOiBcImRlZmF1bHRcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGUsXG4gICAgICAgIGdldCBkZWZhdWx0VmFsdWUgKCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGRlZmF1bHRWYWx1ZSgpIDogdXRpbC5zaGFsbG93Q2xvbmUoZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFByZWZhdWx0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFByZWZhdWx0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kUHJlZmF1bHQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuX3pvZC5kZWYuaW5uZXJUeXBlO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gcHJlZmF1bHQoaW5uZXJUeXBlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IFpvZFByZWZhdWx0KHtcbiAgICAgICAgdHlwZTogXCJwcmVmYXVsdFwiLFxuICAgICAgICBpbm5lclR5cGU6IGlubmVyVHlwZSxcbiAgICAgICAgZ2V0IGRlZmF1bHRWYWx1ZSAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gZGVmYXVsdFZhbHVlKCkgOiB1dGlsLnNoYWxsb3dDbG9uZShkZWZhdWx0VmFsdWUpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kTm9uT3B0aW9uYWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTm9uT3B0aW9uYWxcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2ROb25PcHRpb25hbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5pbm5lclR5cGU7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBub25vcHRpb25hbChpbm5lclR5cGUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kTm9uT3B0aW9uYWwoe1xuICAgICAgICB0eXBlOiBcIm5vbm9wdGlvbmFsXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kU3VjY2VzcyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RTdWNjZXNzXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kU3VjY2Vzcy5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5pbm5lclR5cGU7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBzdWNjZXNzKGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgWm9kU3VjY2Vzcyh7XG4gICAgICAgIHR5cGU6IFwic3VjY2Vzc1wiLFxuICAgICAgICBpbm5lclR5cGU6IGlubmVyVHlwZVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZENhdGNoID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZENhdGNoXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQ2F0Y2guaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuX3pvZC5kZWYuaW5uZXJUeXBlO1xuICAgIGluc3QucmVtb3ZlQ2F0Y2ggPSBpbnN0LnVud3JhcDtcbn0pO1xuZnVuY3Rpb24gX2NhdGNoKGlubmVyVHlwZSwgY2F0Y2hWYWx1ZSkge1xuICAgIHJldHVybiBuZXcgWm9kQ2F0Y2goe1xuICAgICAgICB0eXBlOiBcImNhdGNoXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlLFxuICAgICAgICBjYXRjaFZhbHVlOiB0eXBlb2YgY2F0Y2hWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gY2F0Y2hWYWx1ZSA6ICgpPT5jYXRjaFZhbHVlXG4gICAgfSk7XG59XG5leHBvcnQgeyBfY2F0Y2ggYXMgY2F0Y2ggfTtcbmV4cG9ydCBjb25zdCBab2ROYU4gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTmFOXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTmFOLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG5hbihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fbmFuKFpvZE5hTiwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RQaXBlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFBpcGVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RQaXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LmluID0gZGVmLmluO1xuICAgIGluc3Qub3V0ID0gZGVmLm91dDtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHBpcGUoaW5fLCBvdXQpIHtcbiAgICByZXR1cm4gbmV3IFpvZFBpcGUoe1xuICAgICAgICB0eXBlOiBcInBpcGVcIixcbiAgICAgICAgaW46IGluXyxcbiAgICAgICAgb3V0OiBvdXRcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RDb2RlYyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDb2RlY1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIFpvZFBpcGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZENvZGVjLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGNvZGVjKGluXywgb3V0LCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZENvZGVjKHtcbiAgICAgICAgdHlwZTogXCJwaXBlXCIsXG4gICAgICAgIGluOiBpbl8sXG4gICAgICAgIG91dDogb3V0LFxuICAgICAgICB0cmFuc2Zvcm06IHBhcmFtcy5kZWNvZGUsXG4gICAgICAgIHJldmVyc2VUcmFuc2Zvcm06IHBhcmFtcy5lbmNvZGVcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RSZWFkb25seSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RSZWFkb25seVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFJlYWRvbmx5LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRvbmx5KGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgWm9kUmVhZG9ubHkoe1xuICAgICAgICB0eXBlOiBcInJlYWRvbmx5XCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kVGVtcGxhdGVMaXRlcmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFRlbXBsYXRlTGl0ZXJhbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFRlbXBsYXRlTGl0ZXJhbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZUxpdGVyYWwocGFydHMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kVGVtcGxhdGVMaXRlcmFsKHtcbiAgICAgICAgdHlwZTogXCJ0ZW1wbGF0ZV9saXRlcmFsXCIsXG4gICAgICAgIHBhcnRzLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kTGF6eSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RMYXp5XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTGF6eS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5nZXR0ZXIoKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGxhenkoZ2V0dGVyKSB7XG4gICAgcmV0dXJuIG5ldyBab2RMYXp5KHtcbiAgICAgICAgdHlwZTogXCJsYXp5XCIsXG4gICAgICAgIGdldHRlcjogZ2V0dGVyXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kUHJvbWlzZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RQcm9taXNlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kUHJvbWlzZS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5pbm5lclR5cGU7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBwcm9taXNlKGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgWm9kUHJvbWlzZSh7XG4gICAgICAgIHR5cGU6IFwicHJvbWlzZVwiLFxuICAgICAgICBpbm5lclR5cGU6IGlubmVyVHlwZVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZEZ1bmN0aW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEZ1bmN0aW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kRnVuY3Rpb24uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gX2Z1bmN0aW9uKHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kRnVuY3Rpb24oe1xuICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgIGlucHV0OiBBcnJheS5pc0FycmF5KHBhcmFtcz8uaW5wdXQpID8gdHVwbGUocGFyYW1zPy5pbnB1dCkgOiBwYXJhbXM/LmlucHV0ID8/IGFycmF5KHVua25vd24oKSksXG4gICAgICAgIG91dHB1dDogcGFyYW1zPy5vdXRwdXQgPz8gdW5rbm93bigpXG4gICAgfSk7XG59XG5leHBvcnQgeyBfZnVuY3Rpb24gYXMgZnVuY3Rpb24gfTtcbmV4cG9ydCBjb25zdCBab2RDdXN0b20gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQ3VzdG9tXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQ3VzdG9tLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuLy8gY3VzdG9tIGNoZWNrc1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrKGZuKSB7XG4gICAgY29uc3QgY2ggPSBuZXcgY29yZS4kWm9kQ2hlY2soe1xuICAgICAgICBjaGVjazogXCJjdXN0b21cIlxuICAgIH0pO1xuICAgIGNoLl96b2QuY2hlY2sgPSBmbjtcbiAgICByZXR1cm4gY2g7XG59XG5leHBvcnQgZnVuY3Rpb24gY3VzdG9tKGZuLCBfcGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2N1c3RvbShab2RDdXN0b20sIGZuID8/ICgoKT0+dHJ1ZSksIF9wYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlZmluZShmbiwgX3BhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIGNvcmUuX3JlZmluZShab2RDdXN0b20sIGZuLCBfcGFyYW1zKTtcbn1cbi8vIHN1cGVyUmVmaW5lXG5leHBvcnQgZnVuY3Rpb24gc3VwZXJSZWZpbmUoZm4pIHtcbiAgICByZXR1cm4gY29yZS5fc3VwZXJSZWZpbmUoZm4pO1xufVxuZnVuY3Rpb24gX2luc3RhbmNlb2YoY2xzLCBwYXJhbXMgPSB7XG4gICAgZXJyb3I6IGBJbnB1dCBub3QgaW5zdGFuY2Ugb2YgJHtjbHMubmFtZX1gXG59KSB7XG4gICAgY29uc3QgaW5zdCA9IG5ldyBab2RDdXN0b20oe1xuICAgICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgICBjaGVjazogXCJjdXN0b21cIixcbiAgICAgICAgZm46IChkYXRhKT0+ZGF0YSBpbnN0YW5jZW9mIGNscyxcbiAgICAgICAgYWJvcnQ6IHRydWUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuYmFnLkNsYXNzID0gY2xzO1xuICAgIHJldHVybiBpbnN0O1xufVxuZXhwb3J0IHsgX2luc3RhbmNlb2YgYXMgaW5zdGFuY2VvZiB9O1xuLy8gc3RyaW5nYm9vbFxuZXhwb3J0IGNvbnN0IHN0cmluZ2Jvb2wgPSAoLi4uYXJncyk9PmNvcmUuX3N0cmluZ2Jvb2woe1xuICAgICAgICBDb2RlYzogWm9kQ29kZWMsXG4gICAgICAgIEJvb2xlYW46IFpvZEJvb2xlYW4sXG4gICAgICAgIFN0cmluZzogWm9kU3RyaW5nXG4gICAgfSwgLi4uYXJncyk7XG5leHBvcnQgZnVuY3Rpb24ganNvbihwYXJhbXMpIHtcbiAgICBjb25zdCBqc29uU2NoZW1hID0gbGF6eSgoKT0+e1xuICAgICAgICByZXR1cm4gdW5pb24oW1xuICAgICAgICAgICAgc3RyaW5nKHBhcmFtcyksXG4gICAgICAgICAgICBudW1iZXIoKSxcbiAgICAgICAgICAgIGJvb2xlYW4oKSxcbiAgICAgICAgICAgIF9udWxsKCksXG4gICAgICAgICAgICBhcnJheShqc29uU2NoZW1hKSxcbiAgICAgICAgICAgIHJlY29yZChzdHJpbmcoKSwganNvblNjaGVtYSlcbiAgICAgICAgXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGpzb25TY2hlbWE7XG59XG4vLyBwcmVwcm9jZXNzXG4vLyAvKiogQGRlcHJlY2F0ZWQgVXNlIGB6LnBpcGUoKWAgYW5kIGB6LnRyYW5zZm9ybSgpYCBpbnN0ZWFkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXByb2Nlc3MoZm4sIHNjaGVtYSkge1xuICAgIHJldHVybiBwaXBlKHRyYW5zZm9ybShmbiksIHNjaGVtYSk7XG59XG4iLCAiaW1wb3J0IHsgZGVmaW5lSG9vaywgZ2V0V3JpdGFibGUgfSBmcm9tIFwid29ya2Zsb3dcIjtcbmltcG9ydCAqIGFzIHogZnJvbSBcInpvZFwiO1xuLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJ3b3JrZmxvd3MvaG9va3MudHNcIjp7XCJjb2xsZWN0V2l0aEhvb2tcIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vd29ya2Zsb3dzL2hvb2tzLnRzLy9jb2xsZWN0V2l0aEhvb2tcIn19fSxcInN0ZXBzXCI6e1wid29ya2Zsb3dzL2hvb2tzLnRzXCI6e1wid3JpdGVFdmVudFwiOntcInN0ZXBJZFwiOlwic3RlcC8vd29ya2Zsb3dzL2hvb2tzLnRzLy93cml0ZUV2ZW50XCJ9fX19Ki87XG5leHBvcnQgY29uc3QgSG9vayA9IGRlZmluZUhvb2soe1xuICAgIHNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgICBkYXRhOiB6LnN0cmluZygpLFxuICAgICAgICBkb25lOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICBtZXRhZGF0YTogei51bmtub3duKClcbiAgICB9KVxufSk7XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29sbGVjdFdpdGhIb29rKHRva2VuLCBjdXN0b21EYXRhKSB7XG4gICAgY29uc3QgaG9vayA9IEhvb2suY3JlYXRlKHtcbiAgICAgICAgdG9rZW4sXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBjdXN0b21EYXRhXG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBjb2xsZWN0ZWQgPSBbXTtcbiAgICBjb25zdCB3ZiA9IGdldFdyaXRhYmxlKCk7XG4gICAgYXdhaXQgd3JpdGVFdmVudCh3ZiwgJ2hvb2tDcmVhdGVkJyk7XG4gICAgZm9yIGF3YWl0IChjb25zdCBldmVudCBvZiBob29rKXtcbiAgICAgICAgYXdhaXQgd3JpdGVFdmVudCh3ZiwgJ2hvb2tSZXN1bWVkJywgZXZlbnQpO1xuICAgICAgICBjb2xsZWN0ZWQucHVzaChldmVudCk7XG4gICAgICAgIGlmIChldmVudC5kb25lKSBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29sbGVjdGVkXG4gICAgfTtcbn1cbmNvbGxlY3RXaXRoSG9vay53b3JrZmxvd0lkID0gXCJ3b3JrZmxvdy8vd29ya2Zsb3dzL2hvb2tzLnRzLy9jb2xsZWN0V2l0aEhvb2tcIjtcbmdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cy5zZXQoXCJ3b3JrZmxvdy8vd29ya2Zsb3dzL2hvb2tzLnRzLy9jb2xsZWN0V2l0aEhvb2tcIiwgY29sbGVjdFdpdGhIb29rKTtcbnZhciB3cml0ZUV2ZW50ID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vd29ya2Zsb3dzL2hvb2tzLnRzLy93cml0ZUV2ZW50XCIpO1xuIiwgImltcG9ydCB7IEZhdGFsRXJyb3IgfSBmcm9tIFwid29ya2Zsb3dcIjtcbi8qKl9faW50ZXJuYWxfd29ya2Zsb3dze1wid29ya2Zsb3dzXCI6e1wid29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwudHNcIjp7XCJyZXRyeWFibGVBbmRGYXRhbEVycm9yV29ya2Zsb3dcIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwudHMvL3JldHJ5YWJsZUFuZEZhdGFsRXJyb3JXb3JrZmxvd1wifX19LFwic3RlcHNcIjp7XCJ3b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50c1wiOntcInN0ZXBUaGF0RmFpbHNcIjp7XCJzdGVwSWRcIjpcInN0ZXAvL3dvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLnRzLy9zdGVwVGhhdEZhaWxzXCJ9LFwic3RlcFRoYXRUaHJvd3NSZXRyeWFibGVFcnJvclwiOntcInN0ZXBJZFwiOlwic3RlcC8vd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwudHMvL3N0ZXBUaGF0VGhyb3dzUmV0cnlhYmxlRXJyb3JcIn19fX0qLztcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXRyeWFibGVBbmRGYXRhbEVycm9yV29ya2Zsb3coKSB7XG4gICAgY29uc3QgcmV0cnlhYmxlUmVzdWx0ID0gYXdhaXQgc3RlcFRoYXRUaHJvd3NSZXRyeWFibGVFcnJvcigpO1xuICAgIGxldCBnb3RGYXRhbEVycm9yID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3RlcFRoYXRGYWlscygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChGYXRhbEVycm9yLmlzKGVycm9yKSkge1xuICAgICAgICAgICAgZ290RmF0YWxFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmV0cnlhYmxlUmVzdWx0LFxuICAgICAgICBnb3RGYXRhbEVycm9yXG4gICAgfTtcbn1cbnJldHJ5YWJsZUFuZEZhdGFsRXJyb3JXb3JrZmxvdy53b3JrZmxvd0lkID0gXCJ3b3JrZmxvdy8vd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwudHMvL3JldHJ5YWJsZUFuZEZhdGFsRXJyb3JXb3JrZmxvd1wiO1xuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldChcIndvcmtmbG93Ly93b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50cy8vcmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93XCIsIHJldHJ5YWJsZUFuZEZhdGFsRXJyb3JXb3JrZmxvdyk7XG52YXIgc3RlcFRoYXRUaHJvd3NSZXRyeWFibGVFcnJvciA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvL3dvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLnRzLy9zdGVwVGhhdFRocm93c1JldHJ5YWJsZUVycm9yXCIpO1xudmFyIHN0ZXBUaGF0RmFpbHMgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy93b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50cy8vc3RlcFRoYXRGYWlsc1wiKTtcbiIsICIvKipfX2ludGVybmFsX3dvcmtmbG93c3tcIndvcmtmbG93c1wiOntcIndvcmtmbG93cy9udWxsLWJ5dGUudHNcIjp7XCJudWxsQnl0ZVdvcmtmbG93XCI6e1wid29ya2Zsb3dJZFwiOlwid29ya2Zsb3cvL3dvcmtmbG93cy9udWxsLWJ5dGUudHMvL251bGxCeXRlV29ya2Zsb3dcIn19fSxcInN0ZXBzXCI6e1wid29ya2Zsb3dzL251bGwtYnl0ZS50c1wiOntcIm51bGxCeXRlU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vd29ya2Zsb3dzL251bGwtYnl0ZS50cy8vbnVsbEJ5dGVTdGVwXCJ9fX19Ki87XG52YXIgbnVsbEJ5dGVTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vd29ya2Zsb3dzL251bGwtYnl0ZS50cy8vbnVsbEJ5dGVTdGVwXCIpO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG51bGxCeXRlV29ya2Zsb3coKSB7XG4gICAgY29uc3QgYSA9IGF3YWl0IG51bGxCeXRlU3RlcCgpO1xuICAgIHJldHVybiBhO1xufVxubnVsbEJ5dGVXb3JrZmxvdy53b3JrZmxvd0lkID0gXCJ3b3JrZmxvdy8vd29ya2Zsb3dzL251bGwtYnl0ZS50cy8vbnVsbEJ5dGVXb3JrZmxvd1wiO1xuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldChcIndvcmtmbG93Ly93b3JrZmxvd3MvbnVsbC1ieXRlLnRzLy9udWxsQnl0ZVdvcmtmbG93XCIsIG51bGxCeXRlV29ya2Zsb3cpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQSx3RUFBQUEsU0FBQTtBQUVJLFFBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJ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QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFMZ0I7QUFhVCxTQUFTLE9BQU9DLFFBQU8sUUFBUTtBQUNsQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE1BQU1BLFFBQU8sUUFBUTtBQUNqQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE1BQU1BLFFBQU8sUUFBUTtBQUNqQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLFFBQVFBLFFBQU8sUUFBUTtBQUNuQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFUZ0I7QUFVVCxTQUFTLFFBQVFBLFFBQU8sUUFBUTtBQUNuQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFUZ0I7QUFVVCxTQUFTLFFBQVFBLFFBQU8sUUFBUTtBQUNuQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFUZ0I7QUFVVCxTQUFTLEtBQUtBLFFBQU8sUUFBUTtBQUNoQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTQyxRQUFPRCxRQUFPLFFBQVE7QUFDbEMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCLE9BQUFDLFNBQUE7QUFTVCxTQUFTLFFBQVFELFFBQU8sUUFBUTtBQUNuQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE1BQU1BLFFBQU8sUUFBUTtBQUNqQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE9BQU9BLFFBQU8sUUFBUTtBQUNsQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE1BQU1BLFFBQU8sUUFBUTtBQUNqQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLEtBQUtBLFFBQU8sUUFBUTtBQUNoQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE9BQU9BLFFBQU8sUUFBUTtBQUNsQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE1BQU1BLFFBQU8sUUFBUTtBQUNqQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE1BQU1BLFFBQU8sUUFBUTtBQUNqQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLFFBQVFBLFFBQU8sUUFBUTtBQUNuQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLFFBQVFBLFFBQU8sUUFBUTtBQUNuQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLFFBQVFBLFFBQU8sUUFBUTtBQUNuQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLFdBQVdBLFFBQU8sUUFBUTtBQUN0QyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE1BQU1BLFFBQU8sUUFBUTtBQUNqQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLEtBQUtBLFFBQU8sUUFBUTtBQUNoQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNO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LGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUU3RSxFQUFLLFVBQVUsS0FBSyxNQUFNLEdBQUc7QUFDN0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFNBQXVCLGdCQUFLLGFBQWEsVUFBVSxDQUFDLE1BQU0sUUFBTTtBQUV6RSxFQUFLLFFBQVEsS0FBSyxNQUFNLEdBQUc7QUFDM0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFdBQXlCLGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUU3RSxFQUFLLFVBQVUsS0FBSyxNQUFNLEdBQUc7QUFDN0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFlBQTBCLGdCQUFLLGFBQWEsYUFBYSxDQUFDLE1BQU0sUUFBTTtBQUMvRSxFQUFLLFdBQVcsS0FBSyxNQUFNLEdBQUc7QUFDOUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFlBQTBCLGdCQUFLLGFBQWEsYUFBYSxDQUFDLE1BQU0sUUFBTTtBQUMvRSxFQUFLLFdBQVcsS0FBSyxNQUFNLEdBQUc7QUFDOUIsa0JBQWdCLEtBQUss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QUN6QyxjQUFVLEtBQUssS0FBSztBQUNwQixRQUFJLE1BQU0sS0FBTTtBQUFBLEVBQ3BCO0FBQ0EsU0FBTztBQUFBLElBQ0g7QUFBQSxFQUNKO0FBQ0o7QUFsQnNCO0FBbUJ0QixnQkFBZ0IsYUFBYTtBQUM3QixXQUFXLG9CQUFvQixJQUFJLGlEQUFpRCxlQUFlO0FBQ25HLElBQUksYUFBYSxXQUFXLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLHNDQUFzQzs7O0FDN0JuRyxlQUFzQixpQ0FBaUM7QUFDbkQsUUFBTSxrQkFBa0IsTUFBTSw2QkFBNkI7QUFDM0QsTUFBSSxnQkFBZ0I7QUFDcEIsTUFBSTtBQUNBLFVBQU0sY0FBYztBQUFBLEVBQ3hCLFNBQVMsT0FBTztBQUNaLFFBQUksV0FBVyxHQUFHLEtBQUssR0FBRztBQUN0QixzQkFBZ0I7QUFBQSxJQUNwQjtBQUFBLEVBQ0o7QUFDQSxTQUFPO0FBQUEsSUFDSDtBQUFBLElBQ0E7QUFBQSxFQUNKO0FBQ0o7QUFkc0I7QUFldEIsK0JBQStCLGFBQWE7QUFDNUMsV0FBVyxvQkFBb0IsSUFBSSw4RUFBOEUsOEJBQThCO0FBQy9JLElBQUksK0JBQStCLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsc0VBQXNFO0FBQ3JKLElBQUksZ0JBQWdCLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsdURBQXVEOzs7QUNuQnZILElBQUksZUFBZSxXQUFXLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLDRDQUE0QztBQUMzRyxlQUFzQixtQkFBbUI7QUFDckMsUUFBTSxJQUFJLE1BQU0sYUFBYTtBQUM3QixTQUFPO0FBQ1g7QUFIc0I7QUFJdEIsaUJBQWlCLGFBQWE7QUFDOUIsV0FBVyxvQkFBb0IsSUFBSSxzREFBc0QsZ0JBQWdCOyIsCiAgIm5hbWVzIjogWyJtb2R1bGUiLCAicGFyc2UiLCAibXMiLCAiaW5pdGlhbGl6ZXIiLCAiYXJyYXkiLCAib2JqZWN0IiwgIkNsYXNzIiwgImNvbmZpZyIsICJiYXNlNjQiLCAiYmFzZTY0dXJsIiwgImlzc3VlIiwgImVycm9yIiwgInZlcnNpb24iLCAidGltZSIsICJpbnN0IiwgImNoZWNrcyIsICJjaGVja1Jlc3VsdCIsICJjYW5hcnkiLCAicmVzdWx0IiwgIl8iLCAiaW5zdCIsICJiYXNlNjQiLCAicmVzdWx0IiwgInIiLCAiaXNPYmplY3QiLCAiYWxsb3dzRXZhbCIsICJyZXN1bHRzIiwgImxlZnQiLCAicmlnaHQiLCAib3V0cHV0IiwgInJlc3VsdCIsICJyZXN1bHQiLCAicmlnaHQiLCAibGVmdCIsICJyIiwgIkNsYXNzIiwgIkNsYXNzIiwgIl9lbW9qaSIsICJDbGFzcyIsICJDbGFzcyIsICJDbGFzcyIsICJDbGFzcyIsICJDbGFzcyIsICJpc3N1ZSIsICJkYXRldGltZSIsICJkYXRlIiwgInRpbWUiLCAiZHVyYXRpb24iLCAiaW5pdGlhbGl6ZXIiLCAiaXNzdWUiLCAiaXNzdWVzIiwgInBhcnNlIiwgInBhcnNlQXN5bmMiLCAic2FmZVBhcnNlIiwgInNhZmVQYXJzZUFzeW5jIiwgImRlZiIsICJwYXJzZSIsICJzYWZlUGFyc2UiLCAicGFyc2VBc3luYyIsICJzYWZlUGFyc2VBc3luYyIsICJfZW1vamkiLCAiZGF0ZXRpbWUiLCAiZGF0ZSIsICJ0aW1lIiwgImR1cmF0aW9uIiwgInN0cmluZyIsICJib29sZWFuIiwgImlzc3VlIiwgIm91dHB1dCIsICJzdHJpbmciLCAiYm9vbGVhbiJdCn0K
47041
47106
  `;
47042
47107
  var POST = workflowEntrypoint(workflowCode);
47043
47108
  // Annotate the CommonJS export names for ESM import in node: