experimental-agent 0.3.0 → 0.5.0

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.
Files changed (40) hide show
  1. package/README.md +61 -0
  2. package/dist/{adapter-BigchkkI.d.mts → adapter-Cl735Kp4.d.mts} +37 -39
  3. package/dist/{adapter-BigchkkI.d.ts → adapter-Cl735Kp4.d.ts} +37 -39
  4. package/dist/{chunk-ZUFJJYC4.mjs → chunk-2Y7EZPIP.mjs} +3 -2
  5. package/dist/{chunk-RT72C52I.mjs → chunk-6MS4CGEZ.mjs} +3 -2
  6. package/dist/{chunk-ELWIUJUK.mjs → chunk-AB2JYY6A.mjs} +6 -3
  7. package/dist/chunk-I5DCB7RU.mjs +346 -0
  8. package/dist/chunk-NOW6XL5E.mjs +310 -0
  9. package/dist/{docker-QPCLWLYR.mjs → docker-OBUQX5ZI.mjs} +1 -1
  10. package/dist/entry-Bs17QEiq.d.mts +45 -0
  11. package/dist/entry-QNyd4S1s.d.ts +45 -0
  12. package/dist/index.d.mts +162 -85
  13. package/dist/index.d.ts +162 -85
  14. package/dist/index.js +636 -161
  15. package/dist/index.mjs +469 -153
  16. package/dist/lifecycle-workflow-steps.d.mts +2 -2
  17. package/dist/lifecycle-workflow-steps.d.ts +2 -2
  18. package/dist/lifecycle-workflow.d.mts +2 -2
  19. package/dist/lifecycle-workflow.d.ts +2 -2
  20. package/dist/{local-KJ3BSIFJ.mjs → local-4C3V4EFS.mjs} +1 -1
  21. package/dist/next/loader.js +6 -3
  22. package/dist/next/loader.mjs +1 -1
  23. package/dist/next.js +10 -4
  24. package/dist/next.mjs +6 -3
  25. package/dist/sandbox.d.mts +3 -3
  26. package/dist/sandbox.d.ts +3 -3
  27. package/dist/sandbox.js +15 -5
  28. package/dist/sandbox.mjs +3 -3
  29. package/dist/{steps-BnkRQKlc.d.ts → steps-XA4wG8W3.d.ts} +4 -1
  30. package/dist/{steps-u-mGDbP_.d.mts → steps-eTytqxQb.d.mts} +4 -1
  31. package/dist/storage.d.mts +9 -3
  32. package/dist/storage.d.ts +9 -3
  33. package/dist/storage.js +161 -9
  34. package/dist/storage.mjs +5 -1
  35. package/dist/{vercel-QZ6INPMV.mjs → vercel-6ORAC625.mjs} +1 -1
  36. package/package.json +5 -2
  37. package/dist/chunk-BFFNCESS.mjs +0 -302
  38. package/dist/chunk-DOD4MC5D.mjs +0 -196
  39. package/dist/entry-BmQ8FO-5.d.ts +0 -36
  40. package/dist/entry-CZd9aAwn.d.mts +0 -36
package/dist/index.js CHANGED
@@ -384,9 +384,10 @@ async function createSetupSnapshot({
384
384
  }
385
385
  }
386
386
  }
387
- function vercelSandbox() {
387
+ function vercelSandbox(defaults) {
388
388
  return {
389
389
  type: "vercel",
390
+ defaults,
390
391
  async create({ agent: agent2, setup: setup2, record, signal: _signal, log: log2 }) {
391
392
  const storage = agent2.storage;
392
393
  const config = setup2.config ?? {};
@@ -755,9 +756,10 @@ async function ensureSandbox(sandboxName) {
755
756
  throw e;
756
757
  }
757
758
  }
758
- function dockerSandbox() {
759
+ function dockerSandbox(defaults) {
759
760
  return {
760
761
  type: "docker",
762
+ defaults,
761
763
  async create(opts) {
762
764
  const sandboxName = `agent-${(0, import_ulid.ulid)()}`;
763
765
  const cwd = opts.setup?.config?.cwd;
@@ -801,7 +803,14 @@ var init_docker = __esm({
801
803
  const commandId = `command_${(0, import_ulid.ulid)()}`;
802
804
  const envFlags = opts.env ? Object.entries(opts.env).flatMap(([k, v]) => ["-e", `${k}=${v}`]) : [];
803
805
  const cwdFlags = opts.cwd ? ["-w", opts.cwd] : [];
804
- const baseCmd = opts.sudo ? ["sudo", opts.command, ...opts.args ?? []] : opts.args ? [opts.command, ...opts.args] : [opts.command];
806
+ let baseCmd;
807
+ if (opts.sudo) {
808
+ baseCmd = ["sudo", opts.command, ...opts.args ?? []];
809
+ } else if (opts.args) {
810
+ baseCmd = [opts.command, ...opts.args];
811
+ } else {
812
+ baseCmd = [opts.command];
813
+ }
805
814
  const fullCmd = baseCmd;
806
815
  const child = spawn(
807
816
  "docker",
@@ -953,9 +962,10 @@ var local_exports = {};
953
962
  __export(local_exports, {
954
963
  localSandbox: () => localSandbox
955
964
  });
956
- function localSandbox() {
965
+ function localSandbox(defaults) {
957
966
  return {
958
967
  type: "local",
968
+ defaults,
959
969
  async create(opts) {
960
970
  const basePath = opts.setup.config?.cwd ?? process.cwd();
961
971
  const instance = new LocalSandboxInstance(basePath);
@@ -1302,6 +1312,7 @@ async function resolveBinding(sandbox, type) {
1302
1312
  return { binding: sandbox[0], bindingName: sandbox[0].type };
1303
1313
  }
1304
1314
  async function setup(ctx, opts) {
1315
+ "use step";
1305
1316
  if (ctx._pendingSetup) {
1306
1317
  return { done: ctx._pendingSetup };
1307
1318
  }
@@ -1324,7 +1335,7 @@ async function setup(ctx, opts) {
1324
1335
  }
1325
1336
  const setupLog = log2.withContext({
1326
1337
  binding: bindingName,
1327
- version: opts?.version
1338
+ version: opts?.version ?? binding.defaults?.version
1328
1339
  });
1329
1340
  let resolveBlockingPromise = (value) => value;
1330
1341
  let rejectBlockingPromise = (_reason) => {
@@ -1340,8 +1351,17 @@ async function setup(ctx, opts) {
1340
1351
  const doneStorageGet = setupLog.time("storage.sandbox.get");
1341
1352
  const record = await agent2.storage.sandbox.get(ctx.sandboxId);
1342
1353
  doneStorageGet();
1354
+ const bindingDefaults = binding.defaults ?? {};
1355
+ const effectiveVersion = opts?.version ?? bindingDefaults.version ?? null;
1356
+ const effectiveRun = opts?.run ?? bindingDefaults.run;
1357
+ const effectiveNetworkPolicy = opts?.networkPolicy ?? bindingDefaults.networkPolicy ?? null;
1358
+ const effectiveConfig = {
1359
+ ...bindingDefaults.config,
1360
+ // biome-ignore lint/suspicious/noExplicitAny: opts is a union; config exists on binding-specific branches
1361
+ ...opts?.config
1362
+ };
1343
1363
  if (record) {
1344
- const versionMatches = !opts?.version || record.setup?.version === opts.version;
1364
+ const versionMatches = !effectiveVersion || record.setup?.version === effectiveVersion;
1345
1365
  if (versionMatches && record.setup?.completedAt) {
1346
1366
  resolveBlockingPromise();
1347
1367
  const doneConnectExisting = setupLog.time(
@@ -1413,8 +1433,8 @@ async function setup(ctx, opts) {
1413
1433
  const now = Date.now();
1414
1434
  const setup_ = {
1415
1435
  binding: bindingName,
1416
- version: opts?.version ?? record?.setup?.version ?? null,
1417
- networkPolicy: opts?.networkPolicy ?? record?.setup?.networkPolicy ?? null,
1436
+ version: effectiveVersion ?? record?.setup?.version ?? null,
1437
+ networkPolicy: effectiveNetworkPolicy ?? record?.setup?.networkPolicy ?? null,
1418
1438
  completedAt: null,
1419
1439
  metadata: null
1420
1440
  };
@@ -1434,8 +1454,11 @@ async function setup(ctx, opts) {
1434
1454
  const result = await binding.create({
1435
1455
  cwd: ctx._cwd ?? ".",
1436
1456
  agent: agent2,
1437
- // biome-ignore lint/suspicious/noExplicitAny: opts is a union; config exists on binding-specific branches
1438
- setup: { ...setup_, run: opts?.run, config: opts?.config },
1457
+ setup: {
1458
+ ...setup_,
1459
+ run: effectiveRun,
1460
+ config: effectiveConfig
1461
+ },
1439
1462
  record: newRecord,
1440
1463
  signal: opts?.signal,
1441
1464
  log: setupLog
@@ -1524,60 +1547,70 @@ async function pollUntilReady(ctx, signal) {
1524
1547
 
1525
1548
  // src/sandbox/exec.ts
1526
1549
  async function exec(sandboxContext, ...opts) {
1550
+ "use step";
1527
1551
  const sbx = await resolve(sandboxContext);
1528
1552
  return await sbx.exec(...opts);
1529
1553
  }
1530
1554
 
1531
1555
  // src/sandbox/get-domain.ts
1532
1556
  async function getDomain(sandboxContext, ...opts) {
1557
+ "use step";
1533
1558
  const sbx = await resolve(sandboxContext);
1534
1559
  return await sbx.getDomain(...opts);
1535
1560
  }
1536
1561
 
1537
1562
  // src/sandbox/get-status.ts
1538
1563
  async function getStatus(sandboxContext, ...opts) {
1564
+ "use step";
1539
1565
  const sbx = await resolve(sandboxContext);
1540
1566
  return await sbx.getStatus(...opts);
1541
1567
  }
1542
1568
 
1543
1569
  // src/sandbox/kill.ts
1544
1570
  async function kill(sandboxContext, ...opts) {
1571
+ "use step";
1545
1572
  const sbx = await resolve(sandboxContext);
1546
1573
  return await sbx.kill(...opts);
1547
1574
  }
1548
1575
 
1549
1576
  // src/sandbox/read-file.ts
1550
1577
  async function readFile(sandboxContext, ...opts) {
1578
+ "use step";
1551
1579
  const sbx = await resolve(sandboxContext);
1552
1580
  return await sbx.readFile(...opts);
1553
1581
  }
1554
1582
 
1555
1583
  // src/sandbox/snapshot.ts
1556
1584
  async function snapshot(sandboxContext, ...opts) {
1585
+ "use step";
1557
1586
  const sbx = await resolve(sandboxContext);
1558
1587
  return await sbx.snapshot(...opts);
1559
1588
  }
1560
1589
 
1561
1590
  // src/sandbox/start.ts
1562
1591
  async function start(sandboxContext, ...opts) {
1592
+ "use step";
1563
1593
  const sbx = await resolve(sandboxContext);
1564
1594
  return await sbx.start(...opts);
1565
1595
  }
1566
1596
 
1567
1597
  // src/sandbox/stop.ts
1568
1598
  async function stop(sandboxContext, ...opts) {
1599
+ "use step";
1569
1600
  const sbx = await resolve(sandboxContext);
1570
1601
  return await sbx.stop(...opts);
1571
1602
  }
1572
1603
 
1573
1604
  // src/sandbox/update-network-policy.ts
1574
1605
  async function updateNetworkPolicy(sandboxContext, ...opts) {
1606
+ "use step";
1575
1607
  const sbx = await resolve(sandboxContext);
1576
1608
  return await sbx.updateNetworkPolicy(...opts);
1577
1609
  }
1578
1610
 
1579
1611
  // src/sandbox/write-files.ts
1580
1612
  async function writeFiles(sandboxContext, ...opts) {
1613
+ "use step";
1581
1614
  const sbx = await resolve(sandboxContext);
1582
1615
  return await sbx.writeFiles(...opts);
1583
1616
  }
@@ -1609,6 +1642,58 @@ function sandboxHandle(agent2, id) {
1609
1642
  getStatus: getStatus.bind(null, sandboxContext)
1610
1643
  };
1611
1644
  }
1645
+ function lazySandboxHandle(agent2, getId) {
1646
+ const getHandle = async () => {
1647
+ const id = await getId();
1648
+ return sandboxHandle(agent2, id);
1649
+ };
1650
+ return {
1651
+ setup: async (...args) => {
1652
+ const h = await getHandle();
1653
+ return h.setup(...args);
1654
+ },
1655
+ exec: async (...args) => {
1656
+ const h = await getHandle();
1657
+ return h.exec(...args);
1658
+ },
1659
+ readFile: async (...args) => {
1660
+ const h = await getHandle();
1661
+ return h.readFile(...args);
1662
+ },
1663
+ writeFiles: async (...args) => {
1664
+ const h = await getHandle();
1665
+ return h.writeFiles(...args);
1666
+ },
1667
+ getDomain: async (...args) => {
1668
+ const h = await getHandle();
1669
+ return h.getDomain(...args);
1670
+ },
1671
+ updateNetworkPolicy: async (...args) => {
1672
+ const h = await getHandle();
1673
+ return h.updateNetworkPolicy(...args);
1674
+ },
1675
+ start: async (...args) => {
1676
+ const h = await getHandle();
1677
+ return h.start(...args);
1678
+ },
1679
+ stop: async (...args) => {
1680
+ const h = await getHandle();
1681
+ return h.stop(...args);
1682
+ },
1683
+ kill: async (...args) => {
1684
+ const h = await getHandle();
1685
+ return h.kill(...args);
1686
+ },
1687
+ snapshot: async (...args) => {
1688
+ const h = await getHandle();
1689
+ return h.snapshot(...args);
1690
+ },
1691
+ getStatus: async (...args) => {
1692
+ const h = await getHandle();
1693
+ return h.getStatus(...args);
1694
+ }
1695
+ };
1696
+ }
1612
1697
 
1613
1698
  // src/session/handle.ts
1614
1699
  var import_ulid6 = require("ulid");
@@ -1666,7 +1751,8 @@ function assembleUIMessages(opts) {
1666
1751
  return {
1667
1752
  id: messageId,
1668
1753
  role: m.role,
1669
- parts: messageParts.map((p) => p.part)
1754
+ parts: messageParts.map((p) => p.part),
1755
+ ...m.metadata != null ? { metadata: m.metadata } : {}
1670
1756
  };
1671
1757
  }).filter((m) => m.parts.length > 0);
1672
1758
  }
@@ -1694,12 +1780,17 @@ function computeSessionUsage(messages) {
1694
1780
 
1695
1781
  // src/session/history.ts
1696
1782
  async function history(sessionContext) {
1783
+ "use step";
1697
1784
  const [session, messages, parts] = await Promise.all([
1698
1785
  sessionContext.agent.storage.session.get(sessionContext.sessionId),
1699
- sessionContext.agent.storage.message.listBySession(sessionContext.sessionId),
1786
+ sessionContext.agent.storage.message.listBySession(
1787
+ sessionContext.sessionId
1788
+ ),
1700
1789
  sessionContext.agent.storage.part.listBySession(sessionContext.sessionId)
1701
1790
  ]);
1702
- const lastAssistant = messages.find((m) => m.id === session?.lastMessageId && m.role === "assistant") ?? messages.filter((m) => m.role === "assistant").at(-1);
1791
+ const lastAssistant = messages.find(
1792
+ (m) => m.id === session?.lastMessageId && m.role === "assistant"
1793
+ ) ?? messages.filter((m) => m.role === "assistant").at(-1);
1703
1794
  const isStreaming = lastAssistant?.completedAt === null && lastAssistant?.interruptedAt === null;
1704
1795
  const streamingMessageId = isStreaming ? lastAssistant.id : null;
1705
1796
  const visibleUntil = lastAssistant?.createdAt;
@@ -1826,11 +1917,21 @@ function parseSimpleYaml(yaml) {
1826
1917
  }
1827
1918
  return result;
1828
1919
  }
1829
- function normalizeSkillsDirs(skillsDir) {
1830
- if (!skillsDir) {
1920
+ function normalizeSkills(skills) {
1921
+ if (!skills || skills.length === 0) {
1831
1922
  return [];
1832
1923
  }
1833
- return Array.isArray(skillsDir) ? skillsDir : [skillsDir];
1924
+ return skills.map((skill) => {
1925
+ if (typeof skill !== "object" || skill === null) {
1926
+ throw new Error(
1927
+ "Invalid skills entry: expected an object with a `type` field."
1928
+ );
1929
+ }
1930
+ if ("type" in skill && skill.type) {
1931
+ return skill;
1932
+ }
1933
+ throw new Error("Invalid skills entry: expected `type`.");
1934
+ });
1834
1935
  }
1835
1936
 
1836
1937
  // src/skills/discover.ts
@@ -1927,6 +2028,195 @@ async function parseSkillFile(opts) {
1927
2028
  };
1928
2029
  }
1929
2030
 
2031
+ // src/skills/resolve.ts
2032
+ init_logger();
2033
+
2034
+ // src/skills/resolve-host.ts
2035
+ async function collectFiles(opts) {
2036
+ const { readdir, readFile: readFile2, stat } = await import("fs/promises");
2037
+ const { resolve: resolve2, posix: pathPosix } = await import("path");
2038
+ const fileStat = await stat(opts.absolutePath);
2039
+ if (fileStat.isFile()) {
2040
+ const content = await readFile2(opts.absolutePath);
2041
+ return [{ path: opts.relativePrefix ?? "SKILL.md", content }];
2042
+ }
2043
+ if (!fileStat.isDirectory()) {
2044
+ return [];
2045
+ }
2046
+ const entries = await readdir(opts.absolutePath, { withFileTypes: true });
2047
+ const files = [];
2048
+ for (const entry of entries) {
2049
+ const nextAbs = resolve2(opts.absolutePath, entry.name);
2050
+ const nextRel = opts.relativePrefix ? pathPosix.join(opts.relativePrefix, entry.name) : entry.name;
2051
+ if (entry.isDirectory()) {
2052
+ files.push(
2053
+ ...await collectFiles({
2054
+ absolutePath: nextAbs,
2055
+ relativePrefix: nextRel
2056
+ })
2057
+ );
2058
+ continue;
2059
+ }
2060
+ if (entry.isFile()) {
2061
+ files.push({
2062
+ path: nextRel,
2063
+ content: await readFile2(nextAbs)
2064
+ });
2065
+ }
2066
+ }
2067
+ return files;
2068
+ }
2069
+ async function stableDirName(inputPath) {
2070
+ const { createHash } = await import("crypto");
2071
+ const hash = createHash("sha1").update(inputPath).digest("hex").slice(0, 10);
2072
+ return `host-${hash}`;
2073
+ }
2074
+ async function resolveHostSkill(opts) {
2075
+ const { resolve: resolve2, posix: pathPosix } = await import("path");
2076
+ const hostPath = resolve2(process.cwd(), opts.skill.path);
2077
+ const files = await collectFiles({ absolutePath: hostPath });
2078
+ const dirName = await stableDirName(hostPath);
2079
+ const destPath = pathPosix.join(".agent", "skills", ".materialized", dirName);
2080
+ if (files.length === 0) {
2081
+ return destPath;
2082
+ }
2083
+ await opts.sandbox.writeFiles({
2084
+ files,
2085
+ destPath
2086
+ });
2087
+ return destPath;
2088
+ }
2089
+
2090
+ // src/skills/resolve-inline.ts
2091
+ function slugify(value) {
2092
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "");
2093
+ }
2094
+ async function stableInlineDirName(name) {
2095
+ const { createHash } = await import("crypto");
2096
+ const slug = slugify(name) || "inline-skill";
2097
+ const hash = createHash("sha1").update(name).digest("hex").slice(0, 8);
2098
+ return `${slug}-${hash}`;
2099
+ }
2100
+ function buildSkillMarkdown(skill) {
2101
+ return `---
2102
+ name: ${skill.name}
2103
+ description: ${skill.description}
2104
+ ---
2105
+
2106
+ ${skill.instructions.trim()}
2107
+ `;
2108
+ }
2109
+ async function resolveInlineSkill(opts) {
2110
+ const { posix: pathPosix } = await import("path");
2111
+ const dirName = await stableInlineDirName(opts.skill.name);
2112
+ const destPath = pathPosix.join(".agent", "skills", ".materialized", dirName);
2113
+ await opts.sandbox.writeFiles({
2114
+ destPath,
2115
+ files: [
2116
+ {
2117
+ path: "SKILL.md",
2118
+ content: buildSkillMarkdown(opts.skill)
2119
+ }
2120
+ ]
2121
+ });
2122
+ return destPath;
2123
+ }
2124
+
2125
+ // src/skills/resolve-remote.ts
2126
+ function shellQuote(value) {
2127
+ return `'${value.replace(/'/g, `'\\''`)}'`;
2128
+ }
2129
+ async function stableRepoDirName(skill) {
2130
+ const { createHash } = await import("crypto");
2131
+ const hashInput = `${skill.repo}::${skill.ref ?? "HEAD"}`;
2132
+ const hash = createHash("sha1").update(hashInput).digest("hex").slice(0, 12);
2133
+ return `git-${hash}`;
2134
+ }
2135
+ async function resolveRemoteSkill(opts) {
2136
+ const { posix: pathPosix } = await import("path");
2137
+ const dirName = await stableRepoDirName(opts.skill);
2138
+ const cloneDir = pathPosix.join(".agent", "skills", ".materialized", dirName);
2139
+ const quotedDir = shellQuote(cloneDir);
2140
+ const quotedRepo = shellQuote(opts.skill.repo);
2141
+ const quotedRef = shellQuote(opts.skill.ref ?? "HEAD");
2142
+ const syncCommand = [
2143
+ "set -euo pipefail",
2144
+ `if [ ! -d ${quotedDir}/.git ]; then`,
2145
+ ` rm -rf ${quotedDir}`,
2146
+ ` mkdir -p ${quotedDir}`,
2147
+ ` git clone --depth 1 ${quotedRepo} ${quotedDir}`,
2148
+ "fi",
2149
+ `if [ ${quotedRef} != 'HEAD' ]; then`,
2150
+ ` git -C ${quotedDir} fetch --depth 1 origin ${quotedRef}`,
2151
+ ` git -C ${quotedDir} checkout FETCH_HEAD`,
2152
+ "fi"
2153
+ ].join("\n");
2154
+ const execResult = await opts.sandbox.exec({
2155
+ command: "bash",
2156
+ args: ["-lc", syncCommand]
2157
+ });
2158
+ const { exitCode, stderr } = await execResult.result;
2159
+ if (exitCode !== 0) {
2160
+ throw new Error(
2161
+ `Failed to materialize git skill from ${opts.skill.repo}: ${stderr || "unknown error"}`
2162
+ );
2163
+ }
2164
+ let resolvedDir = cloneDir;
2165
+ if (opts.skill.path) {
2166
+ resolvedDir = pathPosix.join(resolvedDir, opts.skill.path);
2167
+ }
2168
+ if (opts.skill.name) {
2169
+ resolvedDir = pathPosix.join(resolvedDir, opts.skill.name);
2170
+ }
2171
+ return resolvedDir;
2172
+ }
2173
+
2174
+ // src/skills/resolve.ts
2175
+ async function resolveSkillInputsToSandboxDirs(opts) {
2176
+ const baseLog = createLogger({
2177
+ config: { ...opts.agent.options.logging, name: opts.agent.name },
2178
+ subsystem: "skills"
2179
+ });
2180
+ const log2 = opts.sessionId ? baseLog.withContext({ sessionId: opts.sessionId }) : baseLog;
2181
+ const entries = normalizeSkills(opts.skills);
2182
+ const resolved = [];
2183
+ for (const entry of entries) {
2184
+ if (entry.type === "sandbox") {
2185
+ resolved.push(entry.path);
2186
+ continue;
2187
+ }
2188
+ if (entry.type === "host") {
2189
+ resolved.push(
2190
+ await resolveHostSkill({
2191
+ sandbox: opts.sandbox,
2192
+ skill: entry
2193
+ })
2194
+ );
2195
+ continue;
2196
+ }
2197
+ if (entry.type === "git") {
2198
+ resolved.push(
2199
+ await resolveRemoteSkill({
2200
+ sandbox: opts.sandbox,
2201
+ skill: entry
2202
+ })
2203
+ );
2204
+ continue;
2205
+ }
2206
+ if (entry.type === "inline") {
2207
+ resolved.push(
2208
+ await resolveInlineSkill({
2209
+ sandbox: opts.sandbox,
2210
+ skill: entry
2211
+ })
2212
+ );
2213
+ continue;
2214
+ }
2215
+ log2.warn("unknown skill source entry encountered", { entry });
2216
+ }
2217
+ return resolved;
2218
+ }
2219
+
1930
2220
  // src/tools/index.ts
1931
2221
  var import_ai2 = require("ai");
1932
2222
  var import_ulid4 = require("ulid");
@@ -2104,7 +2394,8 @@ async function executeInSandbox({
2104
2394
  abortController,
2105
2395
  sandbox,
2106
2396
  availableTools,
2107
- onSubToolCall
2397
+ onSubToolCall,
2398
+ toolContext
2108
2399
  }) {
2109
2400
  const mkdirResult = await sandbox.exec({
2110
2401
  command: "mkdir",
@@ -2164,20 +2455,19 @@ async function executeInSandbox({
2164
2455
  );
2165
2456
  }
2166
2457
  const exec2 = t.execute.bind(t);
2458
+ const execOptions = {
2459
+ toolCallId: `js_${toolName}_${Date.now()}`,
2460
+ messages: [],
2461
+ experimental_context: toolContext
2462
+ };
2167
2463
  if (onSubToolCall) {
2168
2464
  response = await onSubToolCall(
2169
2465
  toolName,
2170
2466
  input,
2171
- () => exec2(input, {
2172
- toolCallId: `js_${toolName}_${Date.now()}`,
2173
- messages: []
2174
- })
2467
+ () => exec2(input, execOptions)
2175
2468
  );
2176
2469
  } else {
2177
- const result = await exec2(input, {
2178
- toolCallId: `js_${toolName}_${Date.now()}`,
2179
- messages: []
2180
- });
2470
+ const result = await exec2(input, execOptions);
2181
2471
  response = { result };
2182
2472
  }
2183
2473
  } catch (err) {
@@ -2264,8 +2554,8 @@ async function executeInSandbox({
2264
2554
  }
2265
2555
  }
2266
2556
  function createJavaScriptTool(opts) {
2267
- const { session, sandbox, onSubToolCall } = opts;
2268
- const activeSet = session.activeTools ? new Set(session.activeTools) : null;
2557
+ const { sandbox, onSubToolCall } = opts;
2558
+ const activeSet = opts.activeTools ? new Set(opts.activeTools) : null;
2269
2559
  const availableTools = {};
2270
2560
  for (const [name, t] of Object.entries(opts.tools)) {
2271
2561
  if (!activeSet || activeSet.has(name)) {
@@ -2301,7 +2591,8 @@ Important: Each tool returns a structured object matching its output schema \u20
2301
2591
  abortController,
2302
2592
  sandbox,
2303
2593
  availableTools,
2304
- onSubToolCall
2594
+ onSubToolCall,
2595
+ toolContext: opts.toolContext
2305
2596
  });
2306
2597
  }
2307
2598
  });
@@ -2541,7 +2832,7 @@ var builtinToolNames = Object.fromEntries(
2541
2832
  var SKILL_MD_SUFFIX = /\/?SKILL\.md$/;
2542
2833
  function getTools({
2543
2834
  agent: agent2,
2544
- session,
2835
+ sandbox,
2545
2836
  skillsRef,
2546
2837
  writer,
2547
2838
  abortController,
@@ -2549,9 +2840,10 @@ function getTools({
2549
2840
  assistantMessageId,
2550
2841
  sessionId,
2551
2842
  stepLog,
2552
- context
2843
+ context,
2844
+ messages,
2845
+ activeTools
2553
2846
  }) {
2554
- const sandbox = agent2.sandbox(session.sandboxId ?? session.id);
2555
2847
  const rawTools = {
2556
2848
  [builtinToolNames.Read]: (0, import_ai2.tool)({
2557
2849
  ...builtInTools.Read,
@@ -2921,7 +3213,7 @@ function getTools({
2921
3213
  }),
2922
3214
  ...agent2.options.tools
2923
3215
  };
2924
- if (session.skillsDir?.length) {
3216
+ if (skillsRef.current.length > 0) {
2925
3217
  rawTools[builtinToolNames.Skill] = (0, import_ai2.tool)({
2926
3218
  ...builtInTools.Skill,
2927
3219
  execute: async ({ name }) => {
@@ -3053,18 +3345,19 @@ function getTools({
3053
3345
  error: abortController.signal.aborted ? "interrupted" : "Approval timed out"
3054
3346
  };
3055
3347
  };
3348
+ const toolContext = {
3349
+ context,
3350
+ sessionId,
3351
+ sandbox,
3352
+ messages
3353
+ };
3056
3354
  rawTools[builtinToolNames.JavaScript] = createJavaScriptTool({
3057
3355
  tools: rawTools,
3058
- session,
3059
3356
  sandbox,
3060
- onSubToolCall
3357
+ activeTools,
3358
+ onSubToolCall,
3359
+ toolContext
3061
3360
  });
3062
- const toolContext = {
3063
- session,
3064
- sandbox,
3065
- storage: agent2.storage,
3066
- context
3067
- };
3068
3361
  const toolsWithNeedsApproval = Object.fromEntries(
3069
3362
  Object.entries(rawTools).map(([name, t]) => {
3070
3363
  const originalExecute = t.execute;
@@ -3367,7 +3660,6 @@ async function streamText({
3367
3660
  sessionId,
3368
3661
  context,
3369
3662
  createdAt,
3370
- sessionUpdates,
3371
3663
  writable,
3372
3664
  lastPartIndex,
3373
3665
  stepIndexOffset,
@@ -3392,30 +3684,16 @@ async function streamText({
3392
3684
  abortController
3393
3685
  });
3394
3686
  const doneLoad = stepLog.time("load session + messages + parts + sandbox");
3395
- const [, messagesResult, partsResult, { session, sandbox }] = await Promise.all([
3687
+ const [, messagesResult, partsResult, { sandbox }] = await Promise.all([
3396
3688
  firstCheck,
3397
3689
  agent2.storage.message.listBySession(sessionId),
3398
3690
  agent2.storage.part.listBySession(sessionId),
3399
- agent2.storage.session.get(sessionId).then(async (session2) => {
3400
- if (!session2) {
3691
+ agent2.storage.session.get(sessionId).then((session) => {
3692
+ if (!session) {
3401
3693
  throw new SessionNotFoundError({ id: sessionId });
3402
3694
  }
3403
- let pendingUpdate = null;
3404
- if (sessionUpdates) {
3405
- const diff = {};
3406
- for (const [key, value] of Object.entries(sessionUpdates)) {
3407
- if (value !== void 0 && value !== session2[key]) {
3408
- diff[key] = value;
3409
- }
3410
- }
3411
- if (Object.keys(diff).length > 0) {
3412
- Object.assign(session2, diff);
3413
- pendingUpdate = agent2.session(sessionId).update(diff);
3414
- }
3415
- }
3416
- const sandbox2 = agent2.sandbox(session2.sandboxId ?? session2.id);
3417
- await pendingUpdate;
3418
- return { session: session2, sandbox: sandbox2 };
3695
+ const sandbox2 = agent2.sandbox(session.sandboxId ?? session.id);
3696
+ return { sandbox: sandbox2 };
3419
3697
  })
3420
3698
  ]);
3421
3699
  doneLoad();
@@ -3457,8 +3735,32 @@ async function streamText({
3457
3735
  const skillsRef = {
3458
3736
  current: discoveredSkills ?? []
3459
3737
  };
3738
+ let uiMessages = assembleUIMessages({
3739
+ messages: messagesResult,
3740
+ parts: allParts,
3741
+ until: createdAt,
3742
+ includeQueued: true,
3743
+ excludeSubToolParts: true
3744
+ });
3745
+ const resolvableArgs = {
3746
+ context,
3747
+ sessionId,
3748
+ sandbox,
3749
+ get messages() {
3750
+ return uiMessages;
3751
+ }
3752
+ };
3460
3753
  if (lastPartIndex === 0 && !discoveredSkills) {
3461
- const skillsDirs = session.skillsDir?.length ? session.skillsDir : [];
3754
+ const resolvedSkills = await resolveOption(
3755
+ agent2.options.skills,
3756
+ resolvableArgs
3757
+ );
3758
+ const skillsDirs = resolvedSkills?.length ? await resolveSkillInputsToSandboxDirs({
3759
+ agent: agent2,
3760
+ sandbox,
3761
+ skills: resolvedSkills,
3762
+ sessionId
3763
+ }) : [];
3462
3764
  if (skillsDirs.length > 0) {
3463
3765
  const doneSkills = stepLog.time("discover skills", { skillsDirs });
3464
3766
  skillsRef.current = await discoverSkillsInSandbox({
@@ -3475,13 +3777,24 @@ async function streamText({
3475
3777
  let loopFinishReason = "unknown";
3476
3778
  let wasAborted = false;
3477
3779
  const allPendingApprovals = [];
3478
- let currentMaxSteps = session.generation?.maxSteps;
3479
- let currentSession = session;
3780
+ let currentMaxSteps;
3480
3781
  try {
3481
3782
  for (let iteration = 0; iteration < stepThroughput; iteration++) {
3482
- currentMaxSteps = currentSession.generation?.maxSteps;
3483
- if (!currentSession.model) {
3484
- throw new Error("Session model is not set");
3783
+ const resolvedModel = await resolveOption(
3784
+ agent2.options.model,
3785
+ resolvableArgs
3786
+ );
3787
+ const resolvedGeneration = await resolveOption(
3788
+ agent2.options.generation,
3789
+ resolvableArgs
3790
+ );
3791
+ const resolvedActiveTools = await resolveOption(
3792
+ agent2.options.activeTools,
3793
+ resolvableArgs
3794
+ );
3795
+ currentMaxSteps = resolvedGeneration?.maxSteps;
3796
+ if (!resolvedModel) {
3797
+ throw new Error("Agent model is not set");
3485
3798
  }
3486
3799
  const stepParts = [];
3487
3800
  let streamTextFinishReason;
@@ -3490,7 +3803,7 @@ async function streamText({
3490
3803
  execute: async ({ writer }) => {
3491
3804
  const { rawTools, toolsWithNeedsApproval, toolContext } = getTools({
3492
3805
  agent: agent2,
3493
- session,
3806
+ sandbox,
3494
3807
  skillsRef,
3495
3808
  writer,
3496
3809
  abortController,
@@ -3498,7 +3811,9 @@ async function streamText({
3498
3811
  assistantMessageId,
3499
3812
  sessionId,
3500
3813
  stepLog,
3501
- context
3814
+ context,
3815
+ messages: uiMessages,
3816
+ activeTools: resolvedActiveTools
3502
3817
  });
3503
3818
  if (iteration === 0) {
3504
3819
  await processApprovals({
@@ -3521,41 +3836,38 @@ async function streamText({
3521
3836
  const iterResult = (0, import_ai3.streamText)({
3522
3837
  messages: [{ role: "user", content: "." }],
3523
3838
  tools: toolsWithNeedsApproval,
3524
- model: currentSession.model,
3839
+ model: resolvedModel,
3525
3840
  abortSignal: abortController.signal,
3526
3841
  stopWhen: (0, import_ai3.stepCountIs)(1),
3527
- temperature: currentSession.generation?.temperature,
3528
- topK: currentSession.generation?.topK,
3529
- topP: currentSession.generation?.topP,
3530
- frequencyPenalty: currentSession.generation?.frequencyPenalty,
3531
- presencePenalty: currentSession.generation?.presencePenalty,
3532
- maxOutputTokens: currentSession.generation?.maxOutputTokens,
3533
- headers: currentSession.generation?.headers,
3842
+ temperature: resolvedGeneration?.temperature,
3843
+ topK: resolvedGeneration?.topK,
3844
+ topP: resolvedGeneration?.topP,
3845
+ frequencyPenalty: resolvedGeneration?.frequencyPenalty,
3846
+ presencePenalty: resolvedGeneration?.presencePenalty,
3847
+ maxOutputTokens: resolvedGeneration?.maxOutputTokens,
3848
+ headers: resolvedGeneration?.headers,
3534
3849
  experimental_context: {
3535
- session: currentSession,
3850
+ context,
3851
+ sessionId,
3536
3852
  sandbox,
3537
- storage: agent2.storage,
3538
- context
3853
+ messages: uiMessages
3539
3854
  },
3540
3855
  prepareStep: async ({ model }) => {
3541
3856
  const skillsContext = buildSkillsContext(skillsRef.current);
3542
3857
  const cwdPrompt = `Your working directory is ${sandbox.cwd}. All file paths should be absolute.`;
3858
+ const resolvedSystem = await resolveSystem(
3859
+ agent2.options.system,
3860
+ resolvableArgs
3861
+ );
3543
3862
  const systemHeader = joinPromptSections(
3544
3863
  BASE_SYSTEM_PROMPT,
3545
3864
  cwdPrompt,
3546
- currentSession.system
3865
+ resolvedSystem
3547
3866
  );
3548
3867
  const systemContext = joinPromptSections(
3549
3868
  skillsContext,
3550
3869
  cwdPrompt
3551
3870
  );
3552
- const uiMessages = assembleUIMessages({
3553
- messages: messagesResult,
3554
- parts: allParts,
3555
- until: createdAt,
3556
- includeQueued: true,
3557
- excludeSubToolParts: true
3558
- });
3559
3871
  const convertedMessages = await (0, import_ai3.convertToModelMessages)(
3560
3872
  uiMessages,
3561
3873
  { ignoreIncompleteToolCalls: true }
@@ -3570,7 +3882,7 @@ async function streamText({
3570
3882
  sessionId,
3571
3883
  messages: modelMessages
3572
3884
  });
3573
- let activeTools = currentSession.activeTools ?? void 0;
3885
+ let activeTools = resolvedActiveTools ?? void 0;
3574
3886
  if (skillsRef.current.length === 0 && activeTools) {
3575
3887
  activeTools = activeTools.filter(
3576
3888
  (t) => t !== "Skill"
@@ -3586,7 +3898,7 @@ async function streamText({
3586
3898
  if (usage2) {
3587
3899
  usageSteps.push({
3588
3900
  stepIndex: stepIndexOffset + internalStepIndex,
3589
- model: currentSession.model ?? "unknown",
3901
+ model: resolvedModel ?? "unknown",
3590
3902
  inputTokens: usage2.inputTokens ?? 0,
3591
3903
  outputTokens: usage2.outputTokens ?? 0,
3592
3904
  totalTokens: usage2.totalTokens ?? 0,
@@ -3681,17 +3993,15 @@ async function streamText({
3681
3993
  allPendingApprovals.push(...iterPendingApprovals);
3682
3994
  break;
3683
3995
  }
3684
- const [, nextSession] = await Promise.all([
3685
- persistPartsPromise,
3686
- agent2.storage.session.get(sessionId).then((s) => {
3687
- if (!s) {
3688
- throw new SessionNotFoundError({ id: sessionId });
3689
- }
3690
- return s;
3691
- })
3692
- ]);
3996
+ await persistPartsPromise;
3693
3997
  allParts.push(...newPartRecords);
3694
- currentSession = nextSession;
3998
+ uiMessages = assembleUIMessages({
3999
+ messages: messagesResult,
4000
+ parts: allParts,
4001
+ until: createdAt,
4002
+ includeQueued: true,
4003
+ excludeSubToolParts: true
4004
+ });
3695
4005
  }
3696
4006
  } finally {
3697
4007
  pollController.abort();
@@ -3858,6 +4168,22 @@ function createThrottledEmitStatus(agent2) {
3858
4168
  };
3859
4169
  return throttled;
3860
4170
  }
4171
+ async function resolveOption(value, args) {
4172
+ if (value === void 0) {
4173
+ return void 0;
4174
+ }
4175
+ if (typeof value === "function") {
4176
+ return await value(args);
4177
+ }
4178
+ return value;
4179
+ }
4180
+ async function resolveSystem(input, args) {
4181
+ const result = await resolveOption(input, args);
4182
+ if (!result) {
4183
+ return null;
4184
+ }
4185
+ return Array.isArray(result) ? result.filter(Boolean).join("\n") : result;
4186
+ }
3861
4187
  var BASE_SYSTEM_PROMPT = "You are an AI assistant with basic tools to interact with your environment. Explore and work freely.";
3862
4188
  function joinPromptSections(...sections) {
3863
4189
  return sections.filter((s) => s?.trim()).join("\n\n");
@@ -3901,12 +4227,6 @@ function getActiveRuns() {
3901
4227
  return g[ACTIVE_RUNS_KEY];
3902
4228
  }
3903
4229
  async function send(sessionContext, input, opts) {
3904
- const {
3905
- interruptIfStreaming: __,
3906
- context: ___,
3907
- abortSignal: ____,
3908
- ...sessionUpdates
3909
- } = opts ?? {};
3910
4230
  if (opts?.interruptIfStreaming) {
3911
4231
  const lastPart = typeof opts.interruptIfStreaming === "object" ? opts.interruptIfStreaming.lastPart : void 0;
3912
4232
  await interrupt(sessionContext, { lastPart });
@@ -3921,7 +4241,7 @@ async function send(sessionContext, input, opts) {
3921
4241
  try: () => initSessionStep({
3922
4242
  sessionContext,
3923
4243
  sessionId: sessionContext.sessionId,
3924
- sessionUpdates,
4244
+ sandboxId: opts?.sandboxId,
3925
4245
  input
3926
4246
  }),
3927
4247
  catch: (e) => {
@@ -3940,7 +4260,6 @@ async function send(sessionContext, input, opts) {
3940
4260
  assistantMessageId,
3941
4261
  createdAt: assistantMessageCreatedAt,
3942
4262
  context: opts?.context ?? {},
3943
- sessionUpdates,
3944
4263
  lastPartIndex: existingPartCount,
3945
4264
  workflowRunId
3946
4265
  };
@@ -3983,7 +4302,6 @@ async function runLoop({
3983
4302
  assistantMessageId,
3984
4303
  createdAt,
3985
4304
  context,
3986
- sessionUpdates,
3987
4305
  writable,
3988
4306
  lastPartIndex: initialPartIndex
3989
4307
  }) {
@@ -4012,7 +4330,6 @@ async function runLoop({
4012
4330
  sessionId: sessionContext.sessionId,
4013
4331
  context,
4014
4332
  createdAt,
4015
- sessionUpdates,
4016
4333
  writable,
4017
4334
  lastPartIndex,
4018
4335
  stepIndexOffset: usageSteps.length,
@@ -4052,7 +4369,7 @@ async function runLoop({
4052
4369
  async function initSessionStep({
4053
4370
  sessionContext,
4054
4371
  sessionId,
4055
- sessionUpdates,
4372
+ sandboxId,
4056
4373
  input
4057
4374
  }) {
4058
4375
  "use step";
@@ -4108,30 +4425,27 @@ async function initSessionStep({
4108
4425
  interruptedAt: null,
4109
4426
  interruptedLastPart: null,
4110
4427
  usage: null,
4111
- workflowRunId: null
4428
+ workflowRunId: null,
4429
+ metadata: null
4112
4430
  });
4113
4431
  }
4114
4432
  const existingPartCount = reuseAssistant ? newParts.filter((p) => p.messageId === assistantMessageId).length : 0;
4115
4433
  let session = await sessionContext.agent.storage.session.get(sessionId);
4434
+ const now = Date.now();
4116
4435
  if (!session) {
4117
- const defaults = sessionContext.agent.sessionDefaults;
4118
- const skillsDir = sessionUpdates.skillsDir ?? defaults.skillsDir ?? null;
4119
4436
  session = {
4120
4437
  id: sessionId,
4121
- createdAt: Date.now(),
4122
- updatedAt: Date.now(),
4438
+ sandboxId: sandboxId ?? null,
4123
4439
  lastMessageId: null,
4124
- system: sessionUpdates.system ?? defaults.system ?? null,
4125
- model: sessionUpdates.model ?? defaults.model ?? null,
4126
- sandboxId: sessionUpdates.sandboxId ?? null,
4127
- activeTools: sessionUpdates.activeTools ?? defaults.activeTools ?? null,
4128
- generation: sessionUpdates.generation ?? defaults.generation ?? null,
4129
- skillsDir: Array.isArray(skillsDir) ? skillsDir : (
4130
- // biome-ignore lint/style/noNestedTernary: .
4131
- skillsDir ? [skillsDir] : null
4132
- )
4440
+ createdAt: now,
4441
+ updatedAt: now
4133
4442
  };
4134
4443
  await sessionContext.agent.storage.session.set(session.id, session);
4444
+ } else if (sandboxId && sandboxId !== session.sandboxId) {
4445
+ session = { ...session, sandboxId, updatedAt: now };
4446
+ await sessionContext.agent.storage.session.update(session.id, {
4447
+ sandboxId
4448
+ });
4135
4449
  }
4136
4450
  await (0, import_better_all.all)({
4137
4451
  async saveMessages() {
@@ -4301,7 +4615,8 @@ function toMessageAndParts({
4301
4615
  interruptedAt: null,
4302
4616
  interruptedLastPart: null,
4303
4617
  usage: null,
4304
- workflowRunId: null
4618
+ workflowRunId: null,
4619
+ metadata: null
4305
4620
  },
4306
4621
  parts: [
4307
4622
  {
@@ -4326,6 +4641,7 @@ function toMessageAndParts({
4326
4641
  messageId = msg.id;
4327
4642
  }
4328
4643
  const now = Date.now();
4644
+ const metadata = "metadata" in msg && msg.metadata != null ? msg.metadata : null;
4329
4645
  return {
4330
4646
  approvals: [],
4331
4647
  message: {
@@ -4338,7 +4654,8 @@ function toMessageAndParts({
4338
4654
  interruptedLastPart: null,
4339
4655
  usage: null,
4340
4656
  workflowRunId: null,
4341
- role: msg.role ?? defaultRole
4657
+ role: msg.role ?? defaultRole,
4658
+ metadata
4342
4659
  },
4343
4660
  parts: msg.parts.map((part, index) => {
4344
4661
  const ap = part;
@@ -4414,24 +4731,22 @@ var StreamError = class extends errore3.createTaggedError({
4414
4731
 
4415
4732
  // src/session/update.ts
4416
4733
  async function update(sessionContext, opts) {
4417
- const { skillsDir, ...rawUpdates } = opts;
4418
- const normalizedUpdates = Object.fromEntries(
4419
- Object.entries({
4420
- ...rawUpdates,
4421
- ...skillsDir !== void 0 ? { skillsDir: skillsDir ? normalizeSkillsDirs(skillsDir) : null } : {}
4422
- }).filter(([, value]) => value !== void 0)
4734
+ "use step";
4735
+ const updates = Object.fromEntries(
4736
+ Object.entries(opts).filter(([, value]) => value !== void 0)
4423
4737
  );
4424
- if (Object.keys(normalizedUpdates).length === 0) {
4738
+ if (Object.keys(updates).length === 0) {
4425
4739
  return;
4426
4740
  }
4427
4741
  await sessionContext.agent.storage.session.update(sessionContext.sessionId, {
4428
- ...normalizedUpdates,
4742
+ ...updates,
4429
4743
  updatedAt: Date.now()
4430
4744
  });
4431
4745
  }
4432
4746
 
4433
4747
  // src/session/usage.ts
4434
4748
  async function usage(sessionContext) {
4749
+ "use step";
4435
4750
  const messages = await sessionContext.agent.storage.message.listBySession(
4436
4751
  sessionContext.sessionId
4437
4752
  );
@@ -4454,7 +4769,11 @@ function sessionHandle(agent2, id) {
4454
4769
  history: history.bind(null, sessionContext),
4455
4770
  interrupt: interrupt.bind(null, sessionContext),
4456
4771
  usage: usage.bind(null, sessionContext),
4457
- update: update.bind(null, sessionContext)
4772
+ update: update.bind(null, sessionContext),
4773
+ sandbox: lazySandboxHandle(agent2, async () => {
4774
+ const record = await agent2.storage.session.get(sessionId);
4775
+ return record?.sandboxId ?? sessionId;
4776
+ })
4458
4777
  };
4459
4778
  }
4460
4779
 
@@ -4541,6 +4860,131 @@ function toStorage(h) {
4541
4860
  return isStepFunction(h) ? fromStepFunction(h) : fromHandlers(h);
4542
4861
  }
4543
4862
 
4863
+ // src/storage/bindings/kv.ts
4864
+ async function initKvStores(prefix) {
4865
+ const { createKV } = await import("@vercel/kv2");
4866
+ const kv = createKV({ prefix }).getStore("agent/");
4867
+ return {
4868
+ sessions: kv.getStore("session/"),
4869
+ messages: kv.getStore("message/").withIndexes({
4870
+ bySessionId: { key: (m) => m.sessionId }
4871
+ }),
4872
+ parts: kv.getStore("part/").withIndexes({
4873
+ bySessionId: { key: (p) => p.sessionId }
4874
+ }),
4875
+ sandboxes: kv.getStore("sandbox/"),
4876
+ setups: kv.getStore("setup/")
4877
+ };
4878
+ }
4879
+ function kvStorageFallback(opts) {
4880
+ let storesPromise;
4881
+ function getStores() {
4882
+ if (!storesPromise) {
4883
+ storesPromise = initKvStores(opts.prefix);
4884
+ }
4885
+ return storesPromise;
4886
+ }
4887
+ const tag = `[agent.${opts.prefix}][kv2]`;
4888
+ return {
4889
+ "session.get": async ({ id }) => {
4890
+ const { sessions } = await getStores();
4891
+ return await sessions.getValue(id) ?? null;
4892
+ },
4893
+ "session.set": async ({ id, value }) => {
4894
+ const { sessions } = await getStores();
4895
+ await sessions.set(id, value);
4896
+ },
4897
+ "session.update": async ({ id, updates }) => {
4898
+ const { sessions } = await getStores();
4899
+ const existing = await sessions.getValue(id);
4900
+ if (!existing) {
4901
+ throw new Error(
4902
+ `${tag}[session.update] no session found with id "${id}"`
4903
+ );
4904
+ }
4905
+ const updated = { ...existing, ...updates };
4906
+ await sessions.set(id, updated);
4907
+ return updated;
4908
+ },
4909
+ "message.get": async ({ id }) => {
4910
+ const { messages } = await getStores();
4911
+ return await messages.getValue(id) ?? null;
4912
+ },
4913
+ "message.set": async ({ id, value }) => {
4914
+ const { messages } = await getStores();
4915
+ await messages.set(id, value);
4916
+ },
4917
+ "message.update": async ({ id, updates }) => {
4918
+ const { messages } = await getStores();
4919
+ const existing = await messages.getValue(id);
4920
+ if (!existing) {
4921
+ throw new Error(
4922
+ `${tag}[message.update] no message found with id "${id}"`
4923
+ );
4924
+ }
4925
+ const updated = { ...existing, ...updates };
4926
+ await messages.set(id, updated);
4927
+ return updated;
4928
+ },
4929
+ "message.listBySession": async ({ sessionId }) => {
4930
+ const { messages } = await getStores();
4931
+ const result = [];
4932
+ for await (const [, entry] of messages.entries({
4933
+ bySessionId: sessionId
4934
+ })) {
4935
+ result.push(await entry.value);
4936
+ }
4937
+ return result;
4938
+ },
4939
+ "part.get": async ({ id }) => {
4940
+ const { parts } = await getStores();
4941
+ return await parts.getValue(id) ?? null;
4942
+ },
4943
+ "part.set": async ({ id, value }) => {
4944
+ const { parts } = await getStores();
4945
+ await parts.set(id, value);
4946
+ },
4947
+ "part.listBySession": async ({ sessionId }) => {
4948
+ const { parts } = await getStores();
4949
+ const result = [];
4950
+ for await (const [, entry] of parts.entries({
4951
+ bySessionId: sessionId
4952
+ })) {
4953
+ result.push(await entry.value);
4954
+ }
4955
+ return result;
4956
+ },
4957
+ "sandbox.get": async ({ id }) => {
4958
+ const { sandboxes } = await getStores();
4959
+ return await sandboxes.getValue(id) ?? null;
4960
+ },
4961
+ "sandbox.set": async ({ id, value }) => {
4962
+ const { sandboxes } = await getStores();
4963
+ await sandboxes.set(id, value);
4964
+ },
4965
+ "sandbox.update": async ({ id, updates }) => {
4966
+ const { sandboxes } = await getStores();
4967
+ const existing = await sandboxes.getValue(id);
4968
+ if (!existing) {
4969
+ throw new Error(
4970
+ `${tag}[sandbox.update] no sandbox found with id "${id}"`
4971
+ );
4972
+ }
4973
+ const updated = { ...existing, ...updates };
4974
+ await sandboxes.set(id, updated);
4975
+ return updated;
4976
+ },
4977
+ "setup.get": async ({ id }) => {
4978
+ const { setups } = await getStores();
4979
+ return await setups.getValue(id) ?? null;
4980
+ },
4981
+ "setup.set": async ({ id, value }) => {
4982
+ const { setups } = await getStores();
4983
+ await setups.set(id, value);
4984
+ }
4985
+ };
4986
+ }
4987
+
4544
4988
  // src/storage/bindings/local.ts
4545
4989
  var _fs;
4546
4990
  var _path;
@@ -4614,8 +5058,20 @@ async function readAllFromDir(dir) {
4614
5058
  }
4615
5059
  return result;
4616
5060
  }
5061
+ async function ensureGitignore(dir) {
5062
+ const { mkdir, writeFile, readFile: readFile2 } = await fs();
5063
+ const { join } = await path();
5064
+ const gitignorePath = join(dir, ".gitignore");
5065
+ try {
5066
+ await readFile2(gitignorePath, "utf-8");
5067
+ } catch {
5068
+ await mkdir(dir, { recursive: true });
5069
+ await writeFile(gitignorePath, "*\n");
5070
+ }
5071
+ }
4617
5072
  function localStorage(opts) {
4618
5073
  const dir = opts?.dir ?? ".agent";
5074
+ let gitignorePromise = null;
4619
5075
  const sessionStore = createStore(`${dir}/session`);
4620
5076
  const messageStore = createStore(`${dir}/message`);
4621
5077
  const partStore = createStore(`${dir}/part`);
@@ -4623,31 +5079,42 @@ function localStorage(opts) {
4623
5079
  const setupStore = createStore(`${dir}/setup`);
4624
5080
  const messageDir = `${dir}/message`;
4625
5081
  const partDir = `${dir}/part`;
5082
+ function onWrite(fn) {
5083
+ if (!gitignorePromise) {
5084
+ gitignorePromise = ensureGitignore(dir);
5085
+ }
5086
+ return gitignorePromise.then(fn);
5087
+ }
4626
5088
  return {
4627
5089
  "session.get": ({ id }) => sessionStore.get(id),
4628
- "session.set": ({ id, value }) => sessionStore.set(id, value),
4629
- "session.update": ({ id, updates }) => sessionStore.update(id, updates),
5090
+ "session.set": ({ id, value }) => onWrite(() => sessionStore.set(id, value)),
5091
+ "session.update": ({ id, updates }) => onWrite(() => sessionStore.update(id, updates)),
4630
5092
  "message.get": ({ id }) => messageStore.get(id),
4631
- "message.set": ({ id, value }) => messageStore.set(id, value),
4632
- "message.update": ({ id, updates }) => messageStore.update(id, updates),
5093
+ "message.set": ({ id, value }) => onWrite(() => messageStore.set(id, value)),
5094
+ "message.update": ({ id, updates }) => onWrite(() => messageStore.update(id, updates)),
4633
5095
  "message.listBySession": async ({ sessionId }) => {
4634
5096
  const all2 = await readAllFromDir(messageDir);
4635
5097
  return all2.filter((m) => m.sessionId === sessionId);
4636
5098
  },
4637
5099
  "part.get": ({ id }) => partStore.get(id),
4638
- "part.set": ({ id, value }) => partStore.set(id, value),
5100
+ "part.set": ({ id, value }) => onWrite(() => partStore.set(id, value)),
4639
5101
  "part.listBySession": async ({ sessionId }) => {
4640
5102
  const all2 = await readAllFromDir(partDir);
4641
5103
  return all2.filter((p) => p.sessionId === sessionId);
4642
5104
  },
4643
5105
  "sandbox.get": ({ id }) => sandboxStore.get(id),
4644
- "sandbox.set": ({ id, value }) => sandboxStore.set(id, value),
4645
- "sandbox.update": ({ id, updates }) => sandboxStore.update(id, updates),
5106
+ "sandbox.set": ({ id, value }) => onWrite(() => sandboxStore.set(id, value)),
5107
+ "sandbox.update": ({ id, updates }) => onWrite(() => sandboxStore.update(id, updates)),
4646
5108
  "setup.get": ({ id }) => setupStore.get(id),
4647
- "setup.set": ({ id, value }) => setupStore.set(id, value)
5109
+ "setup.set": ({ id, value }) => onWrite(() => setupStore.set(id, value))
4648
5110
  };
4649
5111
  }
4650
5112
 
5113
+ // src/storage/should-fallback-kv2.ts
5114
+ function shouldFallbackToKV2() {
5115
+ return !!process.env.BLOB_READ_WRITE_TOKEN;
5116
+ }
5117
+
4651
5118
  // src/agent/client.ts
4652
5119
  init_logger();
4653
5120
 
@@ -4742,29 +5209,37 @@ var Agent = class {
4742
5209
  static [import_serde2.WORKFLOW_DESERIALIZE](data) {
4743
5210
  return getAgent(data.name, true);
4744
5211
  }
4745
- _storageWarned = false;
5212
+ _resolvedStorage;
4746
5213
  get storage() {
4747
- if (!this.options.storage) {
4748
- if (!this._storageWarned) {
4749
- this._storageWarned = true;
4750
- createLogger({
4751
- config: { ...this.options.logging, name: this.name },
4752
- subsystem: "storage"
4753
- }).warn(
4754
- "No storage adapter configured \u2014 using localStorage(). Data will not persist across restarts."
4755
- );
4756
- }
4757
- return toStorage(localStorage());
5214
+ if (this._resolvedStorage) {
5215
+ return this._resolvedStorage;
5216
+ }
5217
+ if (this.options.storage) {
5218
+ this._resolvedStorage = toStorage(this.options.storage);
5219
+ return this._resolvedStorage;
4758
5220
  }
4759
- return toStorage(this.options.storage);
5221
+ const log2 = createLogger({
5222
+ config: { ...this.options.logging, name: this.name },
5223
+ subsystem: "storage"
5224
+ });
5225
+ if (shouldFallbackToKV2()) {
5226
+ log2.info(
5227
+ `No storage adapter configured \u2014 using KV2 (namespace: "${this.name}").`
5228
+ );
5229
+ this._resolvedStorage = toStorage(
5230
+ kvStorageFallback({ prefix: this.name })
5231
+ );
5232
+ return this._resolvedStorage;
5233
+ }
5234
+ log2.warn(
5235
+ "No storage adapter configured \u2014 using localStorage(). Data will not persist across restarts."
5236
+ );
5237
+ this._resolvedStorage = toStorage(localStorage());
5238
+ return this._resolvedStorage;
4760
5239
  }
4761
5240
  get tools() {
4762
5241
  return { ...builtInTools, ...this.options.tools };
4763
5242
  }
4764
- get sessionDefaults() {
4765
- const { model, system, generation, activeTools, skillsDir } = this.options;
4766
- return { model, system, generation, activeTools, skillsDir };
4767
- }
4768
5243
  get hooks() {
4769
5244
  return this.options.hooks ?? {};
4770
5245
  }
@@ -4788,4 +5263,4 @@ function agent(name, options) {
4788
5263
  agent,
4789
5264
  builtinToolNames
4790
5265
  });
4791
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWxzL2xvZ2dlci50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy92ZXJjZWwtbGlmZWN5Y2xlL3N0ZXBzLnRzIiwgIi4uL3NyYy9zYW5kYm94L2JpbmRpbmdzL3ZlcmNlbC1saWZlY3ljbGUvd29ya2Zsb3cudHMiLCAiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvdmVyY2VsLnRzIiwgIi4uL3NyYy9zYW5kYm94L2JpbmRpbmdzL2RvY2tlci50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy9sb2NhbC50cyIsICIuLi9zcmMvc2FuZGJveC9wcm9jZXNzLW1hbmFnZXIudHMiLCAiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9hZ2VudC9jbGllbnQudHMiLCAiLi4vc3JjL3NhbmRib3gvaGFuZGxlLnRzIiwgIi4uL3NyYy9hZ2VudC9pcy12ZXJjZWwudHMiLCAiLi4vc3JjL2Vycm9ycy50cyIsICIuLi9zcmMvc2FuZGJveC9zZXR1cC50cyIsICIuLi9zcmMvc2FuZGJveC9leGVjLnRzIiwgIi4uL3NyYy9zYW5kYm94L2dldC1kb21haW4udHMiLCAiLi4vc3JjL3NhbmRib3gvZ2V0LXN0YXR1cy50cyIsICIuLi9zcmMvc2FuZGJveC9raWxsLnRzIiwgIi4uL3NyYy9zYW5kYm94L3JlYWQtZmlsZS50cyIsICIuLi9zcmMvc2FuZGJveC9zbmFwc2hvdC50cyIsICIuLi9zcmMvc2FuZGJveC9zdGFydC50cyIsICIuLi9zcmMvc2FuZGJveC9zdG9wLnRzIiwgIi4uL3NyYy9zYW5kYm94L3VwZGF0ZS1uZXR3b3JrLXBvbGljeS50cyIsICIuLi9zcmMvc2FuZGJveC93cml0ZS1maWxlcy50cyIsICIuLi9zcmMvc2Vzc2lvbi9oYW5kbGUudHMiLCAiLi4vc3JjL3V0aWxzL3VpLnRzIiwgIi4uL3NyYy91dGlscy91c2FnZS50cyIsICIuLi9zcmMvc2Vzc2lvbi9oaXN0b3J5LnRzIiwgIi4uL3NyYy9zZXNzaW9uL2ludGVycnVwdC50cyIsICIuLi9zcmMvc2Vzc2lvbi9zZW5kLnRzIiwgIi4uL3NyYy9zZXNzaW9uL2FpLWxvb3Avc3RyZWFtLXRleHQudHMiLCAiLi4vc3JjL3NraWxscy9kaXNjb3Zlci50cyIsICIuLi9zcmMvc2tpbGxzL3BhcnNlci50cyIsICIuLi9zcmMvdG9vbHMvaW5kZXgudHMiLCAiLi4vc3JjL3Rvb2xzL2phdmFzY3JpcHQudHMiLCAiLi4vc3JjL3Rvb2xzL25lZWRzLWFwcHJvdmFsLnRzIiwgIi4uL3NyYy91dGlscy9wcm9tcHQtY2FjaGUudHMiLCAiLi4vc3JjL3Nlc3Npb24vc3RyZWFtLnRzIiwgIi4uL3NyYy9zZXNzaW9uL3VwZGF0ZS50cyIsICIuLi9zcmMvc2Vzc2lvbi91c2FnZS50cyIsICIuLi9zcmMvc3RvcmFnZS9hZGFwdGVyLnRzIiwgIi4uL3NyYy9zdG9yYWdlL2JpbmRpbmdzL2xvY2FsLnRzIiwgIi4uL3NyYy9hZ2VudC9yZWdpc3RyeS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSBcImluZm9cIiB8IFwid2FyblwiIHwgXCJlcnJvclwiIHwgXCJzaWxlbnRcIjtcblxuY29uc3QgTE9HX0xFVkVMX1BSSU9SSVRZOiBSZWNvcmQ8TG9nTGV2ZWwsIG51bWJlcj4gPSB7XG4gIGluZm86IDAsXG4gIHdhcm46IDEsXG4gIGVycm9yOiAyLFxuICBzaWxlbnQ6IDMsXG59O1xuXG5leHBvcnQgdHlwZSBMb2dDb250ZXh0ID0ge1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIG1lc3NhZ2VJZD86IHN0cmluZztcbiAgc2FuZGJveElkPzogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufTtcblxuZXhwb3J0IHR5cGUgTG9nZ2luZ0NvbmZpZyA9IHtcbiAgbGV2ZWw/OiBMb2dMZXZlbDtcbiAgLyoqXG4gICAqIFRvcC1sZXZlbCBsYWJlbCBmb3IgYWxsIGxvZyBsaW5lcy5cbiAgICogQGRlZmF1bHQgXCJhZ2VudFwiXG4gICAqIEBleGFtcGxlIFwibXktYXBwXCIgXHUyMTkyIFtteS1hcHA6ZGVmYXVsdDp3b3JrZmxvd11cbiAgICovXG4gIHByZWZpeD86IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIGdldExldmVsKGNvbmZpZzogTG9nZ2luZ0NvbmZpZyk6IExvZ0xldmVsIHtcbiAgcmV0dXJuIGNvbmZpZy5sZXZlbCA/PyBcIndhcm5cIjtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlZml4KGNvbmZpZzogTG9nZ2luZ0NvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb25maWcucHJlZml4ID8/IFwiYWdlbnRcIjtcbn1cblxuZnVuY3Rpb24gc2hvdWxkTG9nKGNvbmZpZzogTG9nZ2luZ0NvbmZpZywgbGV2ZWw6IExvZ0xldmVsKTogYm9vbGVhbiB7XG4gIHJldHVybiBMT0dfTEVWRUxfUFJJT1JJVFlbbGV2ZWxdID49IExPR19MRVZFTF9QUklPUklUWVtnZXRMZXZlbChjb25maWcpXTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VGFnKGNvbmZpZzogTG9nZ2luZ0NvbmZpZywgc3Vic3lzdGVtOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFske2dldFByZWZpeChjb25maWcpfToke2NvbmZpZy5uYW1lfToke3N1YnN5c3RlbX1dYDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0YShcbiAgY29udGV4dDogTG9nQ29udGV4dCxcbiAgZXh0cmE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICBjb25zdCBtZXJnZWQgPSB7IC4uLmNvbnRleHQsIC4uLmV4dHJhIH07XG4gIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhtZXJnZWQpLmZpbHRlcihcbiAgICAoWywgdl0pID0+IHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsXG4gICk7XG4gIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKTtcbn1cblxuZXhwb3J0IGNsYXNzIExvZ2dlciB7XG4gIHJlYWRvbmx5IHN1YnN5c3RlbTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTG9nZ2luZ0NvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiBMb2dDb250ZXh0O1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBzdWJzeXN0ZW0sXG4gICAgY29uZmlnLFxuICAgIGNvbnRleHQsXG4gIH06IHtcbiAgICBzdWJzeXN0ZW06IHN0cmluZztcbiAgICBjb25maWc6IExvZ2dpbmdDb25maWc7XG4gICAgY29udGV4dD86IExvZ0NvbnRleHQ7XG4gIH0pIHtcbiAgICB0aGlzLnN1YnN5c3RlbSA9IHN1YnN5c3RlbTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0ID8/IHt9O1xuICB9XG5cbiAgY2hpbGQoe1xuICAgIHN1YnN5c3RlbSxcbiAgICBjb250ZXh0LFxuICB9OiB7XG4gICAgc3Vic3lzdGVtPzogc3RyaW5nO1xuICAgIGNvbnRleHQ/OiBMb2dDb250ZXh0O1xuICB9KTogTG9nZ2VyIHtcbiAgICByZXR1cm4gbmV3IExvZ2dlcih7XG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgc3Vic3lzdGVtOiBzdWJzeXN0ZW0gPyBgJHt0aGlzLnN1YnN5c3RlbX06JHtzdWJzeXN0ZW19YCA6IHRoaXMuc3Vic3lzdGVtLFxuICAgICAgY29udGV4dDogeyAuLi50aGlzLmNvbnRleHQsIC4uLmNvbnRleHQgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHdpdGhDb250ZXh0KGNvbnRleHQ6IExvZ0NvbnRleHQpOiBMb2dnZXIge1xuICAgIHJldHVybiBuZXcgTG9nZ2VyKHtcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBzdWJzeXN0ZW06IHRoaXMuc3Vic3lzdGVtLFxuICAgICAgY29udGV4dDogeyAuLi50aGlzLmNvbnRleHQsIC4uLmNvbnRleHQgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGluZm8obWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAoIXNob3VsZExvZyh0aGlzLmNvbmZpZywgXCJpbmZvXCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGQgPSBmb3JtYXREYXRhKHRoaXMuY29udGV4dCwgZGF0YSk7XG4gICAgaWYgKGQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhmb3JtYXRUYWcodGhpcy5jb25maWcsIHRoaXMuc3Vic3lzdGVtKSwgbWVzc2FnZSwgZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhmb3JtYXRUYWcodGhpcy5jb25maWcsIHRoaXMuc3Vic3lzdGVtKSwgbWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGlmICghc2hvdWxkTG9nKHRoaXMuY29uZmlnLCBcIndhcm5cIikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZCA9IGZvcm1hdERhdGEodGhpcy5jb250ZXh0LCBkYXRhKTtcbiAgICBpZiAoZCkge1xuICAgICAgY29uc29sZS53YXJuKGZvcm1hdFRhZyh0aGlzLmNvbmZpZywgdGhpcy5zdWJzeXN0ZW0pLCBtZXNzYWdlLCBkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGZvcm1hdFRhZyh0aGlzLmNvbmZpZywgdGhpcy5zdWJzeXN0ZW0pLCBtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGlmICghc2hvdWxkTG9nKHRoaXMuY29uZmlnLCBcImVycm9yXCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGQgPSBmb3JtYXREYXRhKHRoaXMuY29udGV4dCwgZGF0YSk7XG4gICAgaWYgKGQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0VGFnKHRoaXMuY29uZmlnLCB0aGlzLnN1YnN5c3RlbSksIG1lc3NhZ2UsIGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdFRhZyh0aGlzLmNvbmZpZywgdGhpcy5zdWJzeXN0ZW0pLCBtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCBsb2dzIHRoZSBlbGFwc2VkIHRpbWUgYXQgaW5mbyBsZXZlbC5cbiAgICogUGFzcyBgbG9nT25TdGFydDogdHJ1ZWAgdG8gYWxzbyBsb2cgd2hlbiB0aGUgdGltZXIgYmVnaW5zLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBkb25lID0gbG9nLnRpbWUoXCJzYW5kYm94IHNldHVwXCIsIHsgc2FuZGJveElkIH0sIHsgbG9nT25TdGFydDogdHJ1ZSB9KTtcbiAgICogYXdhaXQgc2V0dXAoKTtcbiAgICogZG9uZSgpOyAvLyBzdGFydDogW2FnZW50OmRlZmF1bHQ6c2FuZGJveF0gc2FuZGJveCBzZXR1cCB7IHNhbmRib3hJZDogJy4uLicgfVxuICAgKiAgICAgICAgIC8vIGVuZDogICBbYWdlbnQ6ZGVmYXVsdDpzYW5kYm94XSBzYW5kYm94IHNldHVwIHsgc2FuZGJveElkOiAnLi4uJywgZHVyYXRpb25NczogMTIzIH1cbiAgICovXG4gIHRpbWUoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBvcHRzPzogeyBsb2dPblN0YXJ0PzogYm9vbGVhbiB9XG4gICk6IChlbmREYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQge1xuICAgIGlmIChvcHRzPy5sb2dPblN0YXJ0KSB7XG4gICAgICB0aGlzLmluZm8oYFtzdGFydF0gJHttZXNzYWdlfWAsIGRhdGEpO1xuICAgIH1cbiAgICBjb25zdCB0MCA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIChlbmREYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgIHRoaXMuaW5mbyhvcHRzPy5sb2dPblN0YXJ0ID8gYFtlbmRdICR7bWVzc2FnZX1gIDogbWVzc2FnZSwge1xuICAgICAgICAuLi5kYXRhLFxuICAgICAgICAuLi5lbmREYXRhLFxuICAgICAgICBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gdDAsXG4gICAgICB9KTtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dnZXIoe1xuICBjb25maWcsXG4gIHN1YnN5c3RlbSxcbiAgY29udGV4dCxcbn06IHtcbiAgY29uZmlnOiBMb2dnaW5nQ29uZmlnO1xuICBzdWJzeXN0ZW06IHN0cmluZztcbiAgY29udGV4dD86IExvZ0NvbnRleHQ7XG59KTogTG9nZ2VyIHtcbiAgcmV0dXJuIG5ldyBMb2dnZXIoeyBjb25maWcsIHN1YnN5c3RlbSwgY29udGV4dCB9KTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNhbmRib3ggYXMgVmVyY2VsU2FuZGJveFNESyB9IGZyb20gXCJAdmVyY2VsL3NhbmRib3hcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9sb2dnZXJcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveEFnZW50UmVmIH0gZnJvbSBcIi4uLy4uL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgVmVyY2VsQmluZGluZ01ldGFkYXRhIH0gZnJvbSBcIi4uL3ZlcmNlbFwiO1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkU2FuZGJveFNESygpOiBQcm9taXNlPHR5cGVvZiBWZXJjZWxTYW5kYm94U0RLPiB7XG4gIHJldHVybiAoYXdhaXQgaW1wb3J0KFwiQHZlcmNlbC9zYW5kYm94XCIpKS5TYW5kYm94O1xufVxuXG5jb25zdCBERUZBVUxUX1BPTExfSU5URVJWQUxfTVMgPSAyICogNjAgKiAxMDAwO1xuY29uc3QgREVGQVVMVF9JRExFX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwO1xuY29uc3QgU05BUFNIT1RfQkVGT1JFX1RJTUVPVVRfTVMgPSAxMCAqIDYwICogMTAwMDtcblxuY29uc3QgZ2V0VGVzdENyZWRlbnRpYWxzID0gKCkgPT5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiXG4gICAgPyB7XG4gICAgICAgIHRva2VuOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9UT0tFTixcbiAgICAgICAgdGVhbUlkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9URUFNX0lELFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1BST0pFQ1RfSUQsXG4gICAgICB9XG4gICAgOiB7fTtcblxuZXhwb3J0IHR5cGUgTGlmZWN5Y2xlU3RlcFJlc3VsdCA9XG4gIHwgeyBhY3Rpb246IFwiY29udGludWVcIjsgbmV4dFBvbGxNczogbnVtYmVyIH1cbiAgfCB7XG4gICAgICBhY3Rpb246IFwiZXhpdFwiO1xuICAgICAgcmVhc29uOiBcInNhbmRib3hJZF9jaGFuZ2VkXCIgfCBcImlkbGVcIiB8IFwidGltZW91dFwiIHwgXCJub3RfZm91bmRcIjtcbiAgICB9O1xuXG5leHBvcnQgdHlwZSBMaWZlY3ljbGVDb25maWcgPSB7XG4gIHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyO1xuICBzdG9wQWZ0ZXJJbmFjdGl2ZU1zPzogbnVtYmVyO1xuICBzbmFwc2hvdEJlZm9yZVRpbWVvdXRNcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIExpZmVjeWNsZUlucHV0ID0ge1xuICBhZ2VudDogU2FuZGJveEFnZW50UmVmO1xuICBzYW5kYm94SWQ6IHN0cmluZztcbiAgdmVyY2VsU2FuZGJveElkOiBzdHJpbmc7XG4gIGNvbmZpZz86IExpZmVjeWNsZUNvbmZpZztcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0FuZFNuYXBzaG90U3RlcChcbiAgaW5wdXQ6IExpZmVjeWNsZUlucHV0XG4pOiBQcm9taXNlPEVycm9yIHwgTGlmZWN5Y2xlU3RlcFJlc3VsdD4ge1xuICBcInVzZSBzdGVwXCI7XG5cbiAgY29uc3Qgc3RvcmFnZSA9IGlucHV0LmFnZW50LnN0b3JhZ2U7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcih7XG4gICAgY29uZmlnOiB7IC4uLmlucHV0LmFnZW50Lm9wdGlvbnMubG9nZ2luZywgbmFtZTogaW5wdXQuYWdlbnQubmFtZSB9LFxuICAgIHN1YnN5c3RlbTogXCJzYW5kYm94OmxpZmVjeWNsZVwiLFxuICAgIGNvbnRleHQ6IHsgc2FuZGJveElkOiBpbnB1dC5zYW5kYm94SWQgfSxcbiAgfSk7XG5cbiAgbG9nLmluZm8oXCJsaWZlY3ljbGUgY2hlY2sgc3RhcnRlZFwiLCB7XG4gICAgdmVyY2VsU2FuZGJveElkOiBpbnB1dC52ZXJjZWxTYW5kYm94SWQsXG4gIH0pO1xuXG4gIGNvbnN0IHJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaW5wdXQuc2FuZGJveElkKTtcbiAgaWYgKCFyZWNvcmQpIHtcbiAgICBsb2cud2FybihcInNhbmRib3ggcmVjb3JkIG5vdCBmb3VuZCwgZXhpdGluZyBsaWZlY3ljbGVcIik7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBjb25zdCBtZXRhZGF0YSA9IHJlY29yZC5zZXR1cD8ubWV0YWRhdGEgYXMgVmVyY2VsQmluZGluZ01ldGFkYXRhIHwgbnVsbDtcbiAgY29uc3QgY3VycmVudFNhbmRib3hJZCA9IG1ldGFkYXRhPy5zYW5kYm94SWQgPz8gbnVsbDtcblxuICBpZiAoY3VycmVudFNhbmRib3hJZCAhPT0gaW5wdXQudmVyY2VsU2FuZGJveElkKSB7XG4gICAgbG9nLmluZm8oXCJzYW5kYm94IElEIGNoYW5nZWQsIGV4aXRpbmcgbGlmZWN5Y2xlXCIsIHtcbiAgICAgIGV4cGVjdGVkOiBpbnB1dC52ZXJjZWxTYW5kYm94SWQsXG4gICAgICBhY3R1YWw6IGN1cnJlbnRTYW5kYm94SWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcInNhbmRib3hJZF9jaGFuZ2VkXCIgfTtcbiAgfVxuXG4gIGlmICghY3VycmVudFNhbmRib3hJZCkge1xuICAgIGxvZy53YXJuKFwibm8gY3VycmVudCBzYW5kYm94IElEIGluIG1ldGFkYXRhLCBleGl0aW5nIGxpZmVjeWNsZVwiKTtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwibm90X2ZvdW5kXCIgfTtcbiAgfVxuXG4gIGNvbnN0IHBvbGxJbnRlcnZhbE1zID1cbiAgICBpbnB1dC5jb25maWc/LnBvbGxJbnRlcnZhbE1zID8/IERFRkFVTFRfUE9MTF9JTlRFUlZBTF9NUztcbiAgY29uc3QgaWRsZVRpbWVvdXRNcyA9XG4gICAgaW5wdXQuY29uZmlnPy5zdG9wQWZ0ZXJJbmFjdGl2ZU1zID8/IERFRkFVTFRfSURMRV9USU1FT1VUX01TO1xuICBjb25zdCBzbmFwc2hvdEJlZm9yZVRpbWVvdXRNcyA9XG4gICAgaW5wdXQuY29uZmlnPy5zbmFwc2hvdEJlZm9yZVRpbWVvdXRNcyA/PyBTTkFQU0hPVF9CRUZPUkVfVElNRU9VVF9NUztcblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBsYXN0QWN0aXZpdHkgPSByZWNvcmQubGFzdEFjdGl2ZUF0ID8/IHJlY29yZC5jcmVhdGVkQXQgPz8gbm93O1xuICBjb25zdCBpZGxlRHVyYXRpb24gPSBub3cgLSBsYXN0QWN0aXZpdHk7XG4gIGNvbnN0IHNob3VsZFNuYXBzaG90RHVlVG9JZGxlID0gaWRsZUR1cmF0aW9uID4gaWRsZVRpbWVvdXRNcztcblxuICBsZXQgc2hvdWxkU25hcHNob3REdWVUb1RpbWVvdXQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBTYW5kYm94U0RLID0gYXdhaXQgbG9hZFNhbmRib3hTREsoKTtcbiAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgU2FuZGJveFNESy5nZXQoe1xuICAgICAgc2FuZGJveElkOiBjdXJyZW50U2FuZGJveElkLFxuICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgfSk7XG4gICAgaWYgKHNhbmRib3gudGltZW91dCA8IHNuYXBzaG90QmVmb3JlVGltZW91dE1zKSB7XG4gICAgICBzaG91bGRTbmFwc2hvdER1ZVRvVGltZW91dCA9IHRydWU7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICBsb2cud2FybihcImZhaWxlZCB0byBnZXQgc2FuZGJveCBmcm9tIFNESywgZXhpdGluZyBsaWZlY3ljbGVcIiwge1xuICAgICAgdmVyY2VsU2FuZGJveElkOiBjdXJyZW50U2FuZGJveElkLFxuICAgIH0pO1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgaWYgKHNob3VsZFNuYXBzaG90RHVlVG9JZGxlIHx8IHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0KSB7XG4gICAgY29uc3QgcmVhc29uID0gc2hvdWxkU25hcHNob3REdWVUb0lkbGUgPyBcImlkbGVcIiA6IFwidGltZW91dFwiO1xuICAgIGxvZy5pbmZvKFwic25hcHNob3R0aW5nIHNhbmRib3ggYmVmb3JlIGV4aXRcIiwge1xuICAgICAgcmVhc29uLFxuICAgICAgaWRsZUR1cmF0aW9uTXM6IGlkbGVEdXJhdGlvbixcbiAgICAgIHZlcmNlbFNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBTYW5kYm94U0RLID0gYXdhaXQgbG9hZFNhbmRib3hTREsoKTtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBTYW5kYm94U0RLLmdldCh7XG4gICAgICAgIHNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgc2FuZGJveC5zbmFwc2hvdCgpO1xuICAgICAgbG9nLmluZm8oXCJzbmFwc2hvdCBjcmVhdGVkXCIsIHsgc25hcHNob3RJZDogc25hcHNob3Quc25hcHNob3RJZCB9KTtcblxuICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnVwZGF0ZShpbnB1dC5zYW5kYm94SWQsIHtcbiAgICAgICAgc2V0dXA6IHtcbiAgICAgICAgICAuLi5yZWNvcmQuc2V0dXAsXG4gICAgICAgICAgbWV0YWRhdGE6IHsgc2FuZGJveElkOiBudWxsLCBzbmFwc2hvdElkOiBzbmFwc2hvdC5zbmFwc2hvdElkIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGxvZy5pbmZvKFwic2FuZGJveCByZWNvcmQgdXBkYXRlZCB3aXRoIHNuYXBzaG90XCIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5lcnJvcihcImZhaWxlZCB0byBzbmFwc2hvdCBzYW5kYm94XCIsIHsgY2F1c2U6IGUgfSk7XG4gICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIEVycm9yID8gZSA6IG5ldyBFcnJvcihTdHJpbmcoZSkpO1xuICAgIH1cbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb24gfTtcbiAgfVxuXG4gIGxvZy5pbmZvKFwic2FuZGJveCBzdGlsbCBhY3RpdmUsIGNvbnRpbnVpbmcgbGlmZWN5Y2xlXCIsIHtcbiAgICBpZGxlRHVyYXRpb25NczogaWRsZUR1cmF0aW9uLFxuICAgIG5leHRQb2xsTXM6IHBvbGxJbnRlcnZhbE1zLFxuICB9KTtcbiAgcmV0dXJuIHsgYWN0aW9uOiBcImNvbnRpbnVlXCIsIG5leHRQb2xsTXM6IHBvbGxJbnRlcnZhbE1zIH07XG59XG4iLCAiaW1wb3J0IHsgc2xlZXAgfSBmcm9tIFwid29ya2Zsb3dcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9sb2dnZXJcIjtcbmltcG9ydCB7IGNoZWNrQW5kU25hcHNob3RTdGVwLCB0eXBlIExpZmVjeWNsZUlucHV0IH0gZnJvbSBcIi4vc3RlcHNcIjtcblxuZXhwb3J0IHR5cGUgeyBMaWZlY3ljbGVJbnB1dCB9O1xuXG5jb25zdCBERUZBVUxUX1BPTExfTVMgPSAyICogNjAgKiAxMDAwO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2FuZGJveExpZmVjeWNsZVdvcmtmbG93KHtcbiAgaW5wdXQsXG59OiB7XG4gIGlucHV0OiBMaWZlY3ljbGVJbnB1dDtcbn0pIHtcbiAgXCJ1c2Ugd29ya2Zsb3dcIjtcblxuICBsZXQgbmV4dFBvbGxNcyA9IGlucHV0LmNvbmZpZz8ucG9sbEludGVydmFsTXMgPz8gREVGQVVMVF9QT0xMX01TO1xuICBjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoe1xuICAgIGNvbmZpZzogeyAuLi5pbnB1dC5hZ2VudC5vcHRpb25zLmxvZ2dpbmcsIG5hbWU6IGlucHV0LmFnZW50Lm5hbWUgfSxcbiAgICBzdWJzeXN0ZW06IFwic2FuZGJveDpsaWZlY3ljbGVcIixcbiAgICBjb250ZXh0OiB7IHNhbmRib3hJZDogaW5wdXQuc2FuZGJveElkIH0sXG4gIH0pO1xuXG4gIGxvZy5pbmZvKFwibGlmZWN5Y2xlIHdvcmtmbG93IHN0YXJ0ZWRcIiwge1xuICAgIHNhbmRib3hJZDogaW5wdXQuc2FuZGJveElkLFxuICAgIHZlcmNlbFNhbmRib3hJZDogaW5wdXQudmVyY2VsU2FuZGJveElkLFxuICAgIHBvbGxNczogbmV4dFBvbGxNcyxcbiAgfSk7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBhd2FpdCBzbGVlcChuZXh0UG9sbE1zKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrQW5kU25hcHNob3RTdGVwKGlucHV0KTtcblxuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgbG9nLmVycm9yKFwibGlmZWN5Y2xlIHN0ZXAgZmFpbGVkXCIsIHtcbiAgICAgICAgc2FuZGJveElkOiBpbnB1dC5zYW5kYm94SWQsXG4gICAgICAgIGVycm9yOiByZXN1bHQubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5hY3Rpb24gPT09IFwiZXhpdFwiKSB7XG4gICAgICBsb2cuaW5mbyhcImxpZmVjeWNsZSB3b3JrZmxvdyBleGl0aW5nXCIsIHtcbiAgICAgICAgc2FuZGJveElkOiBpbnB1dC5zYW5kYm94SWQsXG4gICAgICAgIHJlYXNvbjogcmVzdWx0LnJlYXNvbixcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbmV4dFBvbGxNcyA9IHJlc3VsdC5uZXh0UG9sbE1zO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgc3RhcnQgYXMgc3RhcnRXb3JrZmxvdyB9IGZyb20gXCJ3b3JrZmxvdy9hcGlcIjtcbmltcG9ydCB0eXBlIHsgU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9zdG9yYWdlXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCIuLi8uLi91dGlscy9sb2dnZXJcIjtcbmltcG9ydCB0eXBlIHsgRXhlY1Jlc3VsdCwgU2FuZGJveEJpbmRpbmcsIFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IExpZmVjeWNsZUNvbmZpZyB9IGZyb20gXCIuL3ZlcmNlbC1saWZlY3ljbGUvc3RlcHNcIjtcbmltcG9ydCB7IHNhbmRib3hMaWZlY3ljbGVXb3JrZmxvdyB9IGZyb20gXCIuL3ZlcmNlbC1saWZlY3ljbGUvd29ya2Zsb3dcIjtcblxuYXN5bmMgZnVuY3Rpb24gbG9hZFNhbmRib3hTREsoKSB7XG4gIHJldHVybiAoYXdhaXQgaW1wb3J0KFwiQHZlcmNlbC9zYW5kYm94XCIpKS5TYW5kYm94O1xufVxuXG5jb25zdCBNQVhfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDYwICogMTAwMDsgLy8gNSBob3Vyc1xuY29uc3QgSE9NRV9ESVIgPSBcIi9ob21lL3ZlcmNlbC1zYW5kYm94XCI7XG5jb25zdCBERUZBVUxUX1ZDUFVTID0gMjtcblxuZXhwb3J0IHR5cGUgVmVyY2VsQmluZGluZ0NvbmZpZyA9IHtcbiAgY3dkPzogc3RyaW5nO1xuICByZXNvdXJjZXM/OiB7IHZjcHVzOiBudW1iZXIgfTtcbiAgcG9ydHM/OiBudW1iZXJbXTtcbiAgbmV0d29ya1BvbGljeT86IGltcG9ydChcIkB2ZXJjZWwvc2FuZGJveFwiKS5OZXR3b3JrUG9saWN5O1xuICBzbmFwc2hvdElkPzogc3RyaW5nO1xuICBsaWZlY3ljbGU/OiBMaWZlY3ljbGVDb25maWc7XG59O1xuXG5leHBvcnQgdHlwZSBWZXJjZWxCaW5kaW5nTWV0YWRhdGEgPSB7XG4gIHNhbmRib3hJZDogc3RyaW5nO1xufTtcblxudHlwZSBDcmVhdGVTYW5kYm94T3B0cyA9IHtcbiAgcmVzb3VyY2VzOiB7IHZjcHVzOiBudW1iZXIgfTtcbiAgcG9ydHM/OiBudW1iZXJbXTtcbiAgbmV0d29ya1BvbGljeT86IGltcG9ydChcIkB2ZXJjZWwvc2FuZGJveFwiKS5OZXR3b3JrUG9saWN5O1xuICBzbmFwc2hvdElkPzogc3RyaW5nO1xufTtcblxuZnVuY3Rpb24gaXNTYW5kYm94R29uZUVycm9yKGU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCEoZSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1cyA9XG4gICAgKGUgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyIH0gfSkucmVzcG9uc2U/LnN0YXR1cyA/P1xuICAgIChlIGFzIHsgY2F1c2U/OiB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXIgfSB9IH0pLmNhdXNlPy5yZXNwb25zZVxuICAgICAgPy5zdGF0dXM7XG5cbiAgaWYgKHN0YXR1cyA9PT0gNDEwIHx8IHN0YXR1cyA9PT0gNDIyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBtc2cgPSBlLm1lc3NhZ2UgfHwgU3RyaW5nKGUpO1xuICByZXR1cm4gKFxuICAgIG1zZy5pbmNsdWRlcyhcIkV4cGVjdGVkIGEgc3RyZWFtIG9mIGNvbW1hbmQgZGF0YVwiKSB8fFxuICAgIG1zZy5pbmNsdWRlcyhcIkV4cGVjdGVkIGEgc3RyZWFtIG9mIGxvZ3NcIilcbiAgKTtcbn1cblxuY29uc3QgZ2V0VGVzdENyZWRlbnRpYWxzID0gKCkgPT5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiXG4gICAgPyB7XG4gICAgICAgIHRva2VuOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9UT0tFTixcbiAgICAgICAgdGVhbUlkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9URUFNX0lELFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1BST0pFQ1RfSUQsXG4gICAgICB9XG4gICAgOiB7fTtcblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2RrKHtcbiAgcmVzb3VyY2VzLFxuICBwb3J0cyxcbiAgbmV0d29ya1BvbGljeSxcbiAgc25hcHNob3RJZCxcbn06IENyZWF0ZVNhbmRib3hPcHRzKSB7XG4gIGNvbnN0IFNhbmRib3hTREsgPSBhd2FpdCBsb2FkU2FuZGJveFNESygpO1xuICBjb25zdCBiYXNlID0ge1xuICAgIHJlc291cmNlcyxcbiAgICB0aW1lb3V0OiBNQVhfVElNRU9VVF9NUyxcbiAgICAuLi4ocG9ydHMgPyB7IHBvcnRzIH0gOiB7fSksXG4gICAgLi4uKG5ldHdvcmtQb2xpY3kgPyB7IG5ldHdvcmtQb2xpY3kgfSA6IHt9KSxcbiAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgfTtcblxuICBpZiAoc25hcHNob3RJZCkge1xuICAgIHJldHVybiBTYW5kYm94U0RLLmNyZWF0ZSh7XG4gICAgICAuLi5iYXNlLFxuICAgICAgc291cmNlOiB7IHR5cGU6IFwic25hcHNob3RcIiBhcyBjb25zdCwgc25hcHNob3RJZCB9LFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIFNhbmRib3hTREsuY3JlYXRlKGJhc2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVTZXR1cFNuYXBzaG90KHtcbiAgc2FuZGJveE9wdHMsXG4gIHJ1bixcbiAgc3RvcmFnZSxcbiAgc25hcHNob3RWZXJzaW9uLFxuICBsb2csXG59OiB7XG4gIHNhbmRib3hPcHRzOiBDcmVhdGVTYW5kYm94T3B0cztcbiAgcnVuOiAoc2FuZGJveDogU2FuZGJveEluc3RhbmNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBzdG9yYWdlOiBTdG9yYWdlO1xuICBzbmFwc2hvdFZlcnNpb246IHN0cmluZztcbiAgbG9nOiBMb2dnZXI7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCB0ZW1wU2RrOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVNkaz4+IHwgbnVsbCA9IG51bGw7XG4gIHRyeSB7XG4gICAgdGVtcFNkayA9IGF3YWl0IGNyZWF0ZVNkayhzYW5kYm94T3B0cyk7XG4gICAgY29uc3QgdGVtcEluc3RhbmNlID0gbmV3IFZlcmNlbFNhbmRib3hJbnN0YW5jZSh0ZW1wU2RrKTtcbiAgICBhd2FpdCBydW4odGVtcEluc3RhbmNlKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRlbXBTZGsuc25hcHNob3QoKTtcbiAgICBhd2FpdCBzdG9yYWdlLnNldHVwLnNldChzbmFwc2hvdFZlcnNpb24sIHtcbiAgICAgIHZlcnNpb246IHNuYXBzaG90VmVyc2lvbixcbiAgICAgIHNuYXBzaG90SWQ6IHNuYXBzaG90LnNuYXBzaG90SWQsXG4gICAgICBjcmVhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICBsYXN0VXNlZEF0OiBudWxsLFxuICAgIH0pO1xuICAgIGF3YWl0IHRlbXBTZGsuc3RvcCgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKFwiZmFpbGVkIHRvIGNyZWF0ZSBzZXR1cCBzbmFwc2hvdFwiLCB7XG4gICAgICBzbmFwc2hvdFZlcnNpb24sXG4gICAgICBjYXVzZTogZXJyb3IsXG4gICAgfSk7XG4gICAgaWYgKHRlbXBTZGspIHtcbiAgICAgIGF3YWl0IHRlbXBTZGsuc3RvcCgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFZlcmNlbFNhbmRib3hJbnN0YW5jZSBpbXBsZW1lbnRzIFNhbmRib3hJbnN0YW5jZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2RrOiBpbXBvcnQoXCJAdmVyY2VsL3NhbmRib3hcIikuU2FuZGJveDtcbiAgcmVhZG9ubHkgY3dkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2RrOiBpbXBvcnQoXCJAdmVyY2VsL3NhbmRib3hcIikuU2FuZGJveCwgY3dkPzogc3RyaW5nKSB7XG4gICAgdGhpcy5zZGsgPSBzZGs7XG4gICAgdGhpcy5jd2QgPSBjd2QgPz8gSE9NRV9ESVI7XG4gIH1cblxuICBhc3luYyBleGVjKHtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAgY3dkLFxuICAgIGVudixcbiAgICBzdWRvLFxuICAgIHNpZ25hbCxcbiAgfToge1xuICAgIGNvbW1hbmQ6IHN0cmluZztcbiAgICBhcmdzPzogc3RyaW5nW107XG4gICAgY3dkPzogc3RyaW5nO1xuICAgIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgc3Vkbz86IGJvb2xlYW47XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPEV4ZWNSZXN1bHQ+IHtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLnNkay5ydW5Db21tYW5kKHtcbiAgICAgIGNtZDogY29tbWFuZCxcbiAgICAgIGFyZ3MsXG4gICAgICBjd2Q6IGN3ZCA/PyB0aGlzLmN3ZCxcbiAgICAgIGVudixcbiAgICAgIHN1ZG8sXG4gICAgICBzaWduYWwsXG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGxldCBzdGRvdXQgPSBcIlwiO1xuICAgIGxldCBzdGRlcnIgPSBcIlwiO1xuICAgIGNvbnN0IGxvZ0J1ZmZlcjogeyBzdHJlYW06IFwic3Rkb3V0XCIgfCBcInN0ZGVyclwiOyBkYXRhOiBzdHJpbmcgfVtdID0gW107XG4gICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICByZXNvbHZlOiBudWxsIGFzICgoKSA9PiB2b2lkKSB8IG51bGwsXG4gICAgICBjb25zdW1lZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGNvbnN0IGNvbnN1bWVMb2dzID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgZW50cnkgb2Ygb3V0cHV0LmxvZ3MoKSkge1xuICAgICAgICAgIGlmIChlbnRyeS5zdHJlYW0gPT09IFwic3Rkb3V0XCIpIHtcbiAgICAgICAgICAgIHN0ZG91dCArPSBlbnRyeS5kYXRhO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGRlcnIgKz0gZW50cnkuZGF0YTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsb2dCdWZmZXIucHVzaChlbnRyeSk7XG4gICAgICAgICAgc3RhdGUucmVzb2x2ZT8uKCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBTYW5kYm94IG1heSBoYXZlIGJlZW4gc3RvcHBlZCBcdTIwMTQgbG9ncyBlbmRwb2ludCByZXR1cm5zIDQyMlxuICAgICAgfVxuICAgICAgc3RhdGUuY29uc3VtZWQgPSB0cnVlO1xuICAgICAgc3RhdGUucmVzb2x2ZT8uKCk7XG4gICAgfSkoKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uKiBsb2dzKCk6IEFzeW5jSXRlcmFibGU8e1xuICAgICAgc3RyZWFtOiBcInN0ZG91dFwiIHwgXCJzdGRlcnJcIjtcbiAgICAgIGRhdGE6IHN0cmluZztcbiAgICB9PiB7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgd2hpbGUgKCFzdGF0ZS5jb25zdW1lZCB8fCBpbmRleCA8IGxvZ0J1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGluZGV4IDwgbG9nQnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgIHlpZWxkIGxvZ0J1ZmZlcltpbmRleCsrXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocikgPT4ge1xuICAgICAgICAgICAgc3RhdGUucmVzb2x2ZSA9IHI7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3RhdGUucmVzb2x2ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb25zdW1lTG9ncy50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpbmlzaGVkID0gYXdhaXQgb3V0cHV0LndhaXQoKTtcbiAgICAgICAgcmV0dXJuIHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlOiBmaW5pc2hlZC5leGl0Q29kZSB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaXNTYW5kYm94R29uZUVycm9yKGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlOiAxIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7IGNvbW1hbmRJZDogb3V0cHV0LmNtZElkLCBsb2dzLCByZXN1bHQgfTtcbiAgfVxuXG4gIGFzeW5jIHJlYWRGaWxlKHtcbiAgICBwYXRoOiBmaWxlUGF0aCxcbiAgfToge1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZGsucmVhZEZpbGVUb0J1ZmZlcih7IHBhdGg6IGZpbGVQYXRoLCBjd2Q6IHRoaXMuY3dkIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgd3JpdGVGaWxlcyh7XG4gICAgZmlsZXMsXG4gICAgZGVzdFBhdGgsXG4gIH06IHtcbiAgICBmaWxlczogeyBwYXRoOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB8IEJ1ZmZlciB9W107XG4gICAgZGVzdFBhdGg6IHN0cmluZztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuICAgIGNvbnN0IG5hdGl2ZUZpbGVzID0gZmlsZXMubWFwKChmaWxlKSA9PiB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucG9zaXguam9pbihkZXN0UGF0aCwgZmlsZS5wYXRoKTtcbiAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucG9zaXguaXNBYnNvbHV0ZShmaWxlUGF0aClcbiAgICAgICAgPyBmaWxlUGF0aFxuICAgICAgICA6IHBhdGgucG9zaXguam9pbih0aGlzLmN3ZCwgZmlsZVBhdGgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aDogYWJzb2x1dGVQYXRoLFxuICAgICAgICBjb250ZW50OlxuICAgICAgICAgIHR5cGVvZiBmaWxlLmNvbnRlbnQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gQnVmZmVyLmZyb20oZmlsZS5jb250ZW50KVxuICAgICAgICAgICAgOiBmaWxlLmNvbnRlbnQsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5zZGsud3JpdGVGaWxlcyhuYXRpdmVGaWxlcyk7XG5cbiAgICBjb25zdCBzaGVsbFNjcmlwdHMgPSBuYXRpdmVGaWxlcy5maWx0ZXIoKGYpID0+IGYucGF0aC5lbmRzV2l0aChcIi5zaFwiKSk7XG4gICAgaWYgKHNoZWxsU2NyaXB0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWMoe1xuICAgICAgICBjb21tYW5kOiBcImNobW9kXCIsXG4gICAgICAgIGFyZ3M6IFtcIit4XCIsIC4uLnNoZWxsU2NyaXB0cy5tYXAoKGYpID0+IGYucGF0aCldLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCByZXN1bHQucmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlQXdhaXQ6IHN5bmNocm9ub3VzIFNESyBjYWxsXG4gIGFzeW5jIGdldERvbWFpbih7XG4gICAgcG9ydCxcbiAgfToge1xuICAgIHBvcnQ6IG51bWJlcjtcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuc2RrLmRvbWFpbihwb3J0KTtcbiAgfVxuXG4gIGFzeW5jIGtpbGwoe1xuICAgIGNvbW1hbmRJZCxcbiAgfToge1xuICAgIGNvbW1hbmRJZDogc3RyaW5nO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY21kID0gYXdhaXQgdGhpcy5zZGsuZ2V0Q29tbWFuZChjb21tYW5kSWQpO1xuICAgIGF3YWl0IGNtZC5raWxsKCk7XG4gIH1cblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL3VzZUF3YWl0OiBzeW5jaHJvbm91cyBTREsgZ2V0dGVyXG4gIGFzeW5jIGdldFN0YXR1cygpOiBQcm9taXNlPFxuICAgIFwicGVuZGluZ1wiIHwgXCJydW5uaW5nXCIgfCBcInN0b3BwaW5nXCIgfCBcInN0b3BwZWRcIiB8IFwiZmFpbGVkXCJcbiAgPiB7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5zZGsuc3RhdHVzO1xuICAgIC8vIE1hcCBTREstb25seSBzdGF0dXNlcyB0byBvdXIgaW50ZXJmYWNlJ3MgdW5pb25cbiAgICBpZiAoc3RhdHVzID09PSBcInNuYXBzaG90dGluZ1wiKSB7XG4gICAgICByZXR1cm4gXCJzdG9wcGluZ1wiO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSBcImFib3J0ZWRcIikge1xuICAgICAgcmV0dXJuIFwiZmFpbGVkXCI7XG4gICAgfVxuICAgIHJldHVybiBzdGF0dXM7XG4gIH1cblxuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBUaGUgVmVyY2VsIFNESyBkb2Vzbid0IGhhdmUgYSByZXN1bWUgbWV0aG9kLlxuICAgIC8vIFJ1biBhIG5vLW9wIGNvbW1hbmQgdG8gdmVyaWZ5IHRoZSBzYW5kYm94IGlzIHJlYWNoYWJsZS5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWMoeyBjb21tYW5kOiBcInRydWVcIiB9KTtcbiAgICBhd2FpdCByZXN1bHQucmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNkay5zdG9wKCk7XG4gIH1cblxuICBhc3luYyBzbmFwc2hvdCgpOiBQcm9taXNlPHsgc25hcHNob3RJZDogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBzbmFwID0gYXdhaXQgdGhpcy5zZGsuc25hcHNob3QoKTtcbiAgICByZXR1cm4geyBzbmFwc2hvdElkOiBzbmFwLnNuYXBzaG90SWQgfTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZU5ldHdvcmtQb2xpY3koe1xuICAgIHBvbGljeSxcbiAgfToge1xuICAgIHBvbGljeTogaW1wb3J0KFwiQHZlcmNlbC9zYW5kYm94XCIpLk5ldHdvcmtQb2xpY3k7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPGltcG9ydChcIkB2ZXJjZWwvc2FuZGJveFwiKS5OZXR3b3JrUG9saWN5PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2RrLnVwZGF0ZU5ldHdvcmtQb2xpY3kocG9saWN5KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmVyY2VsU2FuZGJveCgpOiBTYW5kYm94QmluZGluZzxcbiAgXCJ2ZXJjZWxcIixcbiAgVmVyY2VsQmluZGluZ0NvbmZpZyxcbiAgVmVyY2VsQmluZGluZ01ldGFkYXRhXG4+IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcInZlcmNlbFwiLFxuICAgIGFzeW5jIGNyZWF0ZSh7IGFnZW50LCBzZXR1cCwgcmVjb3JkLCBzaWduYWw6IF9zaWduYWwsIGxvZyB9KSB7XG4gICAgICBjb25zdCBzdG9yYWdlID0gYWdlbnQuc3RvcmFnZTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHNldHVwLmNvbmZpZyA/PyB7fTtcbiAgICAgIGNvbnN0IGN3ZCA9IGNvbmZpZy5jd2Q7XG4gICAgICBjb25zdCByZXNvdXJjZXMgPSBjb25maWcucmVzb3VyY2VzID8/IHsgdmNwdXM6IERFRkFVTFRfVkNQVVMgfTtcbiAgICAgIGNvbnN0IHBvcnRzID0gY29uZmlnLnBvcnRzO1xuICAgICAgY29uc3QgbmV0d29ya1BvbGljeSA9XG4gICAgICAgIGNvbmZpZy5uZXR3b3JrUG9saWN5ID8/IHNldHVwLm5ldHdvcmtQb2xpY3kgPz8gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBzYW5kYm94T3B0czogQ3JlYXRlU2FuZGJveE9wdHMgPSB7XG4gICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgcG9ydHMsXG4gICAgICAgIG5ldHdvcmtQb2xpY3ksXG4gICAgICAgIHNuYXBzaG90SWQ6IGNvbmZpZy5zbmFwc2hvdElkLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgX3N0YXJ0TGlmZWN5Y2xlID0gKHZlcmNlbFNhbmRib3hJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICghcmVjb3JkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0V29ya2Zsb3coc2FuZGJveExpZmVjeWNsZVdvcmtmbG93LCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgICAgYWdlbnQsXG4gICAgICAgICAgICAgIHNhbmRib3hJZDogcmVjb3JkLmlkLFxuICAgICAgICAgICAgICB2ZXJjZWxTYW5kYm94SWQsXG4gICAgICAgICAgICAgIGNvbmZpZzogY29uZmlnLmxpZmVjeWNsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICBsb2cuZXJyb3IoXCJmYWlsZWQgdG8gc3RhcnQgbGlmZWN5Y2xlIHdvcmtmbG93XCIsIHsgY2F1c2U6IGUgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgaWYgKHNldHVwLnZlcnNpb24pIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNldHVwLmdldChzZXR1cC52ZXJzaW9uKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nPy5zbmFwc2hvdElkKSB7XG4gICAgICAgICAgY29uc3Qgc2RrID0gYXdhaXQgY3JlYXRlU2RrKHtcbiAgICAgICAgICAgIC4uLnNhbmRib3hPcHRzLFxuICAgICAgICAgICAgc25hcHNob3RJZDogZXhpc3Rpbmcuc25hcHNob3RJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBWZXJjZWxTYW5kYm94SW5zdGFuY2Uoc2RrLCBjd2QpO1xuXG4gICAgICAgICAgc3RvcmFnZS5zZXR1cFxuICAgICAgICAgICAgLnNldChzZXR1cC52ZXJzaW9uLCB7XG4gICAgICAgICAgICAgIC4uLmV4aXN0aW5nLFxuICAgICAgICAgICAgICB2ZXJzaW9uOiBzZXR1cC52ZXJzaW9uLFxuICAgICAgICAgICAgICBsYXN0VXNlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHsgc2FuZGJveElkOiBzZGsuc2FuZGJveElkIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2V0dXAucnVuKSB7XG4gICAgICAgIGlmICghc2V0dXAudmVyc2lvbikge1xuICAgICAgICAgIGxvZy5lcnJvcihcInNldHVwLnJ1biBwcm92aWRlZCB3aXRob3V0IHNldHVwLnZlcnNpb25cIiwgeyBzZXR1cCB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXR1cC5ydW4gcHJvdmlkZWQgd2l0aG91dCBzZXR1cC52ZXJzaW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNyZWF0ZVNldHVwU25hcHNob3Qoe1xuICAgICAgICAgIHNhbmRib3hPcHRzLFxuICAgICAgICAgIHJ1bjogc2V0dXAucnVuLFxuICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgc25hcHNob3RWZXJzaW9uOiBzZXR1cC52ZXJzaW9uLFxuICAgICAgICAgIGxvZyxcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgbG9nLmVycm9yKFwiYmFja2dyb3VuZCBzZXR1cCBzbmFwc2hvdCBmYWlsZWRcIiwgeyBjYXVzZTogZXJyb3IgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNkayA9IGF3YWl0IGNyZWF0ZVNkayhzYW5kYm94T3B0cyk7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFZlcmNlbFNhbmRib3hJbnN0YW5jZShzZGssIGN3ZCk7XG4gICAgICAgIGF3YWl0IHNldHVwLnJ1bihpbnN0YW5jZSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICBtZXRhZGF0YTogeyBzYW5kYm94SWQ6IHNkay5zYW5kYm94SWQgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2RrID0gYXdhaXQgY3JlYXRlU2RrKHNhbmRib3hPcHRzKTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFZlcmNlbFNhbmRib3hJbnN0YW5jZShzZGssIGN3ZCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBtZXRhZGF0YTogeyBzYW5kYm94SWQ6IHNkay5zYW5kYm94SWQgfSxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIGFzeW5jIGNvbm5lY3QoeyBtZXRhZGF0YSB9KSB7XG4gICAgICBjb25zdCBTYW5kYm94U0RLID0gYXdhaXQgbG9hZFNhbmRib3hTREsoKTtcbiAgICAgIGNvbnN0IHNkayA9IGF3YWl0IFNhbmRib3hTREsuZ2V0KHtcbiAgICAgICAgc2FuZGJveElkOiBtZXRhZGF0YS5zYW5kYm94SWQsXG4gICAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IFZlcmNlbFNhbmRib3hJbnN0YW5jZShzZGspO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgdHlwZSB7IEV4ZWNSZXN1bHQsIFNhbmRib3hCaW5kaW5nLCBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuXG5leHBvcnQgdHlwZSBEb2NrZXJCaW5kaW5nQ29uZmlnID0ge1xuICBjd2Q/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEb2NrZXJCaW5kaW5nTWV0YWRhdGEgPSB7XG4gIHNhbmRib3hOYW1lOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFJ1biBhIGBkb2NrZXIgc2FuZGJveGAgQ0xJIGNvbW1hbmQgYW5kIHJldHVybiBpdHMgb3V0cHV0LlxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjRG9ja2VyKFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgb3B0cz86IHsgdGltZW91dE1zPzogbnVtYmVyOyBzaWduYWw/OiBBYm9ydFNpZ25hbCB9XG4pOiBQcm9taXNlPHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nOyBleGl0Q29kZTogbnVtYmVyIH0+IHtcbiAgY29uc3QgeyBzcGF3biB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oXCJkb2NrZXJcIiwgW1wic2FuZGJveFwiLCAuLi5hcmdzXSwge1xuICAgICAgc2lnbmFsOiBvcHRzPy5zaWduYWwsXG4gICAgfSk7XG5cbiAgICBsZXQgc3Rkb3V0ID0gXCJcIjtcbiAgICBsZXQgc3RkZXJyID0gXCJcIjtcblxuICAgIGNoaWxkLnN0ZG91dC5vbihcImRhdGFcIiwgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgc3Rkb3V0ICs9IGRhdGEudG9TdHJpbmcoKTtcbiAgICB9KTtcbiAgICBjaGlsZC5zdGRlcnIub24oXCJkYXRhXCIsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgIHN0ZGVyciArPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0aW1lb3V0SWQgPSBvcHRzPy50aW1lb3V0TXNcbiAgICAgID8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY2hpbGQua2lsbChcIlNJR1RFUk1cIik7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgZG9ja2VyIHNhbmRib3ggJHthcmdzWzBdfSB0aW1lZCBvdXRgKSk7XG4gICAgICAgIH0sIG9wdHMudGltZW91dE1zKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgIGlmICh0aW1lb3V0SWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICB9XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGUpID0+IHtcbiAgICAgIGlmICh0aW1lb3V0SWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlOiBjb2RlID8/IDAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRyYWNrIHdoaWNoIHNhbmRib3hlcyBoYXZlIGJlZW4gdmVyaWZpZWQgdG8gZXhpc3QgaW4gdGhpcyBwcm9jZXNzLlxuICogTWFwcyBzYW5kYm94IG5hbWUgLT4gUHJvbWlzZSBzbyBjb25jdXJyZW50IGNhbGxlcnMgd2FpdCBvbiB0aGUgc2FtZSBjaGVjay5cbiAqL1xuY29uc3QgZW5zdXJlUHJvbWlzZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKTtcblxuLyoqXG4gKiBTYW5kYm94ZXMgdGhhdCB0aGlzIHByb2Nlc3MgaGFzIHVzZWQuIFN0b3BwZWQgb24gcHJvY2VzcyBleGl0LlxuICovXG5jb25zdCBhY3RpdmVTYW5kYm94ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxubGV0IGNsZWFudXBSZWdpc3RlcmVkID0gZmFsc2U7XG5sZXQgX2V4ZWNTeW5jOiB0eXBlb2YgaW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLmV4ZWNTeW5jIHwgbnVsbCA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZ2lzdGVyQ2xlYW51cCgpIHtcbiAgaWYgKGNsZWFudXBSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNsZWFudXBSZWdpc3RlcmVkID0gdHJ1ZTtcblxuICAvLyBQcmUtbG9hZCBleGVjU3luYyBzbyB0aGUgc3luY2hyb25vdXMgZXhpdCBoYW5kbGVyIGNhbiB1c2UgaXQuXG4gIGNvbnN0IGNwID0gYXdhaXQgaW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpO1xuICBfZXhlY1N5bmMgPSBjcC5leGVjU3luYztcblxuICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgIGlmICghX2V4ZWNTeW5jKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgbmFtZSBvZiBBcnJheS5mcm9tKGFjdGl2ZVNhbmRib3hlcykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIF9leGVjU3luYyhgZG9ja2VyIHNhbmRib3ggc3RvcCAke25hbWV9YCwge1xuICAgICAgICAgIHRpbWVvdXQ6IDEwXzAwMCxcbiAgICAgICAgICBzdGRpbzogXCJwaXBlXCIsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEJlc3QtZWZmb3J0IFx1MjAxNCBzYW5kYm94IG1heSBhbHJlYWR5IGJlIHN0b3BwZWRcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcHJvY2Vzcy5vbihcImV4aXRcIiwgY2xlYW51cCk7XG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4ge1xuICAgIGNsZWFudXAoKTtcbiAgICBwcm9jZXNzLmV4aXQoMTMwKTtcbiAgfSk7XG4gIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsICgpID0+IHtcbiAgICBjbGVhbnVwKCk7XG4gICAgcHJvY2Vzcy5leGl0KDE0Myk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEVuc3VyZSBhIERvY2tlciBzYW5kYm94IGV4aXN0cyBmb3IgdGhlIGdpdmVuIG5hbWUuXG4gKiBJZiBpdCBhbHJlYWR5IGV4aXN0cyAoZnJvbSBhIHByZXZpb3VzIHByb2Nlc3MpLCByZXVzZXMgaXQuXG4gKiBJZiBpdCBkb2Vzbid0IGV4aXN0LCBjcmVhdGVzIGl0LlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVTYW5kYm94KHNhbmRib3hOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXhpc3RpbmcgPSBlbnN1cmVQcm9taXNlcy5nZXQoc2FuZGJveE5hbWUpO1xuICBpZiAoZXhpc3RpbmcpIHtcbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cblxuICBjb25zdCBwcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBscyA9IGF3YWl0IGV4ZWNEb2NrZXIoW1wibHNcIiwgXCItcVwiXSwgeyB0aW1lb3V0TXM6IDEwXzAwMCB9KTtcbiAgICBjb25zdCBleGlzdGluZ05hbWVzID1cbiAgICAgIGxzLmV4aXRDb2RlID09PSAwXG4gICAgICAgID8gbHMuc3Rkb3V0XG4gICAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAgIC5tYXAoKHMpID0+IHMudHJpbSgpKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICA6IFtdO1xuXG4gICAgaWYgKGV4aXN0aW5nTmFtZXMuaW5jbHVkZXMoc2FuZGJveE5hbWUpKSB7XG4gICAgICBhY3RpdmVTYW5kYm94ZXMuYWRkKHNhbmRib3hOYW1lKTtcbiAgICAgIHJlZ2lzdGVyQ2xlYW51cCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBhd2FpdCBpbXBvcnQoXCJub2RlOnBhdGhcIik7XG4gICAgY29uc3Qgb3MgPSBhd2FpdCBpbXBvcnQoXCJub2RlOm9zXCIpO1xuICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcblxuICAgIGNvbnN0IHdvcmtzcGFjZURpciA9IHBhdGguam9pbihcbiAgICAgIG9zLnRtcGRpcigpLFxuICAgICAgXCJhZ2VudC1kb2NrZXItc2FuZGJveFwiLFxuICAgICAgc2FuZGJveE5hbWVcbiAgICApO1xuICAgIGF3YWl0IGZzLm1rZGlyKHdvcmtzcGFjZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCBjcmVhdGUgPSBhd2FpdCBleGVjRG9ja2VyKFxuICAgICAgW1wiY3JlYXRlXCIsIFwiLS1uYW1lXCIsIHNhbmRib3hOYW1lLCBcInNoZWxsXCIsIHdvcmtzcGFjZURpcl0sXG4gICAgICB7IHRpbWVvdXRNczogNjBfMDAwIH1cbiAgICApO1xuXG4gICAgaWYgKGNyZWF0ZS5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgaWYgKGNyZWF0ZS5zdGRlcnIuaW5jbHVkZXMoXCJhbHJlYWR5IGV4aXN0c1wiKSkge1xuICAgICAgICBhY3RpdmVTYW5kYm94ZXMuYWRkKHNhbmRib3hOYW1lKTtcbiAgICAgICAgcmVnaXN0ZXJDbGVhbnVwKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgZG9ja2VyIHNhbmRib3ggXCIke3NhbmRib3hOYW1lfVwiOiAke2NyZWF0ZS5zdGRlcnJ9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBhY3RpdmVTYW5kYm94ZXMuYWRkKHNhbmRib3hOYW1lKTtcbiAgICByZWdpc3RlckNsZWFudXAoKTtcbiAgfSkoKTtcblxuICBlbnN1cmVQcm9taXNlcy5zZXQoc2FuZGJveE5hbWUsIHByb21pc2UpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgcHJvbWlzZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGVuc3VyZVByb21pc2VzLmRlbGV0ZShzYW5kYm94TmFtZSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufVxuXG5jb25zdCBERUZBVUxUX0RPQ0tFUl9DV0QgPSBcIi9ob21lL2FnZW50L3dvcmtzcGFjZVwiO1xuXG5jbGFzcyBEb2NrZXJTYW5kYm94SW5zdGFuY2UgaW1wbGVtZW50cyBTYW5kYm94SW5zdGFuY2Uge1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzYW5kYm94TmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb2Nlc3NlcyA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIGltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKS5DaGlsZFByb2Nlc3NcbiAgPigpO1xuXG4gIGNvbnN0cnVjdG9yKHNhbmRib3hOYW1lOiBzdHJpbmcsIGN3ZD86IHN0cmluZykge1xuICAgIHRoaXMuc2FuZGJveE5hbWUgPSBzYW5kYm94TmFtZTtcbiAgICB0aGlzLmN3ZCA9IGN3ZCA/PyBERUZBVUxUX0RPQ0tFUl9DV0Q7XG4gIH1cblxuICBhc3luYyBleGVjKG9wdHM6IHtcbiAgICBjb21tYW5kOiBzdHJpbmc7XG4gICAgYXJncz86IHN0cmluZ1tdO1xuICAgIGN3ZD86IHN0cmluZztcbiAgICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHN1ZG8/OiBib29sZWFuO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxFeGVjUmVzdWx0PiB7XG4gICAgYXdhaXQgZW5zdXJlU2FuZGJveCh0aGlzLnNhbmRib3hOYW1lKTtcblxuICAgIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKTtcbiAgICBjb25zdCBjb21tYW5kSWQgPSBgY29tbWFuZF8ke3VsaWQoKX1gO1xuICAgIGNvbnN0IGVudkZsYWdzID0gb3B0cy5lbnZcbiAgICAgID8gT2JqZWN0LmVudHJpZXMob3B0cy5lbnYpLmZsYXRNYXAoKFtrLCB2XSkgPT4gW1wiLWVcIiwgYCR7a309JHt2fWBdKVxuICAgICAgOiBbXTtcbiAgICBjb25zdCBjd2RGbGFncyA9IG9wdHMuY3dkID8gW1wiLXdcIiwgb3B0cy5jd2RdIDogW107XG4gICAgY29uc3QgYmFzZUNtZCA9IG9wdHMuc3Vkb1xuICAgICAgPyBbXCJzdWRvXCIsIG9wdHMuY29tbWFuZCwgLi4uKG9wdHMuYXJncyA/PyBbXSldXG4gICAgICA6IG9wdHMuYXJnc1xuICAgICAgICA/IFtvcHRzLmNvbW1hbmQsIC4uLm9wdHMuYXJnc11cbiAgICAgICAgOiBbb3B0cy5jb21tYW5kXTtcbiAgICBjb25zdCBmdWxsQ21kID0gYmFzZUNtZDtcblxuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oXG4gICAgICBcImRvY2tlclwiLFxuICAgICAgW1xuICAgICAgICBcInNhbmRib3hcIixcbiAgICAgICAgXCJleGVjXCIsXG4gICAgICAgIC4uLmVudkZsYWdzLFxuICAgICAgICAuLi5jd2RGbGFncyxcbiAgICAgICAgdGhpcy5zYW5kYm94TmFtZSxcbiAgICAgICAgLi4uZnVsbENtZCxcbiAgICAgIF0sXG4gICAgICB7IHNpZ25hbDogb3B0cy5zaWduYWwgfVxuICAgICk7XG5cbiAgICB0aGlzLnByb2Nlc3Nlcy5zZXQoY29tbWFuZElkLCBjaGlsZCk7XG5cbiAgICBsZXQgc3Rkb3V0ID0gXCJcIjtcbiAgICBsZXQgc3RkZXJyID0gXCJcIjtcbiAgICBjb25zdCBsb2dRdWV1ZTogeyBzdHJlYW06IFwic3Rkb3V0XCIgfCBcInN0ZGVyclwiOyBkYXRhOiBzdHJpbmcgfVtdID0gW107XG4gICAgbGV0IGxvZ1Jlc29sdmU6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjbG9zZWQgPSBmYWxzZTtcblxuICAgIGNoaWxkLnN0ZG91dC5vbihcImRhdGFcIiwgKGRhdGE6IHN0cmluZyB8IEJ1ZmZlcikgPT4ge1xuICAgICAgY29uc3Qgc3RyID0gU3RyaW5nKGRhdGEpO1xuICAgICAgc3Rkb3V0ICs9IHN0cjtcbiAgICAgIGxvZ1F1ZXVlLnB1c2goeyBzdHJlYW06IFwic3Rkb3V0XCIsIGRhdGE6IHN0ciB9KTtcbiAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgIH0pO1xuXG4gICAgY2hpbGQuc3RkZXJyLm9uKFwiZGF0YVwiLCAoZGF0YTogc3RyaW5nIHwgQnVmZmVyKSA9PiB7XG4gICAgICBjb25zdCBzdHIgPSBTdHJpbmcoZGF0YSk7XG4gICAgICBzdGRlcnIgKz0gc3RyO1xuICAgICAgbG9nUXVldWUucHVzaCh7IHN0cmVhbTogXCJzdGRlcnJcIiwgZGF0YTogc3RyIH0pO1xuICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgUHJvbWlzZTx7XG4gICAgICBzdGRvdXQ6IHN0cmluZztcbiAgICAgIHN0ZGVycjogc3RyaW5nO1xuICAgICAgZXhpdENvZGU6IG51bWJlcjtcbiAgICB9PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5wcm9jZXNzZXMuZGVsZXRlKGNvbW1hbmRJZCk7XG4gICAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgICBjaGlsZC5vbihcImNsb3NlXCIsIChjb2RlOiBudW1iZXIgfCBudWxsKSA9PiB7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VzLmRlbGV0ZShjb21tYW5kSWQpO1xuICAgICAgICBjbG9zZWQgPSB0cnVlO1xuICAgICAgICBsb2dSZXNvbHZlPy4oKTtcbiAgICAgICAgcmVzb2x2ZSh7IHN0ZG91dCwgc3RkZXJyLCBleGl0Q29kZTogY29kZSA/PyAwIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiogbG9ncygpOiBBc3luY0l0ZXJhYmxlPHtcbiAgICAgIHN0cmVhbTogXCJzdGRvdXRcIiB8IFwic3RkZXJyXCI7XG4gICAgICBkYXRhOiBzdHJpbmc7XG4gICAgfT4ge1xuICAgICAgd2hpbGUgKCFjbG9zZWQgfHwgbG9nUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IGxvZ1F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHlpZWxkIGVudHJ5O1xuICAgICAgICB9IGVsc2UgaWYgKCFjbG9zZWQpIHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocikgPT4ge1xuICAgICAgICAgICAgbG9nUmVzb2x2ZSA9IHI7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbG9nUmVzb2x2ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBjb21tYW5kSWQsIGxvZ3MsIHJlc3VsdCB9O1xuICB9XG5cbiAgYXN5bmMgcmVhZEZpbGUob3B0czoge1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgIGF3YWl0IGVuc3VyZVNhbmRib3godGhpcy5zYW5kYm94TmFtZSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjRG9ja2VyKFxuICAgICAgW1xuICAgICAgICBcImV4ZWNcIixcbiAgICAgICAgdGhpcy5zYW5kYm94TmFtZSxcbiAgICAgICAgXCJiYXNoXCIsXG4gICAgICAgIFwiLWNcIixcbiAgICAgICAgYGJhc2U2NCAnJHtvcHRzLnBhdGgucmVwbGFjZSgvJy9nLCBcIidcXFxcJydcIil9J2AsXG4gICAgICBdLFxuICAgICAgeyB0aW1lb3V0TXM6IDMwXzAwMCwgc2lnbmFsOiBvcHRzLnNpZ25hbCB9XG4gICAgKTtcblxuICAgIGlmIChyZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICAgIGlmIChcbiAgICAgICAgcmVzdWx0LnN0ZGVyci5pbmNsdWRlcyhcIk5vIHN1Y2ggZmlsZVwiKSB8fFxuICAgICAgICByZXN1bHQuc3RkZXJyLmluY2x1ZGVzKFwiRU5PRU5UXCIpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlYWRGaWxlIGZhaWxlZDogJHtyZXN1bHQuc3RkZXJyfWApO1xuICAgIH1cblxuICAgIHJldHVybiBCdWZmZXIuZnJvbShyZXN1bHQuc3Rkb3V0LnRyaW0oKSwgXCJiYXNlNjRcIik7XG4gIH1cblxuICBhc3luYyB3cml0ZUZpbGVzKG9wdHM6IHtcbiAgICBmaWxlczogeyBwYXRoOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB8IEJ1ZmZlciB9W107XG4gICAgZGVzdFBhdGg6IHN0cmluZztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGVuc3VyZVNhbmRib3godGhpcy5zYW5kYm94TmFtZSk7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2Ygb3B0cy5maWxlcykge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBvcHRzLmRlc3RQYXRoXG4gICAgICAgID8gYCR7b3B0cy5kZXN0UGF0aH0vJHtmaWxlLnBhdGh9YFxuICAgICAgICA6IGZpbGUucGF0aDtcblxuICAgICAgLy8gRW5zdXJlIHBhcmVudCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBjb25zdCBwYXJlbnREaXIgPSBmdWxsUGF0aC5zdWJzdHJpbmcoMCwgZnVsbFBhdGgubGFzdEluZGV4T2YoXCIvXCIpKTtcbiAgICAgIGlmIChwYXJlbnREaXIpIHtcbiAgICAgICAgYXdhaXQgZXhlY0RvY2tlcihbXCJleGVjXCIsIHRoaXMuc2FuZGJveE5hbWUsIFwibWtkaXJcIiwgXCItcFwiLCBwYXJlbnREaXJdLCB7XG4gICAgICAgICAgc2lnbmFsOiBvcHRzLnNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdyaXRlIHZpYSBiYXNlNjQgdG8gaGFuZGxlIGJvdGggdGV4dCBhbmQgYmluYXJ5IGNvbnRlbnRcbiAgICAgIGNvbnN0IGI2NCA9XG4gICAgICAgIHR5cGVvZiBmaWxlLmNvbnRlbnQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IEJ1ZmZlci5mcm9tKGZpbGUuY29udGVudCkudG9TdHJpbmcoXCJiYXNlNjRcIilcbiAgICAgICAgICA6IGZpbGUuY29udGVudC50b1N0cmluZyhcImJhc2U2NFwiKTtcblxuICAgICAgYXdhaXQgZXhlY0RvY2tlcihcbiAgICAgICAgW1xuICAgICAgICAgIFwiZXhlY1wiLFxuICAgICAgICAgIHRoaXMuc2FuZGJveE5hbWUsXG4gICAgICAgICAgXCJiYXNoXCIsXG4gICAgICAgICAgXCItY1wiLFxuICAgICAgICAgIGBlY2hvICcke2I2NH0nIHwgYmFzZTY0IC1kID4gJyR7ZnVsbFBhdGgucmVwbGFjZSgvJy9nLCBcIidcXFxcJydcIil9J2AsXG4gICAgICAgIF0sXG4gICAgICAgIHsgc2lnbmFsOiBvcHRzLnNpZ25hbCB9XG4gICAgICApO1xuXG4gICAgICBpZiAoZmlsZS5wYXRoLmVuZHNXaXRoKFwiLnNoXCIpKSB7XG4gICAgICAgIGF3YWl0IGV4ZWNEb2NrZXIoW1wiZXhlY1wiLCB0aGlzLnNhbmRib3hOYW1lLCBcImNobW9kXCIsIFwiK3hcIiwgZnVsbFBhdGhdLCB7XG4gICAgICAgICAgc2lnbmFsOiBvcHRzLnNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy91c2VBd2FpdDogLlxuICBhc3luYyBnZXREb21haW4ob3B0czoge1xuICAgIHBvcnQ6IG51bWJlcjtcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGBodHRwOi8vbG9jYWxob3N0OiR7b3B0cy5wb3J0fWA7XG4gIH1cblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL3VzZUF3YWl0OiAuXG4gIGFzeW5jIGtpbGwob3B0czogeyBjb21tYW5kSWQ6IHN0cmluZzsgc2lnbmFsPzogQWJvcnRTaWduYWwgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNoaWxkID0gdGhpcy5wcm9jZXNzZXMuZ2V0KG9wdHMuY29tbWFuZElkKTtcbiAgICBpZiAoY2hpbGQpIHtcbiAgICAgIGNoaWxkLmtpbGwoXCJTSUdURVJNXCIpO1xuICAgICAgdGhpcy5wcm9jZXNzZXMuZGVsZXRlKG9wdHMuY29tbWFuZElkKTtcbiAgICB9XG4gIH1cblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL3VzZUF3YWl0OiAuXG4gIGFzeW5jIGdldFN0YXR1cygpOiBQcm9taXNlPFxuICAgIFwicGVuZGluZ1wiIHwgXCJydW5uaW5nXCIgfCBcInN0b3BwaW5nXCIgfCBcInN0b3BwZWRcIiB8IFwiZmFpbGVkXCJcbiAgPiB7XG4gICAgLy8gZG9ja2VyIHNhbmRib3ggQ0xJIGRvZXNuJ3QgZXhwb3NlIHN0YXR1cyBcdTIwMTQgYXNzdW1lIHJ1bm5pbmcgaWYgZW5zdXJlZFxuICAgIHJldHVybiBcInJ1bm5pbmdcIjtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGVuc3VyZVNhbmRib3godGhpcy5zYW5kYm94TmFtZSk7XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGV4ZWNEb2NrZXIoW1wic3RvcFwiLCB0aGlzLnNhbmRib3hOYW1lXSwgeyB0aW1lb3V0TXM6IDMwXzAwMCB9KTtcbiAgICBhY3RpdmVTYW5kYm94ZXMuZGVsZXRlKHRoaXMuc2FuZGJveE5hbWUpO1xuICAgIGVuc3VyZVByb21pc2VzLmRlbGV0ZSh0aGlzLnNhbmRib3hOYW1lKTtcbiAgfVxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlQXdhaXQ6IC5cbiAgYXN5bmMgc25hcHNob3QoKTogUHJvbWlzZTx7IHNuYXBzaG90SWQ6IHN0cmluZyB9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic25hcHNob3QgaXMgbm90IHN1cHBvcnRlZCBmb3IgZG9ja2VyIHNhbmRib3hlc1wiKTtcbiAgfVxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlQXdhaXQ6IC5cbiAgYXN5bmMgdXBkYXRlTmV0d29ya1BvbGljeSgpOiBQcm9taXNlPG5ldmVyPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJ1cGRhdGVOZXR3b3JrUG9saWN5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRvY2tlciBzYW5kYm94ZXNcIlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvY2tlclNhbmRib3goKTogU2FuZGJveEJpbmRpbmc8XG4gIFwiZG9ja2VyXCIsXG4gIERvY2tlckJpbmRpbmdDb25maWcsXG4gIERvY2tlckJpbmRpbmdNZXRhZGF0YVxuPiB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJkb2NrZXJcIixcbiAgICBhc3luYyBjcmVhdGUob3B0cykge1xuICAgICAgY29uc3Qgc2FuZGJveE5hbWUgPSBgYWdlbnQtJHt1bGlkKCl9YDtcbiAgICAgIGNvbnN0IGN3ZCA9IG9wdHMuc2V0dXA/LmNvbmZpZz8uY3dkO1xuXG4gICAgICBhd2FpdCBlbnN1cmVTYW5kYm94KHNhbmRib3hOYW1lKTtcblxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRG9ja2VyU2FuZGJveEluc3RhbmNlKHNhbmRib3hOYW1lLCBjd2QpO1xuXG4gICAgICBpZiAob3B0cy5zZXR1cD8ucnVuKSB7XG4gICAgICAgIGF3YWl0IG9wdHMuc2V0dXAucnVuKGluc3RhbmNlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIG1ldGFkYXRhOiB7IHNhbmRib3hOYW1lIH0sXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL3VzZUF3YWl0OiAuXG4gICAgYXN5bmMgY29ubmVjdChvcHRzKSB7XG4gICAgICByZXR1cm4gbmV3IERvY2tlclNhbmRib3hJbnN0YW5jZShvcHRzLm1ldGFkYXRhLnNhbmRib3hOYW1lKTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IHVsaWQgfSBmcm9tIFwidWxpZFwiO1xuaW1wb3J0IHR5cGUgeyBFeGVjUmVzdWx0LCBTYW5kYm94QmluZGluZywgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcblxuZXhwb3J0IHR5cGUgTG9jYWxCaW5kaW5nQ29uZmlnID0ge1xuICBjd2Q/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBMb2NhbEJpbmRpbmdNZXRhZGF0YSA9IHtcbiAgYmFzZVBhdGg6IHN0cmluZztcbiAgcGlkOiBudW1iZXI7XG59O1xuXG5jbGFzcyBMb2NhbFNhbmRib3hJbnN0YW5jZSBpbXBsZW1lbnRzIFNhbmRib3hJbnN0YW5jZSB7XG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvY2Vzc2VzID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgaW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLkNoaWxkUHJvY2Vzc1xuICA+KCk7XG5cbiAgY29uc3RydWN0b3IoYmFzZVBhdGg6IHN0cmluZykge1xuICAgIHRoaXMuYmFzZVBhdGggPSBiYXNlUGF0aDtcbiAgICB0aGlzLmN3ZCA9IGJhc2VQYXRoO1xuICB9XG5cbiAgYXN5bmMgZXhlYyhvcHRzOiB7XG4gICAgY29tbWFuZDogc3RyaW5nO1xuICAgIGFyZ3M/OiBzdHJpbmdbXTtcbiAgICBjd2Q/OiBzdHJpbmc7XG4gICAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBzdWRvPzogYm9vbGVhbjtcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8RXhlY1Jlc3VsdD4ge1xuICAgIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKTtcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuICAgIGNvbnN0IGNvbW1hbmRJZCA9IGBjb21tYW5kXyR7dWxpZCgpfWA7XG5cbiAgICBjb25zdCBmaW5hbENtZCA9IG9wdHMuc3VkbyA/IFwic3Vkb1wiIDogb3B0cy5jb21tYW5kO1xuICAgIGNvbnN0IGZpbmFsQXJncyA9IG9wdHMuc3Vkb1xuICAgICAgPyBbb3B0cy5jb21tYW5kLCAuLi4ob3B0cy5hcmdzID8/IFtdKV1cbiAgICAgIDogKG9wdHMuYXJncyA/PyBbXSk7XG5cbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGZpbmFsQ21kLCBmaW5hbEFyZ3MsIHtcbiAgICAgIGN3ZDogb3B0cy5jd2QgPyBwYXRoLnJlc29sdmUodGhpcy5iYXNlUGF0aCwgb3B0cy5jd2QpIDogdGhpcy5iYXNlUGF0aCxcbiAgICAgIGVudjogb3B0cy5lbnYgPyB7IC4uLnByb2Nlc3MuZW52LCAuLi5vcHRzLmVudiB9IDogdW5kZWZpbmVkLFxuICAgICAgc2lnbmFsOiBvcHRzLnNpZ25hbCxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvY2Vzc2VzLnNldChjb21tYW5kSWQsIGNoaWxkKTtcblxuICAgIGxldCBzdGRvdXQgPSBcIlwiO1xuICAgIGxldCBzdGRlcnIgPSBcIlwiO1xuICAgIGNvbnN0IGxvZ1F1ZXVlOiB7IHN0cmVhbTogXCJzdGRvdXRcIiB8IFwic3RkZXJyXCI7IGRhdGE6IHN0cmluZyB9W10gPSBbXTtcbiAgICBsZXQgbG9nUmVzb2x2ZTogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGNsb3NlZCA9IGZhbHNlO1xuXG4gICAgY2hpbGQuc3Rkb3V0Lm9uKFwiZGF0YVwiLCAoZGF0YTogc3RyaW5nIHwgQnVmZmVyKSA9PiB7XG4gICAgICBjb25zdCBzdHIgPSBTdHJpbmcoZGF0YSk7XG4gICAgICBzdGRvdXQgKz0gc3RyO1xuICAgICAgbG9nUXVldWUucHVzaCh7IHN0cmVhbTogXCJzdGRvdXRcIiwgZGF0YTogc3RyIH0pO1xuICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5zdGRlcnIub24oXCJkYXRhXCIsIChkYXRhOiBzdHJpbmcgfCBCdWZmZXIpID0+IHtcbiAgICAgIGNvbnN0IHN0ciA9IFN0cmluZyhkYXRhKTtcbiAgICAgIHN0ZGVyciArPSBzdHI7XG4gICAgICBsb2dRdWV1ZS5wdXNoKHsgc3RyZWFtOiBcInN0ZGVyclwiLCBkYXRhOiBzdHIgfSk7XG4gICAgICBsb2dSZXNvbHZlPy4oKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBQcm9taXNlPHtcbiAgICAgIHN0ZG91dDogc3RyaW5nO1xuICAgICAgc3RkZXJyOiBzdHJpbmc7XG4gICAgICBleGl0Q29kZTogbnVtYmVyO1xuICAgIH0+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnByb2Nlc3Nlcy5kZWxldGUoY29tbWFuZElkKTtcbiAgICAgICAgY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSk7XG5cbiAgICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGU6IG51bWJlciB8IG51bGwpID0+IHtcbiAgICAgICAgdGhpcy5wcm9jZXNzZXMuZGVsZXRlKGNvbW1hbmRJZCk7XG4gICAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgICAgICByZXNvbHZlKHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlOiBjb2RlID8/IDAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uKiBsb2dzKCk6IEFzeW5jSXRlcmFibGU8e1xuICAgICAgc3RyZWFtOiBcInN0ZG91dFwiIHwgXCJzdGRlcnJcIjtcbiAgICAgIGRhdGE6IHN0cmluZztcbiAgICB9PiB7XG4gICAgICB3aGlsZSAoIWNsb3NlZCB8fCBsb2dRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gbG9nUXVldWUuc2hpZnQoKTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgeWllbGQgZW50cnk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWNsb3NlZCkge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyKSA9PiB7XG4gICAgICAgICAgICBsb2dSZXNvbHZlID0gcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsb2dSZXNvbHZlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGNvbW1hbmRJZCwgbG9ncywgcmVzdWx0IH07XG4gIH1cblxuICBhc3luYyByZWFkRmlsZShvcHRzOiB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCBpbXBvcnQoXCJub2RlOnBhdGhcIik7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5iYXNlUGF0aCwgb3B0cy5wYXRoKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnJlYWRGaWxlKGZ1bGxQYXRoKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGUgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICAgICBcImNvZGVcIiBpbiBlICYmXG4gICAgICAgIChlIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gXCJFTk9FTlRcIlxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB3cml0ZUZpbGVzKG9wdHM6IHtcbiAgICBmaWxlczogeyBwYXRoOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB8IEJ1ZmZlciB9W107XG4gICAgZGVzdFBhdGg6IHN0cmluZztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgICBjb25zdCBwYXRoTW9kID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBvcHRzLmZpbGVzKSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGhNb2QucmVzb2x2ZSh0aGlzLmJhc2VQYXRoLCBvcHRzLmRlc3RQYXRoLCBmaWxlLnBhdGgpO1xuICAgICAgYXdhaXQgZnMubWtkaXIocGF0aE1vZC5kaXJuYW1lKGZ1bGxQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZnVsbFBhdGgsIGZpbGUuY29udGVudCk7XG4gICAgICBpZiAoZmlsZS5wYXRoLmVuZHNXaXRoKFwiLnNoXCIpKSB7XG4gICAgICAgIGF3YWl0IGZzLmNobW9kKGZ1bGxQYXRoLCAwbzc1NSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy91c2VBd2FpdDogLlxuICBhc3luYyBnZXREb21haW4ob3B0czoge1xuICAgIHBvcnQ6IG51bWJlcjtcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGBodHRwOi8vbG9jYWxob3N0OiR7b3B0cy5wb3J0fWA7XG4gIH1cblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL3VzZUF3YWl0OiAuXG4gIGFzeW5jIGtpbGwob3B0czogeyBjb21tYW5kSWQ6IHN0cmluZzsgc2lnbmFsPzogQWJvcnRTaWduYWwgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNoaWxkID0gdGhpcy5wcm9jZXNzZXMuZ2V0KG9wdHMuY29tbWFuZElkKTtcbiAgICBpZiAoY2hpbGQpIHtcbiAgICAgIGNoaWxkLmtpbGwoXCJTSUdURVJNXCIpO1xuICAgICAgdGhpcy5wcm9jZXNzZXMuZGVsZXRlKG9wdHMuY29tbWFuZElkKTtcbiAgICB9XG4gIH1cblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL3VzZUF3YWl0OiAuXG4gIGFzeW5jIGdldFN0YXR1cygpOiBQcm9taXNlPFwicnVubmluZ1wiPiB7XG4gICAgcmV0dXJuIFwicnVubmluZ1wiO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gbm8tb3A6IGxvY2FsIHNhbmRib3ggaXMgYWx3YXlzIHN0YXJ0ZWRcbiAgfVxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlQXdhaXQ6IC5cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdG9wIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGxvY2FsIHNhbmRib3hlc1wiKTtcbiAgfVxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlQXdhaXQ6IC5cbiAgYXN5bmMgc25hcHNob3QoKTogUHJvbWlzZTx7IHNuYXBzaG90SWQ6IHN0cmluZyB9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic25hcHNob3QgaXMgbm90IHN1cHBvcnRlZCBmb3IgbG9jYWwgc2FuZGJveGVzXCIpO1xuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy91c2VBd2FpdDogLlxuICBhc3luYyB1cGRhdGVOZXR3b3JrUG9saWN5KCk6IFByb21pc2U8bmV2ZXI+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1cGRhdGVOZXR3b3JrUG9saWN5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGxvY2FsIHNhbmRib3hlc1wiKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9jYWxTYW5kYm94KCk6IFNhbmRib3hCaW5kaW5nPFxuICBcImxvY2FsXCIsXG4gIExvY2FsQmluZGluZ0NvbmZpZyxcbiAgTG9jYWxCaW5kaW5nTWV0YWRhdGFcbj4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwibG9jYWxcIixcbiAgICBhc3luYyBjcmVhdGUob3B0cykge1xuICAgICAgY29uc3QgYmFzZVBhdGggPSBvcHRzLnNldHVwLmNvbmZpZz8uY3dkID8/IHByb2Nlc3MuY3dkKCk7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBMb2NhbFNhbmRib3hJbnN0YW5jZShiYXNlUGF0aCk7XG5cbiAgICAgIGlmIChvcHRzLnNldHVwPy5ydW4pIHtcbiAgICAgICAgYXdhaXQgb3B0cy5zZXR1cC5ydW4oaW5zdGFuY2UpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgbWV0YWRhdGE6IHsgYmFzZVBhdGgsIHBpZDogcHJvY2Vzcy5waWQgfSxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlQXdhaXQ6IC5cbiAgICBhc3luYyBjb25uZWN0KG9wdHMpIHtcbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gb3B0cy5tZXRhZGF0YS5iYXNlUGF0aDtcbiAgICAgIHJldHVybiBuZXcgTG9jYWxTYW5kYm94SW5zdGFuY2UoYmFzZVBhdGgpO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFeGVjUmVzdWx0IH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9XQUlUX1VOVElMID0gMjAwMDtcblxudHlwZSBTYW5kYm94SGFuZGxlID0ge1xuICBleGVjOiAob3B0czogeyBjb21tYW5kOiBzdHJpbmc7IGFyZ3M/OiBzdHJpbmdbXSB9KSA9PiBQcm9taXNlPEV4ZWNSZXN1bHQ+O1xuICB3cml0ZUZpbGVzOiAob3B0czoge1xuICAgIGZpbGVzOiB7IHBhdGg6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH1bXTtcbiAgICBkZXN0UGF0aDogc3RyaW5nO1xuICB9KSA9PiBQcm9taXNlPHZvaWQ+O1xufTtcblxudHlwZSBCYXNoUmVzdWx0ID0ge1xuICBjb21tYW5kSWQ6IHN0cmluZztcbiAgc3Rkb3V0OiBzdHJpbmc7XG4gIHN0ZGVycjogc3RyaW5nO1xuICBleGl0Q29kZTogbnVtYmVyO1xuICBzdGF0dXM6IFwicnVubmluZ1wiIHwgXCJjb21wbGV0ZWRcIiB8IFwiZmFpbGVkXCI7XG4gIG91dHB1dERpcjogc3RyaW5nO1xufTtcblxudHlwZSBSdW5PcHRpb25zID0ge1xuICBjb21tYW5kOiBzdHJpbmc7XG4gIHdhaXRVbnRpbD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQcm9jZXNzTWFuYWdlciA9IChvcHRzOiB7IHNhbmRib3g6IFNhbmRib3hIYW5kbGUgfSkgPT4ge1xuICBjb25zdCB7IHNhbmRib3ggfSA9IG9wdHM7XG5cbiAgY29uc3QgcnVuID0gYXN5bmMgKHJ1bk9wdHM6IFJ1bk9wdGlvbnMpOiBQcm9taXNlPEJhc2hSZXN1bHQ+ID0+IHtcbiAgICBjb25zdCB7IGNvbW1hbmQsIHdhaXRVbnRpbCA9IERFRkFVTFRfV0FJVF9VTlRJTCB9ID0gcnVuT3B0cztcblxuICAgIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgY29tbWFuZDogXCJzaFwiLFxuICAgICAgYXJnczogW1wiLWNcIiwgY29tbWFuZF0sXG4gICAgfSk7XG5cbiAgICBpZiAod2FpdFVudGlsID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kSWQ6IGV4ZWNSZXN1bHQuY29tbWFuZElkLFxuICAgICAgICBzdGRvdXQ6IFwiXCIsXG4gICAgICAgIHN0ZGVycjogXCJcIixcbiAgICAgICAgZXhpdENvZGU6IC0xLFxuICAgICAgICBzdGF0dXM6IFwicnVubmluZ1wiLFxuICAgICAgICBvdXRwdXREaXI6IFwiXCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBsZXRlZCA9IGF3YWl0IHJhY2VUaW1lb3V0KGV4ZWNSZXN1bHQsIHdhaXRVbnRpbCk7XG5cbiAgICBpZiAoIWNvbXBsZXRlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZElkOiBleGVjUmVzdWx0LmNvbW1hbmRJZCxcbiAgICAgICAgc3Rkb3V0OiBcIlwiLFxuICAgICAgICBzdGRlcnI6IFwiXCIsXG4gICAgICAgIGV4aXRDb2RlOiAtMSxcbiAgICAgICAgc3RhdHVzOiBcInJ1bm5pbmdcIixcbiAgICAgICAgb3V0cHV0RGlyOiBcIlwiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXREaXIgPSBgLmFnZW50L2Jhc2gvJHtEYXRlLm5vdygpfS0ke2V4ZWNSZXN1bHQuY29tbWFuZElkfWA7XG4gICAgd3JpdGVPdXRwdXREaXIoc2FuZGJveCwgb3V0cHV0RGlyLCBjb21wbGV0ZWQsIGNvbW1hbmQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbW1hbmRJZDogZXhlY1Jlc3VsdC5jb21tYW5kSWQsXG4gICAgICBzdGRvdXQ6IGNvbXBsZXRlZC5zdGRvdXQsXG4gICAgICBzdGRlcnI6IGNvbXBsZXRlZC5zdGRlcnIsXG4gICAgICBleGl0Q29kZTogY29tcGxldGVkLmV4aXRDb2RlLFxuICAgICAgc3RhdHVzOiBjb21wbGV0ZWQuZXhpdENvZGUgPT09IDAgPyBcImNvbXBsZXRlZFwiIDogXCJmYWlsZWRcIixcbiAgICAgIG91dHB1dERpcixcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiB7IHJ1biB9O1xufTtcblxuYXN5bmMgZnVuY3Rpb24gcmFjZVRpbWVvdXQoXG4gIGV4ZWNSZXN1bHQ6IEV4ZWNSZXN1bHQsXG4gIHRpbWVvdXRNczogbnVtYmVyXG4pOiBQcm9taXNlPHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nOyBleGl0Q29kZTogbnVtYmVyIH0gfCBudWxsPiB7XG4gIGNvbnN0IFRJTUVEX09VVCA9IFN5bWJvbChcInRpbWVvdXRcIik7XG4gIGNvbnN0IHRpbWVyID0gbmV3IFByb21pc2U8dHlwZW9mIFRJTUVEX09VVD4oKHJlc29sdmUpID0+XG4gICAgc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKFRJTUVEX09VVCksIHRpbWVvdXRNcylcbiAgKTtcbiAgY29uc3Qgd2lubmVyID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtleGVjUmVzdWx0LnJlc3VsdCwgdGltZXJdKTtcbiAgcmV0dXJuIHdpbm5lciA9PT0gVElNRURfT1VUID8gbnVsbCA6IHdpbm5lcjtcbn1cblxuZnVuY3Rpb24gd3JpdGVPdXRwdXREaXIoXG4gIHNhbmRib3g6IFNhbmRib3hIYW5kbGUsXG4gIGRpcjogc3RyaW5nLFxuICByZXN1bHQ6IHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nOyBleGl0Q29kZTogbnVtYmVyIH0sXG4gIGNvbW1hbmQ6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IGZpbGVzOiB7IHBhdGg6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH1bXSA9IFtcbiAgICB7IHBhdGg6IFwic3Rkb3V0LnR4dFwiLCBjb250ZW50OiByZXN1bHQuc3Rkb3V0IH0sXG4gICAge1xuICAgICAgcGF0aDogXCJtZXRhZGF0YS5qc29uXCIsXG4gICAgICBjb250ZW50OiBKU09OLnN0cmluZ2lmeSh7IGV4aXRDb2RlOiByZXN1bHQuZXhpdENvZGUsIGNvbW1hbmQgfSwgbnVsbCwgMiksXG4gICAgfSxcbiAgXTtcbiAgaWYgKHJlc3VsdC5zdGRlcnIpIHtcbiAgICBmaWxlcy5wdXNoKHsgcGF0aDogXCJzdGRlcnIudHh0XCIsIGNvbnRlbnQ6IHJlc3VsdC5zdGRlcnIgfSk7XG4gIH1cblxuICBzYW5kYm94LndyaXRlRmlsZXMoeyBmaWxlcywgZGVzdFBhdGg6IGRpciB9KS5jYXRjaCgoKSA9PiB7XG4gICAgLy8gaW50ZW50aW9uYWwgbm8tb3AgXHUyMDE0IG91dHB1dCBmaWxlIHdyaXRlIGlzIGJlc3QtZWZmb3J0XG4gIH0pO1xufVxuIiwgIi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBZ2VudCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIHR5cGUgQWdlbnREYXRhVHlwZXMsXG4gIHR5cGUgQWdlbnRIb29rcyxcbiAgdHlwZSBBZ2VudE9wdGlvbnMsXG4gIEFnZW50U3RhdHVzLFxuICB0eXBlIEFueUFnZW50LFxuICBhZ2VudCxcbiAgdHlwZSBJbmZlclNlc3Npb24sXG4gIHR5cGUgSW5mZXJVSU1lc3NhZ2UsXG4gIHR5cGUgTmVlZHNBcHByb3ZhbE1hcCxcbiAgdHlwZSBTZXNzaW9uRGVmYXVsdHMsXG4gIHR5cGUgU2Vzc2lvblNlbmRBcmdzLFxufSBmcm9tIFwiLi9hZ2VudC9jbGllbnRcIjtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEVycm9ycyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIE1lc3NhZ2VOb3RGb3VuZEVycm9yLFxuICBTYW5kYm94RXJyb3IsXG4gIFNhbmRib3hOb3RGb3VuZEVycm9yLFxuICBTZXNzaW9uTm90Rm91bmRFcnJvcixcbiAgU3RvcmFnZUNvbmZsaWN0RXJyb3IsXG4gIFN0b3JhZ2VFcnJvcixcbn0gZnJvbSBcIi4vZXJyb3JzXCI7XG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgU2FuZGJveCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB0eXBlIHtcbiAgRXhlY1Jlc3VsdCxcbiAgU2FuZGJveEFnZW50UmVmLFxuICBTYW5kYm94QmluZGluZyxcbiAgU2FuZGJveEluc3RhbmNlLFxuICBTYW5kYm94U2V0dXBGaWVsZHMsXG4gIFVwbG9hZGFibGVGaWxlLFxufSBmcm9tIFwiLi9zYW5kYm94L2FkYXB0ZXJcIjtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFRvb2xzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgdHlwZSBCdWlsdEluVG9vbE5hbWUsXG4gIGJ1aWx0aW5Ub29sTmFtZXMsXG4gIHR5cGUgVG9vbENvbnRleHQsXG59IGZyb20gXCIuL3Rvb2xzXCI7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTZXNzaW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHR5cGUgeyBXb3JrZmxvd1J1bkxpa2UgfSBmcm9tIFwiLi9zZXNzaW9uL3N0cmVhbVwiO1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgVXNhZ2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQgdHlwZSB7IFN0ZXBVc2FnZSwgVXNhZ2VTdW1tYXJ5IH0gZnJvbSBcIi4vdXRpbHMvdXNhZ2VcIjtcbiIsICJpbXBvcnQgeyBXT1JLRkxPV19ERVNFUklBTElaRSwgV09SS0ZMT1dfU0VSSUFMSVpFIH0gZnJvbSBcIkB3b3JrZmxvdy9zZXJkZVwiO1xuaW1wb3J0IHR5cGUgeyBHYXRld2F5TW9kZWxJZCwgSW5mZXJVSVRvb2xzLCBUb29sU2V0LCBVSU1lc3NhZ2UgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveEJpbmRpbmcgfSBmcm9tIFwiLi4vc2FuZGJveC9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4uL3NhbmRib3gvaGFuZGxlXCI7XG5pbXBvcnQgeyBzYW5kYm94SGFuZGxlIH0gZnJvbSBcIi4uL3NhbmRib3gvaGFuZGxlXCI7XG5pbXBvcnQgeyB0eXBlIFNlc3Npb25Db250ZXh0LCBzZXNzaW9uSGFuZGxlIH0gZnJvbSBcIi4uL3Nlc3Npb24vaGFuZGxlXCI7XG5pbXBvcnQgeyB0eXBlIFN0b3JhZ2UsIHR5cGUgU3RvcmFnZUlucHV0LCB0b1N0b3JhZ2UgfSBmcm9tIFwiLi4vc3RvcmFnZS9hZGFwdGVyXCI7XG5pbXBvcnQgeyBsb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vc3RvcmFnZS9lbnRyeVwiO1xuaW1wb3J0IHR5cGUgeyBTZXNzaW9uIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgQnVpbHRJblRvb2xOYW1lLCBidWlsdEluVG9vbHMgfSBmcm9tIFwiLi4vdG9vbHNcIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2luZ0NvbmZpZyB9IGZyb20gXCIuLi91dGlscy9sb2dnZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCIuLi91dGlscy9sb2dnZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgQWdlbnREYXRhVHlwZXMsXG4gIHR5cGUgQWdlbnRIb29rcyxcbiAgZ2V0QWdlbnQsXG4gIHR5cGUgTmVlZHNBcHByb3ZhbE1hcCxcbiAgcmVnaXN0ZXJBZ2VudCxcbn0gZnJvbSBcIi4vcmVnaXN0cnlcIjtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFNlc3Npb24gRGVmYXVsdHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB0eXBlIFNlc3Npb25EZWZhdWx0czxUb29scyBleHRlbmRzIFRvb2xTZXQgPSBUb29sU2V0PiA9IHtcbiAgbW9kZWw/OiBHYXRld2F5TW9kZWxJZDtcbiAgc3lzdGVtPzogc3RyaW5nO1xuICBnZW5lcmF0aW9uPzogU2Vzc2lvbltcImdlbmVyYXRpb25cIl07XG4gIGFjdGl2ZVRvb2xzPzogKEV4dHJhY3Q8a2V5b2YgVG9vbHMsIHN0cmluZz4gfCBCdWlsdEluVG9vbE5hbWUpW107XG4gIHNraWxsc0Rpcj86IHN0cmluZyB8IHN0cmluZ1tdO1xufTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEFnZW50IE9wdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB0eXBlIEFnZW50T3B0aW9uczxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBkZWZhdWx0IGFsbG93cyB0eXBlLWVyYXNlZCB1c2FnZVxuICBUb29scyBleHRlbmRzIFRvb2xTZXQgPSBhbnksXG4gIFRTYW5kYm94QmluZGluZ3MgZXh0ZW5kcyBTYW5kYm94QmluZGluZyB8IFNhbmRib3hCaW5kaW5nW10gPSBTYW5kYm94QmluZGluZyxcbiAgVENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbj4gPSBTZXNzaW9uRGVmYXVsdHM8VG9vbHM+ICYge1xuICBzdG9yYWdlPzogU3RvcmFnZUlucHV0O1xuICBzYW5kYm94PzogVFNhbmRib3hCaW5kaW5ncztcbiAgdG9vbHM/OiBUb29scztcbiAgaG9va3M/OiBBZ2VudEhvb2tzO1xuICBuZWVkc0FwcHJvdmFsPzogTmVlZHNBcHByb3ZhbE1hcDxUb29scz47XG4gIGNvbnRleHRTY2hlbWE/OiB6LlpvZFR5cGU8VENvbnRleHQ+O1xuICBsb2dnaW5nPzogT21pdDxMb2dnaW5nQ29uZmlnLCBcIm5hbWVcIj47XG59O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgSW50ZXJuYWwgY29udGV4dCBjYWNoZXMgKGhpZGRlbiBmcm9tIHB1YmxpYyBBUEkpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5jb25zdCBzZXNzaW9uQ29udGV4dHNNYXAgPSBuZXcgV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIFNlc3Npb25Db250ZXh0Pj4oKTtcbmNvbnN0IHNhbmRib3hDb250ZXh0c01hcCA9IG5ldyBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgU2FuZGJveENvbnRleHQ+PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2Vzc2lvbkNvbnRleHRzKFxuICBhZ2VudDogQW55QWdlbnRcbik6IE1hcDxzdHJpbmcsIFNlc3Npb25Db250ZXh0PiB7XG4gIGxldCBtYXAgPSBzZXNzaW9uQ29udGV4dHNNYXAuZ2V0KGFnZW50KTtcbiAgaWYgKCFtYXApIHtcbiAgICBtYXAgPSBuZXcgTWFwKCk7XG4gICAgc2Vzc2lvbkNvbnRleHRzTWFwLnNldChhZ2VudCwgbWFwKTtcbiAgfVxuICByZXR1cm4gbWFwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FuZGJveENvbnRleHRzKFxuICBhZ2VudDogQW55QWdlbnRcbik6IE1hcDxzdHJpbmcsIFNhbmRib3hDb250ZXh0PiB7XG4gIGxldCBtYXAgPSBzYW5kYm94Q29udGV4dHNNYXAuZ2V0KGFnZW50KTtcbiAgaWYgKCFtYXApIHtcbiAgICBtYXAgPSBuZXcgTWFwKCk7XG4gICAgc2FuZGJveENvbnRleHRzTWFwLnNldChhZ2VudCwgbWFwKTtcbiAgfVxuICByZXR1cm4gbWFwO1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgQWdlbnQgQ2xhc3MgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogaW50ZW50aW9uYWxseSBlcmFzZWQgXHUyMDEzIHVzaW5nIGBhbnlgIGF2b2lkcyBjb250cmF2YXJpYW5jZSBpc3N1ZXMgd2l0aCB0b29sLXR5cGVkIG1ldGhvZHMgbGlrZSBgc2VuZGBcbmV4cG9ydCB0eXBlIEFueUFnZW50ID0gQWdlbnQ8YW55LCBhbnksIGFueT47XG5cbmV4cG9ydCB0eXBlIEluZmVyU2Vzc2lvbjxBZ2VudCBleHRlbmRzIEFueUFnZW50ID0gQW55QWdlbnQ+ID0gUmV0dXJuVHlwZTxcbiAgQWdlbnRbXCJzZXNzaW9uXCJdXG4+O1xuZXhwb3J0IHR5cGUgU2Vzc2lvblNlbmRBcmdzPFxuICBBZ2VudCBleHRlbmRzIEFueUFnZW50LFxuICBTZXNzaW9uIGV4dGVuZHMgSW5mZXJTZXNzaW9uPEFnZW50PiA9IEluZmVyU2Vzc2lvbjxBZ2VudD4sXG4+ID0gUGFyYW1ldGVyczxTZXNzaW9uW1wic2VuZFwiXT47XG5cbmV4cG9ydCBjbGFzcyBBZ2VudDxcbiAgVG9vbHMgZXh0ZW5kcyBUb29sU2V0LFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdID0gU2FuZGJveEJpbmRpbmcsXG4gIFRDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4sXG4+IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBvcHRpb25zOiBBZ2VudE9wdGlvbnM8VG9vbHMsIFRTYW5kYm94QmluZGluZ3MsIFRDb250ZXh0PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IEFnZW50T3B0aW9uczxUb29scywgVFNhbmRib3hCaW5kaW5ncywgVENvbnRleHQ+XG4gICkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyA/PyB7fTtcbiAgICB0aGlzLnNlc3Npb24gPSAoc2Vzc2lvbkhhbmRsZTxUb29scywgVENvbnRleHQ+KS5iaW5kKFxuICAgICAgbnVsbCxcbiAgICAgIHRoaXMgYXMgdW5rbm93biBhcyBBbnlBZ2VudFxuICAgICk7XG4gICAgdGhpcy5zYW5kYm94ID0gKHNhbmRib3hIYW5kbGU8VFNhbmRib3hCaW5kaW5ncz4pLmJpbmQoXG4gICAgICBudWxsLFxuICAgICAgdGhpcyBhcyB1bmtub3duIGFzIEFueUFnZW50XG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBbV09SS0ZMT1dfU0VSSUFMSVpFXShpbnN0YW5jZTogQW55QWdlbnQpIHtcbiAgICByZXR1cm4geyBuYW1lOiBpbnN0YW5jZS5uYW1lIH07XG4gIH1cblxuICBzdGF0aWMgW1dPUktGTE9XX0RFU0VSSUFMSVpFXShkYXRhOiB7IG5hbWU6IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIGdldEFnZW50KGRhdGEubmFtZSwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9zdG9yYWdlV2FybmVkID0gZmFsc2U7XG5cbiAgZ2V0IHN0b3JhZ2UoKTogU3RvcmFnZSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuc3RvcmFnZSkge1xuICAgICAgaWYgKCF0aGlzLl9zdG9yYWdlV2FybmVkKSB7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2VXYXJuZWQgPSB0cnVlO1xuICAgICAgICBjcmVhdGVMb2dnZXIoe1xuICAgICAgICAgIGNvbmZpZzogeyAuLi50aGlzLm9wdGlvbnMubG9nZ2luZywgbmFtZTogdGhpcy5uYW1lIH0sXG4gICAgICAgICAgc3Vic3lzdGVtOiBcInN0b3JhZ2VcIixcbiAgICAgICAgfSkud2FybihcbiAgICAgICAgICBcIk5vIHN0b3JhZ2UgYWRhcHRlciBjb25maWd1cmVkIFx1MjAxNCB1c2luZyBsb2NhbFN0b3JhZ2UoKS4gRGF0YSB3aWxsIG5vdCBwZXJzaXN0IGFjcm9zcyByZXN0YXJ0cy5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRvU3RvcmFnZShsb2NhbFN0b3JhZ2UoKSk7XG4gICAgfVxuICAgIHJldHVybiB0b1N0b3JhZ2UodGhpcy5vcHRpb25zLnN0b3JhZ2UpO1xuICB9XG5cbiAgZ2V0IHRvb2xzKCkge1xuICAgIHJldHVybiB7IC4uLmJ1aWx0SW5Ub29scywgLi4udGhpcy5vcHRpb25zLnRvb2xzIH0gYXMgdHlwZW9mIGJ1aWx0SW5Ub29scyAmXG4gICAgICBUb29scztcbiAgfVxuXG4gIGdldCBzZXNzaW9uRGVmYXVsdHMoKTogU2Vzc2lvbkRlZmF1bHRzIHtcbiAgICBjb25zdCB7IG1vZGVsLCBzeXN0ZW0sIGdlbmVyYXRpb24sIGFjdGl2ZVRvb2xzLCBza2lsbHNEaXIgfSA9IHRoaXMub3B0aW9ucztcbiAgICByZXR1cm4geyBtb2RlbCwgc3lzdGVtLCBnZW5lcmF0aW9uLCBhY3RpdmVUb29scywgc2tpbGxzRGlyIH07XG4gIH1cblxuICBnZXQgaG9va3MoKTogQWdlbnRIb29rcyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ob29rcyA/PyB7fTtcbiAgfVxuXG4gIHJlYWRvbmx5IHNlc3Npb247XG5cbiAgcmVhZG9ubHkgc2FuZGJveDtcblxuICAvKiogUGhhbnRvbSBwcm9wZXJ0eSBmb3IgdHlwZSBpbmZlcmVuY2UuIFVzZSBgdHlwZW9mIG15QWdlbnQuJFVJTWVzc2FnZWAgdG8gZ2V0IHRoZSB0eXBlZCBVSU1lc3NhZ2UuICovXG4gIGRlY2xhcmUgcmVhZG9ubHkgJFVJTWVzc2FnZTogVUlNZXNzYWdlPFxuICAgIHVua25vd24sXG4gICAgQWdlbnREYXRhVHlwZXMsXG4gICAgSW5mZXJVSVRvb2xzPHR5cGVvZiBidWlsdEluVG9vbHMgJiBUb29scz5cbiAgPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFnZW50PFxuICBUb29scyBleHRlbmRzIFRvb2xTZXQsXG4gIFRTYW5kYm94QmluZGluZ3MgZXh0ZW5kcyBTYW5kYm94QmluZGluZyB8IFNhbmRib3hCaW5kaW5nW10gPSBTYW5kYm94QmluZGluZyxcbiAgVENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbj4obmFtZTogc3RyaW5nLCBvcHRpb25zPzogQWdlbnRPcHRpb25zPFRvb2xzLCBUU2FuZGJveEJpbmRpbmdzLCBUQ29udGV4dD4pIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQWdlbnQ8VG9vbHMsIFRTYW5kYm94QmluZGluZ3MsIFRDb250ZXh0PihuYW1lLCBvcHRpb25zKTtcbiAgcmVnaXN0ZXJBZ2VudChuYW1lLCBpbnN0YW5jZSk7XG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuLy8gUmUtZXhwb3J0IGV2ZXJ5dGhpbmcgZnJvbSByZWdpc3RyeSBzbyBleGlzdGluZyBpbXBvcnRzIGZyb20gXCIuL2FnZW50L2NsaWVudFwiIGtlZXAgd29ya2luZy5cbmV4cG9ydCB7XG4gIHR5cGUgQWdlbnREYXRhVHlwZXMsXG4gIHR5cGUgQWdlbnRIb29rcyxcbiAgQWdlbnRTdGF0dXMsXG4gIGdldEFnZW50LFxuICB0eXBlIEluZmVyVUlNZXNzYWdlLFxuICB0eXBlIE5lZWRzQXBwcm92YWxNYXAsXG4gIHJlZ2lzdGVyQWdlbnQsXG4gIHR5cGUgVHlwZWRVSU1lc3NhZ2UsXG59IGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG4iLCAiaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgdHlwZSB7IEFueUFnZW50IH0gZnJvbSBcIi4uL2FnZW50L2NsaWVudFwiO1xuaW1wb3J0IHsgZ2V0U2FuZGJveENvbnRleHRzIH0gZnJvbSBcIi4uL2FnZW50L2NsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94QmluZGluZywgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gXCIuL2V4ZWNcIjtcbmltcG9ydCB7IGdldERvbWFpbiB9IGZyb20gXCIuL2dldC1kb21haW5cIjtcbmltcG9ydCB7IGdldFN0YXR1cyB9IGZyb20gXCIuL2dldC1zdGF0dXNcIjtcbmltcG9ydCB7IGtpbGwgfSBmcm9tIFwiLi9raWxsXCI7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCIuL3JlYWQtZmlsZVwiO1xuaW1wb3J0IHsgc2V0dXAgfSBmcm9tIFwiLi9zZXR1cFwiO1xuaW1wb3J0IHsgc25hcHNob3QgfSBmcm9tIFwiLi9zbmFwc2hvdFwiO1xuaW1wb3J0IHsgc3RhcnQgfSBmcm9tIFwiLi9zdGFydFwiO1xuaW1wb3J0IHsgc3RvcCB9IGZyb20gXCIuL3N0b3BcIjtcbmltcG9ydCB7IHVwZGF0ZU5ldHdvcmtQb2xpY3kgfSBmcm9tIFwiLi91cGRhdGUtbmV0d29yay1wb2xpY3lcIjtcbmltcG9ydCB7IHdyaXRlRmlsZXMgfSBmcm9tIFwiLi93cml0ZS1maWxlc1wiO1xuXG5leHBvcnQgdHlwZSBTYW5kYm94Q29udGV4dCA9IHtcbiAgYWdlbnQ6IEFueUFnZW50O1xuICBzYW5kYm94SWQ6IHN0cmluZztcbiAgX3BlbmRpbmdTZXR1cD86IFByb21pc2U8U2FuZGJveEluc3RhbmNlPjtcbiAgX2N3ZD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNhbmRib3hPcHRpb25zID0ge1xuICBpZD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5kYm94SGFuZGxlPFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdLFxuPihcbiAgYWdlbnQ6IEFueUFnZW50LFxuICBpZD86IHN0cmluZyB8IFNhbmRib3hPcHRpb25zXG4pIHtcbiAgY29uc3Qgc2FuZGJveElkID1cbiAgICB0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIgPyBpZCA6IChpZD8uaWQgPz8gYHNhbmRib3hfJHt1bGlkKCl9YCk7XG5cbiAgY29uc3QgY29udGV4dHMgPSBnZXRTYW5kYm94Q29udGV4dHMoYWdlbnQpO1xuICBsZXQgc2FuZGJveENvbnRleHQgPSBjb250ZXh0cy5nZXQoc2FuZGJveElkKTtcbiAgaWYgKCFzYW5kYm94Q29udGV4dCkge1xuICAgIHNhbmRib3hDb250ZXh0ID0geyBhZ2VudCwgc2FuZGJveElkIH07XG4gICAgY29udGV4dHMuc2V0KHNhbmRib3hJZCwgc2FuZGJveENvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogc2FuZGJveElkLFxuICAgIGdldCBjd2QoKSB7XG4gICAgICByZXR1cm4gc2FuZGJveENvbnRleHQhLl9jd2QgPz8gXCIuXCI7XG4gICAgfSxcbiAgICBzZXR1cDogKHNldHVwPFRTYW5kYm94QmluZGluZ3M+KS5iaW5kKG51bGwsIHNhbmRib3hDb250ZXh0KSxcbiAgICBleGVjOiBleGVjLmJpbmQobnVsbCwgc2FuZGJveENvbnRleHQpLFxuICAgIHJlYWRGaWxlOiByZWFkRmlsZS5iaW5kKG51bGwsIHNhbmRib3hDb250ZXh0KSxcbiAgICB3cml0ZUZpbGVzOiB3cml0ZUZpbGVzLmJpbmQobnVsbCwgc2FuZGJveENvbnRleHQpLFxuICAgIGdldERvbWFpbjogZ2V0RG9tYWluLmJpbmQobnVsbCwgc2FuZGJveENvbnRleHQpLFxuICAgIHVwZGF0ZU5ldHdvcmtQb2xpY3k6IHVwZGF0ZU5ldHdvcmtQb2xpY3kuYmluZChudWxsLCBzYW5kYm94Q29udGV4dCksXG4gICAgc3RhcnQ6IHN0YXJ0LmJpbmQobnVsbCwgc2FuZGJveENvbnRleHQpLFxuICAgIHN0b3A6IHN0b3AuYmluZChudWxsLCBzYW5kYm94Q29udGV4dCksXG4gICAga2lsbDoga2lsbC5iaW5kKG51bGwsIHNhbmRib3hDb250ZXh0KSxcbiAgICBzbmFwc2hvdDogc25hcHNob3QuYmluZChudWxsLCBzYW5kYm94Q29udGV4dCksXG4gICAgZ2V0U3RhdHVzOiBnZXRTdGF0dXMuYmluZChudWxsLCBzYW5kYm94Q29udGV4dCksXG4gIH07XG59XG4iLCAiZXhwb3J0IGNvbnN0IGlzVmVyY2VsID0gYXN5bmMgKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgZ2V0VmVyY2VsT2lkY1Rva2VuIH0gPSBhd2FpdCBpbXBvcnQoXCJAdmVyY2VsL29pZGNcIik7XG4gICAgcmV0dXJuIEJvb2xlYW4oYXdhaXQgZ2V0VmVyY2VsT2lkY1Rva2VuKCkpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG4iLCAiaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFNlc3Npb25Ob3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTZXNzaW9uTm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIlNlc3Npb24gJGlkIG5vdCBmb3VuZFwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNlc3Npb25FcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2Vzc2lvbkVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2Vzc2lvbiAkaWQgZmFpbGVkOiAkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU2FuZGJveE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNhbmRib3hOb3RGb3VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2FuZGJveCAkaWQgbm90IGZvdW5kXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU3RvcmFnZUVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTdG9yYWdlRXJyb3JcIixcbiAgbWVzc2FnZTogXCIkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU3RvcmFnZUNvbmZsaWN0RXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlN0b3JhZ2VDb25mbGljdEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNhbmRib3hFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2FuZGJveEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VOb3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJNZXNzYWdlTm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIk1lc3NhZ2UgJGlkIG5vdCBmb3VuZFwiLFxufSkge31cbiIsICJpbXBvcnQgeyBpc1ZlcmNlbCB9IGZyb20gXCIuLi9hZ2VudC9pcy12ZXJjZWxcIjtcbmltcG9ydCB7IFNhbmRib3hFcnJvciwgU2FuZGJveE5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3ggfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL2xvZ2dlclwiO1xuaW1wb3J0IHR5cGUge1xuICBTYW5kYm94QmluZGluZyxcbiAgU2FuZGJveEluc3RhbmNlLFxuICBTYW5kYm94U2V0dXBGaWVsZHMsXG4gIFdpdGhDb25maWcsXG59IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQnVpbHRJbkJpbmRpbmdzIH0gZnJvbSBcIi4vYmluZGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveENvbnRleHQgfSBmcm9tIFwiLi9oYW5kbGVcIjtcblxuY29uc3QgUE9MTF9JTlRFUlZBTF9NUyA9IDUwO1xuY29uc3QgUE9MTF9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcblxudHlwZSBTZXR1cENvbW1vbkZpZWxkcyA9IFBhcnRpYWw8U2FuZGJveFNldHVwRmllbGRzPiAmIHtcbiAgY3dkPzogc3RyaW5nO1xuICBydW4/OiAoc2FuZGJveDogU2FuZGJveEluc3RhbmNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn07XG5cbnR5cGUgVG9CaW5kaW5nVW5pb248VCBleHRlbmRzIFNhbmRib3hCaW5kaW5nIHwgU2FuZGJveEJpbmRpbmdbXT4gPVxuICBUIGV4dGVuZHMgU2FuZGJveEJpbmRpbmdbXSA/IFRbbnVtYmVyXSA6IFQ7XG5cbnR5cGUgU2V0dXBPcHRzRm9yQmluZGluZzxCIGV4dGVuZHMgU2FuZGJveEJpbmRpbmc+ID1cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiAuXG4gIEIgZXh0ZW5kcyBTYW5kYm94QmluZGluZzxpbmZlciBULCBpbmZlciBDLCBhbnk+XG4gICAgPyB7IHR5cGU6IFQgfSAmIFNldHVwQ29tbW9uRmllbGRzICYgV2l0aENvbmZpZzxDPlxuICAgIDogbmV2ZXI7XG5cbnR5cGUgSXNEZWZhdWx0PFQgZXh0ZW5kcyBTYW5kYm94QmluZGluZyB8IFNhbmRib3hCaW5kaW5nW10+ID1cbiAgU2FuZGJveEJpbmRpbmcgZXh0ZW5kcyBUID8gdHJ1ZSA6IGZhbHNlO1xuXG5leHBvcnQgdHlwZSBTZXR1cE9wdHM8XG4gIFRTYW5kYm94QmluZGluZ3MgZXh0ZW5kcyBTYW5kYm94QmluZGluZyB8IFNhbmRib3hCaW5kaW5nW10sXG4+ID1cbiAgfCBTZXR1cE9wdHNGb3JCaW5kaW5nPFxuICAgICAgSXNEZWZhdWx0PFRTYW5kYm94QmluZGluZ3M+IGV4dGVuZHMgdHJ1ZVxuICAgICAgICA/IEJ1aWx0SW5CaW5kaW5nc1xuICAgICAgICA6IFRvQmluZGluZ1VuaW9uPFRTYW5kYm94QmluZGluZ3M+XG4gICAgPlxuICB8IChTZXR1cENvbW1vbkZpZWxkcyAmIHsgdHlwZT86IG5ldmVyIH0pO1xuXG5leHBvcnQgdHlwZSBTZXR1cFJlc3VsdCA9IHtcbiAgZG9uZTogUHJvbWlzZTxTYW5kYm94SW5zdGFuY2U+O1xufTtcblxuZnVuY3Rpb24gaXNTaW5nbGVCaW5kaW5nKFxuICBzYW5kYm94OiBTYW5kYm94QmluZGluZyB8IFNhbmRib3hCaW5kaW5nW11cbik6IHNhbmRib3ggaXMgU2FuZGJveEJpbmRpbmcge1xuICByZXR1cm4gIUFycmF5LmlzQXJyYXkoc2FuZGJveCk7XG59XG5cbi8qKiBBdXRvLWRldGVjdCB0aGUgZGVmYXVsdCBiaW5kaW5nOiB2ZXJjZWwgXHUyMTkyIGRvY2tlciBcdTIxOTIgbG9jYWwgY2FzY2FkZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldERlZmF1bHRCaW5kaW5nKCk6IFByb21pc2U8U2FuZGJveEJpbmRpbmc+IHtcbiAgaWYgKGF3YWl0IGlzVmVyY2VsKCkpIHtcbiAgICBjb25zdCB7IHZlcmNlbFNhbmRib3ggfSA9IGF3YWl0IGltcG9ydChcIi4vYmluZGluZ3MvdmVyY2VsXCIpO1xuICAgIHJldHVybiB2ZXJjZWxTYW5kYm94KCk7XG4gIH1cblxuICBpZiAoYXdhaXQgaXNEb2NrZXJBdmFpbGFibGUoKSkge1xuICAgIGNvbnN0IHsgZG9ja2VyU2FuZGJveCB9ID0gYXdhaXQgaW1wb3J0KFwiLi9iaW5kaW5ncy9kb2NrZXJcIik7XG4gICAgcmV0dXJuIGRvY2tlclNhbmRib3goKTtcbiAgfVxuXG4gIGNvbnN0IHsgbG9jYWxTYW5kYm94IH0gPSBhd2FpdCBpbXBvcnQoXCIuL2JpbmRpbmdzL2xvY2FsXCIpO1xuICByZXR1cm4gbG9jYWxTYW5kYm94KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzRG9ja2VyQXZhaWxhYmxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgZXhlY1N5bmMgfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKTtcbiAgICBleGVjU3luYyhcImRvY2tlciBzYW5kYm94IC0taGVscFwiLCB7IHN0ZGlvOiBcImlnbm9yZVwiLCB0aW1lb3V0OiA1MDAwIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUJpbmRpbmcoXG4gIHNhbmRib3g6IFNhbmRib3hCaW5kaW5nIHwgU2FuZGJveEJpbmRpbmdbXSB8IHVuZGVmaW5lZCxcbiAgdHlwZT86IHN0cmluZ1xuKTogUHJvbWlzZTx7IGJpbmRpbmc6IFNhbmRib3hCaW5kaW5nOyBiaW5kaW5nTmFtZTogc3RyaW5nIH0+IHtcbiAgaWYgKCFzYW5kYm94KSB7XG4gICAgY29uc3QgYmluZGluZyA9IGF3YWl0IGdldERlZmF1bHRCaW5kaW5nKCk7XG4gICAgcmV0dXJuIHsgYmluZGluZywgYmluZGluZ05hbWU6IGJpbmRpbmcudHlwZSB9O1xuICB9XG4gIGlmIChpc1NpbmdsZUJpbmRpbmcoc2FuZGJveCkpIHtcbiAgICByZXR1cm4geyBiaW5kaW5nOiBzYW5kYm94LCBiaW5kaW5nTmFtZTogc2FuZGJveC50eXBlIH07XG4gIH1cbiAgaWYgKHR5cGUpIHtcbiAgICBjb25zdCBtYXRjaCA9IHNhbmRib3guZmluZCgoYikgPT4gYi50eXBlID09PSB0eXBlKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgU2FuZGJveEVycm9yKHtcbiAgICAgICAgcmVhc29uOiBgVW5rbm93biBiaW5kaW5nIHR5cGU6IFwiJHt0eXBlfVwiLiBBdmFpbGFibGU6ICR7c2FuZGJveC5tYXAoKGIpID0+IGIudHlwZSkuam9pbihcIiwgXCIpfWAsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYmluZGluZzogbWF0Y2gsIGJpbmRpbmdOYW1lOiBtYXRjaC50eXBlIH07XG4gIH1cbiAgaWYgKHNhbmRib3gubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogXCJObyBzYW5kYm94IGJpbmRpbmdzIGNvbmZpZ3VyZWRcIiB9KTtcbiAgfVxuICByZXR1cm4geyBiaW5kaW5nOiBzYW5kYm94WzBdLCBiaW5kaW5nTmFtZTogc2FuZGJveFswXS50eXBlIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cDxcbiAgVFNhbmRib3hCaW5kaW5ncyBleHRlbmRzIFNhbmRib3hCaW5kaW5nIHwgU2FuZGJveEJpbmRpbmdbXSxcbj4oXG4gIGN0eDogU2FuZGJveENvbnRleHQsXG4gIG9wdHM/OiBTZXR1cE9wdHM8VFNhbmRib3hCaW5kaW5ncz5cbik6IFByb21pc2U8U2V0dXBSZXN1bHQ+IHtcbiAgaWYgKGN0eC5fcGVuZGluZ1NldHVwKSB7XG4gICAgcmV0dXJuIHsgZG9uZTogY3R4Ll9wZW5kaW5nU2V0dXAgfTtcbiAgfVxuXG4gIGNvbnN0IGFnZW50ID0gY3R4LmFnZW50O1xuICBjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoe1xuICAgIGNvbmZpZzogeyAuLi5hZ2VudC5vcHRpb25zLmxvZ2dpbmcsIG5hbWU6IGFnZW50Lm5hbWUgfSxcbiAgICBzdWJzeXN0ZW06IFwic2FuZGJveDpzZXR1cFwiLFxuICAgIGNvbnRleHQ6IHsgc2FuZGJveElkOiBjdHguc2FuZGJveElkIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGRvbmVSZXNvbHZlQmluZGluZyA9IGxvZy50aW1lKFwicmVzb2x2ZSBiaW5kaW5nXCIsIHtcbiAgICByZXF1ZXN0ZWRUeXBlOiBvcHRzPy50eXBlLFxuICB9KTtcbiAgY29uc3QgeyBiaW5kaW5nLCBiaW5kaW5nTmFtZSB9ID0gYXdhaXQgcmVzb2x2ZUJpbmRpbmcoXG4gICAgYWdlbnQub3B0aW9ucy5zYW5kYm94LFxuICAgIG9wdHM/LnR5cGVcbiAgKTtcbiAgZG9uZVJlc29sdmVCaW5kaW5nKCk7XG5cbiAgaWYgKG9wdHM/LmN3ZCkge1xuICAgIGN0eC5fY3dkID0gb3B0cy5jd2Q7XG4gIH1cblxuICBjb25zdCBzZXR1cExvZyA9IGxvZy53aXRoQ29udGV4dCh7XG4gICAgYmluZGluZzogYmluZGluZ05hbWUsXG4gICAgdmVyc2lvbjogb3B0cz8udmVyc2lvbixcbiAgfSk7XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0NvbmZ1c2luZ1ZvaWRUeXBlOiAuXG4gIGxldCByZXNvbHZlQmxvY2tpbmdQcm9taXNlID0gKHZhbHVlOiB2b2lkKSA9PiB2YWx1ZTtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiAuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FbXB0eUJsb2NrU3RhdGVtZW50czogLlxuICBsZXQgcmVqZWN0QmxvY2tpbmdQcm9taXNlID0gKF9yZWFzb24/OiBhbnkpID0+IHt9O1xuICBjb25zdCBibG9ja2luZ1Byb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmVzb2x2ZUJsb2NraW5nUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgcmVqZWN0QmxvY2tpbmdQcm9taXNlID0gcmVqZWN0O1xuICB9KTtcblxuICBjdHguX3BlbmRpbmdTZXR1cCA9IChhc3luYyAoKSA9PiB7XG4gICAgbGV0IHNsZWVwT2xkSW5zdGFuY2U6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZG9uZVBlbmRpbmdTZXR1cCA9IHNldHVwTG9nLnRpbWUoXCJwZW5kaW5nIHNldHVwXCIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRvbmVTdG9yYWdlR2V0ID0gc2V0dXBMb2cudGltZShcInN0b3JhZ2Uuc2FuZGJveC5nZXRcIik7XG4gICAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBhZ2VudC5zdG9yYWdlLnNhbmRib3guZ2V0KGN0eC5zYW5kYm94SWQpO1xuICAgICAgZG9uZVN0b3JhZ2VHZXQoKTtcblxuICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICBjb25zdCB2ZXJzaW9uTWF0Y2hlcyA9XG4gICAgICAgICAgIW9wdHM/LnZlcnNpb24gfHwgcmVjb3JkLnNldHVwPy52ZXJzaW9uID09PSBvcHRzLnZlcnNpb247XG5cbiAgICAgICAgaWYgKHZlcnNpb25NYXRjaGVzICYmIHJlY29yZC5zZXR1cD8uY29tcGxldGVkQXQpIHtcbiAgICAgICAgICByZXNvbHZlQmxvY2tpbmdQcm9taXNlKCk7XG4gICAgICAgICAgY29uc3QgZG9uZUNvbm5lY3RFeGlzdGluZyA9IHNldHVwTG9nLnRpbWUoXG4gICAgICAgICAgICBcImNvbm5lY3QgZXhpc3Rpbmcgc2FuZGJveFwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzZXR1cFN0YXRlOiBcImNvbXBsZXRlZFwiLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBiaW5kaW5nLmNvbm5lY3Qoe1xuICAgICAgICAgICAgYWdlbnQsXG4gICAgICAgICAgICBtZXRhZGF0YTogcmVjb3JkLnNldHVwLm1ldGFkYXRhLFxuICAgICAgICAgICAgc2lnbmFsOiBvcHRzPy5zaWduYWwsXG4gICAgICAgICAgICBsb2c6IHNldHVwTG9nLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGRvbmVDb25uZWN0RXhpc3RpbmcoKTtcbiAgICAgICAgICBjdHguX2N3ZCA9IGluc3RhbmNlLmN3ZDtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmVyc2lvbk1hdGNoZXMgJiYgIXJlY29yZC5zZXR1cD8uY29tcGxldGVkQXQpIHtcbiAgICAgICAgICByZXNvbHZlQmxvY2tpbmdQcm9taXNlKCk7XG4gICAgICAgICAgY29uc3QgZG9uZVBvbGxVbnRpbFJlYWR5ID0gc2V0dXBMb2cudGltZShcInBvbGwgdW50aWwgcmVhZHlcIik7XG4gICAgICAgICAgYXdhaXQgcG9sbFVudGlsUmVhZHkoY3R4LCBvcHRzPy5zaWduYWwpO1xuICAgICAgICAgIGRvbmVQb2xsVW50aWxSZWFkeSgpO1xuXG4gICAgICAgICAgY29uc3QgZG9uZVN0b3JhZ2VHZXRQb3N0UG9sbCA9IHNldHVwTG9nLnRpbWUoXG4gICAgICAgICAgICBcInN0b3JhZ2Uuc2FuZGJveC5nZXQgKHBvc3QtcG9sbClcIlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgcmVhZHkgPSBhd2FpdCBhZ2VudC5zdG9yYWdlLnNhbmRib3guZ2V0KGN0eC5zYW5kYm94SWQpO1xuICAgICAgICAgIGRvbmVTdG9yYWdlR2V0UG9zdFBvbGwoKTtcblxuICAgICAgICAgIGlmICghcmVhZHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94Tm90Rm91bmRFcnJvcih7IGlkOiBjdHguc2FuZGJveElkIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkb25lQ29ubmVjdEV4aXN0aW5nID0gc2V0dXBMb2cudGltZShcbiAgICAgICAgICAgIFwiY29ubmVjdCBleGlzdGluZyBzYW5kYm94XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNldHVwU3RhdGU6IFwicG9zdC1wb2xsXCIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGJpbmRpbmcuY29ubmVjdCh7XG4gICAgICAgICAgICBhZ2VudCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiByZWFkeS5zZXR1cC5tZXRhZGF0YSxcbiAgICAgICAgICAgIHNpZ25hbDogb3B0cz8uc2lnbmFsLFxuICAgICAgICAgICAgbG9nOiBzZXR1cExvZyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBkb25lQ29ubmVjdEV4aXN0aW5nKCk7XG4gICAgICAgICAgY3R4Ll9jd2QgPSBpbnN0YW5jZS5jd2Q7XG4gICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlY29yZC5zZXR1cC5tZXRhZGF0YSkge1xuICAgICAgICAgIGNvbnN0IG9sZEluc3RhbmNlTWV0YWRhdGEgPSByZWNvcmQuc2V0dXAubWV0YWRhdGE7XG4gICAgICAgICAgc2xlZXBPbGRJbnN0YW5jZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkb25lU3RvcE9sZEluc3RhbmNlID0gc2V0dXBMb2cudGltZShcbiAgICAgICAgICAgICAgXCJzdG9wIG9sZCBzYW5kYm94IGluc3RhbmNlXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBvbGQgPSBhd2FpdCBiaW5kaW5nLmNvbm5lY3Qoe1xuICAgICAgICAgICAgICAgIGFnZW50LFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBvbGRJbnN0YW5jZU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIGxvZzogc2V0dXBMb2csXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBhd2FpdCBvbGQuc3RvcCgpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIGRvbmVTdG9wT2xkSW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9uZVN0b3BPbGRJbnN0YW5jZSgpO1xuICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHNldHVwXzogU2FuZGJveFtcInNldHVwXCJdID0ge1xuICAgICAgICBiaW5kaW5nOiBiaW5kaW5nTmFtZSxcbiAgICAgICAgdmVyc2lvbjogb3B0cz8udmVyc2lvbiA/PyByZWNvcmQ/LnNldHVwPy52ZXJzaW9uID8/IG51bGwsXG4gICAgICAgIG5ldHdvcmtQb2xpY3k6XG4gICAgICAgICAgb3B0cz8ubmV0d29ya1BvbGljeSA/PyByZWNvcmQ/LnNldHVwPy5uZXR3b3JrUG9saWN5ID8/IG51bGwsXG4gICAgICAgIGNvbXBsZXRlZEF0OiBudWxsLFxuICAgICAgICBtZXRhZGF0YTogbnVsbCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG5ld1JlY29yZDogU2FuZGJveCA9IHtcbiAgICAgICAgaWQ6IGN0eC5zYW5kYm94SWQsXG4gICAgICAgIHNldHVwOiBzZXR1cF8sXG4gICAgICAgIGNyZWF0ZWRBdDogcmVjb3JkPy5jcmVhdGVkQXQgPz8gbm93LFxuICAgICAgICBsYXN0QWN0aXZlQXQ6IG5vdyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGRvbmVTdG9yYWdlU2V0UGVuZGluZyA9IHNldHVwTG9nLnRpbWUoXG4gICAgICAgIFwic3RvcmFnZS5zYW5kYm94LnNldCAoc2V0dXAgcGVuZGluZylcIlxuICAgICAgKTtcbiAgICAgIGF3YWl0IGFnZW50LnN0b3JhZ2Uuc2FuZGJveC5zZXQoY3R4LnNhbmRib3hJZCwgbmV3UmVjb3JkKTtcbiAgICAgIGRvbmVTdG9yYWdlU2V0UGVuZGluZygpO1xuXG4gICAgICByZXNvbHZlQmxvY2tpbmdQcm9taXNlKCk7XG5cbiAgICAgIGNvbnN0IGRvbmVCaW5kaW5nQ3JlYXRlID0gc2V0dXBMb2cudGltZShcImJpbmRpbmcuY3JlYXRlXCIpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmluZGluZy5jcmVhdGUoe1xuICAgICAgICBjd2Q6IGN0eC5fY3dkID8/IFwiLlwiLFxuICAgICAgICBhZ2VudCxcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBvcHRzIGlzIGEgdW5pb247IGNvbmZpZyBleGlzdHMgb24gYmluZGluZy1zcGVjaWZpYyBicmFuY2hlc1xuICAgICAgICBzZXR1cDogeyAuLi5zZXR1cF8sIHJ1bjogb3B0cz8ucnVuLCBjb25maWc6IChvcHRzIGFzIGFueSk/LmNvbmZpZyB9LFxuICAgICAgICByZWNvcmQ6IG5ld1JlY29yZCxcbiAgICAgICAgc2lnbmFsOiBvcHRzPy5zaWduYWwsXG4gICAgICAgIGxvZzogc2V0dXBMb2csXG4gICAgICB9KTtcbiAgICAgIGRvbmVCaW5kaW5nQ3JlYXRlKCk7XG5cbiAgICAgIHNldHVwXy5jb21wbGV0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgICBzZXR1cF8ubWV0YWRhdGEgPSByZXN1bHQubWV0YWRhdGE7XG5cbiAgICAgIGNvbnN0IGRvbmVTdG9yYWdlVXBkYXRlQ29tcGxldGUgPSBzZXR1cExvZy50aW1lKFxuICAgICAgICBcInN0b3JhZ2Uuc2FuZGJveC51cGRhdGUgKHNldHVwIGNvbXBsZXRlKVwiXG4gICAgICApO1xuICAgICAgYXdhaXQgYWdlbnQuc3RvcmFnZS5zYW5kYm94LnVwZGF0ZShjdHguc2FuZGJveElkLCB7XG4gICAgICAgIHNldHVwOiBzZXR1cF8sXG4gICAgICAgIGxhc3RBY3RpdmVBdDogRGF0ZS5ub3coKSxcbiAgICAgIH0pO1xuICAgICAgZG9uZVN0b3JhZ2VVcGRhdGVDb21wbGV0ZSgpO1xuXG4gICAgICBjdHguX2N3ZCA9IHJlc3VsdC5pbnN0YW5jZS5jd2Q7XG4gICAgICByZXR1cm4gcmVzdWx0Lmluc3RhbmNlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY3R4Ll9wZW5kaW5nU2V0dXAgPSB1bmRlZmluZWQ7XG4gICAgICByZWplY3RCbG9ja2luZ1Byb21pc2UoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3QgZG9uZUZpbmFsaXplID0gc2V0dXBMb2cudGltZShcImZpbmFsaXplIHNldHVwXCIpO1xuICAgICAgYXdhaXQgc2xlZXBPbGRJbnN0YW5jZTtcbiAgICAgIGRvbmVGaW5hbGl6ZSgpO1xuICAgICAgZG9uZVBlbmRpbmdTZXR1cCgpO1xuICAgIH1cbiAgfSkoKTtcblxuICBjb25zdCBkb25lV2FpdEZvclVuYmxvY2sgPSBzZXR1cExvZy50aW1lKFwid2FpdCBmb3Igc2V0dXAgdW5ibG9ja1wiKTtcbiAgYXdhaXQgYmxvY2tpbmdQcm9taXNlO1xuICBkb25lV2FpdEZvclVuYmxvY2soKTtcbiAgcmV0dXJuIHsgZG9uZTogY3R4Ll9wZW5kaW5nU2V0dXAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmUoXG4gIGN0eDogU2FuZGJveENvbnRleHQsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsXG4pOiBQcm9taXNlPFNhbmRib3hJbnN0YW5jZT4ge1xuICBjb25zdCBhZ2VudCA9IGN0eC5hZ2VudDtcbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHsgLi4uYWdlbnQub3B0aW9ucy5sb2dnaW5nLCBuYW1lOiBhZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcInNhbmRib3g6cmVzb2x2ZVwiLFxuICAgIGNvbnRleHQ6IHsgc2FuZGJveElkOiBjdHguc2FuZGJveElkIH0sXG4gIH0pO1xuXG4gIGlmIChjdHguX3BlbmRpbmdTZXR1cCkge1xuICAgIHJldHVybiBhd2FpdCBjdHguX3BlbmRpbmdTZXR1cDtcbiAgfVxuXG4gIGxldCByZWNvcmQgPSBhd2FpdCBhZ2VudC5zdG9yYWdlLnNhbmRib3guZ2V0KGN0eC5zYW5kYm94SWQpO1xuXG4gIGlmICghcmVjb3JkKSB7XG4gICAgY29uc3QgeyBkb25lIH0gPSBhd2FpdCBzZXR1cChjdHgsIHsgc2lnbmFsIH0pO1xuICAgIHJldHVybiBhd2FpdCBkb25lO1xuICB9XG5cbiAgaWYgKCFyZWNvcmQuc2V0dXA/LmNvbXBsZXRlZEF0KSB7XG4gICAgYXdhaXQgcG9sbFVudGlsUmVhZHkoY3R4LCBzaWduYWwpO1xuICAgIHJlY29yZCA9IGF3YWl0IGFnZW50LnN0b3JhZ2Uuc2FuZGJveC5nZXQoY3R4LnNhbmRib3hJZCk7XG4gIH1cblxuICBpZiAoIXJlY29yZCkge1xuICAgIHRocm93IG5ldyBTYW5kYm94Tm90Rm91bmRFcnJvcih7IGlkOiBjdHguc2FuZGJveElkIH0pO1xuICB9XG5cbiAgY29uc3QgeyBiaW5kaW5nIH0gPSBhd2FpdCByZXNvbHZlQmluZGluZyhcbiAgICBjdHguYWdlbnQub3B0aW9ucy5zYW5kYm94LFxuICAgIHJlY29yZC5zZXR1cC5iaW5kaW5nXG4gICk7XG5cbiAgYWdlbnQuc3RvcmFnZS5zYW5kYm94XG4gICAgLnVwZGF0ZShjdHguc2FuZGJveElkLCB7IGxhc3RBY3RpdmVBdDogRGF0ZS5ub3coKSB9KVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIGxvZy5lcnJvcihcIkZhaWxlZCB0byB1cGRhdGUgc2FuZGJveCBsYXN0QWN0aXZlQXRcIiwgeyBlcnJvciB9KTtcbiAgICB9KTtcblxuICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGJpbmRpbmcuY29ubmVjdCh7XG4gICAgYWdlbnQsXG4gICAgbWV0YWRhdGE6IHJlY29yZC5zZXR1cC5tZXRhZGF0YSxcbiAgICBzaWduYWwsXG4gICAgbG9nLFxuICB9KTtcbiAgY3R4Ll9jd2QgPSBpbnN0YW5jZS5jd2Q7XG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcG9sbFVudGlsUmVhZHkoXG4gIGN0eDogU2FuZGJveENvbnRleHQsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgUE9MTF9USU1FT1VUX01TO1xuXG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBjdHguYWdlbnQuc3RvcmFnZS5zYW5kYm94LmdldChjdHguc2FuZGJveElkKTtcbiAgICBpZiAocmVjb3JkPy5zZXR1cD8uY29tcGxldGVkQXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBQT0xMX0lOVEVSVkFMX01TKSk7XG4gIH1cblxuICB0aHJvdyBuZXcgU2FuZGJveEVycm9yKHtcbiAgICByZWFzb246IGBUaW1lZCBvdXQgd2FpdGluZyBmb3Igc2FuZGJveCBcIiR7Y3R4LnNhbmRib3hJZH1cIiBzZXR1cCB0byBjb21wbGV0ZWAsXG4gIH0pO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjKFxuICBzYW5kYm94Q29udGV4dDogU2FuZGJveENvbnRleHQsXG4gIC4uLm9wdHM6IFBhcmFtZXRlcnM8U2FuZGJveEluc3RhbmNlW1wiZXhlY1wiXT5cbikge1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC5leGVjKC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREb21haW4oXG4gIHNhbmRib3hDb250ZXh0OiBTYW5kYm94Q29udGV4dCxcbiAgLi4ub3B0czogUGFyYW1ldGVyczxTYW5kYm94SW5zdGFuY2VbXCJnZXREb21haW5cIl0+XG4pIHtcbiAgY29uc3Qgc2J4ID0gYXdhaXQgcmVzb2x2ZShzYW5kYm94Q29udGV4dCk7XG4gIHJldHVybiBhd2FpdCBzYnguZ2V0RG9tYWluKC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTdGF0dXMoXG4gIHNhbmRib3hDb250ZXh0OiBTYW5kYm94Q29udGV4dCxcbiAgLi4ub3B0czogUGFyYW1ldGVyczxTYW5kYm94SW5zdGFuY2VbXCJnZXRTdGF0dXNcIl0+XG4pIHtcbiAgY29uc3Qgc2J4ID0gYXdhaXQgcmVzb2x2ZShzYW5kYm94Q29udGV4dCk7XG4gIHJldHVybiBhd2FpdCBzYnguZ2V0U3RhdHVzKC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsKFxuICBzYW5kYm94Q29udGV4dDogU2FuZGJveENvbnRleHQsXG4gIC4uLm9wdHM6IFBhcmFtZXRlcnM8U2FuZGJveEluc3RhbmNlW1wia2lsbFwiXT5cbikge1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC5raWxsKC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRmlsZShcbiAgc2FuZGJveENvbnRleHQ6IFNhbmRib3hDb250ZXh0LFxuICAuLi5vcHRzOiBQYXJhbWV0ZXJzPFNhbmRib3hJbnN0YW5jZVtcInJlYWRGaWxlXCJdPlxuKSB7XG4gIGNvbnN0IHNieCA9IGF3YWl0IHJlc29sdmUoc2FuZGJveENvbnRleHQpO1xuICByZXR1cm4gYXdhaXQgc2J4LnJlYWRGaWxlKC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbmFwc2hvdChcbiAgc2FuZGJveENvbnRleHQ6IFNhbmRib3hDb250ZXh0LFxuICAuLi5vcHRzOiBQYXJhbWV0ZXJzPFNhbmRib3hJbnN0YW5jZVtcInNuYXBzaG90XCJdPlxuKSB7XG4gIGNvbnN0IHNieCA9IGF3YWl0IHJlc29sdmUoc2FuZGJveENvbnRleHQpO1xuICByZXR1cm4gYXdhaXQgc2J4LnNuYXBzaG90KC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydChcbiAgc2FuZGJveENvbnRleHQ6IFNhbmRib3hDb250ZXh0LFxuICAuLi5vcHRzOiBQYXJhbWV0ZXJzPFNhbmRib3hJbnN0YW5jZVtcInN0YXJ0XCJdPlxuKSB7XG4gIGNvbnN0IHNieCA9IGF3YWl0IHJlc29sdmUoc2FuZGJveENvbnRleHQpO1xuICByZXR1cm4gYXdhaXQgc2J4LnN0YXJ0KC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wKFxuICBzYW5kYm94Q29udGV4dDogU2FuZGJveENvbnRleHQsXG4gIC4uLm9wdHM6IFBhcmFtZXRlcnM8U2FuZGJveEluc3RhbmNlW1wic3RvcFwiXT5cbikge1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC5zdG9wKC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVOZXR3b3JrUG9saWN5KFxuICBzYW5kYm94Q29udGV4dDogU2FuZGJveENvbnRleHQsXG4gIC4uLm9wdHM6IFBhcmFtZXRlcnM8U2FuZGJveEluc3RhbmNlW1widXBkYXRlTmV0d29ya1BvbGljeVwiXT5cbikge1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC51cGRhdGVOZXR3b3JrUG9saWN5KC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUZpbGVzKFxuICBzYW5kYm94Q29udGV4dDogU2FuZGJveENvbnRleHQsXG4gIC4uLm9wdHM6IFBhcmFtZXRlcnM8U2FuZGJveEluc3RhbmNlW1wid3JpdGVGaWxlc1wiXT5cbikge1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC53cml0ZUZpbGVzKC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgVG9vbFNldCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgdHlwZSB7IEFueUFnZW50IH0gZnJvbSBcIi4uL2FnZW50L2NsaWVudFwiO1xuaW1wb3J0IHsgZ2V0U2Vzc2lvbkNvbnRleHRzIH0gZnJvbSBcIi4uL2FnZW50L2NsaWVudFwiO1xuaW1wb3J0IHsgaGlzdG9yeSB9IGZyb20gXCIuL2hpc3RvcnlcIjtcbmltcG9ydCB7IGludGVycnVwdCB9IGZyb20gXCIuL2ludGVycnVwdFwiO1xuaW1wb3J0IHsgc2VuZCB9IGZyb20gXCIuL3NlbmRcIjtcbmltcG9ydCB7IHN0cmVhbSB9IGZyb20gXCIuL3N0cmVhbVwiO1xuaW1wb3J0IHsgdXBkYXRlIH0gZnJvbSBcIi4vdXBkYXRlXCI7XG5pbXBvcnQgeyB1c2FnZSB9IGZyb20gXCIuL3VzYWdlXCI7XG5cbnR5cGUgU2Vzc2lvbk9wdGlvbnMgPSB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2Vzc2lvbkNvbnRleHQgPSB7XG4gIGFnZW50OiBBbnlBZ2VudDtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc2Vzc2lvbkhhbmRsZTxUb29scyBleHRlbmRzIFRvb2xTZXQsIFRDb250ZXh0PihcbiAgYWdlbnQ6IEFueUFnZW50LFxuICBpZD86IHN0cmluZyB8IFNlc3Npb25PcHRpb25zXG4pIHtcbiAgY29uc3Qgc2Vzc2lvbklkID1cbiAgICB0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIgPyBpZCA6IChpZD8uaWQgPz8gYHNlc3Npb25fJHt1bGlkKCl9YCk7XG5cbiAgY29uc3QgY29udGV4dHMgPSBnZXRTZXNzaW9uQ29udGV4dHMoYWdlbnQpO1xuICBsZXQgc2Vzc2lvbkNvbnRleHQgPSBjb250ZXh0cy5nZXQoc2Vzc2lvbklkKTtcbiAgaWYgKCFzZXNzaW9uQ29udGV4dCkge1xuICAgIHNlc3Npb25Db250ZXh0ID0geyBhZ2VudCwgc2Vzc2lvbklkIH07XG4gICAgY29udGV4dHMuc2V0KHNlc3Npb25JZCwgc2Vzc2lvbkNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogc2Vzc2lvbklkLFxuICAgIHNlbmQ6IChzZW5kPFRvb2xzLCBUQ29udGV4dD4pLmJpbmQobnVsbCwgc2Vzc2lvbkNvbnRleHQpLFxuICAgIHN0cmVhbTogc3RyZWFtLmJpbmQobnVsbCwgc2Vzc2lvbkNvbnRleHQpLFxuICAgIGhpc3Rvcnk6IChoaXN0b3J5PFRvb2xzPikuYmluZChudWxsLCBzZXNzaW9uQ29udGV4dCksXG4gICAgaW50ZXJydXB0OiBpbnRlcnJ1cHQuYmluZChudWxsLCBzZXNzaW9uQ29udGV4dCksXG4gICAgdXNhZ2U6IHVzYWdlLmJpbmQobnVsbCwgc2Vzc2lvbkNvbnRleHQpLFxuICAgIHVwZGF0ZTogKHVwZGF0ZTxUb29scz4pLmJpbmQobnVsbCwgc2Vzc2lvbkNvbnRleHQpLFxuICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHtcbiAgSW5mZXJVSVRvb2xzLFxuICBSZWFzb25pbmdVSVBhcnQsXG4gIFRleHRVSVBhcnQsXG4gIFRvb2xTZXQsXG4gIFVJTWVzc2FnZSxcbn0gZnJvbSBcImFpXCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50RGF0YVR5cGVzIH0gZnJvbSBcIi4uL2FnZW50L3JlZ2lzdHJ5XCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2UsIFBhcnQgfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuXG4vKiogU3ViLXRvb2wgcGFydHMgKGZyb20gSmF2YVNjcmlwdCBtZXRhLXRvb2wpIHVzZSB0aGlzIHRvb2xDYWxsSWQgcHJlZml4LiAqL1xuZnVuY3Rpb24gaXNTdWJUb29sUGFydChwYXJ0OiBQYXJ0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHAgPSBwYXJ0LnBhcnQgYXMgeyB0b29sQ2FsbElkPzogc3RyaW5nIH07XG4gIHJldHVybiB0eXBlb2YgcD8udG9vbENhbGxJZCA9PT0gXCJzdHJpbmdcIiAmJiBwLnRvb2xDYWxsSWQuc3RhcnRzV2l0aChcImpzX3RjX1wiKTtcbn1cblxuZnVuY3Rpb24gaXNTdHJlYW1pbmdDb250ZW50KFxuICBwYXJ0OiB1bmtub3duXG4pOiBwYXJ0IGlzIFRleHRVSVBhcnQgfCBSZWFzb25pbmdVSVBhcnQge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiICYmXG4gICAgcGFydCAhPT0gbnVsbCAmJlxuICAgIFwidHlwZVwiIGluIHBhcnQgJiZcbiAgICAocGFydC50eXBlID09PSBcInRleHRcIiB8fCBwYXJ0LnR5cGUgPT09IFwicmVhc29uaW5nXCIpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUludGVycnVwdEN1dG9mZih7XG4gIHBhcnRzLFxuICBsYXN0UGFydCxcbn06IHtcbiAgcGFydHM6IFBhcnRbXTtcbiAgbGFzdFBhcnQ6IHsgaW5kZXg6IG51bWJlcjsgcGFydDogdW5rbm93biB9O1xufSk6IFBhcnRbXSB7XG4gIHJldHVybiBwYXJ0c1xuICAgIC5maWx0ZXIoKHApID0+IHAuaW5kZXggPD0gbGFzdFBhcnQuaW5kZXgpXG4gICAgLm1hcCgocCkgPT4ge1xuICAgICAgaWYgKHAuaW5kZXggIT09IGxhc3RQYXJ0LmluZGV4KSB7XG4gICAgICAgIHJldHVybiBwO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBPbmx5IHJlcGxhY2UgY29udGVudCBmb3Igc3RyZWFtaW5nIHBhcnRzICh0ZXh0LCByZWFzb25pbmcpIHdoZXJlIHRoZVxuICAgICAgICogY2xpZW50J3MgdHJ1bmNhdGVkIHZlcnNpb24gaXMgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBzZXJ2ZXIncyBmdWxsXG4gICAgICAgKiB2ZXJzaW9uLiBGb3Igc3RhdGVmdWwgcGFydHMgKHRvb2xzKSwgdGhlIHNlcnZlcidzIHZlcnNpb24gaXNcbiAgICAgICAqIGF1dGhvcml0YXRpdmUgXHUyMDE0IGl0IG1heSBoYXZlIGV2b2x2ZWQgKGUuZy4gYXBwcm92YWwtcmVxdWVzdGVkIFx1MjE5MlxuICAgICAgICogb3V0cHV0LWRlbmllZCkgYWZ0ZXIgdGhlIGNsaWVudCBzbmFwc2hvdCB3YXMgdGFrZW4uXG4gICAgICAgKi9cbiAgICAgIGlmIChpc1N0cmVhbWluZ0NvbnRlbnQobGFzdFBhcnQucGFydCkpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4ucCwgcGFydDogbGFzdFBhcnQucGFydCB9IGFzIFBhcnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcDtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlVUlNZXNzYWdlczxUb29scyBleHRlbmRzIFRvb2xTZXQ+KG9wdHM6IHtcbiAgbWVzc2FnZXM6IE1lc3NhZ2VbXTtcbiAgcGFydHM6IFBhcnRbXTtcbiAgdW50aWw/OiBudW1iZXI7XG4gIGluY2x1ZGVRdWV1ZWQ/OiBib29sZWFuO1xuICAvKiogV2hlbiB0cnVlLCBmaWx0ZXJzIG91dCBzdWItdG9vbCBwYXJ0cyBzbyB0aGUgTExNIGRvZXNuJ3Qgc2VlIHRoZW0uICovXG4gIGV4Y2x1ZGVTdWJUb29sUGFydHM/OiBib29sZWFuO1xufSkge1xuICB0eXBlIFR5cGVkVUlNZXNzYWdlID0gVUlNZXNzYWdlPHVua25vd24sIEFnZW50RGF0YVR5cGVzLCBJbmZlclVJVG9vbHM8VG9vbHM+PjtcblxuICBsZXQgZmlsdGVyZWQgPSBvcHRzLm1lc3NhZ2VzO1xuXG4gIGlmIChvcHRzLnVudGlsICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB1bnRpbCA9IG9wdHMudW50aWw7XG4gICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoKG0pID0+IG0uY3JlYXRlZEF0IDw9IHVudGlsKTtcbiAgfVxuXG4gIGlmICghb3B0cy5pbmNsdWRlUXVldWVkKSB7XG4gICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoKG0pID0+IG0uc3RhcnRlZEF0ICE9PSBudWxsKTtcbiAgfVxuXG4gIC8vIFNvcnQgYnkgY3JlYXRlZEF0IHNvIG1lc3NhZ2VzIGFyZSBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIHJlZ2FyZGxlc3Mgb2ZcbiAgLy8gaG93IHRoZSBzdG9yYWdlIGxheWVyIHJldHVybnMgdGhlbSAoZS5nLiBsb2NhbCBGUyByZWFkcyBpbiByZWFkZGlyIG9yZGVyKS5cbiAgZmlsdGVyZWQgPSBbLi4uZmlsdGVyZWRdLnNvcnQoKGEsIGIpID0+IGEuY3JlYXRlZEF0IC0gYi5jcmVhdGVkQXQpO1xuXG4gIGNvbnN0IHBhcnRzID0gb3B0cy5leGNsdWRlU3ViVG9vbFBhcnRzXG4gICAgPyBvcHRzLnBhcnRzLmZpbHRlcigocCkgPT4gIWlzU3ViVG9vbFBhcnQocCkpXG4gICAgOiBvcHRzLnBhcnRzO1xuXG4gIGNvbnN0IHBhcnRzQnlNZXNzYWdlID0gbmV3IE1hcDxzdHJpbmcsIFBhcnRbXT4oKTtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgY29uc3QgbWVzc2FnZUlkID0gU3RyaW5nKHBhcnQubWVzc2FnZUlkKTtcbiAgICBjb25zdCBleGlzdGluZyA9IHBhcnRzQnlNZXNzYWdlLmdldChtZXNzYWdlSWQpID8/IFtdO1xuICAgIGV4aXN0aW5nLnB1c2gocGFydCk7XG4gICAgcGFydHNCeU1lc3NhZ2Uuc2V0KG1lc3NhZ2VJZCwgZXhpc3RpbmcpO1xuICB9XG5cbiAgcmV0dXJuIGZpbHRlcmVkXG4gICAgLm1hcCgobSkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZUlkID0gU3RyaW5nKG0uaWQpO1xuICAgICAgbGV0IG1lc3NhZ2VQYXJ0cyA9IHBhcnRzQnlNZXNzYWdlLmdldChtZXNzYWdlSWQpID8/IFtdO1xuICAgICAgbWVzc2FnZVBhcnRzLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcblxuICAgICAgaWYgKG0uaW50ZXJydXB0ZWRMYXN0UGFydCAhPSBudWxsKSB7XG4gICAgICAgIG1lc3NhZ2VQYXJ0cyA9IGFwcGx5SW50ZXJydXB0Q3V0b2ZmKHtcbiAgICAgICAgICBwYXJ0czogbWVzc2FnZVBhcnRzLFxuICAgICAgICAgIGxhc3RQYXJ0OiBtLmludGVycnVwdGVkTGFzdFBhcnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogbWVzc2FnZUlkLFxuICAgICAgICByb2xlOiBtLnJvbGUsXG4gICAgICAgIHBhcnRzOiBtZXNzYWdlUGFydHMubWFwKChwKSA9PiBwLnBhcnQpLFxuICAgICAgfSBhcyBUeXBlZFVJTWVzc2FnZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKG0pID0+IG0ucGFydHMubGVuZ3RoID4gMCk7XG59XG4iLCAiZXhwb3J0IHR5cGUgU3RlcFVzYWdlID0ge1xuICBzdGVwSW5kZXg6IG51bWJlcjtcbiAgbW9kZWw6IHN0cmluZztcbiAgaW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgb3V0cHV0VG9rZW5zOiBudW1iZXI7XG4gIHRvdGFsVG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlUmVhZFRva2VuczogbnVtYmVyO1xuICBjYWNoZVdyaXRlVG9rZW5zOiBudW1iZXI7XG4gIHJlYXNvbmluZ1Rva2VuczogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgVXNhZ2VTdW1tYXJ5ID0ge1xuICBtb2RlbDogc3RyaW5nO1xuICBpbnB1dFRva2VuczogbnVtYmVyO1xuICBvdXRwdXRUb2tlbnM6IG51bWJlcjtcbiAgdG90YWxUb2tlbnM6IG51bWJlcjtcbiAgY2FjaGVSZWFkVG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlV3JpdGVUb2tlbnM6IG51bWJlcjtcbiAgcmVhc29uaW5nVG9rZW5zOiBudW1iZXI7XG4gIHN0ZXBDb3VudDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgU2Vzc2lvblVzYWdlID0ge1xuICB0b3RhbDogVXNhZ2VTdW1tYXJ5ICYgeyBtZXNzYWdlQ291bnQ6IG51bWJlciB9O1xuICBieU1lc3NhZ2VJZDogUmVjb3JkPHN0cmluZywgVXNhZ2VTdW1tYXJ5IHwgbnVsbD47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNlc3Npb25Vc2FnZShcbiAgbWVzc2FnZXM6IEFycmF5PHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHVzYWdlOiB7IHN0ZXBzOiBTdGVwVXNhZ2VbXTsgc3VtbWFyeTogVXNhZ2VTdW1tYXJ5IH0gfCBudWxsO1xuICB9PlxuKTogU2Vzc2lvblVzYWdlIHtcbiAgY29uc3QgYnlNZXNzYWdlSWQ6IFJlY29yZDxzdHJpbmcsIFVzYWdlU3VtbWFyeSB8IG51bGw+ID0ge307XG4gIGZvciAoY29uc3QgbSBvZiBtZXNzYWdlcykge1xuICAgIGJ5TWVzc2FnZUlkW20uaWRdID0gbS51c2FnZT8uc3VtbWFyeSA/PyBudWxsO1xuICB9XG5cbiAgY29uc3Qgc3VtbWFyaWVzID0gbWVzc2FnZXNcbiAgICAubWFwKChtKSA9PiBtLnVzYWdlPy5zdW1tYXJ5KVxuICAgIC5maWx0ZXIoKHMpOiBzIGlzIFVzYWdlU3VtbWFyeSA9PiBzICE9PSB1bmRlZmluZWQpO1xuXG4gIGNvbnN0IHRvdGFsID0ge1xuICAgIG1vZGVsOiBzdW1tYXJpZXNbMF0/Lm1vZGVsID8/IFwidW5rbm93blwiLFxuICAgIGlucHV0VG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMuaW5wdXRUb2tlbnMsIDApLFxuICAgIG91dHB1dFRva2Vuczogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLm91dHB1dFRva2VucywgMCksXG4gICAgdG90YWxUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy50b3RhbFRva2VucywgMCksXG4gICAgY2FjaGVSZWFkVG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMuY2FjaGVSZWFkVG9rZW5zLCAwKSxcbiAgICBjYWNoZVdyaXRlVG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMuY2FjaGVXcml0ZVRva2VucywgMCksXG4gICAgcmVhc29uaW5nVG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMucmVhc29uaW5nVG9rZW5zLCAwKSxcbiAgICBzdGVwQ291bnQ6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5zdGVwQ291bnQsIDApLFxuICAgIG1lc3NhZ2VDb3VudDogc3VtbWFyaWVzLmxlbmd0aCxcbiAgfTtcblxuICByZXR1cm4geyB0b3RhbCwgYnlNZXNzYWdlSWQgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFRvb2xTZXQgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IGFzc2VtYmxlVUlNZXNzYWdlcyB9IGZyb20gXCIuLi91dGlscy91aVwiO1xuaW1wb3J0IHsgY29tcHV0ZVNlc3Npb25Vc2FnZSwgdHlwZSBTZXNzaW9uVXNhZ2UgfSBmcm9tIFwiLi4vdXRpbHMvdXNhZ2VcIjtcbmltcG9ydCB0eXBlIHsgU2Vzc2lvbkNvbnRleHQgfSBmcm9tIFwiLi9oYW5kbGVcIjtcblxuZXhwb3J0IHR5cGUgSGlzdG9yeVJlc3VsdCA9IHtcbiAgbWVzc2FnZXM6IFJldHVyblR5cGU8dHlwZW9mIGFzc2VtYmxlVUlNZXNzYWdlcz47XG4gIHN0cmVhbWluZ01lc3NhZ2VJZDogc3RyaW5nIHwgbnVsbDtcbiAgdXNhZ2U6IFNlc3Npb25Vc2FnZTtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoaXN0b3J5PFRvb2xzIGV4dGVuZHMgVG9vbFNldD4oXG4gIHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dFxuKSB7XG4gIGNvbnN0IFtzZXNzaW9uLCBtZXNzYWdlcywgcGFydHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2Uuc2Vzc2lvbi5nZXQoc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkKSxcbiAgICBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLm1lc3NhZ2UubGlzdEJ5U2Vzc2lvbihzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQpLFxuICAgIHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UucGFydC5saXN0QnlTZXNzaW9uKHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCksXG4gIF0pO1xuXG4gIGNvbnN0IGxhc3RBc3Npc3RhbnQgPVxuICAgIG1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uaWQgPT09IHNlc3Npb24/Lmxhc3RNZXNzYWdlSWQgJiYgbS5yb2xlID09PSBcImFzc2lzdGFudFwiKSA/P1xuICAgIG1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS5yb2xlID09PSBcImFzc2lzdGFudFwiKS5hdCgtMSk7XG5cbiAgY29uc3QgaXNTdHJlYW1pbmcgPVxuICAgIGxhc3RBc3Npc3RhbnQ/LmNvbXBsZXRlZEF0ID09PSBudWxsICYmIGxhc3RBc3Npc3RhbnQ/LmludGVycnVwdGVkQXQgPT09IG51bGw7XG4gIGNvbnN0IHN0cmVhbWluZ01lc3NhZ2VJZCA9IGlzU3RyZWFtaW5nID8gbGFzdEFzc2lzdGFudC5pZCA6IG51bGw7XG4gIGNvbnN0IHZpc2libGVVbnRpbCA9IGxhc3RBc3Npc3RhbnQ/LmNyZWF0ZWRBdDtcblxuICBjb25zdCBhc3NlbWJsZWQgPSBhc3NlbWJsZVVJTWVzc2FnZXM8VG9vbHM+KHtcbiAgICBtZXNzYWdlcyxcbiAgICBwYXJ0cyxcbiAgICBpbmNsdWRlUXVldWVkOiB2aXNpYmxlVW50aWwgIT09IHVuZGVmaW5lZCxcbiAgICB1bnRpbDogdmlzaWJsZVVudGlsLFxuICB9KTtcblxuICBjb25zdCB1c2FnZSA9IGNvbXB1dGVTZXNzaW9uVXNhZ2UobWVzc2FnZXMpO1xuXG4gIHJldHVybiB7IG1lc3NhZ2VzOiBhc3NlbWJsZWQsIHN0cmVhbWluZ01lc3NhZ2VJZCwgdXNhZ2UgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFVJTWVzc2FnZSB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHR5cGUgeyBTZXNzaW9uQ29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuXG5leHBvcnQgdHlwZSBJbnRlcnJ1cHRPcHRpb25zID0ge1xuICBsYXN0UGFydD86IHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHBhcnQ6IHVua25vd247XG4gIH07XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW50ZXJydXB0KFxuICBzZXNzaW9uQ29udGV4dDogU2Vzc2lvbkNvbnRleHQsXG4gIG9wdHM/OiBJbnRlcnJ1cHRPcHRpb25zXG4pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBjb25zdCBtZXNzYWdlcyA9IGF3YWl0IHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UubWVzc2FnZS5saXN0QnlTZXNzaW9uKFxuICAgIHNlc3Npb25Db250ZXh0LnNlc3Npb25JZFxuICApO1xuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGxldCBwZW5kaW5nQXNzaXN0YW50TWVzc2FnZXMgPSBtZXNzYWdlcy5maWx0ZXIoXG4gICAgKG0pID0+XG4gICAgICBtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIgJiZcbiAgICAgIG0uY29tcGxldGVkQXQgPT09IG51bGwgJiZcbiAgICAgIG0uaW50ZXJydXB0ZWRBdCA9PT0gbnVsbFxuICApO1xuXG4gIGlmIChwZW5kaW5nQXNzaXN0YW50TWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc3QgTUFYX1JFVFJPQUNUSVZFX01TID0gNV8wMDA7XG4gICAgY29uc3QgbGF0ZXN0ID0gbWVzc2FnZXNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChtKSA9PlxuICAgICAgICAgIG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiAmJlxuICAgICAgICAgIG0uaW50ZXJydXB0ZWRBdCA9PT0gbnVsbCAmJlxuICAgICAgICAgIG0uY29tcGxldGVkQXQgIT09IG51bGwgJiZcbiAgICAgICAgICBub3cgLSBtLmNvbXBsZXRlZEF0IDwgTUFYX1JFVFJPQUNUSVZFX01TXG4gICAgICApXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi5jcmVhdGVkQXQgLSBhLmNyZWF0ZWRBdClcbiAgICAgIC5hdCgwKTtcbiAgICBpZiAobGF0ZXN0KSB7XG4gICAgICBwZW5kaW5nQXNzaXN0YW50TWVzc2FnZXMgPSBbbGF0ZXN0XTtcbiAgICB9XG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwZW5kaW5nQXNzaXN0YW50TWVzc2FnZXMubWFwKChtKSA9PlxuICAgICAgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5tZXNzYWdlLnNldChtLmlkLCB7XG4gICAgICAgIC4uLm0sXG4gICAgICAgIGludGVycnVwdGVkQXQ6IG5vdyxcbiAgICAgICAgaW50ZXJydXB0ZWRMYXN0UGFydDogb3B0cz8ubGFzdFBhcnQgPz8gbnVsbCxcbiAgICAgIH0pXG4gICAgKVxuICApO1xuXG4gIGNvbnN0IG1lc3NhZ2VJZHMgPSBuZXcgU2V0KHBlbmRpbmdBc3Npc3RhbnRNZXNzYWdlcy5tYXAoKG0pID0+IG0uaWQpKTtcbiAgaWYgKG1lc3NhZ2VJZHMuc2l6ZSA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFsbFBhcnRzID0gYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5wYXJ0Lmxpc3RCeVNlc3Npb24oXG4gICAgc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkXG4gICk7XG5cbiAgZm9yIChjb25zdCBwIG9mIGFsbFBhcnRzKSB7XG4gICAgaWYgKCFtZXNzYWdlSWRzLmhhcyhwLm1lc3NhZ2VJZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBwLnBhcnQgJiZcbiAgICAgIFwic3RhdGVcIiBpbiBwLnBhcnQgJiZcbiAgICAgIChwLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlID09PSBcImFwcHJvdmFsLXJlcXVlc3RlZFwiICYmXG4gICAgICBcImFwcHJvdmFsXCIgaW4gcC5wYXJ0XG4gICAgKSB7XG4gICAgICBjb25zdCBhcHByb3ZhbCA9IChwLnBhcnQgYXMgeyBhcHByb3ZhbD86IHsgaWQ6IHN0cmluZyB9IH0pLmFwcHJvdmFsO1xuICAgICAgaWYgKGFwcHJvdmFsPy5pZCkge1xuICAgICAgICBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnBhcnQuc2V0KHAuaWQsIHtcbiAgICAgICAgICAuLi5wLFxuICAgICAgICAgIHBhcnQ6IHtcbiAgICAgICAgICAgIC4uLnAucGFydCxcbiAgICAgICAgICAgIHN0YXRlOiBcIm91dHB1dC1kZW5pZWRcIixcbiAgICAgICAgICAgIGFwcHJvdmFsOiB7XG4gICAgICAgICAgICAgIC4uLmFwcHJvdmFsLFxuICAgICAgICAgICAgICBhcHByb3ZlZDogZmFsc2UsXG4gICAgICAgICAgICAgIHJlYXNvbjogXCJpbnRlcnJ1cHRlZFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIFVJTWVzc2FnZVtcInBhcnRzXCJdW251bWJlcl0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgRmluaXNoUmVhc29uLCBUb29sU2V0LCBVSU1lc3NhZ2UsIFVJTWVzc2FnZUNodW5rIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyBhbGwgfSBmcm9tIFwiYmV0dGVyLWFsbFwiO1xuaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcbmltcG9ydCB7IHVsaWQgfSBmcm9tIFwidWxpZFwiO1xuaW1wb3J0IHR5cGUgeyBUeXBlZFVJTWVzc2FnZSB9IGZyb20gXCIuLi9hZ2VudC9yZWdpc3RyeVwiO1xuaW1wb3J0IHR5cGUgeyBTa2lsbFN1bW1hcnkgfSBmcm9tIFwiLi4vc2tpbGxzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2UsIFBhcnQgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL2xvZ2dlclwiO1xuaW1wb3J0IHR5cGUgeyBTdGVwVXNhZ2UgfSBmcm9tIFwiLi4vdXRpbHMvdXNhZ2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgU3RyZWFtVGV4dFJlc3VsdCxcbiAgc3RyZWFtVGV4dCxcbiAgc3RyZWFtVGV4dFN0ZXAsXG59IGZyb20gXCIuL2FpLWxvb3Avc3RyZWFtLXRleHRcIjtcbmltcG9ydCB0eXBlIHsgU2Vzc2lvbkNvbnRleHQgfSBmcm9tIFwiLi9oYW5kbGVcIjtcbmltcG9ydCB7IGludGVycnVwdCB9IGZyb20gXCIuL2ludGVycnVwdFwiO1xuaW1wb3J0IHR5cGUgeyBVcGRhdGVPcHRpb25zIH0gZnJvbSBcIi4vdXBkYXRlXCI7XG5cbmNvbnN0IERFRkFVTFRfU1RFUF9USFJPVUdIUFVUID0gMTAwO1xuXG50eXBlIEFwcHJvdmFsRGF0YSA9IHtcbiAgYXBwcm92YWxJZDogc3RyaW5nO1xuICBhcHByb3ZlZDogYm9vbGVhbjtcbiAgcmVhc29uPzogc3RyaW5nO1xufTtcblxudHlwZSBNZXNzYWdlRGF0YTxUb29scyBleHRlbmRzIFRvb2xTZXQ+ID1cbiAgfCBVSU1lc3NhZ2VcbiAgfCB7XG4gICAgICByb2xlPzogVHlwZWRVSU1lc3NhZ2U8VG9vbHM+W1wicm9sZVwiXTtcbiAgICAgIHBhcnRzOiBUeXBlZFVJTWVzc2FnZTxUb29scz5bXCJwYXJ0c1wiXTtcbiAgICAgIGlkPzogc3RyaW5nO1xuICAgIH07XG5cbnR5cGUgU2VuZElucHV0PFRvb2xzIGV4dGVuZHMgVG9vbFNldD4gPVxuICB8IHN0cmluZ1xuICB8IE1lc3NhZ2VEYXRhPFRvb2xzPlxuICB8IHsgdHlwZTogXCJtZXNzYWdlXCI7IG1lc3NhZ2U6IE1lc3NhZ2VEYXRhPFRvb2xzPiB9XG4gIHwgeyB0eXBlOiBcImFwcHJvdmFsXCI7IGFwcHJvdmFsOiBBcHByb3ZhbERhdGEgfTtcblxuZXhwb3J0IHR5cGUgU2VuZE9wdGlvbnM8VG9vbHMgZXh0ZW5kcyBUb29sU2V0LCBUQ29udGV4dD4gPSB7XG4gIGludGVycnVwdElmU3RyZWFtaW5nPzpcbiAgICB8IGJvb2xlYW5cbiAgICB8IHsgbGFzdFBhcnQ6IHsgaW5kZXg6IG51bWJlcjsgcGFydDogdW5rbm93biB9IH07XG4gIGNvbnRleHQ/OiBUQ29udGV4dDtcbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcbn0gJiBVcGRhdGVPcHRpb25zPFRvb2xzPjtcblxuZXhwb3J0IHR5cGUgU2VuZFJlc3VsdCA9IHtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIGRvbmU6IHRydWUgfCBQcm9taXNlPHRydWU+O1xufTtcblxuZXhwb3J0IHR5cGUgQWN0aXZlUnVuID0ge1xuICBjaHVua3M6IFVJTWVzc2FnZUNodW5rW107XG4gIHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbTxVSU1lc3NhZ2VDaHVuaz47XG4gIGRvbmU6IFByb21pc2U8dm9pZD47XG4gIC8qKiBSZXNvbHZlcyB3aGVuIGEgbmV3IGNodW5rIGlzIGF2YWlsYWJsZS4gUmVwbGFjZWQgYWZ0ZXIgZWFjaCBub3RpZmljYXRpb24uICovXG4gIG9uQ2h1bms6IFByb21pc2U8dm9pZD47XG59O1xuXG5jb25zdCBBQ1RJVkVfUlVOU19LRVkgPSBTeW1ib2wuZm9yKFwiZXhwZXJpbWVudGFsLWFnZW50OmFjdGl2ZVJ1bnNcIik7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3RpdmVSdW5zKCk6IE1hcDxzdHJpbmcsIEFjdGl2ZVJ1bj4ge1xuICBjb25zdCBnID0gZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3ltYm9sLCBNYXA8c3RyaW5nLCBBY3RpdmVSdW4+IHwgdW5kZWZpbmVkPjtcbiAgaWYgKCFnW0FDVElWRV9SVU5TX0tFWV0pIHtcbiAgICBnW0FDVElWRV9SVU5TX0tFWV0gPSBuZXcgTWFwKCk7XG4gIH1cbiAgcmV0dXJuIGdbQUNUSVZFX1JVTlNfS0VZXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmQ8VG9vbHMgZXh0ZW5kcyBUb29sU2V0LCBUQ29udGV4dD4oXG4gIHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dCxcbiAgaW5wdXQ6IFNlbmRJbnB1dDxUb29scz4gfCBTZW5kSW5wdXQ8VG9vbHM+W10sXG4gIG9wdHM/OiBTZW5kT3B0aW9uczxUb29scywgVENvbnRleHQ+XG4pOiBQcm9taXNlPFNlbmRSZXN1bHQ+IHtcbiAgY29uc3Qge1xuICAgIGludGVycnVwdElmU3RyZWFtaW5nOiBfXyxcbiAgICBjb250ZXh0OiBfX18sXG4gICAgYWJvcnRTaWduYWw6IF9fX18sXG4gICAgLi4uc2Vzc2lvblVwZGF0ZXNcbiAgfSA9IG9wdHMgPz8ge307XG5cbiAgaWYgKG9wdHM/LmludGVycnVwdElmU3RyZWFtaW5nKSB7XG4gICAgY29uc3QgbGFzdFBhcnQgPVxuICAgICAgdHlwZW9mIG9wdHMuaW50ZXJydXB0SWZTdHJlYW1pbmcgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBvcHRzLmludGVycnVwdElmU3RyZWFtaW5nLmxhc3RQYXJ0XG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGF3YWl0IGludGVycnVwdChzZXNzaW9uQ29udGV4dCwgeyBsYXN0UGFydCB9KTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB3b3JrZmxvd1J1bklkLFxuICAgIHdvcmtmbG93V3JpdGFibGUsXG4gICAgZXhpc3RpbmdQYXJ0Q291bnQsXG4gICAgYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgIGFzc2lzdGFudE1lc3NhZ2VDcmVhdGVkQXQsXG4gIH0gPSBhd2FpdCBlcnJvcmUudHJ5QXN5bmMoe1xuICAgIHRyeTogKCkgPT5cbiAgICAgIGluaXRTZXNzaW9uU3RlcDxUb29scz4oe1xuICAgICAgICBzZXNzaW9uQ29udGV4dCxcbiAgICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgICAgIHNlc3Npb25VcGRhdGVzLFxuICAgICAgICBpbnB1dCxcbiAgICAgIH0pLFxuICAgIGNhdGNoOiAoZSkgPT4ge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFNlbmRFcnJvcih7XG4gICAgICAgIGlkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgICAgIHJlYXNvbjogU3RyaW5nKGUpLFxuICAgICAgICBjYXVzZTogZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGxvb3BPcHRzID0ge1xuICAgIHNlc3Npb25Db250ZXh0LFxuICAgIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICBjcmVhdGVkQXQ6IGFzc2lzdGFudE1lc3NhZ2VDcmVhdGVkQXQsXG4gICAgY29udGV4dDogKG9wdHM/LmNvbnRleHQgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHNlc3Npb25VcGRhdGVzLFxuICAgIGxhc3RQYXJ0SW5kZXg6IGV4aXN0aW5nUGFydENvdW50LFxuICAgIHdvcmtmbG93UnVuSWQsXG4gIH07XG5cbiAgaWYgKHdvcmtmbG93V3JpdGFibGUpIHtcbiAgICBhd2FpdCBydW5Mb29wPFRvb2xzPih7IC4uLmxvb3BPcHRzLCB3cml0YWJsZTogd29ya2Zsb3dXcml0YWJsZSB9KTtcbiAgICByZXR1cm4geyBhc3Npc3RhbnRNZXNzYWdlSWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIGNvbnN0IGNodW5rczogVUlNZXNzYWdlQ2h1bmtbXSA9IFtdO1xuICBsZXQgbm90aWZ5Q2h1bms6ICgpID0+IHZvaWQ7XG4gIGxldCBvbkNodW5rID0gbmV3IFByb21pc2U8dm9pZD4oKHIpID0+IHtcbiAgICBub3RpZnlDaHVuayA9IHI7XG4gIH0pO1xuXG4gIGNvbnN0IHdyaXRhYmxlID0gbmV3IFdyaXRhYmxlU3RyZWFtPFVJTWVzc2FnZUNodW5rPih7XG4gICAgd3JpdGUoY2h1bmspIHtcbiAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgIGNvbnN0IHByZXYgPSBub3RpZnlDaHVuaztcbiAgICAgIG9uQ2h1bmsgPSBuZXcgUHJvbWlzZTx2b2lkPigocikgPT4ge1xuICAgICAgICBub3RpZnlDaHVuayA9IHI7XG4gICAgICB9KTtcbiAgICAgIHByZXYoKTtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBkb25lID0gcnVuTG9vcDxUb29scz4oeyAuLi5sb29wT3B0cywgd3JpdGFibGUgfSk7XG5cbiAgY29uc3QgYWN0aXZlUnVuOiBBY3RpdmVSdW4gPSB7XG4gICAgY2h1bmtzLFxuICAgIHdyaXRhYmxlLFxuICAgIGRvbmUsXG4gICAgZ2V0IG9uQ2h1bmsoKSB7XG4gICAgICByZXR1cm4gb25DaHVuaztcbiAgICB9LFxuICB9O1xuICBjb25zdCBhY3RpdmVSdW5zID0gZ2V0QWN0aXZlUnVucygpO1xuICBhY3RpdmVSdW5zLnNldChhc3Npc3RhbnRNZXNzYWdlSWQsIGFjdGl2ZVJ1bik7XG4gIGRvbmUuZmluYWxseSgoKSA9PiBhY3RpdmVSdW5zLmRlbGV0ZShhc3Npc3RhbnRNZXNzYWdlSWQpKTtcblxuICByZXR1cm4geyBhc3Npc3RhbnRNZXNzYWdlSWQsIGRvbmU6IGRvbmUudGhlbigoKSA9PiB0cnVlKSB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBBSSBMb29wXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkxvb3A8VG9vbHMgZXh0ZW5kcyBUb29sU2V0Pih7XG4gIHdvcmtmbG93UnVuSWQsXG4gIHNlc3Npb25Db250ZXh0LFxuICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIGNyZWF0ZWRBdCxcbiAgY29udGV4dCxcbiAgc2Vzc2lvblVwZGF0ZXMsXG4gIHdyaXRhYmxlLFxuICBsYXN0UGFydEluZGV4OiBpbml0aWFsUGFydEluZGV4LFxufToge1xuICB3b3JrZmxvd1J1bklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dDtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xuICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgc2Vzc2lvblVwZGF0ZXM/OiBVcGRhdGVPcHRpb25zPFRvb2xzPjtcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtO1xuICBsYXN0UGFydEluZGV4OiBudW1iZXI7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFnZW50ID0gc2Vzc2lvbkNvbnRleHQuYWdlbnQ7XG5cbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHsgLi4uYWdlbnQub3B0aW9ucy5sb2dnaW5nLCBuYW1lOiBhZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcImFpLWxvb3BcIixcbiAgfSk7XG4gIGNvbnN0IG1zZ0xvZyA9IGxvZy53aXRoQ29udGV4dCh7XG4gICAgc2Vzc2lvbklkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgbWVzc2FnZUlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIH0pO1xuICBjb25zdCBkb25lTWVzc2FnZSA9IG1zZ0xvZy50aW1lKFwib25NZXNzYWdlXCIpO1xuXG4gIGxldCBmaW5pc2hSZWFzb246IEZpbmlzaFJlYXNvbiB8IHVuZGVmaW5lZDtcbiAgbGV0IGxhc3RQYXJ0SW5kZXggPSBpbml0aWFsUGFydEluZGV4O1xuICBjb25zdCB1c2FnZVN0ZXBzOiBTdGVwVXNhZ2VbXSA9IFtdO1xuICBsZXQgZGlzY292ZXJlZFNraWxsczogU2tpbGxTdW1tYXJ5W10gfCBudWxsID0gbnVsbDtcblxuICB0cnkge1xuICAgIHdoaWxlIChmaW5pc2hSZWFzb24gIT09IFwic3RvcFwiKSB7XG4gICAgICBjb25zdCBzdHJlYW1UZXh0Rm4gPSB3b3JrZmxvd1J1bklkXG4gICAgICAgID8gc3RyZWFtVGV4dFN0ZXA8VG9vbHM+XG4gICAgICAgIDogc3RyZWFtVGV4dDxUb29scz47XG4gICAgICBjb25zdCB0aHJvdWdocHV0ID0gd29ya2Zsb3dSdW5JZCA/IDUgOiBERUZBVUxUX1NURVBfVEhST1VHSFBVVDtcblxuICAgICAgY29uc3QgcmVzdWx0OiBTdHJlYW1UZXh0UmVzdWx0ID0gYXdhaXQgc3RyZWFtVGV4dEZuKHtcbiAgICAgICAgc3RlcFRocm91Z2hwdXQ6IHRocm91Z2hwdXQsXG4gICAgICAgIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgYWdlbnQsXG4gICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgIHNlc3Npb25VcGRhdGVzLFxuICAgICAgICB3cml0YWJsZSxcbiAgICAgICAgbGFzdFBhcnRJbmRleCxcbiAgICAgICAgc3RlcEluZGV4T2Zmc2V0OiB1c2FnZVN0ZXBzLmxlbmd0aCxcbiAgICAgICAgZGlzY292ZXJlZFNraWxscyxcbiAgICAgIH0pO1xuXG4gICAgICBmaW5pc2hSZWFzb24gPSByZXN1bHQuZmluaXNoUmVhc29uO1xuICAgICAgbGFzdFBhcnRJbmRleCA9IHJlc3VsdC5sYXN0UGFydEluZGV4O1xuICAgICAgdXNhZ2VTdGVwcy5wdXNoKC4uLnJlc3VsdC51c2FnZVN0ZXBzKTtcbiAgICAgIGRpc2NvdmVyZWRTa2lsbHMgPSByZXN1bHQuZGlzY292ZXJlZFNraWxscztcblxuICAgICAgaWYgKHJlc3VsdC5tYXhTdGVwcyAhPSBudWxsICYmIHVzYWdlU3RlcHMubGVuZ3RoID49IHJlc3VsdC5tYXhTdGVwcykge1xuICAgICAgICBtc2dMb2cuaW5mbyhcInJlYWNoZWQgbWF4U3RlcHMgbGltaXRcIiwgeyBtYXhTdGVwczogcmVzdWx0Lm1heFN0ZXBzIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC5wZW5kaW5nQXBwcm92YWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbXNnTG9nLmluZm8oXCJwZW5kaW5nIGFwcHJvdmFscywgc3RvcHBpbmcgbG9vcFwiLCB7XG4gICAgICAgICAgY291bnQ6IHJlc3VsdC5wZW5kaW5nQXBwcm92YWxzLmxlbmd0aCxcbiAgICAgICAgICB0b29sczogcmVzdWx0LnBlbmRpbmdBcHByb3ZhbHMubWFwKChwKSA9PiBwLnRvb2xOYW1lKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRvbmVNZXNzYWdlKHsgdG90YWxTdGVwczogdXNhZ2VTdGVwcy5sZW5ndGggfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIG1zZ0xvZy5lcnJvcihcIkFJIGxvb3AgZmFpbGVkXCIsIHtcbiAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgfSk7XG4gICAgdGhyb3cgZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGNvbXBsZXRlTWVzc2FnZVN0ZXAoe1xuICAgICAgYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgc2Vzc2lvbkNvbnRleHQsXG4gICAgICB3cml0YWJsZSxcbiAgICAgIHVzYWdlU3RlcHMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogU3RlcHNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuYXN5bmMgZnVuY3Rpb24gaW5pdFNlc3Npb25TdGVwPFRvb2xzIGV4dGVuZHMgVG9vbFNldD4oe1xuICBzZXNzaW9uQ29udGV4dCxcbiAgc2Vzc2lvbklkLFxuICBzZXNzaW9uVXBkYXRlcyxcbiAgaW5wdXQsXG59OiB7XG4gIHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dDtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHNlc3Npb25VcGRhdGVzOiBVcGRhdGVPcHRpb25zPFRvb2xTZXQ+O1xuICBpbnB1dDogU2VuZElucHV0PFRvb2xzPiB8IFNlbmRJbnB1dDxUb29scz5bXTtcbn0pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuXG4gIGxldCB3b3JrZmxvd1J1bklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCB3b3JrZmxvd1dyaXRhYmxlOiBXcml0YWJsZVN0cmVhbSB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IGdldFdvcmtmbG93TWV0YWRhdGEsIGdldFdyaXRhYmxlIH0gPSBhd2FpdCBpbXBvcnQoXCJ3b3JrZmxvd1wiKTtcbiAgICB3b3JrZmxvd1J1bklkID0gZ2V0V29ya2Zsb3dNZXRhZGF0YSgpLndvcmtmbG93UnVuSWQ7XG4gICAgd29ya2Zsb3dXcml0YWJsZSA9IGdldFdyaXRhYmxlKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIHdvcmtmbG93IG5vdCBpbnN0YWxsZWRcbiAgfVxuXG4gIGNvbnN0IG5ld01lc3NhZ2VzOiBNZXNzYWdlW10gPSBbXTtcbiAgY29uc3QgbmV3UGFydHM6IFBhcnRbXSA9IFtdO1xuICBjb25zdCBuZXdBcHByb3ZhbHM6IEFwcHJvdmFsRGF0YVtdID0gW107XG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGZvciAoY29uc3QgaSBvZiBpbnB1dCkge1xuICAgICAgY29uc3QgeyBtZXNzYWdlLCBwYXJ0cywgYXBwcm92YWxzIH0gPSB0b01lc3NhZ2VBbmRQYXJ0cyh7XG4gICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgICBpbnB1dDogaSxcbiAgICAgICAgZGVmYXVsdFJvbGU6IFwidXNlclwiLFxuICAgICAgfSk7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICBuZXdNZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgbmV3UGFydHMucHVzaCguLi5wYXJ0cyk7XG4gICAgICBuZXdBcHByb3ZhbHMucHVzaCguLi5hcHByb3ZhbHMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIHBhcnRzLCBhcHByb3ZhbHMgfSA9IHRvTWVzc2FnZUFuZFBhcnRzKHtcbiAgICAgIGlucHV0LFxuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgICBkZWZhdWx0Um9sZTogXCJ1c2VyXCIsXG4gICAgfSk7XG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIG5ld01lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG4gICAgfVxuICAgIG5ld1BhcnRzLnB1c2goLi4ucGFydHMpO1xuICAgIG5ld0FwcHJvdmFscy5wdXNoKC4uLmFwcHJvdmFscyk7XG4gIH1cblxuICBjb25zdCBsYXN0TmV3TWVzc2FnZSA9IG5ld01lc3NhZ2VzLmF0KC0xKTtcbiAgY29uc3QgcmV1c2VBc3Npc3RhbnQgPSBsYXN0TmV3TWVzc2FnZT8ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIjtcblxuICBjb25zdCBhc3Npc3RhbnRNZXNzYWdlSWQgPSByZXVzZUFzc2lzdGFudFxuICAgID8gbGFzdE5ld01lc3NhZ2UuaWRcbiAgICA6IGBtZXNzYWdlXyR7dWxpZCgpfWA7XG4gIGNvbnN0IGJhc2VUaW1lID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgYXNzaXN0YW50TWVzc2FnZUNyZWF0ZWRBdCA9IGJhc2VUaW1lICsgbmV3TWVzc2FnZXMubGVuZ3RoO1xuXG4gIGlmICghcmV1c2VBc3Npc3RhbnQpIHtcbiAgICBuZXdNZXNzYWdlcy5wdXNoKHtcbiAgICAgIGlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCxcbiAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgICBjcmVhdGVkQXQ6IGFzc2lzdGFudE1lc3NhZ2VDcmVhdGVkQXQsXG4gICAgICBzdGFydGVkQXQ6IG51bGwsXG4gICAgICBjb21wbGV0ZWRBdDogbnVsbCxcbiAgICAgIGludGVycnVwdGVkQXQ6IG51bGwsXG4gICAgICBpbnRlcnJ1cHRlZExhc3RQYXJ0OiBudWxsLFxuICAgICAgdXNhZ2U6IG51bGwsXG4gICAgICB3b3JrZmxvd1J1bklkOiBudWxsLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmdQYXJ0Q291bnQgPSByZXVzZUFzc2lzdGFudFxuICAgID8gbmV3UGFydHMuZmlsdGVyKChwKSA9PiBwLm1lc3NhZ2VJZCA9PT0gYXNzaXN0YW50TWVzc2FnZUlkKS5sZW5ndGhcbiAgICA6IDA7XG5cbiAgbGV0IHNlc3Npb24gPSBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG4gIGlmICghc2Vzc2lvbikge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gc2Vzc2lvbkNvbnRleHQuYWdlbnQuc2Vzc2lvbkRlZmF1bHRzO1xuICAgIGNvbnN0IHNraWxsc0RpciA9IHNlc3Npb25VcGRhdGVzLnNraWxsc0RpciA/PyBkZWZhdWx0cy5za2lsbHNEaXIgPz8gbnVsbDtcbiAgICBzZXNzaW9uID0ge1xuICAgICAgaWQ6IHNlc3Npb25JZCxcbiAgICAgIGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgIHVwZGF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgIGxhc3RNZXNzYWdlSWQ6IG51bGwsXG4gICAgICBzeXN0ZW06IHNlc3Npb25VcGRhdGVzLnN5c3RlbSA/PyBkZWZhdWx0cy5zeXN0ZW0gPz8gbnVsbCxcbiAgICAgIG1vZGVsOiBzZXNzaW9uVXBkYXRlcy5tb2RlbCA/PyBkZWZhdWx0cy5tb2RlbCA/PyBudWxsLFxuICAgICAgc2FuZGJveElkOiBzZXNzaW9uVXBkYXRlcy5zYW5kYm94SWQgPz8gbnVsbCxcbiAgICAgIGFjdGl2ZVRvb2xzOiBzZXNzaW9uVXBkYXRlcy5hY3RpdmVUb29scyA/PyBkZWZhdWx0cy5hY3RpdmVUb29scyA/PyBudWxsLFxuICAgICAgZ2VuZXJhdGlvbjogc2Vzc2lvblVwZGF0ZXMuZ2VuZXJhdGlvbiA/PyBkZWZhdWx0cy5nZW5lcmF0aW9uID8/IG51bGwsXG4gICAgICBza2lsbHNEaXI6IEFycmF5LmlzQXJyYXkoc2tpbGxzRGlyKVxuICAgICAgICA/IHNraWxsc0RpclxuICAgICAgICA6IC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTmVzdGVkVGVybmFyeTogLlxuICAgICAgICAgIHNraWxsc0RpclxuICAgICAgICAgID8gW3NraWxsc0Rpcl1cbiAgICAgICAgICA6IG51bGwsXG4gICAgfTtcbiAgICBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnNlc3Npb24uc2V0KHNlc3Npb24uaWQsIHNlc3Npb24pO1xuICB9XG5cbiAgYXdhaXQgYWxsKHtcbiAgICBhc3luYyBzYXZlTWVzc2FnZXMoKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbmV3TWVzc2FnZXMubWFwKGFzeW5jIChtLCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLm1lc3NhZ2UuZ2V0KG0uaWQpO1xuICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLm1lc3NhZ2Uuc2V0KG0uaWQsIHtcbiAgICAgICAgICAgIC4uLm0sXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGJhc2VUaW1lICsgaSxcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6XG4gICAgICAgICAgICAgIG0uaWQgPT09IGFzc2lzdGFudE1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgID8gKHdvcmtmbG93UnVuSWQgPz8gbnVsbClcbiAgICAgICAgICAgICAgICA6IG0ud29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgICBhc3luYyBzYXZlUGFydHMoKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbmV3UGFydHMubWFwKGFzeW5jIChwKSA9PlxuICAgICAgICAgIHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UucGFydC5zZXQocC5pZCwgcClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9LFxuICAgIGFzeW5jIHJlc29sdmVBcHByb3ZhbHMoKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbmV3QXBwcm92YWxzLm1hcChhc3luYyAoYSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhcnRJZCA9IGFwcHJvdmFsUGFydElkKGEuYXBwcm92YWxJZCk7XG4gICAgICAgICAgY29uc3QgcGFydCA9IGF3YWl0IHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UucGFydC5nZXQocGFydElkKTtcbiAgICAgICAgICBpZiAoIXBhcnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHByb3ZhbE5vdEZvdW5kRXJyb3Ioe1xuICAgICAgICAgICAgICBpZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgICAgICAgICBhcHByb3ZhbElkOiBhLmFwcHJvdmFsSWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5wYXJ0LnNldChwYXJ0SWQsIHtcbiAgICAgICAgICAgIC4uLnBhcnQsXG4gICAgICAgICAgICBwYXJ0OiB7XG4gICAgICAgICAgICAgIC4uLnBhcnQucGFydCxcbiAgICAgICAgICAgICAgc3RhdGU6IGEuYXBwcm92ZWQgPyBcImFwcHJvdmFsLXJlc3BvbmRlZFwiIDogXCJvdXRwdXQtZGVuaWVkXCIsXG4gICAgICAgICAgICAgIGFwcHJvdmFsOiB7XG4gICAgICAgICAgICAgICAgaWQ6IGEuYXBwcm92YWxJZCxcbiAgICAgICAgICAgICAgICBhcHByb3ZlZDogYS5hcHByb3ZlZCxcbiAgICAgICAgICAgICAgICByZWFzb246IGEucmVhc29uLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSBhcyB0eXBlb2YgcGFydC5wYXJ0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9LFxuICAgIGFzeW5jIHVwZGF0ZVNlc3Npb24oKSB7XG4gICAgICBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnNlc3Npb24uc2V0KHNlc3Npb24uaWQsIHtcbiAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgbGFzdE1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICB1cGRhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHdvcmtmbG93UnVuSWQsXG4gICAgd29ya2Zsb3dXcml0YWJsZSxcbiAgICBleGlzdGluZ1BhcnRDb3VudCxcbiAgICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgYXNzaXN0YW50TWVzc2FnZUNyZWF0ZWRBdCxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29tcGxldGVNZXNzYWdlU3RlcCh7XG4gIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgc2Vzc2lvbkNvbnRleHQsXG4gIHdyaXRhYmxlLFxuICB1c2FnZVN0ZXBzLFxufToge1xuICBhc3Npc3RhbnRNZXNzYWdlSWQ6IHN0cmluZztcbiAgc2Vzc2lvbkNvbnRleHQ6IFNlc3Npb25Db250ZXh0O1xuICB3cml0YWJsZTogV3JpdGFibGVTdHJlYW07XG4gIHVzYWdlU3RlcHM6IFN0ZXBVc2FnZVtdO1xufSkge1xuICBcInVzZSBzdGVwXCI7XG5cbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHtcbiAgICAgIC4uLnNlc3Npb25Db250ZXh0LmFnZW50Lm9wdGlvbnMubG9nZ2luZyxcbiAgICAgIG5hbWU6IHNlc3Npb25Db250ZXh0LmFnZW50Lm5hbWUsXG4gICAgfSxcbiAgICBzdWJzeXN0ZW06IFwiYWktbG9vcFwiLFxuICB9KTtcbiAgY29uc3QgbXNnTG9nID0gbG9nLndpdGhDb250ZXh0KHtcbiAgICBzZXNzaW9uSWQ6IHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCxcbiAgICBtZXNzYWdlSWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgfSk7XG5cbiAgY29uc3QgdXNhZ2UgPVxuICAgIHVzYWdlU3RlcHMubGVuZ3RoID4gMFxuICAgICAgPyB7XG4gICAgICAgICAgc3RlcHM6IHVzYWdlU3RlcHMsXG4gICAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgICAgbW9kZWw6IHVzYWdlU3RlcHNbMF0/Lm1vZGVsID8/IFwidW5rbm93blwiLFxuICAgICAgICAgICAgaW5wdXRUb2tlbnM6IHVzYWdlU3RlcHMucmVkdWNlKChhLCBzKSA9PiBhICsgcy5pbnB1dFRva2VucywgMCksXG4gICAgICAgICAgICBvdXRwdXRUb2tlbnM6IHVzYWdlU3RlcHMucmVkdWNlKChhLCBzKSA9PiBhICsgcy5vdXRwdXRUb2tlbnMsIDApLFxuICAgICAgICAgICAgdG90YWxUb2tlbnM6IHVzYWdlU3RlcHMucmVkdWNlKChhLCBzKSA9PiBhICsgcy50b3RhbFRva2VucywgMCksXG4gICAgICAgICAgICBjYWNoZVJlYWRUb2tlbnM6IHVzYWdlU3RlcHMucmVkdWNlKFxuICAgICAgICAgICAgICAoYSwgcykgPT4gYSArIHMuY2FjaGVSZWFkVG9rZW5zLFxuICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgY2FjaGVXcml0ZVRva2VuczogdXNhZ2VTdGVwcy5yZWR1Y2UoXG4gICAgICAgICAgICAgIChhLCBzKSA9PiBhICsgcy5jYWNoZVdyaXRlVG9rZW5zLFxuICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgcmVhc29uaW5nVG9rZW5zOiB1c2FnZVN0ZXBzLnJlZHVjZShcbiAgICAgICAgICAgICAgKGEsIHMpID0+IGEgKyBzLnJlYXNvbmluZ1Rva2VucyxcbiAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0ZXBDb3VudDogdXNhZ2VTdGVwcy5sZW5ndGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgOiBudWxsO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLm1lc3NhZ2UudXBkYXRlKGFzc2lzdGFudE1lc3NhZ2VJZCwge1xuICAgICAgY29tcGxldGVkQXQ6IERhdGUubm93KCksXG4gICAgICB1c2FnZSxcbiAgICB9KSxcbiAgICB3cml0YWJsZS5jbG9zZSgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCksXG4gIF0pO1xuXG4gIG1zZ0xvZy5pbmZvKFwibWVzc2FnZSBjb21wbGV0ZWRcIiwge1xuICAgIHN0ZXBzOiB1c2FnZVN0ZXBzLmxlbmd0aCxcbiAgICB0b3RhbFRva2VuczogdXNhZ2U/LnN1bW1hcnkudG90YWxUb2tlbnMsXG4gIH0pO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBVdGlsc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwcm92YWxQYXJ0SWQoYXBwcm92YWxJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBwYXJ0XyR7YXBwcm92YWxJZH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwbGF5QWN0aXZlUnVuKFxuICBhY3RpdmU6IEFjdGl2ZVJ1bixcbiAgc3RhcnRJbmRleCA9IDBcbik6IFJlYWRhYmxlU3RyZWFtPFVJTWVzc2FnZUNodW5rPiB7XG4gIGxldCBjdXJzb3IgPSBzdGFydEluZGV4O1xuICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG5cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbTxVSU1lc3NhZ2VDaHVuaz4oe1xuICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgLy8gRHJhaW4gYW55IGJ1ZmZlcmVkIGNodW5rc1xuICAgICAgd2hpbGUgKGN1cnNvciA8IGFjdGl2ZS5jaHVua3MubGVuZ3RoKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShhY3RpdmUuY2h1bmtzW2N1cnNvcisrXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdhaXQgZm9yIGVpdGhlciBhIG5ldyBjaHVuayBvciBjb21wbGV0aW9uXG4gICAgICB3aGlsZSAoIWNhbmNlbGxlZCAmJiBjdXJzb3IgPj0gYWN0aXZlLmNodW5rcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICBhY3RpdmUub25DaHVuay50aGVuKCgpID0+IFwiY2h1bmtcIiBhcyBjb25zdCksXG4gICAgICAgICAgYWN0aXZlLmRvbmUudGhlbigoKSA9PiBcImRvbmVcIiBhcyBjb25zdCksXG4gICAgICAgIF0pO1xuXG4gICAgICAgIC8vIERyYWluIG5ldyBjaHVua3NcbiAgICAgICAgd2hpbGUgKGN1cnNvciA8IGFjdGl2ZS5jaHVua3MubGVuZ3RoKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGFjdGl2ZS5jaHVua3NbY3Vyc29yKytdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IFwiZG9uZVwiKSB7XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgY2FuY2VsKCkge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gdG9NZXNzYWdlQW5kUGFydHM8VG9vbHMgZXh0ZW5kcyBUb29sU2V0Pih7XG4gIHNlc3Npb25JZCxcbiAgaWQsXG4gIGlucHV0LFxuICBkZWZhdWx0Um9sZSxcbn06IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBpbnB1dDogU2VuZElucHV0PFRvb2xzPjtcbiAgZGVmYXVsdFJvbGU6IFVJTWVzc2FnZVtcInJvbGVcIl07XG59KToge1xuICBtZXNzYWdlOiBNZXNzYWdlIHwgdW5kZWZpbmVkO1xuICBwYXJ0czogUGFydFtdO1xuICBhcHByb3ZhbHM6IEFwcHJvdmFsRGF0YVtdO1xufSB7XG4gIGxldCBtZXNzYWdlSWQgPSBpZCA/PyBgbWVzc2FnZV8ke3VsaWQoKX1gO1xuICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4ge1xuICAgICAgYXBwcm92YWxzOiBbXSxcbiAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgaWQ6IG1lc3NhZ2VJZCxcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICByb2xlOiBkZWZhdWx0Um9sZSxcbiAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgIHN0YXJ0ZWRBdDogbnVsbCxcbiAgICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICAgIGludGVycnVwdGVkQXQ6IG51bGwsXG4gICAgICAgIGludGVycnVwdGVkTGFzdFBhcnQ6IG51bGwsXG4gICAgICAgIHVzYWdlOiBudWxsLFxuICAgICAgICB3b3JrZmxvd1J1bklkOiBudWxsLFxuICAgICAgfSxcbiAgICAgIHBhcnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgIGlkOiBgcGFydF8ke21lc3NhZ2VJZH1fMGAsXG4gICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgcGFydDogeyB0eXBlOiBcInRleHRcIiwgdGV4dDogaW5wdXQgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuICBpZiAoXCJ0eXBlXCIgaW4gaW5wdXQgJiYgaW5wdXQudHlwZSA9PT0gXCJhcHByb3ZhbFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHVuZGVmaW5lZCxcbiAgICAgIHBhcnRzOiBbXSxcbiAgICAgIGFwcHJvdmFsczogW2lucHV0LmFwcHJvdmFsXSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbXNnID1cbiAgICBcInR5cGVcIiBpbiBpbnB1dCAmJiBpbnB1dC50eXBlID09PSBcIm1lc3NhZ2VcIiA/IGlucHV0Lm1lc3NhZ2UgOiBpbnB1dDtcbiAgaWYgKFwiaWRcIiBpbiBtc2cgJiYgbXNnLmlkKSB7XG4gICAgbWVzc2FnZUlkID0gbXNnLmlkO1xuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgcmV0dXJuIHtcbiAgICBhcHByb3ZhbHM6IFtdLFxuICAgIG1lc3NhZ2U6IHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgIHN0YXJ0ZWRBdDogbnVsbCxcbiAgICAgIGNvbXBsZXRlZEF0OiBudWxsLFxuICAgICAgaW50ZXJydXB0ZWRBdDogbnVsbCxcbiAgICAgIGludGVycnVwdGVkTGFzdFBhcnQ6IG51bGwsXG4gICAgICB1c2FnZTogbnVsbCxcbiAgICAgIHdvcmtmbG93UnVuSWQ6IG51bGwsXG4gICAgICByb2xlOiBtc2cucm9sZSA/PyBkZWZhdWx0Um9sZSxcbiAgICB9LFxuICAgIHBhcnRzOiBtc2cucGFydHMubWFwKChwYXJ0LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgYXAgPSBwYXJ0IGFzIHsgYXBwcm92YWw/OiB7IGlkOiBzdHJpbmcgfSB9O1xuICAgICAgY29uc3QgaWQgPSBhcC5hcHByb3ZhbD8uaWRcbiAgICAgICAgPyBhcHByb3ZhbFBhcnRJZChhcC5hcHByb3ZhbC5pZClcbiAgICAgICAgOiBgcGFydF8ke21lc3NhZ2VJZH1fJHtpbmRleH1gO1xuICAgICAgcmV0dXJuIHsgc2Vzc2lvbklkLCBtZXNzYWdlSWQsIGlkLCBpbmRleCwgcGFydCB9O1xuICAgIH0pLFxuICB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBFcnJvcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuZXhwb3J0IGNsYXNzIFNlbmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2VuZCBmYWlsZWQgZm9yIHNlc3Npb24gJGlkOiAkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgQXBwcm92YWxOb3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJBcHByb3ZhbE5vdEZvdW5kRXJyb3JcIixcbiAgbWVzc2FnZTogXCJBcHByb3ZhbCAkYXBwcm92YWxJZCBub3QgZm91bmQgaW4gc2Vzc2lvbiAkaWRcIixcbn0pIHt9XG4iLCAiaW1wb3J0IHR5cGUge1xuICBGaW5pc2hSZWFzb24sXG4gIFRvb2xTZXQsXG4gIFVJTWVzc2FnZSxcbiAgVUlNZXNzYWdlU3RyZWFtV3JpdGVyLFxufSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7XG4gIGNvbnZlcnRUb01vZGVsTWVzc2FnZXMsXG4gIGNyZWF0ZVVJTWVzc2FnZVN0cmVhbSxcbiAgc3RlcENvdW50SXMsXG4gIHN0cmVhbVRleHQgYXMgc3RyZWFtVGV4dEFpLFxufSBmcm9tIFwiYWlcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRTdGF0dXMsIEFueUFnZW50LCBUeXBlZFVJTWVzc2FnZSB9IGZyb20gXCIuLi8uLi9hZ2VudC9jbGllbnRcIjtcbmltcG9ydCB7IFNlc3Npb25Ob3RGb3VuZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yc1wiO1xuaW1wb3J0IHsgZGlzY292ZXJTa2lsbHNJblNhbmRib3ggfSBmcm9tIFwiLi4vLi4vc2tpbGxzL2Rpc2NvdmVyXCI7XG5pbXBvcnQgdHlwZSB7IFNraWxsU3VtbWFyeSB9IGZyb20gXCIuLi8uLi9za2lsbHMvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgUGFydCB9IGZyb20gXCIuLi8uLi9zdG9yYWdlL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIEJ1aWx0SW5Ub29sTmFtZSwgZ2V0VG9vbHMsIHR5cGUgVG9vbENvbnRleHQgfSBmcm9tIFwiLi4vLi4vdG9vbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgdHlwZSBMb2dnZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBhcHBseVByb21wdENhY2hpbmdUb01vZGVsUmVxdWVzdCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm9tcHQtY2FjaGVcIjtcbmltcG9ydCB7IGFzc2VtYmxlVUlNZXNzYWdlcyB9IGZyb20gXCIuLi8uLi91dGlscy91aVwiO1xuaW1wb3J0IHR5cGUgeyBTdGVwVXNhZ2UgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXNhZ2VcIjtcbmltcG9ydCB7IGFwcHJvdmFsUGFydElkIH0gZnJvbSBcIi4uL3NlbmRcIjtcbmltcG9ydCB0eXBlIHsgVXBkYXRlT3B0aW9ucyB9IGZyb20gXCIuLi91cGRhdGVcIjtcblxuY29uc3QgSU5URVJSVVBUX1BPTExfSU5URVJWQUxfTVMgPSAyNTA7XG5cbmZ1bmN0aW9uIHBvbGxGb3JJbnRlcnJ1cHQoe1xuICBhZ2VudCxcbiAgbWVzc2FnZUlkLFxuICBzaWduYWwsXG4gIGFib3J0Q29udHJvbGxlcixcbn06IHtcbiAgYWdlbnQ6IEFueUFnZW50O1xuICBtZXNzYWdlSWQ6IHN0cmluZztcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG59KToge1xuICBmaXJzdENoZWNrOiBQcm9taXNlPHZvaWQ+O1xuICBpbnRlcnJ1cHRlZExhc3RQYXJ0UmVmOiB7IGN1cnJlbnQ6IHsgaW5kZXg6IG51bWJlcjsgcGFydDogdW5rbm93biB9IHwgbnVsbCB9O1xufSB7XG4gIGxldCByZXNvbHZlRmlyc3RDaGVjazogKCkgPT4gdm9pZDtcbiAgY29uc3QgZmlyc3RDaGVjayA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgcmVzb2x2ZUZpcnN0Q2hlY2sgPSByZXNvbHZlO1xuICB9KTtcbiAgY29uc3QgaW50ZXJydXB0ZWRMYXN0UGFydFJlZiA9IHtcbiAgICBjdXJyZW50OiBudWxsIGFzIHsgaW5kZXg6IG51bWJlcjsgcGFydDogdW5rbm93biB9IHwgbnVsbCxcbiAgfTtcblxuICBjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoe1xuICAgIGNvbmZpZzogeyAuLi5hZ2VudC5vcHRpb25zLmxvZ2dpbmcsIG5hbWU6IGFnZW50Lm5hbWUgfSxcbiAgICBzdWJzeXN0ZW06IFwiYWktbG9vcFwiLFxuICB9KTtcblxuICBjb25zdCBwb2xsID0gYXN5bmMgKCkgPT4ge1xuICAgIGxldCBpc0ZpcnN0ID0gdHJ1ZTtcbiAgICB3aGlsZSAoIXNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgYWdlbnQuc3RvcmFnZS5tZXNzYWdlLmdldChtZXNzYWdlSWQpO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgICAgcmVzb2x2ZUZpcnN0Q2hlY2soKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXNzYWdlICR7bWVzc2FnZUlkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmludGVycnVwdGVkQXQgIT09IG51bGwpIHtcbiAgICAgICAgbG9nLmluZm8oXCJpbnRlcnJ1cHQgZGV0ZWN0ZWRcIiwgeyBtZXNzYWdlSWQgfSk7XG4gICAgICAgIGludGVycnVwdGVkTGFzdFBhcnRSZWYuY3VycmVudCA9IG1lc3NhZ2UuaW50ZXJydXB0ZWRMYXN0UGFydDtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgICAgcmVzb2x2ZUZpcnN0Q2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNGaXJzdCkge1xuICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7XG4gICAgICAgIHJlc29sdmVGaXJzdENoZWNrKCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBJTlRFUlJVUFRfUE9MTF9JTlRFUlZBTF9NUylcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIHBvbGwoKTtcbiAgcmV0dXJuIHsgZmlyc3RDaGVjaywgaW50ZXJydXB0ZWRMYXN0UGFydFJlZiB9O1xufVxuXG50eXBlIFN0cmVhbVRleHRPcHRpb25zPFRvb2xzIGV4dGVuZHMgVG9vbFNldD4gPSB7XG4gIHN0ZXBUaHJvdWdocHV0OiBudW1iZXI7XG4gIGFzc2lzdGFudE1lc3NhZ2VJZDogc3RyaW5nO1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgYWdlbnQ6IEFueUFnZW50O1xuICBjcmVhdGVkQXQ6IG51bWJlcjtcbiAgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHNlc3Npb25VcGRhdGVzPzogVXBkYXRlT3B0aW9uczxUb29scz47XG4gIHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbTtcbiAgbGFzdFBhcnRJbmRleDogbnVtYmVyO1xuICBzdGVwSW5kZXhPZmZzZXQ6IG51bWJlcjtcbiAgZGlzY292ZXJlZFNraWxsczogU2tpbGxTdW1tYXJ5W10gfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgU3RyZWFtVGV4dFJlc3VsdCA9IHtcbiAgZmluaXNoUmVhc29uOiBGaW5pc2hSZWFzb247XG4gIGxhc3RQYXJ0SW5kZXg6IG51bWJlcjtcbiAgdXNhZ2VTdGVwczogU3RlcFVzYWdlW107XG4gIHBlbmRpbmdBcHByb3ZhbHM6IHsgYXBwcm92YWxJZDogc3RyaW5nOyB0b29sTmFtZTogc3RyaW5nIH1bXTtcbiAgbWF4U3RlcHM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgZGlzY292ZXJlZFNraWxsczogU2tpbGxTdW1tYXJ5W10gfCBudWxsO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0cmVhbVRleHQ8VG9vbHMgZXh0ZW5kcyBUb29sU2V0Pih7XG4gIHN0ZXBUaHJvdWdocHV0LFxuICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIGFnZW50LFxuICBzZXNzaW9uSWQsXG4gIGNvbnRleHQsXG4gIGNyZWF0ZWRBdCxcbiAgc2Vzc2lvblVwZGF0ZXMsXG4gIHdyaXRhYmxlLFxuICBsYXN0UGFydEluZGV4LFxuICBzdGVwSW5kZXhPZmZzZXQsXG4gIGRpc2NvdmVyZWRTa2lsbHMsXG59OiBTdHJlYW1UZXh0T3B0aW9uczxUb29scz4pOiBQcm9taXNlPFN0cmVhbVRleHRSZXN1bHQ+IHtcbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHsgLi4uYWdlbnQub3B0aW9ucy5sb2dnaW5nLCBuYW1lOiBhZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcImFpLWxvb3BcIixcbiAgfSk7XG5cbiAgY29uc3Qgc3RlcExvZyA9IGxvZy53aXRoQ29udGV4dCh7XG4gICAgc2Vzc2lvbklkLFxuICAgIG1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICB9KTtcbiAgY29uc3QgZG9uZVN0ZXAgPSBzdGVwTG9nLnRpbWUoXCJzdHJlYW1UZXh0XCIpO1xuXG4gIGNvbnN0IHRocm90dGxlZEVtaXRTdGF0dXMgPSBjcmVhdGVUaHJvdHRsZWRFbWl0U3RhdHVzKGFnZW50KTtcblxuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHBvbGxDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGNvbnN0IHsgZmlyc3RDaGVjaywgaW50ZXJydXB0ZWRMYXN0UGFydFJlZiB9ID0gcG9sbEZvckludGVycnVwdCh7XG4gICAgYWdlbnQsXG4gICAgbWVzc2FnZUlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgc2lnbmFsOiBwb2xsQ29udHJvbGxlci5zaWduYWwsXG4gICAgYWJvcnRDb250cm9sbGVyLFxuICB9KTtcblxuICBjb25zdCBkb25lTG9hZCA9IHN0ZXBMb2cudGltZShcImxvYWQgc2Vzc2lvbiArIG1lc3NhZ2VzICsgcGFydHMgKyBzYW5kYm94XCIpO1xuICBjb25zdCBbLCBtZXNzYWdlc1Jlc3VsdCwgcGFydHNSZXN1bHQsIHsgc2Vzc2lvbiwgc2FuZGJveCB9XSA9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZmlyc3RDaGVjayxcbiAgICAgIGFnZW50LnN0b3JhZ2UubWVzc2FnZS5saXN0QnlTZXNzaW9uKHNlc3Npb25JZCksXG4gICAgICBhZ2VudC5zdG9yYWdlLnBhcnQubGlzdEJ5U2Vzc2lvbihzZXNzaW9uSWQpLFxuICAgICAgYWdlbnQuc3RvcmFnZS5zZXNzaW9uLmdldChzZXNzaW9uSWQpLnRoZW4oYXN5bmMgKHNlc3Npb24pID0+IHtcbiAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25Ob3RGb3VuZEVycm9yKHsgaWQ6IHNlc3Npb25JZCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwZW5kaW5nVXBkYXRlOiBQcm9taXNlPHVua25vd24+IHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGlmIChzZXNzaW9uVXBkYXRlcykge1xuICAgICAgICAgIGNvbnN0IGRpZmY6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2Vzc2lvblVwZGF0ZXMpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgdmFsdWUgIT09IChzZXNzaW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZGlmZltrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhkaWZmKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNlc3Npb24sIGRpZmYpO1xuICAgICAgICAgICAgcGVuZGluZ1VwZGF0ZSA9IGFnZW50XG4gICAgICAgICAgICAgIC5zZXNzaW9uKHNlc3Npb25JZClcbiAgICAgICAgICAgICAgLnVwZGF0ZShkaWZmIGFzIHR5cGVvZiBzZXNzaW9uVXBkYXRlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2FuZGJveCA9IGFnZW50LnNhbmRib3goc2Vzc2lvbi5zYW5kYm94SWQgPz8gc2Vzc2lvbi5pZCk7XG4gICAgICAgIGF3YWl0IHBlbmRpbmdVcGRhdGU7XG5cbiAgICAgICAgcmV0dXJuIHsgc2Vzc2lvbiwgc2FuZGJveCB9O1xuICAgICAgfSksXG4gICAgXSk7XG4gIGRvbmVMb2FkKCk7XG5cbiAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgIHBvbGxDb250cm9sbGVyLmFib3J0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbmlzaFJlYXNvbjogXCJzdG9wXCIgYXMgRmluaXNoUmVhc29uLFxuICAgICAgbGFzdFBhcnRJbmRleCxcbiAgICAgIHVzYWdlU3RlcHM6IFtdLFxuICAgICAgcGVuZGluZ0FwcHJvdmFsczogW10sXG4gICAgICBtYXhTdGVwczogdW5kZWZpbmVkLFxuICAgICAgZGlzY292ZXJlZFNraWxscyxcbiAgICB9O1xuICB9XG5cbiAgY29uc3Qgc2V0U3RhcnRlZFByb21pc2UgPVxuICAgIGxhc3RQYXJ0SW5kZXggPT09IDBcbiAgICAgID8gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IHBlbmRpbmdNZXNzYWdlcyA9IG1lc3NhZ2VzUmVzdWx0LmZpbHRlcihcbiAgICAgICAgICAgIChtKSA9PiBtLmNyZWF0ZWRBdCA8PSBjcmVhdGVkQXQgJiYgbS5zdGFydGVkQXQgPT09IG51bGxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwZW5kaW5nTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICBwZW5kaW5nTWVzc2FnZXMubWFwKChtKSA9PlxuICAgICAgICAgICAgICAgIGFnZW50LnN0b3JhZ2UubWVzc2FnZS51cGRhdGUobS5pZCwge1xuICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbS5yb2xlID09PSBcImFzc2lzdGFudFwiID8gbnVsbCA6IG5vdyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiBudWxsO1xuXG4gIGNvbnN0IGFsbFBhcnRzID0gWy4uLnBhcnRzUmVzdWx0XTtcbiAgY29uc3QgbmV4dFBhcnRJbmRleFJlZiA9IHtcbiAgICBjdXJyZW50OiBNYXRoLm1heChcbiAgICAgIGxhc3RQYXJ0SW5kZXgsXG4gICAgICAuLi5hbGxQYXJ0c1xuICAgICAgICAuZmlsdGVyKChwKSA9PiBwLm1lc3NhZ2VJZCA9PT0gYXNzaXN0YW50TWVzc2FnZUlkKVxuICAgICAgICAubWFwKChwKSA9PiBwLmluZGV4ICsgMSksXG4gICAgICAwXG4gICAgKSxcbiAgfTtcblxuICBjb25zdCBza2lsbHNSZWY6IHsgY3VycmVudDogU2tpbGxTdW1tYXJ5W10gfSA9IHtcbiAgICBjdXJyZW50OiBkaXNjb3ZlcmVkU2tpbGxzID8/IFtdLFxuICB9O1xuXG4gIC8vIHNraWxscyBkaXNjb3ZlcnkgXHUyMDE0IGZpcnN0IGl0ZXJhdGlvbiBvbmx5XG4gIGlmIChsYXN0UGFydEluZGV4ID09PSAwICYmICFkaXNjb3ZlcmVkU2tpbGxzKSB7XG4gICAgY29uc3Qgc2tpbGxzRGlycyA9IHNlc3Npb24uc2tpbGxzRGlyPy5sZW5ndGggPyBzZXNzaW9uLnNraWxsc0RpciA6IFtdO1xuICAgIGlmIChza2lsbHNEaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGRvbmVTa2lsbHMgPSBzdGVwTG9nLnRpbWUoXCJkaXNjb3ZlciBza2lsbHNcIiwgeyBza2lsbHNEaXJzIH0pO1xuICAgICAgc2tpbGxzUmVmLmN1cnJlbnQgPSBhd2FpdCBkaXNjb3ZlclNraWxsc0luU2FuZGJveCh7XG4gICAgICAgIGFnZW50LFxuICAgICAgICBzYW5kYm94LFxuICAgICAgICBza2lsbHNEaXJzLFxuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICB9KTtcbiAgICAgIGRvbmVTa2lsbHMoeyBjb3VudDogc2tpbGxzUmVmLmN1cnJlbnQubGVuZ3RoIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbm5lciBsb29wOiBydW4gdXAgdG8gYHN0ZXBUaHJvdWdocHV0YCBzZXF1ZW50aWFsIExMTSBjYWxscy5cbiAgICogUGFydHMgYXJlIHBlcnNpc3RlZCBhZnRlciBlYWNoIGNhbGwgc28gcHJvZ3Jlc3MgaXNuJ3QgbG9zdC5cbiAgICogU2Vzc2lvbiBpcyByZS1mZXRjaGVkIGJldHdlZW4gaXRlcmF0aW9ucyAoY29uZmlnIG1heSBjaGFuZ2UpLFxuICAgKiBwYXJhbGxlbGl6ZWQgd2l0aCBwYXJ0IHBlcnNpc3RlbmNlIG9uIG5vbi1maW5hbCBpdGVyYXRpb25zLlxuICAgKi9cbiAgY29uc3QgdXNhZ2VTdGVwczogU3RlcFVzYWdlW10gPSBbXTtcbiAgbGV0IGludGVybmFsU3RlcEluZGV4ID0gMDtcbiAgbGV0IGxvb3BGaW5pc2hSZWFzb246IEZpbmlzaFJlYXNvbiA9IFwidW5rbm93blwiIGFzIEZpbmlzaFJlYXNvbjtcbiAgbGV0IHdhc0Fib3J0ZWQgPSBmYWxzZTtcbiAgY29uc3QgYWxsUGVuZGluZ0FwcHJvdmFsczogeyBhcHByb3ZhbElkOiBzdHJpbmc7IHRvb2xOYW1lOiBzdHJpbmcgfVtdID0gW107XG4gIGxldCBjdXJyZW50TWF4U3RlcHM6IG51bWJlciB8IHVuZGVmaW5lZCA9IHNlc3Npb24uZ2VuZXJhdGlvbj8ubWF4U3RlcHM7XG4gIGxldCBjdXJyZW50U2Vzc2lvbiA9IHNlc3Npb247XG5cbiAgdHJ5IHtcbiAgICBmb3IgKGxldCBpdGVyYXRpb24gPSAwOyBpdGVyYXRpb24gPCBzdGVwVGhyb3VnaHB1dDsgaXRlcmF0aW9uKyspIHtcbiAgICAgIGN1cnJlbnRNYXhTdGVwcyA9IGN1cnJlbnRTZXNzaW9uLmdlbmVyYXRpb24/Lm1heFN0ZXBzO1xuXG4gICAgICBpZiAoIWN1cnJlbnRTZXNzaW9uLm1vZGVsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNlc3Npb24gbW9kZWwgaXMgbm90IHNldFwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RlcFBhcnRzOiBVSU1lc3NhZ2VbXCJwYXJ0c1wiXSA9IFtdO1xuICAgICAgbGV0IHN0cmVhbVRleHRGaW5pc2hSZWFzb246IEZpbmlzaFJlYXNvbiB8IHVuZGVmaW5lZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gY3JlYXRlVUlNZXNzYWdlU3RyZWFtKHtcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoeyB3cml0ZXIgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyByYXdUb29scywgdG9vbHNXaXRoTmVlZHNBcHByb3ZhbCwgdG9vbENvbnRleHQgfSA9IGdldFRvb2xzKHtcbiAgICAgICAgICAgICAgYWdlbnQsXG4gICAgICAgICAgICAgIHNlc3Npb24sXG4gICAgICAgICAgICAgIHNraWxsc1JlZixcbiAgICAgICAgICAgICAgd3JpdGVyLFxuICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIsXG4gICAgICAgICAgICAgIG5leHRQYXJ0SW5kZXhSZWYsXG4gICAgICAgICAgICAgIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICBzdGVwTG9nLFxuICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIHByb2Nlc3MgYXBwcm92YWxzIG9uY2UgKGZpcnN0IGl0ZXJhdGlvbiBvbmx5KVxuICAgICAgICAgICAgaWYgKGl0ZXJhdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgICBhd2FpdCBwcm9jZXNzQXBwcm92YWxzKHtcbiAgICAgICAgICAgICAgICBhbGxQYXJ0cyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlc1Jlc3VsdCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgcmF3VG9vbHMsXG4gICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIHRvb2xDb250ZXh0LFxuICAgICAgICAgICAgICAgIGFnZW50LFxuICAgICAgICAgICAgICAgIHN0ZXBMb2csXG4gICAgICAgICAgICAgICAgdGhyb3R0bGVkRW1pdFN0YXR1cyxcbiAgICAgICAgICAgICAgICB3cml0ZXIsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdHRsZWRFbWl0U3RhdHVzKHtcbiAgICAgICAgICAgICAgd3JpdGVyLFxuICAgICAgICAgICAgICBzdGF0dXM6IHsgdHlwZTogXCJ0aGlua2luZ1wiIH0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgaXRlclJlc3VsdCA9IHN0cmVhbVRleHRBaSh7XG4gICAgICAgICAgICAgIG1lc3NhZ2VzOiBbeyByb2xlOiBcInVzZXJcIiBhcyBjb25zdCwgY29udGVudDogXCIuXCIgfV0sXG4gICAgICAgICAgICAgIHRvb2xzOiB0b29sc1dpdGhOZWVkc0FwcHJvdmFsLFxuICAgICAgICAgICAgICBtb2RlbDogY3VycmVudFNlc3Npb24ubW9kZWwhLFxuICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgc3RvcFdoZW46IHN0ZXBDb3VudElzKDEpLFxuICAgICAgICAgICAgICB0ZW1wZXJhdHVyZTogY3VycmVudFNlc3Npb24uZ2VuZXJhdGlvbj8udGVtcGVyYXR1cmUsXG4gICAgICAgICAgICAgIHRvcEs6IGN1cnJlbnRTZXNzaW9uLmdlbmVyYXRpb24/LnRvcEssXG4gICAgICAgICAgICAgIHRvcFA6IGN1cnJlbnRTZXNzaW9uLmdlbmVyYXRpb24/LnRvcFAsXG4gICAgICAgICAgICAgIGZyZXF1ZW5jeVBlbmFsdHk6IGN1cnJlbnRTZXNzaW9uLmdlbmVyYXRpb24/LmZyZXF1ZW5jeVBlbmFsdHksXG4gICAgICAgICAgICAgIHByZXNlbmNlUGVuYWx0eTogY3VycmVudFNlc3Npb24uZ2VuZXJhdGlvbj8ucHJlc2VuY2VQZW5hbHR5LFxuICAgICAgICAgICAgICBtYXhPdXRwdXRUb2tlbnM6IGN1cnJlbnRTZXNzaW9uLmdlbmVyYXRpb24/Lm1heE91dHB1dFRva2VucyxcbiAgICAgICAgICAgICAgaGVhZGVyczogY3VycmVudFNlc3Npb24uZ2VuZXJhdGlvbj8uaGVhZGVycyxcbiAgICAgICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uOiBjdXJyZW50U2Vzc2lvbixcbiAgICAgICAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgICAgICAgIHN0b3JhZ2U6IGFnZW50LnN0b3JhZ2UsXG4gICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgVG9vbENvbnRleHQsXG4gICAgICAgICAgICAgIHByZXBhcmVTdGVwOiBhc3luYyAoeyBtb2RlbCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2tpbGxzQ29udGV4dCA9IGJ1aWxkU2tpbGxzQ29udGV4dChza2lsbHNSZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3dkUHJvbXB0ID0gYFlvdXIgd29ya2luZyBkaXJlY3RvcnkgaXMgJHtzYW5kYm94LmN3ZH0uIEFsbCBmaWxlIHBhdGhzIHNob3VsZCBiZSBhYnNvbHV0ZS5gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN5c3RlbUhlYWRlciA9IGpvaW5Qcm9tcHRTZWN0aW9ucyhcbiAgICAgICAgICAgICAgICAgIEJBU0VfU1lTVEVNX1BST01QVCxcbiAgICAgICAgICAgICAgICAgIGN3ZFByb21wdCxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZXNzaW9uLnN5c3RlbVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3lzdGVtQ29udGV4dCA9IGpvaW5Qcm9tcHRTZWN0aW9ucyhcbiAgICAgICAgICAgICAgICAgIHNraWxsc0NvbnRleHQsXG4gICAgICAgICAgICAgICAgICBjd2RQcm9tcHRcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdWlNZXNzYWdlcyA9IGFzc2VtYmxlVUlNZXNzYWdlcyh7XG4gICAgICAgICAgICAgICAgICBtZXNzYWdlczogbWVzc2FnZXNSZXN1bHQsXG4gICAgICAgICAgICAgICAgICBwYXJ0czogYWxsUGFydHMsXG4gICAgICAgICAgICAgICAgICB1bnRpbDogY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgICAgaW5jbHVkZVF1ZXVlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVTdWJUb29sUGFydHM6IHRydWUsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWRNZXNzYWdlcyA9IGF3YWl0IGNvbnZlcnRUb01vZGVsTWVzc2FnZXMoXG4gICAgICAgICAgICAgICAgICB1aU1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgeyBpZ25vcmVJbmNvbXBsZXRlVG9vbENhbGxzOiB0cnVlIH1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kZWxNZXNzYWdlcyA9IFtcbiAgICAgICAgICAgICAgICAgIC4uLihzeXN0ZW1IZWFkZXIudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgID8gW3sgcm9sZTogXCJzeXN0ZW1cIiBhcyBjb25zdCwgY29udGVudDogc3lzdGVtSGVhZGVyIH1dXG4gICAgICAgICAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgICAgICAgICAgLi4uKHN5c3RlbUNvbnRleHQudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgID8gW3sgcm9sZTogXCJzeXN0ZW1cIiBhcyBjb25zdCwgY29udGVudDogc3lzdGVtQ29udGV4dCB9XVxuICAgICAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAgICAgICAgIC4uLmNvbnZlcnRlZE1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9tcHRDYWNoaW5nID0gYXBwbHlQcm9tcHRDYWNoaW5nVG9Nb2RlbFJlcXVlc3Qoe1xuICAgICAgICAgICAgICAgICAgbW9kZWw6IHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IG1vZGVsIDogbW9kZWwubW9kZWxJZCxcbiAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBtb2RlbE1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbGV0IGFjdGl2ZVRvb2xzID0gY3VycmVudFNlc3Npb24uYWN0aXZlVG9vbHMgPz8gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmIChza2lsbHNSZWYuY3VycmVudC5sZW5ndGggPT09IDAgJiYgYWN0aXZlVG9vbHMpIHtcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZVRvb2xzID0gYWN0aXZlVG9vbHMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAodCkgPT4gdCAhPT0gKFwiU2tpbGxcIiBzYXRpc2ZpZXMgQnVpbHRJblRvb2xOYW1lKVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgbWVzc2FnZXM6IHByb21wdENhY2hpbmcubWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IHByb21wdENhY2hpbmcucHJvdmlkZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgYWN0aXZlVG9vbHMsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgb25TdGVwRmluaXNoOiAoeyB1c2FnZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHVzYWdlKSB7XG4gICAgICAgICAgICAgICAgICB1c2FnZVN0ZXBzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBzdGVwSW5kZXg6IHN0ZXBJbmRleE9mZnNldCArIGludGVybmFsU3RlcEluZGV4LFxuICAgICAgICAgICAgICAgICAgICBtb2RlbDogY3VycmVudFNlc3Npb24ubW9kZWwgPz8gXCJ1bmtub3duXCIsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRUb2tlbnM6IHVzYWdlLm91dHB1dFRva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgICAgICB0b3RhbFRva2VuczogdXNhZ2UudG90YWxUb2tlbnMgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVSZWFkVG9rZW5zOlxuICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLmlucHV0VG9rZW5EZXRhaWxzPy5jYWNoZVJlYWRUb2tlbnMgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVXcml0ZVRva2VuczpcbiAgICAgICAgICAgICAgICAgICAgICB1c2FnZS5pbnB1dFRva2VuRGV0YWlscz8uY2FjaGVXcml0ZVRva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgICAgICByZWFzb25pbmdUb2tlbnM6XG4gICAgICAgICAgICAgICAgICAgICAgdXNhZ2Uub3V0cHV0VG9rZW5EZXRhaWxzPy5yZWFzb25pbmdUb2tlbnMgPz8gMCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnRlcm5hbFN0ZXBJbmRleCsrO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHdyaXRlci5tZXJnZShcbiAgICAgICAgICAgICAgaXRlclJlc3VsdC50b1VJTWVzc2FnZVN0cmVhbSh7XG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVNZXNzYWdlSWQ6ICgpID0+IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICBvbkZpbmlzaDogKHsgbWVzc2FnZXMgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBtIG9mIG1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwUGFydHMucHVzaCguLi5tLnBhcnRzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBzdHJlYW1UZXh0RmluaXNoUmVhc29uID0gYXdhaXQgaXRlclJlc3VsdC5maW5pc2hSZWFzb247XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgc3RyZWFtLnBpcGVUbyh3cml0YWJsZSwge1xuICAgICAgICAgIHByZXZlbnRDbG9zZTogdHJ1ZSxcbiAgICAgICAgICBwcmV2ZW50QWJvcnQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICB3YXNBYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICB3YXNBYm9ydGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTWFyayBpbnRlcnJ1cHRlZCB0b29sIHBhcnRzXG4gICAgICBpZiAod2FzQWJvcnRlZCkge1xuICAgICAgICBjb25zdCB0ZXJtaW5hbFN0YXRlcyA9IG5ldyBTZXQoW1xuICAgICAgICAgIFwib3V0cHV0LWF2YWlsYWJsZVwiLFxuICAgICAgICAgIFwib3V0cHV0LWVycm9yXCIsXG4gICAgICAgICAgXCJvdXRwdXQtZGVuaWVkXCIsXG4gICAgICAgICAgXCJkb25lXCIsXG4gICAgICAgIF0pO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2Ygc3RlcFBhcnRzKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgXCJ0eXBlXCIgaW4gcGFydCAmJlxuICAgICAgICAgICAgdHlwZW9mIHBhcnQudHlwZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgcGFydC50eXBlLnN0YXJ0c1dpdGgoXCJ0b29sLVwiKSAmJlxuICAgICAgICAgICAgXCJzdGF0ZVwiIGluIHBhcnQgJiZcbiAgICAgICAgICAgICF0ZXJtaW5hbFN0YXRlcy5oYXMocGFydC5zdGF0ZSBhcyBzdHJpbmcpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAocGFydCBhcyB7IHN0YXRlOiBzdHJpbmcgfSkuc3RhdGUgPSBcIm91dHB1dC1lcnJvclwiO1xuICAgICAgICAgICAgKHBhcnQgYXMgeyBlcnJvclRleHQ/OiBzdHJpbmcgfSkuZXJyb3JUZXh0ID0gXCJpbnRlcnJ1cHRlZFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgaW50ZXJydXB0ZWQgbGFzdFBhcnQgdHJ1bmNhdGlvblxuICAgICAgY29uc3QgbGFzdFBhcnQgPSBpbnRlcnJ1cHRlZExhc3RQYXJ0UmVmLmN1cnJlbnQ7XG5cbiAgICAgIGNvbnN0IG5ld1BhcnRSZWNvcmRzID0gc3RlcFBhcnRzXG4gICAgICAgIC5tYXAoKHVpUGFydCwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gbmV4dFBhcnRJbmRleFJlZi5jdXJyZW50ICsgaTtcbiAgICAgICAgICBpZiAobGFzdFBhcnQgIT0gbnVsbCAmJiBpbmRleCA+IGxhc3RQYXJ0LmluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdXNlQ2xpZW50UGFydCA9IGxhc3RQYXJ0ICE9IG51bGwgJiYgaW5kZXggPT09IGxhc3RQYXJ0LmluZGV4O1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSAoXG4gICAgICAgICAgICB1c2VDbGllbnRQYXJ0ID8gbGFzdFBhcnQucGFydCA6IHVpUGFydFxuICAgICAgICAgICkgYXMgVHlwZWRVSU1lc3NhZ2U8VG9vbHM+W1wicGFydHNcIl1bbnVtYmVyXTtcbiAgICAgICAgICBjb25zdCBwYXJ0SWQgPVxuICAgICAgICAgICAgXCJhcHByb3ZhbFwiIGluIGNvbnRlbnQgJiYgY29udGVudC5hcHByb3ZhbD8uaWRcbiAgICAgICAgICAgICAgPyBhcHByb3ZhbFBhcnRJZChjb250ZW50LmFwcHJvdmFsLmlkKVxuICAgICAgICAgICAgICA6IGBwYXJ0XyR7YXNzaXN0YW50TWVzc2FnZUlkfV8ke2luZGV4fWA7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBwYXJ0SWQsXG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgcGFydDogY29udGVudCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChyKTogciBpcyBOb25OdWxsYWJsZTx0eXBlb2Ygcj4gPT4gciAhPT0gbnVsbCk7XG5cbiAgICAgIGNvbnN0IHBlcnNpc3RQYXJ0c1Byb21pc2UgPSBQcm9taXNlLmFsbChcbiAgICAgICAgbmV3UGFydFJlY29yZHMubWFwKChyZWNvcmQpID0+XG4gICAgICAgICAgYWdlbnQuc3RvcmFnZS5wYXJ0LnNldChyZWNvcmQuaWQsIHJlY29yZClcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgICAgbmV4dFBhcnRJbmRleFJlZi5jdXJyZW50ID1cbiAgICAgICAgbGFzdFBhcnQgIT0gbnVsbFxuICAgICAgICAgID8gTWF0aC5taW4oXG4gICAgICAgICAgICAgIG5leHRQYXJ0SW5kZXhSZWYuY3VycmVudCArIHN0ZXBQYXJ0cy5sZW5ndGgsXG4gICAgICAgICAgICAgIGxhc3RQYXJ0LmluZGV4ICsgMVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogbmV4dFBhcnRJbmRleFJlZi5jdXJyZW50ICsgc3RlcFBhcnRzLmxlbmd0aDtcblxuICAgICAgY29uc3QgaXRlclBlbmRpbmdBcHByb3ZhbHMgPSBzdGVwUGFydHNcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAocCk6IHAgaXMgdHlwZW9mIHAgJiB7IGFwcHJvdmFsOiB7IGlkOiBzdHJpbmcgfSB9ID0+XG4gICAgICAgICAgICBcInN0YXRlXCIgaW4gcCAmJlxuICAgICAgICAgICAgcC5zdGF0ZSA9PT0gXCJhcHByb3ZhbC1yZXF1ZXN0ZWRcIiAmJlxuICAgICAgICAgICAgXCJhcHByb3ZhbFwiIGluIHAgJiZcbiAgICAgICAgICAgICEhKHAgYXMgeyBhcHByb3ZhbD86IHsgaWQ6IHN0cmluZyB9IH0pLmFwcHJvdmFsPy5pZFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKHApID0+ICh7XG4gICAgICAgICAgYXBwcm92YWxJZDogcC5hcHByb3ZhbC5pZCxcbiAgICAgICAgICB0b29sTmFtZTpcbiAgICAgICAgICAgIFwidHlwZVwiIGluIHAgPyBTdHJpbmcocC50eXBlKS5yZXBsYWNlKFwidG9vbC1cIiwgXCJcIikgOiBcInVua25vd25cIixcbiAgICAgICAgfSkpO1xuXG4gICAgICBsb29wRmluaXNoUmVhc29uID0gd2FzQWJvcnRlZFxuICAgICAgICA/IChcInN0b3BcIiBhcyBGaW5pc2hSZWFzb24pXG4gICAgICAgIDogKHN0cmVhbVRleHRGaW5pc2hSZWFzb24gPz8gKFwidW5rbm93blwiIGFzIEZpbmlzaFJlYXNvbikpO1xuXG4gICAgICAvLyBEZWNpZGUgd2hldGhlciB0byBicmVhayBvciBjb250aW51ZVxuICAgICAgY29uc3Qgc2hvdWxkQnJlYWsgPVxuICAgICAgICBpdGVyUGVuZGluZ0FwcHJvdmFscy5sZW5ndGggPiAwIHx8XG4gICAgICAgIGxvb3BGaW5pc2hSZWFzb24gPT09IFwic3RvcFwiIHx8XG4gICAgICAgIHdhc0Fib3J0ZWQgfHxcbiAgICAgICAgbGFzdFBhcnQgIT0gbnVsbCB8fFxuICAgICAgICAoY3VycmVudE1heFN0ZXBzICE9IG51bGwgJiZcbiAgICAgICAgICBzdGVwSW5kZXhPZmZzZXQgKyB1c2FnZVN0ZXBzLmxlbmd0aCA+PSBjdXJyZW50TWF4U3RlcHMpIHx8XG4gICAgICAgIGl0ZXJhdGlvbiA+PSBzdGVwVGhyb3VnaHB1dCAtIDE7XG5cbiAgICAgIGlmIChzaG91bGRCcmVhaykge1xuICAgICAgICBhd2FpdCBwZXJzaXN0UGFydHNQcm9taXNlO1xuICAgICAgICBhbGxQYXJ0cy5wdXNoKC4uLm5ld1BhcnRSZWNvcmRzKTtcbiAgICAgICAgYWxsUGVuZGluZ0FwcHJvdmFscy5wdXNoKC4uLml0ZXJQZW5kaW5nQXBwcm92YWxzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vbi1maW5hbCBpdGVyYXRpb246IHBlcnNpc3QgcGFydHMgKyByZS1mZXRjaCBzZXNzaW9uIGluIHBhcmFsbGVsXG4gICAgICBjb25zdCBbLCBuZXh0U2Vzc2lvbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHBlcnNpc3RQYXJ0c1Byb21pc2UsXG4gICAgICAgIGFnZW50LnN0b3JhZ2Uuc2Vzc2lvbi5nZXQoc2Vzc2lvbklkKS50aGVuKChzKSA9PiB7XG4gICAgICAgICAgaWYgKCFzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbk5vdEZvdW5kRXJyb3IoeyBpZDogc2Vzc2lvbklkIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgfSksXG4gICAgICBdKTtcblxuICAgICAgYWxsUGFydHMucHVzaCguLi5uZXdQYXJ0UmVjb3Jkcyk7XG4gICAgICBjdXJyZW50U2Vzc2lvbiA9IG5leHRTZXNzaW9uO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBwb2xsQ29udHJvbGxlci5hYm9ydCgpO1xuICAgIHRocm90dGxlZEVtaXRTdGF0dXMuZGlzcG9zZSgpO1xuICB9XG5cbiAgaWYgKHNldFN0YXJ0ZWRQcm9taXNlKSB7XG4gICAgYXdhaXQgc2V0U3RhcnRlZFByb21pc2U7XG4gIH1cblxuICBkb25lU3RlcCh7XG4gICAgZmluaXNoUmVhc29uOiBsb29wRmluaXNoUmVhc29uLFxuICAgIHdhc0Fib3J0ZWQsXG4gICAgaXRlcmF0aW9uczogaW50ZXJuYWxTdGVwSW5kZXgsXG4gICAgcGVuZGluZ0FwcHJvdmFsczogYWxsUGVuZGluZ0FwcHJvdmFscy5sZW5ndGgsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZmluaXNoUmVhc29uOiBsb29wRmluaXNoUmVhc29uLFxuICAgIGxhc3RQYXJ0SW5kZXg6IG5leHRQYXJ0SW5kZXhSZWYuY3VycmVudCxcbiAgICB1c2FnZVN0ZXBzLFxuICAgIHBlbmRpbmdBcHByb3ZhbHM6IGFsbFBlbmRpbmdBcHByb3ZhbHMsXG4gICAgbWF4U3RlcHM6IGN1cnJlbnRNYXhTdGVwcyxcbiAgICBkaXNjb3ZlcmVkU2tpbGxzOiBza2lsbHNSZWYuY3VycmVudCxcbiAgfTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogU3RlcHNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0cmVhbVRleHRTdGVwPFRvb2xzIGV4dGVuZHMgVG9vbFNldD4oXG4gIC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIHN0cmVhbVRleHQ8VG9vbHM+PlxuKSB7XG4gIFwidXNlIHN0ZXBcIjtcbiAgcmV0dXJuIGF3YWl0IHN0cmVhbVRleHQoLi4uYXJncyk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFV0aWxzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NBcHByb3ZhbHMoe1xuICBhbGxQYXJ0cyxcbiAgbWVzc2FnZXNSZXN1bHQsXG4gIGNyZWF0ZWRBdCxcbiAgcmF3VG9vbHMsXG4gIGFib3J0Q29udHJvbGxlcixcbiAgdG9vbENvbnRleHQsXG4gIGFnZW50LFxuICBzdGVwTG9nLFxuICB0aHJvdHRsZWRFbWl0U3RhdHVzLFxuICB3cml0ZXIsXG59OiB7XG4gIGFsbFBhcnRzOiBQYXJ0W107XG4gIG1lc3NhZ2VzUmVzdWx0OiBQYXJhbWV0ZXJzPHR5cGVvZiBhc3NlbWJsZVVJTWVzc2FnZXM+WzBdW1wibWVzc2FnZXNcIl07XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xuICByYXdUb29sczogVG9vbFNldDtcbiAgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG4gIHRvb2xDb250ZXh0OiBUb29sQ29udGV4dDtcbiAgYWdlbnQ6IEFueUFnZW50O1xuICBzdGVwTG9nOiBMb2dnZXI7XG4gIHRocm90dGxlZEVtaXRTdGF0dXM6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVRocm90dGxlZEVtaXRTdGF0dXM+O1xuICB3cml0ZXI6IFN0cmVhbVdyaXRlcjtcbn0pIHtcbiAgLy8gRXhlY3V0ZSBhcHByb3ZlZCB0b29scyBzbyB0aGUgbW9kZWwgc2VlcyBjb21wbGV0ZSB0b29sIGNhbGwgKyByZXN1bHQgcGFpcnNcbiAgY29uc3QgYXBwcm92ZWRQYXJ0cyA9IGFsbFBhcnRzLmZpbHRlcihcbiAgICAocCkgPT5cbiAgICAgIHAucGFydCAmJlxuICAgICAgXCJzdGF0ZVwiIGluIHAucGFydCAmJlxuICAgICAgKHAucGFydCBhcyB7IHN0YXRlOiBzdHJpbmcgfSkuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVzcG9uZGVkXCIgJiZcbiAgICAgIFwiYXBwcm92YWxcIiBpbiBwLnBhcnQgJiZcbiAgICAgIChwLnBhcnQgYXMgeyBhcHByb3ZhbD86IHsgYXBwcm92ZWQ6IGJvb2xlYW4gfSB9KS5hcHByb3ZhbD8uYXBwcm92ZWQgPT09XG4gICAgICAgIHRydWVcbiAgKTtcblxuICBpZiAoYXBwcm92ZWRQYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgc3RlcExvZy5pbmZvKFwiZXhlY3V0aW5nIGFwcHJvdmVkIHRvb2xzXCIsIHtcbiAgICAgIGNvdW50OiBhcHByb3ZlZFBhcnRzLmxlbmd0aCxcbiAgICB9KTtcbiAgICB0aHJvdHRsZWRFbWl0U3RhdHVzKHtcbiAgICAgIHdyaXRlcixcbiAgICAgIHN0YXR1czogeyB0eXBlOiBcInByb2Nlc3NpbmctYXBwcm92YWxzXCIgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHByZUV4ZWNNZXNzYWdlcyA9IGF3YWl0IGNvbnZlcnRUb01vZGVsTWVzc2FnZXMoXG4gICAgICBhc3NlbWJsZVVJTWVzc2FnZXMoe1xuICAgICAgICBtZXNzYWdlczogbWVzc2FnZXNSZXN1bHQsXG4gICAgICAgIHBhcnRzOiBhbGxQYXJ0cyxcbiAgICAgICAgdW50aWw6IGNyZWF0ZWRBdCxcbiAgICAgICAgaW5jbHVkZVF1ZXVlZDogdHJ1ZSxcbiAgICAgICAgZXhjbHVkZVN1YlRvb2xQYXJ0czogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgeyBpZ25vcmVJbmNvbXBsZXRlVG9vbENhbGxzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBhcHByb3ZlZFBhcnRzLm1hcChhc3luYyAoYXApID0+IHtcbiAgICAgICAgaWYgKCFhcC5wYXJ0LnR5cGUuc3RhcnRzV2l0aChcInRvb2wtXCIpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnQgPSBhcC5wYXJ0IGFzIEV4dHJhY3Q8XG4gICAgICAgICAgVUlNZXNzYWdlW1wicGFydHNcIl1bbnVtYmVyXSxcbiAgICAgICAgICB7IHR5cGU6IGB0b29sLSR7c3RyaW5nfWAgfVxuICAgICAgICA+O1xuICAgICAgICBjb25zdCB0b29sTmFtZSA9IHBhcnQudHlwZS5yZXBsYWNlKFwidG9vbC1cIiwgXCJcIik7XG4gICAgICAgIGNvbnN0IHRvb2xEZWYgPSByYXdUb29sc1t0b29sTmFtZV07XG5cbiAgICAgICAgaWYgKHRvb2xEZWY/LmV4ZWN1dGUgJiYgcGFydC5pbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRvb2xPdXRwdXQgPSBhd2FpdCB0b29sRGVmLmV4ZWN1dGUocGFydC5pbnB1dCwge1xuICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIG1lc3NhZ2VzOiBwcmVFeGVjTWVzc2FnZXMsXG4gICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDogdG9vbENvbnRleHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhcnQuc3RhdGUgPSBcIm91dHB1dC1hdmFpbGFibGVcIjtcbiAgICAgICAgICAgIHBhcnQub3V0cHV0ID0gdG9vbE91dHB1dDtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgb3V0cHV0OiB0b29sT3V0cHV0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBwYXJ0LnN0YXRlID0gXCJvdXRwdXQtZXJyb3JcIjtcbiAgICAgICAgICAgIHBhcnQuZXJyb3JUZXh0ID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1lcnJvclwiLFxuICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIGVycm9yVGV4dDogcGFydC5lcnJvclRleHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgYWdlbnQuc3RvcmFnZS5wYXJ0LnNldChhcC5pZCwgeyAuLi5hcCwgcGFydCB9KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLy8gQXV0by1kZW55IGFueSByZW1haW5pbmcgYXBwcm92YWwtcmVxdWVzdGVkIHBhcnRzIHNvIHRoZSBtb2RlbFxuICAvLyBzZWVzIGNvbXBsZXRlIHRvb2wgY2FsbCArIGRlbmllZCByZXN1bHQgcGFpcnMgKG5vdCBtaXNzaW5nIHJlc3VsdHMpLlxuICBjb25zdCBwZW5kaW5nQXBwcm92YWxQYXJ0cyA9IGFsbFBhcnRzLmZpbHRlcihcbiAgICAocCkgPT4gKHAucGFydCBhcyB7IHN0YXRlPzogc3RyaW5nIH0pLnN0YXRlID09PSBcImFwcHJvdmFsLXJlcXVlc3RlZFwiXG4gICk7XG4gIGlmIChwZW5kaW5nQXBwcm92YWxQYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwZW5kaW5nQXBwcm92YWxQYXJ0cy5tYXAoYXN5bmMgKHApID0+IHtcbiAgICAgICAgY29uc3QgZGVuaWVkID0ge1xuICAgICAgICAgIC4uLnAsXG4gICAgICAgICAgcGFydDoge1xuICAgICAgICAgICAgLi4ucC5wYXJ0LFxuICAgICAgICAgICAgc3RhdGU6IFwib3V0cHV0LWRlbmllZFwiLFxuICAgICAgICAgICAgYXBwcm92YWw6IHtcbiAgICAgICAgICAgICAgLi4uKChwLnBhcnQgYXMgeyBhcHByb3ZhbD86IG9iamVjdCB9KS5hcHByb3ZhbCA/PyB7fSksXG4gICAgICAgICAgICAgIGFwcHJvdmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgcmVhc29uOiBcImF1dG8tZGVuaWVkOiBuZXcgbWVzc2FnZSBzZW50XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgdHlwZW9mIHAucGFydCxcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwLCBkZW5pZWQpO1xuICAgICAgICBhd2FpdCBhZ2VudC5zdG9yYWdlLnBhcnQuc2V0KHAuaWQsIGRlbmllZCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxudHlwZSBTdHJlYW1Xcml0ZXIgPSBVSU1lc3NhZ2VTdHJlYW1Xcml0ZXI7XG5cbmZ1bmN0aW9uIGVtaXRTdGF0dXMoe1xuICB3cml0ZXIsXG4gIHN0YXR1cyxcbiAgYWdlbnQsXG59OiB7XG4gIHdyaXRlcjogU3RyZWFtV3JpdGVyO1xuICBzdGF0dXM6IEFnZW50U3RhdHVzO1xuICBhZ2VudDogQW55QWdlbnQ7XG59KSB7XG4gIHdyaXRlci53cml0ZSh7IHR5cGU6IFwiZGF0YS1zdGF0dXNcIiwgZGF0YTogc3RhdHVzLCB0cmFuc2llbnQ6IHRydWUgfSk7XG4gIGFnZW50Lmhvb2tzPy5zdGF0dXM/LihzdGF0dXMpO1xufVxuXG5jb25zdCBTVEFUVVNfVEhST1RUTEVfTVMgPSA1MDA7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRocm90dGxlZEVtaXRTdGF0dXMoYWdlbnQ6IEFueUFnZW50KSB7XG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgbGV0IHBlbmRpbmc6IHtcbiAgICB3cml0ZXI6IFN0cmVhbVdyaXRlcjtcbiAgICBzdGF0dXM6IEFnZW50U3RhdHVzO1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gdGhyb3R0bGVkKHtcbiAgICB3cml0ZXIsXG4gICAgc3RhdHVzLFxuICB9OiB7XG4gICAgd3JpdGVyOiBTdHJlYW1Xcml0ZXI7XG4gICAgc3RhdHVzOiBBZ2VudFN0YXR1cztcbiAgfSkge1xuICAgIHBlbmRpbmcgPSB7IHdyaXRlciwgc3RhdHVzIH07XG4gICAgaWYgKHRpbWVyICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZsdXNoKCk7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgIGZsdXNoKCk7XG4gICAgICB9XG4gICAgfSwgU1RBVFVTX1RIUk9UVExFX01TKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHdyaXRlciwgc3RhdHVzIH0gPSBwZW5kaW5nO1xuICAgIHBlbmRpbmcgPSBudWxsO1xuICAgIGVtaXRTdGF0dXMoeyB3cml0ZXIsIHN0YXR1cywgYWdlbnQgfSk7XG4gIH1cblxuICB0aHJvdHRsZWQuZGlzcG9zZSA9ICgpID0+IHtcbiAgICBpZiAodGltZXIgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgfVxuICAgIGZsdXNoKCk7XG4gIH07XG5cbiAgcmV0dXJuIHRocm90dGxlZDtcbn1cblxuY29uc3QgQkFTRV9TWVNURU1fUFJPTVBUID1cbiAgXCJZb3UgYXJlIGFuIEFJIGFzc2lzdGFudCB3aXRoIGJhc2ljIHRvb2xzIHRvIGludGVyYWN0IHdpdGggeW91ciBlbnZpcm9ubWVudC4gRXhwbG9yZSBhbmQgd29yayBmcmVlbHkuXCI7XG5cbmZ1bmN0aW9uIGpvaW5Qcm9tcHRTZWN0aW9ucyhcbiAgLi4uc2VjdGlvbnM6IChzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKVtdXG4pOiBzdHJpbmcge1xuICByZXR1cm4gc2VjdGlvbnMuZmlsdGVyKChzKSA9PiBzPy50cmltKCkpLmpvaW4oXCJcXG5cXG5cIik7XG59XG5cbmNvbnN0IGJhY2tncm91bmRQcm9jZXNzUHJvbXB0ID0gYCMjIEJhY2tncm91bmQgUHJvY2Vzc2VzXG5UaGVzZSBiYWNrZ3JvdW5kIHByb2Nlc3MgaW5zdHJ1Y3Rpb25zIGFyZSBmb3IgeW91IHRvIG1hbmlwdWxhdGUgdGhlIHByb2Nlc3NlcywgZG8gbm90IGJlIHRvIHZlcmJvc2UgdG8gdGhlIHVzZXIgYWJvdXQgdGhlIHJlc3BvbnNlIGRldGFpbHMgbGlrZSBcImhvdyB0byBkZWJ1ZyB0aGUgcHJvY2VzcyBvdXRwdXRcIiB0aGUgdXNlciB3aWxsIGhhdmUgYW4gVUkuXG5cblVzZSBcXGB3YWl0VW50aWw6IDBcXGAgZm9yIGRldiBzZXJ2ZXJzIHRoYXQgc2hvdWxkIHJ1biBpbmRlZmluaXRlbHkuXG5JdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gY2hlY2sgdGhlIG91dHB1dCBsb2cgYWZ0ZXIgcnVubmluZyBwcm9jZXNzZXMgbGlrZSBkZXYgc2VydmVycyB0byBtYWtlIHN1cmUgdGhleSBzdGFydGVkIGNvcnJlY3RseS5cblxuVG8gcnVuIGEgYmFja2dyb3VuZCBwcm9jZXNzOlxuQmFzaCh7IGNvbW1hbmQ6IFwibnBtIHJ1biBkZXZcIiwgd2FpdFVudGlsOiAwIH0pXG5SZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggXFxgY29tbWFuZElkXFxgLiBUaGUgcHJvY2VzcyBrZWVwcyBydW5uaW5nIGluIHRoZSBzYW5kYm94LlxuXG5UbyBraWxsIGEgcHJvY2VzczpcbkJhc2goeyBjb21tYW5kOiBcInBzIGF1eCB8IGdyZXAgbm9kZVwiIH0pICAgLy8gRmluZCB0aGUgUElEXG5CYXNoKHsgY29tbWFuZDogXCJraWxsIHtwaWR9XCIgfSkgICAgICAgICAgICAvLyBHcmFjZWZ1bFxuQmFzaCh7IGNvbW1hbmQ6IFwia2lsbCAtOSB7cGlkfVwiIH0pICAgICAgICAgLy8gRm9yY2VcbmA7XG5cbmZ1bmN0aW9uIGJ1aWxkU2tpbGxzQ29udGV4dChza2lsbHM6IFNraWxsU3VtbWFyeVtdKTogc3RyaW5nIHtcbiAgaWYgKHNraWxscy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIGNvbnN0IHNraWxsTGluZXMgPSBza2lsbHNcbiAgICAubWFwKChzKSA9PiBgLSAke3MubmFtZX06ICR7cy5kZXNjcmlwdGlvbn1gKVxuICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gIHJldHVybiBgIyMgQXZhaWxhYmxlIFNraWxsc1xuJHtza2lsbExpbmVzfVxuXG4ke2JhY2tncm91bmRQcm9jZXNzUHJvbXB0fVxuXG5Vc2UgdGhlIFNraWxsIHRvb2wgdG8gbG9hZCBhIHNraWxsJ3MgZnVsbCBpbnN0cnVjdGlvbnMgYmVmb3JlIGZvbGxvd2luZyBpdC5gO1xufVxuIiwgImltcG9ydCB0eXBlIHsgQW55QWdlbnQgfSBmcm9tIFwiLi4vYWdlbnQvY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuLi9zYW5kYm94L2FkYXB0ZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgdHlwZSBMb2dnZXIgfSBmcm9tIFwiLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBwYXJzZVNraWxsRnJvbnRtYXR0ZXIgfSBmcm9tIFwiLi9wYXJzZXJcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxTdW1tYXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBEaXNjb3ZlcnMgc2tpbGxzIGZyb20gZGlyZWN0b3JpZXMgaW5zaWRlIHRoZSBzYW5kYm94IGJ5IGZpbmRpbmcgYW5kIHBhcnNpbmcgU0tJTEwubWQgZmlsZXMuXG4gKiBTY2FucyBlYWNoIGRpcmVjdG9yeSBmb3Igc3ViZGlyZWN0b3JpZXMgY29udGFpbmluZyBTS0lMTC5tZCwgZXh0cmFjdHMgZnJvbnRtYXR0ZXIgbWV0YWRhdGEsXG4gKiBhbmQgcmV0dXJucyBzdW1tYXJpZXMgZm9yIHVzZSBpbiB0aGUgc3lzdGVtIHByb21wdC5cbiAqXG4gKiBAcmV0dXJucyBBcnJheSBvZiBza2lsbCBzdW1tYXJpZXMgKGRlZHVwbGljYXRlZCBieSBuYW1lLCBmaXJzdCBvY2N1cnJlbmNlIHdpbnMpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlclNraWxsc0luU2FuZGJveChvcHRzOiB7XG4gIGFnZW50OiBBbnlBZ2VudDtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBza2lsbHNEaXJzOiBzdHJpbmdbXTtcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xufSk6IFByb21pc2U8U2tpbGxTdW1tYXJ5W10+IHtcbiAgY29uc3QgeyBhZ2VudCwgc2FuZGJveCwgc2tpbGxzRGlycywgc2Vzc2lvbklkIH0gPSBvcHRzO1xuICBjb25zdCBiYXNlTG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHsgLi4uYWdlbnQub3B0aW9ucy5sb2dnaW5nLCBuYW1lOiBhZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcInNraWxsc1wiLFxuICB9KTtcbiAgY29uc3QgbG9nID0gc2Vzc2lvbklkID8gYmFzZUxvZy53aXRoQ29udGV4dCh7IHNlc3Npb25JZCB9KSA6IGJhc2VMb2c7XG4gIGNvbnN0IGRvbmUgPSBsb2cudGltZShcImRpc2NvdmVyU2tpbGxzSW5TYW5kYm94XCIpO1xuXG4gIGNvbnN0IHN1bW1hcmllczogU2tpbGxTdW1tYXJ5W10gPSBbXTtcbiAgY29uc3Qgc2Vlbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBza2lsbHNEaXIgb2Ygc2tpbGxzRGlycykge1xuICAgIGNvbnN0IGRpckRvbmUgPSBsb2cudGltZShcInNjYW4gZGlyZWN0b3J5XCIsIHsgZGlyOiBza2lsbHNEaXIgfSk7XG4gICAgY29uc3QgZGlyU3VtbWFyaWVzID0gYXdhaXQgZGlzY292ZXJTa2lsbHNJbkRpcmVjdG9yeSh7XG4gICAgICBzYW5kYm94LFxuICAgICAgc2tpbGxzRGlyLFxuICAgICAgbG9nLFxuICAgIH0pO1xuICAgIGRpckRvbmUoeyBjb3VudDogZGlyU3VtbWFyaWVzLmxlbmd0aCB9KTtcblxuICAgIGZvciAoY29uc3Qgc3VtbWFyeSBvZiBkaXJTdW1tYXJpZXMpIHtcbiAgICAgIGlmICghc2Vlbk5hbWVzLmhhcyhzdW1tYXJ5Lm5hbWUpKSB7XG4gICAgICAgIHNlZW5OYW1lcy5hZGQoc3VtbWFyeS5uYW1lKTtcbiAgICAgICAgc3VtbWFyaWVzLnB1c2goc3VtbWFyeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZG9uZSh7IHRvdGFsU2tpbGxzOiBzdW1tYXJpZXMubGVuZ3RoIH0pO1xuXG4gIHJldHVybiBzdW1tYXJpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyU2tpbGxzSW5EaXJlY3Rvcnkob3B0czoge1xuICBzYW5kYm94OiBTYW5kYm94SW5zdGFuY2U7XG4gIHNraWxsc0Rpcjogc3RyaW5nO1xuICBsb2c6IExvZ2dlcjtcbn0pOiBQcm9taXNlPFNraWxsU3VtbWFyeVtdPiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgc2tpbGxzRGlyLCBsb2cgfSA9IG9wdHM7XG4gIGNvbnN0IHNraWxsUGF0aHMgPSBhd2FpdCBmaW5kU2tpbGxGaWxlcyh7IHNhbmRib3gsIHNraWxsc0RpciwgbG9nIH0pO1xuXG4gIGlmIChza2lsbFBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHN1bW1hcmllczogU2tpbGxTdW1tYXJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHNraWxsTWRQYXRoIG9mIHNraWxsUGF0aHMpIHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gYXdhaXQgcGFyc2VTa2lsbEZpbGUoeyBzYW5kYm94LCBza2lsbE1kUGF0aCwgbG9nIH0pO1xuICAgIGlmIChzdW1tYXJ5KSB7XG4gICAgICBzdW1tYXJpZXMucHVzaChzdW1tYXJ5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VtbWFyaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kU2tpbGxGaWxlcyhvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3hJbnN0YW5jZTtcbiAgc2tpbGxzRGlyOiBzdHJpbmc7XG4gIGxvZzogTG9nZ2VyO1xufSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBza2lsbHNEaXIsIGxvZyB9ID0gb3B0cztcblxuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcImZpbmRcIixcbiAgICBhcmdzOiBbc2tpbGxzRGlyLCBcIi1uYW1lXCIsIFwiU0tJTEwubWRcIiwgXCItdHlwZVwiLCBcImZcIl0sXG4gIH0pO1xuXG4gIGlmIChleGVjUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBsb2cud2FybihcImZhaWxlZCB0byBzY2FuIHNraWxscyBkaXJlY3RvcnlcIiwge1xuICAgICAgZGlyOiBza2lsbHNEaXIsXG4gICAgICBlcnJvcjogZXhlY1Jlc3VsdC5tZXNzYWdlLFxuICAgIH0pO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHsgc3Rkb3V0LCBleGl0Q29kZSB9ID0gYXdhaXQgZXhlY1Jlc3VsdC5yZXN1bHQ7XG5cbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgbG9nLndhcm4oXCJza2lsbHMgZGlyZWN0b3J5IG5vdCBmb3VuZCBvciBpbmFjY2Vzc2libGVcIiwgeyBkaXI6IHNraWxsc0RpciB9KTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gc3Rkb3V0XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdChcIlxcblwiKVxuICAgIC5maWx0ZXIoKHApID0+IHAubGVuZ3RoID4gMCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlU2tpbGxGaWxlKG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBza2lsbE1kUGF0aDogc3RyaW5nO1xuICBsb2c6IExvZ2dlcjtcbn0pOiBQcm9taXNlPFNraWxsU3VtbWFyeSB8IG51bGw+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBza2lsbE1kUGF0aCwgbG9nIH0gPSBvcHRzO1xuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcImNhdFwiLFxuICAgIGFyZ3M6IFtza2lsbE1kUGF0aF0sXG4gIH0pO1xuXG4gIGlmIChleGVjUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBsb2cud2FybihcImZhaWxlZCB0byByZWFkIHNraWxsIGZpbGVcIiwge1xuICAgICAgcGF0aDogc2tpbGxNZFBhdGgsXG4gICAgICBlcnJvcjogZXhlY1Jlc3VsdC5tZXNzYWdlLFxuICAgIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgeyBzdGRvdXQsIGV4aXRDb2RlIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcblxuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBsb2cud2FybihcImNvdWxkIG5vdCByZWFkIHNraWxsIGZpbGVcIiwgeyBwYXRoOiBza2lsbE1kUGF0aCB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlU2tpbGxGcm9udG1hdHRlcihzdGRvdXQpO1xuXG4gIGlmICghcGFyc2VkKSB7XG4gICAgbG9nLndhcm4oXCJpbnZhbGlkIG9yIG1pc3NpbmcgZnJvbnRtYXR0ZXJcIiwgeyBwYXRoOiBza2lsbE1kUGF0aCB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogcGFyc2VkLm5hbWUsXG4gICAgZGVzY3JpcHRpb246IHBhcnNlZC5kZXNjcmlwdGlvbixcbiAgICBza2lsbE1kUGF0aCxcbiAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNraWxsc0RpciB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogUGFyc2VkIGZyb250bWF0dGVyIGZyb20gYSBTS0lMTC5tZCBmaWxlLlxuICovXG5leHBvcnQgdHlwZSBTa2lsbEZyb250bWF0dGVyID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFBhcnNlcyBZQU1MIGZyb250bWF0dGVyIGZyb20gYSBTS0lMTC5tZCBmaWxlIGNvbnRlbnQuXG4gKiBGcm9udG1hdHRlciBtdXN0IGJlIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZSwgZGVsaW1pdGVkIGJ5IGAtLS1gIG1hcmtlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYG1hcmtkb3duXG4gKiAtLS1cbiAqIG5hbWU6IGNzdlxuICogZGVzY3JpcHRpb246IEFuYWx5emUgQ1NWIGRhdGFcbiAqIC0tLVxuICogIyBDU1YgU2tpbGxcbiAqIC4uLlxuICogYGBgXG4gKlxuICogQHJldHVybnMgUGFyc2VkIG5hbWUgYW5kIGRlc2NyaXB0aW9uLCBvciBudWxsIGlmIGZyb250bWF0dGVyIGlzIG1pc3NpbmcvaW52YWxpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTa2lsbEZyb250bWF0dGVyKFxuICBjb250ZW50OiBzdHJpbmdcbik6IFNraWxsRnJvbnRtYXR0ZXIgfCBudWxsIHtcbiAgY29uc3QgdHJpbW1lZCA9IGNvbnRlbnQudHJpbSgpO1xuXG4gIGlmICghdHJpbW1lZC5zdGFydHNXaXRoKFwiLS0tXCIpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBlbmRNYXJrZXJJbmRleCA9IHRyaW1tZWQuaW5kZXhPZihcIi0tLVwiLCAzKTtcbiAgaWYgKGVuZE1hcmtlckluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZnJvbnRtYXR0ZXJCbG9jayA9IHRyaW1tZWQuc2xpY2UoMywgZW5kTWFya2VySW5kZXgpLnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VTaW1wbGVZYW1sKGZyb250bWF0dGVyQmxvY2spO1xuXG4gIGlmICghKHBhcnNlZC5uYW1lICYmIHBhcnNlZC5kZXNjcmlwdGlvbikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogU3RyaW5nKHBhcnNlZC5uYW1lKSxcbiAgICBkZXNjcmlwdGlvbjogU3RyaW5nKHBhcnNlZC5kZXNjcmlwdGlvbiksXG4gIH07XG59XG5cbi8qKlxuICogUGFyc2VzIHNpbXBsZSBZQU1MIGtleS12YWx1ZSBwYWlycyAoc2luZ2xlLWxpbmUgdmFsdWVzIG9ubHkpLlxuICogVGhpcyBhdm9pZHMgYWRkaW5nIGEgZnVsbCBZQU1MIHBhcnNlciBkZXBlbmRlbmN5IGZvciBiYXNpYyBmcm9udG1hdHRlci5cbiAqL1xuZnVuY3Rpb24gcGFyc2VTaW1wbGVZYW1sKHlhbWw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgeWFtbC5zcGxpdChcIlxcblwiKSkge1xuICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkTGluZSB8fCB0cmltbWVkTGluZS5zdGFydHNXaXRoKFwiI1wiKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb25JbmRleCA9IHRyaW1tZWRMaW5lLmluZGV4T2YoXCI6XCIpO1xuICAgIGlmIChjb2xvbkluZGV4ID09PSAtMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gdHJpbW1lZExpbmUuc2xpY2UoMCwgY29sb25JbmRleCkudHJpbSgpO1xuICAgIGxldCB2YWx1ZSA9IHRyaW1tZWRMaW5lLnNsaWNlKGNvbG9uSW5kZXggKyAxKS50cmltKCk7XG5cbiAgICAvLyBSZW1vdmUgc3Vycm91bmRpbmcgcXVvdGVzIGlmIHByZXNlbnRcbiAgICBpZiAoXG4gICAgICAodmFsdWUuc3RhcnRzV2l0aCgnXCInKSAmJiB2YWx1ZS5lbmRzV2l0aCgnXCInKSkgfHxcbiAgICAgICh2YWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSAmJiB2YWx1ZS5lbmRzV2l0aChcIidcIikpXG4gICAgKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBza2lsbHNEaXIgdG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNraWxsc0RpcnMoc2tpbGxzRGlyPzogU2tpbGxzRGlyKTogc3RyaW5nW10ge1xuICBpZiAoIXNraWxsc0Rpcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheShza2lsbHNEaXIpID8gc2tpbGxzRGlyIDogW3NraWxsc0Rpcl07XG59XG4iLCAiaW1wb3J0IHtcbiAgdHlwZSBUb29sU2V0LFxuICB0b29sLFxuICB0eXBlIFVJTWVzc2FnZSxcbiAgdHlwZSBVSU1lc3NhZ2VTdHJlYW1Xcml0ZXIsXG59IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBBbnlBZ2VudCB9IGZyb20gXCIuLi9hZ2VudC9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4uL3NhbmRib3gvYWRhcHRlclwiO1xuaW1wb3J0IHsgREVGQVVMVF9XQUlUX1VOVElMIH0gZnJvbSBcIi4uL3NhbmRib3gvcHJvY2Vzcy1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBhcHByb3ZhbFBhcnRJZCB9IGZyb20gXCIuLi9zZXNzaW9uL3NlbmRcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxTdW1tYXJ5IH0gZnJvbSBcIi4uL3NraWxscy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXNzaW9uLCBTdG9yYWdlIH0gZnJvbSBcIi4uL3N0b3JhZ2VcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgdHlwZSBMb2dnZXIgfSBmcm9tIFwiLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBjcmVhdGVKYXZhU2NyaXB0VG9vbCwgdHlwZSBPblN1YlRvb2xDYWxsIH0gZnJvbSBcIi4vamF2YXNjcmlwdFwiO1xuaW1wb3J0IHsgY2hlY2tOZWVkc0FwcHJvdmFsIH0gZnJvbSBcIi4vbmVlZHMtYXBwcm92YWxcIjtcblxuY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKHsgY29uZmlnOiB7IG5hbWU6IFwidG9vbHNcIiB9LCBzdWJzeXN0ZW06IFwidG9vbHNcIiB9KTtcblxuZnVuY3Rpb24gZm9ybWF0RmlsZVNpemUoYnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChieXRlcyA8IDEwMjQpIHtcbiAgICByZXR1cm4gYCR7Ynl0ZXN9YDtcbiAgfVxuICBpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCkge1xuICAgIHJldHVybiBgJHsoYnl0ZXMgLyAxMDI0KS50b0ZpeGVkKDEpfUtgO1xuICB9XG4gIGlmIChieXRlcyA8IDEwMjQgKiAxMDI0ICogMTAyNCkge1xuICAgIHJldHVybiBgJHsoYnl0ZXMgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDEpfU1gO1xuICB9XG4gIHJldHVybiBgJHsoYnl0ZXMgLyAoMTAyNCAqIDEwMjQgKiAxMDI0KSkudG9GaXhlZCgxKX1HYDtcbn1cblxudHlwZSBTdHJlYW1Xcml0ZXIgPSBVSU1lc3NhZ2VTdHJlYW1Xcml0ZXI7XG5cbmV4cG9ydCB0eXBlIFRvb2xDb250ZXh0PFRDb250ZXh0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0ge1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBzYW5kYm94OiBTYW5kYm94SW5zdGFuY2U7XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG4gIGNvbnRleHQ6IFRDb250ZXh0O1xufTtcblxuZnVuY3Rpb24gaXNSZ05vdEZvdW5kRXJyb3IoZXJyOiBFcnJvcik6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJ0cyA9IFtlcnIubWVzc2FnZV07XG5cbiAgY29uc3QgYW55RXJyID0gZXJyIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmICh0eXBlb2YgYW55RXJyLnJlYXNvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgIHBhcnRzLnB1c2goYW55RXJyLnJlYXNvbik7XG4gIH1cbiAgaWYgKGFueUVyci5jYXVzZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcGFydHMucHVzaChhbnlFcnIuY2F1c2UubWVzc2FnZSk7XG4gICAgY29uc3QgYW55Q2F1c2UgPSBhbnlFcnIuY2F1c2UgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAodHlwZW9mIGFueUNhdXNlLnRleHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHBhcnRzLnB1c2goYW55Q2F1c2UudGV4dCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbXNnID0gcGFydHMuam9pbihcIiBcIikudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChcbiAgICBtc2cuaW5jbHVkZXMoXCJleGVjdXRhYmxlIGZpbGUgbm90IGZvdW5kXCIpIHx8XG4gICAgbXNnLmluY2x1ZGVzKFwiZXhlY3V0YWJsZV9ub3RfZm91bmRcIikgfHxcbiAgICAobXNnLmluY2x1ZGVzKFwiZW5vZW50XCIpICYmIG1zZy5pbmNsdWRlcyhcInJnXCIpKVxuICApO1xufVxuXG5leHBvcnQgY29uc3QgYnVpbHRJblRvb2xzID0ge1xuICBSZWFkOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiUmVhZHMgYSBmaWxlIGFuZCByZXR1cm5zIGl0cyBjb250ZW50cyB3aXRoIG1ldGFkYXRhLiBGb3IgZmlsZXMgb3ZlciAyMDAgbGluZXMsIGF1dG9tYXRpY2FsbHkgc2hvd3MgZmlyc3QgMTAwIGxpbmVzIHVubGVzcyBhIHNwZWNpZmljIGxpbmUgcmFuZ2UgaXMgcHJvdmlkZWQuIFVzZSBzdGFydExpbmUgYW5kIGVuZExpbmUgcGFyYW1ldGVycyB0byByZWFkIHNwZWNpZmljIHBvcnRpb25zIG9mIGxhcmdlIGZpbGVzLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlXCIpLFxuICAgICAgc3RhcnRMaW5lOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJTdGFydGluZyBsaW5lIG51bWJlciAoMS1pbmRleGVkKS4gSWYgcHJvdmlkZWQgd2l0aCBlbmRMaW5lLCByZWFkcyBleGFjdCByYW5nZSByZWdhcmRsZXNzIG9mIGZpbGUgc2l6ZS5cIlxuICAgICAgICApLFxuICAgICAgZW5kTGluZTogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiRW5kaW5nIGxpbmUgbnVtYmVyICgxLWluZGV4ZWQsIGluY2x1c2l2ZSkuIElmIHByb3ZpZGVkIHdpdGggc3RhcnRMaW5lLCByZWFkcyBleGFjdCByYW5nZSByZWdhcmRsZXNzIG9mIGZpbGUgc2l6ZS5cIlxuICAgICAgICApLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgY29udGVudDogei5zdHJpbmcoKS5kZXNjcmliZShcIkZpbGUgY29udGVudFwiKSxcbiAgICAgIG1ldGFkYXRhOiB6Lm9iamVjdCh7XG4gICAgICAgIHRvdGFsTGluZXM6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJUb3RhbCBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGZpbGVcIiksXG4gICAgICAgIGxpbmVzU2hvd246IHpcbiAgICAgICAgICAubnVtYmVyKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJOdW1iZXIgb2YgbGluZXMgaW5jbHVkZWQgaW4gdGhpcyByZXNwb25zZVwiKSxcbiAgICAgICAgc3RhcnRMaW5lOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiRmlyc3QgbGluZSBudW1iZXIgc2hvd24gKDEtaW5kZXhlZClcIiksXG4gICAgICAgIGVuZExpbmU6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJMYXN0IGxpbmUgbnVtYmVyIHNob3duICgxLWluZGV4ZWQpXCIpLFxuICAgICAgICBpc1BhZ2luYXRlZDogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJXaGV0aGVyIHRoaXMgaXMgYSBwYXJ0aWFsIHZpZXcgb2YgdGhlIGZpbGVcIiksXG4gICAgICAgIGZpbGVTaXplOiB6XG4gICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiSHVtYW4tcmVhZGFibGUgZmlsZSBzaXplIChlLmcuLCAnMi41SycsICcxLjJNJylcIiksXG4gICAgICAgIHBhdGg6IHpcbiAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlXCIpLFxuXG4gICAgICB9KSxcbiAgICB9KSxcbiAgfSksXG4gIEdyZXA6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJTZWFyY2ggZm9yIHBhdHRlcm5zIGluIGZpbGVzIHVzaW5nIHJpcGdyZXAuIFVzZSB0aGlzIHRvIGZpbmQgY29kZSBwYXR0ZXJucywgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGltcG9ydHMsIGV0Yy5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGFiZWw6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkEgbGFiZWwgdGhhdCBkZXNjcmliZXMgdGhlIGFjdGlvbiBiZWluZyBwZXJmb3JtZWRcIiksXG4gICAgICBwYXR0ZXJuOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJSZWdleCBwYXR0ZXJuIHRvIHNlYXJjaCBmb3IgKHJpcGdyZXAgc3ludGF4KVwiKSxcbiAgICAgIHBhdGg6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkFic29sdXRlIHBhdGggdG8gc2VhcmNoIGluIChkZWZhdWx0cyB0byB3b3JraW5nIGRpcmVjdG9yeSkuIENhbiBiZSBhIGZpbGUgb3IgZGlyZWN0b3J5LlwiXG4gICAgICAgICksXG4gICAgICBmaWxlVHlwZTogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiRmlsZSB0eXBlIHRvIGZpbHRlciBieSAoZS5nLiwgJ3RzJywgJ2pzJywgJ3B5JywgJ21kJykuIFVzZXMgcmlwZ3JlcCdzIGJ1aWx0LWluIHR5cGUgZmlsdGVycy5cIlxuICAgICAgICApLFxuICAgICAgZ2xvYjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiR2xvYiBwYXR0ZXJuIHRvIGZpbHRlciBmaWxlcyAoZS5nLiwgJyoudHN4JywgJ3NyYy8qKi8qLnRzJylcIlxuICAgICAgICApLFxuICAgICAgY2FzZVNlbnNpdGl2ZTogelxuICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZWZhdWx0KHRydWUpXG4gICAgICAgIC5kZXNjcmliZShcIldoZXRoZXIgc2VhcmNoIGlzIGNhc2Utc2Vuc2l0aXZlIChkZWZhdWx0OiB0cnVlKVwiKSxcbiAgICAgIGNvbnRleHRMaW5lczogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiTnVtYmVyIG9mIGNvbnRleHQgbGluZXMgdG8gc2hvdyBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggbWF0Y2hcIlxuICAgICAgICApLFxuICAgICAgbWF4Q291bnQ6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk1heGltdW0gbnVtYmVyIG9mIG1hdGNoZXMgcGVyIGZpbGUgKHVzZWZ1bCBmb3IgbGltaXRpbmcgb3V0cHV0KVwiXG4gICAgICAgICksXG4gICAgICBmaWxlc1dpdGhNYXRjaGVzOiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk9ubHkgc2hvdyBmaWxlIHBhdGhzIHRoYXQgY29udGFpbiBtYXRjaGVzLCBub3QgdGhlIG1hdGNoaW5nIGxpbmVzIHRoZW1zZWx2ZXNcIlxuICAgICAgICApLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbWF0Y2hlczogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiU2VhcmNoIHJlc3VsdHMgd2l0aCBmaWxlIHBhdGhzLCBsaW5lIG51bWJlcnMsIGFuZCBtYXRjaGluZyBjb250ZW50XCJcbiAgICAgICAgKSxcbiAgICAgIHN1bW1hcnk6IHoub2JqZWN0KHtcbiAgICAgICAgbWF0Y2hDb3VudDogei5udW1iZXIoKS5kZXNjcmliZShcIk51bWJlciBvZiBtYXRjaGVzIGZvdW5kXCIpLFxuICAgICAgICBmaWxlQ291bnQ6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJOdW1iZXIgb2YgZmlsZXMgY29udGFpbmluZyBtYXRjaGVzXCIpLFxuICAgICAgICBzZWFyY2hQYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0aGF0IHdhcyBzZWFyY2hlZFwiKSxcbiAgICAgICAgcGF0dGVybjogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdHRlcm4gdGhhdCB3YXMgc2VhcmNoZWQgZm9yXCIpLFxuICAgICAgfSksXG4gICAgfSksXG4gIH0pLFxuICBMaXN0OiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiUmVjdXJzaXZlbHkgbGlzdCBkaXJlY3RvcnkgY29udGVudHMuIFVzZSB0aGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvZGViYXNlIHN0cnVjdHVyZSwgZmluZCBmaWxlcywgb3IgZXhwbG9yZSBkaXJlY3Rvcmllcy4gQ29udHJvbCBkZXB0aCB0byBiYWxhbmNlIGRldGFpbCB2cy4gb3ZlcnZpZXcuIERlcHRoIDEgc2hvd3MgaW1tZWRpYXRlIGNoaWxkcmVuLCBkZXB0aCAyIGluY2x1ZGVzIHN1YmRpcmVjdG9yaWVzLCBldGMuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxhYmVsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJBIGxhYmVsIHRoYXQgZGVzY3JpYmVzIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkXCIpLFxuICAgICAgcGF0aDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQWJzb2x1dGUgcGF0aCB0byBsaXN0IChkZWZhdWx0cyB0byB3b3JraW5nIGRpcmVjdG9yeSlcIiksXG4gICAgICBkZXB0aDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiTWF4aW11bSBkZXB0aCB0byB0cmF2ZXJzZS4gQ2hvb3NlIGJhc2VkIG9uIGNvbnRleHQ6IDEtMiBmb3IgcXVpY2sgb3ZlcnZpZXcsIDMtNCBmb3IgZGV0YWlsZWQgZXhwbG9yYXRpb24sIDUrIGZvciBjb21wcmVoZW5zaXZlIG1hcHBpbmdcIlxuICAgICAgICApLFxuICAgICAgaW5jbHVkZUhpZGRlbjogelxuICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJJbmNsdWRlIGhpZGRlbiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgKHRob3NlIHN0YXJ0aW5nIHdpdGggJy4nKVwiXG4gICAgICAgICksXG4gICAgICBmaWxlc09ubHk6IHpcbiAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgLmRlc2NyaWJlKFwiT25seSBzaG93IGZpbGVzLCBub3QgZGlyZWN0b3JpZXNcIiksXG4gICAgICBwYXR0ZXJuOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXCJHbG9iIHBhdHRlcm4gdG8gZmlsdGVyIHJlc3VsdHMgKGUuZy4sICcqLnRzJywgJyp0ZXN0KicpXCIpLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGlzdGluZzogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiRGlyZWN0b3J5IHRyZWUgbGlzdGluZyBzaG93aW5nIHBhdGhzIHJlbGF0aXZlIHRvIHNlYXJjaCByb290XCJcbiAgICAgICAgKSxcbiAgICAgIHN1bW1hcnk6IHoub2JqZWN0KHtcbiAgICAgICAgdG90YWxJdGVtczogei5udW1iZXIoKS5kZXNjcmliZShcIlRvdGFsIG51bWJlciBvZiBpdGVtcyBmb3VuZFwiKSxcbiAgICAgICAgdG90YWxGaWxlczogei5udW1iZXIoKS5kZXNjcmliZShcIlRvdGFsIG51bWJlciBvZiBmaWxlcyBmb3VuZFwiKSxcbiAgICAgICAgdG90YWxEaXJzOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiVG90YWwgbnVtYmVyIG9mIGRpcmVjdG9yaWVzIGZvdW5kXCIpLFxuICAgICAgICBzZWFyY2hQYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0aGF0IHdhcyBsaXN0ZWRcIiksXG4gICAgICAgIGRlcHRoOiB6XG4gICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJNYXhpbXVtIGRlcHRoIHVzZWQgKGlmIHNwZWNpZmllZClcIiksXG4gICAgICB9KSxcbiAgICB9KSxcbiAgfSksXG4gIFdyaXRlOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiV3JpdGUgY29udGVudCB0byBhIGZpbGUuIENyZWF0ZXMgcGFyZW50IGRpcmVjdG9yaWVzIGF1dG9tYXRpY2FsbHkuIE92ZXJ3cml0ZXMgZXhpc3RpbmcgZmlsZXMuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxhYmVsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJBIGxhYmVsIHRoYXQgZGVzY3JpYmVzIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkXCIpLFxuICAgICAgcGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIkFic29sdXRlIHBhdGggdG8gdGhlIGZpbGVcIiksXG4gICAgICBjb250ZW50OiB6LnN0cmluZygpLmRlc2NyaWJlKFwiQ29udGVudCB0byB3cml0ZSB0byB0aGUgZmlsZVwiKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHN1Y2Nlc3M6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiV2hldGhlciB0aGUgd3JpdGUgc3VjY2VlZGVkXCIpLFxuICAgICAgcGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdG8gdGhlIHdyaXR0ZW4gZmlsZVwiKSxcbiAgICAgIGJ5dGVzV3JpdHRlbjogei5udW1iZXIoKS5kZXNjcmliZShcIk51bWJlciBvZiBieXRlcyB3cml0dGVuXCIpLFxuICAgICAgZXJyb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkVycm9yIG1lc3NhZ2UgaWYgd3JpdGUgZmFpbGVkXCIpLFxuICAgIH0pLFxuICB9KSxcbiAgRWRpdDogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkVkaXQgYSBmaWxlIGJ5IHJlcGxhY2luZyBhbiBleGFjdCBzdHJpbmcuIEZhaWxzIGlmIG9sZF9zdHJpbmcgaXMgbm90IGZvdW5kIG9yIGFwcGVhcnMgbXVsdGlwbGUgdGltZXMgKG5vdCB1bmlxdWUpLiBGb3IgbXVsdGlwbGUgcmVwbGFjZW1lbnRzLCBjYWxsIHRoaXMgdG9vbCBtdWx0aXBsZSB0aW1lcyB3aXRoIHVuaXF1ZSBjb250ZXh0LlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlXCIpLFxuICAgICAgb2xkX3N0cmluZzogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiRXhhY3Qgc3RyaW5nIHRvIGZpbmQgYW5kIHJlcGxhY2UgKG11c3QgYmUgdW5pcXVlIGluIGZpbGUpXCIpLFxuICAgICAgbmV3X3N0cmluZzogei5zdHJpbmcoKS5kZXNjcmliZShcIlN0cmluZyB0byByZXBsYWNlIG9sZF9zdHJpbmcgd2l0aFwiKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHN1Y2Nlc3M6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiV2hldGhlciB0aGUgZWRpdCBzdWNjZWVkZWRcIiksXG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgZWRpdGVkIGZpbGVcIiksXG4gICAgICBlcnJvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRXJyb3IgbWVzc2FnZSBpZiBlZGl0IGZhaWxlZFwiKSxcbiAgICB9KSxcbiAgfSksXG4gIEJhc2g6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFeGVjdXRlcyBhIGJhc2ggY29tbWFuZC4gUmV0dXJucyBzdGRvdXQgYW5kIHN0ZGVyciBzZXBhcmF0ZWx5LiBVc2Ugd2FpdFVudGlsIHRvIGNvbnRyb2wgaG93IGxvbmcgdG8gd2FpdCAoMCA9IHJldHVybiBpbW1lZGlhdGVseSwgcHJvY2VzcyBrZWVwcyBydW5uaW5nKS4gTGFyZ2Ugb3V0cHV0cyBhcmUgdGFpbC10cnVuY2F0ZWQ7IGZ1bGwgb3V0cHV0IGluIG91dHB1dERpci5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGFiZWw6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkEgbGFiZWwgdGhhdCBkZXNjcmliZXMgdGhlIGFjdGlvbiBiZWluZyBwZXJmb3JtZWRcIiksXG4gICAgICBjb21tYW5kOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiVGhlIHNoZWxsIGNvbW1hbmQgdG8gZXhlY3V0ZVwiKSxcbiAgICAgIHdhaXRVbnRpbDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIGBNYXggbXMgdG8gd2FpdCBmb3IgY29tcGxldGlvbiAoZGVmYXVsdDogJHtERUZBVUxUX1dBSVRfVU5USUx9KS4gVXNlIDAgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IHdoaWxlIHRoZSBwcm9jZXNzIGtlZXBzIHJ1bm5pbmcuYFxuICAgICAgICApLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgY29tbWFuZElkOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJDb21tYW5kIElELiBVc2UgdG8gcmVmZXJlbmNlIG9yIGtpbGwgcnVubmluZyBwcm9jZXNzZXMuXCIpLFxuICAgICAgc3Rkb3V0OiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJDb21tYW5kIHN0ZG91dC4gVGFpbC10cnVuY2F0ZWQgaWYgbGFyZ2U7IGZ1bGwgY29udGVudCBpbiBvdXRwdXREaXIvc3Rkb3V0LnR4dC5cIlxuICAgICAgICApLFxuICAgICAgc3RkZXJyOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJDb21tYW5kIHN0ZGVyci4gVGFpbC10cnVuY2F0ZWQgaWYgbGFyZ2U7IGZ1bGwgY29udGVudCBpbiBvdXRwdXREaXIvc3RkZXJyLnR4dC5cIlxuICAgICAgICApLFxuICAgICAgZXhpdENvZGU6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJFeGl0IGNvZGUgKC0xIGlmIHN0aWxsIHJ1bm5pbmcpXCIpLFxuICAgICAgc3RhdHVzOiB6XG4gICAgICAgIC5lbnVtKFtcInJ1bm5pbmdcIiwgXCJjb21wbGV0ZWRcIiwgXCJmYWlsZWRcIl0pXG4gICAgICAgIC5kZXNjcmliZShcIlByb2Nlc3Mgc3RhdHVzXCIpLFxuICAgICAgb3V0cHV0RGlyOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJQYXRoIHRvIG91dHB1dCBkaXJlY3RvcnkgY29udGFpbmluZyBzdGRvdXQudHh0LCBzdGRlcnIudHh0LCBhbmQgbWV0YWRhdGEuanNvbi4gRW1wdHkgaWYgc3RpbGwgcnVubmluZy5cIlxuICAgICAgICApLFxuICAgIH0pLFxuICB9KSxcbiAgU2tpbGw6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJMb2FkIGEgc2tpbGwncyBmdWxsIGluc3RydWN0aW9ucyBieSBuYW1lLiBDYWxsIHRoaXMgYmVmb3JlIGZvbGxvd2luZyBhIHNraWxsLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIG5hbWU6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJTa2lsbCBuYW1lIGZyb20gdGhlIEF2YWlsYWJsZSBTa2lsbHMgbGlzdFwiKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIG5hbWU6IHouc3RyaW5nKCksXG4gICAgICBkZXNjcmlwdGlvbjogei5zdHJpbmcoKSxcbiAgICAgIGNvbnRlbnQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJGdWxsIFNLSUxMLm1kIGNvbnRlbnRcIiksXG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgc2tpbGwgZGlyZWN0b3J5IGluIHRoZSBzYW5kYm94XCIpLFxuICAgIH0pLFxuICB9KSxcbiAgSmF2YVNjcmlwdDogdG9vbCh7XG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxhYmVsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJBIGxhYmVsIHRoYXQgZGVzY3JpYmVzIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkXCIpLFxuICAgICAgY29kZTogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiSmF2YVNjcmlwdCBhc3luYyBmdW5jdGlvbiBib2R5LiBgY3R4YCBpcyBpbiBzY29wZS4gTXVzdCB1c2UgYHJldHVybmAgdG8gcHJvZHVjZSBvdXRwdXQuXCJcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgfSksXG59IHNhdGlzZmllcyBUb29sU2V0O1xuXG5leHBvcnQgdHlwZSBCdWlsdEluVG9vbE5hbWUgPSBrZXlvZiB0eXBlb2YgYnVpbHRJblRvb2xzO1xuZXhwb3J0IGNvbnN0IGJ1aWx0aW5Ub29sTmFtZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIE9iamVjdC5lbnRyaWVzKGJ1aWx0SW5Ub29scykubWFwKChbbmFtZV0pID0+IFtuYW1lLCBuYW1lXSlcbikgYXMgeyBbSyBpbiBCdWlsdEluVG9vbE5hbWVdOiBLIH07XG5cbmNvbnN0IFNLSUxMX01EX1NVRkZJWCA9IC9cXC8/U0tJTExcXC5tZCQvO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9vbHMoe1xuICBhZ2VudCxcbiAgc2Vzc2lvbixcbiAgc2tpbGxzUmVmLFxuICB3cml0ZXIsXG4gIGFib3J0Q29udHJvbGxlcixcbiAgbmV4dFBhcnRJbmRleFJlZixcbiAgYXNzaXN0YW50TWVzc2FnZUlkLFxuICBzZXNzaW9uSWQsXG4gIHN0ZXBMb2csXG4gIGNvbnRleHQsXG59OiB7XG4gIGFnZW50OiBBbnlBZ2VudDtcbiAgc2Vzc2lvbjogU2Vzc2lvbjtcbiAgc2tpbGxzUmVmOiB7IGN1cnJlbnQ6IFNraWxsU3VtbWFyeVtdIH07XG4gIHdyaXRlcjogU3RyZWFtV3JpdGVyO1xuICBhYm9ydENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcbiAgbmV4dFBhcnRJbmRleFJlZjogeyBjdXJyZW50OiBudW1iZXIgfTtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBzdGVwTG9nOiBMb2dnZXI7XG4gIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufSk6IHtcbiAgcmF3VG9vbHM6IFRvb2xTZXQ7XG4gIHRvb2xzV2l0aE5lZWRzQXBwcm92YWw6IFRvb2xTZXQ7XG4gIHRvb2xDb250ZXh0OiBUb29sQ29udGV4dDtcbn0ge1xuICBjb25zdCBzYW5kYm94ID0gYWdlbnQuc2FuZGJveChzZXNzaW9uLnNhbmRib3hJZCA/PyBzZXNzaW9uLmlkKTtcbiAgY29uc3QgcmF3VG9vbHM6IFRvb2xTZXQgPSB7XG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuUmVhZF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLlJlYWQsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXRoLCBzdGFydExpbmUsIGVuZExpbmUgfSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGg7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FuZGJveC5yZWFkRmlsZSh7IHBhdGg6IGZpbGVQYXRoIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGxvZy5lcnJvcihcIlJlYWQgZmFpbGVkXCIsIHsgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIH0pO1xuICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogYEVycm9yOiBGaWxlIG5vdCBmb3VuZCAtICR7ZmlsZVBhdGh9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHRvdGFsTGluZXM6IDAsXG4gICAgICAgICAgICAgIGxpbmVzU2hvd246IDAsXG4gICAgICAgICAgICAgIHN0YXJ0TGluZTogMCxcbiAgICAgICAgICAgICAgZW5kTGluZTogMCxcbiAgICAgICAgICAgICAgaXNQYWdpbmF0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICBmaWxlU2l6ZTogXCIwXCIsXG4gICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnVsbENvbnRlbnQgPSByZXN1bHQudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgICAgICAgY29uc3QgbGluZXMgPSBmdWxsQ29udGVudC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgLy8gQSB0cmFpbGluZyBuZXdsaW5lIHByb2R1Y2VzIGFuIGVtcHR5IGxhc3QgZWxlbWVudCBcdTIwMTQgcmVtb3ZlIGl0XG4gICAgICAgIC8vIHNvIGxpbmUgY291bnQgbWF0Y2hlcyBgd2MgLWxgIC8gYGF3ayAnRU5Ee3ByaW50IE5SfSdgIGJlaGF2aW9yLlxuICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lcy5hdCgtMSkgPT09IFwiXCIpIHtcbiAgICAgICAgICBsaW5lcy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3RhbExpbmVzID0gbGluZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBmaWxlQnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChmdWxsQ29udGVudCk7XG4gICAgICAgIGNvbnN0IGZpbGVTaXplID0gZm9ybWF0RmlsZVNpemUoZmlsZUJ5dGVzKTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgcmFuZ2VcbiAgICAgICAgY29uc3QgUEFHRV9TSVpFID0gMTAwO1xuICAgICAgICBsZXQgYWN0dWFsU3RhcnQ6IG51bWJlcjtcbiAgICAgICAgbGV0IGFjdHVhbEVuZDogbnVtYmVyO1xuXG4gICAgICAgIGlmIChzdGFydExpbmUgIT09IHVuZGVmaW5lZCAmJiBlbmRMaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhY3R1YWxTdGFydCA9IHN0YXJ0TGluZTtcbiAgICAgICAgICBhY3R1YWxFbmQgPSBlbmRMaW5lO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0TGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSBzdGFydExpbmU7XG4gICAgICAgICAgYWN0dWFsRW5kID0gTWF0aC5taW4oc3RhcnRMaW5lICsgUEFHRV9TSVpFIC0gMSwgdG90YWxMaW5lcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZW5kTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSAxO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IGVuZExpbmU7XG4gICAgICAgIH0gZWxzZSBpZiAodG90YWxMaW5lcyA+IDIwMCkge1xuICAgICAgICAgIGFjdHVhbFN0YXJ0ID0gMTtcbiAgICAgICAgICBhY3R1YWxFbmQgPSBQQUdFX1NJWkU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSAxO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IHRvdGFsTGluZXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBsaW5lIHJhbmdlICgxLWluZGV4ZWQpXG4gICAgICAgIGNvbnN0IHNsaWNlZExpbmVzID0gbGluZXMuc2xpY2UoYWN0dWFsU3RhcnQgLSAxLCBhY3R1YWxFbmQpO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gc2xpY2VkTGluZXMuam9pbihcIlxcblwiKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB0b3RhbExpbmVzLFxuICAgICAgICAgICAgbGluZXNTaG93bjogTWF0aC5tYXgoMCwgYWN0dWFsRW5kIC0gYWN0dWFsU3RhcnQgKyAxKSxcbiAgICAgICAgICAgIHN0YXJ0TGluZTogYWN0dWFsU3RhcnQsXG4gICAgICAgICAgICBlbmRMaW5lOiBhY3R1YWxFbmQsXG4gICAgICAgICAgICBpc1BhZ2luYXRlZDogYWN0dWFsRW5kIDwgdG90YWxMaW5lcyxcbiAgICAgICAgICAgIGZpbGVTaXplLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5HcmVwXTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuR3JlcCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7XG4gICAgICAgIHBhdHRlcm4sXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGZpbGVUeXBlLFxuICAgICAgICBnbG9iLFxuICAgICAgICBjYXNlU2Vuc2l0aXZlLFxuICAgICAgICBjb250ZXh0TGluZXMsXG4gICAgICAgIG1heENvdW50LFxuICAgICAgICBmaWxlc1dpdGhNYXRjaGVzLFxuICAgICAgfSkgPT4ge1xuICAgICAgICBjb25zdCBzZWFyY2hQYXRoID0gcGF0aCA/PyBcIi5cIjtcblxuICAgICAgICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGFyZ3MucHVzaChcIi0tbGluZS1udW1iZXJcIik7XG4gICAgICAgIGFyZ3MucHVzaChcIi0taGVhZGluZ1wiKTtcbiAgICAgICAgYXJncy5wdXNoKFwiLS1jb2xvclwiLCBcIm5ldmVyXCIpO1xuXG4gICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgICAgIGFyZ3MucHVzaChcIi1pXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGVUeXBlKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS10eXBlXCIsIGZpbGVUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnbG9iKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS1nbG9iXCIsIGdsb2IpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHRMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLUNcIiwgU3RyaW5nKGNvbnRleHRMaW5lcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1heENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItLW1heC1jb3VudFwiLCBTdHJpbmcobWF4Q291bnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlc1dpdGhNYXRjaGVzKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS1maWxlcy13aXRoLW1hdGNoZXNcIik7XG4gICAgICAgIH1cblxuICAgICAgICBhcmdzLnB1c2goXCItLVwiLCBwYXR0ZXJuLCBzZWFyY2hQYXRoKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHsgY29tbWFuZDogXCJyZ1wiLCBhcmdzIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvciAmJiBpc1JnTm90Rm91bmRFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgICAgbG9nLndhcm4oXCJyZyBub3QgZm91bmQsIGluc3RhbGxpbmcgcmlwZ3JlcFwiKTtcbiAgICAgICAgICBjb25zdCBpbnN0YWxsUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICBcIi1jXCIsXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBcImNvbW1hbmQgLXYgcmcgPi9kZXYvbnVsbCAyPiYxICYmIGV4aXQgMFwiLFxuICAgICAgICAgICAgICAgIFwiZG5mIGluc3RhbGwgLXkgcmlwZ3JlcCAyPi9kZXYvbnVsbCAmJiBleGl0IDBcIixcbiAgICAgICAgICAgICAgICBcIihhcHQtZ2V0IHVwZGF0ZSAtcXEgJiYgYXB0LWdldCBpbnN0YWxsIC15IC1xcSByaXBncmVwKSAyPi9kZXYvbnVsbCAmJiBleGl0IDBcIixcbiAgICAgICAgICAgICAgICBcImFwayBhZGQgLS1uby1jYWNoZSByaXBncmVwIDI+L2Rldi9udWxsICYmIGV4aXQgMFwiLFxuICAgICAgICAgICAgICAgIFwiY3VybCAtc0wgaHR0cHM6Ly9naXRodWIuY29tL0J1cm50U3VzaGkvcmlwZ3JlcC9yZWxlYXNlcy9kb3dubG9hZC8xNC4xLjEvcmlwZ3JlcC0xNC4xLjEteDg2XzY0LXVua25vd24tbGludXgtbXVzbC50YXIuZ3ogfCB0YXIgeHogLUMgL3RtcCAmJiBpbnN0YWxsIC90bXAvcmlwZ3JlcC0xNC4xLjEteDg2XzY0LXVua25vd24tbGludXgtbXVzbC9yZyAvdXNyL2xvY2FsL2Jpbi9yZyAmJiBybSAtcmYgL3RtcC9yaXBncmVwLTE0LjEuMS14ODZfNjQtdW5rbm93bi1saW51eC1tdXNsXCIsXG4gICAgICAgICAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBzdWRvOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghKGluc3RhbGxSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbGxPdXRwdXQgPSBhd2FpdCBpbnN0YWxsUmVzdWx0LnJlc3VsdDtcbiAgICAgICAgICAgIGlmIChpbnN0YWxsT3V0cHV0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgICAgICAgIGxvZy53YXJuKFwicmlwZ3JlcCBpbnN0YWxsIGZhaWxlZFwiLCB7XG4gICAgICAgICAgICAgICAgc3RkZXJyOiBpbnN0YWxsT3V0cHV0LnN0ZGVycixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7IGNvbW1hbmQ6IFwicmdcIiwgYXJncyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvciAmJiBpc1JnTm90Rm91bmRFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgICAgbG9nLndhcm4oXCJyZyB1bmF2YWlsYWJsZSwgZmFsbGluZyBiYWNrIHRvIGdyZXBcIik7XG4gICAgICAgICAgY29uc3QgZ3JlcEFyZ3MgPSBbXCItcm5cIiwgXCItLWNvbG9yPW5ldmVyXCJdO1xuICAgICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgICAgICAgZ3JlcEFyZ3MucHVzaChcIi1pXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29udGV4dExpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGdyZXBBcmdzLnB1c2goXCItQ1wiLCBTdHJpbmcoY29udGV4dExpbmVzKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXhDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBncmVwQXJncy5wdXNoKFwiLW1cIiwgU3RyaW5nKG1heENvdW50KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWxlc1dpdGhNYXRjaGVzKSB7XG4gICAgICAgICAgICBncmVwQXJncy5wdXNoKFwiLWxcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChnbG9iKSB7XG4gICAgICAgICAgICBncmVwQXJncy5wdXNoKGAtLWluY2x1ZGU9JHtnbG9ifWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmlsZVR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHtcbiAgICAgICAgICAgICAgdHM6IFtcIioudHNcIiwgXCIqLnRzeFwiLCBcIioubXRzXCIsIFwiKi5jdHNcIl0sXG4gICAgICAgICAgICAgIGpzOiBbXCIqLmpzXCIsIFwiKi5qc3hcIiwgXCIqLm1qc1wiLCBcIiouY2pzXCJdLFxuICAgICAgICAgICAgICBweTogW1wiKi5weVwiXSxcbiAgICAgICAgICAgICAgcnVzdDogW1wiKi5yc1wiXSxcbiAgICAgICAgICAgICAgZ286IFtcIiouZ29cIl0sXG4gICAgICAgICAgICAgIGphdmE6IFtcIiouamF2YVwiXSxcbiAgICAgICAgICAgICAgbWQ6IFtcIioubWRcIl0sXG4gICAgICAgICAgICAgIGpzb246IFtcIiouanNvblwiXSxcbiAgICAgICAgICAgICAgY3NzOiBbXCIqLmNzc1wiXSxcbiAgICAgICAgICAgICAgaHRtbDogW1wiKi5odG1sXCJdLFxuICAgICAgICAgICAgICB5YW1sOiBbXCIqLnltbFwiLCBcIioueWFtbFwiXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4dCBvZiBpbmNsdWRlTWFwW2ZpbGVUeXBlXSA/PyBbYCouJHtmaWxlVHlwZX1gXSkge1xuICAgICAgICAgICAgICBncmVwQXJncy5wdXNoKGAtLWluY2x1ZGU9JHtleHR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGdyZXBBcmdzLnB1c2goXCItLVwiLCBwYXR0ZXJuLCBzZWFyY2hQYXRoKTtcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgICAgICAgY29tbWFuZDogXCJncmVwXCIsXG4gICAgICAgICAgICBhcmdzOiBncmVwQXJncyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGxvZy5lcnJvcihcIkdyZXAgZmFpbGVkXCIsIHsgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIH0pO1xuICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIgfSA9IGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG5cbiAgICAgICAgaWYgKHN0ZGVyciAmJiAhc3RkZXJyLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJubyBtYXRjaGVzXCIpKSB7XG4gICAgICAgICAgbG9nLndhcm4oXCJHcmVwIHN0ZGVyclwiLCB7IHN0ZGVyciB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRydW5jYXRlIG91dHB1dCB0byBwcmV2ZW50IFwiaW5wdXQgdG9vIGxvbmdcIiBlcnJvcnMgKDUwayBjaGFycyBcdTIyNDggMTIuNWsgdG9rZW5zKVxuICAgICAgICBjb25zdCBNQVhfR1JFUF9PVVRQVVRfQ0hBUlMgPSA1MF8wMDA7XG4gICAgICAgIGxldCBmaW5hbE91dHB1dCA9IHN0ZG91dDtcbiAgICAgICAgbGV0IHdhc1RydW5jYXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoZmluYWxPdXRwdXQubGVuZ3RoID4gTUFYX0dSRVBfT1VUUFVUX0NIQVJTKSB7XG4gICAgICAgICAgZmluYWxPdXRwdXQgPVxuICAgICAgICAgICAgZmluYWxPdXRwdXQuc2xpY2UoMCwgTUFYX0dSRVBfT1VUUFVUX0NIQVJTKSArXG4gICAgICAgICAgICBcIlxcblxcbltPdXRwdXQgdHJ1bmNhdGVkIC0gdXNlIG1vcmUgc3BlY2lmaWMgcGF0dGVybiBvciBwYXRoXVwiO1xuICAgICAgICAgIHdhc1RydW5jYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW5lcyA9IGZpbmFsT3V0cHV0XG4gICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgICAgIC5maWx0ZXIoKGwpID0+IGwubGVuZ3RoID4gMCk7XG4gICAgICAgIGNvbnN0IGZpbGVDb3VudCA9IGZpbGVzV2l0aE1hdGNoZXNcbiAgICAgICAgICA/IGxpbmVzLmxlbmd0aFxuICAgICAgICAgIDogbmV3IFNldChcbiAgICAgICAgICAgICAgbGluZXNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChsKSA9PiAhbC5zdGFydHNXaXRoKFwiIFwiKSAmJiBsLmluY2x1ZGVzKFwiOlwiKSlcbiAgICAgICAgICAgICAgICAubWFwKChsKSA9PiBsLnNwbGl0KFwiOlwiKVswXSlcbiAgICAgICAgICAgICkuc2l6ZTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgIG1hdGNoQ291bnQ6IGZpbGVzV2l0aE1hdGNoZXNcbiAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgIDogbGluZXMuZmlsdGVyKChsKSA9PiBsLmluY2x1ZGVzKFwiOlwiKSkubGVuZ3RoLFxuICAgICAgICAgICAgZmlsZUNvdW50LFxuICAgICAgICAgICAgc2VhcmNoUGF0aCxcbiAgICAgICAgICAgIHBhdHRlcm4sXG4gICAgICAgICAgICB3YXNUcnVuY2F0ZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtYXRjaGVzOiBmaW5hbE91dHB1dCB8fCBcIihubyBtYXRjaGVzIGZvdW5kKVwiLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5MaXN0XTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuTGlzdCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhdGgsIGRlcHRoLCBpbmNsdWRlSGlkZGVuLCBmaWxlc09ubHksIHBhdHRlcm4gfSkgPT4ge1xuICAgICAgICBjb25zdCBzZWFyY2hQYXRoID0gcGF0aCA/PyBcIi5cIjtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgIFwiLWNcIixcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgIHNldCAtZVxuICAgICAgICAgICAgU0VBUkNIX1BBVEg9XCIkMVwiXG4gICAgICAgICAgICBERVBUSD1cIiQyXCJcbiAgICAgICAgICAgIElOQ0xVREVfSElEREVOPVwiJDNcIlxuICAgICAgICAgICAgRklMRVNfT05MWT1cIiQ0XCJcbiAgICAgICAgICAgIFBBVFRFUk49XCIkNVwiXG5cbiAgICAgICAgICAgICMgQnVpbGQgZmluZCBjb21tYW5kIGFyZ3VtZW50c1xuICAgICAgICAgICAgRklORF9BUkdTPVwiXCJcbiAgICAgICAgICAgIFsgLW4gXCIkREVQVEhcIiBdICYmIEZJTkRfQVJHUz1cIiRGSU5EX0FSR1MgLW1heGRlcHRoICRERVBUSFwiXG4gICAgICAgICAgICBbIFwiJElOQ0xVREVfSElEREVOXCIgIT0gXCJ0cnVlXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTICEgLXBhdGggJyovLionXCJcbiAgICAgICAgICAgIFsgXCIkRklMRVNfT05MWVwiID0gXCJ0cnVlXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTIC10eXBlIGZcIlxuICAgICAgICAgICAgWyAtbiBcIiRQQVRURVJOXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTIC1uYW1lICckUEFUVEVSTidcIlxuXG4gICAgICAgICAgICAjIEdldCBsaXN0aW5nXG4gICAgICAgICAgICBMSVNUSU5HPSQoZXZhbCBcImZpbmQgJyRTRUFSQ0hfUEFUSCcgJEZJTkRfQVJHU1wiIDI+L2Rldi9udWxsIHwgc29ydClcblxuICAgICAgICAgICAgIyBHZXQgY291bnRzXG4gICAgICAgICAgICBDT1VOVF9BUkdTPVwiXCJcbiAgICAgICAgICAgIFsgLW4gXCIkREVQVEhcIiBdICYmIENPVU5UX0FSR1M9XCIkQ09VTlRfQVJHUyAtbWF4ZGVwdGggJERFUFRIXCJcbiAgICAgICAgICAgIFsgXCIkSU5DTFVERV9ISURERU5cIiAhPSBcInRydWVcIiBdICYmIENPVU5UX0FSR1M9XCIkQ09VTlRfQVJHUyAhIC1wYXRoICcqLy4qJ1wiXG5cbiAgICAgICAgICAgIEZJTEVfQ09VTlQ9JChldmFsIFwiZmluZCAnJFNFQVJDSF9QQVRIJyAkQ09VTlRfQVJHUyAtdHlwZSBmXCIgMj4vZGV2L251bGwgfCB3YyAtbClcbiAgICAgICAgICAgIERJUl9DT1VOVD0kKGV2YWwgXCJmaW5kICckU0VBUkNIX1BBVEgnICRDT1VOVF9BUkdTIC10eXBlIGRcIiAyPi9kZXYvbnVsbCB8IHdjIC1sKVxuXG4gICAgICAgICAgICAjIE91dHB1dDogY291bnRzIGZpcnN0LCB0aGVuIGxpc3RpbmdcbiAgICAgICAgICAgIGVjaG8gXCIkRklMRV9DT1VOVHwkRElSX0NPVU5UXCJcbiAgICAgICAgICAgIGVjaG8gXCJ8fHxMSVNUSU5HfHx8XCJcbiAgICAgICAgICAgIGVjaG8gXCIkTElTVElOR1wiIHwgc2VkIFwic3xeJFNFQVJDSF9QQVRIfC58XCJcbiAgICAgICAgICBgLFxuICAgICAgICAgICAgXCItLVwiLFxuICAgICAgICAgICAgc2VhcmNoUGF0aCxcbiAgICAgICAgICAgIGRlcHRoPy50b1N0cmluZygpIHx8IFwiXCIsXG4gICAgICAgICAgICBpbmNsdWRlSGlkZGVuID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIsXG4gICAgICAgICAgICBmaWxlc09ubHkgPyBcInRydWVcIiA6IFwiZmFsc2VcIixcbiAgICAgICAgICAgIHBhdHRlcm4gfHwgXCJcIixcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoXCJMaXN0IGZhaWxlZFwiLCB7IGVycm9yOiByZXN1bHQubWVzc2FnZSB9KTtcbiAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyIH0gPSBhd2FpdCByZXN1bHQucmVzdWx0O1xuXG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICBsb2cud2FybihcIkxpc3Qgc3RkZXJyXCIsIHsgc3RkZXJyIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2NvdW50c0xpbmUsIC4uLnJlc3RdID0gc3Rkb3V0LnNwbGl0KFwifHx8TElTVElOR3x8fFwiKTtcbiAgICAgICAgY29uc3QgbGlzdGluZyA9IHJlc3Quam9pbihcInx8fExJU1RJTkd8fHxcIikudHJpbSgpO1xuICAgICAgICBjb25zdCBbZmlsZUNvdW50U3RyLCBkaXJDb3VudFN0cl0gPSBjb3VudHNMaW5lLnRyaW0oKS5zcGxpdChcInxcIik7XG5cbiAgICAgICAgY29uc3QgdG90YWxGaWxlcyA9IE51bWJlci5wYXJzZUludChmaWxlQ291bnRTdHIsIDEwKSB8fCAwO1xuICAgICAgICBjb25zdCB0b3RhbERpcnMgPSBOdW1iZXIucGFyc2VJbnQoZGlyQ291bnRTdHIsIDEwKSB8fCAwO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGxpc3Rpbmcuc3BsaXQoXCJcXG5cIikuZmlsdGVyKChsKSA9PiBsLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgICAgdG90YWxJdGVtczogbGluZXMubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxGaWxlcyxcbiAgICAgICAgICAgIHRvdGFsRGlycyxcbiAgICAgICAgICAgIHNlYXJjaFBhdGgsXG4gICAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGxpc3RpbmcsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLldyaXRlXTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuV3JpdGUsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXRoLCBjb250ZW50IH0pID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgc2FuZGJveC53cml0ZUZpbGVzKHtcbiAgICAgICAgICAgIGZpbGVzOiBbeyBwYXRoOiBmaWxlUGF0aCwgY29udGVudCB9XSxcbiAgICAgICAgICAgIGRlc3RQYXRoOiBcIi5cIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBieXRlc1dyaXR0ZW46IEJ1ZmZlci5ieXRlTGVuZ3RoKGNvbnRlbnQsIFwidXRmOFwiKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvck1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGJ5dGVzV3JpdHRlbjogMCxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvck1zZyxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLkVkaXRdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5FZGl0LFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCwgb2xkX3N0cmluZywgbmV3X3N0cmluZyB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aDtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LnJlYWRGaWxlKHsgcGF0aDogZmlsZVBhdGggfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIHBhdGg6IGZpbGVQYXRoLCBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZVBhdGh9YCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IHJlc3VsdC50b1N0cmluZyhcInV0Zi04XCIpO1xuICAgICAgICBjb25zdCBvY2N1cnJlbmNlcyA9IGNvbnRlbnQuc3BsaXQob2xkX3N0cmluZykubGVuZ3RoIC0gMTtcblxuICAgICAgICBpZiAob2NjdXJyZW5jZXMgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBcIm9sZF9zdHJpbmcgbm90IGZvdW5kIGluIGZpbGVcIixcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9jY3VycmVuY2VzID4gMSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgZXJyb3I6IGBvbGRfc3RyaW5nIGFwcGVhcnMgJHtvY2N1cnJlbmNlc30gdGltZXMgaW4gZmlsZSAobXVzdCBiZSB1bmlxdWUpLiBJbmNsdWRlIG1vcmUgc3Vycm91bmRpbmcgY29udGV4dCB0byBtYWtlIHRoZSBtYXRjaCB1bmlxdWUuYCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZShvbGRfc3RyaW5nLCBuZXdfc3RyaW5nKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgICAgICAgICBmaWxlczogW3sgcGF0aDogZmlsZVBhdGgsIGNvbnRlbnQ6IG5ld0NvbnRlbnQgfV0sXG4gICAgICAgICAgICBkZXN0UGF0aDogXCIuXCIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBwYXRoOiBmaWxlUGF0aCB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvck1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgcGF0aDogZmlsZVBhdGgsIGVycm9yOiBlcnJvck1zZyB9O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLkJhc2hdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5CYXNoLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgY29tbWFuZCwgd2FpdFVudGlsIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBjcmVhdGVQcm9jZXNzTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgIFwiLi4vc2FuZGJveC9wcm9jZXNzLW1hbmFnZXJcIlxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHByb2Nlc3NNYW5hZ2VyID0gY3JlYXRlUHJvY2Vzc01hbmFnZXIoeyBzYW5kYm94IH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2Nlc3NNYW5hZ2VyLnJ1bih7IGNvbW1hbmQsIHdhaXRVbnRpbCB9KTtcblxuICAgICAgICBjb25zdCBNQVhfU1RET1VUID0gNTBfMDAwO1xuICAgICAgICBjb25zdCBNQVhfU1RERVJSID0gMTBfMDAwO1xuXG4gICAgICAgIGxldCB7IHN0ZG91dCwgc3RkZXJyIH0gPSByZXN1bHQ7XG4gICAgICAgIGlmIChzdGRvdXQubGVuZ3RoID4gTUFYX1NURE9VVCkge1xuICAgICAgICAgIHN0ZG91dCA9XG4gICAgICAgICAgICBgW3RydW5jYXRlZCBcdTIwMTQgc2hvd2luZyBsYXN0ICR7TUFYX1NURE9VVH0gY2hhcnMuIEZ1bGw6ICR7cmVzdWx0Lm91dHB1dERpcn0vc3Rkb3V0LnR4dF1cXG5cXG5gICtcbiAgICAgICAgICAgIHN0ZG91dC5zbGljZSgtTUFYX1NURE9VVCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZGVyci5sZW5ndGggPiBNQVhfU1RERVJSKSB7XG4gICAgICAgICAgc3RkZXJyID1cbiAgICAgICAgICAgIGBbdHJ1bmNhdGVkIFx1MjAxNCBzaG93aW5nIGxhc3QgJHtNQVhfU1RERVJSfSBjaGFycy4gRnVsbDogJHtyZXN1bHQub3V0cHV0RGlyfS9zdGRlcnIudHh0XVxcblxcbmAgK1xuICAgICAgICAgICAgc3RkZXJyLnNsaWNlKC1NQVhfU1RERVJSKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IC4uLnJlc3VsdCwgc3Rkb3V0LCBzdGRlcnIgfTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgLi4uYWdlbnQub3B0aW9ucy50b29scyxcbiAgfTtcblxuICBpZiAoc2Vzc2lvbi5za2lsbHNEaXI/Lmxlbmd0aCkge1xuICAgIHJhd1Rvb2xzW2J1aWx0aW5Ub29sTmFtZXMuU2tpbGxdID0gdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuU2tpbGwsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBuYW1lIH0pID0+IHtcbiAgICAgICAgY29uc3Qgc2tpbGxzID0gc2tpbGxzUmVmLmN1cnJlbnQ7XG4gICAgICAgIGNvbnN0IHNraWxsID0gc2tpbGxzLmZpbmQoXG4gICAgICAgICAgKHMpID0+IHMubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFza2lsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBTa2lsbCBub3QgZm91bmQ6IFwiJHtuYW1lfVwiLiBBdmFpbGFibGU6ICR7c2tpbGxzLm1hcCgocykgPT4gcy5uYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FuZGJveC5yZWFkRmlsZSh7XG4gICAgICAgICAgcGF0aDogc2tpbGwuc2tpbGxNZFBhdGgsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2tpbGwgZmlsZSBub3QgZm91bmQ6ICR7c2tpbGwuc2tpbGxNZFBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmF3ID1cbiAgICAgICAgICB0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiID8gcmVzdWx0IDogcmVzdWx0LnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgICAgIGNvbnN0IGVuZE1hcmtlciA9IHJhdy5pbmRleE9mKFwiLS0tXCIsIDMpO1xuICAgICAgICBjb25zdCBjb250ZW50ID1cbiAgICAgICAgICBlbmRNYXJrZXIgPT09IC0xID8gcmF3IDogcmF3LnNsaWNlKGVuZE1hcmtlciArIDMpLnRyaW0oKTtcbiAgICAgICAgY29uc3Qgc2tpbGxEaXIgPSBza2lsbC5za2lsbE1kUGF0aC5yZXBsYWNlKFNLSUxMX01EX1NVRkZJWCwgXCJcIik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogc2tpbGwubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogc2tpbGwuZGVzY3JpcHRpb24sXG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgICBwYXRoOiBza2lsbERpcixcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBvblN1YlRvb2xDYWxsOiBPblN1YlRvb2xDYWxsID0gYXN5bmMgKHRvb2xOYW1lLCB0b29sSW5wdXQsIGV4ZWN1dGUpID0+IHtcbiAgICBjb25zdCBuZWVkc0FwcHJvdmFsID0gYXdhaXQgY2hlY2tOZWVkc0FwcHJvdmFsKHtcbiAgICAgIGFnZW50LFxuICAgICAgdG9vbE5hbWUsXG4gICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgICAgdG9vbENhbGxJZDogYGpzXyR7dG9vbE5hbWV9XyR7RGF0ZS5ub3coKX1gLFxuICAgICAgbWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuXG4gICAgaWYgKCFuZWVkc0FwcHJvdmFsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlKCk7XG4gICAgICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhcHByb3ZhbElkID0gYGpzX2FwcHJvdmFsXyR7dWxpZCgpfWA7XG4gICAgY29uc3QgdG9vbENhbGxJZCA9IGBqc190Y18ke3VsaWQoKX1gO1xuICAgIGNvbnN0IHBhcnRJZCA9IGFwcHJvdmFsUGFydElkKGFwcHJvdmFsSWQpO1xuXG4gICAgYXdhaXQgYWdlbnQuc3RvcmFnZS5wYXJ0LnNldChwYXJ0SWQsIHtcbiAgICAgIGlkOiBwYXJ0SWQsXG4gICAgICBpbmRleDogbmV4dFBhcnRJbmRleFJlZi5jdXJyZW50KyssXG4gICAgICBtZXNzYWdlSWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHBhcnQ6IHtcbiAgICAgICAgdHlwZTogYHRvb2wtJHt0b29sTmFtZX1gLFxuICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICBzdGF0ZTogXCJhcHByb3ZhbC1yZXF1ZXN0ZWRcIixcbiAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgYXBwcm92YWw6IHsgaWQ6IGFwcHJvdmFsSWQgfSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBVSU1lc3NhZ2VbXCJwYXJ0c1wiXVtudW1iZXJdLFxuICAgIH0pO1xuXG4gICAgd3JpdGVyLndyaXRlKHtcbiAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1zdGFydFwiLFxuICAgICAgdG9vbENhbGxJZCxcbiAgICAgIHRvb2xOYW1lLFxuICAgIH0pO1xuICAgIHdyaXRlci53cml0ZSh7XG4gICAgICB0eXBlOiBcInRvb2wtaW5wdXQtYXZhaWxhYmxlXCIsXG4gICAgICB0b29sQ2FsbElkLFxuICAgICAgdG9vbE5hbWUsXG4gICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgIH0pO1xuICAgIHdyaXRlci53cml0ZSh7XG4gICAgICB0eXBlOiBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiLFxuICAgICAgYXBwcm92YWxJZCxcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBQT0xMX01TID0gNTAwO1xuICAgIGNvbnN0IFRJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwO1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCBUSU1FT1VUX01TICYmICFhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCBhZ2VudC5zdG9yYWdlLnBhcnQuZ2V0KHBhcnRJZCk7XG4gICAgICBpZiAoXG4gICAgICAgIHVwZGF0ZWQgJiZcbiAgICAgICAgXCJzdGF0ZVwiIGluIHVwZGF0ZWQucGFydCAmJlxuICAgICAgICAoKHVwZGF0ZWQucGFydCBhcyB7IHN0YXRlOiBzdHJpbmcgfSkuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVzcG9uZGVkXCIgfHxcbiAgICAgICAgICAodXBkYXRlZC5wYXJ0IGFzIHsgc3RhdGU6IHN0cmluZyB9KS5zdGF0ZSA9PT0gXCJvdXRwdXQtZGVuaWVkXCIpXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSAodXBkYXRlZC5wYXJ0IGFzIHsgc3RhdGU6IHN0cmluZyB9KS5zdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09IFwib3V0cHV0LWRlbmllZFwiKSB7XG4gICAgICAgICAgY29uc3QgcmVhc29uID0gKHVwZGF0ZWQucGFydCBhcyB7IGFwcHJvdmFsPzogeyByZWFzb24/OiBzdHJpbmcgfSB9KVxuICAgICAgICAgICAgLmFwcHJvdmFsPy5yZWFzb247XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yOiBgVG9vbCBcIiR7dG9vbE5hbWV9XCIgZGVuaWVkOiAke3JlYXNvbiB8fCBcInVzZXIgZGVuaWVkXCJ9YCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXBwcm92YWwgPSAoXG4gICAgICAgICAgdXBkYXRlZC5wYXJ0IGFzIHtcbiAgICAgICAgICAgIGFwcHJvdmFsPzogeyBhcHByb3ZlZDogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH07XG4gICAgICAgICAgfVxuICAgICAgICApLmFwcHJvdmFsO1xuICAgICAgICBpZiAoYXBwcm92YWw/LmFwcHJvdmVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoKTtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIG91dHB1dDogcmVzdWx0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1lcnJvclwiLFxuICAgICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICBlcnJvclRleHQ6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvciB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIud3JpdGUoe1xuICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtZGVuaWVkXCIsXG4gICAgICAgICAgdG9vbENhbGxJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IGBUb29sIFwiJHt0b29sTmFtZX1cIiBkZW5pZWQ6ICR7YXBwcm92YWw/LnJlYXNvbiB8fCBcInVzZXIgZGVuaWVkXCJ9YCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIFBPTExfTVMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZFxuICAgICAgICA/IFwiaW50ZXJydXB0ZWRcIlxuICAgICAgICA6IFwiQXBwcm92YWwgdGltZWQgb3V0XCIsXG4gICAgfTtcbiAgfTtcblxuICByYXdUb29sc1tidWlsdGluVG9vbE5hbWVzLkphdmFTY3JpcHRdID0gY3JlYXRlSmF2YVNjcmlwdFRvb2woe1xuICAgIHRvb2xzOiByYXdUb29scyxcbiAgICBzZXNzaW9uLFxuICAgIHNhbmRib3gsXG4gICAgb25TdWJUb29sQ2FsbCxcbiAgfSk7XG5cbiAgY29uc3QgdG9vbENvbnRleHQ6IFRvb2xDb250ZXh0ID0ge1xuICAgIHNlc3Npb24sXG4gICAgc2FuZGJveCxcbiAgICBzdG9yYWdlOiBhZ2VudC5zdG9yYWdlLFxuICAgIGNvbnRleHQsXG4gIH07XG5cbiAgY29uc3QgdG9vbHNXaXRoTmVlZHNBcHByb3ZhbCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhyYXdUb29scykubWFwKChbbmFtZSwgdF0pID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRXhlY3V0ZSA9IHQuZXhlY3V0ZTtcbiAgICAgIGNvbnN0IHdyYXBwZWRFeGVjdXRlID0gb3JpZ2luYWxFeGVjdXRlXG4gICAgICAgID8gYXN5bmMgKC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIG9yaWdpbmFsRXhlY3V0ZT4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRvbmUgPSBzdGVwTG9nLnRpbWUoYHRvb2w6JHtuYW1lfWApO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgbGV0IHRvb2xJbnB1dCA9IGFyZ3NbMF07XG4gICAgICAgICAgICAgIGlmIChhZ2VudC5ob29rc1tcInRvb2wuYmVmb3JlXCJdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlUmVzdWx0ID0gYXdhaXQgYWdlbnQuaG9va3NbXCJ0b29sLmJlZm9yZVwiXSh7XG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHRvb2xDb250ZXh0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChiZWZvcmVSZXN1bHQ/LmlucHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIHRvb2xJbnB1dCA9IGJlZm9yZVJlc3VsdC5pbnB1dDtcbiAgICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSB0b29sSW5wdXQgYXMgKHR5cGVvZiBhcmdzKVswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgb3JpZ2luYWxFeGVjdXRlKC4uLmFyZ3MpO1xuXG4gICAgICAgICAgICAgIGlmIChhZ2VudC5ob29rc1tcInRvb2wuYWZ0ZXJcIl0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhZnRlclJlc3VsdCA9IGF3YWl0IGFnZW50Lmhvb2tzW1widG9vbC5hZnRlclwiXSh7XG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHRvb2xDb250ZXh0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChhZnRlclJlc3VsdD8ucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFmdGVyUmVzdWx0LnJlc3VsdCBhcyB0eXBlb2YgcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgZG9uZSh7XG4gICAgICAgICAgICAgICAgZXJyb3I6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHtcbiAgICAgICAgICAuLi50LFxuICAgICAgICAgIC4uLih3cmFwcGVkRXhlY3V0ZSA/IHsgZXhlY3V0ZTogd3JhcHBlZEV4ZWN1dGUgfSA6IHt9KSxcbiAgICAgICAgICBuZWVkc0FwcHJvdmFsOiBhc3luYyAoXG4gICAgICAgICAgICB0b29sSW5wdXQ6IHVua25vd24sXG4gICAgICAgICAgICBvcHRzOiB7IHRvb2xDYWxsSWQ6IHN0cmluZzsgbWVzc2FnZXM6IHVua25vd25bXSB9XG4gICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hlY2tOZWVkc0FwcHJvdmFsKHtcbiAgICAgICAgICAgICAgYWdlbnQsXG4gICAgICAgICAgICAgIHRvb2xOYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgICAgICAgICAgICB0b29sQ2FsbElkOiBvcHRzLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIG1lc3NhZ2VzOiBvcHRzLm1lc3NhZ2VzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSlcbiAgKTtcblxuICByZXR1cm4geyByYXdUb29scywgdG9vbHNXaXRoTmVlZHNBcHByb3ZhbCwgdG9vbENvbnRleHQgfTtcbn1cbiIsICJpbXBvcnQgeyB0eXBlIFRvb2xTZXQsIHRvb2wgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuLi9zYW5kYm94L2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2Vzc2lvbiB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBidWlsdEluVG9vbHMgfSBmcm9tIFwiLlwiO1xuXG5leHBvcnQgY29uc3QgSkFWQVNDUklQVF9UT09MX05BTUUgPSBcIkphdmFTY3JpcHRcIjtcblxuZXhwb3J0IHR5cGUgU3ViVG9vbENhbGxSZXN1bHQgPSB7IHJlc3VsdD86IHVua25vd247IGVycm9yPzogc3RyaW5nIH07XG5leHBvcnQgdHlwZSBPblN1YlRvb2xDYWxsID0gKFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBpbnB1dDogdW5rbm93bixcbiAgZXhlY3V0ZTogKCkgPT4gUHJvbWlzZTx1bmtub3duPlxuKSA9PiBQcm9taXNlPFN1YlRvb2xDYWxsUmVzdWx0PjtcblxuY29uc3QgUkVRVUVTVF9NQVJLRVJfU1RBUlQgPSBcIl9fVE9PTF9SRVFVRVNUX19cIjtcbmNvbnN0IFJFUVVFU1RfTUFSS0VSX0VORCA9IFwiX19UT09MX1JFUVVFU1RfRU5EX19cIjtcbmNvbnN0IEVYRUNVVElPTl9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBUaGUgcnVubmVyIHNjcmlwdCBpcyB3cml0dGVuIHRvIHRoZSBzYW5kYm94IGFuZCBleGVjdXRlZCB2aWEgTm9kZS5qcy5cbiAqIEl0IHJlYWRzIHRoZSBtb2RlbCdzIGNvZGUgZnJvbSBjb2RlLmpzLCBzZXRzIHVwIGN0eC50b29scyBhcyBSUEMgcHJveGllc1xuICogKHJlcXVlc3RzIHNlbnQgdmlhIHN0ZGVyciBtYXJrZXJzLCByZXNwb25zZXMgcG9sbGVkIGZyb20gZmlsZXMpLCBleGVjdXRlc1xuICogdGhlIGNvZGUsIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byBzdGRvdXQgYXMgSlNPTi5cbiAqL1xuY29uc3QgUlVOTkVSX1NDUklQVCA9IGBcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgZXhpc3RzU3luYywgdW5saW5rU3luYywgbWtkaXJTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbmNvbnN0IFNDUklQVF9ESVIgPSBkaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5jb25zdCBUT09MX0NBTExfVElNRU9VVF9NUyA9IDMwMF8wMDA7XG5cbmxldCByZXFDb3VudGVyID0gMDtcblxuYXN5bmMgZnVuY3Rpb24gY2FsbFRvb2wobmFtZSwgaW5wdXQpIHtcbiAgY29uc3QgaWQgPSAncmVxXycgKyAoKytyZXFDb3VudGVyKSArICdfJyArIERhdGUubm93KCk7XG4gIGNvbnN0IHJlc3BvbnNlRmlsZSA9IGpvaW4oU0NSSVBUX0RJUiwgaWQgKyAnLnJlc3BvbnNlLmpzb24nKTtcblxuICBjb25zdCByZXF1ZXN0ID0gSlNPTi5zdHJpbmdpZnkoeyBpZCwgdG9vbDogbmFtZSwgaW5wdXQgfSk7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcke1JFUVVFU1RfTUFSS0VSX1NUQVJUfScgKyByZXF1ZXN0ICsgJyR7UkVRVUVTVF9NQVJLRVJfRU5EfScgKyAnXFxcXG4nKTtcblxuICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gIHdoaWxlICghZXhpc3RzU3luYyhyZXNwb25zZUZpbGUpKSB7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGFydCA+IFRPT0xfQ0FMTF9USU1FT1VUX01TKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rvb2wgY2FsbCAnICsgbmFtZSArICcgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlc3BvbnNlJyk7XG4gICAgfVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAzMCkpO1xuICB9XG5cbiAgbGV0IHJhdztcbiAgdHJ5IHtcbiAgICByYXcgPSByZWFkRmlsZVN5bmMocmVzcG9uc2VGaWxlLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTApKTtcbiAgICByYXcgPSByZWFkRmlsZVN5bmMocmVzcG9uc2VGaWxlLCAndXRmOCcpO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJhdyk7XG4gIHRyeSB7IHVubGlua1N5bmMocmVzcG9uc2VGaWxlKTsgfSBjYXRjaCB7fVxuXG4gIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5lcnJvcik7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdDtcbn1cblxuY29uc3QgY29kZSA9IHJlYWRGaWxlU3luYyhqb2luKFNDUklQVF9ESVIsICdjb2RlLmpzJyksICd1dGY4Jyk7XG5jb25zdCB0b29sTmFtZXMgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhqb2luKFNDUklQVF9ESVIsICd0b29scy5qc29uJyksICd1dGY4JykpO1xuXG5jb25zdCBjdHggPSB7IHRvb2xzOiB7fSB9O1xuZm9yIChjb25zdCBuYW1lIG9mIHRvb2xOYW1lcykge1xuICBjdHgudG9vbHNbbmFtZV0gPSAoaW5wdXQpID0+IGNhbGxUb29sKG5hbWUsIGlucHV0KTtcbn1cblxuY29uc3QgbG9ncyA9IFtdO1xuY29uc3QgY3VzdG9tQ29uc29sZSA9IHtcbiAgbG9nOiAoLi4uYXJncykgPT4gbG9ncy5wdXNoKGFyZ3MubWFwKGEgPT4gdHlwZW9mIGEgPT09ICdzdHJpbmcnID8gYSA6IEpTT04uc3RyaW5naWZ5KGEpKS5qb2luKCcgJykpLFxuICBlcnJvcjogKC4uLmFyZ3MpID0+IGxvZ3MucHVzaCgnW2Vycm9yXSAnICsgYXJncy5tYXAoYSA9PiB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogSlNPTi5zdHJpbmdpZnkoYSkpLmpvaW4oJyAnKSksXG4gIHdhcm46ICguLi5hcmdzKSA9PiBsb2dzLnB1c2goJ1t3YXJuXSAnICsgYXJncy5tYXAoYSA9PiB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogSlNPTi5zdHJpbmdpZnkoYSkpLmpvaW4oJyAnKSksXG59O1xuXG50cnkge1xuICBjb25zdCBBc3luY0Z1bmN0aW9uID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGFzeW5jIGZ1bmN0aW9uKCkge30pLmNvbnN0cnVjdG9yO1xuICBjb25zdCBmbiA9IG5ldyBBc3luY0Z1bmN0aW9uKCdjdHgnLCAnY29uc29sZScsIGNvZGUpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbihjdHgsIGN1c3RvbUNvbnNvbGUpO1xuXG4gIGNvbnN0IG91dHB1dCA9IHsgc3VjY2VzczogdHJ1ZSwgcmVzdWx0OiByZXN1bHQgIT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IG51bGwgfTtcbiAgaWYgKGxvZ3MubGVuZ3RoID4gMCkgb3V0cHV0LmxvZ3MgPSBsb2dzO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZShKU09OLnN0cmluZ2lmeShvdXRwdXQpKTtcbn0gY2F0Y2ggKGVycikge1xuICBjb25zdCBvdXRwdXQgPSB7XG4gICAgc3VjY2VzczogZmFsc2UsXG4gICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgfTtcbiAgaWYgKGxvZ3MubGVuZ3RoID4gMCkgb3V0cHV0LmxvZ3MgPSBsb2dzO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZShKU09OLnN0cmluZ2lmeShvdXRwdXQpKTtcbn1cbmA7XG5cbi8qKlxuICogRXh0cmFjdHMgYSBwbGFpbiBKU09OIFNjaGVtYSBmcm9tIHdoYXRldmVyIGZvcm1hdCB0aGUgQUkgU0RLIHRvb2wgdXNlc1xuICogKFpvZCBzY2hlbWEsIEFJIFNESyB3cmFwcGVkIHNjaGVtYSwgb3IgcmF3IEpTT04gU2NoZW1hKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RKc29uU2NoZW1hKFxuICBzY2hlbWE6IHVua25vd25cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB7XG4gIGlmICghc2NoZW1hIHx8IHR5cGVvZiBzY2hlbWEgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChcbiAgICBcIl9kZWZcIiBpbiBzY2hlbWEgJiZcbiAgICB0eXBlb2YgKHNjaGVtYSBhcyB7IF9kZWY6IHVua25vd24gfSkuX2RlZiA9PT0gXCJvYmplY3RcIlxuICApIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHoudG9KU09OU2NoZW1hKHNjaGVtYSBhcyB6LlpvZFR5cGUpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcyA9IHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPjtcbiAgaWYgKFN5bWJvbC5mb3IoXCJ2ZXJjZWwuYWkuc2NoZW1hXCIpIGluIHMgJiYgXCJqc29uU2NoZW1hXCIgaW4gcykge1xuICAgIHJldHVybiBzLmpzb25TY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICBpZiAoXCJ0eXBlXCIgaW4gcyB8fCBcInByb3BlcnRpZXNcIiBpbiBzKSB7XG4gICAgcmV0dXJuIHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpzb25TY2hlbWFUb1RzKFxuICBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBpbmRlbnQgPSAwXG4pOiBzdHJpbmcge1xuICBpZiAoIXNjaGVtYSkge1xuICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxuXG4gIGlmIChzY2hlbWEuZW51bSAmJiBBcnJheS5pc0FycmF5KHNjaGVtYS5lbnVtKSkge1xuICAgIHJldHVybiBzY2hlbWEuZW51bS5tYXAoKHYpID0+IEpTT04uc3RyaW5naWZ5KHYpKS5qb2luKFwiIHwgXCIpO1xuICB9XG5cbiAgaWYgKHNjaGVtYS5hbnlPZiAmJiBBcnJheS5pc0FycmF5KHNjaGVtYS5hbnlPZikpIHtcbiAgICByZXR1cm4gc2NoZW1hLmFueU9mXG4gICAgICAubWFwKChzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ganNvblNjaGVtYVRvVHMocywgaW5kZW50KSlcbiAgICAgIC5qb2luKFwiIHwgXCIpO1xuICB9XG4gIGlmIChzY2hlbWEub25lT2YgJiYgQXJyYXkuaXNBcnJheShzY2hlbWEub25lT2YpKSB7XG4gICAgcmV0dXJuIHNjaGVtYS5vbmVPZlxuICAgICAgLm1hcCgoczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IGpzb25TY2hlbWFUb1RzKHMsIGluZGVudCkpXG4gICAgICAuam9pbihcIiB8IFwiKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSBzY2hlbWEudHlwZSBhcyBzdHJpbmc7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgY2FzZSBcImFycmF5XCI6IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gc2NoZW1hLml0ZW1zXG4gICAgICAgID8ganNvblNjaGVtYVRvVHMoc2NoZW1hLml0ZW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBpbmRlbnQpXG4gICAgICAgIDogXCJ1bmtub3duXCI7XG4gICAgICByZXR1cm4gYEFycmF5PCR7aXRlbXN9PmA7XG4gICAgfVxuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHNjaGVtYS5wcm9wZXJ0aWVzIGFzXG4gICAgICAgIHwgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFwcm9wZXJ0aWVzKSB7XG4gICAgICAgIHJldHVybiBcIlJlY29yZDxzdHJpbmcsIHVua25vd24+XCI7XG4gICAgICB9XG4gICAgICBjb25zdCByZXF1aXJlZCA9IG5ldyBTZXQoKHNjaGVtYS5yZXF1aXJlZCBhcyBzdHJpbmdbXSkgfHwgW10pO1xuICAgICAgY29uc3QgcGFkID0gXCIgIFwiLnJlcGVhdChpbmRlbnQgKyAxKTtcbiAgICAgIGNvbnN0IGNsb3NlUGFkID0gXCIgIFwiLnJlcGVhdChpbmRlbnQpO1xuICAgICAgY29uc3QgcHJvcHMgPSBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBvcHQgPSByZXF1aXJlZC5oYXMoa2V5KSA/IFwiXCIgOiBcIj9cIjtcbiAgICAgICAgcmV0dXJuIGAke3BhZH0ke2tleX0ke29wdH06ICR7anNvblNjaGVtYVRvVHModmFsdWUsIGluZGVudCArIDEpfWA7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBge1xcbiR7cHJvcHMuam9pbihcIjtcXG5cIil9O1xcbiR7Y2xvc2VQYWR9fWA7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ29udGV4dFR5cGVTdHJpbmcodG9vbHM6IFRvb2xTZXQpOiBzdHJpbmcge1xuICBjb25zdCBzaWdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW25hbWUsIHRdIG9mIE9iamVjdC5lbnRyaWVzKHRvb2xzKSkge1xuICAgIGNvbnN0IHJhdyA9IHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgaW5wdXRTY2hlbWEgPSBleHRyYWN0SnNvblNjaGVtYShyYXcuaW5wdXRTY2hlbWEgPz8gcmF3LnBhcmFtZXRlcnMpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGV4dHJhY3RKc29uU2NoZW1hKHJhdy5vdXRwdXRTY2hlbWEpO1xuXG4gICAgY29uc3QgaW5wdXRUeXBlID0gaW5wdXRTY2hlbWEgPyBqc29uU2NoZW1hVG9UcyhpbnB1dFNjaGVtYSwgMikgOiBcInt9XCI7XG4gICAgY29uc3Qgb3V0cHV0VHlwZSA9IG91dHB1dFNjaGVtYVxuICAgICAgPyBqc29uU2NoZW1hVG9UcyhvdXRwdXRTY2hlbWEsIDIpXG4gICAgICA6IFwidW5rbm93blwiO1xuXG4gICAgc2lncy5wdXNoKGAgICAgJHtuYW1lfShpbnB1dDogJHtpbnB1dFR5cGV9KTogUHJvbWlzZTwke291dHB1dFR5cGV9PmApO1xuICB9XG5cbiAgcmV0dXJuIGB0eXBlIENvbnRleHQgPSB7XFxuICB0b29sczoge1xcbiR7c2lncy5qb2luKFwiO1xcblwiKX07XFxuICB9XFxufWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVJblNhbmRib3goe1xuICBjb2RlLFxuICBycGNEaXIsXG4gIGFib3J0Q29udHJvbGxlcixcbiAgc2FuZGJveCxcbiAgYXZhaWxhYmxlVG9vbHMsXG4gIG9uU3ViVG9vbENhbGwsXG59OiB7XG4gIGNvZGU6IHN0cmluZztcbiAgcnBjRGlyOiBzdHJpbmc7XG4gIGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuICBzYW5kYm94OiBTYW5kYm94SW5zdGFuY2U7XG4gIGF2YWlsYWJsZVRvb2xzOiBUb29sU2V0O1xuICBvblN1YlRvb2xDYWxsPzogT25TdWJUb29sQ2FsbDtcbn0pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IG1rZGlyUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcIm1rZGlyXCIsXG4gICAgYXJnczogW1wiLXBcIiwgcnBjRGlyXSxcbiAgfSk7XG4gIGlmIChta2RpclJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBta2RpclJlc3VsdC5tZXNzYWdlIH07XG4gIH1cbiAgYXdhaXQgbWtkaXJSZXN1bHQucmVzdWx0O1xuXG4gIGF3YWl0IHNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgZmlsZXM6IFtcbiAgICAgIHsgcGF0aDogXCJydW5uZXIubWpzXCIsIGNvbnRlbnQ6IFJVTk5FUl9TQ1JJUFQgfSxcbiAgICAgIHsgcGF0aDogXCJjb2RlLmpzXCIsIGNvbnRlbnQ6IGNvZGUgfSxcbiAgICAgIHtcbiAgICAgICAgcGF0aDogXCJ0b29scy5qc29uXCIsXG4gICAgICAgIGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGF2YWlsYWJsZVRvb2xzKSksXG4gICAgICB9LFxuICAgIF0sXG4gICAgZGVzdFBhdGg6IHJwY0RpcixcbiAgfSk7XG5cbiAgY29uc3Qgbm9kZU1ham9yID0gTnVtYmVyLnBhcnNlSW50KHByb2Nlc3MudmVyc2lvbnMubm9kZS5zcGxpdChcIi5cIilbMF0sIDEwKTtcbiAgY29uc3QgcGVybWlzc2lvbkZsYWcgPVxuICAgIG5vZGVNYWpvciA+PSAyMiA/IFwiLS1wZXJtaXNzaW9uXCIgOiBcIi0tZXhwZXJpbWVudGFsLXBlcm1pc3Npb25cIjtcblxuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcIm5vZGVcIixcbiAgICBhcmdzOiBbXG4gICAgICBwZXJtaXNzaW9uRmxhZyxcbiAgICAgIGAtLWFsbG93LWZzLXJlYWQ9JHtycGNEaXJ9YCxcbiAgICAgIGAtLWFsbG93LWZzLXdyaXRlPSR7cnBjRGlyfWAsXG4gICAgICBgJHtycGNEaXJ9L3J1bm5lci5tanNgLFxuICAgIF0sXG4gICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICB9KTtcblxuICBpZiAoZXhlY1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBleGVjUmVzdWx0Lm1lc3NhZ2UgfTtcbiAgfVxuXG4gIGNvbnN0IGZhdGFsOiB7IGVycm9yOiBFcnJvciB8IG51bGwgfSA9IHsgZXJyb3I6IG51bGwgfTtcblxuICBjb25zdCBhYm9ydCA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBpZiAoIWZhdGFsLmVycm9yKSB7XG4gICAgICBmYXRhbC5lcnJvciA9IGVycm9yO1xuICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVRvb2xSZXF1ZXN0ID0gYXN5bmMgKHJlcXVlc3RKc29uOiBzdHJpbmcpID0+IHtcbiAgICBsZXQgcGFyc2VkOiB7IGlkOiBzdHJpbmc7IHRvb2w6IHN0cmluZzsgaW5wdXQ6IHVua25vd24gfTtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShyZXF1ZXN0SnNvbik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBpZCwgdG9vbDogdG9vbE5hbWUsIGlucHV0IH0gPSBwYXJzZWQ7XG5cbiAgICBsZXQgcmVzcG9uc2U6IHsgcmVzdWx0PzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdCA9IGF2YWlsYWJsZVRvb2xzW3Rvb2xOYW1lXTtcbiAgICAgIGlmICghdD8uZXhlY3V0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRvb2wgJHt0b29sTmFtZX0gbm90IGZvdW5kIG9yIGhhcyBubyBleGVjdXRlIGZ1bmN0aW9uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhlYyA9IHQuZXhlY3V0ZS5iaW5kKHQpO1xuICAgICAgaWYgKG9uU3ViVG9vbENhbGwpIHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBvblN1YlRvb2xDYWxsKHRvb2xOYW1lLCBpbnB1dCwgKCkgPT5cbiAgICAgICAgICBleGVjKGlucHV0LCB7XG4gICAgICAgICAgICB0b29sQ2FsbElkOiBganNfJHt0b29sTmFtZX1fJHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICBtZXNzYWdlczogW10sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWMoaW5wdXQsIHtcbiAgICAgICAgICB0b29sQ2FsbElkOiBganNfJHt0b29sTmFtZX1fJHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgbWVzc2FnZXM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzcG9uc2UgPSB7IHJlc3VsdCB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgcmVzcG9uc2UgPSB7IGVycm9yOiBtc2cgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2FuZGJveC53cml0ZUZpbGVzKHtcbiAgICAgICAgZmlsZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXRoOiBgJHtpZH0ucmVzcG9uc2UuanNvbmAsXG4gICAgICAgICAgICBjb250ZW50OiBKU09OLnN0cmluZ2lmeShyZXNwb25zZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZGVzdFBhdGg6IHJwY0RpcixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyoqXG4gICAgICAgKiBJZiB3cml0aW5nIHRoZSByZXNwb25zZSBmaWxlIGZhaWxzLCB0aGUgcnVubmVyIHdpbGwgcG9sbCBmb3JldmVyXG4gICAgICAgKiB3YWl0aW5nIGZvciBpdC4gQWJvcnQgdGhlIHJ1bm5lciBwcm9jZXNzIHNvIHdlIGRvbid0IGRlYWRsb2NrLlxuICAgICAgICovXG4gICAgICBjb25zdCBtc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICBhYm9ydChuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSBSUEMgcmVzcG9uc2UgZm9yICR7dG9vbE5hbWV9OiAke21zZ31gKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHRvb2xDYWxsUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBsZXQgc3RkZXJyQnVmZmVyID0gXCJcIjtcbiAgbGV0IG5vbk1hcmtlclN0ZGVyciA9IFwiXCI7XG5cbiAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGFib3J0KFxuICAgICAgbmV3IEVycm9yKFxuICAgICAgICBgSmF2YVNjcmlwdCBleGVjdXRpb24gdGltZWQgb3V0IGFmdGVyICR7RVhFQ1VUSU9OX1RJTUVPVVRfTVMgLyAxMDAwfXNgXG4gICAgICApXG4gICAgKTtcbiAgfSwgRVhFQ1VUSU9OX1RJTUVPVVRfTVMpO1xuXG4gIHRyeSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCBlbnRyeSBvZiBleGVjUmVzdWx0LmxvZ3MoKSkge1xuICAgICAgaWYgKGZhdGFsLmVycm9yKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW50cnkuc3RyZWFtID09PSBcInN0ZGVyclwiKSB7XG4gICAgICAgIHN0ZGVyckJ1ZmZlciArPSBlbnRyeS5kYXRhO1xuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBzdGRlcnJCdWZmZXIuaW5kZXhPZihSRVFVRVNUX01BUktFUl9TVEFSVCk7XG4gICAgICAgICAgaWYgKHN0YXJ0SWR4ID09PSAtMSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlTWFya2VyID0gc3RkZXJyQnVmZmVyLnNsaWNlKDAsIHN0YXJ0SWR4KTtcbiAgICAgICAgICBpZiAoYmVmb3JlTWFya2VyLnRyaW0oKSkge1xuICAgICAgICAgICAgbm9uTWFya2VyU3RkZXJyICs9IGJlZm9yZU1hcmtlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb250ZW50U3RhcnQgPSBzdGFydElkeCArIFJFUVVFU1RfTUFSS0VSX1NUQVJULmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSBzdGRlcnJCdWZmZXIuaW5kZXhPZihSRVFVRVNUX01BUktFUl9FTkQsIGNvbnRlbnRTdGFydCk7XG4gICAgICAgICAgaWYgKGVuZElkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlcXVlc3RKc29uID0gc3RkZXJyQnVmZmVyLnNsaWNlKGNvbnRlbnRTdGFydCwgZW5kSWR4KTtcbiAgICAgICAgICBzdGRlcnJCdWZmZXIgPSBzdGRlcnJCdWZmZXIuc2xpY2UoZW5kSWR4ICsgUkVRVUVTVF9NQVJLRVJfRU5ELmxlbmd0aCk7XG5cbiAgICAgICAgICB0b29sQ2FsbFByb21pc2VzLnB1c2goaGFuZGxlVG9vbFJlcXVlc3QocmVxdWVzdEpzb24pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIH1cblxuICBpZiAoc3RkZXJyQnVmZmVyLnRyaW0oKSkge1xuICAgIG5vbk1hcmtlclN0ZGVyciArPSBzdGRlcnJCdWZmZXI7XG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodG9vbENhbGxQcm9taXNlcyk7XG5cbiAgaWYgKGZhdGFsLmVycm9yKSB7XG4gICAgZXhlY1Jlc3VsdC5yZXN1bHQuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBlcnJvcjogZmF0YWwuZXJyb3IubWVzc2FnZSxcbiAgICAgIC4uLihub25NYXJrZXJTdGRlcnIgPyB7IHN0ZGVycjogbm9uTWFya2VyU3RkZXJyLnNsaWNlKDAsIDIwMDApIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHN0ZG91dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yOiBgUnVubmVyIGZhaWxlZCAoZXhpdCAke2V4aXRDb2RlfSkuYCxcbiAgICAgIHN0ZGVycjogKG5vbk1hcmtlclN0ZGVyciArIHN0ZGVycikuc2xpY2UoMCwgMjAwMCksXG4gICAgICBzdGRvdXQ6IHN0ZG91dC5zbGljZSgwLCAxMDAwKSxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVKYXZhU2NyaXB0VG9vbChvcHRzOiB7XG4gIHRvb2xzOiBUb29sU2V0O1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBzYW5kYm94OiBTYW5kYm94SW5zdGFuY2U7XG4gIG9uU3ViVG9vbENhbGw/OiBPblN1YlRvb2xDYWxsO1xufSkge1xuICBjb25zdCB7IHNlc3Npb24sIHNhbmRib3gsIG9uU3ViVG9vbENhbGwgfSA9IG9wdHM7XG4gIGNvbnN0IGFjdGl2ZVNldCA9IHNlc3Npb24uYWN0aXZlVG9vbHMgPyBuZXcgU2V0KHNlc3Npb24uYWN0aXZlVG9vbHMpIDogbnVsbDtcbiAgY29uc3QgYXZhaWxhYmxlVG9vbHM6IFRvb2xTZXQgPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdF0gb2YgT2JqZWN0LmVudHJpZXMob3B0cy50b29scykpIHtcbiAgICBpZiAoIWFjdGl2ZVNldCB8fCBhY3RpdmVTZXQuaGFzKG5hbWUpKSB7XG4gICAgICBhdmFpbGFibGVUb29sc1tuYW1lXSA9IHQ7XG4gICAgfVxuICB9XG4gIGNvbnN0IGNvbnRleHRUeXBlID0gZ2VuZXJhdGVDb250ZXh0VHlwZVN0cmluZyhhdmFpbGFibGVUb29scyk7XG5cbiAgcmV0dXJuIHRvb2woe1xuICAgIC4uLmJ1aWx0SW5Ub29scy5KYXZhU2NyaXB0LFxuICAgIGRlc2NyaXB0aW9uOiBgRXhlY3V0ZSBKYXZhU2NyaXB0IHRvIG9yY2hlc3RyYXRlIG11bHRpcGxlIHRvb2wgY2FsbHMgaW4gYSBzaW5nbGUgc3RlcC4gVXNlIHRoaXMgd2hlbiB5b3UgbmVlZCB0byBydW4gc2V2ZXJhbCB0b29scyBpbiBzZXF1ZW5jZSwgdHJhbnNmb3JtIGludGVybWVkaWF0ZSByZXN1bHRzLCBvciBwYXJhbGxlbGl6ZSBpbmRlcGVuZGVudCBvcGVyYXRpb25zIHdpdGggUHJvbWlzZS5hbGwuXG5cblRoZSBjb2RlIHJ1bnMgYXMgYW4gYXN5bmMgZnVuY3Rpb24gYm9keSB3aXRoIFxcYGN0eFxcYCBpbiBzY29wZTpcblxuXFxgXFxgXFxgdHlwZXNjcmlwdFxuJHtjb250ZXh0VHlwZX1cblxcYFxcYFxcYFxuXG5FeGFtcGxlczpcbi0gU2VxdWVudGlhbDogXFxgY29uc3QgZmlsZSA9IGF3YWl0IGN0eC50b29scy5SZWFkKHsgcGF0aDogXCJwYWNrYWdlLmpzb25cIiB9KTsgcmV0dXJuIEpTT04ucGFyc2UoZmlsZS5jb250ZW50KTtcXGBcbi0gUGFyYWxsZWw6IFxcYGNvbnN0IFthLCBiXSA9IGF3YWl0IFByb21pc2UuYWxsKFtjdHgudG9vbHMuUmVhZCh7IHBhdGg6IFwiYS50c1wiIH0pLCBjdHgudG9vbHMuUmVhZCh7IHBhdGg6IFwiYi50c1wiIH0pXSk7IHJldHVybiB7IGE6IGEuY29udGVudCwgYjogYi5jb250ZW50IH07XFxgXG4tIFRyYW5zZm9ybTogXFxgY29uc3QgZ3JlcCA9IGF3YWl0IGN0eC50b29scy5HcmVwKHsgcGF0dGVybjogXCJUT0RPXCIgfSk7IHJldHVybiBncmVwLm1hdGNoZXMuc3BsaXQoXCJcXFxcblwiKS5sZW5ndGg7XFxgXG4tIEJhc2g6IFxcYGNvbnN0IHIgPSBhd2FpdCBjdHgudG9vbHMuQmFzaCh7IGNvbW1hbmQ6IFwibm9kZSAtZSBcXFxcXCJjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7djoxfSkpXFxcXFwiXCIgfSk7IHJldHVybiBKU09OLnBhcnNlKHIuc3Rkb3V0KTtcXGBcblxuUmV0dXJuIGEgdmFsdWUgdG8gcGFzcyByZXN1bHRzIGJhY2suIFVzZSBjb25zb2xlLmxvZygpIGZvciBkZWJ1ZyBvdXRwdXQuXG5JbXBvcnRhbnQ6IEVhY2ggdG9vbCByZXR1cm5zIGEgc3RydWN0dXJlZCBvYmplY3QgbWF0Y2hpbmcgaXRzIG91dHB1dCBzY2hlbWEgXHUyMDE0IG5vdCBhIHJhdyBzdHJpbmcuIEFjY2VzcyB0aGUgc3BlY2lmaWMgZmllbGQgeW91IG5lZWQgKGUuZy4gQmFzaCdzIHJlc3VsdC5zdGRvdXQsIFJlYWQncyByZXN1bHQuY29udGVudCkgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIHBhcnNlIHRoZSBlbnRpcmUgcmVzdWx0LmAsXG4gICAgZXhlY3V0ZTogKHsgY29kZSB9KSA9PiB7XG4gICAgICBjb25zdCBydW5JZCA9IGBydW5fJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKClcbiAgICAgICAgLnRvU3RyaW5nKDM2KVxuICAgICAgICAuc2xpY2UoMiwgOCl9YDtcbiAgICAgIGNvbnN0IHJwY0RpciA9IGAuYWdlbnQvanMtcnBjLyR7cnVuSWR9YDtcbiAgICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgICAgcmV0dXJuIGV4ZWN1dGVJblNhbmRib3goe1xuICAgICAgICBjb2RlLFxuICAgICAgICBycGNEaXIsXG4gICAgICAgIGFib3J0Q29udHJvbGxlcixcbiAgICAgICAgc2FuZGJveCxcbiAgICAgICAgYXZhaWxhYmxlVG9vbHMsXG4gICAgICAgIG9uU3ViVG9vbENhbGwsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFRvb2wgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB0eXBlIHsgQW55QWdlbnQgfSBmcm9tIFwiLi4vYWdlbnQvY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IEJ1aWx0SW5Ub29sTmFtZSB9IGZyb20gXCIuL2luZGV4XCI7XG5cbi8qKiBCdWlsdC1pbiBkZWZhdWx0cyBmb3IgbmVlZHNBcHByb3ZhbCAodXNlciBjYW4gb3ZlcnJpZGUgdmlhIGFnZW50IGNvbmZpZykuICovXG5jb25zdCBidWlsdGluTmVlZHNBcHByb3ZhbDogUGFydGlhbDxSZWNvcmQ8QnVpbHRJblRvb2xOYW1lLCBib29sZWFuPj4gPSB7fTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrTmVlZHNBcHByb3ZhbCh7XG4gIGFnZW50LFxuICB0b29sTmFtZSxcbiAgaW5wdXQsXG4gIHRvb2xDYWxsSWQsXG4gIG1lc3NhZ2VzLFxufToge1xuICBhZ2VudDogQW55QWdlbnQ7XG4gIHRvb2xOYW1lOiBzdHJpbmc7XG4gIGlucHV0OiB1bmtub3duO1xuICB0b29sQ2FsbElkOiBzdHJpbmc7XG4gIG1lc3NhZ2VzOiB1bmtub3duW107XG59KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIDEuIFBlci10b29sIG5lZWRzQXBwcm92YWwgb24gdGhlIFRvb2wgZGVmaW5pdGlvbiB0YWtlcyBwcmlvcml0eVxuICBjb25zdCB0b29sRGVmID0gYWdlbnQub3B0aW9ucy50b29scz8uW3Rvb2xOYW1lXSBhcyBUb29sIHwgdW5kZWZpbmVkO1xuICBpZiAodG9vbERlZj8ubmVlZHNBcHByb3ZhbCAhPSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiB0b29sRGVmLm5lZWRzQXBwcm92YWwgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gdG9vbERlZi5uZWVkc0FwcHJvdmFsO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdG9vbERlZi5uZWVkc0FwcHJvdmFsKGlucHV0LCB7XG4gICAgICB0b29sQ2FsbElkLFxuICAgICAgbWVzc2FnZXM6IG1lc3NhZ2VzIGFzIG5ldmVyW10sXG4gICAgICBleHBlcmltZW50YWxfY29udGV4dDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gMi4gQWdlbnQtbGV2ZWwgbmVlZHNBcHByb3ZhbCBtYXBcbiAgY29uc3QgYWdlbnRFbnRyeSA9IChcbiAgICBhZ2VudC5vcHRpb25zLm5lZWRzQXBwcm92YWwgYXNcbiAgICAgIHwgUmVjb3JkPFxuICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICBib29sZWFuIHwgKCguLi5hcmdzOiB1bmtub3duW10pID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KVxuICAgICAgICA+XG4gICAgICB8IHVuZGVmaW5lZFxuICApPy5bdG9vbE5hbWVdO1xuXG4gIGlmIChhZ2VudEVudHJ5ICE9IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIGFnZW50RW50cnkgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gYWdlbnRFbnRyeTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGFnZW50RW50cnkoaW5wdXQsIHtcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgICBtZXNzYWdlcyxcbiAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH1cblxuICAvLyAzLiBCdWlsdC1pbiBkZWZhdWx0c1xuICByZXR1cm4gYnVpbHRpbk5lZWRzQXBwcm92YWxbdG9vbE5hbWUgYXMgQnVpbHRJblRvb2xOYW1lXSA/PyBmYWxzZTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEpTT05WYWx1ZSwgTW9kZWxNZXNzYWdlIH0gZnJvbSBcImFpXCI7XG5cbnR5cGUgUHJvdmlkZXJPcHRpb25zID0gUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgSlNPTlZhbHVlPj47XG5cbmNvbnN0IEFOVEhST1BJQ19NQVhfQ0FDSEVfQlJFQUtQT0lOVFNfUEVSX1JFUVVFU1QgPSA0O1xuXG5jb25zdCBDTEFVREVfTElLRV9NT0RFTF9NQVRDSEVSUyA9IFtcImNsYXVkZVwiLCBcImFudGhyb3BpY1wiXTtcblxuY29uc3QgQ0xBVURFX1BST01QVF9DQUNISU5HX1BST1ZJREVSX09QVElPTlM6IFByb3ZpZGVyT3B0aW9ucyA9IHtcbiAgYW50aHJvcGljOiB7XG4gICAgY2FjaGVDb250cm9sOiB7IHR5cGU6IFwiZXBoZW1lcmFsXCIgfSxcbiAgfSxcbiAgb3BlbnJvdXRlcjoge1xuICAgIGNhY2hlQ29udHJvbDogeyB0eXBlOiBcImVwaGVtZXJhbFwiIH0sXG4gIH0sXG4gIGJlZHJvY2s6IHtcbiAgICBjYWNoZVBvaW50OiB7IHR5cGU6IFwiZGVmYXVsdFwiIH0sXG4gIH0sXG4gIG9wZW5haUNvbXBhdGlibGU6IHtcbiAgICBjYWNoZV9jb250cm9sOiB7IHR5cGU6IFwiZXBoZW1lcmFsXCIgfSxcbiAgfSxcbiAgY29waWxvdDoge1xuICAgIGNvcGlsb3RfY2FjaGVfY29udHJvbDogeyB0eXBlOiBcImVwaGVtZXJhbFwiIH0sXG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRHYXRld2F5UHJvdmlkZXIobW9kZWw6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBzbGFzaEluZGV4ID0gbW9kZWwuaW5kZXhPZihcIi9cIik7XG4gIGlmIChzbGFzaEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBtb2RlbC5zbGljZSgwLCBzbGFzaEluZGV4KTtcbn1cblxuZnVuY3Rpb24gY291bnRBbnRocm9waWNDYWNoZUJyZWFrcG9pbnRzKG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXSk6IG51bWJlciB7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgIGNvbnN0IHByb3ZpZGVyT3B0aW9ucyA9IChtZXNzYWdlIGFzIHsgcHJvdmlkZXJPcHRpb25zPzogUHJvdmlkZXJPcHRpb25zIH0pXG4gICAgICAucHJvdmlkZXJPcHRpb25zO1xuICAgIGlmIChwcm92aWRlck9wdGlvbnM/LmFudGhyb3BpYz8uY2FjaGVDb250cm9sKSB7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpKSB7XG4gICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgbWVzc2FnZS5jb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHBhcnRQcm92aWRlck9wdGlvbnMgPSAoXG4gICAgICAgICAgcGFydCBhcyB7IHByb3ZpZGVyT3B0aW9ucz86IFByb3ZpZGVyT3B0aW9ucyB9XG4gICAgICAgICkucHJvdmlkZXJPcHRpb25zO1xuICAgICAgICBpZiAocGFydFByb3ZpZGVyT3B0aW9ucz8uYW50aHJvcGljPy5jYWNoZUNvbnRyb2wpIHtcbiAgICAgICAgICBjb3VudCArPSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBjb3VudDtcbn1cblxuZnVuY3Rpb24gaXNDbGF1ZGVMaWtlTW9kZWwobW9kZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBsb3dlciA9IG1vZGVsLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBDTEFVREVfTElLRV9NT0RFTF9NQVRDSEVSUy5zb21lKChtKSA9PiBsb3dlci5pbmNsdWRlcyhtKSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUHJvdmlkZXJPcHRpb25zKG9wdHM6IHtcbiAgY3VycmVudDogUHJvdmlkZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBwYXRjaDogUHJvdmlkZXJPcHRpb25zO1xufSk6IFByb3ZpZGVyT3B0aW9ucyB7XG4gIGNvbnN0IG5leHQ6IFByb3ZpZGVyT3B0aW9ucyA9IHsgLi4uKG9wdHMuY3VycmVudCA/PyB7fSkgfTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3B0cy5wYXRjaCkpIHtcbiAgICBuZXh0W2tleV0gPSB7IC4uLihuZXh0W2tleV0gPz8ge30pLCAuLi52YWx1ZSB9O1xuICB9XG4gIHJldHVybiBuZXh0O1xufVxuXG5mdW5jdGlvbiBpc0NhY2hlYWJsZUNsYXVkZVBhcnQocGFydDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIXBhcnQgfHwgdHlwZW9mIHBhcnQgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXCJ0eXBlXCIgaW4gcGFydCAmJiAocGFydCBhcyB7IHR5cGU/OiB1bmtub3duIH0pLnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgY29uc3QgdGV4dCA9IChwYXJ0IGFzIHsgdGV4dD86IHVua25vd24gfSkudGV4dDtcbiAgICBpZiAodHlwZW9mIHRleHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcInR5cGVcIiBpbiBwYXJ0KSB7XG4gICAgY29uc3QgdHlwZSA9IChwYXJ0IGFzIHsgdHlwZT86IHVua25vd24gfSkudHlwZTtcbiAgICBpZiAodHlwZSA9PT0gXCJ0aGlua2luZ1wiIHx8IHR5cGUgPT09IFwicmVhc29uaW5nXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaGFzQ2FjaGVhYmxlQ29udGVudChtZXNzYWdlOiBNb2RlbE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gbWVzc2FnZS5jb250ZW50LnRyaW0oKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSkge1xuICAgIHJldHVybiBtZXNzYWdlLmNvbnRlbnQuc29tZSgocGFydCkgPT4gaXNDYWNoZWFibGVDbGF1ZGVQYXJ0KHBhcnQpKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZmluZExhc3RDYWNoZWFibGVQYXJ0SW5kZXgoY29udGVudDogdW5rbm93bltdKTogbnVtYmVyIHwgbnVsbCB7XG4gIGZvciAobGV0IGkgPSBjb250ZW50Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgaWYgKGlzQ2FjaGVhYmxlQ2xhdWRlUGFydChjb250ZW50W2ldKSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RDbGF1ZGVDYWNoaW5nVGFyZ2V0cyhtZXNzYWdlczogTW9kZWxNZXNzYWdlW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHN5c3RlbUluZGljZXM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGZpbmFsSW5kaWNlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG1lc3NhZ2VzLmxlbmd0aCAmJiBzeXN0ZW1JbmRpY2VzLmxlbmd0aCA8IDI7IGkgKz0gMSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTtcbiAgICBpZiAobWVzc2FnZS5yb2xlID09PSBcInN5c3RlbVwiICYmIGhhc0NhY2hlYWJsZUNvbnRlbnQobWVzc2FnZSkpIHtcbiAgICAgIHN5c3RlbUluZGljZXMucHVzaChpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGxldCBpID0gbWVzc2FnZXMubGVuZ3RoIC0gMTsgaSA+PSAwICYmIGZpbmFsSW5kaWNlcy5sZW5ndGggPCAyOyBpIC09IDEpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbaV07XG4gICAgaWYgKG1lc3NhZ2Uucm9sZSAhPT0gXCJzeXN0ZW1cIiAmJiBoYXNDYWNoZWFibGVDb250ZW50KG1lc3NhZ2UpKSB7XG4gICAgICBmaW5hbEluZGljZXMucHVzaChpKTtcbiAgICB9XG4gIH1cblxuICBmaW5hbEluZGljZXMucmV2ZXJzZSgpO1xuXG4gIHJldHVybiBbLi4uc3lzdGVtSW5kaWNlcywgLi4uZmluYWxJbmRpY2VzXTtcbn1cblxuZnVuY3Rpb24gYXBwbHlDbGF1ZGVQcm9tcHRDYWNoaW5nKG9wdHM6IHtcbiAgbWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdO1xuICBwcm92aWRlcklkOiBzdHJpbmcgfCBudWxsO1xuICBtYXhCcmVha3BvaW50c1BlclJlcXVlc3Q6IG51bWJlcjtcbn0pOiBNb2RlbE1lc3NhZ2VbXSB7XG4gIGNvbnN0IGV4aXN0aW5nQnJlYWtwb2ludHMgPSBjb3VudEFudGhyb3BpY0NhY2hlQnJlYWtwb2ludHMob3B0cy5tZXNzYWdlcyk7XG4gIGNvbnN0IHJlbWFpbmluZ0J1ZGdldCA9IE1hdGgubWF4KFxuICAgIDAsXG4gICAgb3B0cy5tYXhCcmVha3BvaW50c1BlclJlcXVlc3QgLSBleGlzdGluZ0JyZWFrcG9pbnRzXG4gICk7XG5cbiAgaWYgKHJlbWFpbmluZ0J1ZGdldCA9PT0gMCkge1xuICAgIHJldHVybiBvcHRzLm1lc3NhZ2VzO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0SW5kaWNlcyA9IHNlbGVjdENsYXVkZUNhY2hpbmdUYXJnZXRzKG9wdHMubWVzc2FnZXMpLnNsaWNlKFxuICAgIDAsXG4gICAgcmVtYWluaW5nQnVkZ2V0XG4gICk7XG4gIGlmICh0YXJnZXRJbmRpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvcHRzLm1lc3NhZ2VzO1xuICB9XG5cbiAgY29uc3QgdXNlTWVzc2FnZUxldmVsT3B0aW9ucyA9XG4gICAgb3B0cy5wcm92aWRlcklkID09PSBcImFudGhyb3BpY1wiIHx8XG4gICAgQm9vbGVhbihvcHRzLnByb3ZpZGVySWQ/LmluY2x1ZGVzKFwiYmVkcm9ja1wiKSk7XG5cbiAgY29uc3QgbmV4dE1lc3NhZ2VzID0gb3B0cy5tZXNzYWdlcy5zbGljZSgpO1xuXG4gIGZvciAoY29uc3QgbWVzc2FnZUluZGV4IG9mIHRhcmdldEluZGljZXMpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gbmV4dE1lc3NhZ2VzW21lc3NhZ2VJbmRleF07XG5cbiAgICBjb25zdCBzaG91bGRVc2VDb250ZW50T3B0aW9ucyA9XG4gICAgICAhdXNlTWVzc2FnZUxldmVsT3B0aW9ucyAmJlxuICAgICAgQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpICYmXG4gICAgICBtZXNzYWdlLmNvbnRlbnQubGVuZ3RoID4gMDtcblxuICAgIGlmIChzaG91bGRVc2VDb250ZW50T3B0aW9ucyAmJiBBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkpIHtcbiAgICAgIGNvbnN0IHBhcnRJbmRleCA9IGZpbmRMYXN0Q2FjaGVhYmxlUGFydEluZGV4KG1lc3NhZ2UuY29udGVudCk7XG4gICAgICBpZiAocGFydEluZGV4ICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHBhcnQgPSBtZXNzYWdlLmNvbnRlbnRbcGFydEluZGV4XTtcbiAgICAgICAgaWYgKHBhcnQgJiYgdHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBjb25zdCBwYXJ0UHJvdmlkZXJPcHRpb25zID0gKFxuICAgICAgICAgICAgcGFydCBhcyB7IHByb3ZpZGVyT3B0aW9ucz86IFByb3ZpZGVyT3B0aW9ucyB9XG4gICAgICAgICAgKS5wcm92aWRlck9wdGlvbnM7XG5cbiAgICAgICAgICBjb25zdCBuZXh0Q29udGVudCA9IG1lc3NhZ2UuY29udGVudC5zbGljZSgpO1xuICAgICAgICAgIG5leHRDb250ZW50W3BhcnRJbmRleF0gPSB7XG4gICAgICAgICAgICAuLi4ocGFydCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksXG4gICAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IG1lcmdlUHJvdmlkZXJPcHRpb25zKHtcbiAgICAgICAgICAgICAgY3VycmVudDogcGFydFByb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgcGF0Y2g6IENMQVVERV9QUk9NUFRfQ0FDSElOR19QUk9WSURFUl9PUFRJT05TLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSBhcyAodHlwZW9mIG1lc3NhZ2UuY29udGVudClbbnVtYmVyXTtcblxuICAgICAgICAgIG5leHRNZXNzYWdlc1ttZXNzYWdlSW5kZXhdID0ge1xuICAgICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IG5leHRDb250ZW50LFxuICAgICAgICAgIH0gYXMgTW9kZWxNZXNzYWdlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZVByb3ZpZGVyT3B0aW9ucyA9IChcbiAgICAgIG1lc3NhZ2UgYXMgeyBwcm92aWRlck9wdGlvbnM/OiBQcm92aWRlck9wdGlvbnMgfVxuICAgICkucHJvdmlkZXJPcHRpb25zO1xuXG4gICAgbmV4dE1lc3NhZ2VzW21lc3NhZ2VJbmRleF0gPSB7XG4gICAgICAuLi5tZXNzYWdlLFxuICAgICAgcHJvdmlkZXJPcHRpb25zOiBtZXJnZVByb3ZpZGVyT3B0aW9ucyh7XG4gICAgICAgIGN1cnJlbnQ6IG1lc3NhZ2VQcm92aWRlck9wdGlvbnMsXG4gICAgICAgIHBhdGNoOiBDTEFVREVfUFJPTVBUX0NBQ0hJTkdfUFJPVklERVJfT1BUSU9OUyxcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gbmV4dE1lc3NhZ2VzO1xufVxuXG5leHBvcnQgdHlwZSBQcm9tcHRDYWNoaW5nUmVzdWx0ID0ge1xuICBtZXNzYWdlczogTW9kZWxNZXNzYWdlW107XG4gIHByb3ZpZGVyT3B0aW9uczogUHJvdmlkZXJPcHRpb25zO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UHJvbXB0Q2FjaGluZ1RvTW9kZWxSZXF1ZXN0KG9wdHM6IHtcbiAgbW9kZWw6IHN0cmluZztcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXTtcbiAgYW50aHJvcGljPzogeyBtYXhCcmVha3BvaW50c1BlclJlcXVlc3Q/OiBudW1iZXIgfTtcbiAgb3BlbmFpPzogeyBzZXRQcm9tcHRDYWNoZUtleT86IGJvb2xlYW4gfTtcbn0pOiBQcm9tcHRDYWNoaW5nUmVzdWx0IHtcbiAgY29uc3QgcHJvdmlkZXIgPSBnZXRHYXRld2F5UHJvdmlkZXIob3B0cy5tb2RlbCk7XG5cbiAgY29uc3QgcHJvdmlkZXJPcHRpb25zOiBQcm92aWRlck9wdGlvbnMgPSB7fTtcblxuICBpZiAoXG4gICAgKHByb3ZpZGVyID09PSBcIm9wZW5haVwiIHx8IHByb3ZpZGVyID09PSBcImF6dXJlXCIpICYmXG4gICAgb3B0cy5vcGVuYWk/LnNldFByb21wdENhY2hlS2V5ICE9PSBmYWxzZVxuICApIHtcbiAgICBwcm92aWRlck9wdGlvbnMub3BlbmFpID0geyBwcm9tcHRDYWNoZUtleTogb3B0cy5zZXNzaW9uSWQgfTtcbiAgfVxuXG4gIGNvbnN0IG1heEJyZWFrcG9pbnRzUGVyUmVxdWVzdCA9XG4gICAgb3B0cy5hbnRocm9waWM/Lm1heEJyZWFrcG9pbnRzUGVyUmVxdWVzdCA/P1xuICAgIEFOVEhST1BJQ19NQVhfQ0FDSEVfQlJFQUtQT0lOVFNfUEVSX1JFUVVFU1Q7XG5cbiAgY29uc3QgY2FjaGVkTWVzc2FnZXMgPSBpc0NsYXVkZUxpa2VNb2RlbChvcHRzLm1vZGVsKVxuICAgID8gYXBwbHlDbGF1ZGVQcm9tcHRDYWNoaW5nKHtcbiAgICAgICAgbWVzc2FnZXM6IG9wdHMubWVzc2FnZXMsXG4gICAgICAgIHByb3ZpZGVySWQ6IHByb3ZpZGVyLFxuICAgICAgICBtYXhCcmVha3BvaW50c1BlclJlcXVlc3QsXG4gICAgICB9KVxuICAgIDogb3B0cy5tZXNzYWdlcztcblxuICByZXR1cm4ge1xuICAgIG1lc3NhZ2VzOiBjYWNoZWRNZXNzYWdlcyxcbiAgICBwcm92aWRlck9wdGlvbnMsXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBVSU1lc3NhZ2VDaHVuayB9IGZyb20gXCJhaVwiO1xuaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcbmltcG9ydCB7IFNlc3Npb25Ob3RGb3VuZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXNzaW9uQ29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgZ2V0QWN0aXZlUnVucywgcmVwbGF5QWN0aXZlUnVuIH0gZnJvbSBcIi4vc2VuZFwiO1xuXG5leHBvcnQgdHlwZSBTdHJlYW1PcHRpb25zID0ge1xuICBtZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIHN0YXJ0SW5kZXg/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXb3JrZmxvd1J1bkxpa2UgPSB7XG4gIGdldFJlYWRhYmxlKG9wdGlvbnM/OiB7IHN0YXJ0SW5kZXg/OiBudW1iZXIgfSk6IFJlYWRhYmxlU3RyZWFtO1xufTtcblxuZnVuY3Rpb24gaXNXb3JrZmxvd1J1bihhcmc6IHVua25vd24pOiBhcmcgaXMgV29ya2Zsb3dSdW5MaWtlIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgYXJnID09PSBcIm9iamVjdFwiICYmXG4gICAgYXJnICE9PSBudWxsICYmXG4gICAgXCJnZXRSZWFkYWJsZVwiIGluIGFyZyAmJlxuICAgIHR5cGVvZiAoYXJnIGFzIFdvcmtmbG93UnVuTGlrZSkuZ2V0UmVhZGFibGUgPT09IFwiZnVuY3Rpb25cIlxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RyZWFtKFxuICBzZXNzaW9uQ29udGV4dDogU2Vzc2lvbkNvbnRleHQsXG4gIHJ1bk9yT3B0cz86IFdvcmtmbG93UnVuTGlrZSB8IFN0cmVhbU9wdGlvbnNcbik6IFByb21pc2U8UmVhZGFibGVTdHJlYW08VUlNZXNzYWdlQ2h1bms+PiB7XG4gIGlmIChpc1dvcmtmbG93UnVuKHJ1bk9yT3B0cykpIHtcbiAgICBjb25zdCByZWFkZXIgPSBydW5Pck9wdHMuZ2V0UmVhZGFibGUoKS5nZXRSZWFkZXIoKTtcbiAgICAvLyBhd2FpdCBmb3IgdGhlIGZpcnN0IGNodW5rIHRvIGJlIHJlYWR5IGJlZm9yZSBmaW5pc2hpbmcgdGhlIHdvcmtmbG93IHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uc1xuICAgIGF3YWl0IHJlYWRlci5yZWFkKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IFN0cmVhbUVycm9yKHtcbiAgICAgICAgaWQ6IHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCxcbiAgICAgICAgcmVhc29uOiBcInN0cmVhbSgpIGZhaWxlZCB0byByZWFkIGZpcnN0IGNodW5rIGZyb20gd29ya2Zsb3cgcnVuXCIsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZWFkZXIuY2FuY2VsKCk7XG5cbiAgICByZXR1cm4gcnVuT3JPcHRzLmdldFJlYWRhYmxlKCk7XG4gIH1cblxuICBjb25zdCBvcHRzID0gcnVuT3JPcHRzO1xuICBjb25zdCBzZXNzaW9uID0gYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5zZXNzaW9uLmdldChcbiAgICBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWRcbiAgKTtcbiAgaWYgKCFzZXNzaW9uKSB7XG4gICAgdGhyb3cgbmV3IFNlc3Npb25Ob3RGb3VuZEVycm9yKHsgaWQ6IHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCB9KTtcbiAgfVxuICBjb25zdCBtZXNzYWdlSWQgPSBvcHRzPy5tZXNzYWdlSWQgPz8gc2Vzc2lvbi5sYXN0TWVzc2FnZUlkO1xuICBpZiAoIW1lc3NhZ2VJZCkge1xuICAgIHRocm93IG5ldyBTdHJlYW1FcnJvcih7XG4gICAgICBpZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgcmVhc29uOiBcIk5vIG1lc3NhZ2UgdG8gc3RyZWFtXCIsXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBhY3RpdmVSdW5zID0gZ2V0QWN0aXZlUnVucygpO1xuICBjb25zdCBhY3RpdmUgPSBhY3RpdmVSdW5zLmdldChtZXNzYWdlSWQpO1xuICBpZiAoIWFjdGl2ZSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLm1lc3NhZ2UuZ2V0KG1lc3NhZ2VJZCk7XG4gICAgaWYgKG1lc3NhZ2U/LndvcmtmbG93UnVuSWQpIHtcbiAgICAgIGNvbnN0IHJlYWRhYmxlID0gYXdhaXQgaW1wb3J0KFwid29ya2Zsb3cvYXBpXCIpXG4gICAgICAgIC50aGVuKCh7IGdldFJ1biB9KSA9PiBnZXRSdW4obWVzc2FnZS53b3JrZmxvd1J1bklkISkuZ2V0UmVhZGFibGUoKSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICBpZiAocmVhZGFibGUpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRhYmxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBTdHJlYW1FcnJvcih7XG4gICAgICBpZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgcmVhc29uOiBgTm8gYWN0aXZlIHJ1biBmb3IgbWVzc2FnZSAke21lc3NhZ2VJZH1gLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJlcGxheUFjdGl2ZVJ1bihhY3RpdmUsIG9wdHM/LnN0YXJ0SW5kZXgpO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBFcnJvcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuZXhwb3J0IGNsYXNzIFN0cmVhbUVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTdHJlYW1FcnJvclwiLFxuICBtZXNzYWdlOiBcIlN0cmVhbSBmYWlsZWQgZm9yIHNlc3Npb24gJGlkOiAkcmVhc29uXCIsXG59KSB7fVxuIiwgImltcG9ydCB0eXBlIHsgR2F0ZXdheU1vZGVsSWQsIFRvb2xTZXQgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZVNraWxsc0RpcnMgfSBmcm9tIFwiLi4vc2tpbGxzL3BhcnNlclwiO1xuaW1wb3J0IHR5cGUgeyBTZXNzaW9uIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQnVpbHRJblRvb2xOYW1lIH0gZnJvbSBcIi4uL3Rvb2xzXCI7XG5pbXBvcnQgdHlwZSB7IFNlc3Npb25Db250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5cbmV4cG9ydCB0eXBlIFVwZGF0ZU9wdGlvbnM8VG9vbHMgZXh0ZW5kcyBUb29sU2V0PiA9IFBhcnRpYWw8XG4gIE9taXQ8U2Vzc2lvbiwgXCJpZFwiIHwgXCJhY3RpdmVUb29sc1wiIHwgXCJtb2RlbFwiPiAmIHtcbiAgICBtb2RlbD86IEdhdGV3YXlNb2RlbElkO1xuICAgIGFjdGl2ZVRvb2xzPzogKEV4dHJhY3Q8a2V5b2YgVG9vbHMsIHN0cmluZz4gfCBCdWlsdEluVG9vbE5hbWUpW107XG4gIH1cbj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGU8VG9vbHMgZXh0ZW5kcyBUb29sU2V0PihcbiAgc2Vzc2lvbkNvbnRleHQ6IFNlc3Npb25Db250ZXh0LFxuICBvcHRzOiBVcGRhdGVPcHRpb25zPFRvb2xzPlxuKSB7XG4gIGNvbnN0IHsgc2tpbGxzRGlyLCAuLi5yYXdVcGRhdGVzIH0gPSBvcHRzO1xuICBjb25zdCBub3JtYWxpemVkVXBkYXRlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyh7XG4gICAgICAuLi5yYXdVcGRhdGVzLFxuICAgICAgLi4uKHNraWxsc0RpciAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyBza2lsbHNEaXI6IHNraWxsc0RpciA/IG5vcm1hbGl6ZVNraWxsc0RpcnMoc2tpbGxzRGlyKSA6IG51bGwgfVxuICAgICAgICA6IHt9KSxcbiAgICB9KS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgKTtcblxuICBpZiAoT2JqZWN0LmtleXMobm9ybWFsaXplZFVwZGF0ZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2Uuc2Vzc2lvbi51cGRhdGUoc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLCB7XG4gICAgLi4ubm9ybWFsaXplZFVwZGF0ZXMsXG4gICAgdXBkYXRlZEF0OiBEYXRlLm5vdygpLFxuICB9KTtcbn1cbiIsICJpbXBvcnQgeyBjb21wdXRlU2Vzc2lvblVzYWdlLCB0eXBlIFNlc3Npb25Vc2FnZSB9IGZyb20gXCIuLi91dGlscy91c2FnZVwiO1xuaW1wb3J0IHR5cGUgeyBTZXNzaW9uQ29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXNhZ2UoXG4gIHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dFxuKTogUHJvbWlzZTxTZXNzaW9uVXNhZ2U+IHtcbiAgY29uc3QgbWVzc2FnZXMgPSBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLm1lc3NhZ2UubGlzdEJ5U2Vzc2lvbihcbiAgICBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWRcbiAgKTtcbiAgcmV0dXJuIGNvbXB1dGVTZXNzaW9uVXNhZ2UobWVzc2FnZXMpO1xufVxuIiwgImltcG9ydCB7IFdPUktGTE9XX0RFU0VSSUFMSVpFLCBXT1JLRkxPV19TRVJJQUxJWkUgfSBmcm9tIFwiQHdvcmtmbG93L3NlcmRlXCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2UsIFBhcnQsIFNhbmRib3gsIFNlc3Npb24sIFNldHVwIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFN0b3JhZ2VIYW5kbGVycyAocHVibGljLCBmbGF0KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHR5cGUgU3RvcmFnZUhhbmRsZXJzID0ge1xuICBcInNlc3Npb24uZ2V0XCIocDogeyBpZDogc3RyaW5nIH0pOiBQcm9taXNlPFNlc3Npb24gfCBudWxsPjtcbiAgXCJzZXNzaW9uLnNldFwiKHA6IHsgaWQ6IHN0cmluZzsgdmFsdWU6IFNlc3Npb24gfSk6IFByb21pc2U8dm9pZD47XG4gIFwic2Vzc2lvbi51cGRhdGVcIihwOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB1cGRhdGVzOiBQYXJ0aWFsPFNlc3Npb24+O1xuICB9KTogUHJvbWlzZTxTZXNzaW9uPjtcblxuICBcIm1lc3NhZ2UuZ2V0XCIocDogeyBpZDogc3RyaW5nIH0pOiBQcm9taXNlPE1lc3NhZ2UgfCBudWxsPjtcbiAgXCJtZXNzYWdlLnNldFwiKHA6IHsgaWQ6IHN0cmluZzsgdmFsdWU6IE1lc3NhZ2UgfSk6IFByb21pc2U8dm9pZD47XG4gIFwibWVzc2FnZS51cGRhdGVcIihwOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB1cGRhdGVzOiBQYXJ0aWFsPE1lc3NhZ2U+O1xuICB9KTogUHJvbWlzZTxNZXNzYWdlPjtcbiAgXCJtZXNzYWdlLmxpc3RCeVNlc3Npb25cIihwOiB7IHNlc3Npb25JZDogc3RyaW5nIH0pOiBQcm9taXNlPE1lc3NhZ2VbXT47XG5cbiAgXCJwYXJ0LmdldFwiKHA6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTxQYXJ0IHwgbnVsbD47XG4gIFwicGFydC5zZXRcIihwOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBQYXJ0IH0pOiBQcm9taXNlPHZvaWQ+O1xuICBcInBhcnQubGlzdEJ5U2Vzc2lvblwiKHA6IHsgc2Vzc2lvbklkOiBzdHJpbmcgfSk6IFByb21pc2U8UGFydFtdPjtcblxuICBcInNhbmRib3guZ2V0XCIocDogeyBpZDogc3RyaW5nIH0pOiBQcm9taXNlPFNhbmRib3ggfCBudWxsPjtcbiAgXCJzYW5kYm94LnNldFwiKHA6IHsgaWQ6IHN0cmluZzsgdmFsdWU6IFNhbmRib3ggfSk6IFByb21pc2U8dm9pZD47XG4gIFwic2FuZGJveC51cGRhdGVcIihwOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB1cGRhdGVzOiBQYXJ0aWFsPFNhbmRib3g+O1xuICB9KTogUHJvbWlzZTxTYW5kYm94PjtcblxuICBcInNldHVwLmdldFwiKHA6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTxTZXR1cCB8IG51bGw+O1xuICBcInNldHVwLnNldFwiKHA6IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHZhbHVlOiBTZXR1cDtcbiAgfSk6IFByb21pc2U8dm9pZD47XG59O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgU3RvcmFnZUNhbGwgKGRlcml2ZWQgZnJvbSBTdG9yYWdlSGFuZGxlcnMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQgdHlwZSBTdG9yYWdlQ2FsbCA9IHtcbiAgW0sgaW4ga2V5b2YgU3RvcmFnZUhhbmRsZXJzXTogeyBtZXRob2Q6IEsgfSAmIFBhcmFtZXRlcnM8XG4gICAgU3RvcmFnZUhhbmRsZXJzW0tdXG4gID5bMF07XG59W2tleW9mIFN0b3JhZ2VIYW5kbGVyc107XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTdG9yYWdlU3RlcCAoc2VyaWFsaXphYmxlIGFjcm9zcyB3b3JrZmxvdyBib3VuZGFyeSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCBjbGFzcyBTdG9yYWdlU3RlcCB7XG4gIGV2ZW50OiBTdG9yYWdlQ2FsbDtcblxuICBjb25zdHJ1Y3RvcihldmVudDogU3RvcmFnZUNhbGwpIHtcbiAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBzdGF0aWMgW1dPUktGTE9XX1NFUklBTElaRV0oaW5zdGFuY2U6IFN0b3JhZ2VTdGVwKSB7XG4gICAgcmV0dXJuIHsgZXZlbnQ6IGluc3RhbmNlLmV2ZW50IH07XG4gIH1cblxuICBzdGF0aWMgW1dPUktGTE9XX0RFU0VSSUFMSVpFXShkYXRhOiB7IGV2ZW50OiBTdG9yYWdlQ2FsbCB9KSB7XG4gICAgcmV0dXJuIG5ldyBTdG9yYWdlU3RlcChkYXRhLmV2ZW50KTtcbiAgfVxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogc2FmZSBkaXNwYXRjaCBcdTIwMTQgZXZlbnQubWV0aG9kIHNlbGVjdHMgdGhlIG1hdGNoaW5nIGhhbmRsZXJcbiAgb24oaGFuZGxlcnM6IFN0b3JhZ2VIYW5kbGVycyk6IFByb21pc2U8YW55PiB7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBzZWUgYWJvdmVcbiAgICByZXR1cm4gKGhhbmRsZXJzW3RoaXMuZXZlbnQubWV0aG9kXSBhcyBhbnkpKHRoaXMuZXZlbnQpO1xuICB9XG59XG5cbi8qKlxuICogQSBzaW5nbGUgZnVuY3Rpb24gdGhhdCBoYW5kbGVzIGFsbCBzdG9yYWdlIG9wZXJhdGlvbnMuIEludGVuZGVkIHRvIGJlXG4gKiBtYXJrZWQgd2l0aCBgXCJ1c2Ugc3RlcFwiYCBzbyB0aGF0IGl0cyBib2R5IChhbmQgTm9kZS5qcy1kZXBlbmRlbnRcbiAqIGltcG9ydHMgbGlrZSBkYXRhYmFzZSBjbGllbnRzKSBpcyBleHRyYWN0ZWQgYnkgdGhlIHdvcmtmbG93IGJ1bmRsZXJcbiAqIGFuZCBydW5zIHNlcnZlci1zaWRlLlxuICpcbiAqIFRoZSBzdGVwIHJlY2VpdmVzIGEgYFN0b3JhZ2VTdGVwYCBpbnN0YW5jZSAoc2VyaWFsaXphYmxlIHZpYVxuICogYEB3b3JrZmxvdy9zZXJkZWApIGFuZCBzaG91bGQgY2FsbCBgc3RlcC5oYW5kbGUoeyAuLi4gfSlgIHdpdGggYVxuICogYFN0b3JhZ2VIYW5kbGVyc2AgbWFwLlxuICovXG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IHN0ZXAgZnVuY3Rpb24gaXMgYSBkaXNwYXRjaGVyOyB0eXBlIHNhZmV0eSBpcyBhdCB0aGUgaGFuZGxlcnMgbGV2ZWxcbmV4cG9ydCB0eXBlIFN0b3JhZ2VTdGVwRnVuY3Rpb24gPSAoc3RvcmU6IFN0b3JhZ2VTdGVwKSA9PiBQcm9taXNlPGFueT47XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTdG9yYWdlIChpbnRlcm5hbCwgbmVzdGVkKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlIHtcbiAgc2Vzc2lvbjoge1xuICAgIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8U2Vzc2lvbiB8IG51bGw+O1xuICAgIHNldChrZXk6IHN0cmluZywgdmFsdWU6IFNlc3Npb24pOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVwZGF0ZShrZXk6IHN0cmluZywgdXBkYXRlczogUGFydGlhbDxTZXNzaW9uPik6IFByb21pc2U8U2Vzc2lvbj47XG4gIH07XG4gIG1lc3NhZ2U6IHtcbiAgICBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPE1lc3NhZ2UgfCBudWxsPjtcbiAgICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBNZXNzYWdlKTogUHJvbWlzZTx2b2lkPjtcbiAgICB1cGRhdGUoa2V5OiBzdHJpbmcsIHVwZGF0ZXM6IFBhcnRpYWw8TWVzc2FnZT4pOiBQcm9taXNlPE1lc3NhZ2U+O1xuICAgIGxpc3RCeVNlc3Npb24oc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1lc3NhZ2VbXT47XG4gIH07XG4gIHBhcnQ6IHtcbiAgICBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPFBhcnQgfCBudWxsPjtcbiAgICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBQYXJ0KTogUHJvbWlzZTx2b2lkPjtcbiAgICBsaXN0QnlTZXNzaW9uKHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxQYXJ0W10+O1xuICB9O1xuICBzYW5kYm94OiB7XG4gICAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxTYW5kYm94IHwgbnVsbD47XG4gICAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogU2FuZGJveCk6IFByb21pc2U8dm9pZD47XG4gICAgdXBkYXRlKGtleTogc3RyaW5nLCB1cGRhdGVzOiBQYXJ0aWFsPFNhbmRib3g+KTogUHJvbWlzZTxTYW5kYm94PjtcbiAgfTtcbiAgc2V0dXA6IHtcbiAgICBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPFNldHVwIHwgbnVsbD47XG4gICAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogU2V0dXApOiBQcm9taXNlPHZvaWQ+O1xuICB9O1xufVxuXG5leHBvcnQgdHlwZSBTdG9yYWdlSW5wdXQgPSBTdG9yYWdlSGFuZGxlcnMgfCBTdG9yYWdlU3RlcEZ1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1N0ZXBGdW5jdGlvbihoOiBTdG9yYWdlSW5wdXQpOiBoIGlzIFN0b3JhZ2VTdGVwRnVuY3Rpb24ge1xuICByZXR1cm4gdHlwZW9mIGggPT09IFwiZnVuY3Rpb25cIjtcbn1cblxuZnVuY3Rpb24gZnJvbVN0ZXBGdW5jdGlvbihmbjogU3RvcmFnZVN0ZXBGdW5jdGlvbik6IFN0b3JhZ2Uge1xuICByZXR1cm4ge1xuICAgIHNlc3Npb246IHtcbiAgICAgIGdldDogKGlkKSA9PiBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwic2Vzc2lvbi5nZXRcIiwgaWQgfSkpLFxuICAgICAgc2V0OiAoaWQsIHZhbHVlKSA9PlxuICAgICAgICBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwic2Vzc2lvbi5zZXRcIiwgaWQsIHZhbHVlIH0pKSxcbiAgICAgIHVwZGF0ZTogKGlkLCB1cGRhdGVzKSA9PlxuICAgICAgICBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwic2Vzc2lvbi51cGRhdGVcIiwgaWQsIHVwZGF0ZXMgfSkpLFxuICAgIH0sXG4gICAgbWVzc2FnZToge1xuICAgICAgZ2V0OiAoaWQpID0+IGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJtZXNzYWdlLmdldFwiLCBpZCB9KSksXG4gICAgICBzZXQ6IChpZCwgdmFsdWUpID0+XG4gICAgICAgIGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJtZXNzYWdlLnNldFwiLCBpZCwgdmFsdWUgfSkpLFxuICAgICAgdXBkYXRlOiAoaWQsIHVwZGF0ZXMpID0+XG4gICAgICAgIGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJtZXNzYWdlLnVwZGF0ZVwiLCBpZCwgdXBkYXRlcyB9KSksXG4gICAgICBsaXN0QnlTZXNzaW9uOiAoc2Vzc2lvbklkKSA9PlxuICAgICAgICBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwibWVzc2FnZS5saXN0QnlTZXNzaW9uXCIsIHNlc3Npb25JZCB9KSksXG4gICAgfSxcbiAgICBwYXJ0OiB7XG4gICAgICBnZXQ6IChpZCkgPT4gZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcInBhcnQuZ2V0XCIsIGlkIH0pKSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT5cbiAgICAgICAgZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcInBhcnQuc2V0XCIsIGlkLCB2YWx1ZSB9KSksXG4gICAgICBsaXN0QnlTZXNzaW9uOiAoc2Vzc2lvbklkKSA9PlxuICAgICAgICBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwicGFydC5saXN0QnlTZXNzaW9uXCIsIHNlc3Npb25JZCB9KSksXG4gICAgfSxcbiAgICBzYW5kYm94OiB7XG4gICAgICBnZXQ6IChpZCkgPT4gZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcInNhbmRib3guZ2V0XCIsIGlkIH0pKSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT5cbiAgICAgICAgZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcInNhbmRib3guc2V0XCIsIGlkLCB2YWx1ZSB9KSksXG4gICAgICB1cGRhdGU6IChpZCwgdXBkYXRlcykgPT5cbiAgICAgICAgZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcInNhbmRib3gudXBkYXRlXCIsIGlkLCB1cGRhdGVzIH0pKSxcbiAgICB9LFxuICAgIHNldHVwOiB7XG4gICAgICBnZXQ6IChpZCkgPT4gZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcInNldHVwLmdldFwiLCBpZCB9KSksXG4gICAgICBzZXQ6IChpZCwgdmFsdWUpID0+XG4gICAgICAgIGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJzZXR1cC5zZXRcIiwgaWQsIHZhbHVlIH0pKSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBmcm9tSGFuZGxlcnMoaDogU3RvcmFnZUhhbmRsZXJzKTogU3RvcmFnZSB7XG4gIHJldHVybiB7XG4gICAgc2Vzc2lvbjoge1xuICAgICAgZ2V0OiAoaWQpID0+IGhbXCJzZXNzaW9uLmdldFwiXSh7IGlkIH0pLFxuICAgICAgc2V0OiAoaWQsIHZhbHVlKSA9PiBoW1wic2Vzc2lvbi5zZXRcIl0oeyBpZCwgdmFsdWUgfSksXG4gICAgICB1cGRhdGU6IChpZCwgdXBkYXRlcykgPT4gaFtcInNlc3Npb24udXBkYXRlXCJdKHsgaWQsIHVwZGF0ZXMgfSksXG4gICAgfSxcbiAgICBtZXNzYWdlOiB7XG4gICAgICBnZXQ6IChpZCkgPT4gaFtcIm1lc3NhZ2UuZ2V0XCJdKHsgaWQgfSksXG4gICAgICBzZXQ6IChpZCwgdmFsdWUpID0+IGhbXCJtZXNzYWdlLnNldFwiXSh7IGlkLCB2YWx1ZSB9KSxcbiAgICAgIHVwZGF0ZTogKGlkLCB1cGRhdGVzKSA9PiBoW1wibWVzc2FnZS51cGRhdGVcIl0oeyBpZCwgdXBkYXRlcyB9KSxcbiAgICAgIGxpc3RCeVNlc3Npb246IChzZXNzaW9uSWQpID0+IGhbXCJtZXNzYWdlLmxpc3RCeVNlc3Npb25cIl0oeyBzZXNzaW9uSWQgfSksXG4gICAgfSxcbiAgICBwYXJ0OiB7XG4gICAgICBnZXQ6IChpZCkgPT4gaFtcInBhcnQuZ2V0XCJdKHsgaWQgfSksXG4gICAgICBzZXQ6IChpZCwgdmFsdWUpID0+IGhbXCJwYXJ0LnNldFwiXSh7IGlkLCB2YWx1ZSB9KSxcbiAgICAgIGxpc3RCeVNlc3Npb246IChzZXNzaW9uSWQpID0+IGhbXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIl0oeyBzZXNzaW9uSWQgfSksXG4gICAgfSxcbiAgICBzYW5kYm94OiB7XG4gICAgICBnZXQ6IChpZCkgPT4gaFtcInNhbmRib3guZ2V0XCJdKHsgaWQgfSksXG4gICAgICBzZXQ6IChpZCwgdmFsdWUpID0+IGhbXCJzYW5kYm94LnNldFwiXSh7IGlkLCB2YWx1ZSB9KSxcbiAgICAgIHVwZGF0ZTogKGlkLCB1cGRhdGVzKSA9PiBoW1wic2FuZGJveC51cGRhdGVcIl0oeyBpZCwgdXBkYXRlcyB9KSxcbiAgICB9LFxuICAgIHNldHVwOiB7XG4gICAgICBnZXQ6IChpZCkgPT4gaFtcInNldHVwLmdldFwiXSh7IGlkIH0pLFxuICAgICAgc2V0OiAoaWQsIHZhbHVlKSA9PiBoW1wic2V0dXAuc2V0XCJdKHsgaWQsIHZhbHVlIH0pLFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1N0b3JhZ2UoaDogU3RvcmFnZUlucHV0KTogU3RvcmFnZSB7XG4gIHJldHVybiBpc1N0ZXBGdW5jdGlvbihoKSA/IGZyb21TdGVwRnVuY3Rpb24oaCkgOiBmcm9tSGFuZGxlcnMoaCk7XG59XG4iLCAiaW1wb3J0IHR5cGUge1xuICBNZXNzYWdlLFxuICBQYXJ0LFxuICBTYW5kYm94LFxuICBTZXNzaW9uLFxuICBTZXR1cCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VIYW5kbGVycyB9IGZyb20gXCIuLi9hZGFwdGVyXCI7XG5cbmxldCBfZnM6IHR5cGVvZiBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpIHwgdW5kZWZpbmVkO1xubGV0IF9wYXRoOiB0eXBlb2YgaW1wb3J0KFwibm9kZTpwYXRoXCIpIHwgdW5kZWZpbmVkO1xuXG5hc3luYyBmdW5jdGlvbiBmcygpIHtcbiAgaWYgKCFfZnMpIHtcbiAgICBfZnMgPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICB9XG4gIHJldHVybiBfZnM7XG59XG5hc3luYyBmdW5jdGlvbiBwYXRoKCkge1xuICBpZiAoIV9wYXRoKSB7XG4gICAgX3BhdGggPSBhd2FpdCBpbXBvcnQoXCJub2RlOnBhdGhcIik7XG4gIH1cbiAgcmV0dXJuIF9wYXRoO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTdG9yZTxUPihkaXI6IHN0cmluZykge1xuICBjb25zdCBmaWxlUGF0aCA9IGFzeW5jIChrZXk6IHN0cmluZykgPT5cbiAgICAoYXdhaXQgcGF0aCgpKS5qb2luKGRpciwgYCR7a2V5fS5qc29uYCk7XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgKGF3YWl0IGZzKCkpLnJlYWRGaWxlKGF3YWl0IGZpbGVQYXRoKGtleSksIFwidXRmLThcIik7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpIGFzIFQ7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBUKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBwID0gYXdhaXQgZmlsZVBhdGgoa2V5KTtcbiAgICAgIGNvbnN0IHsgbWtkaXIsIHdyaXRlRmlsZSB9ID0gYXdhaXQgZnMoKTtcbiAgICAgIGNvbnN0IHsgZGlybmFtZSB9ID0gYXdhaXQgcGF0aCgpO1xuICAgICAgYXdhaXQgbWtkaXIoZGlybmFtZShwKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCB3cml0ZUZpbGUocCwgSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpKTtcbiAgICB9LFxuICAgIGFzeW5jIHVwZGF0ZShrZXk6IHN0cmluZywgdXBkYXRlczogUGFydGlhbDxUPik6IFByb21pc2U8VD4ge1xuICAgICAgY29uc3QgcCA9IGF3YWl0IGZpbGVQYXRoKGtleSk7XG4gICAgICBjb25zdCB7IHJlYWRGaWxlLCBta2Rpciwgd3JpdGVGaWxlIH0gPSBhd2FpdCBmcygpO1xuICAgICAgY29uc3QgeyBkaXJuYW1lIH0gPSBhd2FpdCBwYXRoKCk7XG4gICAgICBsZXQgZXhpc3Rpbmc6IFQ7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEZpbGUocCwgXCJ1dGYtOFwiKTtcbiAgICAgICAgZXhpc3RpbmcgPSBKU09OLnBhcnNlKGRhdGEpIGFzIFQ7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3QgZm91bmQ6ICR7a2V5fWApO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlZCA9IHsgLi4uZXhpc3RpbmcsIC4uLnVwZGF0ZXMgfTtcbiAgICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUocCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKHAsIEpTT04uc3RyaW5naWZ5KHVwZGF0ZWQsIG51bGwsIDIpKTtcbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH0sXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRBbGxGcm9tRGlyPFQ+KGRpcjogc3RyaW5nKTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgeyByZWFkZGlyLCByZWFkRmlsZSB9ID0gYXdhaXQgZnMoKTtcbiAgY29uc3QgeyBqb2luIH0gPSBhd2FpdCBwYXRoKCk7XG4gIGxldCBmaWxlczogc3RyaW5nW107XG4gIHRyeSB7XG4gICAgZmlsZXMgPSBhd2FpdCByZWFkZGlyKGRpcik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCByZXN1bHQ6IFRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBpZiAoIWZpbGUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEZpbGUoam9pbihkaXIsIGZpbGUpLCBcInV0Zi04XCIpO1xuICAgICAgcmVzdWx0LnB1c2goSlNPTi5wYXJzZShkYXRhKSBhcyBUKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHNraXAgY29ycnVwdCBmaWxlc1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9jYWxTdG9yYWdlKG9wdHM/OiB7IGRpcj86IHN0cmluZyB9KTogU3RvcmFnZUhhbmRsZXJzIHtcbiAgY29uc3QgZGlyID0gb3B0cz8uZGlyID8/IFwiLmFnZW50XCI7XG5cbiAgY29uc3Qgc2Vzc2lvblN0b3JlID0gY3JlYXRlU3RvcmU8U2Vzc2lvbj4oYCR7ZGlyfS9zZXNzaW9uYCk7XG4gIGNvbnN0IG1lc3NhZ2VTdG9yZSA9IGNyZWF0ZVN0b3JlPE1lc3NhZ2U+KGAke2Rpcn0vbWVzc2FnZWApO1xuICBjb25zdCBwYXJ0U3RvcmUgPSBjcmVhdGVTdG9yZTxQYXJ0PihgJHtkaXJ9L3BhcnRgKTtcbiAgY29uc3Qgc2FuZGJveFN0b3JlID0gY3JlYXRlU3RvcmU8U2FuZGJveD4oYCR7ZGlyfS9zYW5kYm94YCk7XG4gIGNvbnN0IHNldHVwU3RvcmUgPSBjcmVhdGVTdG9yZTxTZXR1cD4oYCR7ZGlyfS9zZXR1cGApO1xuICBjb25zdCBtZXNzYWdlRGlyID0gYCR7ZGlyfS9tZXNzYWdlYDtcbiAgY29uc3QgcGFydERpciA9IGAke2Rpcn0vcGFydGA7XG5cbiAgcmV0dXJuIHtcbiAgICBcInNlc3Npb24uZ2V0XCI6ICh7IGlkIH0pID0+IHNlc3Npb25TdG9yZS5nZXQoaWQpLFxuICAgIFwic2Vzc2lvbi5zZXRcIjogKHsgaWQsIHZhbHVlIH0pID0+IHNlc3Npb25TdG9yZS5zZXQoaWQsIHZhbHVlKSxcbiAgICBcInNlc3Npb24udXBkYXRlXCI6ICh7IGlkLCB1cGRhdGVzIH0pID0+IHNlc3Npb25TdG9yZS51cGRhdGUoaWQsIHVwZGF0ZXMpLFxuXG4gICAgXCJtZXNzYWdlLmdldFwiOiAoeyBpZCB9KSA9PiBtZXNzYWdlU3RvcmUuZ2V0KGlkKSxcbiAgICBcIm1lc3NhZ2Uuc2V0XCI6ICh7IGlkLCB2YWx1ZSB9KSA9PiBtZXNzYWdlU3RvcmUuc2V0KGlkLCB2YWx1ZSksXG4gICAgXCJtZXNzYWdlLnVwZGF0ZVwiOiAoeyBpZCwgdXBkYXRlcyB9KSA9PiBtZXNzYWdlU3RvcmUudXBkYXRlKGlkLCB1cGRhdGVzKSxcbiAgICBcIm1lc3NhZ2UubGlzdEJ5U2Vzc2lvblwiOiBhc3luYyAoeyBzZXNzaW9uSWQgfSkgPT4ge1xuICAgICAgY29uc3QgYWxsID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8TWVzc2FnZT4obWVzc2FnZURpcik7XG4gICAgICByZXR1cm4gYWxsLmZpbHRlcigobSkgPT4gbS5zZXNzaW9uSWQgPT09IHNlc3Npb25JZCk7XG4gICAgfSxcblxuICAgIFwicGFydC5nZXRcIjogKHsgaWQgfSkgPT4gcGFydFN0b3JlLmdldChpZCksXG4gICAgXCJwYXJ0LnNldFwiOiAoeyBpZCwgdmFsdWUgfSkgPT4gcGFydFN0b3JlLnNldChpZCwgdmFsdWUpLFxuICAgIFwicGFydC5saXN0QnlTZXNzaW9uXCI6IGFzeW5jICh7IHNlc3Npb25JZCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGwgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxQYXJ0PihwYXJ0RGlyKTtcbiAgICAgIHJldHVybiBhbGwuZmlsdGVyKChwKSA9PiBwLnNlc3Npb25JZCA9PT0gc2Vzc2lvbklkKTtcbiAgICB9LFxuXG4gICAgXCJzYW5kYm94LmdldFwiOiAoeyBpZCB9KSA9PiBzYW5kYm94U3RvcmUuZ2V0KGlkKSxcbiAgICBcInNhbmRib3guc2V0XCI6ICh7IGlkLCB2YWx1ZSB9KSA9PiBzYW5kYm94U3RvcmUuc2V0KGlkLCB2YWx1ZSksXG4gICAgXCJzYW5kYm94LnVwZGF0ZVwiOiAoeyBpZCwgdXBkYXRlcyB9KSA9PiBzYW5kYm94U3RvcmUudXBkYXRlKGlkLCB1cGRhdGVzKSxcblxuICAgIFwic2V0dXAuZ2V0XCI6ICh7IGlkIH0pID0+IHNldHVwU3RvcmUuZ2V0KGlkKSxcbiAgICBcInNldHVwLnNldFwiOiAoeyBpZCwgdmFsdWUgfSkgPT4gc2V0dXBTdG9yZS5zZXQoaWQsIHZhbHVlKSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7XG4gIEluZmVyVG9vbElucHV0LFxuICBJbmZlclVJVG9vbHMsXG4gIE1vZGVsTWVzc2FnZSxcbiAgVG9vbFNldCxcbiAgVUlNZXNzYWdlLFxufSBmcm9tIFwiYWlcIjtcbmltcG9ydCAqIGFzIGVycm9yZSBmcm9tIFwiZXJyb3JlXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBCdWlsdEluVG9vbE5hbWUsIGJ1aWx0SW5Ub29scywgVG9vbENvbnRleHQgfSBmcm9tIFwiLi4vdG9vbHNcIjtcbmltcG9ydCB0eXBlIHsgQW55QWdlbnQgfSBmcm9tIFwiLi9jbGllbnRcIjtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEFnZW50IFN0YXR1cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBUcmFuc2llbnQgc3RhdHVzIGluZGljYXRvcnMgZW1pdHRlZCBvdmVyIHRoZSBzdHJlYW0gZHVyaW5nIGxvbmctcnVubmluZyBwaGFzZXMuXG4gKiBEZWxpdmVyZWQgdG8gdGhlIGNsaWVudCBhcyBgZGF0YS1zdGF0dXNgIGNodW5rcyB3aXRoIGB0cmFuc2llbnQ6IHRydWVgIFx1MjAxNCBub3QgcGVyc2lzdGVkLlxuICovXG5leHBvcnQgY29uc3QgQWdlbnRTdGF0dXMgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbChcInNhbmRib3gtc2V0dXBcIikgfSksXG4gIHoub2JqZWN0KHsgdHlwZTogei5saXRlcmFsKFwic2FuZGJveC1zZXR1cC1jb2xkXCIpIH0pLFxuICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbChcImxvYWRpbmctc2tpbGxzXCIpIH0pLFxuICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbChcInByb2Nlc3NpbmctYXBwcm92YWxzXCIpIH0pLFxuICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbChcIm5lZWRzLWFwcHJvdmFsXCIpIH0pLFxuICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbChcInRoaW5raW5nXCIpIH0pLFxuICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbChcImN1c3RvbVwiKSwgc3RhdHVzOiB6LnN0cmluZygpIH0pLFxuXSk7XG5cbmV4cG9ydCB0eXBlIEFnZW50U3RhdHVzID0gei5pbmZlcjx0eXBlb2YgQWdlbnRTdGF0dXM+O1xuXG5leHBvcnQgdHlwZSBBZ2VudERhdGFUeXBlcyA9IHsgc3RhdHVzOiBBZ2VudFN0YXR1cyB9O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgSG9va3MgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB0eXBlIEFnZW50SG9va3MgPSB7XG4gIFwidG9vbC5iZWZvcmVcIj86IChvcHRzOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlucHV0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgaW5wdXQ6IHVua25vd24gfT47XG4gIFwidG9vbC5hZnRlclwiPzogKG9wdHM6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaW5wdXQ6IHVua25vd247XG4gICAgcmVzdWx0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgcmVzdWx0OiB1bmtub3duIH0+O1xuICBzdGF0dXM/OiAoc3RhdHVzOiBBZ2VudFN0YXR1cykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG59O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgTmVlZHMgQXBwcm92YWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbnR5cGUgVG9vbE5hbWU8VG9vbHM+ID0gRXh0cmFjdDxrZXlvZiBUb29scywgc3RyaW5nPiB8IEJ1aWx0SW5Ub29sTmFtZTtcblxudHlwZSBUb29sSW5wdXQ8VG9vbHMsIEs+ID0gSyBleHRlbmRzIEJ1aWx0SW5Ub29sTmFtZVxuICA/IEluZmVyVG9vbElucHV0PCh0eXBlb2YgYnVpbHRJblRvb2xzKVtLXT5cbiAgOiBLIGV4dGVuZHMga2V5b2YgVG9vbHNcbiAgICA/IFRvb2xzW0tdIGV4dGVuZHMgaW1wb3J0KFwiYWlcIikuVG9vbFxuICAgICAgPyBJbmZlclRvb2xJbnB1dDxUb29sc1tLXT5cbiAgICAgIDogdW5rbm93blxuICAgIDogdW5rbm93bjtcblxuZXhwb3J0IHR5cGUgTmVlZHNBcHByb3ZhbE1hcDxUb29scz4gPSB7XG4gIFtLIGluIFRvb2xOYW1lPFRvb2xzPl0/OlxuICAgIHwgYm9vbGVhblxuICAgIHwgKChcbiAgICAgICAgaW5wdXQ6IFRvb2xJbnB1dDxUb29scywgSz4sXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB0b29sQ2FsbElkOiBzdHJpbmc7XG4gICAgICAgICAgbWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdO1xuICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB1bmtub3duO1xuICAgICAgICB9XG4gICAgICApID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTtcbn07XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBJbmZlciBVSSBNZXNzYWdlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQgdHlwZSBJbmZlclVJTWVzc2FnZTxBPiA9IEEgZXh0ZW5kcyB7IHRvb2xzOiBpbmZlciBUIGV4dGVuZHMgVG9vbFNldCB9XG4gID8gVUlNZXNzYWdlPHVua25vd24sIEFnZW50RGF0YVR5cGVzLCBJbmZlclVJVG9vbHM8VD4+XG4gIDogVUlNZXNzYWdlPHVua25vd24sIEFnZW50RGF0YVR5cGVzPjtcblxuZXhwb3J0IHR5cGUgVHlwZWRVSU1lc3NhZ2U8VG9vbHMgZXh0ZW5kcyBUb29sU2V0ID0gVG9vbFNldD4gPSBVSU1lc3NhZ2U8XG4gIHVua25vd24sXG4gIEFnZW50RGF0YVR5cGVzLFxuICBJbmZlclVJVG9vbHM8VG9vbHM+XG4+O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgUmVnaXN0cnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNsYXNzIEFnZW50Tm90Rm91bmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiQWdlbnROb3RGb3VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IGBBZ2VudCBcIiRhZ2VudE5hbWVcIiBub3QgZm91bmQgaW4gcmVnaXN0cnkuXG5cbmhpbnQ6IGFnZW50KCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHdvcmtmbG93IHN0ZXBzIGV4ZWN1dGUuXG4gICAgICBWYWxpZCBsb2NhdGlvbnM6IG1vZHVsZSBzY29wZSwgb3IgaW5zaWRlIGEgXCJ1c2Ugd29ya2Zsb3dcIiBib2R5LlxuXG4gIC8vIE1vZHVsZSBzY29wZSAoc3RhdGljIGFnZW50cylcbiAgZXhwb3J0IGNvbnN0IG15QWdlbnQgPSBhZ2VudChcIiRhZ2VudE5hbWVcIiwgeyAuLi4gfSk7XG5cbiAgLy8gV29ya2Zsb3cgYm9keSAoZHluYW1pYyBhZ2VudHMpXG4gIGFzeW5jIGZ1bmN0aW9uIG15V29ya2Zsb3coeyBpbnB1dCB9KSB7XG4gICAgXCJ1c2Ugd29ya2Zsb3dcIjtcbiAgICBjb25zdCBteUFnZW50ID0gYWdlbnQoXCIkYWdlbnROYW1lXCIsIHsgLi4uIH0pO1xuICAgIC4uLlxuICB9YCxcbn0pIHt9XG5cbmNvbnN0IEFHRU5UX1JFR0lTVFJZX0tFWSA9IFN5bWJvbC5mb3IoXCJleHBlcmltZW50YWwtYWdlbnQtcmVnaXN0cnlcIik7XG5cbmZ1bmN0aW9uIGdldEFnZW50UmVnaXN0cnkoKTogTWFwPHN0cmluZywgQW55QWdlbnQ+IHtcbiAgY29uc3QgZyA9IGdsb2JhbFRoaXMgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj47XG4gIGxldCByZWdpc3RyeSA9IGdbQUdFTlRfUkVHSVNUUllfS0VZXSBhcyBNYXA8c3RyaW5nLCBBbnlBZ2VudD4gfCB1bmRlZmluZWQ7XG4gIGlmICghcmVnaXN0cnkpIHtcbiAgICByZWdpc3RyeSA9IG5ldyBNYXAoKTtcbiAgICBnW0FHRU5UX1JFR0lTVFJZX0tFWV0gPSByZWdpc3RyeTtcbiAgfVxuICByZXR1cm4gcmVnaXN0cnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFnZW50KG5hbWU6IHN0cmluZywgYWdlbnQ6IEFueUFnZW50KSB7XG4gIGdldEFnZW50UmVnaXN0cnkoKS5zZXQobmFtZSwgYWdlbnQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZW50PFJlcXVpcmVkIGV4dGVuZHMgYm9vbGVhbj4oXG4gIG5hbWU6IHN0cmluZyxcbiAgcmVxdWlyZWQ/OiBSZXF1aXJlZFxuKTogUmVxdWlyZWQgZXh0ZW5kcyB0cnVlID8gQW55QWdlbnQgOiBBbnlBZ2VudCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFnZW50ID0gZ2V0QWdlbnRSZWdpc3RyeSgpLmdldChuYW1lKTtcbiAgaWYgKHJlcXVpcmVkICYmICFhZ2VudCkge1xuICAgIHRocm93IG5ldyBBZ2VudE5vdEZvdW5kRXJyb3IoeyBhZ2VudE5hbWU6IG5hbWUgfSk7XG4gIH1cbiAgcmV0dXJuIGFnZW50IGFzIFJlcXVpcmVkIGV4dGVuZHMgdHJ1ZSA/IEFueUFnZW50IDogQW55QWdlbnQgfCB1bmRlZmluZWQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyQkEsU0FBUyxTQUFTLFFBQWlDO0FBQ2pELFNBQU8sT0FBTyxTQUFTO0FBQ3pCO0FBRUEsU0FBUyxVQUFVLFFBQStCO0FBQ2hELFNBQU8sT0FBTyxVQUFVO0FBQzFCO0FBRUEsU0FBUyxVQUFVLFFBQXVCLE9BQTBCO0FBQ2xFLFNBQU8sbUJBQW1CLEtBQUssS0FBSyxtQkFBbUIsU0FBUyxNQUFNLENBQUM7QUFDekU7QUFFQSxTQUFTLFVBQVUsUUFBdUIsV0FBMkI7QUFDbkUsU0FBTyxJQUFJLFVBQVUsTUFBTSxDQUFDLElBQUksT0FBTyxJQUFJLElBQUksU0FBUztBQUMxRDtBQUVBLFNBQVMsV0FDUCxTQUNBLE9BQ3FDO0FBQ3JDLFFBQU0sU0FBUyxFQUFFLEdBQUcsU0FBUyxHQUFHLE1BQU07QUFDdEMsUUFBTSxVQUFVLE9BQU8sUUFBUSxNQUFNLEVBQUU7QUFBQSxJQUNyQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sTUFBTSxVQUFhLE1BQU07QUFBQSxFQUN0QztBQUNBLE1BQUksUUFBUSxXQUFXLEdBQUc7QUFDeEIsV0FBTztBQUFBLEVBQ1Q7QUFD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RSxXQUFPLEVBQUUsT0FBTyxRQUFRLFlBQVksYUFBYSxVQUFVO0FBQUEsRUFDN0Q7QUFBQSxFQUVBLElBQUksUUFBb0I7QUFDdEIsV0FBTyxLQUFLLFFBQVEsU0FBUyxDQUFDO0FBQUEsRUFDaEM7QUFBQSxFQUVTO0FBQUEsRUFFQTtBQVFYO0FBRU8sU0FBUyxNQUlkLE1BQWMsU0FBMkQ7QUFDekUsUUFBTSxXQUFXLElBQUksTUFBeUMsTUFBTSxPQUFPO0FBQzNFLGdCQUFjLE1BQU0sUUFBUTtBQUM1QixTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbImxvZyIsICJzbmFwc2hvdCIsICJsb2ciLCAibG9hZFNhbmRib3hTREsiLCAiZ2V0VGVzdENyZWRlbnRpYWxzIiwgImxvZyIsICJzbmFwc2hvdCIsICJhZ2VudCIsICJzZXR1cCIsICJzdGFydFdvcmtmbG93IiwgInNkayIsICJpbnN0YW5jZSIsICJwYXRoIiwgInJlc29sdmUiLCAicGF0aCIsICJmcyIsICJpbXBvcnRfdWxpZCIsICJwYXRoIiwgInJlc29sdmUiLCAiZnMiLCAicmVzb2x2ZSIsICJpbXBvcnRfc2VyZGUiLCAiaW1wb3J0X3VsaWQiLCAidmVyY2VsU2FuZGJveCIsICJkb2NrZXJTYW5kYm94IiwgImxvY2FsU2FuZGJveCIsICJhZ2VudCIsICJsb2ciLCAicmVzb2x2ZSIsICJhZ2VudCIsICJpbXBvcnRfdWxpZCIsICJ1c2FnZSIsICJlcnJvcmUiLCAiaW1wb3J0X3VsaWQiLCAiaW1wb3J0X2FpIiwgImFnZW50IiwgImxvZyIsICJpbXBvcnRfYWkiLCAiaW1wb3J0X3VsaWQiLCAiaW1wb3J0X3pvZCIsICJleGVjIiwgImFnZW50IiwgImFnZW50IiwgInBhdGgiLCAiY3JlYXRlUHJvY2Vzc01hbmFnZXIiLCAic3RhcnQiLCAiYWdlbnQiLCAicmVzb2x2ZSIsICJsb2ciLCAic2Vzc2lvbiIsICJzYW5kYm94IiwgInN0cmVhbSIsICJzdHJlYW1UZXh0QWkiLCAidXNhZ2UiLCAiYWdlbnQiLCAibG9nIiwgInVzYWdlIiwgIm5vdyIsICJpZCIsICJlcnJvcmUiLCAiYWdlbnQiLCAicmVhZEZpbGUiLCAiYWxsIiwgImVycm9yZSIsICJpbXBvcnRfem9kIiwgImFnZW50IiwgImFnZW50Il0KfQo=
5266
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWxzL2xvZ2dlci50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy92ZXJjZWwtbGlmZWN5Y2xlL3N0ZXBzLnRzIiwgIi4uL3NyYy9zYW5kYm94L2JpbmRpbmdzL3ZlcmNlbC1saWZlY3ljbGUvd29ya2Zsb3cudHMiLCAiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvdmVyY2VsLnRzIiwgIi4uL3NyYy9zYW5kYm94L2JpbmRpbmdzL2RvY2tlci50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy9sb2NhbC50cyIsICIuLi9zcmMvc2FuZGJveC9wcm9jZXNzLW1hbmFnZXIudHMiLCAiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9hZ2VudC9jbGllbnQudHMiLCAiLi4vc3JjL3NhbmRib3gvaGFuZGxlLnRzIiwgIi4uL3NyYy9hZ2VudC9pcy12ZXJjZWwudHMiLCAiLi4vc3JjL2Vycm9ycy50cyIsICIuLi9zcmMvc2FuZGJveC9zZXR1cC50cyIsICIuLi9zcmMvc2FuZGJveC9leGVjLnRzIiwgIi4uL3NyYy9zYW5kYm94L2dldC1kb21haW4udHMiLCAiLi4vc3JjL3NhbmRib3gvZ2V0LXN0YXR1cy50cyIsICIuLi9zcmMvc2FuZGJveC9raWxsLnRzIiwgIi4uL3NyYy9zYW5kYm94L3JlYWQtZmlsZS50cyIsICIuLi9zcmMvc2FuZGJveC9zbmFwc2hvdC50cyIsICIuLi9zcmMvc2FuZGJveC9zdGFydC50cyIsICIuLi9zcmMvc2FuZGJveC9zdG9wLnRzIiwgIi4uL3NyYy9zYW5kYm94L3VwZGF0ZS1uZXR3b3JrLXBvbGljeS50cyIsICIuLi9zcmMvc2FuZGJveC93cml0ZS1maWxlcy50cyIsICIuLi9zcmMvc2Vzc2lvbi9oYW5kbGUudHMiLCAiLi4vc3JjL3V0aWxzL3VpLnRzIiwgIi4uL3NyYy91dGlscy91c2FnZS50cyIsICIuLi9zcmMvc2Vzc2lvbi9oaXN0b3J5LnRzIiwgIi4uL3NyYy9zZXNzaW9uL2ludGVycnVwdC50cyIsICIuLi9zcmMvc2Vzc2lvbi9zZW5kLnRzIiwgIi4uL3NyYy9zZXNzaW9uL2FpLWxvb3Avc3RyZWFtLXRleHQudHMiLCAiLi4vc3JjL3NraWxscy9kaXNjb3Zlci50cyIsICIuLi9zcmMvc2tpbGxzL3BhcnNlci50cyIsICIuLi9zcmMvc2tpbGxzL3Jlc29sdmUudHMiLCAiLi4vc3JjL3NraWxscy9yZXNvbHZlLWhvc3QudHMiLCAiLi4vc3JjL3NraWxscy9yZXNvbHZlLWlubGluZS50cyIsICIuLi9zcmMvc2tpbGxzL3Jlc29sdmUtcmVtb3RlLnRzIiwgIi4uL3NyYy90b29scy9pbmRleC50cyIsICIuLi9zcmMvdG9vbHMvamF2YXNjcmlwdC50cyIsICIuLi9zcmMvdG9vbHMvbmVlZHMtYXBwcm92YWwudHMiLCAiLi4vc3JjL3V0aWxzL3Byb21wdC1jYWNoZS50cyIsICIuLi9zcmMvc2Vzc2lvbi9zdHJlYW0udHMiLCAiLi4vc3JjL3Nlc3Npb24vdXBkYXRlLnRzIiwgIi4uL3NyYy9zZXNzaW9uL3VzYWdlLnRzIiwgIi4uL3NyYy9zdG9yYWdlL2FkYXB0ZXIudHMiLCAiLi4vc3JjL3N0b3JhZ2UvYmluZGluZ3Mva3YudHMiLCAiLi4vc3JjL3N0b3JhZ2UvYmluZGluZ3MvbG9jYWwudHMiLCAiLi4vc3JjL3N0b3JhZ2Uvc2hvdWxkLWZhbGxiYWNrLWt2Mi50cyIsICIuLi9zcmMvYWdlbnQvcmVnaXN0cnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB0eXBlIExvZ0xldmVsID0gXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIiB8IFwic2lsZW50XCI7XG5cbmNvbnN0IExPR19MRVZFTF9QUklPUklUWTogUmVjb3JkPExvZ0xldmVsLCBudW1iZXI+ID0ge1xuICBpbmZvOiAwLFxuICB3YXJuOiAxLFxuICBlcnJvcjogMixcbiAgc2lsZW50OiAzLFxufTtcblxuZXhwb3J0IHR5cGUgTG9nQ29udGV4dCA9IHtcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICBtZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIHNhbmRib3hJZD86IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIExvZ2dpbmdDb25maWcgPSB7XG4gIGxldmVsPzogTG9nTGV2ZWw7XG4gIC8qKlxuICAgKiBUb3AtbGV2ZWwgbGFiZWwgZm9yIGFsbCBsb2cgbGluZXMuXG4gICAqIEBkZWZhdWx0IFwiYWdlbnRcIlxuICAgKiBAZXhhbXBsZSBcIm15LWFwcFwiIFx1MjE5MiBbbXktYXBwOmRlZmF1bHQ6d29ya2Zsb3ddXG4gICAqL1xuICBwcmVmaXg/OiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG59O1xuXG5mdW5jdGlvbiBnZXRMZXZlbChjb25maWc6IExvZ2dpbmdDb25maWcpOiBMb2dMZXZlbCB7XG4gIHJldHVybiBjb25maWcubGV2ZWwgPz8gXCJ3YXJuXCI7XG59XG5cbmZ1bmN0aW9uIGdldFByZWZpeChjb25maWc6IExvZ2dpbmdDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLnByZWZpeCA/PyBcImFnZW50XCI7XG59XG5cbmZ1bmN0aW9uIHNob3VsZExvZyhjb25maWc6IExvZ2dpbmdDb25maWcsIGxldmVsOiBMb2dMZXZlbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gTE9HX0xFVkVMX1BSSU9SSVRZW2xldmVsXSA+PSBMT0dfTEVWRUxfUFJJT1JJVFlbZ2V0TGV2ZWwoY29uZmlnKV07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRhZyhjb25maWc6IExvZ2dpbmdDb25maWcsIHN1YnN5c3RlbTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBbJHtnZXRQcmVmaXgoY29uZmlnKX06JHtjb25maWcubmFtZX06JHtzdWJzeXN0ZW19XWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERhdGEoXG4gIGNvbnRleHQ6IExvZ0NvbnRleHQsXG4gIGV4dHJhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWVyZ2VkID0geyAuLi5jb250ZXh0LCAuLi5leHRyYSB9O1xuICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMobWVyZ2VkKS5maWx0ZXIoXG4gICAgKFssIHZdKSA9PiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbFxuICApO1xuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcyk7XG59XG5cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuICByZWFkb25seSBzdWJzeXN0ZW06IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IExvZ2dpbmdDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dDogTG9nQ29udGV4dDtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgc3Vic3lzdGVtLFxuICAgIGNvbmZpZyxcbiAgICBjb250ZXh0LFxuICB9OiB7XG4gICAgc3Vic3lzdGVtOiBzdHJpbmc7XG4gICAgY29uZmlnOiBMb2dnaW5nQ29uZmlnO1xuICAgIGNvbnRleHQ/OiBMb2dDb250ZXh0O1xuICB9KSB7XG4gICAgdGhpcy5zdWJzeXN0ZW0gPSBzdWJzeXN0ZW07XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dCA/PyB7fTtcbiAgfVxuXG4gIGNoaWxkKHtcbiAgICBzdWJzeXN0ZW0sXG4gICAgY29udGV4dCxcbiAgfToge1xuICAgIHN1YnN5c3RlbT86IHN0cmluZztcbiAgICBjb250ZXh0PzogTG9nQ29udGV4dDtcbiAgfSk6IExvZ2dlciB7XG4gICAgcmV0dXJuIG5ldyBMb2dnZXIoe1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIHN1YnN5c3RlbTogc3Vic3lzdGVtID8gYCR7dGhpcy5zdWJzeXN0ZW19OiR7c3Vic3lzdGVtfWAgOiB0aGlzLnN1YnN5c3RlbSxcbiAgICAgIGNvbnRleHQ6IHsgLi4udGhpcy5jb250ZXh0LCAuLi5jb250ZXh0IH0sXG4gICAgfSk7XG4gIH1cblxuICB3aXRoQ29udGV4dChjb250ZXh0OiBMb2dDb250ZXh0KTogTG9nZ2VyIHtcbiAgICByZXR1cm4gbmV3IExvZ2dlcih7XG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgc3Vic3lzdGVtOiB0aGlzLnN1YnN5c3RlbSxcbiAgICAgIGNvbnRleHQ6IHsgLi4udGhpcy5jb250ZXh0LCAuLi5jb250ZXh0IH0sXG4gICAgfSk7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKCFzaG91bGRMb2codGhpcy5jb25maWcsIFwiaW5mb1wiKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkID0gZm9ybWF0RGF0YSh0aGlzLmNvbnRleHQsIGRhdGEpO1xuICAgIGlmIChkKSB7XG4gICAgICBjb25zb2xlLmluZm8oZm9ybWF0VGFnKHRoaXMuY29uZmlnLCB0aGlzLnN1YnN5c3RlbSksIG1lc3NhZ2UsIGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmluZm8oZm9ybWF0VGFnKHRoaXMuY29uZmlnLCB0aGlzLnN1YnN5c3RlbSksIG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHdhcm4obWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAoIXNob3VsZExvZyh0aGlzLmNvbmZpZywgXCJ3YXJuXCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGQgPSBmb3JtYXREYXRhKHRoaXMuY29udGV4dCwgZGF0YSk7XG4gICAgaWYgKGQpIHtcbiAgICAgIGNvbnNvbGUud2Fybihmb3JtYXRUYWcodGhpcy5jb25maWcsIHRoaXMuc3Vic3lzdGVtKSwgbWVzc2FnZSwgZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2Fybihmb3JtYXRUYWcodGhpcy5jb25maWcsIHRoaXMuc3Vic3lzdGVtKSwgbWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAoIXNob3VsZExvZyh0aGlzLmNvbmZpZywgXCJlcnJvclwiKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkID0gZm9ybWF0RGF0YSh0aGlzLmNvbnRleHQsIGRhdGEpO1xuICAgIGlmIChkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdFRhZyh0aGlzLmNvbmZpZywgdGhpcy5zdWJzeXN0ZW0pLCBtZXNzYWdlLCBkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXRUYWcodGhpcy5jb25maWcsIHRoaXMuc3Vic3lzdGVtKSwgbWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgbG9ncyB0aGUgZWxhcHNlZCB0aW1lIGF0IGluZm8gbGV2ZWwuXG4gICAqIFBhc3MgYGxvZ09uU3RhcnQ6IHRydWVgIHRvIGFsc28gbG9nIHdoZW4gdGhlIHRpbWVyIGJlZ2lucy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgZG9uZSA9IGxvZy50aW1lKFwic2FuZGJveCBzZXR1cFwiLCB7IHNhbmRib3hJZCB9LCB7IGxvZ09uU3RhcnQ6IHRydWUgfSk7XG4gICAqIGF3YWl0IHNldHVwKCk7XG4gICAqIGRvbmUoKTsgLy8gc3RhcnQ6IFthZ2VudDpkZWZhdWx0OnNhbmRib3hdIHNhbmRib3ggc2V0dXAgeyBzYW5kYm94SWQ6ICcuLi4nIH1cbiAgICogICAgICAgICAvLyBlbmQ6ICAgW2FnZW50OmRlZmF1bHQ6c2FuZGJveF0gc2FuZGJveCBzZXR1cCB7IHNhbmRib3hJZDogJy4uLicsIGR1cmF0aW9uTXM6IDEyMyB9XG4gICAqL1xuICB0aW1lKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgb3B0cz86IHsgbG9nT25TdGFydD86IGJvb2xlYW4gfVxuICApOiAoZW5kRGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkIHtcbiAgICBpZiAob3B0cz8ubG9nT25TdGFydCkge1xuICAgICAgdGhpcy5pbmZvKGBbc3RhcnRdICR7bWVzc2FnZX1gLCBkYXRhKTtcbiAgICB9XG4gICAgY29uc3QgdDAgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiAoZW5kRGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICB0aGlzLmluZm8ob3B0cz8ubG9nT25TdGFydCA/IGBbZW5kXSAke21lc3NhZ2V9YCA6IG1lc3NhZ2UsIHtcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgLi4uZW5kRGF0YSxcbiAgICAgICAgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHQwLFxuICAgICAgfSk7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9nZ2VyKHtcbiAgY29uZmlnLFxuICBzdWJzeXN0ZW0sXG4gIGNvbnRleHQsXG59OiB7XG4gIGNvbmZpZzogTG9nZ2luZ0NvbmZpZztcbiAgc3Vic3lzdGVtOiBzdHJpbmc7XG4gIGNvbnRleHQ/OiBMb2dDb250ZXh0O1xufSk6IExvZ2dlciB7XG4gIHJldHVybiBuZXcgTG9nZ2VyKHsgY29uZmlnLCBzdWJzeXN0ZW0sIGNvbnRleHQgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94IGFzIFZlcmNlbFNhbmRib3hTREsgfSBmcm9tIFwiQHZlcmNlbC9zYW5kYm94XCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hBZ2VudFJlZiB9IGZyb20gXCIuLi8uLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFZlcmNlbEJpbmRpbmdNZXRhZGF0YSB9IGZyb20gXCIuLi92ZXJjZWxcIjtcblxuYXN5bmMgZnVuY3Rpb24gbG9hZFNhbmRib3hTREsoKTogUHJvbWlzZTx0eXBlb2YgVmVyY2VsU2FuZGJveFNESz4ge1xuICByZXR1cm4gKGF3YWl0IGltcG9ydChcIkB2ZXJjZWwvc2FuZGJveFwiKSkuU2FuZGJveDtcbn1cblxuY29uc3QgREVGQVVMVF9QT0xMX0lOVEVSVkFMX01TID0gMiAqIDYwICogMTAwMDtcbmNvbnN0IERFRkFVTFRfSURMRV9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcbmNvbnN0IFNOQVBTSE9UX0JFRk9SRV9USU1FT1VUX01TID0gMTAgKiA2MCAqIDEwMDA7XG5cbmNvbnN0IGdldFRlc3RDcmVkZW50aWFscyA9ICgpID0+XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIlxuICAgID8ge1xuICAgICAgICB0b2tlbjogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVE9LRU4sXG4gICAgICAgIHRlYW1JZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVEVBTV9JRCxcbiAgICAgICAgcHJvamVjdElkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9QUk9KRUNUX0lELFxuICAgICAgfVxuICAgIDoge307XG5cbmV4cG9ydCB0eXBlIExpZmVjeWNsZVN0ZXBSZXN1bHQgPVxuICB8IHsgYWN0aW9uOiBcImNvbnRpbnVlXCI7IG5leHRQb2xsTXM6IG51bWJlciB9XG4gIHwge1xuICAgICAgYWN0aW9uOiBcImV4aXRcIjtcbiAgICAgIHJlYXNvbjogXCJzYW5kYm94SWRfY2hhbmdlZFwiIHwgXCJpZGxlXCIgfCBcInRpbWVvdXRcIiB8IFwibm90X2ZvdW5kXCI7XG4gICAgfTtcblxuZXhwb3J0IHR5cGUgTGlmZWN5Y2xlQ29uZmlnID0ge1xuICBwb2xsSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgc3RvcEFmdGVySW5hY3RpdmVNcz86IG51bWJlcjtcbiAgc25hcHNob3RCZWZvcmVUaW1lb3V0TXM/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBMaWZlY3ljbGVJbnB1dCA9IHtcbiAgYWdlbnQ6IFNhbmRib3hBZ2VudFJlZjtcbiAgc2FuZGJveElkOiBzdHJpbmc7XG4gIHZlcmNlbFNhbmRib3hJZDogc3RyaW5nO1xuICBjb25maWc/OiBMaWZlY3ljbGVDb25maWc7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRTbmFwc2hvdFN0ZXAoXG4gIGlucHV0OiBMaWZlY3ljbGVJbnB1dFxuKTogUHJvbWlzZTxFcnJvciB8IExpZmVjeWNsZVN0ZXBSZXN1bHQ+IHtcbiAgXCJ1c2Ugc3RlcFwiO1xuXG4gIGNvbnN0IHN0b3JhZ2UgPSBpbnB1dC5hZ2VudC5zdG9yYWdlO1xuICBjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoe1xuICAgIGNvbmZpZzogeyAuLi5pbnB1dC5hZ2VudC5vcHRpb25zLmxvZ2dpbmcsIG5hbWU6IGlucHV0LmFnZW50Lm5hbWUgfSxcbiAgICBzdWJzeXN0ZW06IFwic2FuZGJveDpsaWZlY3ljbGVcIixcbiAgICBjb250ZXh0OiB7IHNhbmRib3hJZDogaW5wdXQuc2FuZGJveElkIH0sXG4gIH0pO1xuXG4gIGxvZy5pbmZvKFwibGlmZWN5Y2xlIGNoZWNrIHN0YXJ0ZWRcIiwge1xuICAgIHZlcmNlbFNhbmRib3hJZDogaW5wdXQudmVyY2VsU2FuZGJveElkLFxuICB9KTtcblxuICBjb25zdCByZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlucHV0LnNhbmRib3hJZCk7XG4gIGlmICghcmVjb3JkKSB7XG4gICAgbG9nLndhcm4oXCJzYW5kYm94IHJlY29yZCBub3QgZm91bmQsIGV4aXRpbmcgbGlmZWN5Y2xlXCIpO1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgY29uc3QgbWV0YWRhdGEgPSByZWNvcmQuc2V0dXA/Lm1ldGFkYXRhIGFzIFZlcmNlbEJpbmRpbmdNZXRhZGF0YSB8IG51bGw7XG4gIGNvbnN0IGN1cnJlbnRTYW5kYm94SWQgPSBtZXRhZGF0YT8uc2FuZGJveElkID8/IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRTYW5kYm94SWQgIT09IGlucHV0LnZlcmNlbFNhbmRib3hJZCkge1xuICAgIGxvZy5pbmZvKFwic2FuZGJveCBJRCBjaGFuZ2VkLCBleGl0aW5nIGxpZmVjeWNsZVwiLCB7XG4gICAgICBleHBlY3RlZDogaW5wdXQudmVyY2VsU2FuZGJveElkLFxuICAgICAgYWN0dWFsOiBjdXJyZW50U2FuZGJveElkLFxuICAgIH0pO1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJzYW5kYm94SWRfY2hhbmdlZFwiIH07XG4gIH1cblxuICBpZiAoIWN1cnJlbnRTYW5kYm94SWQpIHtcbiAgICBsb2cud2FybihcIm5vIGN1cnJlbnQgc2FuZGJveCBJRCBpbiBtZXRhZGF0YSwgZXhpdGluZyBsaWZlY3ljbGVcIik7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBjb25zdCBwb2xsSW50ZXJ2YWxNcyA9XG4gICAgaW5wdXQuY29uZmlnPy5wb2xsSW50ZXJ2YWxNcyA/PyBERUZBVUxUX1BPTExfSU5URVJWQUxfTVM7XG4gIGNvbnN0IGlkbGVUaW1lb3V0TXMgPVxuICAgIGlucHV0LmNvbmZpZz8uc3RvcEFmdGVySW5hY3RpdmVNcyA/PyBERUZBVUxUX0lETEVfVElNRU9VVF9NUztcbiAgY29uc3Qgc25hcHNob3RCZWZvcmVUaW1lb3V0TXMgPVxuICAgIGlucHV0LmNvbmZpZz8uc25hcHNob3RCZWZvcmVUaW1lb3V0TXMgPz8gU05BUFNIT1RfQkVGT1JFX1RJTUVPVVRfTVM7XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgbGFzdEFjdGl2aXR5ID0gcmVjb3JkLmxhc3RBY3RpdmVBdCA/PyByZWNvcmQuY3JlYXRlZEF0ID8/IG5vdztcbiAgY29uc3QgaWRsZUR1cmF0aW9uID0gbm93IC0gbGFzdEFjdGl2aXR5O1xuICBjb25zdCBzaG91bGRTbmFwc2hvdER1ZVRvSWRsZSA9IGlkbGVEdXJhdGlvbiA+IGlkbGVUaW1lb3V0TXM7XG5cbiAgbGV0IHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0ID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgU2FuZGJveFNESyA9IGF3YWl0IGxvYWRTYW5kYm94U0RLKCk7XG4gICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFNhbmRib3hTREsuZ2V0KHtcbiAgICAgIHNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgIH0pO1xuICAgIGlmIChzYW5kYm94LnRpbWVvdXQgPCBzbmFwc2hvdEJlZm9yZVRpbWVvdXRNcykge1xuICAgICAgc2hvdWxkU25hcHNob3REdWVUb1RpbWVvdXQgPSB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgbG9nLndhcm4oXCJmYWlsZWQgdG8gZ2V0IHNhbmRib3ggZnJvbSBTREssIGV4aXRpbmcgbGlmZWN5Y2xlXCIsIHtcbiAgICAgIHZlcmNlbFNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICB9KTtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwibm90X2ZvdW5kXCIgfTtcbiAgfVxuXG4gIGlmIChzaG91bGRTbmFwc2hvdER1ZVRvSWRsZSB8fCBzaG91bGRTbmFwc2hvdER1ZVRvVGltZW91dCkge1xuICAgIGNvbnN0IHJlYXNvbiA9IHNob3VsZFNuYXBzaG90RHVlVG9JZGxlID8gXCJpZGxlXCIgOiBcInRpbWVvdXRcIjtcbiAgICBsb2cuaW5mbyhcInNuYXBzaG90dGluZyBzYW5kYm94IGJlZm9yZSBleGl0XCIsIHtcbiAgICAgIHJlYXNvbixcbiAgICAgIGlkbGVEdXJhdGlvbk1zOiBpZGxlRHVyYXRpb24sXG4gICAgICB2ZXJjZWxTYW5kYm94SWQ6IGN1cnJlbnRTYW5kYm94SWQsXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgU2FuZGJveFNESyA9IGF3YWl0IGxvYWRTYW5kYm94U0RLKCk7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgU2FuZGJveFNESy5nZXQoe1xuICAgICAgICBzYW5kYm94SWQ6IGN1cnJlbnRTYW5kYm94SWQsXG4gICAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHNhbmRib3guc25hcHNob3QoKTtcbiAgICAgIGxvZy5pbmZvKFwic25hcHNob3QgY3JlYXRlZFwiLCB7IHNuYXBzaG90SWQ6IHNuYXBzaG90LnNuYXBzaG90SWQgfSk7XG5cbiAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC51cGRhdGUoaW5wdXQuc2FuZGJveElkLCB7XG4gICAgICAgIHNldHVwOiB7XG4gICAgICAgICAgLi4ucmVjb3JkLnNldHVwLFxuICAgICAgICAgIG1ldGFkYXRhOiB7IHNhbmRib3hJZDogbnVsbCwgc25hcHNob3RJZDogc25hcHNob3Quc25hcHNob3RJZCB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBsb2cuaW5mbyhcInNhbmRib3ggcmVjb3JkIHVwZGF0ZWQgd2l0aCBzbmFwc2hvdFwiKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZXJyb3IoXCJmYWlsZWQgdG8gc25hcHNob3Qgc2FuZGJveFwiLCB7IGNhdXNlOiBlIH0pO1xuICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvciA/IGUgOiBuZXcgRXJyb3IoU3RyaW5nKGUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uIH07XG4gIH1cblxuICBsb2cuaW5mbyhcInNhbmRib3ggc3RpbGwgYWN0aXZlLCBjb250aW51aW5nIGxpZmVjeWNsZVwiLCB7XG4gICAgaWRsZUR1cmF0aW9uTXM6IGlkbGVEdXJhdGlvbixcbiAgICBuZXh0UG9sbE1zOiBwb2xsSW50ZXJ2YWxNcyxcbiAgfSk7XG4gIHJldHVybiB7IGFjdGlvbjogXCJjb250aW51ZVwiLCBuZXh0UG9sbE1zOiBwb2xsSW50ZXJ2YWxNcyB9O1xufVxuIiwgImltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIndvcmtmbG93XCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBjaGVja0FuZFNuYXBzaG90U3RlcCwgdHlwZSBMaWZlY3ljbGVJbnB1dCB9IGZyb20gXCIuL3N0ZXBzXCI7XG5cbmV4cG9ydCB0eXBlIHsgTGlmZWN5Y2xlSW5wdXQgfTtcblxuY29uc3QgREVGQVVMVF9QT0xMX01TID0gMiAqIDYwICogMTAwMDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhbmRib3hMaWZlY3ljbGVXb3JrZmxvdyh7XG4gIGlucHV0LFxufToge1xuICBpbnB1dDogTGlmZWN5Y2xlSW5wdXQ7XG59KSB7XG4gIFwidXNlIHdvcmtmbG93XCI7XG5cbiAgbGV0IG5leHRQb2xsTXMgPSBpbnB1dC5jb25maWc/LnBvbGxJbnRlcnZhbE1zID8/IERFRkFVTFRfUE9MTF9NUztcbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHsgLi4uaW5wdXQuYWdlbnQub3B0aW9ucy5sb2dnaW5nLCBuYW1lOiBpbnB1dC5hZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcInNhbmRib3g6bGlmZWN5Y2xlXCIsXG4gICAgY29udGV4dDogeyBzYW5kYm94SWQ6IGlucHV0LnNhbmRib3hJZCB9LFxuICB9KTtcblxuICBsb2cuaW5mbyhcImxpZmVjeWNsZSB3b3JrZmxvdyBzdGFydGVkXCIsIHtcbiAgICBzYW5kYm94SWQ6IGlucHV0LnNhbmRib3hJZCxcbiAgICB2ZXJjZWxTYW5kYm94SWQ6IGlucHV0LnZlcmNlbFNhbmRib3hJZCxcbiAgICBwb2xsTXM6IG5leHRQb2xsTXMsXG4gIH0pO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgYXdhaXQgc2xlZXAobmV4dFBvbGxNcyk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGVja0FuZFNuYXBzaG90U3RlcChpbnB1dCk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGxvZy5lcnJvcihcImxpZmVjeWNsZSBzdGVwIGZhaWxlZFwiLCB7XG4gICAgICAgIHNhbmRib3hJZDogaW5wdXQuc2FuZGJveElkLFxuICAgICAgICBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuYWN0aW9uID09PSBcImV4aXRcIikge1xuICAgICAgbG9nLmluZm8oXCJsaWZlY3ljbGUgd29ya2Zsb3cgZXhpdGluZ1wiLCB7XG4gICAgICAgIHNhbmRib3hJZDogaW5wdXQuc2FuZGJveElkLFxuICAgICAgICByZWFzb246IHJlc3VsdC5yZWFzb24sXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5leHRQb2xsTXMgPSByZXN1bHQubmV4dFBvbGxNcztcbiAgfVxufVxuIiwgImltcG9ydCB7IHN0YXJ0IGFzIHN0YXJ0V29ya2Zsb3cgfSBmcm9tIFwid29ya2Zsb3cvYXBpXCI7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vc3RvcmFnZVwiO1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IEV4ZWNSZXN1bHQsIFNhbmRib3hCaW5kaW5nLCBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBMaWZlY3ljbGVDb25maWcgfSBmcm9tIFwiLi92ZXJjZWwtbGlmZWN5Y2xlL3N0ZXBzXCI7XG5pbXBvcnQgeyBzYW5kYm94TGlmZWN5Y2xlV29ya2Zsb3cgfSBmcm9tIFwiLi92ZXJjZWwtbGlmZWN5Y2xlL3dvcmtmbG93XCI7XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRTYW5kYm94U0RLKCkge1xuICByZXR1cm4gKGF3YWl0IGltcG9ydChcIkB2ZXJjZWwvc2FuZGJveFwiKSkuU2FuZGJveDtcbn1cblxuY29uc3QgTUFYX1RJTUVPVVRfTVMgPSA1ICogNjAgKiA2MCAqIDEwMDA7IC8vIDUgaG91cnNcbmNvbnN0IEhPTUVfRElSID0gXCIvaG9tZS92ZXJjZWwtc2FuZGJveFwiO1xuY29uc3QgREVGQVVMVF9WQ1BVUyA9IDI7XG5cbmV4cG9ydCB0eXBlIFZlcmNlbEJpbmRpbmdDb25maWcgPSB7XG4gIGN3ZD86IHN0cmluZztcbiAgcmVzb3VyY2VzPzogeyB2Y3B1czogbnVtYmVyIH07XG4gIHBvcnRzPzogbnVtYmVyW107XG4gIG5ldHdvcmtQb2xpY3k/OiBpbXBvcnQoXCJAdmVyY2VsL3NhbmRib3hcIikuTmV0d29ya1BvbGljeTtcbiAgc25hcHNob3RJZD86IHN0cmluZztcbiAgbGlmZWN5Y2xlPzogTGlmZWN5Y2xlQ29uZmlnO1xufTtcblxuZXhwb3J0IHR5cGUgVmVyY2VsQmluZGluZ01ldGFkYXRhID0ge1xuICBzYW5kYm94SWQ6IHN0cmluZztcbn07XG5cbnR5cGUgQ3JlYXRlU2FuZGJveE9wdHMgPSB7XG4gIHJlc291cmNlczogeyB2Y3B1czogbnVtYmVyIH07XG4gIHBvcnRzPzogbnVtYmVyW107XG4gIG5ldHdvcmtQb2xpY3k/OiBpbXBvcnQoXCJAdmVyY2VsL3NhbmRib3hcIikuTmV0d29ya1BvbGljeTtcbiAgc25hcHNob3RJZD86IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIGlzU2FuZGJveEdvbmVFcnJvcihlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghKGUgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBzdGF0dXMgPVxuICAgIChlIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlciB9IH0pLnJlc3BvbnNlPy5zdGF0dXMgPz9cbiAgICAoZSBhcyB7IGNhdXNlPzogeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyIH0gfSB9KS5jYXVzZT8ucmVzcG9uc2VcbiAgICAgID8uc3RhdHVzO1xuXG4gIGlmIChzdGF0dXMgPT09IDQxMCB8fCBzdGF0dXMgPT09IDQyMikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgbXNnID0gZS5tZXNzYWdlIHx8IFN0cmluZyhlKTtcbiAgcmV0dXJuIChcbiAgICBtc2cuaW5jbHVkZXMoXCJFeHBlY3RlZCBhIHN0cmVhbSBvZiBjb21tYW5kIGRhdGFcIikgfHxcbiAgICBtc2cuaW5jbHVkZXMoXCJFeHBlY3RlZCBhIHN0cmVhbSBvZiBsb2dzXCIpXG4gICk7XG59XG5cbmNvbnN0IGdldFRlc3RDcmVkZW50aWFscyA9ICgpID0+XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIlxuICAgID8ge1xuICAgICAgICB0b2tlbjogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVE9LRU4sXG4gICAgICAgIHRlYW1JZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVEVBTV9JRCxcbiAgICAgICAgcHJvamVjdElkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9QUk9KRUNUX0lELFxuICAgICAgfVxuICAgIDoge307XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNkayh7XG4gIHJlc291cmNlcyxcbiAgcG9ydHMsXG4gIG5ldHdvcmtQb2xpY3ksXG4gIHNuYXBzaG90SWQsXG59OiBDcmVhdGVTYW5kYm94T3B0cykge1xuICBjb25zdCBTYW5kYm94U0RLID0gYXdhaXQgbG9hZFNhbmRib3hTREsoKTtcbiAgY29uc3QgYmFzZSA9IHtcbiAgICByZXNvdXJjZXMsXG4gICAgdGltZW91dDogTUFYX1RJTUVPVVRfTVMsXG4gICAgLi4uKHBvcnRzID8geyBwb3J0cyB9IDoge30pLFxuICAgIC4uLihuZXR3b3JrUG9saWN5ID8geyBuZXR3b3JrUG9saWN5IH0gOiB7fSksXG4gICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gIH07XG5cbiAgaWYgKHNuYXBzaG90SWQpIHtcbiAgICByZXR1cm4gU2FuZGJveFNESy5jcmVhdGUoe1xuICAgICAgLi4uYmFzZSxcbiAgICAgIHNvdXJjZTogeyB0eXBlOiBcInNuYXBzaG90XCIgYXMgY29uc3QsIHNuYXBzaG90SWQgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBTYW5kYm94U0RLLmNyZWF0ZShiYXNlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2V0dXBTbmFwc2hvdCh7XG4gIHNhbmRib3hPcHRzLFxuICBydW4sXG4gIHN0b3JhZ2UsXG4gIHNuYXBzaG90VmVyc2lvbixcbiAgbG9nLFxufToge1xuICBzYW5kYm94T3B0czogQ3JlYXRlU2FuZGJveE9wdHM7XG4gIHJ1bjogKHNhbmRib3g6IFNhbmRib3hJbnN0YW5jZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgc3RvcmFnZTogU3RvcmFnZTtcbiAgc25hcHNob3RWZXJzaW9uOiBzdHJpbmc7XG4gIGxvZzogTG9nZ2VyO1xufSk6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgdGVtcFNkazogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVTZGs+PiB8IG51bGwgPSBudWxsO1xuICB0cnkge1xuICAgIHRlbXBTZGsgPSBhd2FpdCBjcmVhdGVTZGsoc2FuZGJveE9wdHMpO1xuICAgIGNvbnN0IHRlbXBJbnN0YW5jZSA9IG5ldyBWZXJjZWxTYW5kYm94SW5zdGFuY2UodGVtcFNkayk7XG4gICAgYXdhaXQgcnVuKHRlbXBJbnN0YW5jZSk7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0ZW1wU2RrLnNuYXBzaG90KCk7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXR1cC5zZXQoc25hcHNob3RWZXJzaW9uLCB7XG4gICAgICB2ZXJzaW9uOiBzbmFwc2hvdFZlcnNpb24sXG4gICAgICBzbmFwc2hvdElkOiBzbmFwc2hvdC5zbmFwc2hvdElkLFxuICAgICAgY3JlYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgbGFzdFVzZWRBdDogbnVsbCxcbiAgICB9KTtcbiAgICBhd2FpdCB0ZW1wU2RrLnN0b3AoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy5lcnJvcihcImZhaWxlZCB0byBjcmVhdGUgc2V0dXAgc25hcHNob3RcIiwge1xuICAgICAgc25hcHNob3RWZXJzaW9uLFxuICAgICAgY2F1c2U6IGVycm9yLFxuICAgIH0pO1xuICAgIGlmICh0ZW1wU2RrKSB7XG4gICAgICBhd2FpdCB0ZW1wU2RrLnN0b3AoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBWZXJjZWxTYW5kYm94SW5zdGFuY2UgaW1wbGVtZW50cyBTYW5kYm94SW5zdGFuY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IHNkazogaW1wb3J0KFwiQHZlcmNlbC9zYW5kYm94XCIpLlNhbmRib3g7XG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNkazogaW1wb3J0KFwiQHZlcmNlbC9zYW5kYm94XCIpLlNhbmRib3gsIGN3ZD86IHN0cmluZykge1xuICAgIHRoaXMuc2RrID0gc2RrO1xuICAgIHRoaXMuY3dkID0gY3dkID8/IEhPTUVfRElSO1xuICB9XG5cbiAgYXN5bmMgZXhlYyh7XG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIGN3ZCxcbiAgICBlbnYsXG4gICAgc3VkbyxcbiAgICBzaWduYWwsXG4gIH06IHtcbiAgICBjb21tYW5kOiBzdHJpbmc7XG4gICAgYXJncz86IHN0cmluZ1tdO1xuICAgIGN3ZD86IHN0cmluZztcbiAgICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHN1ZG8/OiBib29sZWFuO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxFeGVjUmVzdWx0PiB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgdGhpcy5zZGsucnVuQ29tbWFuZCh7XG4gICAgICBjbWQ6IGNvbW1hbmQsXG4gICAgICBhcmdzLFxuICAgICAgY3dkOiBjd2QgPz8gdGhpcy5jd2QsXG4gICAgICBlbnYsXG4gICAgICBzdWRvLFxuICAgICAgc2lnbmFsLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICBsZXQgc3Rkb3V0ID0gXCJcIjtcbiAgICBsZXQgc3RkZXJyID0gXCJcIjtcbiAgICBjb25zdCBsb2dCdWZmZXI6IHsgc3RyZWFtOiBcInN0ZG91dFwiIHwgXCJzdGRlcnJcIjsgZGF0YTogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgcmVzb2x2ZTogbnVsbCBhcyAoKCkgPT4gdm9pZCkgfCBudWxsLFxuICAgICAgY29uc3VtZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBjb25zdCBjb25zdW1lTG9ncyA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGVudHJ5IG9mIG91dHB1dC5sb2dzKCkpIHtcbiAgICAgICAgICBpZiAoZW50cnkuc3RyZWFtID09PSBcInN0ZG91dFwiKSB7XG4gICAgICAgICAgICBzdGRvdXQgKz0gZW50cnkuZGF0YTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RkZXJyICs9IGVudHJ5LmRhdGE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbG9nQnVmZmVyLnB1c2goZW50cnkpO1xuICAgICAgICAgIHN0YXRlLnJlc29sdmU/LigpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU2FuZGJveCBtYXkgaGF2ZSBiZWVuIHN0b3BwZWQgXHUyMDE0IGxvZ3MgZW5kcG9pbnQgcmV0dXJucyA0MjJcbiAgICAgIH1cbiAgICAgIHN0YXRlLmNvbnN1bWVkID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlc29sdmU/LigpO1xuICAgIH0pKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiogbG9ncygpOiBBc3luY0l0ZXJhYmxlPHtcbiAgICAgIHN0cmVhbTogXCJzdGRvdXRcIiB8IFwic3RkZXJyXCI7XG4gICAgICBkYXRhOiBzdHJpbmc7XG4gICAgfT4ge1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIHdoaWxlICghc3RhdGUuY29uc3VtZWQgfHwgaW5kZXggPCBsb2dCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgIGlmIChpbmRleCA8IGxvZ0J1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICB5aWVsZCBsb2dCdWZmZXJbaW5kZXgrK107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHIpID0+IHtcbiAgICAgICAgICAgIHN0YXRlLnJlc29sdmUgPSByO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHN0YXRlLnJlc29sdmUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29uc3VtZUxvZ3MudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmaW5pc2hlZCA9IGF3YWl0IG91dHB1dC53YWl0KCk7XG4gICAgICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyLCBleGl0Q29kZTogZmluaXNoZWQuZXhpdENvZGUgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGlzU2FuZGJveEdvbmVFcnJvcihlKSkge1xuICAgICAgICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyLCBleGl0Q29kZTogMSB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBjb21tYW5kSWQ6IG91dHB1dC5jbWRJZCwgbG9ncywgcmVzdWx0IH07XG4gIH1cblxuICBhc3luYyByZWFkRmlsZSh7XG4gICAgcGF0aDogZmlsZVBhdGgsXG4gIH06IHtcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2RrLnJlYWRGaWxlVG9CdWZmZXIoeyBwYXRoOiBmaWxlUGF0aCwgY3dkOiB0aGlzLmN3ZCB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHdyaXRlRmlsZXMoe1xuICAgIGZpbGVzLFxuICAgIGRlc3RQYXRoLFxuICB9OiB7XG4gICAgZmlsZXM6IHsgcGF0aDogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfCBCdWZmZXIgfVtdO1xuICAgIGRlc3RQYXRoOiBzdHJpbmc7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IGltcG9ydChcIm5vZGU6cGF0aFwiKTtcbiAgICBjb25zdCBuYXRpdmVGaWxlcyA9IGZpbGVzLm1hcCgoZmlsZSkgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnBvc2l4LmpvaW4oZGVzdFBhdGgsIGZpbGUucGF0aCk7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnBvc2l4LmlzQWJzb2x1dGUoZmlsZVBhdGgpXG4gICAgICAgID8gZmlsZVBhdGhcbiAgICAgICAgOiBwYXRoLnBvc2l4LmpvaW4odGhpcy5jd2QsIGZpbGVQYXRoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGg6IGFic29sdXRlUGF0aCxcbiAgICAgICAgY29udGVudDpcbiAgICAgICAgICB0eXBlb2YgZmlsZS5jb250ZW50ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICA/IEJ1ZmZlci5mcm9tKGZpbGUuY29udGVudClcbiAgICAgICAgICAgIDogZmlsZS5jb250ZW50LFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMuc2RrLndyaXRlRmlsZXMobmF0aXZlRmlsZXMpO1xuXG4gICAgY29uc3Qgc2hlbGxTY3JpcHRzID0gbmF0aXZlRmlsZXMuZmlsdGVyKChmKSA9PiBmLnBhdGguZW5kc1dpdGgoXCIuc2hcIikpO1xuICAgIGlmIChzaGVsbFNjcmlwdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjKHtcbiAgICAgICAgY29tbWFuZDogXCJjaG1vZFwiLFxuICAgICAgICBhcmdzOiBbXCIreFwiLCAuLi5zaGVsbFNjcmlwdHMubWFwKChmKSA9PiBmLnBhdGgpXSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgcmVzdWx0LnJlc3VsdDtcbiAgICB9XG4gIH1cblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL3VzZUF3YWl0OiBzeW5jaHJvbm91cyBTREsgY2FsbFxuICBhc3luYyBnZXREb21haW4oe1xuICAgIHBvcnQsXG4gIH06IHtcbiAgICBwb3J0OiBudW1iZXI7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnNkay5kb21haW4ocG9ydCk7XG4gIH1cblxuICBhc3luYyBraWxsKHtcbiAgICBjb21tYW5kSWQsXG4gIH06IHtcbiAgICBjb21tYW5kSWQ6IHN0cmluZztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNtZCA9IGF3YWl0IHRoaXMuc2RrLmdldENvbW1hbmQoY29tbWFuZElkKTtcbiAgICBhd2FpdCBjbWQua2lsbCgpO1xuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy91c2VBd2FpdDogc3luY2hyb25vdXMgU0RLIGdldHRlclxuICBhc3luYyBnZXRTdGF0dXMoKTogUHJvbWlzZTxcbiAgICBcInBlbmRpbmdcIiB8IFwicnVubmluZ1wiIHwgXCJzdG9wcGluZ1wiIHwgXCJzdG9wcGVkXCIgfCBcImZhaWxlZFwiXG4gID4ge1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuc2RrLnN0YXR1cztcbiAgICAvLyBNYXAgU0RLLW9ubHkgc3RhdHVzZXMgdG8gb3VyIGludGVyZmFjZSdzIHVuaW9uXG4gICAgaWYgKHN0YXR1cyA9PT0gXCJzbmFwc2hvdHRpbmdcIikge1xuICAgICAgcmV0dXJuIFwic3RvcHBpbmdcIjtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgIHJldHVybiBcImZhaWxlZFwiO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdHVzO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVGhlIFZlcmNlbCBTREsgZG9lc24ndCBoYXZlIGEgcmVzdW1lIG1ldGhvZC5cbiAgICAvLyBSdW4gYSBuby1vcCBjb21tYW5kIHRvIHZlcmlmeSB0aGUgc2FuZGJveCBpcyByZWFjaGFibGUuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjKHsgY29tbWFuZDogXCJ0cnVlXCIgfSk7XG4gICAgYXdhaXQgcmVzdWx0LnJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZGsuc3RvcCgpO1xuICB9XG5cbiAgYXN5bmMgc25hcHNob3QoKTogUHJvbWlzZTx7IHNuYXBzaG90SWQ6IHN0cmluZyB9PiB7XG4gICAgY29uc3Qgc25hcCA9IGF3YWl0IHRoaXMuc2RrLnNuYXBzaG90KCk7XG4gICAgcmV0dXJuIHsgc25hcHNob3RJZDogc25hcC5zbmFwc2hvdElkIH07XG4gIH1cblxuICBhc3luYyB1cGRhdGVOZXR3b3JrUG9saWN5KHtcbiAgICBwb2xpY3ksXG4gIH06IHtcbiAgICBwb2xpY3k6IGltcG9ydChcIkB2ZXJjZWwvc2FuZGJveFwiKS5OZXR3b3JrUG9saWN5O1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxpbXBvcnQoXCJAdmVyY2VsL3NhbmRib3hcIikuTmV0d29ya1BvbGljeT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnNkay51cGRhdGVOZXR3b3JrUG9saWN5KHBvbGljeSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlcmNlbFNhbmRib3goXG4gIGRlZmF1bHRzPzogUGFydGlhbDxpbXBvcnQoXCIuLi9hZGFwdGVyXCIpLlNhbmRib3hTZXR1cEZpZWxkcz4gJiB7XG4gICAgcnVuPzogKHNhbmRib3g6IFNhbmRib3hJbnN0YW5jZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBjb25maWc/OiBWZXJjZWxCaW5kaW5nQ29uZmlnO1xuICB9XG4pOiBTYW5kYm94QmluZGluZzxcInZlcmNlbFwiLCBWZXJjZWxCaW5kaW5nQ29uZmlnLCBWZXJjZWxCaW5kaW5nTWV0YWRhdGE+IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcInZlcmNlbFwiLFxuICAgIGRlZmF1bHRzLFxuICAgIGFzeW5jIGNyZWF0ZSh7IGFnZW50LCBzZXR1cCwgcmVjb3JkLCBzaWduYWw6IF9zaWduYWwsIGxvZyB9KSB7XG4gICAgICBjb25zdCBzdG9yYWdlID0gYWdlbnQuc3RvcmFnZTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHNldHVwLmNvbmZpZyA/PyB7fTtcbiAgICAgIGNvbnN0IGN3ZCA9IGNvbmZpZy5jd2Q7XG4gICAgICBjb25zdCByZXNvdXJjZXMgPSBjb25maWcucmVzb3VyY2VzID8/IHsgdmNwdXM6IERFRkFVTFRfVkNQVVMgfTtcbiAgICAgIGNvbnN0IHBvcnRzID0gY29uZmlnLnBvcnRzO1xuICAgICAgY29uc3QgbmV0d29ya1BvbGljeSA9XG4gICAgICAgIGNvbmZpZy5uZXR3b3JrUG9saWN5ID8/IHNldHVwLm5ldHdvcmtQb2xpY3kgPz8gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBzYW5kYm94T3B0czogQ3JlYXRlU2FuZGJveE9wdHMgPSB7XG4gICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgcG9ydHMsXG4gICAgICAgIG5ldHdvcmtQb2xpY3ksXG4gICAgICAgIHNuYXBzaG90SWQ6IGNvbmZpZy5zbmFwc2hvdElkLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgX3N0YXJ0TGlmZWN5Y2xlID0gKHZlcmNlbFNhbmRib3hJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICghcmVjb3JkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0V29ya2Zsb3coc2FuZGJveExpZmVjeWNsZVdvcmtmbG93LCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgICAgYWdlbnQsXG4gICAgICAgICAgICAgIHNhbmRib3hJZDogcmVjb3JkLmlkLFxuICAgICAgICAgICAgICB2ZXJjZWxTYW5kYm94SWQsXG4gICAgICAgICAgICAgIGNvbmZpZzogY29uZmlnLmxpZmVjeWNsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICBsb2cuZXJyb3IoXCJmYWlsZWQgdG8gc3RhcnQgbGlmZWN5Y2xlIHdvcmtmbG93XCIsIHsgY2F1c2U6IGUgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgaWYgKHNldHVwLnZlcnNpb24pIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNldHVwLmdldChzZXR1cC52ZXJzaW9uKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nPy5zbmFwc2hvdElkKSB7XG4gICAgICAgICAgY29uc3Qgc2RrID0gYXdhaXQgY3JlYXRlU2RrKHtcbiAgICAgICAgICAgIC4uLnNhbmRib3hPcHRzLFxuICAgICAgICAgICAgc25hcHNob3RJZDogZXhpc3Rpbmcuc25hcHNob3RJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBWZXJjZWxTYW5kYm94SW5zdGFuY2Uoc2RrLCBjd2QpO1xuXG4gICAgICAgICAgc3RvcmFnZS5zZXR1cFxuICAgICAgICAgICAgLnNldChzZXR1cC52ZXJzaW9uLCB7XG4gICAgICAgICAgICAgIC4uLmV4aXN0aW5nLFxuICAgICAgICAgICAgICB2ZXJzaW9uOiBzZXR1cC52ZXJzaW9uLFxuICAgICAgICAgICAgICBsYXN0VXNlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHsgc2FuZGJveElkOiBzZGsuc2FuZGJveElkIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2V0dXAucnVuKSB7XG4gICAgICAgIGlmICghc2V0dXAudmVyc2lvbikge1xuICAgICAgICAgIGxvZy5lcnJvcihcInNldHVwLnJ1biBwcm92aWRlZCB3aXRob3V0IHNldHVwLnZlcnNpb25cIiwgeyBzZXR1cCB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXR1cC5ydW4gcHJvdmlkZWQgd2l0aG91dCBzZXR1cC52ZXJzaW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNyZWF0ZVNldHVwU25hcHNob3Qoe1xuICAgICAgICAgIHNhbmRib3hPcHRzLFxuICAgICAgICAgIHJ1bjogc2V0dXAucnVuLFxuICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgc25hcHNob3RWZXJzaW9uOiBzZXR1cC52ZXJzaW9uLFxuICAgICAgICAgIGxvZyxcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgbG9nLmVycm9yKFwiYmFja2dyb3VuZCBzZXR1cCBzbmFwc2hvdCBmYWlsZWRcIiwgeyBjYXVzZTogZXJyb3IgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNkayA9IGF3YWl0IGNyZWF0ZVNkayhzYW5kYm94T3B0cyk7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFZlcmNlbFNhbmRib3hJbnN0YW5jZShzZGssIGN3ZCk7XG4gICAgICAgIGF3YWl0IHNldHVwLnJ1bihpbnN0YW5jZSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICBtZXRhZGF0YTogeyBzYW5kYm94SWQ6IHNkay5zYW5kYm94SWQgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2RrID0gYXdhaXQgY3JlYXRlU2RrKHNhbmRib3hPcHRzKTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFZlcmNlbFNhbmRib3hJbnN0YW5jZShzZGssIGN3ZCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBtZXRhZGF0YTogeyBzYW5kYm94SWQ6IHNkay5zYW5kYm94SWQgfSxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIGFzeW5jIGNvbm5lY3QoeyBtZXRhZGF0YSB9KSB7XG4gICAgICBjb25zdCBTYW5kYm94U0RLID0gYXdhaXQgbG9hZFNhbmRib3hTREsoKTtcbiAgICAgIGNvbnN0IHNkayA9IGF3YWl0IFNhbmRib3hTREsuZ2V0KHtcbiAgICAgICAgc2FuZGJveElkOiBtZXRhZGF0YS5zYW5kYm94SWQsXG4gICAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IFZlcmNlbFNhbmRib3hJbnN0YW5jZShzZGspO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgdHlwZSB7IEV4ZWNSZXN1bHQsIFNhbmRib3hCaW5kaW5nLCBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuXG5leHBvcnQgdHlwZSBEb2NrZXJCaW5kaW5nQ29uZmlnID0ge1xuICBjd2Q/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEb2NrZXJCaW5kaW5nTWV0YWRhdGEgPSB7XG4gIHNhbmRib3hOYW1lOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFJ1biBhIGBkb2NrZXIgc2FuZGJveGAgQ0xJIGNvbW1hbmQgYW5kIHJldHVybiBpdHMgb3V0cHV0LlxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjRG9ja2VyKFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgb3B0cz86IHsgdGltZW91dE1zPzogbnVtYmVyOyBzaWduYWw/OiBBYm9ydFNpZ25hbCB9XG4pOiBQcm9taXNlPHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nOyBleGl0Q29kZTogbnVtYmVyIH0+IHtcbiAgY29uc3QgeyBzcGF3biB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oXCJkb2NrZXJcIiwgW1wic2FuZGJveFwiLCAuLi5hcmdzXSwge1xuICAgICAgc2lnbmFsOiBvcHRzPy5zaWduYWwsXG4gICAgfSk7XG5cbiAgICBsZXQgc3Rkb3V0ID0gXCJcIjtcbiAgICBsZXQgc3RkZXJyID0gXCJcIjtcblxuICAgIGNoaWxkLnN0ZG91dC5vbihcImRhdGFcIiwgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgc3Rkb3V0ICs9IGRhdGEudG9TdHJpbmcoKTtcbiAgICB9KTtcbiAgICBjaGlsZC5zdGRlcnIub24oXCJkYXRhXCIsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgIHN0ZGVyciArPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0aW1lb3V0SWQgPSBvcHRzPy50aW1lb3V0TXNcbiAgICAgID8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY2hpbGQua2lsbChcIlNJR1RFUk1cIik7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgZG9ja2VyIHNhbmRib3ggJHthcmdzWzBdfSB0aW1lZCBvdXRgKSk7XG4gICAgICAgIH0sIG9wdHMudGltZW91dE1zKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgIGlmICh0aW1lb3V0SWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICB9XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGUpID0+IHtcbiAgICAgIGlmICh0aW1lb3V0SWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlOiBjb2RlID8/IDAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRyYWNrIHdoaWNoIHNhbmRib3hlcyBoYXZlIGJlZW4gdmVyaWZpZWQgdG8gZXhpc3QgaW4gdGhpcyBwcm9jZXNzLlxuICogTWFwcyBzYW5kYm94IG5hbWUgLT4gUHJvbWlzZSBzbyBjb25jdXJyZW50IGNhbGxlcnMgd2FpdCBvbiB0aGUgc2FtZSBjaGVjay5cbiAqL1xuY29uc3QgZW5zdXJlUHJvbWlzZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKTtcblxuLyoqXG4gKiBTYW5kYm94ZXMgdGhhdCB0aGlzIHByb2Nlc3MgaGFzIHVzZWQuIFN0b3BwZWQgb24gcHJvY2VzcyBleGl0LlxuICovXG5jb25zdCBhY3RpdmVTYW5kYm94ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxubGV0IGNsZWFudXBSZWdpc3RlcmVkID0gZmFsc2U7XG5sZXQgX2V4ZWNTeW5jOiB0eXBlb2YgaW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLmV4ZWNTeW5jIHwgbnVsbCA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZ2lzdGVyQ2xlYW51cCgpIHtcbiAgaWYgKGNsZWFudXBSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNsZWFudXBSZWdpc3RlcmVkID0gdHJ1ZTtcblxuICAvLyBQcmUtbG9hZCBleGVjU3luYyBzbyB0aGUgc3luY2hyb25vdXMgZXhpdCBoYW5kbGVyIGNhbiB1c2UgaXQuXG4gIGNvbnN0IGNwID0gYXdhaXQgaW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpO1xuICBfZXhlY1N5bmMgPSBjcC5leGVjU3luYztcblxuICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgIGlmICghX2V4ZWNTeW5jKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgbmFtZSBvZiBBcnJheS5mcm9tKGFjdGl2ZVNhbmRib3hlcykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIF9leGVjU3luYyhgZG9ja2VyIHNhbmRib3ggc3RvcCAke25hbWV9YCwge1xuICAgICAgICAgIHRpbWVvdXQ6IDEwXzAwMCxcbiAgICAgICAgICBzdGRpbzogXCJwaXBlXCIsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEJlc3QtZWZmb3J0IFx1MjAxNCBzYW5kYm94IG1heSBhbHJlYWR5IGJlIHN0b3BwZWRcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcHJvY2Vzcy5vbihcImV4aXRcIiwgY2xlYW51cCk7XG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4ge1xuICAgIGNsZWFudXAoKTtcbiAgICBwcm9jZXNzLmV4aXQoMTMwKTtcbiAgfSk7XG4gIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsICgpID0+IHtcbiAgICBjbGVhbnVwKCk7XG4gICAgcHJvY2Vzcy5leGl0KDE0Myk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEVuc3VyZSBhIERvY2tlciBzYW5kYm94IGV4aXN0cyBmb3IgdGhlIGdpdmVuIG5hbWUuXG4gKiBJZiBpdCBhbHJlYWR5IGV4aXN0cyAoZnJvbSBhIHByZXZpb3VzIHByb2Nlc3MpLCByZXVzZXMgaXQuXG4gKiBJZiBpdCBkb2Vzbid0IGV4aXN0LCBjcmVhdGVzIGl0LlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVTYW5kYm94KHNhbmRib3hOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXhpc3RpbmcgPSBlbnN1cmVQcm9taXNlcy5nZXQoc2FuZGJveE5hbWUpO1xuICBpZiAoZXhpc3RpbmcpIHtcbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cblxuICBjb25zdCBwcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBscyA9IGF3YWl0IGV4ZWNEb2NrZXIoW1wibHNcIiwgXCItcVwiXSwgeyB0aW1lb3V0TXM6IDEwXzAwMCB9KTtcbiAgICBjb25zdCBleGlzdGluZ05hbWVzID1cbiAgICAgIGxzLmV4aXRDb2RlID09PSAwXG4gICAgICAgID8gbHMuc3Rkb3V0XG4gICAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAgIC5tYXAoKHMpID0+IHMudHJpbSgpKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICA6IFtdO1xuXG4gICAgaWYgKGV4aXN0aW5nTmFtZXMuaW5jbHVkZXMoc2FuZGJveE5hbWUpKSB7XG4gICAgICBhY3RpdmVTYW5kYm94ZXMuYWRkKHNhbmRib3hOYW1lKTtcbiAgICAgIHJlZ2lzdGVyQ2xlYW51cCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBhd2FpdCBpbXBvcnQoXCJub2RlOnBhdGhcIik7XG4gICAgY29uc3Qgb3MgPSBhd2FpdCBpbXBvcnQoXCJub2RlOm9zXCIpO1xuICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcblxuICAgIGNvbnN0IHdvcmtzcGFjZURpciA9IHBhdGguam9pbihcbiAgICAgIG9zLnRtcGRpcigpLFxuICAgICAgXCJhZ2VudC1kb2NrZXItc2FuZGJveFwiLFxuICAgICAgc2FuZGJveE5hbWVcbiAgICApO1xuICAgIGF3YWl0IGZzLm1rZGlyKHdvcmtzcGFjZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCBjcmVhdGUgPSBhd2FpdCBleGVjRG9ja2VyKFxuICAgICAgW1wiY3JlYXRlXCIsIFwiLS1uYW1lXCIsIHNhbmRib3hOYW1lLCBcInNoZWxsXCIsIHdvcmtzcGFjZURpcl0sXG4gICAgICB7IHRpbWVvdXRNczogNjBfMDAwIH1cbiAgICApO1xuXG4gICAgaWYgKGNyZWF0ZS5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgaWYgKGNyZWF0ZS5zdGRlcnIuaW5jbHVkZXMoXCJhbHJlYWR5IGV4aXN0c1wiKSkge1xuICAgICAgICBhY3RpdmVTYW5kYm94ZXMuYWRkKHNhbmRib3hOYW1lKTtcbiAgICAgICAgcmVnaXN0ZXJDbGVhbnVwKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgZG9ja2VyIHNhbmRib3ggXCIke3NhbmRib3hOYW1lfVwiOiAke2NyZWF0ZS5zdGRlcnJ9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBhY3RpdmVTYW5kYm94ZXMuYWRkKHNhbmRib3hOYW1lKTtcbiAgICByZWdpc3RlckNsZWFudXAoKTtcbiAgfSkoKTtcblxuICBlbnN1cmVQcm9taXNlcy5zZXQoc2FuZGJveE5hbWUsIHByb21pc2UpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgcHJvbWlzZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGVuc3VyZVByb21pc2VzLmRlbGV0ZShzYW5kYm94TmFtZSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufVxuXG5jb25zdCBERUZBVUxUX0RPQ0tFUl9DV0QgPSBcIi9ob21lL2FnZW50L3dvcmtzcGFjZVwiO1xuXG5jbGFzcyBEb2NrZXJTYW5kYm94SW5zdGFuY2UgaW1wbGVtZW50cyBTYW5kYm94SW5zdGFuY2Uge1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzYW5kYm94TmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb2Nlc3NlcyA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIGltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKS5DaGlsZFByb2Nlc3NcbiAgPigpO1xuXG4gIGNvbnN0cnVjdG9yKHNhbmRib3hOYW1lOiBzdHJpbmcsIGN3ZD86IHN0cmluZykge1xuICAgIHRoaXMuc2FuZGJveE5hbWUgPSBzYW5kYm94TmFtZTtcbiAgICB0aGlzLmN3ZCA9IGN3ZCA/PyBERUZBVUxUX0RPQ0tFUl9DV0Q7XG4gIH1cblxuICBhc3luYyBleGVjKG9wdHM6IHtcbiAgICBjb21tYW5kOiBzdHJpbmc7XG4gICAgYXJncz86IHN0cmluZ1tdO1xuICAgIGN3ZD86IHN0cmluZztcbiAgICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHN1ZG8/OiBib29sZWFuO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxFeGVjUmVzdWx0PiB7XG4gICAgYXdhaXQgZW5zdXJlU2FuZGJveCh0aGlzLnNhbmRib3hOYW1lKTtcblxuICAgIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKTtcbiAgICBjb25zdCBjb21tYW5kSWQgPSBgY29tbWFuZF8ke3VsaWQoKX1gO1xuICAgIGNvbnN0IGVudkZsYWdzID0gb3B0cy5lbnZcbiAgICAgID8gT2JqZWN0LmVudHJpZXMob3B0cy5lbnYpLmZsYXRNYXAoKFtrLCB2XSkgPT4gW1wiLWVcIiwgYCR7a309JHt2fWBdKVxuICAgICAgOiBbXTtcbiAgICBjb25zdCBjd2RGbGFncyA9IG9wdHMuY3dkID8gW1wiLXdcIiwgb3B0cy5jd2RdIDogW107XG4gICAgbGV0IGJhc2VDbWQ6IHN0cmluZ1tdO1xuICAgIGlmIChvcHRzLnN1ZG8pIHtcbiAgICAgIGJhc2VDbWQgPSBbXCJzdWRvXCIsIG9wdHMuY29tbWFuZCwgLi4uKG9wdHMuYXJncyA/PyBbXSldO1xuICAgIH0gZWxzZSBpZiAob3B0cy5hcmdzKSB7XG4gICAgICBiYXNlQ21kID0gW29wdHMuY29tbWFuZCwgLi4ub3B0cy5hcmdzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFzZUNtZCA9IFtvcHRzLmNvbW1hbmRdO1xuICAgIH1cbiAgICBjb25zdCBmdWxsQ21kID0gYmFzZUNtZDtcblxuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oXG4gICAgICBcImRvY2tlclwiLFxuICAgICAgW1xuICAgICAgICBcInNhbmRib3hcIixcbiAgICAgICAgXCJleGVjXCIsXG4gICAgICAgIC4uLmVudkZsYWdzLFxuICAgICAgICAuLi5jd2RGbGFncyxcbiAgICAgICAgdGhpcy5zYW5kYm94TmFtZSxcbiAgICAgICAgLi4uZnVsbENtZCxcbiAgICAgIF0sXG4gICAgICB7IHNpZ25hbDogb3B0cy5zaWduYWwgfVxuICAgICk7XG5cbiAgICB0aGlzLnByb2Nlc3Nlcy5zZXQoY29tbWFuZElkLCBjaGlsZCk7XG5cbiAgICBsZXQgc3Rkb3V0ID0gXCJcIjtcbiAgICBsZXQgc3RkZXJyID0gXCJcIjtcbiAgICBjb25zdCBsb2dRdWV1ZTogeyBzdHJlYW06IFwic3Rkb3V0XCIgfCBcInN0ZGVyclwiOyBkYXRhOiBzdHJpbmcgfVtdID0gW107XG4gICAgbGV0IGxvZ1Jlc29sdmU6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjbG9zZWQgPSBmYWxzZTtcblxuICAgIGNoaWxkLnN0ZG91dC5vbihcImRhdGFcIiwgKGRhdGE6IHN0cmluZyB8IEJ1ZmZlcikgPT4ge1xuICAgICAgY29uc3Qgc3RyID0gU3RyaW5nKGRhdGEpO1xuICAgICAgc3Rkb3V0ICs9IHN0cjtcbiAgICAgIGxvZ1F1ZXVlLnB1c2goeyBzdHJlYW06IFwic3Rkb3V0XCIsIGRhdGE6IHN0ciB9KTtcbiAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgIH0pO1xuXG4gICAgY2hpbGQuc3RkZXJyLm9uKFwiZGF0YVwiLCAoZGF0YTogc3RyaW5nIHwgQnVmZmVyKSA9PiB7XG4gICAgICBjb25zdCBzdHIgPSBTdHJpbmcoZGF0YSk7XG4gICAgICBzdGRlcnIgKz0gc3RyO1xuICAgICAgbG9nUXVldWUucHVzaCh7IHN0cmVhbTogXCJzdGRlcnJcIiwgZGF0YTogc3RyIH0pO1xuICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgUHJvbWlzZTx7XG4gICAgICBzdGRvdXQ6IHN0cmluZztcbiAgICAgIHN0ZGVycjogc3RyaW5nO1xuICAgICAgZXhpdENvZGU6IG51bWJlcjtcbiAgICB9PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5wcm9jZXNzZXMuZGVsZXRlKGNvbW1hbmRJZCk7XG4gICAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgICBjaGlsZC5vbihcImNsb3NlXCIsIChjb2RlOiBudW1iZXIgfCBudWxsKSA9PiB7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VzLmRlbGV0ZShjb21tYW5kSWQpO1xuICAgICAgICBjbG9zZWQgPSB0cnVlO1xuICAgICAgICBsb2dSZXNvbHZlPy4oKTtcbiAgICAgICAgcmVzb2x2ZSh7IHN0ZG91dCwgc3RkZXJyLCBleGl0Q29kZTogY29kZSA/PyAwIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiogbG9ncygpOiBBc3luY0l0ZXJhYmxlPHtcbiAgICAgIHN0cmVhbTogXCJzdGRvdXRcIiB8IFwic3RkZXJyXCI7XG4gICAgICBkYXRhOiBzdHJpbmc7XG4gICAgfT4ge1xuICAgICAgd2hpbGUgKCFjbG9zZWQgfHwgbG9nUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IGxvZ1F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHlpZWxkIGVudHJ5O1xuICAgICAgICB9IGVsc2UgaWYgKCFjbG9zZWQpIHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocikgPT4ge1xuICAgICAgICAgICAgbG9nUmVzb2x2ZSA9IHI7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbG9nUmVzb2x2ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBjb21tYW5kSWQsIGxvZ3MsIHJlc3VsdCB9O1xuICB9XG5cbiAgYXN5bmMgcmVhZEZpbGUob3B0czoge1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgIGF3YWl0IGVuc3VyZVNhbmRib3godGhpcy5zYW5kYm94TmFtZSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjRG9ja2VyKFxuICAgICAgW1xuICAgICAgICBcImV4ZWNcIixcbiAgICAgICAgdGhpcy5zYW5kYm94TmFtZSxcbiAgICAgICAgXCJiYXNoXCIsXG4gICAgICAgIFwiLWNcIixcbiAgICAgICAgYGJhc2U2NCAnJHtvcHRzLnBhdGgucmVwbGFjZSgvJy9nLCBcIidcXFxcJydcIil9J2AsXG4gICAgICBdLFxuICAgICAgeyB0aW1lb3V0TXM6IDMwXzAwMCwgc2lnbmFsOiBvcHRzLnNpZ25hbCB9XG4gICAgKTtcblxuICAgIGlmIChyZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICAgIGlmIChcbiAgICAgICAgcmVzdWx0LnN0ZGVyci5pbmNsdWRlcyhcIk5vIHN1Y2ggZmlsZVwiKSB8fFxuICAgICAgICByZXN1bHQuc3RkZXJyLmluY2x1ZGVzKFwiRU5PRU5UXCIpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlYWRGaWxlIGZhaWxlZDogJHtyZXN1bHQuc3RkZXJyfWApO1xuICAgIH1cblxuICAgIHJldHVybiBCdWZmZXIuZnJvbShyZXN1bHQuc3Rkb3V0LnRyaW0oKSwgXCJiYXNlNjRcIik7XG4gIH1cblxuICBhc3luYyB3cml0ZUZpbGVzKG9wdHM6IHtcbiAgICBmaWxlczogeyBwYXRoOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB8IEJ1ZmZlciB9W107XG4gICAgZGVzdFBhdGg6IHN0cmluZztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGVuc3VyZVNhbmRib3godGhpcy5zYW5kYm94TmFtZSk7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2Ygb3B0cy5maWxlcykge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBvcHRzLmRlc3RQYXRoXG4gICAgICAgID8gYCR7b3B0cy5kZXN0UGF0aH0vJHtmaWxlLnBhdGh9YFxuICAgICAgICA6IGZpbGUucGF0aDtcblxuICAgICAgLy8gRW5zdXJlIHBhcmVudCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBjb25zdCBwYXJlbnREaXIgPSBmdWxsUGF0aC5zdWJzdHJpbmcoMCwgZnVsbFBhdGgubGFzdEluZGV4T2YoXCIvXCIpKTtcbiAgICAgIGlmIChwYXJlbnREaXIpIHtcbiAgICAgICAgYXdhaXQgZXhlY0RvY2tlcihbXCJleGVjXCIsIHRoaXMuc2FuZGJveE5hbWUsIFwibWtkaXJcIiwgXCItcFwiLCBwYXJlbnREaXJdLCB7XG4gICAgICAgICAgc2lnbmFsOiBvcHRzLnNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdyaXRlIHZpYSBiYXNlNjQgdG8gaGFuZGxlIGJvdGggdGV4dCBhbmQgYmluYXJ5IGNvbnRlbnRcbiAgICAgIGNvbnN0IGI2NCA9XG4gICAgICAgIHR5cGVvZiBmaWxlLmNvbnRlbnQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IEJ1ZmZlci5mcm9tKGZpbGUuY29udGVudCkudG9TdHJpbmcoXCJiYXNlNjRcIilcbiAgICAgICAgICA6IGZpbGUuY29udGVudC50b1N0cmluZyhcImJhc2U2NFwiKTtcblxuICAgICAgYXdhaXQgZXhlY0RvY2tlcihcbiAgICAgICAgW1xuICAgICAgICAgIFwiZXhlY1wiLFxuICAgICAgICAgIHRoaXMuc2FuZGJveE5hbWUsXG4gICAgICAgICAgXCJiYXNoXCIsXG4gICAgICAgICAgXCItY1wiLFxuICAgICAgICAgIGBlY2hvICcke2I2NH0nIHwgYmFzZTY0IC1kID4gJyR7ZnVsbFBhdGgucmVwbGFjZSgvJy9nLCBcIidcXFxcJydcIil9J2AsXG4gICAgICAgIF0sXG4gICAgICAgIHsgc2lnbmFsOiBvcHRzLnNpZ25hbCB9XG4gICAgICApO1xuXG4gICAgICBpZiAoZmlsZS5wYXRoLmVuZHNXaXRoKFwiLnNoXCIpKSB7XG4gICAgICAgIGF3YWl0IGV4ZWNEb2NrZXIoW1wiZXhlY1wiLCB0aGlzLnNhbmRib3hOYW1lLCBcImNobW9kXCIsIFwiK3hcIiwgZnVsbFBhdGhdLCB7XG4gICAgICAgICAgc2lnbmFsOiBvcHRzLnNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy91c2VBd2FpdDogLlxuICBhc3luYyBnZXREb21haW4ob3B0czoge1xuICAgIHBvcnQ6IG51bWJlcjtcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGBodHRwOi8vbG9jYWxob3N0OiR7b3B0cy5wb3J0fWA7XG4gIH1cblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL3VzZUF3YWl0OiAuXG4gIGFzeW5jIGtpbGwob3B0czogeyBjb21tYW5kSWQ6IHN0cmluZzsgc2lnbmFsPzogQWJvcnRTaWduYWwgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNoaWxkID0gdGhpcy5wcm9jZXNzZXMuZ2V0KG9wdHMuY29tbWFuZElkKTtcbiAgICBpZiAoY2hpbGQpIHtcbiAgICAgIGNoaWxkLmtpbGwoXCJTSUdURVJNXCIpO1xuICAgICAgdGhpcy5wcm9jZXNzZXMuZGVsZXRlKG9wdHMuY29tbWFuZElkKTtcbiAgICB9XG4gIH1cblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL3VzZUF3YWl0OiAuXG4gIGFzeW5jIGdldFN0YXR1cygpOiBQcm9taXNlPFxuICAgIFwicGVuZGluZ1wiIHwgXCJydW5uaW5nXCIgfCBcInN0b3BwaW5nXCIgfCBcInN0b3BwZWRcIiB8IFwiZmFpbGVkXCJcbiAgPiB7XG4gICAgLy8gZG9ja2VyIHNhbmRib3ggQ0xJIGRvZXNuJ3QgZXhwb3NlIHN0YXR1cyBcdTIwMTQgYXNzdW1lIHJ1bm5pbmcgaWYgZW5zdXJlZFxuICAgIHJldHVybiBcInJ1bm5pbmdcIjtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGVuc3VyZVNhbmRib3godGhpcy5zYW5kYm94TmFtZSk7XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGV4ZWNEb2NrZXIoW1wic3RvcFwiLCB0aGlzLnNhbmRib3hOYW1lXSwgeyB0aW1lb3V0TXM6IDMwXzAwMCB9KTtcbiAgICBhY3RpdmVTYW5kYm94ZXMuZGVsZXRlKHRoaXMuc2FuZGJveE5hbWUpO1xuICAgIGVuc3VyZVByb21pc2VzLmRlbGV0ZSh0aGlzLnNhbmRib3hOYW1lKTtcbiAgfVxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlQXdhaXQ6IC5cbiAgYXN5bmMgc25hcHNob3QoKTogUHJvbWlzZTx7IHNuYXBzaG90SWQ6IHN0cmluZyB9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic25hcHNob3QgaXMgbm90IHN1cHBvcnRlZCBmb3IgZG9ja2VyIHNhbmRib3hlc1wiKTtcbiAgfVxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlQXdhaXQ6IC5cbiAgYXN5bmMgdXBkYXRlTmV0d29ya1BvbGljeSgpOiBQcm9taXNlPG5ldmVyPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJ1cGRhdGVOZXR3b3JrUG9saWN5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRvY2tlciBzYW5kYm94ZXNcIlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvY2tlclNhbmRib3goXG4gIGRlZmF1bHRzPzogUGFydGlhbDxpbXBvcnQoXCIuLi9hZGFwdGVyXCIpLlNhbmRib3hTZXR1cEZpZWxkcz4gJiB7XG4gICAgcnVuPzogKHNhbmRib3g6IFNhbmRib3hJbnN0YW5jZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBjb25maWc/OiBEb2NrZXJCaW5kaW5nQ29uZmlnO1xuICB9XG4pOiBTYW5kYm94QmluZGluZzxcImRvY2tlclwiLCBEb2NrZXJCaW5kaW5nQ29uZmlnLCBEb2NrZXJCaW5kaW5nTWV0YWRhdGE+IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcImRvY2tlclwiLFxuICAgIGRlZmF1bHRzLFxuICAgIGFzeW5jIGNyZWF0ZShvcHRzKSB7XG4gICAgICBjb25zdCBzYW5kYm94TmFtZSA9IGBhZ2VudC0ke3VsaWQoKX1gO1xuICAgICAgY29uc3QgY3dkID0gb3B0cy5zZXR1cD8uY29uZmlnPy5jd2Q7XG5cbiAgICAgIGF3YWl0IGVuc3VyZVNhbmRib3goc2FuZGJveE5hbWUpO1xuXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBEb2NrZXJTYW5kYm94SW5zdGFuY2Uoc2FuZGJveE5hbWUsIGN3ZCk7XG5cbiAgICAgIGlmIChvcHRzLnNldHVwPy5ydW4pIHtcbiAgICAgICAgYXdhaXQgb3B0cy5zZXR1cC5ydW4oaW5zdGFuY2UpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgbWV0YWRhdGE6IHsgc2FuZGJveE5hbWUgfSxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlQXdhaXQ6IC5cbiAgICBhc3luYyBjb25uZWN0KG9wdHMpIHtcbiAgICAgIHJldHVybiBuZXcgRG9ja2VyU2FuZGJveEluc3RhbmNlKG9wdHMubWV0YWRhdGEuc2FuZGJveE5hbWUpO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgdHlwZSB7IEV4ZWNSZXN1bHQsIFNhbmRib3hCaW5kaW5nLCBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuXG5leHBvcnQgdHlwZSBMb2NhbEJpbmRpbmdDb25maWcgPSB7XG4gIGN3ZD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIExvY2FsQmluZGluZ01ldGFkYXRhID0ge1xuICBiYXNlUGF0aDogc3RyaW5nO1xuICBwaWQ6IG51bWJlcjtcbn07XG5cbmNsYXNzIExvY2FsU2FuZGJveEluc3RhbmNlIGltcGxlbWVudHMgU2FuZGJveEluc3RhbmNlIHtcbiAgcmVhZG9ubHkgY3dkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFzZVBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9jZXNzZXMgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICBpbXBvcnQoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIikuQ2hpbGRQcm9jZXNzXG4gID4oKTtcblxuICBjb25zdHJ1Y3RvcihiYXNlUGF0aDogc3RyaW5nKSB7XG4gICAgdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuICAgIHRoaXMuY3dkID0gYmFzZVBhdGg7XG4gIH1cblxuICBhc3luYyBleGVjKG9wdHM6IHtcbiAgICBjb21tYW5kOiBzdHJpbmc7XG4gICAgYXJncz86IHN0cmluZ1tdO1xuICAgIGN3ZD86IHN0cmluZztcbiAgICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHN1ZG8/OiBib29sZWFuO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxFeGVjUmVzdWx0PiB7XG4gICAgY29uc3QgeyBzcGF3biB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpO1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCBpbXBvcnQoXCJub2RlOnBhdGhcIik7XG4gICAgY29uc3QgY29tbWFuZElkID0gYGNvbW1hbmRfJHt1bGlkKCl9YDtcblxuICAgIGNvbnN0IGZpbmFsQ21kID0gb3B0cy5zdWRvID8gXCJzdWRvXCIgOiBvcHRzLmNvbW1hbmQ7XG4gICAgY29uc3QgZmluYWxBcmdzID0gb3B0cy5zdWRvXG4gICAgICA/IFtvcHRzLmNvbW1hbmQsIC4uLihvcHRzLmFyZ3MgPz8gW10pXVxuICAgICAgOiAob3B0cy5hcmdzID8/IFtdKTtcblxuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oZmluYWxDbWQsIGZpbmFsQXJncywge1xuICAgICAgY3dkOiBvcHRzLmN3ZCA/IHBhdGgucmVzb2x2ZSh0aGlzLmJhc2VQYXRoLCBvcHRzLmN3ZCkgOiB0aGlzLmJhc2VQYXRoLFxuICAgICAgZW52OiBvcHRzLmVudiA/IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLm9wdHMuZW52IH0gOiB1bmRlZmluZWQsXG4gICAgICBzaWduYWw6IG9wdHMuc2lnbmFsLFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9jZXNzZXMuc2V0KGNvbW1hbmRJZCwgY2hpbGQpO1xuXG4gICAgbGV0IHN0ZG91dCA9IFwiXCI7XG4gICAgbGV0IHN0ZGVyciA9IFwiXCI7XG4gICAgY29uc3QgbG9nUXVldWU6IHsgc3RyZWFtOiBcInN0ZG91dFwiIHwgXCJzdGRlcnJcIjsgZGF0YTogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGxldCBsb2dSZXNvbHZlOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY2xvc2VkID0gZmFsc2U7XG5cbiAgICBjaGlsZC5zdGRvdXQub24oXCJkYXRhXCIsIChkYXRhOiBzdHJpbmcgfCBCdWZmZXIpID0+IHtcbiAgICAgIGNvbnN0IHN0ciA9IFN0cmluZyhkYXRhKTtcbiAgICAgIHN0ZG91dCArPSBzdHI7XG4gICAgICBsb2dRdWV1ZS5wdXNoKHsgc3RyZWFtOiBcInN0ZG91dFwiLCBkYXRhOiBzdHIgfSk7XG4gICAgICBsb2dSZXNvbHZlPy4oKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLnN0ZGVyci5vbihcImRhdGFcIiwgKGRhdGE6IHN0cmluZyB8IEJ1ZmZlcikgPT4ge1xuICAgICAgY29uc3Qgc3RyID0gU3RyaW5nKGRhdGEpO1xuICAgICAgc3RkZXJyICs9IHN0cjtcbiAgICAgIGxvZ1F1ZXVlLnB1c2goeyBzdHJlYW06IFwic3RkZXJyXCIsIGRhdGE6IHN0ciB9KTtcbiAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFByb21pc2U8e1xuICAgICAgc3Rkb3V0OiBzdHJpbmc7XG4gICAgICBzdGRlcnI6IHN0cmluZztcbiAgICAgIGV4aXRDb2RlOiBudW1iZXI7XG4gICAgfT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY2hpbGQub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VzLmRlbGV0ZShjb21tYW5kSWQpO1xuICAgICAgICBjbG9zZWQgPSB0cnVlO1xuICAgICAgICBsb2dSZXNvbHZlPy4oKTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcblxuICAgICAgY2hpbGQub24oXCJjbG9zZVwiLCAoY29kZTogbnVtYmVyIHwgbnVsbCkgPT4ge1xuICAgICAgICB0aGlzLnByb2Nlc3Nlcy5kZWxldGUoY29tbWFuZElkKTtcbiAgICAgICAgY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgICAgIHJlc29sdmUoeyBzdGRvdXQsIHN0ZGVyciwgZXhpdENvZGU6IGNvZGUgPz8gMCB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24qIGxvZ3MoKTogQXN5bmNJdGVyYWJsZTx7XG4gICAgICBzdHJlYW06IFwic3Rkb3V0XCIgfCBcInN0ZGVyclwiO1xuICAgICAgZGF0YTogc3RyaW5nO1xuICAgIH0+IHtcbiAgICAgIHdoaWxlICghY2xvc2VkIHx8IGxvZ1F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBsb2dRdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB5aWVsZCBlbnRyeTtcbiAgICAgICAgfSBlbHNlIGlmICghY2xvc2VkKSB7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHIpID0+IHtcbiAgICAgICAgICAgIGxvZ1Jlc29sdmUgPSByO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGxvZ1Jlc29sdmUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29tbWFuZElkLCBsb2dzLCByZXN1bHQgfTtcbiAgfVxuXG4gIGFzeW5jIHJlYWRGaWxlKG9wdHM6IHtcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIik7XG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IGltcG9ydChcIm5vZGU6cGF0aFwiKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLmJhc2VQYXRoLCBvcHRzLnBhdGgpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnMucmVhZEZpbGUoZnVsbFBhdGgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChcbiAgICAgICAgZSBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgIFwiY29kZVwiIGluIGUgJiZcbiAgICAgICAgKGUgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSBcIkVOT0VOVFwiXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHdyaXRlRmlsZXMob3B0czoge1xuICAgIGZpbGVzOiB7IHBhdGg6IHN0cmluZzsgY29udGVudDogc3RyaW5nIHwgQnVmZmVyIH1bXTtcbiAgICBkZXN0UGF0aDogc3RyaW5nO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICAgIGNvbnN0IHBhdGhNb2QgPSBhd2FpdCBpbXBvcnQoXCJub2RlOnBhdGhcIik7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIG9wdHMuZmlsZXMpIHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aE1vZC5yZXNvbHZlKHRoaXMuYmFzZVBhdGgsIG9wdHMuZGVzdFBhdGgsIGZpbGUucGF0aCk7XG4gICAgICBhd2FpdCBmcy5ta2RpcihwYXRoTW9kLmRpcm5hbWUoZnVsbFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShmdWxsUGF0aCwgZmlsZS5jb250ZW50KTtcbiAgICAgIGlmIChmaWxlLnBhdGguZW5kc1dpdGgoXCIuc2hcIikpIHtcbiAgICAgICAgYXdhaXQgZnMuY2htb2QoZnVsbFBhdGgsIDBvNzU1KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL3VzZUF3YWl0OiAuXG4gIGFzeW5jIGdldERvbWFpbihvcHRzOiB7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtvcHRzLnBvcnR9YDtcbiAgfVxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlQXdhaXQ6IC5cbiAgYXN5bmMga2lsbChvcHRzOiB7IGNvbW1hbmRJZDogc3RyaW5nOyBzaWduYWw/OiBBYm9ydFNpZ25hbCB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2hpbGQgPSB0aGlzLnByb2Nlc3Nlcy5nZXQob3B0cy5jb21tYW5kSWQpO1xuICAgIGlmIChjaGlsZCkge1xuICAgICAgY2hpbGQua2lsbChcIlNJR1RFUk1cIik7XG4gICAgICB0aGlzLnByb2Nlc3Nlcy5kZWxldGUob3B0cy5jb21tYW5kSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlQXdhaXQ6IC5cbiAgYXN5bmMgZ2V0U3RhdHVzKCk6IFByb21pc2U8XCJydW5uaW5nXCI+IHtcbiAgICByZXR1cm4gXCJydW5uaW5nXCI7XG4gIH1cblxuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBuby1vcDogbG9jYWwgc2FuZGJveCBpcyBhbHdheXMgc3RhcnRlZFxuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy91c2VBd2FpdDogLlxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRocm93IG5ldyBFcnJvcihcInN0b3AgaXMgbm90IHN1cHBvcnRlZCBmb3IgbG9jYWwgc2FuZGJveGVzXCIpO1xuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy91c2VBd2FpdDogLlxuICBhc3luYyBzbmFwc2hvdCgpOiBQcm9taXNlPHsgc25hcHNob3RJZDogc3RyaW5nIH0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzbmFwc2hvdCBpcyBub3Qgc3VwcG9ydGVkIGZvciBsb2NhbCBzYW5kYm94ZXNcIik7XG4gIH1cblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL3VzZUF3YWl0OiAuXG4gIGFzeW5jIHVwZGF0ZU5ldHdvcmtQb2xpY3koKTogUHJvbWlzZTxuZXZlcj4ge1xuICAgIHRocm93IG5ldyBFcnJvcihcInVwZGF0ZU5ldHdvcmtQb2xpY3kgaXMgbm90IHN1cHBvcnRlZCBmb3IgbG9jYWwgc2FuZGJveGVzXCIpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2NhbFNhbmRib3goXG4gIGRlZmF1bHRzPzogUGFydGlhbDxpbXBvcnQoXCIuLi9hZGFwdGVyXCIpLlNhbmRib3hTZXR1cEZpZWxkcz4gJiB7XG4gICAgcnVuPzogKHNhbmRib3g6IFNhbmRib3hJbnN0YW5jZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBjb25maWc/OiBMb2NhbEJpbmRpbmdDb25maWc7XG4gIH1cbik6IFNhbmRib3hCaW5kaW5nPFwibG9jYWxcIiwgTG9jYWxCaW5kaW5nQ29uZmlnLCBMb2NhbEJpbmRpbmdNZXRhZGF0YT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwibG9jYWxcIixcbiAgICBkZWZhdWx0cyxcbiAgICBhc3luYyBjcmVhdGUob3B0cykge1xuICAgICAgY29uc3QgYmFzZVBhdGggPSBvcHRzLnNldHVwLmNvbmZpZz8uY3dkID8/IHByb2Nlc3MuY3dkKCk7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBMb2NhbFNhbmRib3hJbnN0YW5jZShiYXNlUGF0aCk7XG5cbiAgICAgIGlmIChvcHRzLnNldHVwPy5ydW4pIHtcbiAgICAgICAgYXdhaXQgb3B0cy5zZXR1cC5ydW4oaW5zdGFuY2UpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgbWV0YWRhdGE6IHsgYmFzZVBhdGgsIHBpZDogcHJvY2Vzcy5waWQgfSxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlQXdhaXQ6IC5cbiAgICBhc3luYyBjb25uZWN0KG9wdHMpIHtcbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gb3B0cy5tZXRhZGF0YS5iYXNlUGF0aDtcbiAgICAgIHJldHVybiBuZXcgTG9jYWxTYW5kYm94SW5zdGFuY2UoYmFzZVBhdGgpO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFeGVjUmVzdWx0IH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9XQUlUX1VOVElMID0gMjAwMDtcblxudHlwZSBTYW5kYm94SGFuZGxlID0ge1xuICBleGVjOiAob3B0czogeyBjb21tYW5kOiBzdHJpbmc7IGFyZ3M/OiBzdHJpbmdbXSB9KSA9PiBQcm9taXNlPEV4ZWNSZXN1bHQ+O1xuICB3cml0ZUZpbGVzOiAob3B0czoge1xuICAgIGZpbGVzOiB7IHBhdGg6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH1bXTtcbiAgICBkZXN0UGF0aDogc3RyaW5nO1xuICB9KSA9PiBQcm9taXNlPHZvaWQ+O1xufTtcblxudHlwZSBCYXNoUmVzdWx0ID0ge1xuICBjb21tYW5kSWQ6IHN0cmluZztcbiAgc3Rkb3V0OiBzdHJpbmc7XG4gIHN0ZGVycjogc3RyaW5nO1xuICBleGl0Q29kZTogbnVtYmVyO1xuICBzdGF0dXM6IFwicnVubmluZ1wiIHwgXCJjb21wbGV0ZWRcIiB8IFwiZmFpbGVkXCI7XG4gIG91dHB1dERpcjogc3RyaW5nO1xufTtcblxudHlwZSBSdW5PcHRpb25zID0ge1xuICBjb21tYW5kOiBzdHJpbmc7XG4gIHdhaXRVbnRpbD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQcm9jZXNzTWFuYWdlciA9IChvcHRzOiB7IHNhbmRib3g6IFNhbmRib3hIYW5kbGUgfSkgPT4ge1xuICBjb25zdCB7IHNhbmRib3ggfSA9IG9wdHM7XG5cbiAgY29uc3QgcnVuID0gYXN5bmMgKHJ1bk9wdHM6IFJ1bk9wdGlvbnMpOiBQcm9taXNlPEJhc2hSZXN1bHQ+ID0+IHtcbiAgICBjb25zdCB7IGNvbW1hbmQsIHdhaXRVbnRpbCA9IERFRkFVTFRfV0FJVF9VTlRJTCB9ID0gcnVuT3B0cztcblxuICAgIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgY29tbWFuZDogXCJzaFwiLFxuICAgICAgYXJnczogW1wiLWNcIiwgY29tbWFuZF0sXG4gICAgfSk7XG5cbiAgICBpZiAod2FpdFVudGlsID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kSWQ6IGV4ZWNSZXN1bHQuY29tbWFuZElkLFxuICAgICAgICBzdGRvdXQ6IFwiXCIsXG4gICAgICAgIHN0ZGVycjogXCJcIixcbiAgICAgICAgZXhpdENvZGU6IC0xLFxuICAgICAgICBzdGF0dXM6IFwicnVubmluZ1wiLFxuICAgICAgICBvdXRwdXREaXI6IFwiXCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBsZXRlZCA9IGF3YWl0IHJhY2VUaW1lb3V0KGV4ZWNSZXN1bHQsIHdhaXRVbnRpbCk7XG5cbiAgICBpZiAoIWNvbXBsZXRlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZElkOiBleGVjUmVzdWx0LmNvbW1hbmRJZCxcbiAgICAgICAgc3Rkb3V0OiBcIlwiLFxuICAgICAgICBzdGRlcnI6IFwiXCIsXG4gICAgICAgIGV4aXRDb2RlOiAtMSxcbiAgICAgICAgc3RhdHVzOiBcInJ1bm5pbmdcIixcbiAgICAgICAgb3V0cHV0RGlyOiBcIlwiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXREaXIgPSBgLmFnZW50L2Jhc2gvJHtEYXRlLm5vdygpfS0ke2V4ZWNSZXN1bHQuY29tbWFuZElkfWA7XG4gICAgd3JpdGVPdXRwdXREaXIoc2FuZGJveCwgb3V0cHV0RGlyLCBjb21wbGV0ZWQsIGNvbW1hbmQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbW1hbmRJZDogZXhlY1Jlc3VsdC5jb21tYW5kSWQsXG4gICAgICBzdGRvdXQ6IGNvbXBsZXRlZC5zdGRvdXQsXG4gICAgICBzdGRlcnI6IGNvbXBsZXRlZC5zdGRlcnIsXG4gICAgICBleGl0Q29kZTogY29tcGxldGVkLmV4aXRDb2RlLFxuICAgICAgc3RhdHVzOiBjb21wbGV0ZWQuZXhpdENvZGUgPT09IDAgPyBcImNvbXBsZXRlZFwiIDogXCJmYWlsZWRcIixcbiAgICAgIG91dHB1dERpcixcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiB7IHJ1biB9O1xufTtcblxuYXN5bmMgZnVuY3Rpb24gcmFjZVRpbWVvdXQoXG4gIGV4ZWNSZXN1bHQ6IEV4ZWNSZXN1bHQsXG4gIHRpbWVvdXRNczogbnVtYmVyXG4pOiBQcm9taXNlPHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nOyBleGl0Q29kZTogbnVtYmVyIH0gfCBudWxsPiB7XG4gIGNvbnN0IFRJTUVEX09VVCA9IFN5bWJvbChcInRpbWVvdXRcIik7XG4gIGNvbnN0IHRpbWVyID0gbmV3IFByb21pc2U8dHlwZW9mIFRJTUVEX09VVD4oKHJlc29sdmUpID0+XG4gICAgc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKFRJTUVEX09VVCksIHRpbWVvdXRNcylcbiAgKTtcbiAgY29uc3Qgd2lubmVyID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtleGVjUmVzdWx0LnJlc3VsdCwgdGltZXJdKTtcbiAgcmV0dXJuIHdpbm5lciA9PT0gVElNRURfT1VUID8gbnVsbCA6IHdpbm5lcjtcbn1cblxuZnVuY3Rpb24gd3JpdGVPdXRwdXREaXIoXG4gIHNhbmRib3g6IFNhbmRib3hIYW5kbGUsXG4gIGRpcjogc3RyaW5nLFxuICByZXN1bHQ6IHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nOyBleGl0Q29kZTogbnVtYmVyIH0sXG4gIGNvbW1hbmQ6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IGZpbGVzOiB7IHBhdGg6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH1bXSA9IFtcbiAgICB7IHBhdGg6IFwic3Rkb3V0LnR4dFwiLCBjb250ZW50OiByZXN1bHQuc3Rkb3V0IH0sXG4gICAge1xuICAgICAgcGF0aDogXCJtZXRhZGF0YS5qc29uXCIsXG4gICAgICBjb250ZW50OiBKU09OLnN0cmluZ2lmeSh7IGV4aXRDb2RlOiByZXN1bHQuZXhpdENvZGUsIGNvbW1hbmQgfSwgbnVsbCwgMiksXG4gICAgfSxcbiAgXTtcbiAgaWYgKHJlc3VsdC5zdGRlcnIpIHtcbiAgICBmaWxlcy5wdXNoKHsgcGF0aDogXCJzdGRlcnIudHh0XCIsIGNvbnRlbnQ6IHJlc3VsdC5zdGRlcnIgfSk7XG4gIH1cblxuICBzYW5kYm94LndyaXRlRmlsZXMoeyBmaWxlcywgZGVzdFBhdGg6IGRpciB9KS5jYXRjaCgoKSA9PiB7XG4gICAgLy8gaW50ZW50aW9uYWwgbm8tb3AgXHUyMDE0IG91dHB1dCBmaWxlIHdyaXRlIGlzIGJlc3QtZWZmb3J0XG4gIH0pO1xufVxuIiwgIi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBZ2VudCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIHR5cGUgQWdlbnREYXRhVHlwZXMsXG4gIHR5cGUgQWdlbnRIb29rcyxcbiAgdHlwZSBBZ2VudE9wdGlvbnMsXG4gIEFnZW50U3RhdHVzLFxuICB0eXBlIEFueUFnZW50LFxuICBhZ2VudCxcbiAgdHlwZSBJbmZlclNlc3Npb24sXG4gIHR5cGUgSW5mZXJVSU1lc3NhZ2UsXG4gIHR5cGUgTmVlZHNBcHByb3ZhbE1hcCxcbiAgdHlwZSBSZXNvbHZhYmxlLFxuICB0eXBlIFJlc29sdmFibGVBcmdzLFxuICB0eXBlIFNlc3Npb25EZWZhdWx0cyxcbiAgdHlwZSBTZXNzaW9uU2VuZEFyZ3MsXG59IGZyb20gXCIuL2FnZW50L2NsaWVudFwiO1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgRXJyb3JzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHtcbiAgTWVzc2FnZU5vdEZvdW5kRXJyb3IsXG4gIFNhbmRib3hFcnJvcixcbiAgU2FuZGJveE5vdEZvdW5kRXJyb3IsXG4gIFNlc3Npb25Ob3RGb3VuZEVycm9yLFxuICBTdG9yYWdlQ29uZmxpY3RFcnJvcixcbiAgU3RvcmFnZUVycm9yLFxufSBmcm9tIFwiLi9lcnJvcnNcIjtcbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTYW5kYm94IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHR5cGUge1xuICBFeGVjUmVzdWx0LFxuICBTYW5kYm94QWdlbnRSZWYsXG4gIFNhbmRib3hCaW5kaW5nLFxuICBTYW5kYm94SW5zdGFuY2UsXG4gIFNhbmRib3hTZXR1cEZpZWxkcyxcbiAgVXBsb2FkYWJsZUZpbGUsXG59IGZyb20gXCIuL3NhbmRib3gvYWRhcHRlclwiO1xuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFNlc3Npb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQgdHlwZSB7IEFwcHJvdmFsRGF0YSwgU2VuZElucHV0IH0gZnJvbSBcIi4vc2Vzc2lvbi9zZW5kXCI7XG5leHBvcnQgdHlwZSB7IFdvcmtmbG93UnVuTGlrZSB9IGZyb20gXCIuL3Nlc3Npb24vc3RyZWFtXCI7XG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgU2tpbGxzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IHR5cGUge1xuICBHaXRTa2lsbEVudHJ5LFxuICBHaXRTa2lsbElucHV0LFxuICBIb3N0U2tpbGxFbnRyeSxcbiAgSG9zdFNraWxsSW5wdXQsXG4gIElubGluZVNraWxsRW50cnksXG4gIElubGluZVNraWxsSW5wdXQsXG4gIFNhbmRib3hTa2lsbEVudHJ5LFxuICBTYW5kYm94U2tpbGxJbnB1dCxcbiAgU2tpbGxFbnRyeSxcbiAgU2tpbGxJbnB1dCxcbiAgU2tpbGxTb3VyY2VUeXBlLFxufSBmcm9tIFwiLi9za2lsbHMvdHlwZXNcIjtcbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBUb29scyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbmV4cG9ydCB7XG4gIHR5cGUgQnVpbHRJblRvb2xOYW1lLFxuICBidWlsdGluVG9vbE5hbWVzLFxuICB0eXBlIFRvb2xDb250ZXh0LFxufSBmcm9tIFwiLi90b29sc1wiO1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgVXNhZ2UgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5leHBvcnQgdHlwZSB7IFN0ZXBVc2FnZSwgVXNhZ2VTdW1tYXJ5IH0gZnJvbSBcIi4vdXRpbHMvdXNhZ2VcIjtcbiIsICJpbXBvcnQgeyBXT1JLRkxPV19ERVNFUklBTElaRSwgV09SS0ZMT1dfU0VSSUFMSVpFIH0gZnJvbSBcIkB3b3JrZmxvdy9zZXJkZVwiO1xuaW1wb3J0IHR5cGUgeyBHYXRld2F5TW9kZWxJZCwgSW5mZXJVSVRvb2xzLCBUb29sU2V0LCBVSU1lc3NhZ2UgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveEJpbmRpbmcsIFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuLi9zYW5kYm94L2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveENvbnRleHQgfSBmcm9tIFwiLi4vc2FuZGJveC9oYW5kbGVcIjtcbmltcG9ydCB7IHNhbmRib3hIYW5kbGUgfSBmcm9tIFwiLi4vc2FuZGJveC9oYW5kbGVcIjtcbmltcG9ydCB7IHR5cGUgU2Vzc2lvbkNvbnRleHQsIHNlc3Npb25IYW5kbGUgfSBmcm9tIFwiLi4vc2Vzc2lvbi9oYW5kbGVcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxJbnB1dCB9IGZyb20gXCIuLi9za2lsbHMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgU3RvcmFnZSwgdHlwZSBTdG9yYWdlSW5wdXQsIHRvU3RvcmFnZSB9IGZyb20gXCIuLi9zdG9yYWdlL2FkYXB0ZXJcIjtcbmltcG9ydCB7IGt2U3RvcmFnZUZhbGxiYWNrIH0gZnJvbSBcIi4uL3N0b3JhZ2UvYmluZGluZ3Mva3ZcIjtcbmltcG9ydCB7IGxvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9zdG9yYWdlL2VudHJ5XCI7XG5pbXBvcnQgeyBzaG91bGRGYWxsYmFja1RvS1YyIH0gZnJvbSBcIi4uL3N0b3JhZ2Uvc2hvdWxkLWZhbGxiYWNrLWt2MlwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0aW9uT3B0aW9ucyB9IGZyb20gXCIuLi9zdG9yYWdlL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIEJ1aWx0SW5Ub29sTmFtZSwgYnVpbHRJblRvb2xzIH0gZnJvbSBcIi4uL3Rvb2xzXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dpbmdDb25maWcgfSBmcm9tIFwiLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEFnZW50RGF0YVR5cGVzLFxuICB0eXBlIEFnZW50SG9va3MsXG4gIGdldEFnZW50LFxuICB0eXBlIE5lZWRzQXBwcm92YWxNYXAsXG4gIHJlZ2lzdGVyQWdlbnQsXG59IGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBSZXNvbHZhYmxlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQgdHlwZSBSZXNvbHZhYmxlQXJnczxcbiAgVENvbnRleHQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgVG9vbHMgZXh0ZW5kcyBUb29sU2V0ID0gVG9vbFNldCxcbj4gPSB7XG4gIGNvbnRleHQ6IFRDb250ZXh0O1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBtZXNzYWdlczogVUlNZXNzYWdlPHVua25vd24sIEFnZW50RGF0YVR5cGVzLCBJbmZlclVJVG9vbHM8VG9vbHM+PltdO1xufTtcblxuZXhwb3J0IHR5cGUgUmVzb2x2YWJsZTxcbiAgVCxcbiAgVENvbnRleHQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgVG9vbHMgZXh0ZW5kcyBUb29sU2V0ID0gVG9vbFNldCxcbj4gPSBUIHwgKChhcmdzOiBSZXNvbHZhYmxlQXJnczxUQ29udGV4dCwgVG9vbHM+KSA9PiBUIHwgUHJvbWlzZTxUPik7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTZXNzaW9uIERlZmF1bHRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQgdHlwZSBTZXNzaW9uRGVmYXVsdHM8XG4gIFRvb2xzIGV4dGVuZHMgVG9vbFNldCA9IFRvb2xTZXQsXG4gIFRDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbj4gPSB7XG4gIG1vZGVsPzogUmVzb2x2YWJsZTxHYXRld2F5TW9kZWxJZCB8IHVuZGVmaW5lZCwgVENvbnRleHQsIFRvb2xzPjtcbiAgc3lzdGVtPzogUmVzb2x2YWJsZTxzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCwgVENvbnRleHQsIFRvb2xzPjtcbiAgZ2VuZXJhdGlvbj86IFJlc29sdmFibGU8R2VuZXJhdGlvbk9wdGlvbnMgfCB1bmRlZmluZWQsIFRDb250ZXh0LCBUb29scz47XG4gIGFjdGl2ZVRvb2xzPzogUmVzb2x2YWJsZTxcbiAgICByZWFkb25seSAoRXh0cmFjdDxrZXlvZiBUb29scywgc3RyaW5nPiB8IEJ1aWx0SW5Ub29sTmFtZSlbXSB8IHVuZGVmaW5lZCxcbiAgICBUQ29udGV4dCxcbiAgICBUb29sc1xuICA+O1xuICBza2lsbHM/OiBSZXNvbHZhYmxlPFNraWxsSW5wdXRbXSB8IHVuZGVmaW5lZCwgVENvbnRleHQsIFRvb2xzPjtcbn07XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBZ2VudCBPcHRpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQgdHlwZSBBZ2VudE9wdGlvbnM8XG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogZGVmYXVsdCBhbGxvd3MgdHlwZS1lcmFzZWQgdXNhZ2VcbiAgVG9vbHMgZXh0ZW5kcyBUb29sU2V0ID0gYW55LFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdID0gU2FuZGJveEJpbmRpbmcsXG4gIFRDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4sXG4+ID0gU2Vzc2lvbkRlZmF1bHRzPFRvb2xzLCBUQ29udGV4dD4gJiB7XG4gIHN0b3JhZ2U/OiBTdG9yYWdlSW5wdXQ7XG4gIHNhbmRib3g/OiBUU2FuZGJveEJpbmRpbmdzO1xuICB0b29scz86IFRvb2xzO1xuICBob29rcz86IEFnZW50SG9va3M7XG4gIG5lZWRzQXBwcm92YWw/OiBOZWVkc0FwcHJvdmFsTWFwPFRvb2xzPjtcbiAgY29udGV4dFNjaGVtYT86IHouWm9kVHlwZTxUQ29udGV4dD47XG4gIGxvZ2dpbmc/OiBPbWl0PExvZ2dpbmdDb25maWcsIFwibmFtZVwiPjtcbn07XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBJbnRlcm5hbCBjb250ZXh0IGNhY2hlcyAoaGlkZGVuIGZyb20gcHVibGljIEFQSSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNvbnN0IHNlc3Npb25Db250ZXh0c01hcCA9IG5ldyBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgU2Vzc2lvbkNvbnRleHQ+PigpO1xuY29uc3Qgc2FuZGJveENvbnRleHRzTWFwID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCBTYW5kYm94Q29udGV4dD4+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXNzaW9uQ29udGV4dHMoXG4gIGFnZW50OiBBbnlBZ2VudFxuKTogTWFwPHN0cmluZywgU2Vzc2lvbkNvbnRleHQ+IHtcbiAgbGV0IG1hcCA9IHNlc3Npb25Db250ZXh0c01hcC5nZXQoYWdlbnQpO1xuICBpZiAoIW1hcCkge1xuICAgIG1hcCA9IG5ldyBNYXAoKTtcbiAgICBzZXNzaW9uQ29udGV4dHNNYXAuc2V0KGFnZW50LCBtYXApO1xuICB9XG4gIHJldHVybiBtYXA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYW5kYm94Q29udGV4dHMoXG4gIGFnZW50OiBBbnlBZ2VudFxuKTogTWFwPHN0cmluZywgU2FuZGJveENvbnRleHQ+IHtcbiAgbGV0IG1hcCA9IHNhbmRib3hDb250ZXh0c01hcC5nZXQoYWdlbnQpO1xuICBpZiAoIW1hcCkge1xuICAgIG1hcCA9IG5ldyBNYXAoKTtcbiAgICBzYW5kYm94Q29udGV4dHNNYXAuc2V0KGFnZW50LCBtYXApO1xuICB9XG4gIHJldHVybiBtYXA7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBZ2VudCBDbGFzcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBpbnRlbnRpb25hbGx5IGVyYXNlZCBcdTIwMTMgdXNpbmcgYGFueWAgYXZvaWRzIGNvbnRyYXZhcmlhbmNlIGlzc3VlcyB3aXRoIHRvb2wtdHlwZWQgbWV0aG9kcyBsaWtlIGBzZW5kYFxuZXhwb3J0IHR5cGUgQW55QWdlbnQgPSBBZ2VudDxhbnksIGFueSwgYW55LCBhbnk+O1xuXG5leHBvcnQgdHlwZSBJbmZlclNlc3Npb248QWdlbnQgZXh0ZW5kcyBBbnlBZ2VudCA9IEFueUFnZW50PiA9IFJldHVyblR5cGU8XG4gIEFnZW50W1wic2Vzc2lvblwiXVxuPjtcbmV4cG9ydCB0eXBlIFNlc3Npb25TZW5kQXJnczxcbiAgQWdlbnQgZXh0ZW5kcyBBbnlBZ2VudCxcbiAgU2Vzc2lvbiBleHRlbmRzIEluZmVyU2Vzc2lvbjxBZ2VudD4gPSBJbmZlclNlc3Npb248QWdlbnQ+LFxuPiA9IFBhcmFtZXRlcnM8U2Vzc2lvbltcInNlbmRcIl0+O1xuXG5leHBvcnQgY2xhc3MgQWdlbnQ8XG4gIFRNZXNzYWdlTWV0YWRhdGEgPSB1bmtub3duLFxuICBUb29scyBleHRlbmRzIFRvb2xTZXQgPSBUb29sU2V0LFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdID0gU2FuZGJveEJpbmRpbmcsXG4gIFRDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4sXG4+IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBvcHRpb25zOiBBZ2VudE9wdGlvbnM8VG9vbHMsIFRTYW5kYm94QmluZGluZ3MsIFRDb250ZXh0PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IEFnZW50T3B0aW9uczxUb29scywgVFNhbmRib3hCaW5kaW5ncywgVENvbnRleHQ+XG4gICkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyA/PyB7fTtcbiAgICB0aGlzLnNlc3Npb24gPSAoc2Vzc2lvbkhhbmRsZTxUb29scywgVENvbnRleHQsIFRTYW5kYm94QmluZGluZ3M+KS5iaW5kKFxuICAgICAgbnVsbCxcbiAgICAgIHRoaXMgYXMgdW5rbm93biBhcyBBbnlBZ2VudFxuICAgICk7XG4gICAgdGhpcy5zYW5kYm94ID0gKHNhbmRib3hIYW5kbGU8VFNhbmRib3hCaW5kaW5ncz4pLmJpbmQoXG4gICAgICBudWxsLFxuICAgICAgdGhpcyBhcyB1bmtub3duIGFzIEFueUFnZW50XG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBbV09SS0ZMT1dfU0VSSUFMSVpFXShpbnN0YW5jZTogQW55QWdlbnQpIHtcbiAgICByZXR1cm4geyBuYW1lOiBpbnN0YW5jZS5uYW1lIH07XG4gIH1cblxuICBzdGF0aWMgW1dPUktGTE9XX0RFU0VSSUFMSVpFXShkYXRhOiB7IG5hbWU6IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIGdldEFnZW50KGRhdGEubmFtZSwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9yZXNvbHZlZFN0b3JhZ2U6IFN0b3JhZ2UgfCB1bmRlZmluZWQ7XG5cbiAgZ2V0IHN0b3JhZ2UoKTogU3RvcmFnZSB7XG4gICAgaWYgKHRoaXMuX3Jlc29sdmVkU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVkU3RvcmFnZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgIHRoaXMuX3Jlc29sdmVkU3RvcmFnZSA9IHRvU3RvcmFnZSh0aGlzLm9wdGlvbnMuc3RvcmFnZSk7XG4gICAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZWRTdG9yYWdlO1xuICAgIH1cblxuICAgIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcih7XG4gICAgICBjb25maWc6IHsgLi4udGhpcy5vcHRpb25zLmxvZ2dpbmcsIG5hbWU6IHRoaXMubmFtZSB9LFxuICAgICAgc3Vic3lzdGVtOiBcInN0b3JhZ2VcIixcbiAgICB9KTtcblxuICAgIGlmIChzaG91bGRGYWxsYmFja1RvS1YyKCkpIHtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgTm8gc3RvcmFnZSBhZGFwdGVyIGNvbmZpZ3VyZWQgXHUyMDE0IHVzaW5nIEtWMiAobmFtZXNwYWNlOiBcIiR7dGhpcy5uYW1lfVwiKS5gXG4gICAgICApO1xuICAgICAgdGhpcy5fcmVzb2x2ZWRTdG9yYWdlID0gdG9TdG9yYWdlKFxuICAgICAgICBrdlN0b3JhZ2VGYWxsYmFjayh7IHByZWZpeDogdGhpcy5uYW1lIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVkU3RvcmFnZTtcbiAgICB9XG5cbiAgICBsb2cud2FybihcbiAgICAgIFwiTm8gc3RvcmFnZSBhZGFwdGVyIGNvbmZpZ3VyZWQgXHUyMDE0IHVzaW5nIGxvY2FsU3RvcmFnZSgpLiBEYXRhIHdpbGwgbm90IHBlcnNpc3QgYWNyb3NzIHJlc3RhcnRzLlwiXG4gICAgKTtcbiAgICB0aGlzLl9yZXNvbHZlZFN0b3JhZ2UgPSB0b1N0b3JhZ2UobG9jYWxTdG9yYWdlKCkpO1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlZFN0b3JhZ2U7XG4gIH1cblxuICBnZXQgdG9vbHMoKSB7XG4gICAgcmV0dXJuIHsgLi4uYnVpbHRJblRvb2xzLCAuLi50aGlzLm9wdGlvbnMudG9vbHMgfSBhcyB0eXBlb2YgYnVpbHRJblRvb2xzICZcbiAgICAgIFRvb2xzO1xuICB9XG5cbiAgZ2V0IGhvb2tzKCk6IEFnZW50SG9va3Mge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaG9va3MgPz8ge307XG4gIH1cblxuICByZWFkb25seSBzZXNzaW9uO1xuXG4gIHJlYWRvbmx5IHNhbmRib3g7XG5cbiAgLyoqIFBoYW50b20gcHJvcGVydHkgZm9yIHR5cGUgaW5mZXJlbmNlLiBVc2UgYHR5cGVvZiBteUFnZW50LiRVSU1lc3NhZ2VgIHRvIGdldCB0aGUgdHlwZWQgVUlNZXNzYWdlLiAqL1xuICBkZWNsYXJlIHJlYWRvbmx5ICRVSU1lc3NhZ2U6IFVJTWVzc2FnZTxcbiAgICBUTWVzc2FnZU1ldGFkYXRhLFxuICAgIEFnZW50RGF0YVR5cGVzLFxuICAgIEluZmVyVUlUb29sczx0eXBlb2YgYnVpbHRJblRvb2xzICYgVG9vbHM+XG4gID47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZ2VudDxcbiAgVE1lc3NhZ2VNZXRhZGF0YSA9IHVua25vd24sXG4gIFRvb2xzIGV4dGVuZHMgVG9vbFNldCA9IFRvb2xTZXQsXG4gIFRTYW5kYm94QmluZGluZ3MgZXh0ZW5kcyBTYW5kYm94QmluZGluZyB8IFNhbmRib3hCaW5kaW5nW10gPSBTYW5kYm94QmluZGluZyxcbiAgVENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbj4obmFtZTogc3RyaW5nLCBvcHRpb25zPzogQWdlbnRPcHRpb25zPFRvb2xzLCBUU2FuZGJveEJpbmRpbmdzLCBUQ29udGV4dD4pIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQWdlbnQ8XG4gICAgVE1lc3NhZ2VNZXRhZGF0YSxcbiAgICBUb29scyxcbiAgICBUU2FuZGJveEJpbmRpbmdzLFxuICAgIFRDb250ZXh0XG4gID4obmFtZSwgb3B0aW9ucyk7XG4gIHJlZ2lzdGVyQWdlbnQobmFtZSwgaW5zdGFuY2UpO1xuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbi8vIFJlLWV4cG9ydCBldmVyeXRoaW5nIGZyb20gcmVnaXN0cnkgc28gZXhpc3RpbmcgaW1wb3J0cyBmcm9tIFwiLi9hZ2VudC9jbGllbnRcIiBrZWVwIHdvcmtpbmcuXG5leHBvcnQge1xuICB0eXBlIEFnZW50RGF0YVR5cGVzLFxuICB0eXBlIEFnZW50SG9va3MsXG4gIEFnZW50U3RhdHVzLFxuICBnZXRBZ2VudCxcbiAgdHlwZSBJbmZlclVJTWVzc2FnZSxcbiAgdHlwZSBOZWVkc0FwcHJvdmFsTWFwLFxuICByZWdpc3RlckFnZW50LFxuICB0eXBlIFR5cGVkVUlNZXNzYWdlLFxufSBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuIiwgImltcG9ydCB7IHVsaWQgfSBmcm9tIFwidWxpZFwiO1xuaW1wb3J0IHR5cGUgeyBBbnlBZ2VudCB9IGZyb20gXCIuLi9hZ2VudC9jbGllbnRcIjtcbmltcG9ydCB7IGdldFNhbmRib3hDb250ZXh0cyB9IGZyb20gXCIuLi9hZ2VudC9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveEJpbmRpbmcsIFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB7IGV4ZWMgfSBmcm9tIFwiLi9leGVjXCI7XG5pbXBvcnQgeyBnZXREb21haW4gfSBmcm9tIFwiLi9nZXQtZG9tYWluXCI7XG5pbXBvcnQgeyBnZXRTdGF0dXMgfSBmcm9tIFwiLi9nZXQtc3RhdHVzXCI7XG5pbXBvcnQgeyBraWxsIH0gZnJvbSBcIi4va2lsbFwiO1xuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tIFwiLi9yZWFkLWZpbGVcIjtcbmltcG9ydCB7IHNldHVwIH0gZnJvbSBcIi4vc2V0dXBcIjtcbmltcG9ydCB7IHNuYXBzaG90IH0gZnJvbSBcIi4vc25hcHNob3RcIjtcbmltcG9ydCB7IHN0YXJ0IH0gZnJvbSBcIi4vc3RhcnRcIjtcbmltcG9ydCB7IHN0b3AgfSBmcm9tIFwiLi9zdG9wXCI7XG5pbXBvcnQgeyB1cGRhdGVOZXR3b3JrUG9saWN5IH0gZnJvbSBcIi4vdXBkYXRlLW5ldHdvcmstcG9saWN5XCI7XG5pbXBvcnQgeyB3cml0ZUZpbGVzIH0gZnJvbSBcIi4vd3JpdGUtZmlsZXNcIjtcblxuZXhwb3J0IHR5cGUgU2FuZGJveENvbnRleHQgPSB7XG4gIGFnZW50OiBBbnlBZ2VudDtcbiAgc2FuZGJveElkOiBzdHJpbmc7XG4gIF9wZW5kaW5nU2V0dXA/OiBQcm9taXNlPFNhbmRib3hJbnN0YW5jZT47XG4gIF9jd2Q/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTYW5kYm94T3B0aW9ucyA9IHtcbiAgaWQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTYW5kYm94SGFuZGxlPFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdID0gU2FuZGJveEJpbmRpbmcsXG4+ID0gUmV0dXJuVHlwZTx0eXBlb2Ygc2FuZGJveEhhbmRsZTxUU2FuZGJveEJpbmRpbmdzPj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5kYm94SGFuZGxlPFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdLFxuPihhZ2VudDogQW55QWdlbnQsIGlkPzogc3RyaW5nIHwgU2FuZGJveE9wdGlvbnMpIHtcbiAgY29uc3Qgc2FuZGJveElkID1cbiAgICB0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIgPyBpZCA6IChpZD8uaWQgPz8gYHNhbmRib3hfJHt1bGlkKCl9YCk7XG5cbiAgY29uc3QgY29udGV4dHMgPSBnZXRTYW5kYm94Q29udGV4dHMoYWdlbnQpO1xuICBsZXQgc2FuZGJveENvbnRleHQgPSBjb250ZXh0cy5nZXQoc2FuZGJveElkKTtcbiAgaWYgKCFzYW5kYm94Q29udGV4dCkge1xuICAgIHNhbmRib3hDb250ZXh0ID0geyBhZ2VudCwgc2FuZGJveElkIH07XG4gICAgY29udGV4dHMuc2V0KHNhbmRib3hJZCwgc2FuZGJveENvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogc2FuZGJveElkLFxuICAgIGdldCBjd2QoKSB7XG4gICAgICByZXR1cm4gc2FuZGJveENvbnRleHQhLl9jd2QgPz8gXCIuXCI7XG4gICAgfSxcbiAgICBzZXR1cDogKHNldHVwPFRTYW5kYm94QmluZGluZ3M+KS5iaW5kKG51bGwsIHNhbmRib3hDb250ZXh0KSxcbiAgICBleGVjOiBleGVjLmJpbmQobnVsbCwgc2FuZGJveENvbnRleHQpLFxuICAgIHJlYWRGaWxlOiByZWFkRmlsZS5iaW5kKG51bGwsIHNhbmRib3hDb250ZXh0KSxcbiAgICB3cml0ZUZpbGVzOiB3cml0ZUZpbGVzLmJpbmQobnVsbCwgc2FuZGJveENvbnRleHQpLFxuICAgIGdldERvbWFpbjogZ2V0RG9tYWluLmJpbmQobnVsbCwgc2FuZGJveENvbnRleHQpLFxuICAgIHVwZGF0ZU5ldHdvcmtQb2xpY3k6IHVwZGF0ZU5ldHdvcmtQb2xpY3kuYmluZChudWxsLCBzYW5kYm94Q29udGV4dCksXG4gICAgc3RhcnQ6IHN0YXJ0LmJpbmQobnVsbCwgc2FuZGJveENvbnRleHQpLFxuICAgIHN0b3A6IHN0b3AuYmluZChudWxsLCBzYW5kYm94Q29udGV4dCksXG4gICAga2lsbDoga2lsbC5iaW5kKG51bGwsIHNhbmRib3hDb250ZXh0KSxcbiAgICBzbmFwc2hvdDogc25hcHNob3QuYmluZChudWxsLCBzYW5kYm94Q29udGV4dCksXG4gICAgZ2V0U3RhdHVzOiBnZXRTdGF0dXMuYmluZChudWxsLCBzYW5kYm94Q29udGV4dCksXG4gIH07XG59XG5cbnR5cGUgU2FuZGJveE1ldGhvZHM8XG4gIFRTYW5kYm94QmluZGluZ3MgZXh0ZW5kcyBTYW5kYm94QmluZGluZyB8IFNhbmRib3hCaW5kaW5nW10sXG4+ID0gT21pdDxTYW5kYm94SGFuZGxlPFRTYW5kYm94QmluZGluZ3M+LCBcImlkXCIgfCBcImN3ZFwiPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxhenlTYW5kYm94SGFuZGxlPFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdLFxuPihcbiAgYWdlbnQ6IEFueUFnZW50LFxuICBnZXRJZDogKCkgPT4gUHJvbWlzZTxzdHJpbmc+XG4pOiBTYW5kYm94TWV0aG9kczxUU2FuZGJveEJpbmRpbmdzPiB7XG4gIGNvbnN0IGdldEhhbmRsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpZCA9IGF3YWl0IGdldElkKCk7XG4gICAgcmV0dXJuIHNhbmRib3hIYW5kbGU8VFNhbmRib3hCaW5kaW5ncz4oYWdlbnQsIGlkKTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHNldHVwOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgY29uc3QgaCA9IGF3YWl0IGdldEhhbmRsZSgpO1xuICAgICAgcmV0dXJuIGguc2V0dXAoLi4uYXJncyk7XG4gICAgfSxcbiAgICBleGVjOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgY29uc3QgaCA9IGF3YWl0IGdldEhhbmRsZSgpO1xuICAgICAgcmV0dXJuIGguZXhlYyguLi5hcmdzKTtcbiAgICB9LFxuICAgIHJlYWRGaWxlOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgY29uc3QgaCA9IGF3YWl0IGdldEhhbmRsZSgpO1xuICAgICAgcmV0dXJuIGgucmVhZEZpbGUoLi4uYXJncyk7XG4gICAgfSxcbiAgICB3cml0ZUZpbGVzOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgY29uc3QgaCA9IGF3YWl0IGdldEhhbmRsZSgpO1xuICAgICAgcmV0dXJuIGgud3JpdGVGaWxlcyguLi5hcmdzKTtcbiAgICB9LFxuICAgIGdldERvbWFpbjogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGNvbnN0IGggPSBhd2FpdCBnZXRIYW5kbGUoKTtcbiAgICAgIHJldHVybiBoLmdldERvbWFpbiguLi5hcmdzKTtcbiAgICB9LFxuICAgIHVwZGF0ZU5ldHdvcmtQb2xpY3k6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBoID0gYXdhaXQgZ2V0SGFuZGxlKCk7XG4gICAgICByZXR1cm4gaC51cGRhdGVOZXR3b3JrUG9saWN5KC4uLmFyZ3MpO1xuICAgIH0sXG4gICAgc3RhcnQ6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBoID0gYXdhaXQgZ2V0SGFuZGxlKCk7XG4gICAgICByZXR1cm4gaC5zdGFydCguLi5hcmdzKTtcbiAgICB9LFxuICAgIHN0b3A6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBoID0gYXdhaXQgZ2V0SGFuZGxlKCk7XG4gICAgICByZXR1cm4gaC5zdG9wKC4uLmFyZ3MpO1xuICAgIH0sXG4gICAga2lsbDogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGNvbnN0IGggPSBhd2FpdCBnZXRIYW5kbGUoKTtcbiAgICAgIHJldHVybiBoLmtpbGwoLi4uYXJncyk7XG4gICAgfSxcbiAgICBzbmFwc2hvdDogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGNvbnN0IGggPSBhd2FpdCBnZXRIYW5kbGUoKTtcbiAgICAgIHJldHVybiBoLnNuYXBzaG90KC4uLmFyZ3MpO1xuICAgIH0sXG4gICAgZ2V0U3RhdHVzOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgY29uc3QgaCA9IGF3YWl0IGdldEhhbmRsZSgpO1xuICAgICAgcmV0dXJuIGguZ2V0U3RhdHVzKC4uLmFyZ3MpO1xuICAgIH0sXG4gIH07XG59XG4iLCAiZXhwb3J0IGNvbnN0IGlzVmVyY2VsID0gYXN5bmMgKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgZ2V0VmVyY2VsT2lkY1Rva2VuIH0gPSBhd2FpdCBpbXBvcnQoXCJAdmVyY2VsL29pZGNcIik7XG4gICAgcmV0dXJuIEJvb2xlYW4oYXdhaXQgZ2V0VmVyY2VsT2lkY1Rva2VuKCkpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG4iLCAiaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFNlc3Npb25Ob3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTZXNzaW9uTm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIlNlc3Npb24gJGlkIG5vdCBmb3VuZFwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNlc3Npb25FcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2Vzc2lvbkVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2Vzc2lvbiAkaWQgZmFpbGVkOiAkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU2FuZGJveE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNhbmRib3hOb3RGb3VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2FuZGJveCAkaWQgbm90IGZvdW5kXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU3RvcmFnZUVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTdG9yYWdlRXJyb3JcIixcbiAgbWVzc2FnZTogXCIkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU3RvcmFnZUNvbmZsaWN0RXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlN0b3JhZ2VDb25mbGljdEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNhbmRib3hFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2FuZGJveEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VOb3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJNZXNzYWdlTm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIk1lc3NhZ2UgJGlkIG5vdCBmb3VuZFwiLFxufSkge31cbiIsICJpbXBvcnQgeyBpc1ZlcmNlbCB9IGZyb20gXCIuLi9hZ2VudC9pcy12ZXJjZWxcIjtcbmltcG9ydCB7IFNhbmRib3hFcnJvciwgU2FuZGJveE5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3ggfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL2xvZ2dlclwiO1xuaW1wb3J0IHR5cGUge1xuICBTYW5kYm94QmluZGluZyxcbiAgU2FuZGJveEluc3RhbmNlLFxuICBTYW5kYm94U2V0dXBGaWVsZHMsXG4gIFdpdGhDb25maWcsXG59IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQnVpbHRJbkJpbmRpbmdzIH0gZnJvbSBcIi4vYmluZGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveENvbnRleHQgfSBmcm9tIFwiLi9oYW5kbGVcIjtcblxuY29uc3QgUE9MTF9JTlRFUlZBTF9NUyA9IDUwO1xuY29uc3QgUE9MTF9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcblxudHlwZSBTZXR1cENvbW1vbkZpZWxkcyA9IFBhcnRpYWw8U2FuZGJveFNldHVwRmllbGRzPiAmIHtcbiAgY3dkPzogc3RyaW5nO1xuICBydW4/OiAoc2FuZGJveDogU2FuZGJveEluc3RhbmNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn07XG5cbnR5cGUgVG9CaW5kaW5nVW5pb248VCBleHRlbmRzIFNhbmRib3hCaW5kaW5nIHwgU2FuZGJveEJpbmRpbmdbXT4gPVxuICBUIGV4dGVuZHMgU2FuZGJveEJpbmRpbmdbXSA/IFRbbnVtYmVyXSA6IFQ7XG5cbnR5cGUgU2V0dXBPcHRzRm9yQmluZGluZzxCIGV4dGVuZHMgU2FuZGJveEJpbmRpbmc+ID1cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiAuXG4gIEIgZXh0ZW5kcyBTYW5kYm94QmluZGluZzxpbmZlciBULCBpbmZlciBDLCBhbnk+XG4gICAgPyB7IHR5cGU6IFQgfSAmIFNldHVwQ29tbW9uRmllbGRzICYgV2l0aENvbmZpZzxDPlxuICAgIDogbmV2ZXI7XG5cbnR5cGUgSXNEZWZhdWx0PFQgZXh0ZW5kcyBTYW5kYm94QmluZGluZyB8IFNhbmRib3hCaW5kaW5nW10+ID1cbiAgU2FuZGJveEJpbmRpbmcgZXh0ZW5kcyBUID8gdHJ1ZSA6IGZhbHNlO1xuXG5leHBvcnQgdHlwZSBTZXR1cE9wdHM8XG4gIFRTYW5kYm94QmluZGluZ3MgZXh0ZW5kcyBTYW5kYm94QmluZGluZyB8IFNhbmRib3hCaW5kaW5nW10sXG4+ID1cbiAgfCBTZXR1cE9wdHNGb3JCaW5kaW5nPFxuICAgICAgSXNEZWZhdWx0PFRTYW5kYm94QmluZGluZ3M+IGV4dGVuZHMgdHJ1ZVxuICAgICAgICA/IEJ1aWx0SW5CaW5kaW5nc1xuICAgICAgICA6IFRvQmluZGluZ1VuaW9uPFRTYW5kYm94QmluZGluZ3M+XG4gICAgPlxuICB8IChTZXR1cENvbW1vbkZpZWxkcyAmIHsgdHlwZT86IG5ldmVyIH0pO1xuXG5leHBvcnQgdHlwZSBTZXR1cFJlc3VsdCA9IHtcbiAgZG9uZTogUHJvbWlzZTxTYW5kYm94SW5zdGFuY2U+O1xufTtcblxuZnVuY3Rpb24gaXNTaW5nbGVCaW5kaW5nKFxuICBzYW5kYm94OiBTYW5kYm94QmluZGluZyB8IFNhbmRib3hCaW5kaW5nW11cbik6IHNhbmRib3ggaXMgU2FuZGJveEJpbmRpbmcge1xuICByZXR1cm4gIUFycmF5LmlzQXJyYXkoc2FuZGJveCk7XG59XG5cbi8qKiBBdXRvLWRldGVjdCB0aGUgZGVmYXVsdCBiaW5kaW5nOiB2ZXJjZWwgXHUyMTkyIGRvY2tlciBcdTIxOTIgbG9jYWwgY2FzY2FkZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldERlZmF1bHRCaW5kaW5nKCk6IFByb21pc2U8U2FuZGJveEJpbmRpbmc+IHtcbiAgaWYgKGF3YWl0IGlzVmVyY2VsKCkpIHtcbiAgICBjb25zdCB7IHZlcmNlbFNhbmRib3ggfSA9IGF3YWl0IGltcG9ydChcIi4vYmluZGluZ3MvdmVyY2VsXCIpO1xuICAgIHJldHVybiB2ZXJjZWxTYW5kYm94KCk7XG4gIH1cblxuICBpZiAoYXdhaXQgaXNEb2NrZXJBdmFpbGFibGUoKSkge1xuICAgIGNvbnN0IHsgZG9ja2VyU2FuZGJveCB9ID0gYXdhaXQgaW1wb3J0KFwiLi9iaW5kaW5ncy9kb2NrZXJcIik7XG4gICAgcmV0dXJuIGRvY2tlclNhbmRib3goKTtcbiAgfVxuXG4gIGNvbnN0IHsgbG9jYWxTYW5kYm94IH0gPSBhd2FpdCBpbXBvcnQoXCIuL2JpbmRpbmdzL2xvY2FsXCIpO1xuICByZXR1cm4gbG9jYWxTYW5kYm94KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzRG9ja2VyQXZhaWxhYmxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgZXhlY1N5bmMgfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKTtcbiAgICBleGVjU3luYyhcImRvY2tlciBzYW5kYm94IC0taGVscFwiLCB7IHN0ZGlvOiBcImlnbm9yZVwiLCB0aW1lb3V0OiA1MDAwIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUJpbmRpbmcoXG4gIHNhbmRib3g6IFNhbmRib3hCaW5kaW5nIHwgU2FuZGJveEJpbmRpbmdbXSB8IHVuZGVmaW5lZCxcbiAgdHlwZT86IHN0cmluZ1xuKTogUHJvbWlzZTx7IGJpbmRpbmc6IFNhbmRib3hCaW5kaW5nOyBiaW5kaW5nTmFtZTogc3RyaW5nIH0+IHtcbiAgaWYgKCFzYW5kYm94KSB7XG4gICAgY29uc3QgYmluZGluZyA9IGF3YWl0IGdldERlZmF1bHRCaW5kaW5nKCk7XG4gICAgcmV0dXJuIHsgYmluZGluZywgYmluZGluZ05hbWU6IGJpbmRpbmcudHlwZSB9O1xuICB9XG4gIGlmIChpc1NpbmdsZUJpbmRpbmcoc2FuZGJveCkpIHtcbiAgICByZXR1cm4geyBiaW5kaW5nOiBzYW5kYm94LCBiaW5kaW5nTmFtZTogc2FuZGJveC50eXBlIH07XG4gIH1cbiAgaWYgKHR5cGUpIHtcbiAgICBjb25zdCBtYXRjaCA9IHNhbmRib3guZmluZCgoYikgPT4gYi50eXBlID09PSB0eXBlKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgU2FuZGJveEVycm9yKHtcbiAgICAgICAgcmVhc29uOiBgVW5rbm93biBiaW5kaW5nIHR5cGU6IFwiJHt0eXBlfVwiLiBBdmFpbGFibGU6ICR7c2FuZGJveC5tYXAoKGIpID0+IGIudHlwZSkuam9pbihcIiwgXCIpfWAsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYmluZGluZzogbWF0Y2gsIGJpbmRpbmdOYW1lOiBtYXRjaC50eXBlIH07XG4gIH1cbiAgaWYgKHNhbmRib3gubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogXCJObyBzYW5kYm94IGJpbmRpbmdzIGNvbmZpZ3VyZWRcIiB9KTtcbiAgfVxuICByZXR1cm4geyBiaW5kaW5nOiBzYW5kYm94WzBdLCBiaW5kaW5nTmFtZTogc2FuZGJveFswXS50eXBlIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cDxcbiAgVFNhbmRib3hCaW5kaW5ncyBleHRlbmRzIFNhbmRib3hCaW5kaW5nIHwgU2FuZGJveEJpbmRpbmdbXSxcbj4oXG4gIGN0eDogU2FuZGJveENvbnRleHQsXG4gIG9wdHM/OiBTZXR1cE9wdHM8VFNhbmRib3hCaW5kaW5ncz5cbik6IFByb21pc2U8U2V0dXBSZXN1bHQ+IHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBpZiAoY3R4Ll9wZW5kaW5nU2V0dXApIHtcbiAgICByZXR1cm4geyBkb25lOiBjdHguX3BlbmRpbmdTZXR1cCB9O1xuICB9XG5cbiAgY29uc3QgYWdlbnQgPSBjdHguYWdlbnQ7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcih7XG4gICAgY29uZmlnOiB7IC4uLmFnZW50Lm9wdGlvbnMubG9nZ2luZywgbmFtZTogYWdlbnQubmFtZSB9LFxuICAgIHN1YnN5c3RlbTogXCJzYW5kYm94OnNldHVwXCIsXG4gICAgY29udGV4dDogeyBzYW5kYm94SWQ6IGN0eC5zYW5kYm94SWQgfSxcbiAgfSk7XG5cbiAgY29uc3QgZG9uZVJlc29sdmVCaW5kaW5nID0gbG9nLnRpbWUoXCJyZXNvbHZlIGJpbmRpbmdcIiwge1xuICAgIHJlcXVlc3RlZFR5cGU6IG9wdHM/LnR5cGUsXG4gIH0pO1xuICBjb25zdCB7IGJpbmRpbmcsIGJpbmRpbmdOYW1lIH0gPSBhd2FpdCByZXNvbHZlQmluZGluZyhcbiAgICBhZ2VudC5vcHRpb25zLnNhbmRib3gsXG4gICAgb3B0cz8udHlwZVxuICApO1xuICBkb25lUmVzb2x2ZUJpbmRpbmcoKTtcblxuICBpZiAob3B0cz8uY3dkKSB7XG4gICAgY3R4Ll9jd2QgPSBvcHRzLmN3ZDtcbiAgfVxuXG4gIGNvbnN0IHNldHVwTG9nID0gbG9nLndpdGhDb250ZXh0KHtcbiAgICBiaW5kaW5nOiBiaW5kaW5nTmFtZSxcbiAgICB2ZXJzaW9uOiBvcHRzPy52ZXJzaW9uID8/IGJpbmRpbmcuZGVmYXVsdHM/LnZlcnNpb24sXG4gIH0pO1xuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Db25mdXNpbmdWb2lkVHlwZTogLlxuICBsZXQgcmVzb2x2ZUJsb2NraW5nUHJvbWlzZSA9ICh2YWx1ZTogdm9pZCkgPT4gdmFsdWU7XG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogLlxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRW1wdHlCbG9ja1N0YXRlbWVudHM6IC5cbiAgbGV0IHJlamVjdEJsb2NraW5nUHJvbWlzZSA9IChfcmVhc29uPzogYW55KSA9PiB7fTtcbiAgY29uc3QgYmxvY2tpbmdQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlc29sdmVCbG9ja2luZ1Byb21pc2UgPSByZXNvbHZlO1xuICAgIHJlamVjdEJsb2NraW5nUHJvbWlzZSA9IHJlamVjdDtcbiAgfSk7XG5cbiAgY3R4Ll9wZW5kaW5nU2V0dXAgPSAoYXN5bmMgKCkgPT4ge1xuICAgIGxldCBzbGVlcE9sZEluc3RhbmNlOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRvbmVQZW5kaW5nU2V0dXAgPSBzZXR1cExvZy50aW1lKFwicGVuZGluZyBzZXR1cFwiKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkb25lU3RvcmFnZUdldCA9IHNldHVwTG9nLnRpbWUoXCJzdG9yYWdlLnNhbmRib3guZ2V0XCIpO1xuICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgYWdlbnQuc3RvcmFnZS5zYW5kYm94LmdldChjdHguc2FuZGJveElkKTtcbiAgICAgIGRvbmVTdG9yYWdlR2V0KCk7XG5cbiAgICAgIGNvbnN0IGJpbmRpbmdEZWZhdWx0cyA9IGJpbmRpbmcuZGVmYXVsdHMgPz8ge307XG4gICAgICBjb25zdCBlZmZlY3RpdmVWZXJzaW9uID0gb3B0cz8udmVyc2lvbiA/PyBiaW5kaW5nRGVmYXVsdHMudmVyc2lvbiA/PyBudWxsO1xuICAgICAgY29uc3QgZWZmZWN0aXZlUnVuID0gb3B0cz8ucnVuID8/IGJpbmRpbmdEZWZhdWx0cy5ydW47XG4gICAgICBjb25zdCBlZmZlY3RpdmVOZXR3b3JrUG9saWN5ID1cbiAgICAgICAgb3B0cz8ubmV0d29ya1BvbGljeSA/PyBiaW5kaW5nRGVmYXVsdHMubmV0d29ya1BvbGljeSA/PyBudWxsO1xuICAgICAgY29uc3QgZWZmZWN0aXZlQ29uZmlnID0ge1xuICAgICAgICAuLi5iaW5kaW5nRGVmYXVsdHMuY29uZmlnLFxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IG9wdHMgaXMgYSB1bmlvbjsgY29uZmlnIGV4aXN0cyBvbiBiaW5kaW5nLXNwZWNpZmljIGJyYW5jaGVzXG4gICAgICAgIC4uLihvcHRzIGFzIGFueSk/LmNvbmZpZyxcbiAgICAgIH07XG5cbiAgICAgIGlmIChyZWNvcmQpIHtcbiAgICAgICAgY29uc3QgdmVyc2lvbk1hdGNoZXMgPVxuICAgICAgICAgICFlZmZlY3RpdmVWZXJzaW9uIHx8IHJlY29yZC5zZXR1cD8udmVyc2lvbiA9PT0gZWZmZWN0aXZlVmVyc2lvbjtcblxuICAgICAgICBpZiAodmVyc2lvbk1hdGNoZXMgJiYgcmVjb3JkLnNldHVwPy5jb21wbGV0ZWRBdCkge1xuICAgICAgICAgIHJlc29sdmVCbG9ja2luZ1Byb21pc2UoKTtcbiAgICAgICAgICBjb25zdCBkb25lQ29ubmVjdEV4aXN0aW5nID0gc2V0dXBMb2cudGltZShcbiAgICAgICAgICAgIFwiY29ubmVjdCBleGlzdGluZyBzYW5kYm94XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNldHVwU3RhdGU6IFwiY29tcGxldGVkXCIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGJpbmRpbmcuY29ubmVjdCh7XG4gICAgICAgICAgICBhZ2VudCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiByZWNvcmQuc2V0dXAubWV0YWRhdGEsXG4gICAgICAgICAgICBzaWduYWw6IG9wdHM/LnNpZ25hbCxcbiAgICAgICAgICAgIGxvZzogc2V0dXBMb2csXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZG9uZUNvbm5lY3RFeGlzdGluZygpO1xuICAgICAgICAgIGN0eC5fY3dkID0gaW5zdGFuY2UuY3dkO1xuICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2ZXJzaW9uTWF0Y2hlcyAmJiAhcmVjb3JkLnNldHVwPy5jb21wbGV0ZWRBdCkge1xuICAgICAgICAgIHJlc29sdmVCbG9ja2luZ1Byb21pc2UoKTtcbiAgICAgICAgICBjb25zdCBkb25lUG9sbFVudGlsUmVhZHkgPSBzZXR1cExvZy50aW1lKFwicG9sbCB1bnRpbCByZWFkeVwiKTtcbiAgICAgICAgICBhd2FpdCBwb2xsVW50aWxSZWFkeShjdHgsIG9wdHM/LnNpZ25hbCk7XG4gICAgICAgICAgZG9uZVBvbGxVbnRpbFJlYWR5KCk7XG5cbiAgICAgICAgICBjb25zdCBkb25lU3RvcmFnZUdldFBvc3RQb2xsID0gc2V0dXBMb2cudGltZShcbiAgICAgICAgICAgIFwic3RvcmFnZS5zYW5kYm94LmdldCAocG9zdC1wb2xsKVwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCByZWFkeSA9IGF3YWl0IGFnZW50LnN0b3JhZ2Uuc2FuZGJveC5nZXQoY3R4LnNhbmRib3hJZCk7XG4gICAgICAgICAgZG9uZVN0b3JhZ2VHZXRQb3N0UG9sbCgpO1xuXG4gICAgICAgICAgaWYgKCFyZWFkeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hOb3RGb3VuZEVycm9yKHsgaWQ6IGN0eC5zYW5kYm94SWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGRvbmVDb25uZWN0RXhpc3RpbmcgPSBzZXR1cExvZy50aW1lKFxuICAgICAgICAgICAgXCJjb25uZWN0IGV4aXN0aW5nIHNhbmRib3hcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc2V0dXBTdGF0ZTogXCJwb3N0LXBvbGxcIixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgYmluZGluZy5jb25uZWN0KHtcbiAgICAgICAgICAgIGFnZW50LFxuICAgICAgICAgICAgbWV0YWRhdGE6IHJlYWR5LnNldHVwLm1ldGFkYXRhLFxuICAgICAgICAgICAgc2lnbmFsOiBvcHRzPy5zaWduYWwsXG4gICAgICAgICAgICBsb2c6IHNldHVwTG9nLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGRvbmVDb25uZWN0RXhpc3RpbmcoKTtcbiAgICAgICAgICBjdHguX2N3ZCA9IGluc3RhbmNlLmN3ZDtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVjb3JkLnNldHVwLm1ldGFkYXRhKSB7XG4gICAgICAgICAgY29uc3Qgb2xkSW5zdGFuY2VNZXRhZGF0YSA9IHJlY29yZC5zZXR1cC5tZXRhZGF0YTtcbiAgICAgICAgICBzbGVlcE9sZEluc3RhbmNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRvbmVTdG9wT2xkSW5zdGFuY2UgPSBzZXR1cExvZy50aW1lKFxuICAgICAgICAgICAgICBcInN0b3Agb2xkIHNhbmRib3ggaW5zdGFuY2VcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9sZCA9IGF3YWl0IGJpbmRpbmcuY29ubmVjdCh7XG4gICAgICAgICAgICAgICAgYWdlbnQsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IG9sZEluc3RhbmNlTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgbG9nOiBzZXR1cExvZyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGF3YWl0IG9sZC5zdG9wKCk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgZG9uZVN0b3BPbGRJbnN0YW5jZSgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb25lU3RvcE9sZEluc3RhbmNlKCk7XG4gICAgICAgICAgfSkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3Qgc2V0dXBfOiBTYW5kYm94W1wic2V0dXBcIl0gPSB7XG4gICAgICAgIGJpbmRpbmc6IGJpbmRpbmdOYW1lLFxuICAgICAgICB2ZXJzaW9uOiBlZmZlY3RpdmVWZXJzaW9uID8/IHJlY29yZD8uc2V0dXA/LnZlcnNpb24gPz8gbnVsbCxcbiAgICAgICAgbmV0d29ya1BvbGljeTpcbiAgICAgICAgICBlZmZlY3RpdmVOZXR3b3JrUG9saWN5ID8/IHJlY29yZD8uc2V0dXA/Lm5ldHdvcmtQb2xpY3kgPz8gbnVsbCxcbiAgICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICAgIG1ldGFkYXRhOiBudWxsLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbmV3UmVjb3JkOiBTYW5kYm94ID0ge1xuICAgICAgICBpZDogY3R4LnNhbmRib3hJZCxcbiAgICAgICAgc2V0dXA6IHNldHVwXyxcbiAgICAgICAgY3JlYXRlZEF0OiByZWNvcmQ/LmNyZWF0ZWRBdCA/PyBub3csXG4gICAgICAgIGxhc3RBY3RpdmVBdDogbm93LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgZG9uZVN0b3JhZ2VTZXRQZW5kaW5nID0gc2V0dXBMb2cudGltZShcbiAgICAgICAgXCJzdG9yYWdlLnNhbmRib3guc2V0IChzZXR1cCBwZW5kaW5nKVwiXG4gICAgICApO1xuICAgICAgYXdhaXQgYWdlbnQuc3RvcmFnZS5zYW5kYm94LnNldChjdHguc2FuZGJveElkLCBuZXdSZWNvcmQpO1xuICAgICAgZG9uZVN0b3JhZ2VTZXRQZW5kaW5nKCk7XG5cbiAgICAgIHJlc29sdmVCbG9ja2luZ1Byb21pc2UoKTtcblxuICAgICAgY29uc3QgZG9uZUJpbmRpbmdDcmVhdGUgPSBzZXR1cExvZy50aW1lKFwiYmluZGluZy5jcmVhdGVcIik7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiaW5kaW5nLmNyZWF0ZSh7XG4gICAgICAgIGN3ZDogY3R4Ll9jd2QgPz8gXCIuXCIsXG4gICAgICAgIGFnZW50LFxuICAgICAgICBzZXR1cDoge1xuICAgICAgICAgIC4uLnNldHVwXyxcbiAgICAgICAgICBydW46IGVmZmVjdGl2ZVJ1bixcbiAgICAgICAgICBjb25maWc6IGVmZmVjdGl2ZUNvbmZpZyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVjb3JkOiBuZXdSZWNvcmQsXG4gICAgICAgIHNpZ25hbDogb3B0cz8uc2lnbmFsLFxuICAgICAgICBsb2c6IHNldHVwTG9nLFxuICAgICAgfSk7XG4gICAgICBkb25lQmluZGluZ0NyZWF0ZSgpO1xuXG4gICAgICBzZXR1cF8uY29tcGxldGVkQXQgPSBEYXRlLm5vdygpO1xuICAgICAgc2V0dXBfLm1ldGFkYXRhID0gcmVzdWx0Lm1ldGFkYXRhO1xuXG4gICAgICBjb25zdCBkb25lU3RvcmFnZVVwZGF0ZUNvbXBsZXRlID0gc2V0dXBMb2cudGltZShcbiAgICAgICAgXCJzdG9yYWdlLnNhbmRib3gudXBkYXRlIChzZXR1cCBjb21wbGV0ZSlcIlxuICAgICAgKTtcbiAgICAgIGF3YWl0IGFnZW50LnN0b3JhZ2Uuc2FuZGJveC51cGRhdGUoY3R4LnNhbmRib3hJZCwge1xuICAgICAgICBzZXR1cDogc2V0dXBfLFxuICAgICAgICBsYXN0QWN0aXZlQXQ6IERhdGUubm93KCksXG4gICAgICB9KTtcbiAgICAgIGRvbmVTdG9yYWdlVXBkYXRlQ29tcGxldGUoKTtcblxuICAgICAgY3R4Ll9jd2QgPSByZXN1bHQuaW5zdGFuY2UuY3dkO1xuICAgICAgcmV0dXJuIHJlc3VsdC5pbnN0YW5jZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGN0eC5fcGVuZGluZ1NldHVwID0gdW5kZWZpbmVkO1xuICAgICAgcmVqZWN0QmxvY2tpbmdQcm9taXNlKGVycik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNvbnN0IGRvbmVGaW5hbGl6ZSA9IHNldHVwTG9nLnRpbWUoXCJmaW5hbGl6ZSBzZXR1cFwiKTtcbiAgICAgIGF3YWl0IHNsZWVwT2xkSW5zdGFuY2U7XG4gICAgICBkb25lRmluYWxpemUoKTtcbiAgICAgIGRvbmVQZW5kaW5nU2V0dXAoKTtcbiAgICB9XG4gIH0pKCk7XG5cbiAgY29uc3QgZG9uZVdhaXRGb3JVbmJsb2NrID0gc2V0dXBMb2cudGltZShcIndhaXQgZm9yIHNldHVwIHVuYmxvY2tcIik7XG4gIGF3YWl0IGJsb2NraW5nUHJvbWlzZTtcbiAgZG9uZVdhaXRGb3JVbmJsb2NrKCk7XG4gIHJldHVybiB7IGRvbmU6IGN0eC5fcGVuZGluZ1NldHVwIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlKFxuICBjdHg6IFNhbmRib3hDb250ZXh0LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbFxuKTogUHJvbWlzZTxTYW5kYm94SW5zdGFuY2U+IHtcbiAgY29uc3QgYWdlbnQgPSBjdHguYWdlbnQ7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcih7XG4gICAgY29uZmlnOiB7IC4uLmFnZW50Lm9wdGlvbnMubG9nZ2luZywgbmFtZTogYWdlbnQubmFtZSB9LFxuICAgIHN1YnN5c3RlbTogXCJzYW5kYm94OnJlc29sdmVcIixcbiAgICBjb250ZXh0OiB7IHNhbmRib3hJZDogY3R4LnNhbmRib3hJZCB9LFxuICB9KTtcblxuICBpZiAoY3R4Ll9wZW5kaW5nU2V0dXApIHtcbiAgICByZXR1cm4gYXdhaXQgY3R4Ll9wZW5kaW5nU2V0dXA7XG4gIH1cblxuICBsZXQgcmVjb3JkID0gYXdhaXQgYWdlbnQuc3RvcmFnZS5zYW5kYm94LmdldChjdHguc2FuZGJveElkKTtcblxuICBpZiAoIXJlY29yZCkge1xuICAgIGNvbnN0IHsgZG9uZSB9ID0gYXdhaXQgc2V0dXAoY3R4LCB7IHNpZ25hbCB9KTtcbiAgICByZXR1cm4gYXdhaXQgZG9uZTtcbiAgfVxuXG4gIGlmICghcmVjb3JkLnNldHVwPy5jb21wbGV0ZWRBdCkge1xuICAgIGF3YWl0IHBvbGxVbnRpbFJlYWR5KGN0eCwgc2lnbmFsKTtcbiAgICByZWNvcmQgPSBhd2FpdCBhZ2VudC5zdG9yYWdlLnNhbmRib3guZ2V0KGN0eC5zYW5kYm94SWQpO1xuICB9XG5cbiAgaWYgKCFyZWNvcmQpIHtcbiAgICB0aHJvdyBuZXcgU2FuZGJveE5vdEZvdW5kRXJyb3IoeyBpZDogY3R4LnNhbmRib3hJZCB9KTtcbiAgfVxuXG4gIGNvbnN0IHsgYmluZGluZyB9ID0gYXdhaXQgcmVzb2x2ZUJpbmRpbmcoXG4gICAgY3R4LmFnZW50Lm9wdGlvbnMuc2FuZGJveCxcbiAgICByZWNvcmQuc2V0dXAuYmluZGluZ1xuICApO1xuXG4gIGFnZW50LnN0b3JhZ2Uuc2FuZGJveFxuICAgIC51cGRhdGUoY3R4LnNhbmRib3hJZCwgeyBsYXN0QWN0aXZlQXQ6IERhdGUubm93KCkgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBsb2cuZXJyb3IoXCJGYWlsZWQgdG8gdXBkYXRlIHNhbmRib3ggbGFzdEFjdGl2ZUF0XCIsIHsgZXJyb3IgfSk7XG4gICAgfSk7XG5cbiAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBiaW5kaW5nLmNvbm5lY3Qoe1xuICAgIGFnZW50LFxuICAgIG1ldGFkYXRhOiByZWNvcmQuc2V0dXAubWV0YWRhdGEsXG4gICAgc2lnbmFsLFxuICAgIGxvZyxcbiAgfSk7XG4gIGN0eC5fY3dkID0gaW5zdGFuY2UuY3dkO1xuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBvbGxVbnRpbFJlYWR5KFxuICBjdHg6IFNhbmRib3hDb250ZXh0LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFBPTExfVElNRU9VVF9NUztcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgY29uc3QgcmVjb3JkID0gYXdhaXQgY3R4LmFnZW50LnN0b3JhZ2Uuc2FuZGJveC5nZXQoY3R4LnNhbmRib3hJZCk7XG4gICAgaWYgKHJlY29yZD8uc2V0dXA/LmNvbXBsZXRlZEF0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgUE9MTF9JTlRFUlZBTF9NUykpO1xuICB9XG5cbiAgdGhyb3cgbmV3IFNhbmRib3hFcnJvcih7XG4gICAgcmVhc29uOiBgVGltZWQgb3V0IHdhaXRpbmcgZm9yIHNhbmRib3ggXCIke2N0eC5zYW5kYm94SWR9XCIgc2V0dXAgdG8gY29tcGxldGVgLFxuICB9KTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveENvbnRleHQgfSBmcm9tIFwiLi9oYW5kbGVcIjtcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwiLi9zZXR1cFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlYyhcbiAgc2FuZGJveENvbnRleHQ6IFNhbmRib3hDb250ZXh0LFxuICAuLi5vcHRzOiBQYXJhbWV0ZXJzPFNhbmRib3hJbnN0YW5jZVtcImV4ZWNcIl0+XG4pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC5leGVjKC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREb21haW4oXG4gIHNhbmRib3hDb250ZXh0OiBTYW5kYm94Q29udGV4dCxcbiAgLi4ub3B0czogUGFyYW1ldGVyczxTYW5kYm94SW5zdGFuY2VbXCJnZXREb21haW5cIl0+XG4pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC5nZXREb21haW4oLi4ub3B0cyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vc2V0dXBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFN0YXR1cyhcbiAgc2FuZGJveENvbnRleHQ6IFNhbmRib3hDb250ZXh0LFxuICAuLi5vcHRzOiBQYXJhbWV0ZXJzPFNhbmRib3hJbnN0YW5jZVtcImdldFN0YXR1c1wiXT5cbikge1xuICBcInVzZSBzdGVwXCI7XG4gIGNvbnN0IHNieCA9IGF3YWl0IHJlc29sdmUoc2FuZGJveENvbnRleHQpO1xuICByZXR1cm4gYXdhaXQgc2J4LmdldFN0YXR1cyguLi5vcHRzKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveENvbnRleHQgfSBmcm9tIFwiLi9oYW5kbGVcIjtcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwiLi9zZXR1cFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbChcbiAgc2FuZGJveENvbnRleHQ6IFNhbmRib3hDb250ZXh0LFxuICAuLi5vcHRzOiBQYXJhbWV0ZXJzPFNhbmRib3hJbnN0YW5jZVtcImtpbGxcIl0+XG4pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC5raWxsKC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRmlsZShcbiAgc2FuZGJveENvbnRleHQ6IFNhbmRib3hDb250ZXh0LFxuICAuLi5vcHRzOiBQYXJhbWV0ZXJzPFNhbmRib3hJbnN0YW5jZVtcInJlYWRGaWxlXCJdPlxuKSB7XG4gIFwidXNlIHN0ZXBcIjtcbiAgY29uc3Qgc2J4ID0gYXdhaXQgcmVzb2x2ZShzYW5kYm94Q29udGV4dCk7XG4gIHJldHVybiBhd2FpdCBzYngucmVhZEZpbGUoLi4ub3B0cyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vc2V0dXBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNuYXBzaG90KFxuICBzYW5kYm94Q29udGV4dDogU2FuZGJveENvbnRleHQsXG4gIC4uLm9wdHM6IFBhcmFtZXRlcnM8U2FuZGJveEluc3RhbmNlW1wic25hcHNob3RcIl0+XG4pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC5zbmFwc2hvdCguLi5vcHRzKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveENvbnRleHQgfSBmcm9tIFwiLi9oYW5kbGVcIjtcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwiLi9zZXR1cFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnQoXG4gIHNhbmRib3hDb250ZXh0OiBTYW5kYm94Q29udGV4dCxcbiAgLi4ub3B0czogUGFyYW1ldGVyczxTYW5kYm94SW5zdGFuY2VbXCJzdGFydFwiXT5cbikge1xuICBcInVzZSBzdGVwXCI7XG4gIGNvbnN0IHNieCA9IGF3YWl0IHJlc29sdmUoc2FuZGJveENvbnRleHQpO1xuICByZXR1cm4gYXdhaXQgc2J4LnN0YXJ0KC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wKFxuICBzYW5kYm94Q29udGV4dDogU2FuZGJveENvbnRleHQsXG4gIC4uLm9wdHM6IFBhcmFtZXRlcnM8U2FuZGJveEluc3RhbmNlW1wic3RvcFwiXT5cbikge1xuICBcInVzZSBzdGVwXCI7XG4gIGNvbnN0IHNieCA9IGF3YWl0IHJlc29sdmUoc2FuZGJveENvbnRleHQpO1xuICByZXR1cm4gYXdhaXQgc2J4LnN0b3AoLi4ub3B0cyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vc2V0dXBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZU5ldHdvcmtQb2xpY3koXG4gIHNhbmRib3hDb250ZXh0OiBTYW5kYm94Q29udGV4dCxcbiAgLi4ub3B0czogUGFyYW1ldGVyczxTYW5kYm94SW5zdGFuY2VbXCJ1cGRhdGVOZXR3b3JrUG9saWN5XCJdPlxuKSB7XG4gIFwidXNlIHN0ZXBcIjtcbiAgY29uc3Qgc2J4ID0gYXdhaXQgcmVzb2x2ZShzYW5kYm94Q29udGV4dCk7XG4gIHJldHVybiBhd2FpdCBzYngudXBkYXRlTmV0d29ya1BvbGljeSguLi5vcHRzKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveENvbnRleHQgfSBmcm9tIFwiLi9oYW5kbGVcIjtcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwiLi9zZXR1cFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWxlcyhcbiAgc2FuZGJveENvbnRleHQ6IFNhbmRib3hDb250ZXh0LFxuICAuLi5vcHRzOiBQYXJhbWV0ZXJzPFNhbmRib3hJbnN0YW5jZVtcIndyaXRlRmlsZXNcIl0+XG4pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC53cml0ZUZpbGVzKC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgVG9vbFNldCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgdHlwZSB7IEFueUFnZW50IH0gZnJvbSBcIi4uL2FnZW50L2NsaWVudFwiO1xuaW1wb3J0IHsgZ2V0U2Vzc2lvbkNvbnRleHRzIH0gZnJvbSBcIi4uL2FnZW50L2NsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94QmluZGluZyB9IGZyb20gXCIuLi9zYW5kYm94L2FkYXB0ZXJcIjtcbmltcG9ydCB7IGxhenlTYW5kYm94SGFuZGxlIH0gZnJvbSBcIi4uL3NhbmRib3gvaGFuZGxlXCI7XG5pbXBvcnQgeyBoaXN0b3J5IH0gZnJvbSBcIi4vaGlzdG9yeVwiO1xuaW1wb3J0IHsgaW50ZXJydXB0IH0gZnJvbSBcIi4vaW50ZXJydXB0XCI7XG5pbXBvcnQgeyBzZW5kIH0gZnJvbSBcIi4vc2VuZFwiO1xuaW1wb3J0IHsgc3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtXCI7XG5pbXBvcnQgeyB1cGRhdGUgfSBmcm9tIFwiLi91cGRhdGVcIjtcbmltcG9ydCB7IHVzYWdlIH0gZnJvbSBcIi4vdXNhZ2VcIjtcblxudHlwZSBTZXNzaW9uT3B0aW9ucyA9IHtcbiAgaWQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTZXNzaW9uQ29udGV4dCA9IHtcbiAgYWdlbnQ6IEFueUFnZW50O1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXNzaW9uSGFuZGxlPFxuICBUb29scyBleHRlbmRzIFRvb2xTZXQsXG4gIFRDb250ZXh0LFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdID0gU2FuZGJveEJpbmRpbmcsXG4+KGFnZW50OiBBbnlBZ2VudCwgaWQ/OiBzdHJpbmcgfCBTZXNzaW9uT3B0aW9ucykge1xuICBjb25zdCBzZXNzaW9uSWQgPVxuICAgIHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIiA/IGlkIDogKGlkPy5pZCA/PyBgc2Vzc2lvbl8ke3VsaWQoKX1gKTtcblxuICBjb25zdCBjb250ZXh0cyA9IGdldFNlc3Npb25Db250ZXh0cyhhZ2VudCk7XG4gIGxldCBzZXNzaW9uQ29udGV4dCA9IGNvbnRleHRzLmdldChzZXNzaW9uSWQpO1xuICBpZiAoIXNlc3Npb25Db250ZXh0KSB7XG4gICAgc2Vzc2lvbkNvbnRleHQgPSB7IGFnZW50LCBzZXNzaW9uSWQgfTtcbiAgICBjb250ZXh0cy5zZXQoc2Vzc2lvbklkLCBzZXNzaW9uQ29udGV4dCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgc2VuZDogKHNlbmQ8VG9vbHMsIFRDb250ZXh0PikuYmluZChudWxsLCBzZXNzaW9uQ29udGV4dCksXG4gICAgc3RyZWFtOiBzdHJlYW0uYmluZChudWxsLCBzZXNzaW9uQ29udGV4dCksXG4gICAgaGlzdG9yeTogKGhpc3Rvcnk8VG9vbHM+KS5iaW5kKG51bGwsIHNlc3Npb25Db250ZXh0KSxcbiAgICBpbnRlcnJ1cHQ6IGludGVycnVwdC5iaW5kKG51bGwsIHNlc3Npb25Db250ZXh0KSxcbiAgICB1c2FnZTogdXNhZ2UuYmluZChudWxsLCBzZXNzaW9uQ29udGV4dCksXG4gICAgdXBkYXRlOiB1cGRhdGUuYmluZChudWxsLCBzZXNzaW9uQ29udGV4dCksXG4gICAgc2FuZGJveDogbGF6eVNhbmRib3hIYW5kbGU8VFNhbmRib3hCaW5kaW5ncz4oYWdlbnQsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGFnZW50LnN0b3JhZ2Uuc2Vzc2lvbi5nZXQoc2Vzc2lvbklkKTtcbiAgICAgIHJldHVybiByZWNvcmQ/LnNhbmRib3hJZCA/PyBzZXNzaW9uSWQ7XG4gICAgfSksXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUge1xuICBJbmZlclVJVG9vbHMsXG4gIFJlYXNvbmluZ1VJUGFydCxcbiAgVGV4dFVJUGFydCxcbiAgVG9vbFNldCxcbiAgVUlNZXNzYWdlLFxufSBmcm9tIFwiYWlcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnREYXRhVHlwZXMgfSBmcm9tIFwiLi4vYWdlbnQvcmVnaXN0cnlcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgUGFydCB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5cbi8qKiBTdWItdG9vbCBwYXJ0cyAoZnJvbSBKYXZhU2NyaXB0IG1ldGEtdG9vbCkgdXNlIHRoaXMgdG9vbENhbGxJZCBwcmVmaXguICovXG5mdW5jdGlvbiBpc1N1YlRvb2xQYXJ0KHBhcnQ6IFBhcnQpOiBib29sZWFuIHtcbiAgY29uc3QgcCA9IHBhcnQucGFydCBhcyB7IHRvb2xDYWxsSWQ/OiBzdHJpbmcgfTtcbiAgcmV0dXJuIHR5cGVvZiBwPy50b29sQ2FsbElkID09PSBcInN0cmluZ1wiICYmIHAudG9vbENhbGxJZC5zdGFydHNXaXRoKFwianNfdGNfXCIpO1xufVxuXG5mdW5jdGlvbiBpc1N0cmVhbWluZ0NvbnRlbnQoXG4gIHBhcnQ6IHVua25vd25cbik6IHBhcnQgaXMgVGV4dFVJUGFydCB8IFJlYXNvbmluZ1VJUGFydCB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIgJiZcbiAgICBwYXJ0ICE9PSBudWxsICYmXG4gICAgXCJ0eXBlXCIgaW4gcGFydCAmJlxuICAgIChwYXJ0LnR5cGUgPT09IFwidGV4dFwiIHx8IHBhcnQudHlwZSA9PT0gXCJyZWFzb25pbmdcIilcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SW50ZXJydXB0Q3V0b2ZmKHtcbiAgcGFydHMsXG4gIGxhc3RQYXJ0LFxufToge1xuICBwYXJ0czogUGFydFtdO1xuICBsYXN0UGFydDogeyBpbmRleDogbnVtYmVyOyBwYXJ0OiB1bmtub3duIH07XG59KTogUGFydFtdIHtcbiAgcmV0dXJuIHBhcnRzXG4gICAgLmZpbHRlcigocCkgPT4gcC5pbmRleCA8PSBsYXN0UGFydC5pbmRleClcbiAgICAubWFwKChwKSA9PiB7XG4gICAgICBpZiAocC5pbmRleCAhPT0gbGFzdFBhcnQuaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIE9ubHkgcmVwbGFjZSBjb250ZW50IGZvciBzdHJlYW1pbmcgcGFydHMgKHRleHQsIHJlYXNvbmluZykgd2hlcmUgdGhlXG4gICAgICAgKiBjbGllbnQncyB0cnVuY2F0ZWQgdmVyc2lvbiBpcyBtb3JlIGFjY3VyYXRlIHRoYW4gdGhlIHNlcnZlcidzIGZ1bGxcbiAgICAgICAqIHZlcnNpb24uIEZvciBzdGF0ZWZ1bCBwYXJ0cyAodG9vbHMpLCB0aGUgc2VydmVyJ3MgdmVyc2lvbiBpc1xuICAgICAgICogYXV0aG9yaXRhdGl2ZSBcdTIwMTQgaXQgbWF5IGhhdmUgZXZvbHZlZCAoZS5nLiBhcHByb3ZhbC1yZXF1ZXN0ZWQgXHUyMTkyXG4gICAgICAgKiBvdXRwdXQtZGVuaWVkKSBhZnRlciB0aGUgY2xpZW50IHNuYXBzaG90IHdhcyB0YWtlbi5cbiAgICAgICAqL1xuICAgICAgaWYgKGlzU3RyZWFtaW5nQ29udGVudChsYXN0UGFydC5wYXJ0KSkge1xuICAgICAgICByZXR1cm4geyAuLi5wLCBwYXJ0OiBsYXN0UGFydC5wYXJ0IH0gYXMgUGFydDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVVSU1lc3NhZ2VzPFRvb2xzIGV4dGVuZHMgVG9vbFNldD4ob3B0czoge1xuICBtZXNzYWdlczogTWVzc2FnZVtdO1xuICBwYXJ0czogUGFydFtdO1xuICB1bnRpbD86IG51bWJlcjtcbiAgaW5jbHVkZVF1ZXVlZD86IGJvb2xlYW47XG4gIC8qKiBXaGVuIHRydWUsIGZpbHRlcnMgb3V0IHN1Yi10b29sIHBhcnRzIHNvIHRoZSBMTE0gZG9lc24ndCBzZWUgdGhlbS4gKi9cbiAgZXhjbHVkZVN1YlRvb2xQYXJ0cz86IGJvb2xlYW47XG59KSB7XG4gIHR5cGUgVHlwZWRVSU1lc3NhZ2UgPSBVSU1lc3NhZ2U8dW5rbm93biwgQWdlbnREYXRhVHlwZXMsIEluZmVyVUlUb29sczxUb29scz4+O1xuXG4gIGxldCBmaWx0ZXJlZCA9IG9wdHMubWVzc2FnZXM7XG5cbiAgaWYgKG9wdHMudW50aWwgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHVudGlsID0gb3B0cy51bnRpbDtcbiAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigobSkgPT4gbS5jcmVhdGVkQXQgPD0gdW50aWwpO1xuICB9XG5cbiAgaWYgKCFvcHRzLmluY2x1ZGVRdWV1ZWQpIHtcbiAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigobSkgPT4gbS5zdGFydGVkQXQgIT09IG51bGwpO1xuICB9XG5cbiAgLy8gU29ydCBieSBjcmVhdGVkQXQgc28gbWVzc2FnZXMgYXJlIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgcmVnYXJkbGVzcyBvZlxuICAvLyBob3cgdGhlIHN0b3JhZ2UgbGF5ZXIgcmV0dXJucyB0aGVtIChlLmcuIGxvY2FsIEZTIHJlYWRzIGluIHJlYWRkaXIgb3JkZXIpLlxuICBmaWx0ZXJlZCA9IFsuLi5maWx0ZXJlZF0uc29ydCgoYSwgYikgPT4gYS5jcmVhdGVkQXQgLSBiLmNyZWF0ZWRBdCk7XG5cbiAgY29uc3QgcGFydHMgPSBvcHRzLmV4Y2x1ZGVTdWJUb29sUGFydHNcbiAgICA/IG9wdHMucGFydHMuZmlsdGVyKChwKSA9PiAhaXNTdWJUb29sUGFydChwKSlcbiAgICA6IG9wdHMucGFydHM7XG5cbiAgY29uc3QgcGFydHNCeU1lc3NhZ2UgPSBuZXcgTWFwPHN0cmluZywgUGFydFtdPigpO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBjb25zdCBtZXNzYWdlSWQgPSBTdHJpbmcocGFydC5tZXNzYWdlSWQpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gcGFydHNCeU1lc3NhZ2UuZ2V0KG1lc3NhZ2VJZCkgPz8gW107XG4gICAgZXhpc3RpbmcucHVzaChwYXJ0KTtcbiAgICBwYXJ0c0J5TWVzc2FnZS5zZXQobWVzc2FnZUlkLCBleGlzdGluZyk7XG4gIH1cblxuICByZXR1cm4gZmlsdGVyZWRcbiAgICAubWFwKChtKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlSWQgPSBTdHJpbmcobS5pZCk7XG4gICAgICBsZXQgbWVzc2FnZVBhcnRzID0gcGFydHNCeU1lc3NhZ2UuZ2V0KG1lc3NhZ2VJZCkgPz8gW107XG4gICAgICBtZXNzYWdlUGFydHMuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuXG4gICAgICBpZiAobS5pbnRlcnJ1cHRlZExhc3RQYXJ0ICE9IG51bGwpIHtcbiAgICAgICAgbWVzc2FnZVBhcnRzID0gYXBwbHlJbnRlcnJ1cHRDdXRvZmYoe1xuICAgICAgICAgIHBhcnRzOiBtZXNzYWdlUGFydHMsXG4gICAgICAgICAgbGFzdFBhcnQ6IG0uaW50ZXJydXB0ZWRMYXN0UGFydCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgIHJvbGU6IG0ucm9sZSxcbiAgICAgICAgcGFydHM6IG1lc3NhZ2VQYXJ0cy5tYXAoKHApID0+IHAucGFydCksXG4gICAgICAgIC4uLihtLm1ldGFkYXRhICE9IG51bGwgPyB7IG1ldGFkYXRhOiBtLm1ldGFkYXRhIH0gOiB7fSksXG4gICAgICB9IGFzIFR5cGVkVUlNZXNzYWdlO1xuICAgIH0pXG4gICAgLmZpbHRlcigobSkgPT4gbS5wYXJ0cy5sZW5ndGggPiAwKTtcbn1cbiIsICJleHBvcnQgdHlwZSBTdGVwVXNhZ2UgPSB7XG4gIHN0ZXBJbmRleDogbnVtYmVyO1xuICBtb2RlbDogc3RyaW5nO1xuICBpbnB1dFRva2VuczogbnVtYmVyO1xuICBvdXRwdXRUb2tlbnM6IG51bWJlcjtcbiAgdG90YWxUb2tlbnM6IG51bWJlcjtcbiAgY2FjaGVSZWFkVG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlV3JpdGVUb2tlbnM6IG51bWJlcjtcbiAgcmVhc29uaW5nVG9rZW5zOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBVc2FnZVN1bW1hcnkgPSB7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICB0b3RhbFRva2VuczogbnVtYmVyO1xuICBjYWNoZVJlYWRUb2tlbnM6IG51bWJlcjtcbiAgY2FjaGVXcml0ZVRva2VuczogbnVtYmVyO1xuICByZWFzb25pbmdUb2tlbnM6IG51bWJlcjtcbiAgc3RlcENvdW50OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBTZXNzaW9uVXNhZ2UgPSB7XG4gIHRvdGFsOiBVc2FnZVN1bW1hcnkgJiB7IG1lc3NhZ2VDb3VudDogbnVtYmVyIH07XG4gIGJ5TWVzc2FnZUlkOiBSZWNvcmQ8c3RyaW5nLCBVc2FnZVN1bW1hcnkgfCBudWxsPjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU2Vzc2lvblVzYWdlKFxuICBtZXNzYWdlczogQXJyYXk8e1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXNhZ2U6IHsgc3RlcHM6IFN0ZXBVc2FnZVtdOyBzdW1tYXJ5OiBVc2FnZVN1bW1hcnkgfSB8IG51bGw7XG4gIH0+XG4pOiBTZXNzaW9uVXNhZ2Uge1xuICBjb25zdCBieU1lc3NhZ2VJZDogUmVjb3JkPHN0cmluZywgVXNhZ2VTdW1tYXJ5IHwgbnVsbD4gPSB7fTtcbiAgZm9yIChjb25zdCBtIG9mIG1lc3NhZ2VzKSB7XG4gICAgYnlNZXNzYWdlSWRbbS5pZF0gPSBtLnVzYWdlPy5zdW1tYXJ5ID8/IG51bGw7XG4gIH1cblxuICBjb25zdCBzdW1tYXJpZXMgPSBtZXNzYWdlc1xuICAgIC5tYXAoKG0pID0+IG0udXNhZ2U/LnN1bW1hcnkpXG4gICAgLmZpbHRlcigocyk6IHMgaXMgVXNhZ2VTdW1tYXJ5ID0+IHMgIT09IHVuZGVmaW5lZCk7XG5cbiAgY29uc3QgdG90YWwgPSB7XG4gICAgbW9kZWw6IHN1bW1hcmllc1swXT8ubW9kZWwgPz8gXCJ1bmtub3duXCIsXG4gICAgaW5wdXRUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5pbnB1dFRva2VucywgMCksXG4gICAgb3V0cHV0VG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMub3V0cHV0VG9rZW5zLCAwKSxcbiAgICB0b3RhbFRva2Vuczogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLnRvdGFsVG9rZW5zLCAwKSxcbiAgICBjYWNoZVJlYWRUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5jYWNoZVJlYWRUb2tlbnMsIDApLFxuICAgIGNhY2hlV3JpdGVUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5jYWNoZVdyaXRlVG9rZW5zLCAwKSxcbiAgICByZWFzb25pbmdUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5yZWFzb25pbmdUb2tlbnMsIDApLFxuICAgIHN0ZXBDb3VudDogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLnN0ZXBDb3VudCwgMCksXG4gICAgbWVzc2FnZUNvdW50OiBzdW1tYXJpZXMubGVuZ3RoLFxuICB9O1xuXG4gIHJldHVybiB7IHRvdGFsLCBieU1lc3NhZ2VJZCB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgVG9vbFNldCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgYXNzZW1ibGVVSU1lc3NhZ2VzIH0gZnJvbSBcIi4uL3V0aWxzL3VpXCI7XG5pbXBvcnQgeyBjb21wdXRlU2Vzc2lvblVzYWdlLCB0eXBlIFNlc3Npb25Vc2FnZSB9IGZyb20gXCIuLi91dGlscy91c2FnZVwiO1xuaW1wb3J0IHR5cGUgeyBTZXNzaW9uQ29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuXG5leHBvcnQgdHlwZSBIaXN0b3J5UmVzdWx0ID0ge1xuICBtZXNzYWdlczogUmV0dXJuVHlwZTx0eXBlb2YgYXNzZW1ibGVVSU1lc3NhZ2VzPjtcbiAgc3RyZWFtaW5nTWVzc2FnZUlkOiBzdHJpbmcgfCBudWxsO1xuICB1c2FnZTogU2Vzc2lvblVzYWdlO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhpc3Rvcnk8VG9vbHMgZXh0ZW5kcyBUb29sU2V0PihcbiAgc2Vzc2lvbkNvbnRleHQ6IFNlc3Npb25Db250ZXh0XG4pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBjb25zdCBbc2Vzc2lvbiwgbWVzc2FnZXMsIHBhcnRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnNlc3Npb24uZ2V0KHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCksXG4gICAgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5tZXNzYWdlLmxpc3RCeVNlc3Npb24oXG4gICAgICBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWRcbiAgICApLFxuICAgIHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UucGFydC5saXN0QnlTZXNzaW9uKHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCksXG4gIF0pO1xuXG4gIGNvbnN0IGxhc3RBc3Npc3RhbnQgPVxuICAgIG1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5pZCA9PT0gc2Vzc2lvbj8ubGFzdE1lc3NhZ2VJZCAmJiBtLnJvbGUgPT09IFwiYXNzaXN0YW50XCJcbiAgICApID8/IG1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS5yb2xlID09PSBcImFzc2lzdGFudFwiKS5hdCgtMSk7XG5cbiAgY29uc3QgaXNTdHJlYW1pbmcgPVxuICAgIGxhc3RBc3Npc3RhbnQ/LmNvbXBsZXRlZEF0ID09PSBudWxsICYmXG4gICAgbGFzdEFzc2lzdGFudD8uaW50ZXJydXB0ZWRBdCA9PT0gbnVsbDtcbiAgY29uc3Qgc3RyZWFtaW5nTWVzc2FnZUlkID0gaXNTdHJlYW1pbmcgPyBsYXN0QXNzaXN0YW50LmlkIDogbnVsbDtcbiAgY29uc3QgdmlzaWJsZVVudGlsID0gbGFzdEFzc2lzdGFudD8uY3JlYXRlZEF0O1xuXG4gIGNvbnN0IGFzc2VtYmxlZCA9IGFzc2VtYmxlVUlNZXNzYWdlczxUb29scz4oe1xuICAgIG1lc3NhZ2VzLFxuICAgIHBhcnRzLFxuICAgIGluY2x1ZGVRdWV1ZWQ6IHZpc2libGVVbnRpbCAhPT0gdW5kZWZpbmVkLFxuICAgIHVudGlsOiB2aXNpYmxlVW50aWwsXG4gIH0pO1xuXG4gIGNvbnN0IHVzYWdlID0gY29tcHV0ZVNlc3Npb25Vc2FnZShtZXNzYWdlcyk7XG5cbiAgcmV0dXJuIHsgbWVzc2FnZXM6IGFzc2VtYmxlZCwgc3RyZWFtaW5nTWVzc2FnZUlkLCB1c2FnZSB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgVUlNZXNzYWdlIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgdHlwZSB7IFNlc3Npb25Db250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5cbmV4cG9ydCB0eXBlIEludGVycnVwdE9wdGlvbnMgPSB7XG4gIGxhc3RQYXJ0Pzoge1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgcGFydDogdW5rbm93bjtcbiAgfTtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnRlcnJ1cHQoXG4gIHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dCxcbiAgb3B0cz86IEludGVycnVwdE9wdGlvbnNcbikge1xuICBcInVzZSBzdGVwXCI7XG4gIGNvbnN0IG1lc3NhZ2VzID0gYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5tZXNzYWdlLmxpc3RCeVNlc3Npb24oXG4gICAgc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkXG4gICk7XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgbGV0IHBlbmRpbmdBc3Npc3RhbnRNZXNzYWdlcyA9IG1lc3NhZ2VzLmZpbHRlcihcbiAgICAobSkgPT5cbiAgICAgIG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiAmJlxuICAgICAgbS5jb21wbGV0ZWRBdCA9PT0gbnVsbCAmJlxuICAgICAgbS5pbnRlcnJ1cHRlZEF0ID09PSBudWxsXG4gICk7XG5cbiAgaWYgKHBlbmRpbmdBc3Npc3RhbnRNZXNzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICBjb25zdCBNQVhfUkVUUk9BQ1RJVkVfTVMgPSA1XzAwMDtcbiAgICBjb25zdCBsYXRlc3QgPSBtZXNzYWdlc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKG0pID0+XG4gICAgICAgICAgbS5yb2xlID09PSBcImFzc2lzdGFudFwiICYmXG4gICAgICAgICAgbS5pbnRlcnJ1cHRlZEF0ID09PSBudWxsICYmXG4gICAgICAgICAgbS5jb21wbGV0ZWRBdCAhPT0gbnVsbCAmJlxuICAgICAgICAgIG5vdyAtIG0uY29tcGxldGVkQXQgPCBNQVhfUkVUUk9BQ1RJVkVfTVNcbiAgICAgIClcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBiLmNyZWF0ZWRBdCAtIGEuY3JlYXRlZEF0KVxuICAgICAgLmF0KDApO1xuICAgIGlmIChsYXRlc3QpIHtcbiAgICAgIHBlbmRpbmdBc3Npc3RhbnRNZXNzYWdlcyA9IFtsYXRlc3RdO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHBlbmRpbmdBc3Npc3RhbnRNZXNzYWdlcy5tYXAoKG0pID0+XG4gICAgICBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLm1lc3NhZ2Uuc2V0KG0uaWQsIHtcbiAgICAgICAgLi4ubSxcbiAgICAgICAgaW50ZXJydXB0ZWRBdDogbm93LFxuICAgICAgICBpbnRlcnJ1cHRlZExhc3RQYXJ0OiBvcHRzPy5sYXN0UGFydCA/PyBudWxsLFxuICAgICAgfSlcbiAgICApXG4gICk7XG5cbiAgY29uc3QgbWVzc2FnZUlkcyA9IG5ldyBTZXQocGVuZGluZ0Fzc2lzdGFudE1lc3NhZ2VzLm1hcCgobSkgPT4gbS5pZCkpO1xuICBpZiAobWVzc2FnZUlkcy5zaXplID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYWxsUGFydHMgPSBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnBhcnQubGlzdEJ5U2Vzc2lvbihcbiAgICBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWRcbiAgKTtcblxuICBmb3IgKGNvbnN0IHAgb2YgYWxsUGFydHMpIHtcbiAgICBpZiAoIW1lc3NhZ2VJZHMuaGFzKHAubWVzc2FnZUlkKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHAucGFydCAmJlxuICAgICAgXCJzdGF0ZVwiIGluIHAucGFydCAmJlxuICAgICAgKHAucGFydCBhcyB7IHN0YXRlOiBzdHJpbmcgfSkuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVxdWVzdGVkXCIgJiZcbiAgICAgIFwiYXBwcm92YWxcIiBpbiBwLnBhcnRcbiAgICApIHtcbiAgICAgIGNvbnN0IGFwcHJvdmFsID0gKHAucGFydCBhcyB7IGFwcHJvdmFsPzogeyBpZDogc3RyaW5nIH0gfSkuYXBwcm92YWw7XG4gICAgICBpZiAoYXBwcm92YWw/LmlkKSB7XG4gICAgICAgIGF3YWl0IHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UucGFydC5zZXQocC5pZCwge1xuICAgICAgICAgIC4uLnAsXG4gICAgICAgICAgcGFydDoge1xuICAgICAgICAgICAgLi4ucC5wYXJ0LFxuICAgICAgICAgICAgc3RhdGU6IFwib3V0cHV0LWRlbmllZFwiLFxuICAgICAgICAgICAgYXBwcm92YWw6IHtcbiAgICAgICAgICAgICAgLi4uYXBwcm92YWwsXG4gICAgICAgICAgICAgIGFwcHJvdmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgcmVhc29uOiBcImludGVycnVwdGVkXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgVUlNZXNzYWdlW1wicGFydHNcIl1bbnVtYmVyXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBGaW5pc2hSZWFzb24sIFRvb2xTZXQsIFVJTWVzc2FnZSwgVUlNZXNzYWdlQ2h1bmsgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IGFsbCB9IGZyb20gXCJiZXR0ZXItYWxsXCI7XG5pbXBvcnQgKiBhcyBlcnJvcmUgZnJvbSBcImVycm9yZVwiO1xuaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgdHlwZSB7IFR5cGVkVUlNZXNzYWdlIH0gZnJvbSBcIi4uL2FnZW50L3JlZ2lzdHJ5XCI7XG5pbXBvcnQgdHlwZSB7IFNraWxsU3VtbWFyeSB9IGZyb20gXCIuLi9za2lsbHMvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgUGFydCB9IGZyb20gXCIuLi9zdG9yYWdlL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IFN0ZXBVc2FnZSB9IGZyb20gXCIuLi91dGlscy91c2FnZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBTdHJlYW1UZXh0UmVzdWx0LFxuICBzdHJlYW1UZXh0LFxuICBzdHJlYW1UZXh0U3RlcCxcbn0gZnJvbSBcIi4vYWktbG9vcC9zdHJlYW0tdGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBTZXNzaW9uQ29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgaW50ZXJydXB0IH0gZnJvbSBcIi4vaW50ZXJydXB0XCI7XG5cbmNvbnN0IERFRkFVTFRfU1RFUF9USFJPVUdIUFVUID0gMTAwO1xuXG5leHBvcnQgdHlwZSBBcHByb3ZhbERhdGEgPSB7XG4gIGFwcHJvdmFsSWQ6IHN0cmluZztcbiAgYXBwcm92ZWQ6IGJvb2xlYW47XG4gIHJlYXNvbj86IHN0cmluZztcbn07XG5cbnR5cGUgTWVzc2FnZURhdGE8VG9vbHMgZXh0ZW5kcyBUb29sU2V0PiA9XG4gIHwgVUlNZXNzYWdlXG4gIHwge1xuICAgICAgcm9sZT86IFR5cGVkVUlNZXNzYWdlPHVua25vd24sIFRvb2xzPltcInJvbGVcIl07XG4gICAgICBwYXJ0czogVHlwZWRVSU1lc3NhZ2U8dW5rbm93biwgVG9vbHM+W1wicGFydHNcIl07XG4gICAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDtcbiAgICAgIGlkPzogc3RyaW5nO1xuICAgIH07XG5cbmV4cG9ydCB0eXBlIFNlbmRJbnB1dDxUb29scyBleHRlbmRzIFRvb2xTZXQ+ID1cbiAgfCBzdHJpbmdcbiAgfCBNZXNzYWdlRGF0YTxUb29scz5cbiAgfCB7IHR5cGU6IFwibWVzc2FnZVwiOyBtZXNzYWdlOiBNZXNzYWdlRGF0YTxUb29scz4gfVxuICB8IHsgdHlwZTogXCJhcHByb3ZhbFwiOyBhcHByb3ZhbDogQXBwcm92YWxEYXRhIH07XG5cbmV4cG9ydCB0eXBlIFNlbmRPcHRpb25zPFRDb250ZXh0PiA9IHtcbiAgaW50ZXJydXB0SWZTdHJlYW1pbmc/OlxuICAgIHwgYm9vbGVhblxuICAgIHwgeyBsYXN0UGFydDogeyBpbmRleDogbnVtYmVyOyBwYXJ0OiB1bmtub3duIH0gfTtcbiAgY29udGV4dD86IFRDb250ZXh0O1xuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBzYW5kYm94SWQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTZW5kUmVzdWx0ID0ge1xuICBhc3Npc3RhbnRNZXNzYWdlSWQ6IHN0cmluZztcbiAgZG9uZTogdHJ1ZSB8IFByb21pc2U8dHJ1ZT47XG59O1xuXG5leHBvcnQgdHlwZSBBY3RpdmVSdW4gPSB7XG4gIGNodW5rczogVUlNZXNzYWdlQ2h1bmtbXTtcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtPFVJTWVzc2FnZUNodW5rPjtcbiAgZG9uZTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJlc29sdmVzIHdoZW4gYSBuZXcgY2h1bmsgaXMgYXZhaWxhYmxlLiBSZXBsYWNlZCBhZnRlciBlYWNoIG5vdGlmaWNhdGlvbi4gKi9cbiAgb25DaHVuazogUHJvbWlzZTx2b2lkPjtcbn07XG5cbmNvbnN0IEFDVElWRV9SVU5TX0tFWSA9IFN5bWJvbC5mb3IoXCJleHBlcmltZW50YWwtYWdlbnQ6YWN0aXZlUnVuc1wiKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZVJ1bnMoKTogTWFwPHN0cmluZywgQWN0aXZlUnVuPiB7XG4gIGNvbnN0IGcgPSBnbG9iYWxUaGlzIGFzIFJlY29yZDxzeW1ib2wsIE1hcDxzdHJpbmcsIEFjdGl2ZVJ1bj4gfCB1bmRlZmluZWQ+O1xuICBpZiAoIWdbQUNUSVZFX1JVTlNfS0VZXSkge1xuICAgIGdbQUNUSVZFX1JVTlNfS0VZXSA9IG5ldyBNYXAoKTtcbiAgfVxuICByZXR1cm4gZ1tBQ1RJVkVfUlVOU19LRVldO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZDxUb29scyBleHRlbmRzIFRvb2xTZXQsIFRDb250ZXh0PihcbiAgc2Vzc2lvbkNvbnRleHQ6IFNlc3Npb25Db250ZXh0LFxuICBpbnB1dDogU2VuZElucHV0PFRvb2xzPiB8IFNlbmRJbnB1dDxUb29scz5bXSxcbiAgb3B0cz86IFNlbmRPcHRpb25zPFRDb250ZXh0PlxuKTogUHJvbWlzZTxTZW5kUmVzdWx0PiB7XG4gIGlmIChvcHRzPy5pbnRlcnJ1cHRJZlN0cmVhbWluZykge1xuICAgIGNvbnN0IGxhc3RQYXJ0ID1cbiAgICAgIHR5cGVvZiBvcHRzLmludGVycnVwdElmU3RyZWFtaW5nID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gb3B0cy5pbnRlcnJ1cHRJZlN0cmVhbWluZy5sYXN0UGFydFxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBhd2FpdCBpbnRlcnJ1cHQoc2Vzc2lvbkNvbnRleHQsIHsgbGFzdFBhcnQgfSk7XG4gIH1cblxuICBjb25zdCB7XG4gICAgd29ya2Zsb3dSdW5JZCxcbiAgICB3b3JrZmxvd1dyaXRhYmxlLFxuICAgIGV4aXN0aW5nUGFydENvdW50LFxuICAgIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICBhc3Npc3RhbnRNZXNzYWdlQ3JlYXRlZEF0LFxuICB9ID0gYXdhaXQgZXJyb3JlLnRyeUFzeW5jKHtcbiAgICB0cnk6ICgpID0+XG4gICAgICBpbml0U2Vzc2lvblN0ZXA8VG9vbHM+KHtcbiAgICAgICAgc2Vzc2lvbkNvbnRleHQsXG4gICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgICBzYW5kYm94SWQ6IG9wdHM/LnNhbmRib3hJZCxcbiAgICAgICAgaW5wdXQsXG4gICAgICB9KSxcbiAgICBjYXRjaDogKGUpID0+IHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBTZW5kRXJyb3Ioe1xuICAgICAgICBpZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgICByZWFzb246IFN0cmluZyhlKSxcbiAgICAgICAgY2F1c2U6IGUsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBsb29wT3B0cyA9IHtcbiAgICBzZXNzaW9uQ29udGV4dCxcbiAgICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgY3JlYXRlZEF0OiBhc3Npc3RhbnRNZXNzYWdlQ3JlYXRlZEF0LFxuICAgIGNvbnRleHQ6IChvcHRzPy5jb250ZXh0ID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBsYXN0UGFydEluZGV4OiBleGlzdGluZ1BhcnRDb3VudCxcbiAgICB3b3JrZmxvd1J1bklkLFxuICB9O1xuXG4gIGlmICh3b3JrZmxvd1dyaXRhYmxlKSB7XG4gICAgYXdhaXQgcnVuTG9vcDxUb29scz4oeyAuLi5sb29wT3B0cywgd3JpdGFibGU6IHdvcmtmbG93V3JpdGFibGUgfSk7XG4gICAgcmV0dXJuIHsgYXNzaXN0YW50TWVzc2FnZUlkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBjb25zdCBjaHVua3M6IFVJTWVzc2FnZUNodW5rW10gPSBbXTtcbiAgbGV0IG5vdGlmeUNodW5rOiAoKSA9PiB2b2lkO1xuICBsZXQgb25DaHVuayA9IG5ldyBQcm9taXNlPHZvaWQ+KChyKSA9PiB7XG4gICAgbm90aWZ5Q2h1bmsgPSByO1xuICB9KTtcblxuICBjb25zdCB3cml0YWJsZSA9IG5ldyBXcml0YWJsZVN0cmVhbTxVSU1lc3NhZ2VDaHVuaz4oe1xuICAgIHdyaXRlKGNodW5rKSB7XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICBjb25zdCBwcmV2ID0gbm90aWZ5Q2h1bms7XG4gICAgICBvbkNodW5rID0gbmV3IFByb21pc2U8dm9pZD4oKHIpID0+IHtcbiAgICAgICAgbm90aWZ5Q2h1bmsgPSByO1xuICAgICAgfSk7XG4gICAgICBwcmV2KCk7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgZG9uZSA9IHJ1bkxvb3A8VG9vbHM+KHsgLi4ubG9vcE9wdHMsIHdyaXRhYmxlIH0pO1xuXG4gIGNvbnN0IGFjdGl2ZVJ1bjogQWN0aXZlUnVuID0ge1xuICAgIGNodW5rcyxcbiAgICB3cml0YWJsZSxcbiAgICBkb25lLFxuICAgIGdldCBvbkNodW5rKCkge1xuICAgICAgcmV0dXJuIG9uQ2h1bms7XG4gICAgfSxcbiAgfTtcbiAgY29uc3QgYWN0aXZlUnVucyA9IGdldEFjdGl2ZVJ1bnMoKTtcbiAgYWN0aXZlUnVucy5zZXQoYXNzaXN0YW50TWVzc2FnZUlkLCBhY3RpdmVSdW4pO1xuICBkb25lLmZpbmFsbHkoKCkgPT4gYWN0aXZlUnVucy5kZWxldGUoYXNzaXN0YW50TWVzc2FnZUlkKSk7XG5cbiAgcmV0dXJuIHsgYXNzaXN0YW50TWVzc2FnZUlkLCBkb25lOiBkb25lLnRoZW4oKCkgPT4gdHJ1ZSkgfTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQUkgTG9vcFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5hc3luYyBmdW5jdGlvbiBydW5Mb29wPFRvb2xzIGV4dGVuZHMgVG9vbFNldD4oe1xuICB3b3JrZmxvd1J1bklkLFxuICBzZXNzaW9uQ29udGV4dCxcbiAgYXNzaXN0YW50TWVzc2FnZUlkLFxuICBjcmVhdGVkQXQsXG4gIGNvbnRleHQsXG4gIHdyaXRhYmxlLFxuICBsYXN0UGFydEluZGV4OiBpbml0aWFsUGFydEluZGV4LFxufToge1xuICB3b3JrZmxvd1J1bklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dDtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xuICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtO1xuICBsYXN0UGFydEluZGV4OiBudW1iZXI7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFnZW50ID0gc2Vzc2lvbkNvbnRleHQuYWdlbnQ7XG5cbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHsgLi4uYWdlbnQub3B0aW9ucy5sb2dnaW5nLCBuYW1lOiBhZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcImFpLWxvb3BcIixcbiAgfSk7XG4gIGNvbnN0IG1zZ0xvZyA9IGxvZy53aXRoQ29udGV4dCh7XG4gICAgc2Vzc2lvbklkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgbWVzc2FnZUlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIH0pO1xuICBjb25zdCBkb25lTWVzc2FnZSA9IG1zZ0xvZy50aW1lKFwib25NZXNzYWdlXCIpO1xuXG4gIGxldCBmaW5pc2hSZWFzb246IEZpbmlzaFJlYXNvbiB8IHVuZGVmaW5lZDtcbiAgbGV0IGxhc3RQYXJ0SW5kZXggPSBpbml0aWFsUGFydEluZGV4O1xuICBjb25zdCB1c2FnZVN0ZXBzOiBTdGVwVXNhZ2VbXSA9IFtdO1xuICBsZXQgZGlzY292ZXJlZFNraWxsczogU2tpbGxTdW1tYXJ5W10gfCBudWxsID0gbnVsbDtcblxuICB0cnkge1xuICAgIHdoaWxlIChmaW5pc2hSZWFzb24gIT09IFwic3RvcFwiKSB7XG4gICAgICBjb25zdCBzdHJlYW1UZXh0Rm4gPSB3b3JrZmxvd1J1bklkXG4gICAgICAgID8gc3RyZWFtVGV4dFN0ZXA8VG9vbHM+XG4gICAgICAgIDogc3RyZWFtVGV4dDxUb29scz47XG4gICAgICBjb25zdCB0aHJvdWdocHV0ID0gd29ya2Zsb3dSdW5JZCA/IDUgOiBERUZBVUxUX1NURVBfVEhST1VHSFBVVDtcblxuICAgICAgY29uc3QgcmVzdWx0OiBTdHJlYW1UZXh0UmVzdWx0ID0gYXdhaXQgc3RyZWFtVGV4dEZuKHtcbiAgICAgICAgc3RlcFRocm91Z2hwdXQ6IHRocm91Z2hwdXQsXG4gICAgICAgIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgYWdlbnQsXG4gICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgIHdyaXRhYmxlLFxuICAgICAgICBsYXN0UGFydEluZGV4LFxuICAgICAgICBzdGVwSW5kZXhPZmZzZXQ6IHVzYWdlU3RlcHMubGVuZ3RoLFxuICAgICAgICBkaXNjb3ZlcmVkU2tpbGxzLFxuICAgICAgfSk7XG5cbiAgICAgIGZpbmlzaFJlYXNvbiA9IHJlc3VsdC5maW5pc2hSZWFzb247XG4gICAgICBsYXN0UGFydEluZGV4ID0gcmVzdWx0Lmxhc3RQYXJ0SW5kZXg7XG4gICAgICB1c2FnZVN0ZXBzLnB1c2goLi4ucmVzdWx0LnVzYWdlU3RlcHMpO1xuICAgICAgZGlzY292ZXJlZFNraWxscyA9IHJlc3VsdC5kaXNjb3ZlcmVkU2tpbGxzO1xuXG4gICAgICBpZiAocmVzdWx0Lm1heFN0ZXBzICE9IG51bGwgJiYgdXNhZ2VTdGVwcy5sZW5ndGggPj0gcmVzdWx0Lm1heFN0ZXBzKSB7XG4gICAgICAgIG1zZ0xvZy5pbmZvKFwicmVhY2hlZCBtYXhTdGVwcyBsaW1pdFwiLCB7IG1heFN0ZXBzOiByZXN1bHQubWF4U3RlcHMgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LnBlbmRpbmdBcHByb3ZhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICBtc2dMb2cuaW5mbyhcInBlbmRpbmcgYXBwcm92YWxzLCBzdG9wcGluZyBsb29wXCIsIHtcbiAgICAgICAgICBjb3VudDogcmVzdWx0LnBlbmRpbmdBcHByb3ZhbHMubGVuZ3RoLFxuICAgICAgICAgIHRvb2xzOiByZXN1bHQucGVuZGluZ0FwcHJvdmFscy5tYXAoKHApID0+IHAudG9vbE5hbWUpLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZG9uZU1lc3NhZ2UoeyB0b3RhbFN0ZXBzOiB1c2FnZVN0ZXBzLmxlbmd0aCB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbXNnTG9nLmVycm9yKFwiQUkgbG9vcCBmYWlsZWRcIiwge1xuICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICB9KTtcbiAgICB0aHJvdyBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgY29tcGxldGVNZXNzYWdlU3RlcCh7XG4gICAgICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgICBzZXNzaW9uQ29udGV4dCxcbiAgICAgIHdyaXRhYmxlLFxuICAgICAgdXNhZ2VTdGVwcyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBTdGVwc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5hc3luYyBmdW5jdGlvbiBpbml0U2Vzc2lvblN0ZXA8VG9vbHMgZXh0ZW5kcyBUb29sU2V0Pih7XG4gIHNlc3Npb25Db250ZXh0LFxuICBzZXNzaW9uSWQsXG4gIHNhbmRib3hJZCxcbiAgaW5wdXQsXG59OiB7XG4gIHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dDtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHNhbmRib3hJZD86IHN0cmluZztcbiAgaW5wdXQ6IFNlbmRJbnB1dDxUb29scz4gfCBTZW5kSW5wdXQ8VG9vbHM+W107XG59KSB7XG4gIFwidXNlIHN0ZXBcIjtcblxuICBsZXQgd29ya2Zsb3dSdW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgd29ya2Zsb3dXcml0YWJsZTogV3JpdGFibGVTdHJlYW0gfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBnZXRXb3JrZmxvd01ldGFkYXRhLCBnZXRXcml0YWJsZSB9ID0gYXdhaXQgaW1wb3J0KFwid29ya2Zsb3dcIik7XG4gICAgd29ya2Zsb3dSdW5JZCA9IGdldFdvcmtmbG93TWV0YWRhdGEoKS53b3JrZmxvd1J1bklkO1xuICAgIHdvcmtmbG93V3JpdGFibGUgPSBnZXRXcml0YWJsZSgpO1xuICB9IGNhdGNoIHtcbiAgICAvLyB3b3JrZmxvdyBub3QgaW5zdGFsbGVkXG4gIH1cblxuICBjb25zdCBuZXdNZXNzYWdlczogTWVzc2FnZVtdID0gW107XG4gIGNvbnN0IG5ld1BhcnRzOiBQYXJ0W10gPSBbXTtcbiAgY29uc3QgbmV3QXBwcm92YWxzOiBBcHByb3ZhbERhdGFbXSA9IFtdO1xuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5wdXQpIHtcbiAgICAgIGNvbnN0IHsgbWVzc2FnZSwgcGFydHMsIGFwcHJvdmFscyB9ID0gdG9NZXNzYWdlQW5kUGFydHMoe1xuICAgICAgICBzZXNzaW9uSWQ6IHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCxcbiAgICAgICAgaW5wdXQ6IGksXG4gICAgICAgIGRlZmF1bHRSb2xlOiBcInVzZXJcIixcbiAgICAgIH0pO1xuICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgbmV3TWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIG5ld1BhcnRzLnB1c2goLi4ucGFydHMpO1xuICAgICAgbmV3QXBwcm92YWxzLnB1c2goLi4uYXBwcm92YWxzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBwYXJ0cywgYXBwcm92YWxzIH0gPSB0b01lc3NhZ2VBbmRQYXJ0cyh7XG4gICAgICBpbnB1dCxcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgZGVmYXVsdFJvbGU6IFwidXNlclwiLFxuICAgIH0pO1xuICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICBuZXdNZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgIH1cbiAgICBuZXdQYXJ0cy5wdXNoKC4uLnBhcnRzKTtcbiAgICBuZXdBcHByb3ZhbHMucHVzaCguLi5hcHByb3ZhbHMpO1xuICB9XG5cbiAgY29uc3QgbGFzdE5ld01lc3NhZ2UgPSBuZXdNZXNzYWdlcy5hdCgtMSk7XG4gIGNvbnN0IHJldXNlQXNzaXN0YW50ID0gbGFzdE5ld01lc3NhZ2U/LnJvbGUgPT09IFwiYXNzaXN0YW50XCI7XG5cbiAgY29uc3QgYXNzaXN0YW50TWVzc2FnZUlkID0gcmV1c2VBc3Npc3RhbnRcbiAgICA/IGxhc3ROZXdNZXNzYWdlLmlkXG4gICAgOiBgbWVzc2FnZV8ke3VsaWQoKX1gO1xuICBjb25zdCBiYXNlVGltZSA9IERhdGUubm93KCk7XG4gIGNvbnN0IGFzc2lzdGFudE1lc3NhZ2VDcmVhdGVkQXQgPSBiYXNlVGltZSArIG5ld01lc3NhZ2VzLmxlbmd0aDtcblxuICBpZiAoIXJldXNlQXNzaXN0YW50KSB7XG4gICAgbmV3TWVzc2FnZXMucHVzaCh7XG4gICAgICBpZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxuICAgICAgY3JlYXRlZEF0OiBhc3Npc3RhbnRNZXNzYWdlQ3JlYXRlZEF0LFxuICAgICAgc3RhcnRlZEF0OiBudWxsLFxuICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICBpbnRlcnJ1cHRlZEF0OiBudWxsLFxuICAgICAgaW50ZXJydXB0ZWRMYXN0UGFydDogbnVsbCxcbiAgICAgIHVzYWdlOiBudWxsLFxuICAgICAgd29ya2Zsb3dSdW5JZDogbnVsbCxcbiAgICAgIG1ldGFkYXRhOiBudWxsLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmdQYXJ0Q291bnQgPSByZXVzZUFzc2lzdGFudFxuICAgID8gbmV3UGFydHMuZmlsdGVyKChwKSA9PiBwLm1lc3NhZ2VJZCA9PT0gYXNzaXN0YW50TWVzc2FnZUlkKS5sZW5ndGhcbiAgICA6IDA7XG5cbiAgbGV0IHNlc3Npb24gPSBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGlmICghc2Vzc2lvbikge1xuICAgIHNlc3Npb24gPSB7XG4gICAgICBpZDogc2Vzc2lvbklkLFxuICAgICAgc2FuZGJveElkOiBzYW5kYm94SWQgPz8gbnVsbCxcbiAgICAgIGxhc3RNZXNzYWdlSWQ6IG51bGwsXG4gICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgIH07XG4gICAgYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5zZXNzaW9uLnNldChzZXNzaW9uLmlkLCBzZXNzaW9uKTtcbiAgfSBlbHNlIGlmIChzYW5kYm94SWQgJiYgc2FuZGJveElkICE9PSBzZXNzaW9uLnNhbmRib3hJZCkge1xuICAgIHNlc3Npb24gPSB7IC4uLnNlc3Npb24sIHNhbmRib3hJZCwgdXBkYXRlZEF0OiBub3cgfTtcbiAgICBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnNlc3Npb24udXBkYXRlKHNlc3Npb24uaWQsIHtcbiAgICAgIHNhbmRib3hJZCxcbiAgICB9KTtcbiAgfVxuXG4gIGF3YWl0IGFsbCh7XG4gICAgYXN5bmMgc2F2ZU1lc3NhZ2VzKCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG5ld01lc3NhZ2VzLm1hcChhc3luYyAobSwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5tZXNzYWdlLmdldChtLmlkKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5tZXNzYWdlLnNldChtLmlkLCB7XG4gICAgICAgICAgICAuLi5tLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBiYXNlVGltZSArIGksXG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOlxuICAgICAgICAgICAgICBtLmlkID09PSBhc3Npc3RhbnRNZXNzYWdlSWRcbiAgICAgICAgICAgICAgICA/ICh3b3JrZmxvd1J1bklkID8/IG51bGwpXG4gICAgICAgICAgICAgICAgOiBtLndvcmtmbG93UnVuSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0sXG4gICAgYXN5bmMgc2F2ZVBhcnRzKCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG5ld1BhcnRzLm1hcChhc3luYyAocCkgPT5cbiAgICAgICAgICBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnBhcnQuc2V0KHAuaWQsIHApXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSxcbiAgICBhc3luYyByZXNvbHZlQXBwcm92YWxzKCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG5ld0FwcHJvdmFscy5tYXAoYXN5bmMgKGEpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXJ0SWQgPSBhcHByb3ZhbFBhcnRJZChhLmFwcHJvdmFsSWQpO1xuICAgICAgICAgIGNvbnN0IHBhcnQgPSBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnBhcnQuZ2V0KHBhcnRJZCk7XG4gICAgICAgICAgaWYgKCFwYXJ0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwcm92YWxOb3RGb3VuZEVycm9yKHtcbiAgICAgICAgICAgICAgaWQ6IHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgYXBwcm92YWxJZDogYS5hcHByb3ZhbElkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UucGFydC5zZXQocGFydElkLCB7XG4gICAgICAgICAgICAuLi5wYXJ0LFxuICAgICAgICAgICAgcGFydDoge1xuICAgICAgICAgICAgICAuLi5wYXJ0LnBhcnQsXG4gICAgICAgICAgICAgIHN0YXRlOiBhLmFwcHJvdmVkID8gXCJhcHByb3ZhbC1yZXNwb25kZWRcIiA6IFwib3V0cHV0LWRlbmllZFwiLFxuICAgICAgICAgICAgICBhcHByb3ZhbDoge1xuICAgICAgICAgICAgICAgIGlkOiBhLmFwcHJvdmFsSWQsXG4gICAgICAgICAgICAgICAgYXBwcm92ZWQ6IGEuYXBwcm92ZWQsXG4gICAgICAgICAgICAgICAgcmVhc29uOiBhLnJlYXNvbixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0gYXMgdHlwZW9mIHBhcnQucGFydCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgICBhc3luYyB1cGRhdGVTZXNzaW9uKCkge1xuICAgICAgYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5zZXNzaW9uLnNldChzZXNzaW9uLmlkLCB7XG4gICAgICAgIC4uLnNlc3Npb24sXG4gICAgICAgIGxhc3RNZXNzYWdlSWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgdXBkYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICB3b3JrZmxvd1J1bklkLFxuICAgIHdvcmtmbG93V3JpdGFibGUsXG4gICAgZXhpc3RpbmdQYXJ0Q291bnQsXG4gICAgYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgIGFzc2lzdGFudE1lc3NhZ2VDcmVhdGVkQXQsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbXBsZXRlTWVzc2FnZVN0ZXAoe1xuICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIHNlc3Npb25Db250ZXh0LFxuICB3cml0YWJsZSxcbiAgdXNhZ2VTdGVwcyxcbn06IHtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dDtcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtO1xuICB1c2FnZVN0ZXBzOiBTdGVwVXNhZ2VbXTtcbn0pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuXG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcih7XG4gICAgY29uZmlnOiB7XG4gICAgICAuLi5zZXNzaW9uQ29udGV4dC5hZ2VudC5vcHRpb25zLmxvZ2dpbmcsXG4gICAgICBuYW1lOiBzZXNzaW9uQ29udGV4dC5hZ2VudC5uYW1lLFxuICAgIH0sXG4gICAgc3Vic3lzdGVtOiBcImFpLWxvb3BcIixcbiAgfSk7XG4gIGNvbnN0IG1zZ0xvZyA9IGxvZy53aXRoQ29udGV4dCh7XG4gICAgc2Vzc2lvbklkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgbWVzc2FnZUlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIH0pO1xuXG4gIGNvbnN0IHVzYWdlID1cbiAgICB1c2FnZVN0ZXBzLmxlbmd0aCA+IDBcbiAgICAgID8ge1xuICAgICAgICAgIHN0ZXBzOiB1c2FnZVN0ZXBzLFxuICAgICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgIG1vZGVsOiB1c2FnZVN0ZXBzWzBdPy5tb2RlbCA/PyBcInVua25vd25cIixcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZVN0ZXBzLnJlZHVjZSgoYSwgcykgPT4gYSArIHMuaW5wdXRUb2tlbnMsIDApLFxuICAgICAgICAgICAgb3V0cHV0VG9rZW5zOiB1c2FnZVN0ZXBzLnJlZHVjZSgoYSwgcykgPT4gYSArIHMub3V0cHV0VG9rZW5zLCAwKSxcbiAgICAgICAgICAgIHRvdGFsVG9rZW5zOiB1c2FnZVN0ZXBzLnJlZHVjZSgoYSwgcykgPT4gYSArIHMudG90YWxUb2tlbnMsIDApLFxuICAgICAgICAgICAgY2FjaGVSZWFkVG9rZW5zOiB1c2FnZVN0ZXBzLnJlZHVjZShcbiAgICAgICAgICAgICAgKGEsIHMpID0+IGEgKyBzLmNhY2hlUmVhZFRva2VucyxcbiAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGNhY2hlV3JpdGVUb2tlbnM6IHVzYWdlU3RlcHMucmVkdWNlKFxuICAgICAgICAgICAgICAoYSwgcykgPT4gYSArIHMuY2FjaGVXcml0ZVRva2VucyxcbiAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHJlYXNvbmluZ1Rva2VuczogdXNhZ2VTdGVwcy5yZWR1Y2UoXG4gICAgICAgICAgICAgIChhLCBzKSA9PiBhICsgcy5yZWFzb25pbmdUb2tlbnMsXG4gICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGVwQ291bnQ6IHVzYWdlU3RlcHMubGVuZ3RoLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIDogbnVsbDtcblxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5tZXNzYWdlLnVwZGF0ZShhc3Npc3RhbnRNZXNzYWdlSWQsIHtcbiAgICAgIGNvbXBsZXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgdXNhZ2UsXG4gICAgfSksXG4gICAgd3JpdGFibGUuY2xvc2UoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpLFxuICBdKTtcblxuICBtc2dMb2cuaW5mbyhcIm1lc3NhZ2UgY29tcGxldGVkXCIsIHtcbiAgICBzdGVwczogdXNhZ2VTdGVwcy5sZW5ndGgsXG4gICAgdG90YWxUb2tlbnM6IHVzYWdlPy5zdW1tYXJ5LnRvdGFsVG9rZW5zLFxuICB9KTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVXRpbHNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcHJvdmFsUGFydElkKGFwcHJvdmFsSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcGFydF8ke2FwcHJvdmFsSWR9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxheUFjdGl2ZVJ1bihcbiAgYWN0aXZlOiBBY3RpdmVSdW4sXG4gIHN0YXJ0SW5kZXggPSAwXG4pOiBSZWFkYWJsZVN0cmVhbTxVSU1lc3NhZ2VDaHVuaz4ge1xuICBsZXQgY3Vyc29yID0gc3RhcnRJbmRleDtcbiAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuXG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW08VUlNZXNzYWdlQ2h1bms+KHtcbiAgICBhc3luYyBwdWxsKGNvbnRyb2xsZXIpIHtcbiAgICAgIC8vIERyYWluIGFueSBidWZmZXJlZCBjaHVua3NcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBhY3RpdmUuY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYWN0aXZlLmNodW5rc1tjdXJzb3IrK10pO1xuICAgICAgfVxuXG4gICAgICAvLyBXYWl0IGZvciBlaXRoZXIgYSBuZXcgY2h1bmsgb3IgY29tcGxldGlvblxuICAgICAgd2hpbGUgKCFjYW5jZWxsZWQgJiYgY3Vyc29yID49IGFjdGl2ZS5jaHVua3MubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgYWN0aXZlLm9uQ2h1bmsudGhlbigoKSA9PiBcImNodW5rXCIgYXMgY29uc3QpLFxuICAgICAgICAgIGFjdGl2ZS5kb25lLnRoZW4oKCkgPT4gXCJkb25lXCIgYXMgY29uc3QpLFxuICAgICAgICBdKTtcblxuICAgICAgICAvLyBEcmFpbiBuZXcgY2h1bmtzXG4gICAgICAgIHdoaWxlIChjdXJzb3IgPCBhY3RpdmUuY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShhY3RpdmUuY2h1bmtzW2N1cnNvcisrXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ID09PSBcImRvbmVcIikge1xuICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGNhbmNlbCgpIHtcbiAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvTWVzc2FnZUFuZFBhcnRzPFRvb2xzIGV4dGVuZHMgVG9vbFNldD4oe1xuICBzZXNzaW9uSWQsXG4gIGlkLFxuICBpbnB1dCxcbiAgZGVmYXVsdFJvbGUsXG59OiB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBpZD86IHN0cmluZztcbiAgaW5wdXQ6IFNlbmRJbnB1dDxUb29scz47XG4gIGRlZmF1bHRSb2xlOiBVSU1lc3NhZ2VbXCJyb2xlXCJdO1xufSk6IHtcbiAgbWVzc2FnZTogTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgcGFydHM6IFBhcnRbXTtcbiAgYXBwcm92YWxzOiBBcHByb3ZhbERhdGFbXTtcbn0ge1xuICBsZXQgbWVzc2FnZUlkID0gaWQgPz8gYG1lc3NhZ2VfJHt1bGlkKCl9YDtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcHJvdmFsczogW10sXG4gICAgICBtZXNzYWdlOiB7XG4gICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgcm9sZTogZGVmYXVsdFJvbGUsXG4gICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICBzdGFydGVkQXQ6IG51bGwsXG4gICAgICAgIGNvbXBsZXRlZEF0OiBudWxsLFxuICAgICAgICBpbnRlcnJ1cHRlZEF0OiBudWxsLFxuICAgICAgICBpbnRlcnJ1cHRlZExhc3RQYXJ0OiBudWxsLFxuICAgICAgICB1c2FnZTogbnVsbCxcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogbnVsbCxcbiAgICAgICAgbWV0YWRhdGE6IG51bGwsXG4gICAgICB9LFxuICAgICAgcGFydHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgaWQ6IGBwYXJ0XyR7bWVzc2FnZUlkfV8wYCxcbiAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgICBwYXJ0OiB7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBpbnB1dCB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG4gIGlmIChcInR5cGVcIiBpbiBpbnB1dCAmJiBpbnB1dC50eXBlID09PSBcImFwcHJvdmFsXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdW5kZWZpbmVkLFxuICAgICAgcGFydHM6IFtdLFxuICAgICAgYXBwcm92YWxzOiBbaW5wdXQuYXBwcm92YWxdLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBtc2cgPVxuICAgIFwidHlwZVwiIGluIGlucHV0ICYmIGlucHV0LnR5cGUgPT09IFwibWVzc2FnZVwiID8gaW5wdXQubWVzc2FnZSA6IGlucHV0O1xuICBpZiAoXCJpZFwiIGluIG1zZyAmJiBtc2cuaWQpIHtcbiAgICBtZXNzYWdlSWQgPSBtc2cuaWQ7XG4gIH1cblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBtZXRhZGF0YSA9XG4gICAgXCJtZXRhZGF0YVwiIGluIG1zZyAmJiBtc2cubWV0YWRhdGEgIT0gbnVsbFxuICAgICAgPyAobXNnLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgOiBudWxsO1xuICByZXR1cm4ge1xuICAgIGFwcHJvdmFsczogW10sXG4gICAgbWVzc2FnZToge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgaWQ6IG1lc3NhZ2VJZCxcbiAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgc3RhcnRlZEF0OiBudWxsLFxuICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICBpbnRlcnJ1cHRlZEF0OiBudWxsLFxuICAgICAgaW50ZXJydXB0ZWRMYXN0UGFydDogbnVsbCxcbiAgICAgIHVzYWdlOiBudWxsLFxuICAgICAgd29ya2Zsb3dSdW5JZDogbnVsbCxcbiAgICAgIHJvbGU6IG1zZy5yb2xlID8/IGRlZmF1bHRSb2xlLFxuICAgICAgbWV0YWRhdGEsXG4gICAgfSxcbiAgICBwYXJ0czogbXNnLnBhcnRzLm1hcCgocGFydCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGFwID0gcGFydCBhcyB7IGFwcHJvdmFsPzogeyBpZDogc3RyaW5nIH0gfTtcbiAgICAgIGNvbnN0IGlkID0gYXAuYXBwcm92YWw/LmlkXG4gICAgICAgID8gYXBwcm92YWxQYXJ0SWQoYXAuYXBwcm92YWwuaWQpXG4gICAgICAgIDogYHBhcnRfJHttZXNzYWdlSWR9XyR7aW5kZXh9YDtcbiAgICAgIHJldHVybiB7IHNlc3Npb25JZCwgbWVzc2FnZUlkLCBpZCwgaW5kZXgsIHBhcnQgfTtcbiAgICB9KSxcbiAgfTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogRXJyb3JzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBjbGFzcyBTZW5kRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNlbmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIlNlbmQgZmFpbGVkIGZvciBzZXNzaW9uICRpZDogJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIEFwcHJvdmFsTm90Rm91bmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiQXBwcm92YWxOb3RGb3VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiQXBwcm92YWwgJGFwcHJvdmFsSWQgbm90IGZvdW5kIGluIHNlc3Npb24gJGlkXCIsXG59KSB7fVxuIiwgImltcG9ydCB0eXBlIHtcbiAgRmluaXNoUmVhc29uLFxuICBUb29sU2V0LFxuICBVSU1lc3NhZ2UsXG4gIFVJTWVzc2FnZVN0cmVhbVdyaXRlcixcbn0gZnJvbSBcImFpXCI7XG5pbXBvcnQge1xuICBjb252ZXJ0VG9Nb2RlbE1lc3NhZ2VzLFxuICBjcmVhdGVVSU1lc3NhZ2VTdHJlYW0sXG4gIHN0ZXBDb3VudElzLFxuICBzdHJlYW1UZXh0IGFzIHN0cmVhbVRleHRBaSxcbn0gZnJvbSBcImFpXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFnZW50U3RhdHVzLFxuICBBbnlBZ2VudCxcbiAgUmVzb2x2YWJsZSxcbiAgUmVzb2x2YWJsZUFyZ3MsXG4gIFR5cGVkVUlNZXNzYWdlLFxufSBmcm9tIFwiLi4vLi4vYWdlbnQvY2xpZW50XCI7XG5pbXBvcnQgeyBTZXNzaW9uTm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnNcIjtcbmltcG9ydCB7IGRpc2NvdmVyU2tpbGxzSW5TYW5kYm94IH0gZnJvbSBcIi4uLy4uL3NraWxscy9kaXNjb3ZlclwiO1xuaW1wb3J0IHsgcmVzb2x2ZVNraWxsSW5wdXRzVG9TYW5kYm94RGlycyB9IGZyb20gXCIuLi8uLi9za2lsbHMvcmVzb2x2ZVwiO1xuaW1wb3J0IHR5cGUgeyBTa2lsbFN1bW1hcnkgfSBmcm9tIFwiLi4vLi4vc2tpbGxzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFBhcnQgfSBmcm9tIFwiLi4vLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBCdWlsdEluVG9vbE5hbWUsIGdldFRvb2xzLCB0eXBlIFRvb2xDb250ZXh0IH0gZnJvbSBcIi4uLy4uL3Rvb2xzXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIsIHR5cGUgTG9nZ2VyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2xvZ2dlclwiO1xuaW1wb3J0IHsgYXBwbHlQcm9tcHRDYWNoaW5nVG9Nb2RlbFJlcXVlc3QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvbXB0LWNhY2hlXCI7XG5pbXBvcnQgeyBhc3NlbWJsZVVJTWVzc2FnZXMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdWlcIjtcbmltcG9ydCB0eXBlIHsgU3RlcFVzYWdlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3VzYWdlXCI7XG5pbXBvcnQgeyBhcHByb3ZhbFBhcnRJZCB9IGZyb20gXCIuLi9zZW5kXCI7XG5cbmNvbnN0IElOVEVSUlVQVF9QT0xMX0lOVEVSVkFMX01TID0gMjUwO1xuXG5mdW5jdGlvbiBwb2xsRm9ySW50ZXJydXB0KHtcbiAgYWdlbnQsXG4gIG1lc3NhZ2VJZCxcbiAgc2lnbmFsLFxuICBhYm9ydENvbnRyb2xsZXIsXG59OiB7XG4gIGFnZW50OiBBbnlBZ2VudDtcbiAgbWVzc2FnZUlkOiBzdHJpbmc7XG4gIHNpZ25hbDogQWJvcnRTaWduYWw7XG4gIGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xufSk6IHtcbiAgZmlyc3RDaGVjazogUHJvbWlzZTx2b2lkPjtcbiAgaW50ZXJydXB0ZWRMYXN0UGFydFJlZjogeyBjdXJyZW50OiB7IGluZGV4OiBudW1iZXI7IHBhcnQ6IHVua25vd24gfSB8IG51bGwgfTtcbn0ge1xuICBsZXQgcmVzb2x2ZUZpcnN0Q2hlY2s6ICgpID0+IHZvaWQ7XG4gIGNvbnN0IGZpcnN0Q2hlY2sgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIHJlc29sdmVGaXJzdENoZWNrID0gcmVzb2x2ZTtcbiAgfSk7XG4gIGNvbnN0IGludGVycnVwdGVkTGFzdFBhcnRSZWYgPSB7XG4gICAgY3VycmVudDogbnVsbCBhcyB7IGluZGV4OiBudW1iZXI7IHBhcnQ6IHVua25vd24gfSB8IG51bGwsXG4gIH07XG5cbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHsgLi4uYWdlbnQub3B0aW9ucy5sb2dnaW5nLCBuYW1lOiBhZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcImFpLWxvb3BcIixcbiAgfSk7XG5cbiAgY29uc3QgcG9sbCA9IGFzeW5jICgpID0+IHtcbiAgICBsZXQgaXNGaXJzdCA9IHRydWU7XG4gICAgd2hpbGUgKCFzaWduYWwuYWJvcnRlZCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IGFnZW50LnN0b3JhZ2UubWVzc2FnZS5nZXQobWVzc2FnZUlkKTtcbiAgICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICBpZiAoaXNGaXJzdCkge1xuICAgICAgICAgIHJlc29sdmVGaXJzdENoZWNrKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWVzc2FnZSAke21lc3NhZ2VJZH0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgICBpZiAobWVzc2FnZS5pbnRlcnJ1cHRlZEF0ICE9PSBudWxsKSB7XG4gICAgICAgIGxvZy5pbmZvKFwiaW50ZXJydXB0IGRldGVjdGVkXCIsIHsgbWVzc2FnZUlkIH0pO1xuICAgICAgICBpbnRlcnJ1cHRlZExhc3RQYXJ0UmVmLmN1cnJlbnQgPSBtZXNzYWdlLmludGVycnVwdGVkTGFzdFBhcnQ7XG4gICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICBpZiAoaXNGaXJzdCkge1xuICAgICAgICAgIHJlc29sdmVGaXJzdENoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgaXNGaXJzdCA9IGZhbHNlO1xuICAgICAgICByZXNvbHZlRmlyc3RDaGVjaygpO1xuICAgICAgfVxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgSU5URVJSVVBUX1BPTExfSU5URVJWQUxfTVMpXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBwb2xsKCk7XG4gIHJldHVybiB7IGZpcnN0Q2hlY2ssIGludGVycnVwdGVkTGFzdFBhcnRSZWYgfTtcbn1cblxudHlwZSBTdHJlYW1UZXh0T3B0aW9ucyA9IHtcbiAgc3RlcFRocm91Z2hwdXQ6IG51bWJlcjtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBhZ2VudDogQW55QWdlbnQ7XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xuICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtO1xuICBsYXN0UGFydEluZGV4OiBudW1iZXI7XG4gIHN0ZXBJbmRleE9mZnNldDogbnVtYmVyO1xuICBkaXNjb3ZlcmVkU2tpbGxzOiBTa2lsbFN1bW1hcnlbXSB8IG51bGw7XG59O1xuXG5leHBvcnQgdHlwZSBTdHJlYW1UZXh0UmVzdWx0ID0ge1xuICBmaW5pc2hSZWFzb246IEZpbmlzaFJlYXNvbjtcbiAgbGFzdFBhcnRJbmRleDogbnVtYmVyO1xuICB1c2FnZVN0ZXBzOiBTdGVwVXNhZ2VbXTtcbiAgcGVuZGluZ0FwcHJvdmFsczogeyBhcHByb3ZhbElkOiBzdHJpbmc7IHRvb2xOYW1lOiBzdHJpbmcgfVtdO1xuICBtYXhTdGVwczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBkaXNjb3ZlcmVkU2tpbGxzOiBTa2lsbFN1bW1hcnlbXSB8IG51bGw7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RyZWFtVGV4dDxUb29scyBleHRlbmRzIFRvb2xTZXQ+KHtcbiAgc3RlcFRocm91Z2hwdXQsXG4gIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgYWdlbnQsXG4gIHNlc3Npb25JZCxcbiAgY29udGV4dCxcbiAgY3JlYXRlZEF0LFxuICB3cml0YWJsZSxcbiAgbGFzdFBhcnRJbmRleCxcbiAgc3RlcEluZGV4T2Zmc2V0LFxuICBkaXNjb3ZlcmVkU2tpbGxzLFxufTogU3RyZWFtVGV4dE9wdGlvbnMpOiBQcm9taXNlPFN0cmVhbVRleHRSZXN1bHQ+IHtcbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHsgLi4uYWdlbnQub3B0aW9ucy5sb2dnaW5nLCBuYW1lOiBhZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcImFpLWxvb3BcIixcbiAgfSk7XG5cbiAgY29uc3Qgc3RlcExvZyA9IGxvZy53aXRoQ29udGV4dCh7XG4gICAgc2Vzc2lvbklkLFxuICAgIG1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICB9KTtcbiAgY29uc3QgZG9uZVN0ZXAgPSBzdGVwTG9nLnRpbWUoXCJzdHJlYW1UZXh0XCIpO1xuXG4gIGNvbnN0IHRocm90dGxlZEVtaXRTdGF0dXMgPSBjcmVhdGVUaHJvdHRsZWRFbWl0U3RhdHVzKGFnZW50KTtcblxuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHBvbGxDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGNvbnN0IHsgZmlyc3RDaGVjaywgaW50ZXJydXB0ZWRMYXN0UGFydFJlZiB9ID0gcG9sbEZvckludGVycnVwdCh7XG4gICAgYWdlbnQsXG4gICAgbWVzc2FnZUlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgc2lnbmFsOiBwb2xsQ29udHJvbGxlci5zaWduYWwsXG4gICAgYWJvcnRDb250cm9sbGVyLFxuICB9KTtcblxuICBjb25zdCBkb25lTG9hZCA9IHN0ZXBMb2cudGltZShcImxvYWQgc2Vzc2lvbiArIG1lc3NhZ2VzICsgcGFydHMgKyBzYW5kYm94XCIpO1xuICBjb25zdCBbLCBtZXNzYWdlc1Jlc3VsdCwgcGFydHNSZXN1bHQsIHsgc2FuZGJveCB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmaXJzdENoZWNrLFxuICAgIGFnZW50LnN0b3JhZ2UubWVzc2FnZS5saXN0QnlTZXNzaW9uKHNlc3Npb25JZCksXG4gICAgYWdlbnQuc3RvcmFnZS5wYXJ0Lmxpc3RCeVNlc3Npb24oc2Vzc2lvbklkKSxcbiAgICBhZ2VudC5zdG9yYWdlLnNlc3Npb24uZ2V0KHNlc3Npb25JZCkudGhlbigoc2Vzc2lvbikgPT4ge1xuICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXNzaW9uTm90Rm91bmRFcnJvcih7IGlkOiBzZXNzaW9uSWQgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhZ2VudC5zYW5kYm94KHNlc3Npb24uc2FuZGJveElkID8/IHNlc3Npb24uaWQpO1xuXG4gICAgICByZXR1cm4geyBzYW5kYm94IH07XG4gICAgfSksXG4gIF0pO1xuICBkb25lTG9hZCgpO1xuXG4gIGlmIChhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICBwb2xsQ29udHJvbGxlci5hYm9ydCgpO1xuICAgIHJldHVybiB7XG4gICAgICBmaW5pc2hSZWFzb246IFwic3RvcFwiIGFzIEZpbmlzaFJlYXNvbixcbiAgICAgIGxhc3RQYXJ0SW5kZXgsXG4gICAgICB1c2FnZVN0ZXBzOiBbXSxcbiAgICAgIHBlbmRpbmdBcHByb3ZhbHM6IFtdLFxuICAgICAgbWF4U3RlcHM6IHVuZGVmaW5lZCxcbiAgICAgIGRpc2NvdmVyZWRTa2lsbHMsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHNldFN0YXJ0ZWRQcm9taXNlID1cbiAgICBsYXN0UGFydEluZGV4ID09PSAwXG4gICAgICA/IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCBwZW5kaW5nTWVzc2FnZXMgPSBtZXNzYWdlc1Jlc3VsdC5maWx0ZXIoXG4gICAgICAgICAgICAobSkgPT4gbS5jcmVhdGVkQXQgPD0gY3JlYXRlZEF0ICYmIG0uc3RhcnRlZEF0ID09PSBudWxsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocGVuZGluZ01lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgcGVuZGluZ01lc3NhZ2VzLm1hcCgobSkgPT5cbiAgICAgICAgICAgICAgICBhZ2VudC5zdG9yYWdlLm1lc3NhZ2UudXBkYXRlKG0uaWQsIHtcbiAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiA/IG51bGwgOiBub3csXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgIDogbnVsbDtcblxuICBjb25zdCBhbGxQYXJ0cyA9IFsuLi5wYXJ0c1Jlc3VsdF07XG4gIGNvbnN0IG5leHRQYXJ0SW5kZXhSZWYgPSB7XG4gICAgY3VycmVudDogTWF0aC5tYXgoXG4gICAgICBsYXN0UGFydEluZGV4LFxuICAgICAgLi4uYWxsUGFydHNcbiAgICAgICAgLmZpbHRlcigocCkgPT4gcC5tZXNzYWdlSWQgPT09IGFzc2lzdGFudE1lc3NhZ2VJZClcbiAgICAgICAgLm1hcCgocCkgPT4gcC5pbmRleCArIDEpLFxuICAgICAgMFxuICAgICksXG4gIH07XG5cbiAgY29uc3Qgc2tpbGxzUmVmOiB7IGN1cnJlbnQ6IFNraWxsU3VtbWFyeVtdIH0gPSB7XG4gICAgY3VycmVudDogZGlzY292ZXJlZFNraWxscyA/PyBbXSxcbiAgfTtcblxuICAvLyBCdWlsZCB1aU1lc3NhZ2VzIGZyb20gY3VycmVudCBwYXJ0cyAocmVidWlsdCBiZXR3ZWVuIGl0ZXJhdGlvbnMpXG4gIGxldCB1aU1lc3NhZ2VzID0gYXNzZW1ibGVVSU1lc3NhZ2VzKHtcbiAgICBtZXNzYWdlczogbWVzc2FnZXNSZXN1bHQsXG4gICAgcGFydHM6IGFsbFBhcnRzLFxuICAgIHVudGlsOiBjcmVhdGVkQXQsXG4gICAgaW5jbHVkZVF1ZXVlZDogdHJ1ZSxcbiAgICBleGNsdWRlU3ViVG9vbFBhcnRzOiB0cnVlLFxuICB9KTtcblxuICAvLyBCdWlsZCByZXNvbHZhYmxlIGFyZ3MgZm9yIHJlc29sdmluZyBhZ2VudCBvcHRpb25zXG4gIGNvbnN0IHJlc29sdmFibGVBcmdzOiBSZXNvbHZhYmxlQXJncyA9IHtcbiAgICBjb250ZXh0LFxuICAgIHNlc3Npb25JZCxcbiAgICBzYW5kYm94LFxuICAgIGdldCBtZXNzYWdlcygpIHtcbiAgICAgIHJldHVybiB1aU1lc3NhZ2VzO1xuICAgIH0sXG4gIH07XG5cbiAgLy8gc2tpbGxzIGRpc2NvdmVyeSBcdTIwMTQgZmlyc3QgaXRlcmF0aW9uIG9ubHlcbiAgaWYgKGxhc3RQYXJ0SW5kZXggPT09IDAgJiYgIWRpc2NvdmVyZWRTa2lsbHMpIHtcbiAgICBjb25zdCByZXNvbHZlZFNraWxscyA9IGF3YWl0IHJlc29sdmVPcHRpb24oXG4gICAgICBhZ2VudC5vcHRpb25zLnNraWxscyxcbiAgICAgIHJlc29sdmFibGVBcmdzXG4gICAgKTtcbiAgICBjb25zdCBza2lsbHNEaXJzID0gcmVzb2x2ZWRTa2lsbHM/Lmxlbmd0aFxuICAgICAgPyBhd2FpdCByZXNvbHZlU2tpbGxJbnB1dHNUb1NhbmRib3hEaXJzKHtcbiAgICAgICAgICBhZ2VudCxcbiAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgIHNraWxsczogcmVzb2x2ZWRTa2lsbHMsXG4gICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICB9KVxuICAgICAgOiBbXTtcbiAgICBpZiAoc2tpbGxzRGlycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkb25lU2tpbGxzID0gc3RlcExvZy50aW1lKFwiZGlzY292ZXIgc2tpbGxzXCIsIHsgc2tpbGxzRGlycyB9KTtcbiAgICAgIHNraWxsc1JlZi5jdXJyZW50ID0gYXdhaXQgZGlzY292ZXJTa2lsbHNJblNhbmRib3goe1xuICAgICAgICBhZ2VudCxcbiAgICAgICAgc2FuZGJveCxcbiAgICAgICAgc2tpbGxzRGlycyxcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgfSk7XG4gICAgICBkb25lU2tpbGxzKHsgY291bnQ6IHNraWxsc1JlZi5jdXJyZW50Lmxlbmd0aCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5uZXIgbG9vcDogcnVuIHVwIHRvIGBzdGVwVGhyb3VnaHB1dGAgc2VxdWVudGlhbCBMTE0gY2FsbHMuXG4gICAqIFBhcnRzIGFyZSBwZXJzaXN0ZWQgYWZ0ZXIgZWFjaCBjYWxsIHNvIHByb2dyZXNzIGlzbid0IGxvc3QuXG4gICAqIFNlc3Npb24gaXMgcmUtZmV0Y2hlZCBiZXR3ZWVuIGl0ZXJhdGlvbnMgKGNvbmZpZyBtYXkgY2hhbmdlKSxcbiAgICogcGFyYWxsZWxpemVkIHdpdGggcGFydCBwZXJzaXN0ZW5jZSBvbiBub24tZmluYWwgaXRlcmF0aW9ucy5cbiAgICovXG4gIGNvbnN0IHVzYWdlU3RlcHM6IFN0ZXBVc2FnZVtdID0gW107XG4gIGxldCBpbnRlcm5hbFN0ZXBJbmRleCA9IDA7XG4gIGxldCBsb29wRmluaXNoUmVhc29uOiBGaW5pc2hSZWFzb24gPSBcInVua25vd25cIiBhcyBGaW5pc2hSZWFzb247XG4gIGxldCB3YXNBYm9ydGVkID0gZmFsc2U7XG4gIGNvbnN0IGFsbFBlbmRpbmdBcHByb3ZhbHM6IHsgYXBwcm92YWxJZDogc3RyaW5nOyB0b29sTmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICBsZXQgY3VycmVudE1heFN0ZXBzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKGxldCBpdGVyYXRpb24gPSAwOyBpdGVyYXRpb24gPCBzdGVwVGhyb3VnaHB1dDsgaXRlcmF0aW9uKyspIHtcbiAgICAgIC8vIFJlc29sdmUgYWdlbnQgb3B0aW9ucyBmcmVzaCBlYWNoIGl0ZXJhdGlvblxuICAgICAgY29uc3QgcmVzb2x2ZWRNb2RlbCA9IGF3YWl0IHJlc29sdmVPcHRpb24oXG4gICAgICAgIGFnZW50Lm9wdGlvbnMubW9kZWwsXG4gICAgICAgIHJlc29sdmFibGVBcmdzXG4gICAgICApO1xuICAgICAgY29uc3QgcmVzb2x2ZWRHZW5lcmF0aW9uID0gYXdhaXQgcmVzb2x2ZU9wdGlvbihcbiAgICAgICAgYWdlbnQub3B0aW9ucy5nZW5lcmF0aW9uLFxuICAgICAgICByZXNvbHZhYmxlQXJnc1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkQWN0aXZlVG9vbHMgPSAoYXdhaXQgcmVzb2x2ZU9wdGlvbihcbiAgICAgICAgYWdlbnQub3B0aW9ucy5hY3RpdmVUb29scyxcbiAgICAgICAgcmVzb2x2YWJsZUFyZ3NcbiAgICAgICkpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gICAgICBjdXJyZW50TWF4U3RlcHMgPSByZXNvbHZlZEdlbmVyYXRpb24/Lm1heFN0ZXBzO1xuXG4gICAgICBpZiAoIXJlc29sdmVkTW9kZWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWdlbnQgbW9kZWwgaXMgbm90IHNldFwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RlcFBhcnRzOiBVSU1lc3NhZ2VbXCJwYXJ0c1wiXSA9IFtdO1xuICAgICAgbGV0IHN0cmVhbVRleHRGaW5pc2hSZWFzb246IEZpbmlzaFJlYXNvbiB8IHVuZGVmaW5lZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gY3JlYXRlVUlNZXNzYWdlU3RyZWFtKHtcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoeyB3cml0ZXIgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyByYXdUb29scywgdG9vbHNXaXRoTmVlZHNBcHByb3ZhbCwgdG9vbENvbnRleHQgfSA9IGdldFRvb2xzKHtcbiAgICAgICAgICAgICAgYWdlbnQsXG4gICAgICAgICAgICAgIHNhbmRib3gsXG4gICAgICAgICAgICAgIHNraWxsc1JlZixcbiAgICAgICAgICAgICAgd3JpdGVyLFxuICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIsXG4gICAgICAgICAgICAgIG5leHRQYXJ0SW5kZXhSZWYsXG4gICAgICAgICAgICAgIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICBzdGVwTG9nLFxuICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICBtZXNzYWdlczogdWlNZXNzYWdlcyxcbiAgICAgICAgICAgICAgYWN0aXZlVG9vbHM6IHJlc29sdmVkQWN0aXZlVG9vbHMsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gcHJvY2VzcyBhcHByb3ZhbHMgb25jZSAoZmlyc3QgaXRlcmF0aW9uIG9ubHkpXG4gICAgICAgICAgICBpZiAoaXRlcmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHByb2Nlc3NBcHByb3ZhbHMoe1xuICAgICAgICAgICAgICAgIGFsbFBhcnRzLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VzUmVzdWx0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICByYXdUb29scyxcbiAgICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdG9vbENvbnRleHQsXG4gICAgICAgICAgICAgICAgYWdlbnQsXG4gICAgICAgICAgICAgICAgc3RlcExvZyxcbiAgICAgICAgICAgICAgICB0aHJvdHRsZWRFbWl0U3RhdHVzLFxuICAgICAgICAgICAgICAgIHdyaXRlcixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm90dGxlZEVtaXRTdGF0dXMoe1xuICAgICAgICAgICAgICB3cml0ZXIsXG4gICAgICAgICAgICAgIHN0YXR1czogeyB0eXBlOiBcInRoaW5raW5nXCIgfSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBpdGVyUmVzdWx0ID0gc3RyZWFtVGV4dEFpKHtcbiAgICAgICAgICAgICAgbWVzc2FnZXM6IFt7IHJvbGU6IFwidXNlclwiIGFzIGNvbnN0LCBjb250ZW50OiBcIi5cIiB9XSxcbiAgICAgICAgICAgICAgdG9vbHM6IHRvb2xzV2l0aE5lZWRzQXBwcm92YWwsXG4gICAgICAgICAgICAgIG1vZGVsOiByZXNvbHZlZE1vZGVsLFxuICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgc3RvcFdoZW46IHN0ZXBDb3VudElzKDEpLFxuICAgICAgICAgICAgICB0ZW1wZXJhdHVyZTogcmVzb2x2ZWRHZW5lcmF0aW9uPy50ZW1wZXJhdHVyZSxcbiAgICAgICAgICAgICAgdG9wSzogcmVzb2x2ZWRHZW5lcmF0aW9uPy50b3BLLFxuICAgICAgICAgICAgICB0b3BQOiByZXNvbHZlZEdlbmVyYXRpb24/LnRvcFAsXG4gICAgICAgICAgICAgIGZyZXF1ZW5jeVBlbmFsdHk6IHJlc29sdmVkR2VuZXJhdGlvbj8uZnJlcXVlbmN5UGVuYWx0eSxcbiAgICAgICAgICAgICAgcHJlc2VuY2VQZW5hbHR5OiByZXNvbHZlZEdlbmVyYXRpb24/LnByZXNlbmNlUGVuYWx0eSxcbiAgICAgICAgICAgICAgbWF4T3V0cHV0VG9rZW5zOiByZXNvbHZlZEdlbmVyYXRpb24/Lm1heE91dHB1dFRva2VucyxcbiAgICAgICAgICAgICAgaGVhZGVyczogcmVzb2x2ZWRHZW5lcmF0aW9uPy5oZWFkZXJzLFxuICAgICAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDoge1xuICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgIHNhbmRib3gsXG4gICAgICAgICAgICAgICAgbWVzc2FnZXM6IHVpTWVzc2FnZXMsXG4gICAgICAgICAgICAgIH0gc2F0aXNmaWVzIFRvb2xDb250ZXh0LFxuICAgICAgICAgICAgICBwcmVwYXJlU3RlcDogYXN5bmMgKHsgbW9kZWwgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNraWxsc0NvbnRleHQgPSBidWlsZFNraWxsc0NvbnRleHQoc2tpbGxzUmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN3ZFByb21wdCA9IGBZb3VyIHdvcmtpbmcgZGlyZWN0b3J5IGlzICR7c2FuZGJveC5jd2R9LiBBbGwgZmlsZSBwYXRocyBzaG91bGQgYmUgYWJzb2x1dGUuYDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkU3lzdGVtID0gYXdhaXQgcmVzb2x2ZVN5c3RlbShcbiAgICAgICAgICAgICAgICAgIGFnZW50Lm9wdGlvbnMuc3lzdGVtLFxuICAgICAgICAgICAgICAgICAgcmVzb2x2YWJsZUFyZ3NcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3lzdGVtSGVhZGVyID0gam9pblByb21wdFNlY3Rpb25zKFxuICAgICAgICAgICAgICAgICAgQkFTRV9TWVNURU1fUFJPTVBULFxuICAgICAgICAgICAgICAgICAgY3dkUHJvbXB0LFxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRTeXN0ZW1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN5c3RlbUNvbnRleHQgPSBqb2luUHJvbXB0U2VjdGlvbnMoXG4gICAgICAgICAgICAgICAgICBza2lsbHNDb250ZXh0LFxuICAgICAgICAgICAgICAgICAgY3dkUHJvbXB0XG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZE1lc3NhZ2VzID0gYXdhaXQgY29udmVydFRvTW9kZWxNZXNzYWdlcyhcbiAgICAgICAgICAgICAgICAgIHVpTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICB7IGlnbm9yZUluY29tcGxldGVUb29sQ2FsbHM6IHRydWUgfVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbE1lc3NhZ2VzID0gW1xuICAgICAgICAgICAgICAgICAgLi4uKHN5c3RlbUhlYWRlci50cmltKClcbiAgICAgICAgICAgICAgICAgICAgPyBbeyByb2xlOiBcInN5c3RlbVwiIGFzIGNvbnN0LCBjb250ZW50OiBzeXN0ZW1IZWFkZXIgfV1cbiAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICAgICAgICAuLi4oc3lzdGVtQ29udGV4dC50cmltKClcbiAgICAgICAgICAgICAgICAgICAgPyBbeyByb2xlOiBcInN5c3RlbVwiIGFzIGNvbnN0LCBjb250ZW50OiBzeXN0ZW1Db250ZXh0IH1dXG4gICAgICAgICAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgICAgICAgICAgLi4uY29udmVydGVkTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHByb21wdENhY2hpbmcgPSBhcHBseVByb21wdENhY2hpbmdUb01vZGVsUmVxdWVzdCh7XG4gICAgICAgICAgICAgICAgICBtb2RlbDogdHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gbW9kZWwgOiBtb2RlbC5tb2RlbElkLFxuICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZXM6IG1vZGVsTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgYWN0aXZlVG9vbHMgPSByZXNvbHZlZEFjdGl2ZVRvb2xzID8/IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoc2tpbGxzUmVmLmN1cnJlbnQubGVuZ3RoID09PSAwICYmIGFjdGl2ZVRvb2xzKSB7XG4gICAgICAgICAgICAgICAgICBhY3RpdmVUb29scyA9IGFjdGl2ZVRvb2xzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKHQpID0+IHQgIT09IChcIlNraWxsXCIgc2F0aXNmaWVzIEJ1aWx0SW5Ub29sTmFtZSlcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBwcm9tcHRDYWNoaW5nLm1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBwcm9tcHRDYWNoaW5nLnByb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZVRvb2xzLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9uU3RlcEZpbmlzaDogKHsgdXNhZ2UgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh1c2FnZSkge1xuICAgICAgICAgICAgICAgICAgdXNhZ2VTdGVwcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcEluZGV4OiBzdGVwSW5kZXhPZmZzZXQgKyBpbnRlcm5hbFN0ZXBJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWw6IHJlc29sdmVkTW9kZWwgPz8gXCJ1bmtub3duXCIsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRUb2tlbnM6IHVzYWdlLm91dHB1dFRva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgICAgICB0b3RhbFRva2VuczogdXNhZ2UudG90YWxUb2tlbnMgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVSZWFkVG9rZW5zOlxuICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLmlucHV0VG9rZW5EZXRhaWxzPy5jYWNoZVJlYWRUb2tlbnMgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVXcml0ZVRva2VuczpcbiAgICAgICAgICAgICAgICAgICAgICB1c2FnZS5pbnB1dFRva2VuRGV0YWlscz8uY2FjaGVXcml0ZVRva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgICAgICByZWFzb25pbmdUb2tlbnM6XG4gICAgICAgICAgICAgICAgICAgICAgdXNhZ2Uub3V0cHV0VG9rZW5EZXRhaWxzPy5yZWFzb25pbmdUb2tlbnMgPz8gMCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnRlcm5hbFN0ZXBJbmRleCsrO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHdyaXRlci5tZXJnZShcbiAgICAgICAgICAgICAgaXRlclJlc3VsdC50b1VJTWVzc2FnZVN0cmVhbSh7XG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVNZXNzYWdlSWQ6ICgpID0+IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICBvbkZpbmlzaDogKHsgbWVzc2FnZXMgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBtIG9mIG1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwUGFydHMucHVzaCguLi5tLnBhcnRzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBzdHJlYW1UZXh0RmluaXNoUmVhc29uID0gYXdhaXQgaXRlclJlc3VsdC5maW5pc2hSZWFzb247XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgc3RyZWFtLnBpcGVUbyh3cml0YWJsZSwge1xuICAgICAgICAgIHByZXZlbnRDbG9zZTogdHJ1ZSxcbiAgICAgICAgICBwcmV2ZW50QWJvcnQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICB3YXNBYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICB3YXNBYm9ydGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTWFyayBpbnRlcnJ1cHRlZCB0b29sIHBhcnRzXG4gICAgICBpZiAod2FzQWJvcnRlZCkge1xuICAgICAgICBjb25zdCB0ZXJtaW5hbFN0YXRlcyA9IG5ldyBTZXQoW1xuICAgICAgICAgIFwib3V0cHV0LWF2YWlsYWJsZVwiLFxuICAgICAgICAgIFwib3V0cHV0LWVycm9yXCIsXG4gICAgICAgICAgXCJvdXRwdXQtZGVuaWVkXCIsXG4gICAgICAgICAgXCJkb25lXCIsXG4gICAgICAgIF0pO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2Ygc3RlcFBhcnRzKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgXCJ0eXBlXCIgaW4gcGFydCAmJlxuICAgICAgICAgICAgdHlwZW9mIHBhcnQudHlwZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgcGFydC50eXBlLnN0YXJ0c1dpdGgoXCJ0b29sLVwiKSAmJlxuICAgICAgICAgICAgXCJzdGF0ZVwiIGluIHBhcnQgJiZcbiAgICAgICAgICAgICF0ZXJtaW5hbFN0YXRlcy5oYXMocGFydC5zdGF0ZSBhcyBzdHJpbmcpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAocGFydCBhcyB7IHN0YXRlOiBzdHJpbmcgfSkuc3RhdGUgPSBcIm91dHB1dC1lcnJvclwiO1xuICAgICAgICAgICAgKHBhcnQgYXMgeyBlcnJvclRleHQ/OiBzdHJpbmcgfSkuZXJyb3JUZXh0ID0gXCJpbnRlcnJ1cHRlZFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgaW50ZXJydXB0ZWQgbGFzdFBhcnQgdHJ1bmNhdGlvblxuICAgICAgY29uc3QgbGFzdFBhcnQgPSBpbnRlcnJ1cHRlZExhc3RQYXJ0UmVmLmN1cnJlbnQ7XG5cbiAgICAgIGNvbnN0IG5ld1BhcnRSZWNvcmRzID0gc3RlcFBhcnRzXG4gICAgICAgIC5tYXAoKHVpUGFydCwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gbmV4dFBhcnRJbmRleFJlZi5jdXJyZW50ICsgaTtcbiAgICAgICAgICBpZiAobGFzdFBhcnQgIT0gbnVsbCAmJiBpbmRleCA+IGxhc3RQYXJ0LmluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdXNlQ2xpZW50UGFydCA9IGxhc3RQYXJ0ICE9IG51bGwgJiYgaW5kZXggPT09IGxhc3RQYXJ0LmluZGV4O1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSAoXG4gICAgICAgICAgICB1c2VDbGllbnRQYXJ0ID8gbGFzdFBhcnQucGFydCA6IHVpUGFydFxuICAgICAgICAgICkgYXMgVHlwZWRVSU1lc3NhZ2U8VG9vbHM+W1wicGFydHNcIl1bbnVtYmVyXTtcbiAgICAgICAgICBjb25zdCBwYXJ0SWQgPVxuICAgICAgICAgICAgXCJhcHByb3ZhbFwiIGluIGNvbnRlbnQgJiYgY29udGVudC5hcHByb3ZhbD8uaWRcbiAgICAgICAgICAgICAgPyBhcHByb3ZhbFBhcnRJZChjb250ZW50LmFwcHJvdmFsLmlkKVxuICAgICAgICAgICAgICA6IGBwYXJ0XyR7YXNzaXN0YW50TWVzc2FnZUlkfV8ke2luZGV4fWA7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBwYXJ0SWQsXG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgcGFydDogY29udGVudCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChyKTogciBpcyBOb25OdWxsYWJsZTx0eXBlb2Ygcj4gPT4gciAhPT0gbnVsbCk7XG5cbiAgICAgIGNvbnN0IHBlcnNpc3RQYXJ0c1Byb21pc2UgPSBQcm9taXNlLmFsbChcbiAgICAgICAgbmV3UGFydFJlY29yZHMubWFwKChyZWNvcmQpID0+XG4gICAgICAgICAgYWdlbnQuc3RvcmFnZS5wYXJ0LnNldChyZWNvcmQuaWQsIHJlY29yZClcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgICAgbmV4dFBhcnRJbmRleFJlZi5jdXJyZW50ID1cbiAgICAgICAgbGFzdFBhcnQgIT0gbnVsbFxuICAgICAgICAgID8gTWF0aC5taW4oXG4gICAgICAgICAgICAgIG5leHRQYXJ0SW5kZXhSZWYuY3VycmVudCArIHN0ZXBQYXJ0cy5sZW5ndGgsXG4gICAgICAgICAgICAgIGxhc3RQYXJ0LmluZGV4ICsgMVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogbmV4dFBhcnRJbmRleFJlZi5jdXJyZW50ICsgc3RlcFBhcnRzLmxlbmd0aDtcblxuICAgICAgY29uc3QgaXRlclBlbmRpbmdBcHByb3ZhbHMgPSBzdGVwUGFydHNcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAocCk6IHAgaXMgdHlwZW9mIHAgJiB7IGFwcHJvdmFsOiB7IGlkOiBzdHJpbmcgfSB9ID0+XG4gICAgICAgICAgICBcInN0YXRlXCIgaW4gcCAmJlxuICAgICAgICAgICAgcC5zdGF0ZSA9PT0gXCJhcHByb3ZhbC1yZXF1ZXN0ZWRcIiAmJlxuICAgICAgICAgICAgXCJhcHByb3ZhbFwiIGluIHAgJiZcbiAgICAgICAgICAgICEhKHAgYXMgeyBhcHByb3ZhbD86IHsgaWQ6IHN0cmluZyB9IH0pLmFwcHJvdmFsPy5pZFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKHApID0+ICh7XG4gICAgICAgICAgYXBwcm92YWxJZDogcC5hcHByb3ZhbC5pZCxcbiAgICAgICAgICB0b29sTmFtZTpcbiAgICAgICAgICAgIFwidHlwZVwiIGluIHAgPyBTdHJpbmcocC50eXBlKS5yZXBsYWNlKFwidG9vbC1cIiwgXCJcIikgOiBcInVua25vd25cIixcbiAgICAgICAgfSkpO1xuXG4gICAgICBsb29wRmluaXNoUmVhc29uID0gd2FzQWJvcnRlZFxuICAgICAgICA/IChcInN0b3BcIiBhcyBGaW5pc2hSZWFzb24pXG4gICAgICAgIDogKHN0cmVhbVRleHRGaW5pc2hSZWFzb24gPz8gKFwidW5rbm93blwiIGFzIEZpbmlzaFJlYXNvbikpO1xuXG4gICAgICAvLyBEZWNpZGUgd2hldGhlciB0byBicmVhayBvciBjb250aW51ZVxuICAgICAgY29uc3Qgc2hvdWxkQnJlYWsgPVxuICAgICAgICBpdGVyUGVuZGluZ0FwcHJvdmFscy5sZW5ndGggPiAwIHx8XG4gICAgICAgIGxvb3BGaW5pc2hSZWFzb24gPT09IFwic3RvcFwiIHx8XG4gICAgICAgIHdhc0Fib3J0ZWQgfHxcbiAgICAgICAgbGFzdFBhcnQgIT0gbnVsbCB8fFxuICAgICAgICAoY3VycmVudE1heFN0ZXBzICE9IG51bGwgJiZcbiAgICAgICAgICBzdGVwSW5kZXhPZmZzZXQgKyB1c2FnZVN0ZXBzLmxlbmd0aCA+PSBjdXJyZW50TWF4U3RlcHMpIHx8XG4gICAgICAgIGl0ZXJhdGlvbiA+PSBzdGVwVGhyb3VnaHB1dCAtIDE7XG5cbiAgICAgIGlmIChzaG91bGRCcmVhaykge1xuICAgICAgICBhd2FpdCBwZXJzaXN0UGFydHNQcm9taXNlO1xuICAgICAgICBhbGxQYXJ0cy5wdXNoKC4uLm5ld1BhcnRSZWNvcmRzKTtcbiAgICAgICAgYWxsUGVuZGluZ0FwcHJvdmFscy5wdXNoKC4uLml0ZXJQZW5kaW5nQXBwcm92YWxzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vbi1maW5hbCBpdGVyYXRpb246IHBlcnNpc3QgcGFydHMgYW5kIHJlYnVpbGQgbWVzc2FnZXNcbiAgICAgIGF3YWl0IHBlcnNpc3RQYXJ0c1Byb21pc2U7XG4gICAgICBhbGxQYXJ0cy5wdXNoKC4uLm5ld1BhcnRSZWNvcmRzKTtcbiAgICAgIHVpTWVzc2FnZXMgPSBhc3NlbWJsZVVJTWVzc2FnZXMoe1xuICAgICAgICBtZXNzYWdlczogbWVzc2FnZXNSZXN1bHQsXG4gICAgICAgIHBhcnRzOiBhbGxQYXJ0cyxcbiAgICAgICAgdW50aWw6IGNyZWF0ZWRBdCxcbiAgICAgICAgaW5jbHVkZVF1ZXVlZDogdHJ1ZSxcbiAgICAgICAgZXhjbHVkZVN1YlRvb2xQYXJ0czogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBwb2xsQ29udHJvbGxlci5hYm9ydCgpO1xuICAgIHRocm90dGxlZEVtaXRTdGF0dXMuZGlzcG9zZSgpO1xuICB9XG5cbiAgaWYgKHNldFN0YXJ0ZWRQcm9taXNlKSB7XG4gICAgYXdhaXQgc2V0U3RhcnRlZFByb21pc2U7XG4gIH1cblxuICBkb25lU3RlcCh7XG4gICAgZmluaXNoUmVhc29uOiBsb29wRmluaXNoUmVhc29uLFxuICAgIHdhc0Fib3J0ZWQsXG4gICAgaXRlcmF0aW9uczogaW50ZXJuYWxTdGVwSW5kZXgsXG4gICAgcGVuZGluZ0FwcHJvdmFsczogYWxsUGVuZGluZ0FwcHJvdmFscy5sZW5ndGgsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZmluaXNoUmVhc29uOiBsb29wRmluaXNoUmVhc29uLFxuICAgIGxhc3RQYXJ0SW5kZXg6IG5leHRQYXJ0SW5kZXhSZWYuY3VycmVudCxcbiAgICB1c2FnZVN0ZXBzLFxuICAgIHBlbmRpbmdBcHByb3ZhbHM6IGFsbFBlbmRpbmdBcHByb3ZhbHMsXG4gICAgbWF4U3RlcHM6IGN1cnJlbnRNYXhTdGVwcyxcbiAgICBkaXNjb3ZlcmVkU2tpbGxzOiBza2lsbHNSZWYuY3VycmVudCxcbiAgfTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogU3RlcHNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0cmVhbVRleHRTdGVwPFRvb2xzIGV4dGVuZHMgVG9vbFNldD4oXG4gIC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIHN0cmVhbVRleHQ8VG9vbHM+PlxuKSB7XG4gIFwidXNlIHN0ZXBcIjtcbiAgcmV0dXJuIGF3YWl0IHN0cmVhbVRleHQoLi4uYXJncyk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFV0aWxzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NBcHByb3ZhbHMoe1xuICBhbGxQYXJ0cyxcbiAgbWVzc2FnZXNSZXN1bHQsXG4gIGNyZWF0ZWRBdCxcbiAgcmF3VG9vbHMsXG4gIGFib3J0Q29udHJvbGxlcixcbiAgdG9vbENvbnRleHQsXG4gIGFnZW50LFxuICBzdGVwTG9nLFxuICB0aHJvdHRsZWRFbWl0U3RhdHVzLFxuICB3cml0ZXIsXG59OiB7XG4gIGFsbFBhcnRzOiBQYXJ0W107XG4gIG1lc3NhZ2VzUmVzdWx0OiBQYXJhbWV0ZXJzPHR5cGVvZiBhc3NlbWJsZVVJTWVzc2FnZXM+WzBdW1wibWVzc2FnZXNcIl07XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xuICByYXdUb29sczogVG9vbFNldDtcbiAgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG4gIHRvb2xDb250ZXh0OiBUb29sQ29udGV4dDtcbiAgYWdlbnQ6IEFueUFnZW50O1xuICBzdGVwTG9nOiBMb2dnZXI7XG4gIHRocm90dGxlZEVtaXRTdGF0dXM6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVRocm90dGxlZEVtaXRTdGF0dXM+O1xuICB3cml0ZXI6IFN0cmVhbVdyaXRlcjtcbn0pIHtcbiAgLy8gRXhlY3V0ZSBhcHByb3ZlZCB0b29scyBzbyB0aGUgbW9kZWwgc2VlcyBjb21wbGV0ZSB0b29sIGNhbGwgKyByZXN1bHQgcGFpcnNcbiAgY29uc3QgYXBwcm92ZWRQYXJ0cyA9IGFsbFBhcnRzLmZpbHRlcihcbiAgICAocCkgPT5cbiAgICAgIHAucGFydCAmJlxuICAgICAgXCJzdGF0ZVwiIGluIHAucGFydCAmJlxuICAgICAgKHAucGFydCBhcyB7IHN0YXRlOiBzdHJpbmcgfSkuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVzcG9uZGVkXCIgJiZcbiAgICAgIFwiYXBwcm92YWxcIiBpbiBwLnBhcnQgJiZcbiAgICAgIChwLnBhcnQgYXMgeyBhcHByb3ZhbD86IHsgYXBwcm92ZWQ6IGJvb2xlYW4gfSB9KS5hcHByb3ZhbD8uYXBwcm92ZWQgPT09XG4gICAgICAgIHRydWVcbiAgKTtcblxuICBpZiAoYXBwcm92ZWRQYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgc3RlcExvZy5pbmZvKFwiZXhlY3V0aW5nIGFwcHJvdmVkIHRvb2xzXCIsIHtcbiAgICAgIGNvdW50OiBhcHByb3ZlZFBhcnRzLmxlbmd0aCxcbiAgICB9KTtcbiAgICB0aHJvdHRsZWRFbWl0U3RhdHVzKHtcbiAgICAgIHdyaXRlcixcbiAgICAgIHN0YXR1czogeyB0eXBlOiBcInByb2Nlc3NpbmctYXBwcm92YWxzXCIgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHByZUV4ZWNNZXNzYWdlcyA9IGF3YWl0IGNvbnZlcnRUb01vZGVsTWVzc2FnZXMoXG4gICAgICBhc3NlbWJsZVVJTWVzc2FnZXMoe1xuICAgICAgICBtZXNzYWdlczogbWVzc2FnZXNSZXN1bHQsXG4gICAgICAgIHBhcnRzOiBhbGxQYXJ0cyxcbiAgICAgICAgdW50aWw6IGNyZWF0ZWRBdCxcbiAgICAgICAgaW5jbHVkZVF1ZXVlZDogdHJ1ZSxcbiAgICAgICAgZXhjbHVkZVN1YlRvb2xQYXJ0czogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgeyBpZ25vcmVJbmNvbXBsZXRlVG9vbENhbGxzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBhcHByb3ZlZFBhcnRzLm1hcChhc3luYyAoYXApID0+IHtcbiAgICAgICAgaWYgKCFhcC5wYXJ0LnR5cGUuc3RhcnRzV2l0aChcInRvb2wtXCIpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnQgPSBhcC5wYXJ0IGFzIEV4dHJhY3Q8XG4gICAgICAgICAgVUlNZXNzYWdlW1wicGFydHNcIl1bbnVtYmVyXSxcbiAgICAgICAgICB7IHR5cGU6IGB0b29sLSR7c3RyaW5nfWAgfVxuICAgICAgICA+O1xuICAgICAgICBjb25zdCB0b29sTmFtZSA9IHBhcnQudHlwZS5yZXBsYWNlKFwidG9vbC1cIiwgXCJcIik7XG4gICAgICAgIGNvbnN0IHRvb2xEZWYgPSByYXdUb29sc1t0b29sTmFtZV07XG5cbiAgICAgICAgaWYgKHRvb2xEZWY/LmV4ZWN1dGUgJiYgcGFydC5pbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRvb2xPdXRwdXQgPSBhd2FpdCB0b29sRGVmLmV4ZWN1dGUocGFydC5pbnB1dCwge1xuICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIG1lc3NhZ2VzOiBwcmVFeGVjTWVzc2FnZXMsXG4gICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDogdG9vbENvbnRleHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhcnQuc3RhdGUgPSBcIm91dHB1dC1hdmFpbGFibGVcIjtcbiAgICAgICAgICAgIHBhcnQub3V0cHV0ID0gdG9vbE91dHB1dDtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgb3V0cHV0OiB0b29sT3V0cHV0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBwYXJ0LnN0YXRlID0gXCJvdXRwdXQtZXJyb3JcIjtcbiAgICAgICAgICAgIHBhcnQuZXJyb3JUZXh0ID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1lcnJvclwiLFxuICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIGVycm9yVGV4dDogcGFydC5lcnJvclRleHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgYWdlbnQuc3RvcmFnZS5wYXJ0LnNldChhcC5pZCwgeyAuLi5hcCwgcGFydCB9KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLy8gQXV0by1kZW55IGFueSByZW1haW5pbmcgYXBwcm92YWwtcmVxdWVzdGVkIHBhcnRzIHNvIHRoZSBtb2RlbFxuICAvLyBzZWVzIGNvbXBsZXRlIHRvb2wgY2FsbCArIGRlbmllZCByZXN1bHQgcGFpcnMgKG5vdCBtaXNzaW5nIHJlc3VsdHMpLlxuICBjb25zdCBwZW5kaW5nQXBwcm92YWxQYXJ0cyA9IGFsbFBhcnRzLmZpbHRlcihcbiAgICAocCkgPT4gKHAucGFydCBhcyB7IHN0YXRlPzogc3RyaW5nIH0pLnN0YXRlID09PSBcImFwcHJvdmFsLXJlcXVlc3RlZFwiXG4gICk7XG4gIGlmIChwZW5kaW5nQXBwcm92YWxQYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwZW5kaW5nQXBwcm92YWxQYXJ0cy5tYXAoYXN5bmMgKHApID0+IHtcbiAgICAgICAgY29uc3QgZGVuaWVkID0ge1xuICAgICAgICAgIC4uLnAsXG4gICAgICAgICAgcGFydDoge1xuICAgICAgICAgICAgLi4ucC5wYXJ0LFxuICAgICAgICAgICAgc3RhdGU6IFwib3V0cHV0LWRlbmllZFwiLFxuICAgICAgICAgICAgYXBwcm92YWw6IHtcbiAgICAgICAgICAgICAgLi4uKChwLnBhcnQgYXMgeyBhcHByb3ZhbD86IG9iamVjdCB9KS5hcHByb3ZhbCA/PyB7fSksXG4gICAgICAgICAgICAgIGFwcHJvdmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgcmVhc29uOiBcImF1dG8tZGVuaWVkOiBuZXcgbWVzc2FnZSBzZW50XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgdHlwZW9mIHAucGFydCxcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwLCBkZW5pZWQpO1xuICAgICAgICBhd2FpdCBhZ2VudC5zdG9yYWdlLnBhcnQuc2V0KHAuaWQsIGRlbmllZCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxudHlwZSBTdHJlYW1Xcml0ZXIgPSBVSU1lc3NhZ2VTdHJlYW1Xcml0ZXI7XG5cbmZ1bmN0aW9uIGVtaXRTdGF0dXMoe1xuICB3cml0ZXIsXG4gIHN0YXR1cyxcbiAgYWdlbnQsXG59OiB7XG4gIHdyaXRlcjogU3RyZWFtV3JpdGVyO1xuICBzdGF0dXM6IEFnZW50U3RhdHVzO1xuICBhZ2VudDogQW55QWdlbnQ7XG59KSB7XG4gIHdyaXRlci53cml0ZSh7IHR5cGU6IFwiZGF0YS1zdGF0dXNcIiwgZGF0YTogc3RhdHVzLCB0cmFuc2llbnQ6IHRydWUgfSk7XG4gIGFnZW50Lmhvb2tzPy5zdGF0dXM/LihzdGF0dXMpO1xufVxuXG5jb25zdCBTVEFUVVNfVEhST1RUTEVfTVMgPSA1MDA7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRocm90dGxlZEVtaXRTdGF0dXMoYWdlbnQ6IEFueUFnZW50KSB7XG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgbGV0IHBlbmRpbmc6IHtcbiAgICB3cml0ZXI6IFN0cmVhbVdyaXRlcjtcbiAgICBzdGF0dXM6IEFnZW50U3RhdHVzO1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gdGhyb3R0bGVkKHtcbiAgICB3cml0ZXIsXG4gICAgc3RhdHVzLFxuICB9OiB7XG4gICAgd3JpdGVyOiBTdHJlYW1Xcml0ZXI7XG4gICAgc3RhdHVzOiBBZ2VudFN0YXR1cztcbiAgfSkge1xuICAgIHBlbmRpbmcgPSB7IHdyaXRlciwgc3RhdHVzIH07XG4gICAgaWYgKHRpbWVyICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZsdXNoKCk7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgIGZsdXNoKCk7XG4gICAgICB9XG4gICAgfSwgU1RBVFVTX1RIUk9UVExFX01TKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHdyaXRlciwgc3RhdHVzIH0gPSBwZW5kaW5nO1xuICAgIHBlbmRpbmcgPSBudWxsO1xuICAgIGVtaXRTdGF0dXMoeyB3cml0ZXIsIHN0YXR1cywgYWdlbnQgfSk7XG4gIH1cblxuICB0aHJvdHRsZWQuZGlzcG9zZSA9ICgpID0+IHtcbiAgICBpZiAodGltZXIgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgfVxuICAgIGZsdXNoKCk7XG4gIH07XG5cbiAgcmV0dXJuIHRocm90dGxlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU9wdGlvbjxUPihcbiAgdmFsdWU6IFJlc29sdmFibGU8VD4gfCB1bmRlZmluZWQsXG4gIGFyZ3M6IFJlc29sdmFibGVBcmdzXG4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBhd2FpdCAodmFsdWUgYXMgKGFyZ3M6IFJlc29sdmFibGVBcmdzKSA9PiBUIHwgUHJvbWlzZTxUPikoYXJncyk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU3lzdGVtKFxuICBpbnB1dDogUmVzb2x2YWJsZTxzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQsXG4gIGFyZ3M6IFJlc29sdmFibGVBcmdzXG4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZU9wdGlvbihpbnB1dCwgYXJncyk7XG4gIGlmICghcmVzdWx0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdC5maWx0ZXIoQm9vbGVhbikuam9pbihcIlxcblwiKSA6IHJlc3VsdDtcbn1cblxuY29uc3QgQkFTRV9TWVNURU1fUFJPTVBUID1cbiAgXCJZb3UgYXJlIGFuIEFJIGFzc2lzdGFudCB3aXRoIGJhc2ljIHRvb2xzIHRvIGludGVyYWN0IHdpdGggeW91ciBlbnZpcm9ubWVudC4gRXhwbG9yZSBhbmQgd29yayBmcmVlbHkuXCI7XG5cbmZ1bmN0aW9uIGpvaW5Qcm9tcHRTZWN0aW9ucyhcbiAgLi4uc2VjdGlvbnM6IChzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKVtdXG4pOiBzdHJpbmcge1xuICByZXR1cm4gc2VjdGlvbnMuZmlsdGVyKChzKSA9PiBzPy50cmltKCkpLmpvaW4oXCJcXG5cXG5cIik7XG59XG5cbmNvbnN0IGJhY2tncm91bmRQcm9jZXNzUHJvbXB0ID0gYCMjIEJhY2tncm91bmQgUHJvY2Vzc2VzXG5UaGVzZSBiYWNrZ3JvdW5kIHByb2Nlc3MgaW5zdHJ1Y3Rpb25zIGFyZSBmb3IgeW91IHRvIG1hbmlwdWxhdGUgdGhlIHByb2Nlc3NlcywgZG8gbm90IGJlIHRvIHZlcmJvc2UgdG8gdGhlIHVzZXIgYWJvdXQgdGhlIHJlc3BvbnNlIGRldGFpbHMgbGlrZSBcImhvdyB0byBkZWJ1ZyB0aGUgcHJvY2VzcyBvdXRwdXRcIiB0aGUgdXNlciB3aWxsIGhhdmUgYW4gVUkuXG5cblVzZSBcXGB3YWl0VW50aWw6IDBcXGAgZm9yIGRldiBzZXJ2ZXJzIHRoYXQgc2hvdWxkIHJ1biBpbmRlZmluaXRlbHkuXG5JdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gY2hlY2sgdGhlIG91dHB1dCBsb2cgYWZ0ZXIgcnVubmluZyBwcm9jZXNzZXMgbGlrZSBkZXYgc2VydmVycyB0byBtYWtlIHN1cmUgdGhleSBzdGFydGVkIGNvcnJlY3RseS5cblxuVG8gcnVuIGEgYmFja2dyb3VuZCBwcm9jZXNzOlxuQmFzaCh7IGNvbW1hbmQ6IFwibnBtIHJ1biBkZXZcIiwgd2FpdFVudGlsOiAwIH0pXG5SZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggXFxgY29tbWFuZElkXFxgLiBUaGUgcHJvY2VzcyBrZWVwcyBydW5uaW5nIGluIHRoZSBzYW5kYm94LlxuXG5UbyBraWxsIGEgcHJvY2VzczpcbkJhc2goeyBjb21tYW5kOiBcInBzIGF1eCB8IGdyZXAgbm9kZVwiIH0pICAgLy8gRmluZCB0aGUgUElEXG5CYXNoKHsgY29tbWFuZDogXCJraWxsIHtwaWR9XCIgfSkgICAgICAgICAgICAvLyBHcmFjZWZ1bFxuQmFzaCh7IGNvbW1hbmQ6IFwia2lsbCAtOSB7cGlkfVwiIH0pICAgICAgICAgLy8gRm9yY2VcbmA7XG5cbmZ1bmN0aW9uIGJ1aWxkU2tpbGxzQ29udGV4dChza2lsbHM6IFNraWxsU3VtbWFyeVtdKTogc3RyaW5nIHtcbiAgaWYgKHNraWxscy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIGNvbnN0IHNraWxsTGluZXMgPSBza2lsbHNcbiAgICAubWFwKChzKSA9PiBgLSAke3MubmFtZX06ICR7cy5kZXNjcmlwdGlvbn1gKVxuICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gIHJldHVybiBgIyMgQXZhaWxhYmxlIFNraWxsc1xuJHtza2lsbExpbmVzfVxuXG4ke2JhY2tncm91bmRQcm9jZXNzUHJvbXB0fVxuXG5Vc2UgdGhlIFNraWxsIHRvb2wgdG8gbG9hZCBhIHNraWxsJ3MgZnVsbCBpbnN0cnVjdGlvbnMgYmVmb3JlIGZvbGxvd2luZyBpdC5gO1xufVxuIiwgImltcG9ydCB0eXBlIHsgQW55QWdlbnQgfSBmcm9tIFwiLi4vYWdlbnQvY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuLi9zYW5kYm94L2FkYXB0ZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgdHlwZSBMb2dnZXIgfSBmcm9tIFwiLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBwYXJzZVNraWxsRnJvbnRtYXR0ZXIgfSBmcm9tIFwiLi9wYXJzZXJcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxTdW1tYXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBEaXNjb3ZlcnMgc2tpbGxzIGZyb20gZGlyZWN0b3JpZXMgaW5zaWRlIHRoZSBzYW5kYm94IGJ5IGZpbmRpbmcgYW5kIHBhcnNpbmcgU0tJTEwubWQgZmlsZXMuXG4gKiBTY2FucyBlYWNoIGRpcmVjdG9yeSBmb3Igc3ViZGlyZWN0b3JpZXMgY29udGFpbmluZyBTS0lMTC5tZCwgZXh0cmFjdHMgZnJvbnRtYXR0ZXIgbWV0YWRhdGEsXG4gKiBhbmQgcmV0dXJucyBzdW1tYXJpZXMgZm9yIHVzZSBpbiB0aGUgc3lzdGVtIHByb21wdC5cbiAqXG4gKiBAcmV0dXJucyBBcnJheSBvZiBza2lsbCBzdW1tYXJpZXMgKGRlZHVwbGljYXRlZCBieSBuYW1lLCBmaXJzdCBvY2N1cnJlbmNlIHdpbnMpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlclNraWxsc0luU2FuZGJveChvcHRzOiB7XG4gIGFnZW50OiBBbnlBZ2VudDtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBza2lsbHNEaXJzOiBzdHJpbmdbXTtcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xufSk6IFByb21pc2U8U2tpbGxTdW1tYXJ5W10+IHtcbiAgY29uc3QgeyBhZ2VudCwgc2FuZGJveCwgc2tpbGxzRGlycywgc2Vzc2lvbklkIH0gPSBvcHRzO1xuICBjb25zdCBiYXNlTG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHsgLi4uYWdlbnQub3B0aW9ucy5sb2dnaW5nLCBuYW1lOiBhZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcInNraWxsc1wiLFxuICB9KTtcbiAgY29uc3QgbG9nID0gc2Vzc2lvbklkID8gYmFzZUxvZy53aXRoQ29udGV4dCh7IHNlc3Npb25JZCB9KSA6IGJhc2VMb2c7XG4gIGNvbnN0IGRvbmUgPSBsb2cudGltZShcImRpc2NvdmVyU2tpbGxzSW5TYW5kYm94XCIpO1xuXG4gIGNvbnN0IHN1bW1hcmllczogU2tpbGxTdW1tYXJ5W10gPSBbXTtcbiAgY29uc3Qgc2Vlbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBza2lsbHNEaXIgb2Ygc2tpbGxzRGlycykge1xuICAgIGNvbnN0IGRpckRvbmUgPSBsb2cudGltZShcInNjYW4gZGlyZWN0b3J5XCIsIHsgZGlyOiBza2lsbHNEaXIgfSk7XG4gICAgY29uc3QgZGlyU3VtbWFyaWVzID0gYXdhaXQgZGlzY292ZXJTa2lsbHNJbkRpcmVjdG9yeSh7XG4gICAgICBzYW5kYm94LFxuICAgICAgc2tpbGxzRGlyLFxuICAgICAgbG9nLFxuICAgIH0pO1xuICAgIGRpckRvbmUoeyBjb3VudDogZGlyU3VtbWFyaWVzLmxlbmd0aCB9KTtcblxuICAgIGZvciAoY29uc3Qgc3VtbWFyeSBvZiBkaXJTdW1tYXJpZXMpIHtcbiAgICAgIGlmICghc2Vlbk5hbWVzLmhhcyhzdW1tYXJ5Lm5hbWUpKSB7XG4gICAgICAgIHNlZW5OYW1lcy5hZGQoc3VtbWFyeS5uYW1lKTtcbiAgICAgICAgc3VtbWFyaWVzLnB1c2goc3VtbWFyeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZG9uZSh7IHRvdGFsU2tpbGxzOiBzdW1tYXJpZXMubGVuZ3RoIH0pO1xuXG4gIHJldHVybiBzdW1tYXJpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyU2tpbGxzSW5EaXJlY3Rvcnkob3B0czoge1xuICBzYW5kYm94OiBTYW5kYm94SW5zdGFuY2U7XG4gIHNraWxsc0Rpcjogc3RyaW5nO1xuICBsb2c6IExvZ2dlcjtcbn0pOiBQcm9taXNlPFNraWxsU3VtbWFyeVtdPiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgc2tpbGxzRGlyLCBsb2cgfSA9IG9wdHM7XG4gIGNvbnN0IHNraWxsUGF0aHMgPSBhd2FpdCBmaW5kU2tpbGxGaWxlcyh7IHNhbmRib3gsIHNraWxsc0RpciwgbG9nIH0pO1xuXG4gIGlmIChza2lsbFBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHN1bW1hcmllczogU2tpbGxTdW1tYXJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHNraWxsTWRQYXRoIG9mIHNraWxsUGF0aHMpIHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gYXdhaXQgcGFyc2VTa2lsbEZpbGUoeyBzYW5kYm94LCBza2lsbE1kUGF0aCwgbG9nIH0pO1xuICAgIGlmIChzdW1tYXJ5KSB7XG4gICAgICBzdW1tYXJpZXMucHVzaChzdW1tYXJ5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VtbWFyaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kU2tpbGxGaWxlcyhvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3hJbnN0YW5jZTtcbiAgc2tpbGxzRGlyOiBzdHJpbmc7XG4gIGxvZzogTG9nZ2VyO1xufSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBza2lsbHNEaXIsIGxvZyB9ID0gb3B0cztcblxuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcImZpbmRcIixcbiAgICBhcmdzOiBbc2tpbGxzRGlyLCBcIi1uYW1lXCIsIFwiU0tJTEwubWRcIiwgXCItdHlwZVwiLCBcImZcIl0sXG4gIH0pO1xuXG4gIGlmIChleGVjUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBsb2cud2FybihcImZhaWxlZCB0byBzY2FuIHNraWxscyBkaXJlY3RvcnlcIiwge1xuICAgICAgZGlyOiBza2lsbHNEaXIsXG4gICAgICBlcnJvcjogZXhlY1Jlc3VsdC5tZXNzYWdlLFxuICAgIH0pO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHsgc3Rkb3V0LCBleGl0Q29kZSB9ID0gYXdhaXQgZXhlY1Jlc3VsdC5yZXN1bHQ7XG5cbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgbG9nLndhcm4oXCJza2lsbHMgZGlyZWN0b3J5IG5vdCBmb3VuZCBvciBpbmFjY2Vzc2libGVcIiwgeyBkaXI6IHNraWxsc0RpciB9KTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gc3Rkb3V0XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdChcIlxcblwiKVxuICAgIC5maWx0ZXIoKHApID0+IHAubGVuZ3RoID4gMCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlU2tpbGxGaWxlKG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBza2lsbE1kUGF0aDogc3RyaW5nO1xuICBsb2c6IExvZ2dlcjtcbn0pOiBQcm9taXNlPFNraWxsU3VtbWFyeSB8IG51bGw+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBza2lsbE1kUGF0aCwgbG9nIH0gPSBvcHRzO1xuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcImNhdFwiLFxuICAgIGFyZ3M6IFtza2lsbE1kUGF0aF0sXG4gIH0pO1xuXG4gIGlmIChleGVjUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBsb2cud2FybihcImZhaWxlZCB0byByZWFkIHNraWxsIGZpbGVcIiwge1xuICAgICAgcGF0aDogc2tpbGxNZFBhdGgsXG4gICAgICBlcnJvcjogZXhlY1Jlc3VsdC5tZXNzYWdlLFxuICAgIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgeyBzdGRvdXQsIGV4aXRDb2RlIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcblxuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBsb2cud2FybihcImNvdWxkIG5vdCByZWFkIHNraWxsIGZpbGVcIiwgeyBwYXRoOiBza2lsbE1kUGF0aCB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlU2tpbGxGcm9udG1hdHRlcihzdGRvdXQpO1xuXG4gIGlmICghcGFyc2VkKSB7XG4gICAgbG9nLndhcm4oXCJpbnZhbGlkIG9yIG1pc3NpbmcgZnJvbnRtYXR0ZXJcIiwgeyBwYXRoOiBza2lsbE1kUGF0aCB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogcGFyc2VkLm5hbWUsXG4gICAgZGVzY3JpcHRpb246IHBhcnNlZC5kZXNjcmlwdGlvbixcbiAgICBza2lsbE1kUGF0aCxcbiAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNraWxsRW50cnksIFNraWxsSW5wdXQgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIFBhcnNlZCBmcm9udG1hdHRlciBmcm9tIGEgU0tJTEwubWQgZmlsZS5cbiAqL1xuZXhwb3J0IHR5cGUgU2tpbGxGcm9udG1hdHRlciA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBQYXJzZXMgWUFNTCBmcm9udG1hdHRlciBmcm9tIGEgU0tJTEwubWQgZmlsZSBjb250ZW50LlxuICogRnJvbnRtYXR0ZXIgbXVzdCBiZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGUsIGRlbGltaXRlZCBieSBgLS0tYCBtYXJrZXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBtYXJrZG93blxuICogLS0tXG4gKiBuYW1lOiBjc3ZcbiAqIGRlc2NyaXB0aW9uOiBBbmFseXplIENTViBkYXRhXG4gKiAtLS1cbiAqICMgQ1NWIFNraWxsXG4gKiAuLi5cbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIFBhcnNlZCBuYW1lIGFuZCBkZXNjcmlwdGlvbiwgb3IgbnVsbCBpZiBmcm9udG1hdHRlciBpcyBtaXNzaW5nL2ludmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2tpbGxGcm9udG1hdHRlcihcbiAgY29udGVudDogc3RyaW5nXG4pOiBTa2lsbEZyb250bWF0dGVyIHwgbnVsbCB7XG4gIGNvbnN0IHRyaW1tZWQgPSBjb250ZW50LnRyaW0oKTtcblxuICBpZiAoIXRyaW1tZWQuc3RhcnRzV2l0aChcIi0tLVwiKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZW5kTWFya2VySW5kZXggPSB0cmltbWVkLmluZGV4T2YoXCItLS1cIiwgMyk7XG4gIGlmIChlbmRNYXJrZXJJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGZyb250bWF0dGVyQmxvY2sgPSB0cmltbWVkLnNsaWNlKDMsIGVuZE1hcmtlckluZGV4KS50cmltKCk7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlU2ltcGxlWWFtbChmcm9udG1hdHRlckJsb2NrKTtcblxuICBpZiAoIShwYXJzZWQubmFtZSAmJiBwYXJzZWQuZGVzY3JpcHRpb24pKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5hbWU6IFN0cmluZyhwYXJzZWQubmFtZSksXG4gICAgZGVzY3JpcHRpb246IFN0cmluZyhwYXJzZWQuZGVzY3JpcHRpb24pLFxuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlcyBzaW1wbGUgWUFNTCBrZXktdmFsdWUgcGFpcnMgKHNpbmdsZS1saW5lIHZhbHVlcyBvbmx5KS5cbiAqIFRoaXMgYXZvaWRzIGFkZGluZyBhIGZ1bGwgWUFNTCBwYXJzZXIgZGVwZW5kZW5jeSBmb3IgYmFzaWMgZnJvbnRtYXR0ZXIuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU2ltcGxlWWFtbCh5YW1sOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIHlhbWwuc3BsaXQoXCJcXG5cIikpIHtcbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZExpbmUgfHwgdHJpbW1lZExpbmUuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9uSW5kZXggPSB0cmltbWVkTGluZS5pbmRleE9mKFwiOlwiKTtcbiAgICBpZiAoY29sb25JbmRleCA9PT0gLTEpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IHRyaW1tZWRMaW5lLnNsaWNlKDAsIGNvbG9uSW5kZXgpLnRyaW0oKTtcbiAgICBsZXQgdmFsdWUgPSB0cmltbWVkTGluZS5zbGljZShjb2xvbkluZGV4ICsgMSkudHJpbSgpO1xuXG4gICAgLy8gUmVtb3ZlIHN1cnJvdW5kaW5nIHF1b3RlcyBpZiBwcmVzZW50XG4gICAgaWYgKFxuICAgICAgKHZhbHVlLnN0YXJ0c1dpdGgoJ1wiJykgJiYgdmFsdWUuZW5kc1dpdGgoJ1wiJykpIHx8XG4gICAgICAodmFsdWUuc3RhcnRzV2l0aChcIidcIikgJiYgdmFsdWUuZW5kc1dpdGgoXCInXCIpKVxuICAgICkge1xuICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxLCAtMSk7XG4gICAgfVxuXG4gICAgaWYgKGtleSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2tpbGxzKFxuICBza2lsbHM6IFNraWxsSW5wdXRbXSB8IG51bGwgfCB1bmRlZmluZWRcbik6IFNraWxsRW50cnlbXSB7XG4gIGlmICghc2tpbGxzIHx8IHNraWxscy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gc2tpbGxzLm1hcCgoc2tpbGwpID0+IHtcbiAgICBpZiAodHlwZW9mIHNraWxsICE9PSBcIm9iamVjdFwiIHx8IHNraWxsID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiSW52YWxpZCBza2lsbHMgZW50cnk6IGV4cGVjdGVkIGFuIG9iamVjdCB3aXRoIGEgYHR5cGVgIGZpZWxkLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXCJ0eXBlXCIgaW4gc2tpbGwgJiYgc2tpbGwudHlwZSkge1xuICAgICAgcmV0dXJuIHNraWxsIGFzIFNraWxsRW50cnk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc2tpbGxzIGVudHJ5OiBleHBlY3RlZCBgdHlwZWAuXCIpO1xuICB9KTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFueUFnZW50IH0gZnJvbSBcIi4uL2FnZW50L2NsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi4vc2FuZGJveC9hZGFwdGVyXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBub3JtYWxpemVTa2lsbHMgfSBmcm9tIFwiLi9wYXJzZXJcIjtcbmltcG9ydCB7IHJlc29sdmVIb3N0U2tpbGwgfSBmcm9tIFwiLi9yZXNvbHZlLWhvc3RcIjtcbmltcG9ydCB7IHJlc29sdmVJbmxpbmVTa2lsbCB9IGZyb20gXCIuL3Jlc29sdmUtaW5saW5lXCI7XG5pbXBvcnQgeyByZXNvbHZlUmVtb3RlU2tpbGwgfSBmcm9tIFwiLi9yZXNvbHZlLXJlbW90ZVwiO1xuaW1wb3J0IHR5cGUgeyBTa2lsbElucHV0IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTa2lsbElucHV0c1RvU2FuZGJveERpcnMob3B0czoge1xuICBhZ2VudDogQW55QWdlbnQ7XG4gIHNhbmRib3g6IFNhbmRib3hJbnN0YW5jZTtcbiAgc2tpbGxzOiBTa2lsbElucHV0W107XG4gIHNlc3Npb25JZD86IHN0cmluZztcbn0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGJhc2VMb2cgPSBjcmVhdGVMb2dnZXIoe1xuICAgIGNvbmZpZzogeyAuLi5vcHRzLmFnZW50Lm9wdGlvbnMubG9nZ2luZywgbmFtZTogb3B0cy5hZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcInNraWxsc1wiLFxuICB9KTtcbiAgY29uc3QgbG9nID0gb3B0cy5zZXNzaW9uSWRcbiAgICA/IGJhc2VMb2cud2l0aENvbnRleHQoeyBzZXNzaW9uSWQ6IG9wdHMuc2Vzc2lvbklkIH0pXG4gICAgOiBiYXNlTG9nO1xuICBjb25zdCBlbnRyaWVzID0gbm9ybWFsaXplU2tpbGxzKG9wdHMuc2tpbGxzKTtcbiAgY29uc3QgcmVzb2x2ZWQ6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKGVudHJ5LnR5cGUgPT09IFwic2FuZGJveFwiKSB7XG4gICAgICByZXNvbHZlZC5wdXNoKGVudHJ5LnBhdGgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChlbnRyeS50eXBlID09PSBcImhvc3RcIikge1xuICAgICAgcmVzb2x2ZWQucHVzaChcbiAgICAgICAgYXdhaXQgcmVzb2x2ZUhvc3RTa2lsbCh7XG4gICAgICAgICAgc2FuZGJveDogb3B0cy5zYW5kYm94LFxuICAgICAgICAgIHNraWxsOiBlbnRyeSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGVudHJ5LnR5cGUgPT09IFwiZ2l0XCIpIHtcbiAgICAgIHJlc29sdmVkLnB1c2goXG4gICAgICAgIGF3YWl0IHJlc29sdmVSZW1vdGVTa2lsbCh7XG4gICAgICAgICAgc2FuZGJveDogb3B0cy5zYW5kYm94LFxuICAgICAgICAgIHNraWxsOiBlbnRyeSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGVudHJ5LnR5cGUgPT09IFwiaW5saW5lXCIpIHtcbiAgICAgIHJlc29sdmVkLnB1c2goXG4gICAgICAgIGF3YWl0IHJlc29sdmVJbmxpbmVTa2lsbCh7XG4gICAgICAgICAgc2FuZGJveDogb3B0cy5zYW5kYm94LFxuICAgICAgICAgIHNraWxsOiBlbnRyeSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgbG9nLndhcm4oXCJ1bmtub3duIHNraWxsIHNvdXJjZSBlbnRyeSBlbmNvdW50ZXJlZFwiLCB7IGVudHJ5IH0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4uL3NhbmRib3gvYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBIb3N0U2tpbGxJbnB1dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RGaWxlcyhvcHRzOiB7XG4gIGFic29sdXRlUGF0aDogc3RyaW5nO1xuICByZWxhdGl2ZVByZWZpeD86IHN0cmluZztcbn0pOiBQcm9taXNlPHsgcGF0aDogc3RyaW5nOyBjb250ZW50OiBCdWZmZXIgfVtdPiB7XG4gIGNvbnN0IHsgcmVhZGRpciwgcmVhZEZpbGUsIHN0YXQgfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIik7XG4gIGNvbnN0IHsgcmVzb2x2ZSwgcG9zaXg6IHBhdGhQb3NpeCB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuXG4gIGNvbnN0IGZpbGVTdGF0ID0gYXdhaXQgc3RhdChvcHRzLmFic29sdXRlUGF0aCk7XG4gIGlmIChmaWxlU3RhdC5pc0ZpbGUoKSkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShvcHRzLmFic29sdXRlUGF0aCk7XG4gICAgcmV0dXJuIFt7IHBhdGg6IG9wdHMucmVsYXRpdmVQcmVmaXggPz8gXCJTS0lMTC5tZFwiLCBjb250ZW50IH1dO1xuICB9XG5cbiAgaWYgKCFmaWxlU3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWRkaXIob3B0cy5hYnNvbHV0ZVBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3QgZmlsZXM6IHsgcGF0aDogc3RyaW5nOyBjb250ZW50OiBCdWZmZXIgfVtdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgbmV4dEFicyA9IHJlc29sdmUob3B0cy5hYnNvbHV0ZVBhdGgsIGVudHJ5Lm5hbWUpO1xuICAgIGNvbnN0IG5leHRSZWwgPSBvcHRzLnJlbGF0aXZlUHJlZml4XG4gICAgICA/IHBhdGhQb3NpeC5qb2luKG9wdHMucmVsYXRpdmVQcmVmaXgsIGVudHJ5Lm5hbWUpXG4gICAgICA6IGVudHJ5Lm5hbWU7XG5cbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgZmlsZXMucHVzaChcbiAgICAgICAgLi4uKGF3YWl0IGNvbGxlY3RGaWxlcyh7XG4gICAgICAgICAgYWJzb2x1dGVQYXRoOiBuZXh0QWJzLFxuICAgICAgICAgIHJlbGF0aXZlUHJlZml4OiBuZXh0UmVsLFxuICAgICAgICB9KSlcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZW50cnkuaXNGaWxlKCkpIHtcbiAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICBwYXRoOiBuZXh0UmVsLFxuICAgICAgICBjb250ZW50OiBhd2FpdCByZWFkRmlsZShuZXh0QWJzKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaWxlcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhYmxlRGlyTmFtZShpbnB1dFBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgY3JlYXRlSGFzaCB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpjcnlwdG9cIik7XG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKFwic2hhMVwiKS51cGRhdGUoaW5wdXRQYXRoKS5kaWdlc3QoXCJoZXhcIikuc2xpY2UoMCwgMTApO1xuICByZXR1cm4gYGhvc3QtJHtoYXNofWA7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlSG9zdFNraWxsKG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBza2lsbDogSG9zdFNraWxsSW5wdXQ7XG59KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyByZXNvbHZlLCBwb3NpeDogcGF0aFBvc2l4IH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlOnBhdGhcIik7XG5cbiAgY29uc3QgaG9zdFBhdGggPSByZXNvbHZlKHByb2Nlc3MuY3dkKCksIG9wdHMuc2tpbGwucGF0aCk7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgY29sbGVjdEZpbGVzKHsgYWJzb2x1dGVQYXRoOiBob3N0UGF0aCB9KTtcbiAgY29uc3QgZGlyTmFtZSA9IGF3YWl0IHN0YWJsZURpck5hbWUoaG9zdFBhdGgpO1xuICBjb25zdCBkZXN0UGF0aCA9IHBhdGhQb3NpeC5qb2luKFwiLmFnZW50XCIsIFwic2tpbGxzXCIsIFwiLm1hdGVyaWFsaXplZFwiLCBkaXJOYW1lKTtcblxuICBpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGRlc3RQYXRoO1xuICB9XG5cbiAgYXdhaXQgb3B0cy5zYW5kYm94LndyaXRlRmlsZXMoe1xuICAgIGZpbGVzLFxuICAgIGRlc3RQYXRoLFxuICB9KTtcblxuICByZXR1cm4gZGVzdFBhdGg7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi4vc2FuZGJveC9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IElubGluZVNraWxsSW5wdXQgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5mdW5jdGlvbiBzbHVnaWZ5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWVcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csIFwiLVwiKVxuICAgIC5yZXBsYWNlKC8oXi18LSQpL2csIFwiXCIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFibGVJbmxpbmVEaXJOYW1lKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgY3JlYXRlSGFzaCB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpjcnlwdG9cIik7XG4gIGNvbnN0IHNsdWcgPSBzbHVnaWZ5KG5hbWUpIHx8IFwiaW5saW5lLXNraWxsXCI7XG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKFwic2hhMVwiKS51cGRhdGUobmFtZSkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDgpO1xuICByZXR1cm4gYCR7c2x1Z30tJHtoYXNofWA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2tpbGxNYXJrZG93bihza2lsbDogSW5saW5lU2tpbGxJbnB1dCk6IHN0cmluZyB7XG4gIHJldHVybiBgLS0tXG5uYW1lOiAke3NraWxsLm5hbWV9XG5kZXNjcmlwdGlvbjogJHtza2lsbC5kZXNjcmlwdGlvbn1cbi0tLVxuXG4ke3NraWxsLmluc3RydWN0aW9ucy50cmltKCl9XG5gO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUlubGluZVNraWxsKG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBza2lsbDogSW5saW5lU2tpbGxJbnB1dDtcbn0pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHBvc2l4OiBwYXRoUG9zaXggfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6cGF0aFwiKTtcblxuICBjb25zdCBkaXJOYW1lID0gYXdhaXQgc3RhYmxlSW5saW5lRGlyTmFtZShvcHRzLnNraWxsLm5hbWUpO1xuICBjb25zdCBkZXN0UGF0aCA9IHBhdGhQb3NpeC5qb2luKFwiLmFnZW50XCIsIFwic2tpbGxzXCIsIFwiLm1hdGVyaWFsaXplZFwiLCBkaXJOYW1lKTtcblxuICBhd2FpdCBvcHRzLnNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgZGVzdFBhdGgsXG4gICAgZmlsZXM6IFtcbiAgICAgIHtcbiAgICAgICAgcGF0aDogXCJTS0lMTC5tZFwiLFxuICAgICAgICBjb250ZW50OiBidWlsZFNraWxsTWFya2Rvd24ob3B0cy5za2lsbCksXG4gICAgICB9LFxuICAgIF0sXG4gIH0pO1xuXG4gIHJldHVybiBkZXN0UGF0aDtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuLi9zYW5kYm94L2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgR2l0U2tpbGxJbnB1dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmZ1bmN0aW9uIHNoZWxsUXVvdGUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJyR7dmFsdWUucmVwbGFjZSgvJy9nLCBgJ1xcXFwnJ2ApfSdgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFibGVSZXBvRGlyTmFtZShza2lsbDogR2l0U2tpbGxJbnB1dCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgY3JlYXRlSGFzaCB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpjcnlwdG9cIik7XG4gIGNvbnN0IGhhc2hJbnB1dCA9IGAke3NraWxsLnJlcG99Ojoke3NraWxsLnJlZiA/PyBcIkhFQURcIn1gO1xuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChcInNoYTFcIikudXBkYXRlKGhhc2hJbnB1dCkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDEyKTtcbiAgcmV0dXJuIGBnaXQtJHtoYXNofWA7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlUmVtb3RlU2tpbGwob3B0czoge1xuICBzYW5kYm94OiBTYW5kYm94SW5zdGFuY2U7XG4gIHNraWxsOiBHaXRTa2lsbElucHV0O1xufSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcG9zaXg6IHBhdGhQb3NpeCB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuXG4gIGNvbnN0IGRpck5hbWUgPSBhd2FpdCBzdGFibGVSZXBvRGlyTmFtZShvcHRzLnNraWxsKTtcbiAgY29uc3QgY2xvbmVEaXIgPSBwYXRoUG9zaXguam9pbihcIi5hZ2VudFwiLCBcInNraWxsc1wiLCBcIi5tYXRlcmlhbGl6ZWRcIiwgZGlyTmFtZSk7XG4gIGNvbnN0IHF1b3RlZERpciA9IHNoZWxsUXVvdGUoY2xvbmVEaXIpO1xuICBjb25zdCBxdW90ZWRSZXBvID0gc2hlbGxRdW90ZShvcHRzLnNraWxsLnJlcG8pO1xuICBjb25zdCBxdW90ZWRSZWYgPSBzaGVsbFF1b3RlKG9wdHMuc2tpbGwucmVmID8/IFwiSEVBRFwiKTtcblxuICBjb25zdCBzeW5jQ29tbWFuZCA9IFtcbiAgICBcInNldCAtZXVvIHBpcGVmYWlsXCIsXG4gICAgYGlmIFsgISAtZCAke3F1b3RlZERpcn0vLmdpdCBdOyB0aGVuYCxcbiAgICBgICBybSAtcmYgJHtxdW90ZWREaXJ9YCxcbiAgICBgICBta2RpciAtcCAke3F1b3RlZERpcn1gLFxuICAgIGAgIGdpdCBjbG9uZSAtLWRlcHRoIDEgJHtxdW90ZWRSZXBvfSAke3F1b3RlZERpcn1gLFxuICAgIFwiZmlcIixcbiAgICBgaWYgWyAke3F1b3RlZFJlZn0gIT0gJ0hFQUQnIF07IHRoZW5gLFxuICAgIGAgIGdpdCAtQyAke3F1b3RlZERpcn0gZmV0Y2ggLS1kZXB0aCAxIG9yaWdpbiAke3F1b3RlZFJlZn1gLFxuICAgIGAgIGdpdCAtQyAke3F1b3RlZERpcn0gY2hlY2tvdXQgRkVUQ0hfSEVBRGAsXG4gICAgXCJmaVwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG5cbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGF3YWl0IG9wdHMuc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICBhcmdzOiBbXCItbGNcIiwgc3luY0NvbW1hbmRdLFxuICB9KTtcbiAgY29uc3QgeyBleGl0Q29kZSwgc3RkZXJyIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBtYXRlcmlhbGl6ZSBnaXQgc2tpbGwgZnJvbSAke29wdHMuc2tpbGwucmVwb306ICR7c3RkZXJyIHx8IFwidW5rbm93biBlcnJvclwifWBcbiAgICApO1xuICB9XG5cbiAgbGV0IHJlc29sdmVkRGlyID0gY2xvbmVEaXI7XG4gIGlmIChvcHRzLnNraWxsLnBhdGgpIHtcbiAgICByZXNvbHZlZERpciA9IHBhdGhQb3NpeC5qb2luKHJlc29sdmVkRGlyLCBvcHRzLnNraWxsLnBhdGgpO1xuICB9XG4gIGlmIChvcHRzLnNraWxsLm5hbWUpIHtcbiAgICByZXNvbHZlZERpciA9IHBhdGhQb3NpeC5qb2luKHJlc29sdmVkRGlyLCBvcHRzLnNraWxsLm5hbWUpO1xuICB9XG4gIHJldHVybiByZXNvbHZlZERpcjtcbn1cbiIsICJpbXBvcnQge1xuICB0eXBlIFRvb2xTZXQsXG4gIHRvb2wsXG4gIHR5cGUgVUlNZXNzYWdlLFxuICB0eXBlIFVJTWVzc2FnZVN0cmVhbVdyaXRlcixcbn0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyB1bGlkIH0gZnJvbSBcInVsaWRcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IEFueUFnZW50LCBSZXNvbHZhYmxlQXJncyB9IGZyb20gXCIuLi9hZ2VudC9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4uL3NhbmRib3gvYWRhcHRlclwiO1xuaW1wb3J0IHsgREVGQVVMVF9XQUlUX1VOVElMIH0gZnJvbSBcIi4uL3NhbmRib3gvcHJvY2Vzcy1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBhcHByb3ZhbFBhcnRJZCB9IGZyb20gXCIuLi9zZXNzaW9uL3NlbmRcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxTdW1tYXJ5IH0gZnJvbSBcIi4uL3NraWxscy90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCB0eXBlIExvZ2dlciB9IGZyb20gXCIuLi91dGlscy9sb2dnZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUphdmFTY3JpcHRUb29sLCB0eXBlIE9uU3ViVG9vbENhbGwgfSBmcm9tIFwiLi9qYXZhc2NyaXB0XCI7XG5pbXBvcnQgeyBjaGVja05lZWRzQXBwcm92YWwgfSBmcm9tIFwiLi9uZWVkcy1hcHByb3ZhbFwiO1xuXG5jb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoeyBjb25maWc6IHsgbmFtZTogXCJ0b29sc1wiIH0sIHN1YnN5c3RlbTogXCJ0b29sc1wiIH0pO1xuXG5mdW5jdGlvbiBmb3JtYXRGaWxlU2l6ZShieXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGJ5dGVzIDwgMTAyNCkge1xuICAgIHJldHVybiBgJHtieXRlc31gO1xuICB9XG4gIGlmIChieXRlcyA8IDEwMjQgKiAxMDI0KSB7XG4gICAgcmV0dXJuIGAkeyhieXRlcyAvIDEwMjQpLnRvRml4ZWQoMSl9S2A7XG4gIH1cbiAgaWYgKGJ5dGVzIDwgMTAyNCAqIDEwMjQgKiAxMDI0KSB7XG4gICAgcmV0dXJuIGAkeyhieXRlcyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMSl9TWA7XG4gIH1cbiAgcmV0dXJuIGAkeyhieXRlcyAvICgxMDI0ICogMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDEpfUdgO1xufVxuXG50eXBlIFN0cmVhbVdyaXRlciA9IFVJTWVzc2FnZVN0cmVhbVdyaXRlcjtcblxuZXhwb3J0IHR5cGUgVG9vbENvbnRleHQ8XG4gIFRDb250ZXh0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIFRvb2xzIGV4dGVuZHMgVG9vbFNldCA9IFRvb2xTZXQsXG4+ID0gUmVzb2x2YWJsZUFyZ3M8VENvbnRleHQsIFRvb2xzPjtcblxuZnVuY3Rpb24gaXNSZ05vdEZvdW5kRXJyb3IoZXJyOiBFcnJvcik6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJ0cyA9IFtlcnIubWVzc2FnZV07XG5cbiAgY29uc3QgYW55RXJyID0gZXJyIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmICh0eXBlb2YgYW55RXJyLnJlYXNvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgIHBhcnRzLnB1c2goYW55RXJyLnJlYXNvbik7XG4gIH1cbiAgaWYgKGFueUVyci5jYXVzZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcGFydHMucHVzaChhbnlFcnIuY2F1c2UubWVzc2FnZSk7XG4gICAgY29uc3QgYW55Q2F1c2UgPSBhbnlFcnIuY2F1c2UgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAodHlwZW9mIGFueUNhdXNlLnRleHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHBhcnRzLnB1c2goYW55Q2F1c2UudGV4dCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbXNnID0gcGFydHMuam9pbihcIiBcIikudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChcbiAgICBtc2cuaW5jbHVkZXMoXCJleGVjdXRhYmxlIGZpbGUgbm90IGZvdW5kXCIpIHx8XG4gICAgbXNnLmluY2x1ZGVzKFwiZXhlY3V0YWJsZV9ub3RfZm91bmRcIikgfHxcbiAgICAobXNnLmluY2x1ZGVzKFwiZW5vZW50XCIpICYmIG1zZy5pbmNsdWRlcyhcInJnXCIpKVxuICApO1xufVxuXG5leHBvcnQgY29uc3QgYnVpbHRJblRvb2xzID0ge1xuICBSZWFkOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiUmVhZHMgYSBmaWxlIGFuZCByZXR1cm5zIGl0cyBjb250ZW50cyB3aXRoIG1ldGFkYXRhLiBGb3IgZmlsZXMgb3ZlciAyMDAgbGluZXMsIGF1dG9tYXRpY2FsbHkgc2hvd3MgZmlyc3QgMTAwIGxpbmVzIHVubGVzcyBhIHNwZWNpZmljIGxpbmUgcmFuZ2UgaXMgcHJvdmlkZWQuIFVzZSBzdGFydExpbmUgYW5kIGVuZExpbmUgcGFyYW1ldGVycyB0byByZWFkIHNwZWNpZmljIHBvcnRpb25zIG9mIGxhcmdlIGZpbGVzLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlXCIpLFxuICAgICAgc3RhcnRMaW5lOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJTdGFydGluZyBsaW5lIG51bWJlciAoMS1pbmRleGVkKS4gSWYgcHJvdmlkZWQgd2l0aCBlbmRMaW5lLCByZWFkcyBleGFjdCByYW5nZSByZWdhcmRsZXNzIG9mIGZpbGUgc2l6ZS5cIlxuICAgICAgICApLFxuICAgICAgZW5kTGluZTogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiRW5kaW5nIGxpbmUgbnVtYmVyICgxLWluZGV4ZWQsIGluY2x1c2l2ZSkuIElmIHByb3ZpZGVkIHdpdGggc3RhcnRMaW5lLCByZWFkcyBleGFjdCByYW5nZSByZWdhcmRsZXNzIG9mIGZpbGUgc2l6ZS5cIlxuICAgICAgICApLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgY29udGVudDogei5zdHJpbmcoKS5kZXNjcmliZShcIkZpbGUgY29udGVudFwiKSxcbiAgICAgIG1ldGFkYXRhOiB6Lm9iamVjdCh7XG4gICAgICAgIHRvdGFsTGluZXM6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJUb3RhbCBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGZpbGVcIiksXG4gICAgICAgIGxpbmVzU2hvd246IHpcbiAgICAgICAgICAubnVtYmVyKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJOdW1iZXIgb2YgbGluZXMgaW5jbHVkZWQgaW4gdGhpcyByZXNwb25zZVwiKSxcbiAgICAgICAgc3RhcnRMaW5lOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiRmlyc3QgbGluZSBudW1iZXIgc2hvd24gKDEtaW5kZXhlZClcIiksXG4gICAgICAgIGVuZExpbmU6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJMYXN0IGxpbmUgbnVtYmVyIHNob3duICgxLWluZGV4ZWQpXCIpLFxuICAgICAgICBpc1BhZ2luYXRlZDogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJXaGV0aGVyIHRoaXMgaXMgYSBwYXJ0aWFsIHZpZXcgb2YgdGhlIGZpbGVcIiksXG4gICAgICAgIGZpbGVTaXplOiB6XG4gICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiSHVtYW4tcmVhZGFibGUgZmlsZSBzaXplIChlLmcuLCAnMi41SycsICcxLjJNJylcIiksXG4gICAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlXCIpLFxuICAgICAgfSksXG4gICAgfSksXG4gIH0pLFxuICBHcmVwOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiU2VhcmNoIGZvciBwYXR0ZXJucyBpbiBmaWxlcyB1c2luZyByaXBncmVwLiBVc2UgdGhpcyB0byBmaW5kIGNvZGUgcGF0dGVybnMsIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBpbXBvcnRzLCBldGMuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxhYmVsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJBIGxhYmVsIHRoYXQgZGVzY3JpYmVzIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkXCIpLFxuICAgICAgcGF0dGVybjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiUmVnZXggcGF0dGVybiB0byBzZWFyY2ggZm9yIChyaXBncmVwIHN5bnRheClcIiksXG4gICAgICBwYXRoOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJBYnNvbHV0ZSBwYXRoIHRvIHNlYXJjaCBpbiAoZGVmYXVsdHMgdG8gd29ya2luZyBkaXJlY3RvcnkpLiBDYW4gYmUgYSBmaWxlIG9yIGRpcmVjdG9yeS5cIlxuICAgICAgICApLFxuICAgICAgZmlsZVR5cGU6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkZpbGUgdHlwZSB0byBmaWx0ZXIgYnkgKGUuZy4sICd0cycsICdqcycsICdweScsICdtZCcpLiBVc2VzIHJpcGdyZXAncyBidWlsdC1pbiB0eXBlIGZpbHRlcnMuXCJcbiAgICAgICAgKSxcbiAgICAgIGdsb2I6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkdsb2IgcGF0dGVybiB0byBmaWx0ZXIgZmlsZXMgKGUuZy4sICcqLnRzeCcsICdzcmMvKiovKi50cycpXCJcbiAgICAgICAgKSxcbiAgICAgIGNhc2VTZW5zaXRpdmU6IHpcbiAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVmYXVsdCh0cnVlKVxuICAgICAgICAuZGVzY3JpYmUoXCJXaGV0aGVyIHNlYXJjaCBpcyBjYXNlLXNlbnNpdGl2ZSAoZGVmYXVsdDogdHJ1ZSlcIiksXG4gICAgICBjb250ZXh0TGluZXM6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk51bWJlciBvZiBjb250ZXh0IGxpbmVzIHRvIHNob3cgYmVmb3JlIGFuZCBhZnRlciBlYWNoIG1hdGNoXCJcbiAgICAgICAgKSxcbiAgICAgIG1heENvdW50OiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJNYXhpbXVtIG51bWJlciBvZiBtYXRjaGVzIHBlciBmaWxlICh1c2VmdWwgZm9yIGxpbWl0aW5nIG91dHB1dClcIlxuICAgICAgICApLFxuICAgICAgZmlsZXNXaXRoTWF0Y2hlczogelxuICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJPbmx5IHNob3cgZmlsZSBwYXRocyB0aGF0IGNvbnRhaW4gbWF0Y2hlcywgbm90IHRoZSBtYXRjaGluZyBsaW5lcyB0aGVtc2VsdmVzXCJcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIG1hdGNoZXM6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIlNlYXJjaCByZXN1bHRzIHdpdGggZmlsZSBwYXRocywgbGluZSBudW1iZXJzLCBhbmQgbWF0Y2hpbmcgY29udGVudFwiXG4gICAgICAgICksXG4gICAgICBzdW1tYXJ5OiB6Lm9iamVjdCh7XG4gICAgICAgIG1hdGNoQ291bnQ6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJOdW1iZXIgb2YgbWF0Y2hlcyBmb3VuZFwiKSxcbiAgICAgICAgZmlsZUNvdW50OiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiTnVtYmVyIG9mIGZpbGVzIGNvbnRhaW5pbmcgbWF0Y2hlc1wiKSxcbiAgICAgICAgc2VhcmNoUGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdGhhdCB3YXMgc2VhcmNoZWRcIiksXG4gICAgICAgIHBhdHRlcm46IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXR0ZXJuIHRoYXQgd2FzIHNlYXJjaGVkIGZvclwiKSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICB9KSxcbiAgTGlzdDogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlJlY3Vyc2l2ZWx5IGxpc3QgZGlyZWN0b3J5IGNvbnRlbnRzLiBVc2UgdGhpcyB0byB1bmRlcnN0YW5kIHRoZSBjb2RlYmFzZSBzdHJ1Y3R1cmUsIGZpbmQgZmlsZXMsIG9yIGV4cGxvcmUgZGlyZWN0b3JpZXMuIENvbnRyb2wgZGVwdGggdG8gYmFsYW5jZSBkZXRhaWwgdnMuIG92ZXJ2aWV3LiBEZXB0aCAxIHNob3dzIGltbWVkaWF0ZSBjaGlsZHJlbiwgZGVwdGggMiBpbmNsdWRlcyBzdWJkaXJlY3RvcmllcywgZXRjLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIHBhdGg6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcIkFic29sdXRlIHBhdGggdG8gbGlzdCAoZGVmYXVsdHMgdG8gd29ya2luZyBkaXJlY3RvcnkpXCIpLFxuICAgICAgZGVwdGg6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk1heGltdW0gZGVwdGggdG8gdHJhdmVyc2UuIENob29zZSBiYXNlZCBvbiBjb250ZXh0OiAxLTIgZm9yIHF1aWNrIG92ZXJ2aWV3LCAzLTQgZm9yIGRldGFpbGVkIGV4cGxvcmF0aW9uLCA1KyBmb3IgY29tcHJlaGVuc2l2ZSBtYXBwaW5nXCJcbiAgICAgICAgKSxcbiAgICAgIGluY2x1ZGVIaWRkZW46IHpcbiAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiSW5jbHVkZSBoaWRkZW4gZmlsZXMgYW5kIGRpcmVjdG9yaWVzICh0aG9zZSBzdGFydGluZyB3aXRoICcuJylcIlxuICAgICAgICApLFxuICAgICAgZmlsZXNPbmx5OiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgIC5kZXNjcmliZShcIk9ubHkgc2hvdyBmaWxlcywgbm90IGRpcmVjdG9yaWVzXCIpLFxuICAgICAgcGF0dGVybjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFwiR2xvYiBwYXR0ZXJuIHRvIGZpbHRlciByZXN1bHRzIChlLmcuLCAnKi50cycsICcqdGVzdConKVwiKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxpc3Rpbmc6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkRpcmVjdG9yeSB0cmVlIGxpc3Rpbmcgc2hvd2luZyBwYXRocyByZWxhdGl2ZSB0byBzZWFyY2ggcm9vdFwiXG4gICAgICAgICksXG4gICAgICBzdW1tYXJ5OiB6Lm9iamVjdCh7XG4gICAgICAgIHRvdGFsSXRlbXM6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJUb3RhbCBudW1iZXIgb2YgaXRlbXMgZm91bmRcIiksXG4gICAgICAgIHRvdGFsRmlsZXM6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJUb3RhbCBudW1iZXIgb2YgZmlsZXMgZm91bmRcIiksXG4gICAgICAgIHRvdGFsRGlyczogei5udW1iZXIoKS5kZXNjcmliZShcIlRvdGFsIG51bWJlciBvZiBkaXJlY3RvcmllcyBmb3VuZFwiKSxcbiAgICAgICAgc2VhcmNoUGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdGhhdCB3YXMgbGlzdGVkXCIpLFxuICAgICAgICBkZXB0aDogelxuICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiTWF4aW11bSBkZXB0aCB1c2VkIChpZiBzcGVjaWZpZWQpXCIpLFxuICAgICAgfSksXG4gICAgfSksXG4gIH0pLFxuICBXcml0ZTogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIldyaXRlIGNvbnRlbnQgdG8gYSBmaWxlLiBDcmVhdGVzIHBhcmVudCBkaXJlY3RvcmllcyBhdXRvbWF0aWNhbGx5LiBPdmVyd3JpdGVzIGV4aXN0aW5nIGZpbGVzLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlXCIpLFxuICAgICAgY29udGVudDogei5zdHJpbmcoKS5kZXNjcmliZShcIkNvbnRlbnQgdG8gd3JpdGUgdG8gdGhlIGZpbGVcIiksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBzdWNjZXNzOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIldoZXRoZXIgdGhlIHdyaXRlIHN1Y2NlZWRlZFwiKSxcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSB3cml0dGVuIGZpbGVcIiksXG4gICAgICBieXRlc1dyaXR0ZW46IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlblwiKSxcbiAgICAgIGVycm9yOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJFcnJvciBtZXNzYWdlIGlmIHdyaXRlIGZhaWxlZFwiKSxcbiAgICB9KSxcbiAgfSksXG4gIEVkaXQ6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFZGl0IGEgZmlsZSBieSByZXBsYWNpbmcgYW4gZXhhY3Qgc3RyaW5nLiBGYWlscyBpZiBvbGRfc3RyaW5nIGlzIG5vdCBmb3VuZCBvciBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIChub3QgdW5pcXVlKS4gRm9yIG11bHRpcGxlIHJlcGxhY2VtZW50cywgY2FsbCB0aGlzIHRvb2wgbXVsdGlwbGUgdGltZXMgd2l0aCB1bmlxdWUgY29udGV4dC5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGFiZWw6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkEgbGFiZWwgdGhhdCBkZXNjcmliZXMgdGhlIGFjdGlvbiBiZWluZyBwZXJmb3JtZWRcIiksXG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiQWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZVwiKSxcbiAgICAgIG9sZF9zdHJpbmc6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkV4YWN0IHN0cmluZyB0byBmaW5kIGFuZCByZXBsYWNlIChtdXN0IGJlIHVuaXF1ZSBpbiBmaWxlKVwiKSxcbiAgICAgIG5ld19zdHJpbmc6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJTdHJpbmcgdG8gcmVwbGFjZSBvbGRfc3RyaW5nIHdpdGhcIiksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBzdWNjZXNzOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIldoZXRoZXIgdGhlIGVkaXQgc3VjY2VlZGVkXCIpLFxuICAgICAgcGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdG8gdGhlIGVkaXRlZCBmaWxlXCIpLFxuICAgICAgZXJyb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkVycm9yIG1lc3NhZ2UgaWYgZWRpdCBmYWlsZWRcIiksXG4gICAgfSksXG4gIH0pLFxuICBCYXNoOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiRXhlY3V0ZXMgYSBiYXNoIGNvbW1hbmQuIFJldHVybnMgc3Rkb3V0IGFuZCBzdGRlcnIgc2VwYXJhdGVseS4gVXNlIHdhaXRVbnRpbCB0byBjb250cm9sIGhvdyBsb25nIHRvIHdhaXQgKDAgPSByZXR1cm4gaW1tZWRpYXRlbHksIHByb2Nlc3Mga2VlcHMgcnVubmluZykuIExhcmdlIG91dHB1dHMgYXJlIHRhaWwtdHJ1bmNhdGVkOyBmdWxsIG91dHB1dCBpbiBvdXRwdXREaXIuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxhYmVsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJBIGxhYmVsIHRoYXQgZGVzY3JpYmVzIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkXCIpLFxuICAgICAgY29tbWFuZDogei5zdHJpbmcoKS5kZXNjcmliZShcIlRoZSBzaGVsbCBjb21tYW5kIHRvIGV4ZWN1dGVcIiksXG4gICAgICB3YWl0VW50aWw6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBgTWF4IG1zIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24gKGRlZmF1bHQ6ICR7REVGQVVMVF9XQUlUX1VOVElMfSkuIFVzZSAwIHRvIHJldHVybiBpbW1lZGlhdGVseSB3aGlsZSB0aGUgcHJvY2VzcyBrZWVwcyBydW5uaW5nLmBcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGNvbW1hbmRJZDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQ29tbWFuZCBJRC4gVXNlIHRvIHJlZmVyZW5jZSBvciBraWxsIHJ1bm5pbmcgcHJvY2Vzc2VzLlwiKSxcbiAgICAgIHN0ZG91dDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiQ29tbWFuZCBzdGRvdXQuIFRhaWwtdHJ1bmNhdGVkIGlmIGxhcmdlOyBmdWxsIGNvbnRlbnQgaW4gb3V0cHV0RGlyL3N0ZG91dC50eHQuXCJcbiAgICAgICAgKSxcbiAgICAgIHN0ZGVycjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiQ29tbWFuZCBzdGRlcnIuIFRhaWwtdHJ1bmNhdGVkIGlmIGxhcmdlOyBmdWxsIGNvbnRlbnQgaW4gb3V0cHV0RGlyL3N0ZGVyci50eHQuXCJcbiAgICAgICAgKSxcbiAgICAgIGV4aXRDb2RlOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiRXhpdCBjb2RlICgtMSBpZiBzdGlsbCBydW5uaW5nKVwiKSxcbiAgICAgIHN0YXR1czogelxuICAgICAgICAuZW51bShbXCJydW5uaW5nXCIsIFwiY29tcGxldGVkXCIsIFwiZmFpbGVkXCJdKVxuICAgICAgICAuZGVzY3JpYmUoXCJQcm9jZXNzIHN0YXR1c1wiKSxcbiAgICAgIG91dHB1dERpcjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiUGF0aCB0byBvdXRwdXQgZGlyZWN0b3J5IGNvbnRhaW5pbmcgc3Rkb3V0LnR4dCwgc3RkZXJyLnR4dCwgYW5kIG1ldGFkYXRhLmpzb24uIEVtcHR5IGlmIHN0aWxsIHJ1bm5pbmcuXCJcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgfSksXG4gIFNraWxsOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiTG9hZCBhIHNraWxsJ3MgZnVsbCBpbnN0cnVjdGlvbnMgYnkgbmFtZS4gQ2FsbCB0aGlzIGJlZm9yZSBmb2xsb3dpbmcgYSBza2lsbC5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGFiZWw6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkEgbGFiZWwgdGhhdCBkZXNjcmliZXMgdGhlIGFjdGlvbiBiZWluZyBwZXJmb3JtZWRcIiksXG4gICAgICBuYW1lOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiU2tpbGwgbmFtZSBmcm9tIHRoZSBBdmFpbGFibGUgU2tpbGxzIGxpc3RcIiksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgICAgZGVzY3JpcHRpb246IHouc3RyaW5nKCksXG4gICAgICBjb250ZW50OiB6LnN0cmluZygpLmRlc2NyaWJlKFwiRnVsbCBTS0lMTC5tZCBjb250ZW50XCIpLFxuICAgICAgcGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdG8gdGhlIHNraWxsIGRpcmVjdG9yeSBpbiB0aGUgc2FuZGJveFwiKSxcbiAgICB9KSxcbiAgfSksXG4gIEphdmFTY3JpcHQ6IHRvb2woe1xuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIGNvZGU6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkphdmFTY3JpcHQgYXN5bmMgZnVuY3Rpb24gYm9keS4gYGN0eGAgaXMgaW4gc2NvcGUuIE11c3QgdXNlIGByZXR1cm5gIHRvIHByb2R1Y2Ugb3V0cHV0LlwiXG4gICAgICAgICksXG4gICAgfSksXG4gIH0pLFxufSBzYXRpc2ZpZXMgVG9vbFNldDtcblxuZXhwb3J0IHR5cGUgQnVpbHRJblRvb2xOYW1lID0ga2V5b2YgdHlwZW9mIGJ1aWx0SW5Ub29scztcbmV4cG9ydCBjb25zdCBidWlsdGluVG9vbE5hbWVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICBPYmplY3QuZW50cmllcyhidWlsdEluVG9vbHMpLm1hcCgoW25hbWVdKSA9PiBbbmFtZSwgbmFtZV0pXG4pIGFzIHsgW0sgaW4gQnVpbHRJblRvb2xOYW1lXTogSyB9O1xuXG5jb25zdCBTS0lMTF9NRF9TVUZGSVggPSAvXFwvP1NLSUxMXFwubWQkLztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRvb2xzKHtcbiAgYWdlbnQsXG4gIHNhbmRib3gsXG4gIHNraWxsc1JlZixcbiAgd3JpdGVyLFxuICBhYm9ydENvbnRyb2xsZXIsXG4gIG5leHRQYXJ0SW5kZXhSZWYsXG4gIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgc2Vzc2lvbklkLFxuICBzdGVwTG9nLFxuICBjb250ZXh0LFxuICBtZXNzYWdlcyxcbiAgYWN0aXZlVG9vbHMsXG59OiB7XG4gIGFnZW50OiBBbnlBZ2VudDtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBza2lsbHNSZWY6IHsgY3VycmVudDogU2tpbGxTdW1tYXJ5W10gfTtcbiAgd3JpdGVyOiBTdHJlYW1Xcml0ZXI7XG4gIGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuICBuZXh0UGFydEluZGV4UmVmOiB7IGN1cnJlbnQ6IG51bWJlciB9O1xuICBhc3Npc3RhbnRNZXNzYWdlSWQ6IHN0cmluZztcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHN0ZXBMb2c6IExvZ2dlcjtcbiAgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIG1lc3NhZ2VzOiBVSU1lc3NhZ2VbXTtcbiAgYWN0aXZlVG9vbHM/OiBzdHJpbmdbXTtcbn0pOiB7XG4gIHJhd1Rvb2xzOiBUb29sU2V0O1xuICB0b29sc1dpdGhOZWVkc0FwcHJvdmFsOiBUb29sU2V0O1xuICB0b29sQ29udGV4dDogVG9vbENvbnRleHQ7XG59IHtcbiAgY29uc3QgcmF3VG9vbHM6IFRvb2xTZXQgPSB7XG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuUmVhZF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLlJlYWQsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXRoLCBzdGFydExpbmUsIGVuZExpbmUgfSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGg7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FuZGJveC5yZWFkRmlsZSh7IHBhdGg6IGZpbGVQYXRoIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGxvZy5lcnJvcihcIlJlYWQgZmFpbGVkXCIsIHsgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIH0pO1xuICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogYEVycm9yOiBGaWxlIG5vdCBmb3VuZCAtICR7ZmlsZVBhdGh9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHRvdGFsTGluZXM6IDAsXG4gICAgICAgICAgICAgIGxpbmVzU2hvd246IDAsXG4gICAgICAgICAgICAgIHN0YXJ0TGluZTogMCxcbiAgICAgICAgICAgICAgZW5kTGluZTogMCxcbiAgICAgICAgICAgICAgaXNQYWdpbmF0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICBmaWxlU2l6ZTogXCIwXCIsXG4gICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnVsbENvbnRlbnQgPSByZXN1bHQudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgICAgICAgY29uc3QgbGluZXMgPSBmdWxsQ29udGVudC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgLy8gQSB0cmFpbGluZyBuZXdsaW5lIHByb2R1Y2VzIGFuIGVtcHR5IGxhc3QgZWxlbWVudCBcdTIwMTQgcmVtb3ZlIGl0XG4gICAgICAgIC8vIHNvIGxpbmUgY291bnQgbWF0Y2hlcyBgd2MgLWxgIC8gYGF3ayAnRU5Ee3ByaW50IE5SfSdgIGJlaGF2aW9yLlxuICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lcy5hdCgtMSkgPT09IFwiXCIpIHtcbiAgICAgICAgICBsaW5lcy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3RhbExpbmVzID0gbGluZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBmaWxlQnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChmdWxsQ29udGVudCk7XG4gICAgICAgIGNvbnN0IGZpbGVTaXplID0gZm9ybWF0RmlsZVNpemUoZmlsZUJ5dGVzKTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgcmFuZ2VcbiAgICAgICAgY29uc3QgUEFHRV9TSVpFID0gMTAwO1xuICAgICAgICBsZXQgYWN0dWFsU3RhcnQ6IG51bWJlcjtcbiAgICAgICAgbGV0IGFjdHVhbEVuZDogbnVtYmVyO1xuXG4gICAgICAgIGlmIChzdGFydExpbmUgIT09IHVuZGVmaW5lZCAmJiBlbmRMaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhY3R1YWxTdGFydCA9IHN0YXJ0TGluZTtcbiAgICAgICAgICBhY3R1YWxFbmQgPSBlbmRMaW5lO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0TGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSBzdGFydExpbmU7XG4gICAgICAgICAgYWN0dWFsRW5kID0gTWF0aC5taW4oc3RhcnRMaW5lICsgUEFHRV9TSVpFIC0gMSwgdG90YWxMaW5lcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZW5kTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSAxO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IGVuZExpbmU7XG4gICAgICAgIH0gZWxzZSBpZiAodG90YWxMaW5lcyA+IDIwMCkge1xuICAgICAgICAgIGFjdHVhbFN0YXJ0ID0gMTtcbiAgICAgICAgICBhY3R1YWxFbmQgPSBQQUdFX1NJWkU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSAxO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IHRvdGFsTGluZXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBsaW5lIHJhbmdlICgxLWluZGV4ZWQpXG4gICAgICAgIGNvbnN0IHNsaWNlZExpbmVzID0gbGluZXMuc2xpY2UoYWN0dWFsU3RhcnQgLSAxLCBhY3R1YWxFbmQpO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gc2xpY2VkTGluZXMuam9pbihcIlxcblwiKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB0b3RhbExpbmVzLFxuICAgICAgICAgICAgbGluZXNTaG93bjogTWF0aC5tYXgoMCwgYWN0dWFsRW5kIC0gYWN0dWFsU3RhcnQgKyAxKSxcbiAgICAgICAgICAgIHN0YXJ0TGluZTogYWN0dWFsU3RhcnQsXG4gICAgICAgICAgICBlbmRMaW5lOiBhY3R1YWxFbmQsXG4gICAgICAgICAgICBpc1BhZ2luYXRlZDogYWN0dWFsRW5kIDwgdG90YWxMaW5lcyxcbiAgICAgICAgICAgIGZpbGVTaXplLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5HcmVwXTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuR3JlcCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7XG4gICAgICAgIHBhdHRlcm4sXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGZpbGVUeXBlLFxuICAgICAgICBnbG9iLFxuICAgICAgICBjYXNlU2Vuc2l0aXZlLFxuICAgICAgICBjb250ZXh0TGluZXMsXG4gICAgICAgIG1heENvdW50LFxuICAgICAgICBmaWxlc1dpdGhNYXRjaGVzLFxuICAgICAgfSkgPT4ge1xuICAgICAgICBjb25zdCBzZWFyY2hQYXRoID0gcGF0aCA/PyBcIi5cIjtcblxuICAgICAgICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGFyZ3MucHVzaChcIi0tbGluZS1udW1iZXJcIik7XG4gICAgICAgIGFyZ3MucHVzaChcIi0taGVhZGluZ1wiKTtcbiAgICAgICAgYXJncy5wdXNoKFwiLS1jb2xvclwiLCBcIm5ldmVyXCIpO1xuXG4gICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgICAgIGFyZ3MucHVzaChcIi1pXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGVUeXBlKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS10eXBlXCIsIGZpbGVUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnbG9iKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS1nbG9iXCIsIGdsb2IpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHRMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLUNcIiwgU3RyaW5nKGNvbnRleHRMaW5lcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1heENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItLW1heC1jb3VudFwiLCBTdHJpbmcobWF4Q291bnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlc1dpdGhNYXRjaGVzKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS1maWxlcy13aXRoLW1hdGNoZXNcIik7XG4gICAgICAgIH1cblxuICAgICAgICBhcmdzLnB1c2goXCItLVwiLCBwYXR0ZXJuLCBzZWFyY2hQYXRoKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHsgY29tbWFuZDogXCJyZ1wiLCBhcmdzIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvciAmJiBpc1JnTm90Rm91bmRFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgICAgbG9nLndhcm4oXCJyZyBub3QgZm91bmQsIGluc3RhbGxpbmcgcmlwZ3JlcFwiKTtcbiAgICAgICAgICBjb25zdCBpbnN0YWxsUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICBcIi1jXCIsXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBcImNvbW1hbmQgLXYgcmcgPi9kZXYvbnVsbCAyPiYxICYmIGV4aXQgMFwiLFxuICAgICAgICAgICAgICAgIFwiZG5mIGluc3RhbGwgLXkgcmlwZ3JlcCAyPi9kZXYvbnVsbCAmJiBleGl0IDBcIixcbiAgICAgICAgICAgICAgICBcIihhcHQtZ2V0IHVwZGF0ZSAtcXEgJiYgYXB0LWdldCBpbnN0YWxsIC15IC1xcSByaXBncmVwKSAyPi9kZXYvbnVsbCAmJiBleGl0IDBcIixcbiAgICAgICAgICAgICAgICBcImFwayBhZGQgLS1uby1jYWNoZSByaXBncmVwIDI+L2Rldi9udWxsICYmIGV4aXQgMFwiLFxuICAgICAgICAgICAgICAgIFwiY3VybCAtc0wgaHR0cHM6Ly9naXRodWIuY29tL0J1cm50U3VzaGkvcmlwZ3JlcC9yZWxlYXNlcy9kb3dubG9hZC8xNC4xLjEvcmlwZ3JlcC0xNC4xLjEteDg2XzY0LXVua25vd24tbGludXgtbXVzbC50YXIuZ3ogfCB0YXIgeHogLUMgL3RtcCAmJiBpbnN0YWxsIC90bXAvcmlwZ3JlcC0xNC4xLjEteDg2XzY0LXVua25vd24tbGludXgtbXVzbC9yZyAvdXNyL2xvY2FsL2Jpbi9yZyAmJiBybSAtcmYgL3RtcC9yaXBncmVwLTE0LjEuMS14ODZfNjQtdW5rbm93bi1saW51eC1tdXNsXCIsXG4gICAgICAgICAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBzdWRvOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghKGluc3RhbGxSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbGxPdXRwdXQgPSBhd2FpdCBpbnN0YWxsUmVzdWx0LnJlc3VsdDtcbiAgICAgICAgICAgIGlmIChpbnN0YWxsT3V0cHV0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgICAgICAgIGxvZy53YXJuKFwicmlwZ3JlcCBpbnN0YWxsIGZhaWxlZFwiLCB7XG4gICAgICAgICAgICAgICAgc3RkZXJyOiBpbnN0YWxsT3V0cHV0LnN0ZGVycixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7IGNvbW1hbmQ6IFwicmdcIiwgYXJncyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvciAmJiBpc1JnTm90Rm91bmRFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgICAgbG9nLndhcm4oXCJyZyB1bmF2YWlsYWJsZSwgZmFsbGluZyBiYWNrIHRvIGdyZXBcIik7XG4gICAgICAgICAgY29uc3QgZ3JlcEFyZ3MgPSBbXCItcm5cIiwgXCItLWNvbG9yPW5ldmVyXCJdO1xuICAgICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgICAgICAgZ3JlcEFyZ3MucHVzaChcIi1pXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29udGV4dExpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGdyZXBBcmdzLnB1c2goXCItQ1wiLCBTdHJpbmcoY29udGV4dExpbmVzKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXhDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBncmVwQXJncy5wdXNoKFwiLW1cIiwgU3RyaW5nKG1heENvdW50KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWxlc1dpdGhNYXRjaGVzKSB7XG4gICAgICAgICAgICBncmVwQXJncy5wdXNoKFwiLWxcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChnbG9iKSB7XG4gICAgICAgICAgICBncmVwQXJncy5wdXNoKGAtLWluY2x1ZGU9JHtnbG9ifWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmlsZVR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHtcbiAgICAgICAgICAgICAgdHM6IFtcIioudHNcIiwgXCIqLnRzeFwiLCBcIioubXRzXCIsIFwiKi5jdHNcIl0sXG4gICAgICAgICAgICAgIGpzOiBbXCIqLmpzXCIsIFwiKi5qc3hcIiwgXCIqLm1qc1wiLCBcIiouY2pzXCJdLFxuICAgICAgICAgICAgICBweTogW1wiKi5weVwiXSxcbiAgICAgICAgICAgICAgcnVzdDogW1wiKi5yc1wiXSxcbiAgICAgICAgICAgICAgZ286IFtcIiouZ29cIl0sXG4gICAgICAgICAgICAgIGphdmE6IFtcIiouamF2YVwiXSxcbiAgICAgICAgICAgICAgbWQ6IFtcIioubWRcIl0sXG4gICAgICAgICAgICAgIGpzb246IFtcIiouanNvblwiXSxcbiAgICAgICAgICAgICAgY3NzOiBbXCIqLmNzc1wiXSxcbiAgICAgICAgICAgICAgaHRtbDogW1wiKi5odG1sXCJdLFxuICAgICAgICAgICAgICB5YW1sOiBbXCIqLnltbFwiLCBcIioueWFtbFwiXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4dCBvZiBpbmNsdWRlTWFwW2ZpbGVUeXBlXSA/PyBbYCouJHtmaWxlVHlwZX1gXSkge1xuICAgICAgICAgICAgICBncmVwQXJncy5wdXNoKGAtLWluY2x1ZGU9JHtleHR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGdyZXBBcmdzLnB1c2goXCItLVwiLCBwYXR0ZXJuLCBzZWFyY2hQYXRoKTtcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgICAgICAgY29tbWFuZDogXCJncmVwXCIsXG4gICAgICAgICAgICBhcmdzOiBncmVwQXJncyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGxvZy5lcnJvcihcIkdyZXAgZmFpbGVkXCIsIHsgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIH0pO1xuICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIgfSA9IGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG5cbiAgICAgICAgaWYgKHN0ZGVyciAmJiAhc3RkZXJyLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJubyBtYXRjaGVzXCIpKSB7XG4gICAgICAgICAgbG9nLndhcm4oXCJHcmVwIHN0ZGVyclwiLCB7IHN0ZGVyciB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRydW5jYXRlIG91dHB1dCB0byBwcmV2ZW50IFwiaW5wdXQgdG9vIGxvbmdcIiBlcnJvcnMgKDUwayBjaGFycyBcdTIyNDggMTIuNWsgdG9rZW5zKVxuICAgICAgICBjb25zdCBNQVhfR1JFUF9PVVRQVVRfQ0hBUlMgPSA1MF8wMDA7XG4gICAgICAgIGxldCBmaW5hbE91dHB1dCA9IHN0ZG91dDtcbiAgICAgICAgbGV0IHdhc1RydW5jYXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoZmluYWxPdXRwdXQubGVuZ3RoID4gTUFYX0dSRVBfT1VUUFVUX0NIQVJTKSB7XG4gICAgICAgICAgZmluYWxPdXRwdXQgPVxuICAgICAgICAgICAgZmluYWxPdXRwdXQuc2xpY2UoMCwgTUFYX0dSRVBfT1VUUFVUX0NIQVJTKSArXG4gICAgICAgICAgICBcIlxcblxcbltPdXRwdXQgdHJ1bmNhdGVkIC0gdXNlIG1vcmUgc3BlY2lmaWMgcGF0dGVybiBvciBwYXRoXVwiO1xuICAgICAgICAgIHdhc1RydW5jYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW5lcyA9IGZpbmFsT3V0cHV0XG4gICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgICAgIC5maWx0ZXIoKGwpID0+IGwubGVuZ3RoID4gMCk7XG4gICAgICAgIGNvbnN0IGZpbGVDb3VudCA9IGZpbGVzV2l0aE1hdGNoZXNcbiAgICAgICAgICA/IGxpbmVzLmxlbmd0aFxuICAgICAgICAgIDogbmV3IFNldChcbiAgICAgICAgICAgICAgbGluZXNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChsKSA9PiAhbC5zdGFydHNXaXRoKFwiIFwiKSAmJiBsLmluY2x1ZGVzKFwiOlwiKSlcbiAgICAgICAgICAgICAgICAubWFwKChsKSA9PiBsLnNwbGl0KFwiOlwiKVswXSlcbiAgICAgICAgICAgICkuc2l6ZTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgIG1hdGNoQ291bnQ6IGZpbGVzV2l0aE1hdGNoZXNcbiAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgIDogbGluZXMuZmlsdGVyKChsKSA9PiBsLmluY2x1ZGVzKFwiOlwiKSkubGVuZ3RoLFxuICAgICAgICAgICAgZmlsZUNvdW50LFxuICAgICAgICAgICAgc2VhcmNoUGF0aCxcbiAgICAgICAgICAgIHBhdHRlcm4sXG4gICAgICAgICAgICB3YXNUcnVuY2F0ZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtYXRjaGVzOiBmaW5hbE91dHB1dCB8fCBcIihubyBtYXRjaGVzIGZvdW5kKVwiLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5MaXN0XTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuTGlzdCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhdGgsIGRlcHRoLCBpbmNsdWRlSGlkZGVuLCBmaWxlc09ubHksIHBhdHRlcm4gfSkgPT4ge1xuICAgICAgICBjb25zdCBzZWFyY2hQYXRoID0gcGF0aCA/PyBcIi5cIjtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgIFwiLWNcIixcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgIHNldCAtZVxuICAgICAgICAgICAgU0VBUkNIX1BBVEg9XCIkMVwiXG4gICAgICAgICAgICBERVBUSD1cIiQyXCJcbiAgICAgICAgICAgIElOQ0xVREVfSElEREVOPVwiJDNcIlxuICAgICAgICAgICAgRklMRVNfT05MWT1cIiQ0XCJcbiAgICAgICAgICAgIFBBVFRFUk49XCIkNVwiXG5cbiAgICAgICAgICAgICMgQnVpbGQgZmluZCBjb21tYW5kIGFyZ3VtZW50c1xuICAgICAgICAgICAgRklORF9BUkdTPVwiXCJcbiAgICAgICAgICAgIFsgLW4gXCIkREVQVEhcIiBdICYmIEZJTkRfQVJHUz1cIiRGSU5EX0FSR1MgLW1heGRlcHRoICRERVBUSFwiXG4gICAgICAgICAgICBbIFwiJElOQ0xVREVfSElEREVOXCIgIT0gXCJ0cnVlXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTICEgLXBhdGggJyovLionXCJcbiAgICAgICAgICAgIFsgXCIkRklMRVNfT05MWVwiID0gXCJ0cnVlXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTIC10eXBlIGZcIlxuICAgICAgICAgICAgWyAtbiBcIiRQQVRURVJOXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTIC1uYW1lICckUEFUVEVSTidcIlxuXG4gICAgICAgICAgICAjIEdldCBsaXN0aW5nXG4gICAgICAgICAgICBMSVNUSU5HPSQoZXZhbCBcImZpbmQgJyRTRUFSQ0hfUEFUSCcgJEZJTkRfQVJHU1wiIDI+L2Rldi9udWxsIHwgc29ydClcblxuICAgICAgICAgICAgIyBHZXQgY291bnRzXG4gICAgICAgICAgICBDT1VOVF9BUkdTPVwiXCJcbiAgICAgICAgICAgIFsgLW4gXCIkREVQVEhcIiBdICYmIENPVU5UX0FSR1M9XCIkQ09VTlRfQVJHUyAtbWF4ZGVwdGggJERFUFRIXCJcbiAgICAgICAgICAgIFsgXCIkSU5DTFVERV9ISURERU5cIiAhPSBcInRydWVcIiBdICYmIENPVU5UX0FSR1M9XCIkQ09VTlRfQVJHUyAhIC1wYXRoICcqLy4qJ1wiXG5cbiAgICAgICAgICAgIEZJTEVfQ09VTlQ9JChldmFsIFwiZmluZCAnJFNFQVJDSF9QQVRIJyAkQ09VTlRfQVJHUyAtdHlwZSBmXCIgMj4vZGV2L251bGwgfCB3YyAtbClcbiAgICAgICAgICAgIERJUl9DT1VOVD0kKGV2YWwgXCJmaW5kICckU0VBUkNIX1BBVEgnICRDT1VOVF9BUkdTIC10eXBlIGRcIiAyPi9kZXYvbnVsbCB8IHdjIC1sKVxuXG4gICAgICAgICAgICAjIE91dHB1dDogY291bnRzIGZpcnN0LCB0aGVuIGxpc3RpbmdcbiAgICAgICAgICAgIGVjaG8gXCIkRklMRV9DT1VOVHwkRElSX0NPVU5UXCJcbiAgICAgICAgICAgIGVjaG8gXCJ8fHxMSVNUSU5HfHx8XCJcbiAgICAgICAgICAgIGVjaG8gXCIkTElTVElOR1wiIHwgc2VkIFwic3xeJFNFQVJDSF9QQVRIfC58XCJcbiAgICAgICAgICBgLFxuICAgICAgICAgICAgXCItLVwiLFxuICAgICAgICAgICAgc2VhcmNoUGF0aCxcbiAgICAgICAgICAgIGRlcHRoPy50b1N0cmluZygpIHx8IFwiXCIsXG4gICAgICAgICAgICBpbmNsdWRlSGlkZGVuID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIsXG4gICAgICAgICAgICBmaWxlc09ubHkgPyBcInRydWVcIiA6IFwiZmFsc2VcIixcbiAgICAgICAgICAgIHBhdHRlcm4gfHwgXCJcIixcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoXCJMaXN0IGZhaWxlZFwiLCB7IGVycm9yOiByZXN1bHQubWVzc2FnZSB9KTtcbiAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyIH0gPSBhd2FpdCByZXN1bHQucmVzdWx0O1xuXG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICBsb2cud2FybihcIkxpc3Qgc3RkZXJyXCIsIHsgc3RkZXJyIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2NvdW50c0xpbmUsIC4uLnJlc3RdID0gc3Rkb3V0LnNwbGl0KFwifHx8TElTVElOR3x8fFwiKTtcbiAgICAgICAgY29uc3QgbGlzdGluZyA9IHJlc3Quam9pbihcInx8fExJU1RJTkd8fHxcIikudHJpbSgpO1xuICAgICAgICBjb25zdCBbZmlsZUNvdW50U3RyLCBkaXJDb3VudFN0cl0gPSBjb3VudHNMaW5lLnRyaW0oKS5zcGxpdChcInxcIik7XG5cbiAgICAgICAgY29uc3QgdG90YWxGaWxlcyA9IE51bWJlci5wYXJzZUludChmaWxlQ291bnRTdHIsIDEwKSB8fCAwO1xuICAgICAgICBjb25zdCB0b3RhbERpcnMgPSBOdW1iZXIucGFyc2VJbnQoZGlyQ291bnRTdHIsIDEwKSB8fCAwO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGxpc3Rpbmcuc3BsaXQoXCJcXG5cIikuZmlsdGVyKChsKSA9PiBsLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgICAgdG90YWxJdGVtczogbGluZXMubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxGaWxlcyxcbiAgICAgICAgICAgIHRvdGFsRGlycyxcbiAgICAgICAgICAgIHNlYXJjaFBhdGgsXG4gICAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGxpc3RpbmcsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLldyaXRlXTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuV3JpdGUsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXRoLCBjb250ZW50IH0pID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgc2FuZGJveC53cml0ZUZpbGVzKHtcbiAgICAgICAgICAgIGZpbGVzOiBbeyBwYXRoOiBmaWxlUGF0aCwgY29udGVudCB9XSxcbiAgICAgICAgICAgIGRlc3RQYXRoOiBcIi5cIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBieXRlc1dyaXR0ZW46IEJ1ZmZlci5ieXRlTGVuZ3RoKGNvbnRlbnQsIFwidXRmOFwiKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvck1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGJ5dGVzV3JpdHRlbjogMCxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvck1zZyxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLkVkaXRdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5FZGl0LFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCwgb2xkX3N0cmluZywgbmV3X3N0cmluZyB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aDtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LnJlYWRGaWxlKHsgcGF0aDogZmlsZVBhdGggfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIHBhdGg6IGZpbGVQYXRoLCBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZVBhdGh9YCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IHJlc3VsdC50b1N0cmluZyhcInV0Zi04XCIpO1xuICAgICAgICBjb25zdCBvY2N1cnJlbmNlcyA9IGNvbnRlbnQuc3BsaXQob2xkX3N0cmluZykubGVuZ3RoIC0gMTtcblxuICAgICAgICBpZiAob2NjdXJyZW5jZXMgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBcIm9sZF9zdHJpbmcgbm90IGZvdW5kIGluIGZpbGVcIixcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9jY3VycmVuY2VzID4gMSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgZXJyb3I6IGBvbGRfc3RyaW5nIGFwcGVhcnMgJHtvY2N1cnJlbmNlc30gdGltZXMgaW4gZmlsZSAobXVzdCBiZSB1bmlxdWUpLiBJbmNsdWRlIG1vcmUgc3Vycm91bmRpbmcgY29udGV4dCB0byBtYWtlIHRoZSBtYXRjaCB1bmlxdWUuYCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZShvbGRfc3RyaW5nLCBuZXdfc3RyaW5nKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgICAgICAgICBmaWxlczogW3sgcGF0aDogZmlsZVBhdGgsIGNvbnRlbnQ6IG5ld0NvbnRlbnQgfV0sXG4gICAgICAgICAgICBkZXN0UGF0aDogXCIuXCIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBwYXRoOiBmaWxlUGF0aCB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvck1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgcGF0aDogZmlsZVBhdGgsIGVycm9yOiBlcnJvck1zZyB9O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLkJhc2hdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5CYXNoLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgY29tbWFuZCwgd2FpdFVudGlsIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBjcmVhdGVQcm9jZXNzTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgIFwiLi4vc2FuZGJveC9wcm9jZXNzLW1hbmFnZXJcIlxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHByb2Nlc3NNYW5hZ2VyID0gY3JlYXRlUHJvY2Vzc01hbmFnZXIoeyBzYW5kYm94IH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2Nlc3NNYW5hZ2VyLnJ1bih7IGNvbW1hbmQsIHdhaXRVbnRpbCB9KTtcblxuICAgICAgICBjb25zdCBNQVhfU1RET1VUID0gNTBfMDAwO1xuICAgICAgICBjb25zdCBNQVhfU1RERVJSID0gMTBfMDAwO1xuXG4gICAgICAgIGxldCB7IHN0ZG91dCwgc3RkZXJyIH0gPSByZXN1bHQ7XG4gICAgICAgIGlmIChzdGRvdXQubGVuZ3RoID4gTUFYX1NURE9VVCkge1xuICAgICAgICAgIHN0ZG91dCA9XG4gICAgICAgICAgICBgW3RydW5jYXRlZCBcdTIwMTQgc2hvd2luZyBsYXN0ICR7TUFYX1NURE9VVH0gY2hhcnMuIEZ1bGw6ICR7cmVzdWx0Lm91dHB1dERpcn0vc3Rkb3V0LnR4dF1cXG5cXG5gICtcbiAgICAgICAgICAgIHN0ZG91dC5zbGljZSgtTUFYX1NURE9VVCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZGVyci5sZW5ndGggPiBNQVhfU1RERVJSKSB7XG4gICAgICAgICAgc3RkZXJyID1cbiAgICAgICAgICAgIGBbdHJ1bmNhdGVkIFx1MjAxNCBzaG93aW5nIGxhc3QgJHtNQVhfU1RERVJSfSBjaGFycy4gRnVsbDogJHtyZXN1bHQub3V0cHV0RGlyfS9zdGRlcnIudHh0XVxcblxcbmAgK1xuICAgICAgICAgICAgc3RkZXJyLnNsaWNlKC1NQVhfU1RERVJSKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IC4uLnJlc3VsdCwgc3Rkb3V0LCBzdGRlcnIgfTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgLi4uYWdlbnQub3B0aW9ucy50b29scyxcbiAgfTtcblxuICBpZiAoc2tpbGxzUmVmLmN1cnJlbnQubGVuZ3RoID4gMCkge1xuICAgIHJhd1Rvb2xzW2J1aWx0aW5Ub29sTmFtZXMuU2tpbGxdID0gdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuU2tpbGwsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBuYW1lIH0pID0+IHtcbiAgICAgICAgY29uc3Qgc2tpbGxzID0gc2tpbGxzUmVmLmN1cnJlbnQ7XG4gICAgICAgIGNvbnN0IHNraWxsID0gc2tpbGxzLmZpbmQoXG4gICAgICAgICAgKHMpID0+IHMubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFza2lsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBTa2lsbCBub3QgZm91bmQ6IFwiJHtuYW1lfVwiLiBBdmFpbGFibGU6ICR7c2tpbGxzLm1hcCgocykgPT4gcy5uYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FuZGJveC5yZWFkRmlsZSh7XG4gICAgICAgICAgcGF0aDogc2tpbGwuc2tpbGxNZFBhdGgsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2tpbGwgZmlsZSBub3QgZm91bmQ6ICR7c2tpbGwuc2tpbGxNZFBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmF3ID1cbiAgICAgICAgICB0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiID8gcmVzdWx0IDogcmVzdWx0LnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgICAgIGNvbnN0IGVuZE1hcmtlciA9IHJhdy5pbmRleE9mKFwiLS0tXCIsIDMpO1xuICAgICAgICBjb25zdCBjb250ZW50ID1cbiAgICAgICAgICBlbmRNYXJrZXIgPT09IC0xID8gcmF3IDogcmF3LnNsaWNlKGVuZE1hcmtlciArIDMpLnRyaW0oKTtcbiAgICAgICAgY29uc3Qgc2tpbGxEaXIgPSBza2lsbC5za2lsbE1kUGF0aC5yZXBsYWNlKFNLSUxMX01EX1NVRkZJWCwgXCJcIik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogc2tpbGwubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogc2tpbGwuZGVzY3JpcHRpb24sXG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgICBwYXRoOiBza2lsbERpcixcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBvblN1YlRvb2xDYWxsOiBPblN1YlRvb2xDYWxsID0gYXN5bmMgKHRvb2xOYW1lLCB0b29sSW5wdXQsIGV4ZWN1dGUpID0+IHtcbiAgICBjb25zdCBuZWVkc0FwcHJvdmFsID0gYXdhaXQgY2hlY2tOZWVkc0FwcHJvdmFsKHtcbiAgICAgIGFnZW50LFxuICAgICAgdG9vbE5hbWUsXG4gICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgICAgdG9vbENhbGxJZDogYGpzXyR7dG9vbE5hbWV9XyR7RGF0ZS5ub3coKX1gLFxuICAgICAgbWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuXG4gICAgaWYgKCFuZWVkc0FwcHJvdmFsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlKCk7XG4gICAgICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhcHByb3ZhbElkID0gYGpzX2FwcHJvdmFsXyR7dWxpZCgpfWA7XG4gICAgY29uc3QgdG9vbENhbGxJZCA9IGBqc190Y18ke3VsaWQoKX1gO1xuICAgIGNvbnN0IHBhcnRJZCA9IGFwcHJvdmFsUGFydElkKGFwcHJvdmFsSWQpO1xuXG4gICAgYXdhaXQgYWdlbnQuc3RvcmFnZS5wYXJ0LnNldChwYXJ0SWQsIHtcbiAgICAgIGlkOiBwYXJ0SWQsXG4gICAgICBpbmRleDogbmV4dFBhcnRJbmRleFJlZi5jdXJyZW50KyssXG4gICAgICBtZXNzYWdlSWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHBhcnQ6IHtcbiAgICAgICAgdHlwZTogYHRvb2wtJHt0b29sTmFtZX1gLFxuICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICBzdGF0ZTogXCJhcHByb3ZhbC1yZXF1ZXN0ZWRcIixcbiAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgYXBwcm92YWw6IHsgaWQ6IGFwcHJvdmFsSWQgfSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBVSU1lc3NhZ2VbXCJwYXJ0c1wiXVtudW1iZXJdLFxuICAgIH0pO1xuXG4gICAgd3JpdGVyLndyaXRlKHtcbiAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1zdGFydFwiLFxuICAgICAgdG9vbENhbGxJZCxcbiAgICAgIHRvb2xOYW1lLFxuICAgIH0pO1xuICAgIHdyaXRlci53cml0ZSh7XG4gICAgICB0eXBlOiBcInRvb2wtaW5wdXQtYXZhaWxhYmxlXCIsXG4gICAgICB0b29sQ2FsbElkLFxuICAgICAgdG9vbE5hbWUsXG4gICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgIH0pO1xuICAgIHdyaXRlci53cml0ZSh7XG4gICAgICB0eXBlOiBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiLFxuICAgICAgYXBwcm92YWxJZCxcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBQT0xMX01TID0gNTAwO1xuICAgIGNvbnN0IFRJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwO1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCBUSU1FT1VUX01TICYmICFhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCBhZ2VudC5zdG9yYWdlLnBhcnQuZ2V0KHBhcnRJZCk7XG4gICAgICBpZiAoXG4gICAgICAgIHVwZGF0ZWQgJiZcbiAgICAgICAgXCJzdGF0ZVwiIGluIHVwZGF0ZWQucGFydCAmJlxuICAgICAgICAoKHVwZGF0ZWQucGFydCBhcyB7IHN0YXRlOiBzdHJpbmcgfSkuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVzcG9uZGVkXCIgfHxcbiAgICAgICAgICAodXBkYXRlZC5wYXJ0IGFzIHsgc3RhdGU6IHN0cmluZyB9KS5zdGF0ZSA9PT0gXCJvdXRwdXQtZGVuaWVkXCIpXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSAodXBkYXRlZC5wYXJ0IGFzIHsgc3RhdGU6IHN0cmluZyB9KS5zdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09IFwib3V0cHV0LWRlbmllZFwiKSB7XG4gICAgICAgICAgY29uc3QgcmVhc29uID0gKHVwZGF0ZWQucGFydCBhcyB7IGFwcHJvdmFsPzogeyByZWFzb24/OiBzdHJpbmcgfSB9KVxuICAgICAgICAgICAgLmFwcHJvdmFsPy5yZWFzb247XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yOiBgVG9vbCBcIiR7dG9vbE5hbWV9XCIgZGVuaWVkOiAke3JlYXNvbiB8fCBcInVzZXIgZGVuaWVkXCJ9YCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXBwcm92YWwgPSAoXG4gICAgICAgICAgdXBkYXRlZC5wYXJ0IGFzIHtcbiAgICAgICAgICAgIGFwcHJvdmFsPzogeyBhcHByb3ZlZDogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH07XG4gICAgICAgICAgfVxuICAgICAgICApLmFwcHJvdmFsO1xuICAgICAgICBpZiAoYXBwcm92YWw/LmFwcHJvdmVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoKTtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIG91dHB1dDogcmVzdWx0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1lcnJvclwiLFxuICAgICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICBlcnJvclRleHQ6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvciB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIud3JpdGUoe1xuICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtZGVuaWVkXCIsXG4gICAgICAgICAgdG9vbENhbGxJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IGBUb29sIFwiJHt0b29sTmFtZX1cIiBkZW5pZWQ6ICR7YXBwcm92YWw/LnJlYXNvbiB8fCBcInVzZXIgZGVuaWVkXCJ9YCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIFBPTExfTVMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZFxuICAgICAgICA/IFwiaW50ZXJydXB0ZWRcIlxuICAgICAgICA6IFwiQXBwcm92YWwgdGltZWQgb3V0XCIsXG4gICAgfTtcbiAgfTtcblxuICBjb25zdCB0b29sQ29udGV4dDogVG9vbENvbnRleHQgPSB7XG4gICAgY29udGV4dCxcbiAgICBzZXNzaW9uSWQsXG4gICAgc2FuZGJveCxcbiAgICBtZXNzYWdlczogbWVzc2FnZXMgYXMgVG9vbENvbnRleHRbXCJtZXNzYWdlc1wiXSxcbiAgfTtcblxuICByYXdUb29sc1tidWlsdGluVG9vbE5hbWVzLkphdmFTY3JpcHRdID0gY3JlYXRlSmF2YVNjcmlwdFRvb2woe1xuICAgIHRvb2xzOiByYXdUb29scyxcbiAgICBzYW5kYm94LFxuICAgIGFjdGl2ZVRvb2xzLFxuICAgIG9uU3ViVG9vbENhbGwsXG4gICAgdG9vbENvbnRleHQsXG4gIH0pO1xuXG4gIGNvbnN0IHRvb2xzV2l0aE5lZWRzQXBwcm92YWwgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMocmF3VG9vbHMpLm1hcCgoW25hbWUsIHRdKSA9PiB7XG4gICAgICBjb25zdCBvcmlnaW5hbEV4ZWN1dGUgPSB0LmV4ZWN1dGU7XG4gICAgICBjb25zdCB3cmFwcGVkRXhlY3V0ZSA9IG9yaWdpbmFsRXhlY3V0ZVxuICAgICAgICA/IGFzeW5jICguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBvcmlnaW5hbEV4ZWN1dGU+KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkb25lID0gc3RlcExvZy50aW1lKGB0b29sOiR7bmFtZX1gKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGxldCB0b29sSW5wdXQgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICBpZiAoYWdlbnQuaG9va3NbXCJ0b29sLmJlZm9yZVwiXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJlZm9yZVJlc3VsdCA9IGF3YWl0IGFnZW50Lmhvb2tzW1widG9vbC5iZWZvcmVcIl0oe1xuICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgICAgICAgICAgICAgICBjb250ZXh0OiB0b29sQ29udGV4dCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoYmVmb3JlUmVzdWx0Py5pbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICB0b29sSW5wdXQgPSBiZWZvcmVSZXN1bHQuaW5wdXQ7XG4gICAgICAgICAgICAgICAgICBhcmdzWzBdID0gdG9vbElucHV0IGFzICh0eXBlb2YgYXJncylbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IG9yaWdpbmFsRXhlY3V0ZSguLi5hcmdzKTtcblxuICAgICAgICAgICAgICBpZiAoYWdlbnQuaG9va3NbXCJ0b29sLmFmdGVyXCJdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWZ0ZXJSZXN1bHQgPSBhd2FpdCBhZ2VudC5ob29rc1tcInRvb2wuYWZ0ZXJcIl0oe1xuICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICBjb250ZXh0OiB0b29sQ29udGV4dCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJSZXN1bHQ/LnJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICByZXN1bHQgPSBhZnRlclJlc3VsdC5yZXN1bHQgYXMgdHlwZW9mIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGRvbmUoe1xuICAgICAgICAgICAgICAgIGVycm9yOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBuYW1lLFxuICAgICAgICB7XG4gICAgICAgICAgLi4udCxcbiAgICAgICAgICAuLi4od3JhcHBlZEV4ZWN1dGUgPyB7IGV4ZWN1dGU6IHdyYXBwZWRFeGVjdXRlIH0gOiB7fSksXG4gICAgICAgICAgbmVlZHNBcHByb3ZhbDogYXN5bmMgKFxuICAgICAgICAgICAgdG9vbElucHV0OiB1bmtub3duLFxuICAgICAgICAgICAgb3B0czogeyB0b29sQ2FsbElkOiBzdHJpbmc7IG1lc3NhZ2VzOiB1bmtub3duW10gfVxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNoZWNrTmVlZHNBcHByb3ZhbCh7XG4gICAgICAgICAgICAgIGFnZW50LFxuICAgICAgICAgICAgICB0b29sTmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogb3B0cy50b29sQ2FsbElkLFxuICAgICAgICAgICAgICBtZXNzYWdlczogb3B0cy5tZXNzYWdlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH0pXG4gICk7XG5cbiAgcmV0dXJuIHsgcmF3VG9vbHMsIHRvb2xzV2l0aE5lZWRzQXBwcm92YWwsIHRvb2xDb250ZXh0IH07XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBUb29sU2V0LCB0b29sIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi4vc2FuZGJveC9hZGFwdGVyXCI7XG5pbXBvcnQgeyBidWlsdEluVG9vbHMgfSBmcm9tIFwiLlwiO1xuXG5leHBvcnQgY29uc3QgSkFWQVNDUklQVF9UT09MX05BTUUgPSBcIkphdmFTY3JpcHRcIjtcblxuZXhwb3J0IHR5cGUgU3ViVG9vbENhbGxSZXN1bHQgPSB7IHJlc3VsdD86IHVua25vd247IGVycm9yPzogc3RyaW5nIH07XG5leHBvcnQgdHlwZSBPblN1YlRvb2xDYWxsID0gKFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBpbnB1dDogdW5rbm93bixcbiAgZXhlY3V0ZTogKCkgPT4gUHJvbWlzZTx1bmtub3duPlxuKSA9PiBQcm9taXNlPFN1YlRvb2xDYWxsUmVzdWx0PjtcblxuY29uc3QgUkVRVUVTVF9NQVJLRVJfU1RBUlQgPSBcIl9fVE9PTF9SRVFVRVNUX19cIjtcbmNvbnN0IFJFUVVFU1RfTUFSS0VSX0VORCA9IFwiX19UT09MX1JFUVVFU1RfRU5EX19cIjtcbmNvbnN0IEVYRUNVVElPTl9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBUaGUgcnVubmVyIHNjcmlwdCBpcyB3cml0dGVuIHRvIHRoZSBzYW5kYm94IGFuZCBleGVjdXRlZCB2aWEgTm9kZS5qcy5cbiAqIEl0IHJlYWRzIHRoZSBtb2RlbCdzIGNvZGUgZnJvbSBjb2RlLmpzLCBzZXRzIHVwIGN0eC50b29scyBhcyBSUEMgcHJveGllc1xuICogKHJlcXVlc3RzIHNlbnQgdmlhIHN0ZGVyciBtYXJrZXJzLCByZXNwb25zZXMgcG9sbGVkIGZyb20gZmlsZXMpLCBleGVjdXRlc1xuICogdGhlIGNvZGUsIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byBzdGRvdXQgYXMgSlNPTi5cbiAqL1xuY29uc3QgUlVOTkVSX1NDUklQVCA9IGBcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgZXhpc3RzU3luYywgdW5saW5rU3luYywgbWtkaXJTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbmNvbnN0IFNDUklQVF9ESVIgPSBkaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5jb25zdCBUT09MX0NBTExfVElNRU9VVF9NUyA9IDMwMF8wMDA7XG5cbmxldCByZXFDb3VudGVyID0gMDtcblxuYXN5bmMgZnVuY3Rpb24gY2FsbFRvb2wobmFtZSwgaW5wdXQpIHtcbiAgY29uc3QgaWQgPSAncmVxXycgKyAoKytyZXFDb3VudGVyKSArICdfJyArIERhdGUubm93KCk7XG4gIGNvbnN0IHJlc3BvbnNlRmlsZSA9IGpvaW4oU0NSSVBUX0RJUiwgaWQgKyAnLnJlc3BvbnNlLmpzb24nKTtcblxuICBjb25zdCByZXF1ZXN0ID0gSlNPTi5zdHJpbmdpZnkoeyBpZCwgdG9vbDogbmFtZSwgaW5wdXQgfSk7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcke1JFUVVFU1RfTUFSS0VSX1NUQVJUfScgKyByZXF1ZXN0ICsgJyR7UkVRVUVTVF9NQVJLRVJfRU5EfScgKyAnXFxcXG4nKTtcblxuICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gIHdoaWxlICghZXhpc3RzU3luYyhyZXNwb25zZUZpbGUpKSB7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGFydCA+IFRPT0xfQ0FMTF9USU1FT1VUX01TKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rvb2wgY2FsbCAnICsgbmFtZSArICcgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlc3BvbnNlJyk7XG4gICAgfVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAzMCkpO1xuICB9XG5cbiAgbGV0IHJhdztcbiAgdHJ5IHtcbiAgICByYXcgPSByZWFkRmlsZVN5bmMocmVzcG9uc2VGaWxlLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTApKTtcbiAgICByYXcgPSByZWFkRmlsZVN5bmMocmVzcG9uc2VGaWxlLCAndXRmOCcpO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJhdyk7XG4gIHRyeSB7IHVubGlua1N5bmMocmVzcG9uc2VGaWxlKTsgfSBjYXRjaCB7fVxuXG4gIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5lcnJvcik7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdDtcbn1cblxuY29uc3QgY29kZSA9IHJlYWRGaWxlU3luYyhqb2luKFNDUklQVF9ESVIsICdjb2RlLmpzJyksICd1dGY4Jyk7XG5jb25zdCB0b29sTmFtZXMgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhqb2luKFNDUklQVF9ESVIsICd0b29scy5qc29uJyksICd1dGY4JykpO1xuXG5jb25zdCBjdHggPSB7IHRvb2xzOiB7fSB9O1xuZm9yIChjb25zdCBuYW1lIG9mIHRvb2xOYW1lcykge1xuICBjdHgudG9vbHNbbmFtZV0gPSAoaW5wdXQpID0+IGNhbGxUb29sKG5hbWUsIGlucHV0KTtcbn1cblxuY29uc3QgbG9ncyA9IFtdO1xuY29uc3QgY3VzdG9tQ29uc29sZSA9IHtcbiAgbG9nOiAoLi4uYXJncykgPT4gbG9ncy5wdXNoKGFyZ3MubWFwKGEgPT4gdHlwZW9mIGEgPT09ICdzdHJpbmcnID8gYSA6IEpTT04uc3RyaW5naWZ5KGEpKS5qb2luKCcgJykpLFxuICBlcnJvcjogKC4uLmFyZ3MpID0+IGxvZ3MucHVzaCgnW2Vycm9yXSAnICsgYXJncy5tYXAoYSA9PiB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogSlNPTi5zdHJpbmdpZnkoYSkpLmpvaW4oJyAnKSksXG4gIHdhcm46ICguLi5hcmdzKSA9PiBsb2dzLnB1c2goJ1t3YXJuXSAnICsgYXJncy5tYXAoYSA9PiB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogSlNPTi5zdHJpbmdpZnkoYSkpLmpvaW4oJyAnKSksXG59O1xuXG50cnkge1xuICBjb25zdCBBc3luY0Z1bmN0aW9uID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGFzeW5jIGZ1bmN0aW9uKCkge30pLmNvbnN0cnVjdG9yO1xuICBjb25zdCBmbiA9IG5ldyBBc3luY0Z1bmN0aW9uKCdjdHgnLCAnY29uc29sZScsIGNvZGUpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbihjdHgsIGN1c3RvbUNvbnNvbGUpO1xuXG4gIGNvbnN0IG91dHB1dCA9IHsgc3VjY2VzczogdHJ1ZSwgcmVzdWx0OiByZXN1bHQgIT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IG51bGwgfTtcbiAgaWYgKGxvZ3MubGVuZ3RoID4gMCkgb3V0cHV0LmxvZ3MgPSBsb2dzO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZShKU09OLnN0cmluZ2lmeShvdXRwdXQpKTtcbn0gY2F0Y2ggKGVycikge1xuICBjb25zdCBvdXRwdXQgPSB7XG4gICAgc3VjY2VzczogZmFsc2UsXG4gICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgfTtcbiAgaWYgKGxvZ3MubGVuZ3RoID4gMCkgb3V0cHV0LmxvZ3MgPSBsb2dzO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZShKU09OLnN0cmluZ2lmeShvdXRwdXQpKTtcbn1cbmA7XG5cbi8qKlxuICogRXh0cmFjdHMgYSBwbGFpbiBKU09OIFNjaGVtYSBmcm9tIHdoYXRldmVyIGZvcm1hdCB0aGUgQUkgU0RLIHRvb2wgdXNlc1xuICogKFpvZCBzY2hlbWEsIEFJIFNESyB3cmFwcGVkIHNjaGVtYSwgb3IgcmF3IEpTT04gU2NoZW1hKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RKc29uU2NoZW1hKFxuICBzY2hlbWE6IHVua25vd25cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB7XG4gIGlmICghc2NoZW1hIHx8IHR5cGVvZiBzY2hlbWEgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChcbiAgICBcIl9kZWZcIiBpbiBzY2hlbWEgJiZcbiAgICB0eXBlb2YgKHNjaGVtYSBhcyB7IF9kZWY6IHVua25vd24gfSkuX2RlZiA9PT0gXCJvYmplY3RcIlxuICApIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHoudG9KU09OU2NoZW1hKHNjaGVtYSBhcyB6LlpvZFR5cGUpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcyA9IHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPjtcbiAgaWYgKFN5bWJvbC5mb3IoXCJ2ZXJjZWwuYWkuc2NoZW1hXCIpIGluIHMgJiYgXCJqc29uU2NoZW1hXCIgaW4gcykge1xuICAgIHJldHVybiBzLmpzb25TY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICBpZiAoXCJ0eXBlXCIgaW4gcyB8fCBcInByb3BlcnRpZXNcIiBpbiBzKSB7XG4gICAgcmV0dXJuIHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpzb25TY2hlbWFUb1RzKFxuICBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBpbmRlbnQgPSAwXG4pOiBzdHJpbmcge1xuICBpZiAoIXNjaGVtYSkge1xuICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxuXG4gIGlmIChzY2hlbWEuZW51bSAmJiBBcnJheS5pc0FycmF5KHNjaGVtYS5lbnVtKSkge1xuICAgIHJldHVybiBzY2hlbWEuZW51bS5tYXAoKHYpID0+IEpTT04uc3RyaW5naWZ5KHYpKS5qb2luKFwiIHwgXCIpO1xuICB9XG5cbiAgaWYgKHNjaGVtYS5hbnlPZiAmJiBBcnJheS5pc0FycmF5KHNjaGVtYS5hbnlPZikpIHtcbiAgICByZXR1cm4gc2NoZW1hLmFueU9mXG4gICAgICAubWFwKChzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ganNvblNjaGVtYVRvVHMocywgaW5kZW50KSlcbiAgICAgIC5qb2luKFwiIHwgXCIpO1xuICB9XG4gIGlmIChzY2hlbWEub25lT2YgJiYgQXJyYXkuaXNBcnJheShzY2hlbWEub25lT2YpKSB7XG4gICAgcmV0dXJuIHNjaGVtYS5vbmVPZlxuICAgICAgLm1hcCgoczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IGpzb25TY2hlbWFUb1RzKHMsIGluZGVudCkpXG4gICAgICAuam9pbihcIiB8IFwiKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSBzY2hlbWEudHlwZSBhcyBzdHJpbmc7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgY2FzZSBcImFycmF5XCI6IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gc2NoZW1hLml0ZW1zXG4gICAgICAgID8ganNvblNjaGVtYVRvVHMoc2NoZW1hLml0ZW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBpbmRlbnQpXG4gICAgICAgIDogXCJ1bmtub3duXCI7XG4gICAgICByZXR1cm4gYEFycmF5PCR7aXRlbXN9PmA7XG4gICAgfVxuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHNjaGVtYS5wcm9wZXJ0aWVzIGFzXG4gICAgICAgIHwgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFwcm9wZXJ0aWVzKSB7XG4gICAgICAgIHJldHVybiBcIlJlY29yZDxzdHJpbmcsIHVua25vd24+XCI7XG4gICAgICB9XG4gICAgICBjb25zdCByZXF1aXJlZCA9IG5ldyBTZXQoKHNjaGVtYS5yZXF1aXJlZCBhcyBzdHJpbmdbXSkgfHwgW10pO1xuICAgICAgY29uc3QgcGFkID0gXCIgIFwiLnJlcGVhdChpbmRlbnQgKyAxKTtcbiAgICAgIGNvbnN0IGNsb3NlUGFkID0gXCIgIFwiLnJlcGVhdChpbmRlbnQpO1xuICAgICAgY29uc3QgcHJvcHMgPSBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBvcHQgPSByZXF1aXJlZC5oYXMoa2V5KSA/IFwiXCIgOiBcIj9cIjtcbiAgICAgICAgcmV0dXJuIGAke3BhZH0ke2tleX0ke29wdH06ICR7anNvblNjaGVtYVRvVHModmFsdWUsIGluZGVudCArIDEpfWA7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBge1xcbiR7cHJvcHMuam9pbihcIjtcXG5cIil9O1xcbiR7Y2xvc2VQYWR9fWA7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ29udGV4dFR5cGVTdHJpbmcodG9vbHM6IFRvb2xTZXQpOiBzdHJpbmcge1xuICBjb25zdCBzaWdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW25hbWUsIHRdIG9mIE9iamVjdC5lbnRyaWVzKHRvb2xzKSkge1xuICAgIGNvbnN0IHJhdyA9IHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgaW5wdXRTY2hlbWEgPSBleHRyYWN0SnNvblNjaGVtYShyYXcuaW5wdXRTY2hlbWEgPz8gcmF3LnBhcmFtZXRlcnMpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGV4dHJhY3RKc29uU2NoZW1hKHJhdy5vdXRwdXRTY2hlbWEpO1xuXG4gICAgY29uc3QgaW5wdXRUeXBlID0gaW5wdXRTY2hlbWEgPyBqc29uU2NoZW1hVG9UcyhpbnB1dFNjaGVtYSwgMikgOiBcInt9XCI7XG4gICAgY29uc3Qgb3V0cHV0VHlwZSA9IG91dHB1dFNjaGVtYVxuICAgICAgPyBqc29uU2NoZW1hVG9UcyhvdXRwdXRTY2hlbWEsIDIpXG4gICAgICA6IFwidW5rbm93blwiO1xuXG4gICAgc2lncy5wdXNoKGAgICAgJHtuYW1lfShpbnB1dDogJHtpbnB1dFR5cGV9KTogUHJvbWlzZTwke291dHB1dFR5cGV9PmApO1xuICB9XG5cbiAgcmV0dXJuIGB0eXBlIENvbnRleHQgPSB7XFxuICB0b29sczoge1xcbiR7c2lncy5qb2luKFwiO1xcblwiKX07XFxuICB9XFxufWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVJblNhbmRib3goe1xuICBjb2RlLFxuICBycGNEaXIsXG4gIGFib3J0Q29udHJvbGxlcixcbiAgc2FuZGJveCxcbiAgYXZhaWxhYmxlVG9vbHMsXG4gIG9uU3ViVG9vbENhbGwsXG4gIHRvb2xDb250ZXh0LFxufToge1xuICBjb2RlOiBzdHJpbmc7XG4gIHJwY0Rpcjogc3RyaW5nO1xuICBhYm9ydENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBhdmFpbGFibGVUb29sczogVG9vbFNldDtcbiAgb25TdWJUb29sQ2FsbD86IE9uU3ViVG9vbENhbGw7XG4gIHRvb2xDb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59KTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCBta2RpclJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgY29tbWFuZDogXCJta2RpclwiLFxuICAgIGFyZ3M6IFtcIi1wXCIsIHJwY0Rpcl0sXG4gIH0pO1xuICBpZiAobWtkaXJSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogbWtkaXJSZXN1bHQubWVzc2FnZSB9O1xuICB9XG4gIGF3YWl0IG1rZGlyUmVzdWx0LnJlc3VsdDtcblxuICBhd2FpdCBzYW5kYm94LndyaXRlRmlsZXMoe1xuICAgIGZpbGVzOiBbXG4gICAgICB7IHBhdGg6IFwicnVubmVyLm1qc1wiLCBjb250ZW50OiBSVU5ORVJfU0NSSVBUIH0sXG4gICAgICB7IHBhdGg6IFwiY29kZS5qc1wiLCBjb250ZW50OiBjb2RlIH0sXG4gICAgICB7XG4gICAgICAgIHBhdGg6IFwidG9vbHMuanNvblwiLFxuICAgICAgICBjb250ZW50OiBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhhdmFpbGFibGVUb29scykpLFxuICAgICAgfSxcbiAgICBdLFxuICAgIGRlc3RQYXRoOiBycGNEaXIsXG4gIH0pO1xuXG4gIGNvbnN0IG5vZGVNYWpvciA9IE51bWJlci5wYXJzZUludChwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoXCIuXCIpWzBdLCAxMCk7XG4gIGNvbnN0IHBlcm1pc3Npb25GbGFnID1cbiAgICBub2RlTWFqb3IgPj0gMjIgPyBcIi0tcGVybWlzc2lvblwiIDogXCItLWV4cGVyaW1lbnRhbC1wZXJtaXNzaW9uXCI7XG5cbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgY29tbWFuZDogXCJub2RlXCIsXG4gICAgYXJnczogW1xuICAgICAgcGVybWlzc2lvbkZsYWcsXG4gICAgICBgLS1hbGxvdy1mcy1yZWFkPSR7cnBjRGlyfWAsXG4gICAgICBgLS1hbGxvdy1mcy13cml0ZT0ke3JwY0Rpcn1gLFxuICAgICAgYCR7cnBjRGlyfS9ydW5uZXIubWpzYCxcbiAgICBdLFxuICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgfSk7XG5cbiAgaWYgKGV4ZWNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogZXhlY1Jlc3VsdC5tZXNzYWdlIH07XG4gIH1cblxuICBjb25zdCBmYXRhbDogeyBlcnJvcjogRXJyb3IgfCBudWxsIH0gPSB7IGVycm9yOiBudWxsIH07XG5cbiAgY29uc3QgYWJvcnQgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgaWYgKCFmYXRhbC5lcnJvcikge1xuICAgICAgZmF0YWwuZXJyb3IgPSBlcnJvcjtcbiAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVUb29sUmVxdWVzdCA9IGFzeW5jIChyZXF1ZXN0SnNvbjogc3RyaW5nKSA9PiB7XG4gICAgbGV0IHBhcnNlZDogeyBpZDogc3RyaW5nOyB0b29sOiBzdHJpbmc7IGlucHV0OiB1bmtub3duIH07XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmVxdWVzdEpzb24pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaWQsIHRvb2w6IHRvb2xOYW1lLCBpbnB1dCB9ID0gcGFyc2VkO1xuXG4gICAgbGV0IHJlc3BvbnNlOiB7IHJlc3VsdD86IHVua25vd247IGVycm9yPzogc3RyaW5nIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHQgPSBhdmFpbGFibGVUb29sc1t0b29sTmFtZV07XG4gICAgICBpZiAoIXQ/LmV4ZWN1dGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUb29sICR7dG9vbE5hbWV9IG5vdCBmb3VuZCBvciBoYXMgbm8gZXhlY3V0ZSBmdW5jdGlvbmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4ZWMgPSB0LmV4ZWN1dGUuYmluZCh0KTtcbiAgICAgIGNvbnN0IGV4ZWNPcHRpb25zID0ge1xuICAgICAgICB0b29sQ2FsbElkOiBganNfJHt0b29sTmFtZX1fJHtEYXRlLm5vdygpfWAsXG4gICAgICAgIG1lc3NhZ2VzOiBbXSxcbiAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHRvb2xDb250ZXh0LFxuICAgICAgfTtcbiAgICAgIGlmIChvblN1YlRvb2xDYWxsKSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgb25TdWJUb29sQ2FsbCh0b29sTmFtZSwgaW5wdXQsICgpID0+XG4gICAgICAgICAgZXhlYyhpbnB1dCwgZXhlY09wdGlvbnMpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjKGlucHV0LCBleGVjT3B0aW9ucyk7XG4gICAgICAgIHJlc3BvbnNlID0geyByZXN1bHQgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgIHJlc3BvbnNlID0geyBlcnJvcjogbXNnIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgICAgIGZpbGVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGF0aDogYCR7aWR9LnJlc3BvbnNlLmpzb25gLFxuICAgICAgICAgICAgY29udGVudDogSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGRlc3RQYXRoOiBycGNEaXIsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8qKlxuICAgICAgICogSWYgd3JpdGluZyB0aGUgcmVzcG9uc2UgZmlsZSBmYWlscywgdGhlIHJ1bm5lciB3aWxsIHBvbGwgZm9yZXZlclxuICAgICAgICogd2FpdGluZyBmb3IgaXQuIEFib3J0IHRoZSBydW5uZXIgcHJvY2VzcyBzbyB3ZSBkb24ndCBkZWFkbG9jay5cbiAgICAgICAqL1xuICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgYWJvcnQobmV3IEVycm9yKGBGYWlsZWQgdG8gd3JpdGUgUlBDIHJlc3BvbnNlIGZvciAke3Rvb2xOYW1lfTogJHttc2d9YCkpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB0b29sQ2FsbFByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgbGV0IHN0ZGVyckJ1ZmZlciA9IFwiXCI7XG4gIGxldCBub25NYXJrZXJTdGRlcnIgPSBcIlwiO1xuXG4gIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBhYm9ydChcbiAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgYEphdmFTY3JpcHQgZXhlY3V0aW9uIHRpbWVkIG91dCBhZnRlciAke0VYRUNVVElPTl9USU1FT1VUX01TIC8gMTAwMH1zYFxuICAgICAgKVxuICAgICk7XG4gIH0sIEVYRUNVVElPTl9USU1FT1VUX01TKTtcblxuICB0cnkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgZW50cnkgb2YgZXhlY1Jlc3VsdC5sb2dzKCkpIHtcbiAgICAgIGlmIChmYXRhbC5lcnJvcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGVudHJ5LnN0cmVhbSA9PT0gXCJzdGRlcnJcIikge1xuICAgICAgICBzdGRlcnJCdWZmZXIgKz0gZW50cnkuZGF0YTtcblxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gc3RkZXJyQnVmZmVyLmluZGV4T2YoUkVRVUVTVF9NQVJLRVJfU1RBUlQpO1xuICAgICAgICAgIGlmIChzdGFydElkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZU1hcmtlciA9IHN0ZGVyckJ1ZmZlci5zbGljZSgwLCBzdGFydElkeCk7XG4gICAgICAgICAgaWYgKGJlZm9yZU1hcmtlci50cmltKCkpIHtcbiAgICAgICAgICAgIG5vbk1hcmtlclN0ZGVyciArPSBiZWZvcmVNYXJrZXI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY29udGVudFN0YXJ0ID0gc3RhcnRJZHggKyBSRVFVRVNUX01BUktFUl9TVEFSVC5sZW5ndGg7XG4gICAgICAgICAgY29uc3QgZW5kSWR4ID0gc3RkZXJyQnVmZmVyLmluZGV4T2YoUkVRVUVTVF9NQVJLRVJfRU5ELCBjb250ZW50U3RhcnQpO1xuICAgICAgICAgIGlmIChlbmRJZHggPT09IC0xKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZXF1ZXN0SnNvbiA9IHN0ZGVyckJ1ZmZlci5zbGljZShjb250ZW50U3RhcnQsIGVuZElkeCk7XG4gICAgICAgICAgc3RkZXJyQnVmZmVyID0gc3RkZXJyQnVmZmVyLnNsaWNlKGVuZElkeCArIFJFUVVFU1RfTUFSS0VSX0VORC5sZW5ndGgpO1xuXG4gICAgICAgICAgdG9vbENhbGxQcm9taXNlcy5wdXNoKGhhbmRsZVRvb2xSZXF1ZXN0KHJlcXVlc3RKc29uKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB9XG5cbiAgaWYgKHN0ZGVyckJ1ZmZlci50cmltKCkpIHtcbiAgICBub25NYXJrZXJTdGRlcnIgKz0gc3RkZXJyQnVmZmVyO1xuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHRvb2xDYWxsUHJvbWlzZXMpO1xuXG4gIGlmIChmYXRhbC5lcnJvcikge1xuICAgIGV4ZWNSZXN1bHQucmVzdWx0LmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgZXJyb3I6IGZhdGFsLmVycm9yLm1lc3NhZ2UsXG4gICAgICAuLi4obm9uTWFya2VyU3RkZXJyID8geyBzdGRlcnI6IG5vbk1hcmtlclN0ZGVyci5zbGljZSgwLCAyMDAwKSB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyLCBleGl0Q29kZSB9ID0gYXdhaXQgZXhlY1Jlc3VsdC5yZXN1bHQ7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBlcnJvcjogYFJ1bm5lciBmYWlsZWQgKGV4aXQgJHtleGl0Q29kZX0pLmAsXG4gICAgICBzdGRlcnI6IChub25NYXJrZXJTdGRlcnIgKyBzdGRlcnIpLnNsaWNlKDAsIDIwMDApLFxuICAgICAgc3Rkb3V0OiBzdGRvdXQuc2xpY2UoMCwgMTAwMCksXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSmF2YVNjcmlwdFRvb2wob3B0czoge1xuICB0b29sczogVG9vbFNldDtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBhY3RpdmVUb29scz86IHN0cmluZ1tdO1xuICBvblN1YlRvb2xDYWxsPzogT25TdWJUb29sQ2FsbDtcbiAgdG9vbENvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn0pIHtcbiAgY29uc3QgeyBzYW5kYm94LCBvblN1YlRvb2xDYWxsIH0gPSBvcHRzO1xuICBjb25zdCBhY3RpdmVTZXQgPSBvcHRzLmFjdGl2ZVRvb2xzID8gbmV3IFNldChvcHRzLmFjdGl2ZVRvb2xzKSA6IG51bGw7XG4gIGNvbnN0IGF2YWlsYWJsZVRvb2xzOiBUb29sU2V0ID0ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHRdIG9mIE9iamVjdC5lbnRyaWVzKG9wdHMudG9vbHMpKSB7XG4gICAgaWYgKCFhY3RpdmVTZXQgfHwgYWN0aXZlU2V0LmhhcyhuYW1lKSkge1xuICAgICAgYXZhaWxhYmxlVG9vbHNbbmFtZV0gPSB0O1xuICAgIH1cbiAgfVxuICBjb25zdCBjb250ZXh0VHlwZSA9IGdlbmVyYXRlQ29udGV4dFR5cGVTdHJpbmcoYXZhaWxhYmxlVG9vbHMpO1xuXG4gIHJldHVybiB0b29sKHtcbiAgICAuLi5idWlsdEluVG9vbHMuSmF2YVNjcmlwdCxcbiAgICBkZXNjcmlwdGlvbjogYEV4ZWN1dGUgSmF2YVNjcmlwdCB0byBvcmNoZXN0cmF0ZSBtdWx0aXBsZSB0b29sIGNhbGxzIGluIGEgc2luZ2xlIHN0ZXAuIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgdG8gcnVuIHNldmVyYWwgdG9vbHMgaW4gc2VxdWVuY2UsIHRyYW5zZm9ybSBpbnRlcm1lZGlhdGUgcmVzdWx0cywgb3IgcGFyYWxsZWxpemUgaW5kZXBlbmRlbnQgb3BlcmF0aW9ucyB3aXRoIFByb21pc2UuYWxsLlxuXG5UaGUgY29kZSBydW5zIGFzIGFuIGFzeW5jIGZ1bmN0aW9uIGJvZHkgd2l0aCBcXGBjdHhcXGAgaW4gc2NvcGU6XG5cblxcYFxcYFxcYHR5cGVzY3JpcHRcbiR7Y29udGV4dFR5cGV9XG5cXGBcXGBcXGBcblxuRXhhbXBsZXM6XG4tIFNlcXVlbnRpYWw6IFxcYGNvbnN0IGZpbGUgPSBhd2FpdCBjdHgudG9vbHMuUmVhZCh7IHBhdGg6IFwicGFja2FnZS5qc29uXCIgfSk7IHJldHVybiBKU09OLnBhcnNlKGZpbGUuY29udGVudCk7XFxgXG4tIFBhcmFsbGVsOiBcXGBjb25zdCBbYSwgYl0gPSBhd2FpdCBQcm9taXNlLmFsbChbY3R4LnRvb2xzLlJlYWQoeyBwYXRoOiBcImEudHNcIiB9KSwgY3R4LnRvb2xzLlJlYWQoeyBwYXRoOiBcImIudHNcIiB9KV0pOyByZXR1cm4geyBhOiBhLmNvbnRlbnQsIGI6IGIuY29udGVudCB9O1xcYFxuLSBUcmFuc2Zvcm06IFxcYGNvbnN0IGdyZXAgPSBhd2FpdCBjdHgudG9vbHMuR3JlcCh7IHBhdHRlcm46IFwiVE9ET1wiIH0pOyByZXR1cm4gZ3JlcC5tYXRjaGVzLnNwbGl0KFwiXFxcXG5cIikubGVuZ3RoO1xcYFxuLSBCYXNoOiBcXGBjb25zdCByID0gYXdhaXQgY3R4LnRvb2xzLkJhc2goeyBjb21tYW5kOiBcIm5vZGUgLWUgXFxcXFwiY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe3Y6MX0pKVxcXFxcIlwiIH0pOyByZXR1cm4gSlNPTi5wYXJzZShyLnN0ZG91dCk7XFxgXG5cblJldHVybiBhIHZhbHVlIHRvIHBhc3MgcmVzdWx0cyBiYWNrLiBVc2UgY29uc29sZS5sb2coKSBmb3IgZGVidWcgb3V0cHV0LlxuSW1wb3J0YW50OiBFYWNoIHRvb2wgcmV0dXJucyBhIHN0cnVjdHVyZWQgb2JqZWN0IG1hdGNoaW5nIGl0cyBvdXRwdXQgc2NoZW1hIFx1MjAxNCBub3QgYSByYXcgc3RyaW5nLiBBY2Nlc3MgdGhlIHNwZWNpZmljIGZpZWxkIHlvdSBuZWVkIChlLmcuIEJhc2gncyByZXN1bHQuc3Rkb3V0LCBSZWFkJ3MgcmVzdWx0LmNvbnRlbnQpIHJhdGhlciB0aGFuIHRyeWluZyB0byBwYXJzZSB0aGUgZW50aXJlIHJlc3VsdC5gLFxuICAgIGV4ZWN1dGU6ICh7IGNvZGUgfSkgPT4ge1xuICAgICAgY29uc3QgcnVuSWQgPSBgcnVuXyR7RGF0ZS5ub3coKX1fJHtNYXRoLnJhbmRvbSgpXG4gICAgICAgIC50b1N0cmluZygzNilcbiAgICAgICAgLnNsaWNlKDIsIDgpfWA7XG4gICAgICBjb25zdCBycGNEaXIgPSBgLmFnZW50L2pzLXJwYy8ke3J1bklkfWA7XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICAgIHJldHVybiBleGVjdXRlSW5TYW5kYm94KHtcbiAgICAgICAgY29kZSxcbiAgICAgICAgcnBjRGlyLFxuICAgICAgICBhYm9ydENvbnRyb2xsZXIsXG4gICAgICAgIHNhbmRib3gsXG4gICAgICAgIGF2YWlsYWJsZVRvb2xzLFxuICAgICAgICBvblN1YlRvb2xDYWxsLFxuICAgICAgICB0b29sQ29udGV4dDogb3B0cy50b29sQ29udGV4dCxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufVxuIiwgImltcG9ydCB0eXBlIHsgVG9vbCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHR5cGUgeyBBbnlBZ2VudCB9IGZyb20gXCIuLi9hZ2VudC9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgQnVpbHRJblRvb2xOYW1lIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuLyoqIEJ1aWx0LWluIGRlZmF1bHRzIGZvciBuZWVkc0FwcHJvdmFsICh1c2VyIGNhbiBvdmVycmlkZSB2aWEgYWdlbnQgY29uZmlnKS4gKi9cbmNvbnN0IGJ1aWx0aW5OZWVkc0FwcHJvdmFsOiBQYXJ0aWFsPFJlY29yZDxCdWlsdEluVG9vbE5hbWUsIGJvb2xlYW4+PiA9IHt9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tOZWVkc0FwcHJvdmFsKHtcbiAgYWdlbnQsXG4gIHRvb2xOYW1lLFxuICBpbnB1dCxcbiAgdG9vbENhbGxJZCxcbiAgbWVzc2FnZXMsXG59OiB7XG4gIGFnZW50OiBBbnlBZ2VudDtcbiAgdG9vbE5hbWU6IHN0cmluZztcbiAgaW5wdXQ6IHVua25vd247XG4gIHRvb2xDYWxsSWQ6IHN0cmluZztcbiAgbWVzc2FnZXM6IHVua25vd25bXTtcbn0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gMS4gUGVyLXRvb2wgbmVlZHNBcHByb3ZhbCBvbiB0aGUgVG9vbCBkZWZpbml0aW9uIHRha2VzIHByaW9yaXR5XG4gIGNvbnN0IHRvb2xEZWYgPSBhZ2VudC5vcHRpb25zLnRvb2xzPy5bdG9vbE5hbWVdIGFzIFRvb2wgfCB1bmRlZmluZWQ7XG4gIGlmICh0b29sRGVmPy5uZWVkc0FwcHJvdmFsICE9IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIHRvb2xEZWYubmVlZHNBcHByb3ZhbCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiB0b29sRGVmLm5lZWRzQXBwcm92YWw7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0b29sRGVmLm5lZWRzQXBwcm92YWwoaW5wdXQsIHtcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgICBtZXNzYWdlczogbWVzc2FnZXMgYXMgbmV2ZXJbXSxcbiAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH1cblxuICAvLyAyLiBBZ2VudC1sZXZlbCBuZWVkc0FwcHJvdmFsIG1hcFxuICBjb25zdCBhZ2VudEVudHJ5ID0gKFxuICAgIGFnZW50Lm9wdGlvbnMubmVlZHNBcHByb3ZhbCBhc1xuICAgICAgfCBSZWNvcmQ8XG4gICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgIGJvb2xlYW4gfCAoKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pXG4gICAgICAgID5cbiAgICAgIHwgdW5kZWZpbmVkXG4gICk/Llt0b29sTmFtZV07XG5cbiAgaWYgKGFnZW50RW50cnkgIT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgYWdlbnRFbnRyeSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBhZ2VudEVudHJ5O1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgYWdlbnRFbnRyeShpbnB1dCwge1xuICAgICAgdG9vbENhbGxJZCxcbiAgICAgIG1lc3NhZ2VzLFxuICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIDMuIEJ1aWx0LWluIGRlZmF1bHRzXG4gIHJldHVybiBidWlsdGluTmVlZHNBcHByb3ZhbFt0b29sTmFtZSBhcyBCdWlsdEluVG9vbE5hbWVdID8/IGZhbHNlO1xufVxuIiwgImltcG9ydCB0eXBlIHsgSlNPTlZhbHVlLCBNb2RlbE1lc3NhZ2UgfSBmcm9tIFwiYWlcIjtcblxudHlwZSBQcm92aWRlck9wdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBKU09OVmFsdWU+PjtcblxuY29uc3QgQU5USFJPUElDX01BWF9DQUNIRV9CUkVBS1BPSU5UU19QRVJfUkVRVUVTVCA9IDQ7XG5cbmNvbnN0IENMQVVERV9MSUtFX01PREVMX01BVENIRVJTID0gW1wiY2xhdWRlXCIsIFwiYW50aHJvcGljXCJdO1xuXG5jb25zdCBDTEFVREVfUFJPTVBUX0NBQ0hJTkdfUFJPVklERVJfT1BUSU9OUzogUHJvdmlkZXJPcHRpb25zID0ge1xuICBhbnRocm9waWM6IHtcbiAgICBjYWNoZUNvbnRyb2w6IHsgdHlwZTogXCJlcGhlbWVyYWxcIiB9LFxuICB9LFxuICBvcGVucm91dGVyOiB7XG4gICAgY2FjaGVDb250cm9sOiB7IHR5cGU6IFwiZXBoZW1lcmFsXCIgfSxcbiAgfSxcbiAgYmVkcm9jazoge1xuICAgIGNhY2hlUG9pbnQ6IHsgdHlwZTogXCJkZWZhdWx0XCIgfSxcbiAgfSxcbiAgb3BlbmFpQ29tcGF0aWJsZToge1xuICAgIGNhY2hlX2NvbnRyb2w6IHsgdHlwZTogXCJlcGhlbWVyYWxcIiB9LFxuICB9LFxuICBjb3BpbG90OiB7XG4gICAgY29waWxvdF9jYWNoZV9jb250cm9sOiB7IHR5cGU6IFwiZXBoZW1lcmFsXCIgfSxcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEdhdGV3YXlQcm92aWRlcihtb2RlbDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHNsYXNoSW5kZXggPSBtb2RlbC5pbmRleE9mKFwiL1wiKTtcbiAgaWYgKHNsYXNoSW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIG1vZGVsLnNsaWNlKDAsIHNsYXNoSW5kZXgpO1xufVxuXG5mdW5jdGlvbiBjb3VudEFudGhyb3BpY0NhY2hlQnJlYWtwb2ludHMobWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdKTogbnVtYmVyIHtcbiAgbGV0IGNvdW50ID0gMDtcbiAgZm9yIChjb25zdCBtZXNzYWdlIG9mIG1lc3NhZ2VzKSB7XG4gICAgY29uc3QgcHJvdmlkZXJPcHRpb25zID0gKG1lc3NhZ2UgYXMgeyBwcm92aWRlck9wdGlvbnM/OiBQcm92aWRlck9wdGlvbnMgfSlcbiAgICAgIC5wcm92aWRlck9wdGlvbnM7XG4gICAgaWYgKHByb3ZpZGVyT3B0aW9ucz8uYW50aHJvcGljPy5jYWNoZUNvbnRyb2wpIHtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkpIHtcbiAgICAgIGZvciAoY29uc3QgcGFydCBvZiBtZXNzYWdlLmNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgcGFydFByb3ZpZGVyT3B0aW9ucyA9IChcbiAgICAgICAgICBwYXJ0IGFzIHsgcHJvdmlkZXJPcHRpb25zPzogUHJvdmlkZXJPcHRpb25zIH1cbiAgICAgICAgKS5wcm92aWRlck9wdGlvbnM7XG4gICAgICAgIGlmIChwYXJ0UHJvdmlkZXJPcHRpb25zPy5hbnRocm9waWM/LmNhY2hlQ29udHJvbCkge1xuICAgICAgICAgIGNvdW50ICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvdW50O1xufVxuXG5mdW5jdGlvbiBpc0NsYXVkZUxpa2VNb2RlbChtb2RlbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxvd2VyID0gbW9kZWwudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIENMQVVERV9MSUtFX01PREVMX01BVENIRVJTLnNvbWUoKG0pID0+IGxvd2VyLmluY2x1ZGVzKG0pKTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQcm92aWRlck9wdGlvbnMob3B0czoge1xuICBjdXJyZW50OiBQcm92aWRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIHBhdGNoOiBQcm92aWRlck9wdGlvbnM7XG59KTogUHJvdmlkZXJPcHRpb25zIHtcbiAgY29uc3QgbmV4dDogUHJvdmlkZXJPcHRpb25zID0geyAuLi4ob3B0cy5jdXJyZW50ID8/IHt9KSB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvcHRzLnBhdGNoKSkge1xuICAgIG5leHRba2V5XSA9IHsgLi4uKG5leHRba2V5XSA/PyB7fSksIC4uLnZhbHVlIH07XG4gIH1cbiAgcmV0dXJuIG5leHQ7XG59XG5cbmZ1bmN0aW9uIGlzQ2FjaGVhYmxlQ2xhdWRlUGFydChwYXJ0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghcGFydCB8fCB0eXBlb2YgcGFydCAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcInR5cGVcIiBpbiBwYXJ0ICYmIChwYXJ0IGFzIHsgdHlwZT86IHVua25vd24gfSkudHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICBjb25zdCB0ZXh0ID0gKHBhcnQgYXMgeyB0ZXh0PzogdW5rbm93biB9KS50ZXh0O1xuICAgIGlmICh0eXBlb2YgdGV4dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRleHQudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgfVxuICB9XG5cbiAgaWYgKFwidHlwZVwiIGluIHBhcnQpIHtcbiAgICBjb25zdCB0eXBlID0gKHBhcnQgYXMgeyB0eXBlPzogdW5rbm93biB9KS50eXBlO1xuICAgIGlmICh0eXBlID09PSBcInRoaW5raW5nXCIgfHwgdHlwZSA9PT0gXCJyZWFzb25pbmdcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBoYXNDYWNoZWFibGVDb250ZW50KG1lc3NhZ2U6IE1vZGVsTWVzc2FnZSk6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIG1lc3NhZ2UuY29udGVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBtZXNzYWdlLmNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDA7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2UuY29udGVudC5zb21lKChwYXJ0KSA9PiBpc0NhY2hlYWJsZUNsYXVkZVBhcnQocGFydCkpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBmaW5kTGFzdENhY2hlYWJsZVBhcnRJbmRleChjb250ZW50OiB1bmtub3duW10pOiBudW1iZXIgfCBudWxsIHtcbiAgZm9yIChsZXQgaSA9IGNvbnRlbnQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICBpZiAoaXNDYWNoZWFibGVDbGF1ZGVQYXJ0KGNvbnRlbnRbaV0pKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdENsYXVkZUNhY2hpbmdUYXJnZXRzKG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXSk6IG51bWJlcltdIHtcbiAgY29uc3Qgc3lzdGVtSW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgZmluYWxJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoICYmIHN5c3RlbUluZGljZXMubGVuZ3RoIDwgMjsgaSArPSAxKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldO1xuICAgIGlmIChtZXNzYWdlLnJvbGUgPT09IFwic3lzdGVtXCIgJiYgaGFzQ2FjaGVhYmxlQ29udGVudChtZXNzYWdlKSkge1xuICAgICAgc3lzdGVtSW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGkgPSBtZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IDAgJiYgZmluYWxJbmRpY2VzLmxlbmd0aCA8IDI7IGkgLT0gMSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTtcbiAgICBpZiAobWVzc2FnZS5yb2xlICE9PSBcInN5c3RlbVwiICYmIGhhc0NhY2hlYWJsZUNvbnRlbnQobWVzc2FnZSkpIHtcbiAgICAgIGZpbmFsSW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuXG4gIGZpbmFsSW5kaWNlcy5yZXZlcnNlKCk7XG5cbiAgcmV0dXJuIFsuLi5zeXN0ZW1JbmRpY2VzLCAuLi5maW5hbEluZGljZXNdO1xufVxuXG5mdW5jdGlvbiBhcHBseUNsYXVkZVByb21wdENhY2hpbmcob3B0czoge1xuICBtZXNzYWdlczogTW9kZWxNZXNzYWdlW107XG4gIHByb3ZpZGVySWQ6IHN0cmluZyB8IG51bGw7XG4gIG1heEJyZWFrcG9pbnRzUGVyUmVxdWVzdDogbnVtYmVyO1xufSk6IE1vZGVsTWVzc2FnZVtdIHtcbiAgY29uc3QgZXhpc3RpbmdCcmVha3BvaW50cyA9IGNvdW50QW50aHJvcGljQ2FjaGVCcmVha3BvaW50cyhvcHRzLm1lc3NhZ2VzKTtcbiAgY29uc3QgcmVtYWluaW5nQnVkZ2V0ID0gTWF0aC5tYXgoXG4gICAgMCxcbiAgICBvcHRzLm1heEJyZWFrcG9pbnRzUGVyUmVxdWVzdCAtIGV4aXN0aW5nQnJlYWtwb2ludHNcbiAgKTtcblxuICBpZiAocmVtYWluaW5nQnVkZ2V0ID09PSAwKSB7XG4gICAgcmV0dXJuIG9wdHMubWVzc2FnZXM7XG4gIH1cblxuICBjb25zdCB0YXJnZXRJbmRpY2VzID0gc2VsZWN0Q2xhdWRlQ2FjaGluZ1RhcmdldHMob3B0cy5tZXNzYWdlcykuc2xpY2UoXG4gICAgMCxcbiAgICByZW1haW5pbmdCdWRnZXRcbiAgKTtcbiAgaWYgKHRhcmdldEluZGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9wdHMubWVzc2FnZXM7XG4gIH1cblxuICBjb25zdCB1c2VNZXNzYWdlTGV2ZWxPcHRpb25zID1cbiAgICBvcHRzLnByb3ZpZGVySWQgPT09IFwiYW50aHJvcGljXCIgfHxcbiAgICBCb29sZWFuKG9wdHMucHJvdmlkZXJJZD8uaW5jbHVkZXMoXCJiZWRyb2NrXCIpKTtcblxuICBjb25zdCBuZXh0TWVzc2FnZXMgPSBvcHRzLm1lc3NhZ2VzLnNsaWNlKCk7XG5cbiAgZm9yIChjb25zdCBtZXNzYWdlSW5kZXggb2YgdGFyZ2V0SW5kaWNlcykge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXh0TWVzc2FnZXNbbWVzc2FnZUluZGV4XTtcblxuICAgIGNvbnN0IHNob3VsZFVzZUNvbnRlbnRPcHRpb25zID1cbiAgICAgICF1c2VNZXNzYWdlTGV2ZWxPcHRpb25zICYmXG4gICAgICBBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkgJiZcbiAgICAgIG1lc3NhZ2UuY29udGVudC5sZW5ndGggPiAwO1xuXG4gICAgaWYgKHNob3VsZFVzZUNvbnRlbnRPcHRpb25zICYmIEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSkge1xuICAgICAgY29uc3QgcGFydEluZGV4ID0gZmluZExhc3RDYWNoZWFibGVQYXJ0SW5kZXgobWVzc2FnZS5jb250ZW50KTtcbiAgICAgIGlmIChwYXJ0SW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcGFydCA9IG1lc3NhZ2UuY29udGVudFtwYXJ0SW5kZXhdO1xuICAgICAgICBpZiAocGFydCAmJiB0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGNvbnN0IHBhcnRQcm92aWRlck9wdGlvbnMgPSAoXG4gICAgICAgICAgICBwYXJ0IGFzIHsgcHJvdmlkZXJPcHRpb25zPzogUHJvdmlkZXJPcHRpb25zIH1cbiAgICAgICAgICApLnByb3ZpZGVyT3B0aW9ucztcblxuICAgICAgICAgIGNvbnN0IG5leHRDb250ZW50ID0gbWVzc2FnZS5jb250ZW50LnNsaWNlKCk7XG4gICAgICAgICAgbmV4dENvbnRlbnRbcGFydEluZGV4XSA9IHtcbiAgICAgICAgICAgIC4uLihwYXJ0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSxcbiAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9uczogbWVyZ2VQcm92aWRlck9wdGlvbnMoe1xuICAgICAgICAgICAgICBjdXJyZW50OiBwYXJ0UHJvdmlkZXJPcHRpb25zLFxuICAgICAgICAgICAgICBwYXRjaDogQ0xBVURFX1BST01QVF9DQUNISU5HX1BST1ZJREVSX09QVElPTlMsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9IGFzICh0eXBlb2YgbWVzc2FnZS5jb250ZW50KVtudW1iZXJdO1xuXG4gICAgICAgICAgbmV4dE1lc3NhZ2VzW21lc3NhZ2VJbmRleF0gPSB7XG4gICAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgICAgY29udGVudDogbmV4dENvbnRlbnQsXG4gICAgICAgICAgfSBhcyBNb2RlbE1lc3NhZ2U7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlUHJvdmlkZXJPcHRpb25zID0gKFxuICAgICAgbWVzc2FnZSBhcyB7IHByb3ZpZGVyT3B0aW9ucz86IFByb3ZpZGVyT3B0aW9ucyB9XG4gICAgKS5wcm92aWRlck9wdGlvbnM7XG5cbiAgICBuZXh0TWVzc2FnZXNbbWVzc2FnZUluZGV4XSA9IHtcbiAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICBwcm92aWRlck9wdGlvbnM6IG1lcmdlUHJvdmlkZXJPcHRpb25zKHtcbiAgICAgICAgY3VycmVudDogbWVzc2FnZVByb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgcGF0Y2g6IENMQVVERV9QUk9NUFRfQ0FDSElOR19QUk9WSURFUl9PUFRJT05TLFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBuZXh0TWVzc2FnZXM7XG59XG5cbmV4cG9ydCB0eXBlIFByb21wdENhY2hpbmdSZXN1bHQgPSB7XG4gIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXTtcbiAgcHJvdmlkZXJPcHRpb25zOiBQcm92aWRlck9wdGlvbnM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQcm9tcHRDYWNoaW5nVG9Nb2RlbFJlcXVlc3Qob3B0czoge1xuICBtb2RlbDogc3RyaW5nO1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgbWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdO1xuICBhbnRocm9waWM/OiB7IG1heEJyZWFrcG9pbnRzUGVyUmVxdWVzdD86IG51bWJlciB9O1xuICBvcGVuYWk/OiB7IHNldFByb21wdENhY2hlS2V5PzogYm9vbGVhbiB9O1xufSk6IFByb21wdENhY2hpbmdSZXN1bHQge1xuICBjb25zdCBwcm92aWRlciA9IGdldEdhdGV3YXlQcm92aWRlcihvcHRzLm1vZGVsKTtcblxuICBjb25zdCBwcm92aWRlck9wdGlvbnM6IFByb3ZpZGVyT3B0aW9ucyA9IHt9O1xuXG4gIGlmIChcbiAgICAocHJvdmlkZXIgPT09IFwib3BlbmFpXCIgfHwgcHJvdmlkZXIgPT09IFwiYXp1cmVcIikgJiZcbiAgICBvcHRzLm9wZW5haT8uc2V0UHJvbXB0Q2FjaGVLZXkgIT09IGZhbHNlXG4gICkge1xuICAgIHByb3ZpZGVyT3B0aW9ucy5vcGVuYWkgPSB7IHByb21wdENhY2hlS2V5OiBvcHRzLnNlc3Npb25JZCB9O1xuICB9XG5cbiAgY29uc3QgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0ID1cbiAgICBvcHRzLmFudGhyb3BpYz8ubWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0ID8/XG4gICAgQU5USFJPUElDX01BWF9DQUNIRV9CUkVBS1BPSU5UU19QRVJfUkVRVUVTVDtcblxuICBjb25zdCBjYWNoZWRNZXNzYWdlcyA9IGlzQ2xhdWRlTGlrZU1vZGVsKG9wdHMubW9kZWwpXG4gICAgPyBhcHBseUNsYXVkZVByb21wdENhY2hpbmcoe1xuICAgICAgICBtZXNzYWdlczogb3B0cy5tZXNzYWdlcyxcbiAgICAgICAgcHJvdmlkZXJJZDogcHJvdmlkZXIsXG4gICAgICAgIG1heEJyZWFrcG9pbnRzUGVyUmVxdWVzdCxcbiAgICAgIH0pXG4gICAgOiBvcHRzLm1lc3NhZ2VzO1xuXG4gIHJldHVybiB7XG4gICAgbWVzc2FnZXM6IGNhY2hlZE1lc3NhZ2VzLFxuICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFVJTWVzc2FnZUNodW5rIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgKiBhcyBlcnJvcmUgZnJvbSBcImVycm9yZVwiO1xuaW1wb3J0IHsgU2Vzc2lvbk5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7IFNlc3Npb25Db250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyBnZXRBY3RpdmVSdW5zLCByZXBsYXlBY3RpdmVSdW4gfSBmcm9tIFwiLi9zZW5kXCI7XG5cbmV4cG9ydCB0eXBlIFN0cmVhbU9wdGlvbnMgPSB7XG4gIG1lc3NhZ2VJZD86IHN0cmluZztcbiAgc3RhcnRJbmRleD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93UnVuTGlrZSA9IHtcbiAgZ2V0UmVhZGFibGUob3B0aW9ucz86IHsgc3RhcnRJbmRleD86IG51bWJlciB9KTogUmVhZGFibGVTdHJlYW07XG59O1xuXG5mdW5jdGlvbiBpc1dvcmtmbG93UnVuKGFyZzogdW5rbm93bik6IGFyZyBpcyBXb3JrZmxvd1J1bkxpa2Uge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBhcmcgPT09IFwib2JqZWN0XCIgJiZcbiAgICBhcmcgIT09IG51bGwgJiZcbiAgICBcImdldFJlYWRhYmxlXCIgaW4gYXJnICYmXG4gICAgdHlwZW9mIChhcmcgYXMgV29ya2Zsb3dSdW5MaWtlKS5nZXRSZWFkYWJsZSA9PT0gXCJmdW5jdGlvblwiXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdHJlYW0oXG4gIHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dCxcbiAgcnVuT3JPcHRzPzogV29ya2Zsb3dSdW5MaWtlIHwgU3RyZWFtT3B0aW9uc1xuKTogUHJvbWlzZTxSZWFkYWJsZVN0cmVhbTxVSU1lc3NhZ2VDaHVuaz4+IHtcbiAgaWYgKGlzV29ya2Zsb3dSdW4ocnVuT3JPcHRzKSkge1xuICAgIGNvbnN0IHJlYWRlciA9IHJ1bk9yT3B0cy5nZXRSZWFkYWJsZSgpLmdldFJlYWRlcigpO1xuICAgIC8vIGF3YWl0IGZvciB0aGUgZmlyc3QgY2h1bmsgdG8gYmUgcmVhZHkgYmVmb3JlIGZpbmlzaGluZyB0aGUgd29ya2Zsb3cgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zXG4gICAgYXdhaXQgcmVhZGVyLnJlYWQoKS5jYXRjaCgoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgU3RyZWFtRXJyb3Ioe1xuICAgICAgICBpZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgICByZWFzb246IFwic3RyZWFtKCkgZmFpbGVkIHRvIHJlYWQgZmlyc3QgY2h1bmsgZnJvbSB3b3JrZmxvdyBydW5cIixcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJlYWRlci5jYW5jZWwoKTtcblxuICAgIHJldHVybiBydW5Pck9wdHMuZ2V0UmVhZGFibGUoKTtcbiAgfVxuXG4gIGNvbnN0IG9wdHMgPSBydW5Pck9wdHM7XG4gIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnNlc3Npb24uZ2V0KFxuICAgIHNlc3Npb25Db250ZXh0LnNlc3Npb25JZFxuICApO1xuICBpZiAoIXNlc3Npb24pIHtcbiAgICB0aHJvdyBuZXcgU2Vzc2lvbk5vdEZvdW5kRXJyb3IoeyBpZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkIH0pO1xuICB9XG4gIGNvbnN0IG1lc3NhZ2VJZCA9IG9wdHM/Lm1lc3NhZ2VJZCA/PyBzZXNzaW9uLmxhc3RNZXNzYWdlSWQ7XG4gIGlmICghbWVzc2FnZUlkKSB7XG4gICAgdGhyb3cgbmV3IFN0cmVhbUVycm9yKHtcbiAgICAgIGlkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgICByZWFzb246IFwiTm8gbWVzc2FnZSB0byBzdHJlYW1cIixcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZVJ1bnMgPSBnZXRBY3RpdmVSdW5zKCk7XG4gIGNvbnN0IGFjdGl2ZSA9IGFjdGl2ZVJ1bnMuZ2V0KG1lc3NhZ2VJZCk7XG4gIGlmICghYWN0aXZlKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UubWVzc2FnZS5nZXQobWVzc2FnZUlkKTtcbiAgICBpZiAobWVzc2FnZT8ud29ya2Zsb3dSdW5JZCkge1xuICAgICAgY29uc3QgcmVhZGFibGUgPSBhd2FpdCBpbXBvcnQoXCJ3b3JrZmxvdy9hcGlcIilcbiAgICAgICAgLnRoZW4oKHsgZ2V0UnVuIH0pID0+IGdldFJ1bihtZXNzYWdlLndvcmtmbG93UnVuSWQhKS5nZXRSZWFkYWJsZSgpKVxuICAgICAgICAuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIGlmIChyZWFkYWJsZSkge1xuICAgICAgICByZXR1cm4gcmVhZGFibGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFN0cmVhbUVycm9yKHtcbiAgICAgIGlkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgICByZWFzb246IGBObyBhY3RpdmUgcnVuIGZvciBtZXNzYWdlICR7bWVzc2FnZUlkfWAsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVwbGF5QWN0aXZlUnVuKGFjdGl2ZSwgb3B0cz8uc3RhcnRJbmRleCk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEVycm9yc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5leHBvcnQgY2xhc3MgU3RyZWFtRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlN0cmVhbUVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU3RyZWFtIGZhaWxlZCBmb3Igc2Vzc2lvbiAkaWQ6ICRyZWFzb25cIixcbn0pIHt9XG4iLCAiaW1wb3J0IHR5cGUgeyBTZXNzaW9uIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU2Vzc2lvbkNvbnRleHQgfSBmcm9tIFwiLi9oYW5kbGVcIjtcblxuZXhwb3J0IHR5cGUgVXBkYXRlT3B0aW9ucyA9IFBhcnRpYWw8XG4gIE9taXQ8U2Vzc2lvbiwgXCJpZFwiIHwgXCJjcmVhdGVkQXRcIiB8IFwidXBkYXRlZEF0XCI+XG4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlKFxuICBzZXNzaW9uQ29udGV4dDogU2Vzc2lvbkNvbnRleHQsXG4gIG9wdHM6IFVwZGF0ZU9wdGlvbnNcbikge1xuICBcInVzZSBzdGVwXCI7XG4gIGNvbnN0IHVwZGF0ZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMob3B0cykuZmlsdGVyKChbLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICk7XG5cbiAgaWYgKE9iamVjdC5rZXlzKHVwZGF0ZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2Uuc2Vzc2lvbi51cGRhdGUoc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLCB7XG4gICAgLi4udXBkYXRlcyxcbiAgICB1cGRhdGVkQXQ6IERhdGUubm93KCksXG4gIH0pO1xufVxuIiwgImltcG9ydCB7IGNvbXB1dGVTZXNzaW9uVXNhZ2UsIHR5cGUgU2Vzc2lvblVzYWdlIH0gZnJvbSBcIi4uL3V0aWxzL3VzYWdlXCI7XG5pbXBvcnQgdHlwZSB7IFNlc3Npb25Db250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1c2FnZShcbiAgc2Vzc2lvbkNvbnRleHQ6IFNlc3Npb25Db250ZXh0XG4pOiBQcm9taXNlPFNlc3Npb25Vc2FnZT4ge1xuICBcInVzZSBzdGVwXCI7XG4gIGNvbnN0IG1lc3NhZ2VzID0gYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5tZXNzYWdlLmxpc3RCeVNlc3Npb24oXG4gICAgc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkXG4gICk7XG4gIHJldHVybiBjb21wdXRlU2Vzc2lvblVzYWdlKG1lc3NhZ2VzKTtcbn1cbiIsICJpbXBvcnQgeyBXT1JLRkxPV19ERVNFUklBTElaRSwgV09SS0ZMT1dfU0VSSUFMSVpFIH0gZnJvbSBcIkB3b3JrZmxvdy9zZXJkZVwiO1xuaW1wb3J0IHR5cGUgeyBNZXNzYWdlLCBQYXJ0LCBTYW5kYm94LCBTZXNzaW9uLCBTZXR1cCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTdG9yYWdlSGFuZGxlcnMgKHB1YmxpYywgZmxhdCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VIYW5kbGVycyA9IHtcbiAgXCJzZXNzaW9uLmdldFwiKHA6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTxTZXNzaW9uIHwgbnVsbD47XG4gIFwic2Vzc2lvbi5zZXRcIihwOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBTZXNzaW9uIH0pOiBQcm9taXNlPHZvaWQ+O1xuICBcInNlc3Npb24udXBkYXRlXCIocDoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXBkYXRlczogUGFydGlhbDxTZXNzaW9uPjtcbiAgfSk6IFByb21pc2U8U2Vzc2lvbj47XG5cbiAgXCJtZXNzYWdlLmdldFwiKHA6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTxNZXNzYWdlIHwgbnVsbD47XG4gIFwibWVzc2FnZS5zZXRcIihwOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBNZXNzYWdlIH0pOiBQcm9taXNlPHZvaWQ+O1xuICBcIm1lc3NhZ2UudXBkYXRlXCIocDoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXBkYXRlczogUGFydGlhbDxNZXNzYWdlPjtcbiAgfSk6IFByb21pc2U8TWVzc2FnZT47XG4gIFwibWVzc2FnZS5saXN0QnlTZXNzaW9uXCIocDogeyBzZXNzaW9uSWQ6IHN0cmluZyB9KTogUHJvbWlzZTxNZXNzYWdlW10+O1xuXG4gIFwicGFydC5nZXRcIihwOiB7IGlkOiBzdHJpbmcgfSk6IFByb21pc2U8UGFydCB8IG51bGw+O1xuICBcInBhcnQuc2V0XCIocDogeyBpZDogc3RyaW5nOyB2YWx1ZTogUGFydCB9KTogUHJvbWlzZTx2b2lkPjtcbiAgXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIihwOiB7IHNlc3Npb25JZDogc3RyaW5nIH0pOiBQcm9taXNlPFBhcnRbXT47XG5cbiAgXCJzYW5kYm94LmdldFwiKHA6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTxTYW5kYm94IHwgbnVsbD47XG4gIFwic2FuZGJveC5zZXRcIihwOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBTYW5kYm94IH0pOiBQcm9taXNlPHZvaWQ+O1xuICBcInNhbmRib3gudXBkYXRlXCIocDoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXBkYXRlczogUGFydGlhbDxTYW5kYm94PjtcbiAgfSk6IFByb21pc2U8U2FuZGJveD47XG5cbiAgXCJzZXR1cC5nZXRcIihwOiB7IGlkOiBzdHJpbmcgfSk6IFByb21pc2U8U2V0dXAgfCBudWxsPjtcbiAgXCJzZXR1cC5zZXRcIihwOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBTZXR1cCB9KTogUHJvbWlzZTx2b2lkPjtcbn07XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTdG9yYWdlQ2FsbCAoZGVyaXZlZCBmcm9tIFN0b3JhZ2VIYW5kbGVycykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VDYWxsID0ge1xuICBbSyBpbiBrZXlvZiBTdG9yYWdlSGFuZGxlcnNdOiB7IG1ldGhvZDogSyB9ICYgUGFyYW1ldGVyczxcbiAgICBTdG9yYWdlSGFuZGxlcnNbS11cbiAgPlswXTtcbn1ba2V5b2YgU3RvcmFnZUhhbmRsZXJzXTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFN0b3JhZ2VTdGVwIChzZXJpYWxpemFibGUgYWNyb3NzIHdvcmtmbG93IGJvdW5kYXJ5KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VTdGVwIHtcbiAgZXZlbnQ6IFN0b3JhZ2VDYWxsO1xuXG4gIGNvbnN0cnVjdG9yKGV2ZW50OiBTdG9yYWdlQ2FsbCkge1xuICAgIHRoaXMuZXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHN0YXRpYyBbV09SS0ZMT1dfU0VSSUFMSVpFXShpbnN0YW5jZTogU3RvcmFnZVN0ZXApIHtcbiAgICByZXR1cm4geyBldmVudDogaW5zdGFuY2UuZXZlbnQgfTtcbiAgfVxuXG4gIHN0YXRpYyBbV09SS0ZMT1dfREVTRVJJQUxJWkVdKGRhdGE6IHsgZXZlbnQ6IFN0b3JhZ2VDYWxsIH0pIHtcbiAgICByZXR1cm4gbmV3IFN0b3JhZ2VTdGVwKGRhdGEuZXZlbnQpO1xuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBzYWZlIGRpc3BhdGNoIFx1MjAxNCBldmVudC5tZXRob2Qgc2VsZWN0cyB0aGUgbWF0Y2hpbmcgaGFuZGxlclxuICBvbihoYW5kbGVyczogU3RvcmFnZUhhbmRsZXJzKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IHNlZSBhYm92ZVxuICAgIHJldHVybiAoaGFuZGxlcnNbdGhpcy5ldmVudC5tZXRob2RdIGFzIGFueSkodGhpcy5ldmVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgYWxsIHN0b3JhZ2Ugb3BlcmF0aW9ucy4gSW50ZW5kZWQgdG8gYmVcbiAqIG1hcmtlZCB3aXRoIGBcInVzZSBzdGVwXCJgIHNvIHRoYXQgaXRzIGJvZHkgKGFuZCBOb2RlLmpzLWRlcGVuZGVudFxuICogaW1wb3J0cyBsaWtlIGRhdGFiYXNlIGNsaWVudHMpIGlzIGV4dHJhY3RlZCBieSB0aGUgd29ya2Zsb3cgYnVuZGxlclxuICogYW5kIHJ1bnMgc2VydmVyLXNpZGUuXG4gKlxuICogVGhlIHN0ZXAgcmVjZWl2ZXMgYSBgU3RvcmFnZVN0ZXBgIGluc3RhbmNlIChzZXJpYWxpemFibGUgdmlhXG4gKiBgQHdvcmtmbG93L3NlcmRlYCkgYW5kIHNob3VsZCBjYWxsIGBzdGVwLmhhbmRsZSh7IC4uLiB9KWAgd2l0aCBhXG4gKiBgU3RvcmFnZUhhbmRsZXJzYCBtYXAuXG4gKi9cbi8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogc3RlcCBmdW5jdGlvbiBpcyBhIGRpc3BhdGNoZXI7IHR5cGUgc2FmZXR5IGlzIGF0IHRoZSBoYW5kbGVycyBsZXZlbFxuZXhwb3J0IHR5cGUgU3RvcmFnZVN0ZXBGdW5jdGlvbiA9IChzdG9yZTogU3RvcmFnZVN0ZXApID0+IFByb21pc2U8YW55PjtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFN0b3JhZ2UgKGludGVybmFsLCBuZXN0ZWQpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2Uge1xuICBzZXNzaW9uOiB7XG4gICAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uIHwgbnVsbD47XG4gICAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogU2Vzc2lvbik6IFByb21pc2U8dm9pZD47XG4gICAgdXBkYXRlKGtleTogc3RyaW5nLCB1cGRhdGVzOiBQYXJ0aWFsPFNlc3Npb24+KTogUHJvbWlzZTxTZXNzaW9uPjtcbiAgfTtcbiAgbWVzc2FnZToge1xuICAgIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8TWVzc2FnZSB8IG51bGw+O1xuICAgIHNldChrZXk6IHN0cmluZywgdmFsdWU6IE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVwZGF0ZShrZXk6IHN0cmluZywgdXBkYXRlczogUGFydGlhbDxNZXNzYWdlPik6IFByb21pc2U8TWVzc2FnZT47XG4gICAgbGlzdEJ5U2Vzc2lvbihzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8TWVzc2FnZVtdPjtcbiAgfTtcbiAgcGFydDoge1xuICAgIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8UGFydCB8IG51bGw+O1xuICAgIHNldChrZXk6IHN0cmluZywgdmFsdWU6IFBhcnQpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGxpc3RCeVNlc3Npb24oc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPFBhcnRbXT47XG4gIH07XG4gIHNhbmRib3g6IHtcbiAgICBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPFNhbmRib3ggfCBudWxsPjtcbiAgICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBTYW5kYm94KTogUHJvbWlzZTx2b2lkPjtcbiAgICB1cGRhdGUoa2V5OiBzdHJpbmcsIHVwZGF0ZXM6IFBhcnRpYWw8U2FuZGJveD4pOiBQcm9taXNlPFNhbmRib3g+O1xuICB9O1xuICBzZXR1cDoge1xuICAgIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8U2V0dXAgfCBudWxsPjtcbiAgICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBTZXR1cCk6IFByb21pc2U8dm9pZD47XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VJbnB1dCA9IFN0b3JhZ2VIYW5kbGVycyB8IFN0b3JhZ2VTdGVwRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzU3RlcEZ1bmN0aW9uKGg6IFN0b3JhZ2VJbnB1dCk6IGggaXMgU3RvcmFnZVN0ZXBGdW5jdGlvbiB7XG4gIHJldHVybiB0eXBlb2YgaCA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG5mdW5jdGlvbiBmcm9tU3RlcEZ1bmN0aW9uKGZuOiBTdG9yYWdlU3RlcEZ1bmN0aW9uKTogU3RvcmFnZSB7XG4gIHJldHVybiB7XG4gICAgc2Vzc2lvbjoge1xuICAgICAgZ2V0OiAoaWQpID0+IGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJzZXNzaW9uLmdldFwiLCBpZCB9KSksXG4gICAgICBzZXQ6IChpZCwgdmFsdWUpID0+XG4gICAgICAgIGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJzZXNzaW9uLnNldFwiLCBpZCwgdmFsdWUgfSkpLFxuICAgICAgdXBkYXRlOiAoaWQsIHVwZGF0ZXMpID0+XG4gICAgICAgIGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJzZXNzaW9uLnVwZGF0ZVwiLCBpZCwgdXBkYXRlcyB9KSksXG4gICAgfSxcbiAgICBtZXNzYWdlOiB7XG4gICAgICBnZXQ6IChpZCkgPT4gZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcIm1lc3NhZ2UuZ2V0XCIsIGlkIH0pKSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT5cbiAgICAgICAgZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcIm1lc3NhZ2Uuc2V0XCIsIGlkLCB2YWx1ZSB9KSksXG4gICAgICB1cGRhdGU6IChpZCwgdXBkYXRlcykgPT5cbiAgICAgICAgZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcIm1lc3NhZ2UudXBkYXRlXCIsIGlkLCB1cGRhdGVzIH0pKSxcbiAgICAgIGxpc3RCeVNlc3Npb246IChzZXNzaW9uSWQpID0+XG4gICAgICAgIGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJtZXNzYWdlLmxpc3RCeVNlc3Npb25cIiwgc2Vzc2lvbklkIH0pKSxcbiAgICB9LFxuICAgIHBhcnQ6IHtcbiAgICAgIGdldDogKGlkKSA9PiBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwicGFydC5nZXRcIiwgaWQgfSkpLFxuICAgICAgc2V0OiAoaWQsIHZhbHVlKSA9PlxuICAgICAgICBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwicGFydC5zZXRcIiwgaWQsIHZhbHVlIH0pKSxcbiAgICAgIGxpc3RCeVNlc3Npb246IChzZXNzaW9uSWQpID0+XG4gICAgICAgIGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIiwgc2Vzc2lvbklkIH0pKSxcbiAgICB9LFxuICAgIHNhbmRib3g6IHtcbiAgICAgIGdldDogKGlkKSA9PiBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwic2FuZGJveC5nZXRcIiwgaWQgfSkpLFxuICAgICAgc2V0OiAoaWQsIHZhbHVlKSA9PlxuICAgICAgICBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwic2FuZGJveC5zZXRcIiwgaWQsIHZhbHVlIH0pKSxcbiAgICAgIHVwZGF0ZTogKGlkLCB1cGRhdGVzKSA9PlxuICAgICAgICBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwic2FuZGJveC51cGRhdGVcIiwgaWQsIHVwZGF0ZXMgfSkpLFxuICAgIH0sXG4gICAgc2V0dXA6IHtcbiAgICAgIGdldDogKGlkKSA9PiBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwic2V0dXAuZ2V0XCIsIGlkIH0pKSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT5cbiAgICAgICAgZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcInNldHVwLnNldFwiLCBpZCwgdmFsdWUgfSkpLFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZyb21IYW5kbGVycyhoOiBTdG9yYWdlSGFuZGxlcnMpOiBTdG9yYWdlIHtcbiAgcmV0dXJuIHtcbiAgICBzZXNzaW9uOiB7XG4gICAgICBnZXQ6IChpZCkgPT4gaFtcInNlc3Npb24uZ2V0XCJdKHsgaWQgfSksXG4gICAgICBzZXQ6IChpZCwgdmFsdWUpID0+IGhbXCJzZXNzaW9uLnNldFwiXSh7IGlkLCB2YWx1ZSB9KSxcbiAgICAgIHVwZGF0ZTogKGlkLCB1cGRhdGVzKSA9PiBoW1wic2Vzc2lvbi51cGRhdGVcIl0oeyBpZCwgdXBkYXRlcyB9KSxcbiAgICB9LFxuICAgIG1lc3NhZ2U6IHtcbiAgICAgIGdldDogKGlkKSA9PiBoW1wibWVzc2FnZS5nZXRcIl0oeyBpZCB9KSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT4gaFtcIm1lc3NhZ2Uuc2V0XCJdKHsgaWQsIHZhbHVlIH0pLFxuICAgICAgdXBkYXRlOiAoaWQsIHVwZGF0ZXMpID0+IGhbXCJtZXNzYWdlLnVwZGF0ZVwiXSh7IGlkLCB1cGRhdGVzIH0pLFxuICAgICAgbGlzdEJ5U2Vzc2lvbjogKHNlc3Npb25JZCkgPT4gaFtcIm1lc3NhZ2UubGlzdEJ5U2Vzc2lvblwiXSh7IHNlc3Npb25JZCB9KSxcbiAgICB9LFxuICAgIHBhcnQ6IHtcbiAgICAgIGdldDogKGlkKSA9PiBoW1wicGFydC5nZXRcIl0oeyBpZCB9KSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT4gaFtcInBhcnQuc2V0XCJdKHsgaWQsIHZhbHVlIH0pLFxuICAgICAgbGlzdEJ5U2Vzc2lvbjogKHNlc3Npb25JZCkgPT4gaFtcInBhcnQubGlzdEJ5U2Vzc2lvblwiXSh7IHNlc3Npb25JZCB9KSxcbiAgICB9LFxuICAgIHNhbmRib3g6IHtcbiAgICAgIGdldDogKGlkKSA9PiBoW1wic2FuZGJveC5nZXRcIl0oeyBpZCB9KSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT4gaFtcInNhbmRib3guc2V0XCJdKHsgaWQsIHZhbHVlIH0pLFxuICAgICAgdXBkYXRlOiAoaWQsIHVwZGF0ZXMpID0+IGhbXCJzYW5kYm94LnVwZGF0ZVwiXSh7IGlkLCB1cGRhdGVzIH0pLFxuICAgIH0sXG4gICAgc2V0dXA6IHtcbiAgICAgIGdldDogKGlkKSA9PiBoW1wic2V0dXAuZ2V0XCJdKHsgaWQgfSksXG4gICAgICBzZXQ6IChpZCwgdmFsdWUpID0+IGhbXCJzZXR1cC5zZXRcIl0oeyBpZCwgdmFsdWUgfSksXG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU3RvcmFnZShoOiBTdG9yYWdlSW5wdXQpOiBTdG9yYWdlIHtcbiAgcmV0dXJuIGlzU3RlcEZ1bmN0aW9uKGgpID8gZnJvbVN0ZXBGdW5jdGlvbihoKSA6IGZyb21IYW5kbGVycyhoKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFN0b3JhZ2VIYW5kbGVycyB9IGZyb20gXCIuLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2UsIFBhcnQsIFNhbmRib3gsIFNlc3Npb24sIFNldHVwIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbnR5cGUgS3ZTdG9yZXMgPSBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGluaXRLdlN0b3Jlcz4+O1xuXG5hc3luYyBmdW5jdGlvbiBpbml0S3ZTdG9yZXMocHJlZml4OiBzdHJpbmcpIHtcbiAgY29uc3QgeyBjcmVhdGVLViB9ID0gYXdhaXQgaW1wb3J0KFwiQHZlcmNlbC9rdjJcIik7XG4gIGNvbnN0IGt2ID0gY3JlYXRlS1YoeyBwcmVmaXggfSkuZ2V0U3RvcmUoXCJhZ2VudC9cIik7XG5cbiAgcmV0dXJuIHtcbiAgICBzZXNzaW9uczoga3YuZ2V0U3RvcmU8U2Vzc2lvbj4oXCJzZXNzaW9uL1wiKSxcbiAgICBtZXNzYWdlczoga3YuZ2V0U3RvcmU8TWVzc2FnZT4oXCJtZXNzYWdlL1wiKS53aXRoSW5kZXhlcyh7XG4gICAgICBieVNlc3Npb25JZDogeyBrZXk6IChtOiBNZXNzYWdlKSA9PiBtLnNlc3Npb25JZCB9LFxuICAgIH0pLFxuICAgIHBhcnRzOiBrdi5nZXRTdG9yZTxQYXJ0PihcInBhcnQvXCIpLndpdGhJbmRleGVzKHtcbiAgICAgIGJ5U2Vzc2lvbklkOiB7IGtleTogKHA6IFBhcnQpID0+IHAuc2Vzc2lvbklkIH0sXG4gICAgfSksXG4gICAgc2FuZGJveGVzOiBrdi5nZXRTdG9yZTxTYW5kYm94PihcInNhbmRib3gvXCIpLFxuICAgIHNldHVwczoga3YuZ2V0U3RvcmU8U2V0dXA+KFwic2V0dXAvXCIpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga3ZTdG9yYWdlRmFsbGJhY2sob3B0czogeyBwcmVmaXg6IHN0cmluZyB9KTogU3RvcmFnZUhhbmRsZXJzIHtcbiAgbGV0IHN0b3Jlc1Byb21pc2U6IFByb21pc2U8S3ZTdG9yZXM+IHwgdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIGdldFN0b3JlcygpIHtcbiAgICBpZiAoIXN0b3Jlc1Byb21pc2UpIHtcbiAgICAgIHN0b3Jlc1Byb21pc2UgPSBpbml0S3ZTdG9yZXMob3B0cy5wcmVmaXgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RvcmVzUHJvbWlzZTtcbiAgfVxuXG4gIGNvbnN0IHRhZyA9IGBbYWdlbnQuJHtvcHRzLnByZWZpeH1dW2t2Ml1gO1xuXG4gIHJldHVybiB7XG4gICAgXCJzZXNzaW9uLmdldFwiOiBhc3luYyAoeyBpZCB9KSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb25zIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIHJldHVybiAoYXdhaXQgc2Vzc2lvbnMuZ2V0VmFsdWUoaWQpKSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24uc2V0XCI6IGFzeW5jICh7IGlkLCB2YWx1ZSB9KSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb25zIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIGF3YWl0IHNlc3Npb25zLnNldChpZCwgdmFsdWUpO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24udXBkYXRlXCI6IGFzeW5jICh7IGlkLCB1cGRhdGVzIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgc2Vzc2lvbnMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzZXNzaW9ucy5nZXRWYWx1ZShpZCk7XG4gICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgJHt0YWd9W3Nlc3Npb24udXBkYXRlXSBubyBzZXNzaW9uIGZvdW5kIHdpdGggaWQgXCIke2lkfVwiYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlZCA9IHsgLi4uZXhpc3RpbmcsIC4uLnVwZGF0ZXMgfTtcbiAgICAgIGF3YWl0IHNlc3Npb25zLnNldChpZCwgdXBkYXRlZCk7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9LFxuXG4gICAgXCJtZXNzYWdlLmdldFwiOiBhc3luYyAoeyBpZCB9KSA9PiB7XG4gICAgICBjb25zdCB7IG1lc3NhZ2VzIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIHJldHVybiAoYXdhaXQgbWVzc2FnZXMuZ2V0VmFsdWUoaWQpKSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBcIm1lc3NhZ2Uuc2V0XCI6IGFzeW5jICh7IGlkLCB2YWx1ZSB9KSA9PiB7XG4gICAgICBjb25zdCB7IG1lc3NhZ2VzIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIGF3YWl0IG1lc3NhZ2VzLnNldChpZCwgdmFsdWUpO1xuICAgIH0sXG5cbiAgICBcIm1lc3NhZ2UudXBkYXRlXCI6IGFzeW5jICh7IGlkLCB1cGRhdGVzIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgbWVzc2FnZXMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBtZXNzYWdlcy5nZXRWYWx1ZShpZCk7XG4gICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgJHt0YWd9W21lc3NhZ2UudXBkYXRlXSBubyBtZXNzYWdlIGZvdW5kIHdpdGggaWQgXCIke2lkfVwiYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlZCA9IHsgLi4uZXhpc3RpbmcsIC4uLnVwZGF0ZXMgfTtcbiAgICAgIGF3YWl0IG1lc3NhZ2VzLnNldChpZCwgdXBkYXRlZCk7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9LFxuXG4gICAgXCJtZXNzYWdlLmxpc3RCeVNlc3Npb25cIjogYXN5bmMgKHsgc2Vzc2lvbklkIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgbWVzc2FnZXMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgY29uc3QgcmVzdWx0OiBNZXNzYWdlW10gPSBbXTtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgWywgZW50cnldIG9mIG1lc3NhZ2VzLmVudHJpZXMoe1xuICAgICAgICBieVNlc3Npb25JZDogc2Vzc2lvbklkLFxuICAgICAgfSkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goYXdhaXQgZW50cnkudmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgXCJwYXJ0LmdldFwiOiBhc3luYyAoeyBpZCB9KSA9PiB7XG4gICAgICBjb25zdCB7IHBhcnRzIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIHJldHVybiAoYXdhaXQgcGFydHMuZ2V0VmFsdWUoaWQpKSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBcInBhcnQuc2V0XCI6IGFzeW5jICh7IGlkLCB2YWx1ZSB9KSA9PiB7XG4gICAgICBjb25zdCB7IHBhcnRzIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIGF3YWl0IHBhcnRzLnNldChpZCwgdmFsdWUpO1xuICAgIH0sXG5cbiAgICBcInBhcnQubGlzdEJ5U2Vzc2lvblwiOiBhc3luYyAoeyBzZXNzaW9uSWQgfSkgPT4ge1xuICAgICAgY29uc3QgeyBwYXJ0cyB9ID0gYXdhaXQgZ2V0U3RvcmVzKCk7XG4gICAgICBjb25zdCByZXN1bHQ6IFBhcnRbXSA9IFtdO1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBbLCBlbnRyeV0gb2YgcGFydHMuZW50cmllcyh7XG4gICAgICAgIGJ5U2Vzc2lvbklkOiBzZXNzaW9uSWQsXG4gICAgICB9KSkge1xuICAgICAgICByZXN1bHQucHVzaChhd2FpdCBlbnRyeS52YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBcInNhbmRib3guZ2V0XCI6IGFzeW5jICh7IGlkIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgc2FuZGJveGVzIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIHJldHVybiAoYXdhaXQgc2FuZGJveGVzLmdldFZhbHVlKGlkKSkgPz8gbnVsbDtcbiAgICB9LFxuXG4gICAgXCJzYW5kYm94LnNldFwiOiBhc3luYyAoeyBpZCwgdmFsdWUgfSkgPT4ge1xuICAgICAgY29uc3QgeyBzYW5kYm94ZXMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgYXdhaXQgc2FuZGJveGVzLnNldChpZCwgdmFsdWUpO1xuICAgIH0sXG5cbiAgICBcInNhbmRib3gudXBkYXRlXCI6IGFzeW5jICh7IGlkLCB1cGRhdGVzIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgc2FuZGJveGVzIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc2FuZGJveGVzLmdldFZhbHVlKGlkKTtcbiAgICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke3RhZ31bc2FuZGJveC51cGRhdGVdIG5vIHNhbmRib3ggZm91bmQgd2l0aCBpZCBcIiR7aWR9XCJgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCB1cGRhdGVkID0geyAuLi5leGlzdGluZywgLi4udXBkYXRlcyB9O1xuICAgICAgYXdhaXQgc2FuZGJveGVzLnNldChpZCwgdXBkYXRlZCk7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9LFxuXG4gICAgXCJzZXR1cC5nZXRcIjogYXN5bmMgKHsgaWQgfSkgPT4ge1xuICAgICAgY29uc3QgeyBzZXR1cHMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgcmV0dXJuIChhd2FpdCBzZXR1cHMuZ2V0VmFsdWUoaWQpKSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBcInNldHVwLnNldFwiOiBhc3luYyAoeyBpZCwgdmFsdWUgfSkgPT4ge1xuICAgICAgY29uc3QgeyBzZXR1cHMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgYXdhaXQgc2V0dXBzLnNldChpZCwgdmFsdWUpO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTdG9yYWdlSGFuZGxlcnMgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBNZXNzYWdlLCBQYXJ0LCBTYW5kYm94LCBTZXNzaW9uLCBTZXR1cCB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5sZXQgX2ZzOiB0eXBlb2YgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKSB8IHVuZGVmaW5lZDtcbmxldCBfcGF0aDogdHlwZW9mIGltcG9ydChcIm5vZGU6cGF0aFwiKSB8IHVuZGVmaW5lZDtcblxuYXN5bmMgZnVuY3Rpb24gZnMoKSB7XG4gIGlmICghX2ZzKSB7XG4gICAgX2ZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgfVxuICByZXR1cm4gX2ZzO1xufVxuYXN5bmMgZnVuY3Rpb24gcGF0aCgpIHtcbiAgaWYgKCFfcGF0aCkge1xuICAgIF9wYXRoID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuICB9XG4gIHJldHVybiBfcGF0aDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3RvcmU8VD4oZGlyOiBzdHJpbmcpIHtcbiAgY29uc3QgZmlsZVBhdGggPSBhc3luYyAoa2V5OiBzdHJpbmcpID0+XG4gICAgKGF3YWl0IHBhdGgoKSkuam9pbihkaXIsIGAke2tleX0uanNvbmApO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IChhd2FpdCBmcygpKS5yZWFkRmlsZShhd2FpdCBmaWxlUGF0aChrZXkpLCBcInV0Zi04XCIpO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKSBhcyBUO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgcCA9IGF3YWl0IGZpbGVQYXRoKGtleSk7XG4gICAgICBjb25zdCB7IG1rZGlyLCB3cml0ZUZpbGUgfSA9IGF3YWl0IGZzKCk7XG4gICAgICBjb25zdCB7IGRpcm5hbWUgfSA9IGF3YWl0IHBhdGgoKTtcbiAgICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUocCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKHAsIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKSk7XG4gICAgfSxcbiAgICBhc3luYyB1cGRhdGUoa2V5OiBzdHJpbmcsIHVwZGF0ZXM6IFBhcnRpYWw8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgIGNvbnN0IHAgPSBhd2FpdCBmaWxlUGF0aChrZXkpO1xuICAgICAgY29uc3QgeyByZWFkRmlsZSwgbWtkaXIsIHdyaXRlRmlsZSB9ID0gYXdhaXQgZnMoKTtcbiAgICAgIGNvbnN0IHsgZGlybmFtZSB9ID0gYXdhaXQgcGF0aCgpO1xuICAgICAgbGV0IGV4aXN0aW5nOiBUO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlYWRGaWxlKHAsIFwidXRmLThcIik7XG4gICAgICAgIGV4aXN0aW5nID0gSlNPTi5wYXJzZShkYXRhKSBhcyBUO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm90IGZvdW5kOiAke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSB7IC4uLmV4aXN0aW5nLCAuLi51cGRhdGVzIH07XG4gICAgICBhd2FpdCBta2RpcihkaXJuYW1lKHApLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShwLCBKU09OLnN0cmluZ2lmeSh1cGRhdGVkLCBudWxsLCAyKSk7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQWxsRnJvbURpcjxUPihkaXI6IHN0cmluZyk6IFByb21pc2U8VFtdPiB7XG4gIGNvbnN0IHsgcmVhZGRpciwgcmVhZEZpbGUgfSA9IGF3YWl0IGZzKCk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgcGF0aCgpO1xuICBsZXQgZmlsZXM6IHN0cmluZ1tdO1xuICB0cnkge1xuICAgIGZpbGVzID0gYXdhaXQgcmVhZGRpcihkaXIpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgcmVzdWx0OiBUW10gPSBbXTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlYWRGaWxlKGpvaW4oZGlyLCBmaWxlKSwgXCJ1dGYtOFwiKTtcbiAgICAgIHJlc3VsdC5wdXNoKEpTT04ucGFyc2UoZGF0YSkgYXMgVCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBza2lwIGNvcnJ1cHQgZmlsZXNcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZW5zdXJlR2l0aWdub3JlKGRpcjogc3RyaW5nKSB7XG4gIGNvbnN0IHsgbWtkaXIsIHdyaXRlRmlsZSwgcmVhZEZpbGUgfSA9IGF3YWl0IGZzKCk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgcGF0aCgpO1xuICBjb25zdCBnaXRpZ25vcmVQYXRoID0gam9pbihkaXIsIFwiLmdpdGlnbm9yZVwiKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCByZWFkRmlsZShnaXRpZ25vcmVQYXRoLCBcInV0Zi04XCIpO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHdyaXRlRmlsZShnaXRpZ25vcmVQYXRoLCBcIipcXG5cIik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsU3RvcmFnZShvcHRzPzogeyBkaXI/OiBzdHJpbmcgfSk6IFN0b3JhZ2VIYW5kbGVycyB7XG4gIGNvbnN0IGRpciA9IG9wdHM/LmRpciA/PyBcIi5hZ2VudFwiO1xuICBsZXQgZ2l0aWdub3JlUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IHNlc3Npb25TdG9yZSA9IGNyZWF0ZVN0b3JlPFNlc3Npb24+KGAke2Rpcn0vc2Vzc2lvbmApO1xuICBjb25zdCBtZXNzYWdlU3RvcmUgPSBjcmVhdGVTdG9yZTxNZXNzYWdlPihgJHtkaXJ9L21lc3NhZ2VgKTtcbiAgY29uc3QgcGFydFN0b3JlID0gY3JlYXRlU3RvcmU8UGFydD4oYCR7ZGlyfS9wYXJ0YCk7XG4gIGNvbnN0IHNhbmRib3hTdG9yZSA9IGNyZWF0ZVN0b3JlPFNhbmRib3g+KGAke2Rpcn0vc2FuZGJveGApO1xuICBjb25zdCBzZXR1cFN0b3JlID0gY3JlYXRlU3RvcmU8U2V0dXA+KGAke2Rpcn0vc2V0dXBgKTtcbiAgY29uc3QgbWVzc2FnZURpciA9IGAke2Rpcn0vbWVzc2FnZWA7XG4gIGNvbnN0IHBhcnREaXIgPSBgJHtkaXJ9L3BhcnRgO1xuXG4gIGZ1bmN0aW9uIG9uV3JpdGU8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoIWdpdGlnbm9yZVByb21pc2UpIHtcbiAgICAgIGdpdGlnbm9yZVByb21pc2UgPSBlbnN1cmVHaXRpZ25vcmUoZGlyKTtcbiAgICB9XG4gICAgcmV0dXJuIGdpdGlnbm9yZVByb21pc2UudGhlbihmbik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIFwic2Vzc2lvbi5nZXRcIjogKHsgaWQgfSkgPT4gc2Vzc2lvblN0b3JlLmdldChpZCksXG4gICAgXCJzZXNzaW9uLnNldFwiOiAoeyBpZCwgdmFsdWUgfSkgPT5cbiAgICAgIG9uV3JpdGUoKCkgPT4gc2Vzc2lvblN0b3JlLnNldChpZCwgdmFsdWUpKSxcbiAgICBcInNlc3Npb24udXBkYXRlXCI6ICh7IGlkLCB1cGRhdGVzIH0pID0+XG4gICAgICBvbldyaXRlKCgpID0+IHNlc3Npb25TdG9yZS51cGRhdGUoaWQsIHVwZGF0ZXMpKSxcblxuICAgIFwibWVzc2FnZS5nZXRcIjogKHsgaWQgfSkgPT4gbWVzc2FnZVN0b3JlLmdldChpZCksXG4gICAgXCJtZXNzYWdlLnNldFwiOiAoeyBpZCwgdmFsdWUgfSkgPT5cbiAgICAgIG9uV3JpdGUoKCkgPT4gbWVzc2FnZVN0b3JlLnNldChpZCwgdmFsdWUpKSxcbiAgICBcIm1lc3NhZ2UudXBkYXRlXCI6ICh7IGlkLCB1cGRhdGVzIH0pID0+XG4gICAgICBvbldyaXRlKCgpID0+IG1lc3NhZ2VTdG9yZS51cGRhdGUoaWQsIHVwZGF0ZXMpKSxcbiAgICBcIm1lc3NhZ2UubGlzdEJ5U2Vzc2lvblwiOiBhc3luYyAoeyBzZXNzaW9uSWQgfSkgPT4ge1xuICAgICAgY29uc3QgYWxsID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8TWVzc2FnZT4obWVzc2FnZURpcik7XG4gICAgICByZXR1cm4gYWxsLmZpbHRlcigobSkgPT4gbS5zZXNzaW9uSWQgPT09IHNlc3Npb25JZCk7XG4gICAgfSxcblxuICAgIFwicGFydC5nZXRcIjogKHsgaWQgfSkgPT4gcGFydFN0b3JlLmdldChpZCksXG4gICAgXCJwYXJ0LnNldFwiOiAoeyBpZCwgdmFsdWUgfSkgPT4gb25Xcml0ZSgoKSA9PiBwYXJ0U3RvcmUuc2V0KGlkLCB2YWx1ZSkpLFxuICAgIFwicGFydC5saXN0QnlTZXNzaW9uXCI6IGFzeW5jICh7IHNlc3Npb25JZCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGwgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxQYXJ0PihwYXJ0RGlyKTtcbiAgICAgIHJldHVybiBhbGwuZmlsdGVyKChwKSA9PiBwLnNlc3Npb25JZCA9PT0gc2Vzc2lvbklkKTtcbiAgICB9LFxuXG4gICAgXCJzYW5kYm94LmdldFwiOiAoeyBpZCB9KSA9PiBzYW5kYm94U3RvcmUuZ2V0KGlkKSxcbiAgICBcInNhbmRib3guc2V0XCI6ICh7IGlkLCB2YWx1ZSB9KSA9PlxuICAgICAgb25Xcml0ZSgoKSA9PiBzYW5kYm94U3RvcmUuc2V0KGlkLCB2YWx1ZSkpLFxuICAgIFwic2FuZGJveC51cGRhdGVcIjogKHsgaWQsIHVwZGF0ZXMgfSkgPT5cbiAgICAgIG9uV3JpdGUoKCkgPT4gc2FuZGJveFN0b3JlLnVwZGF0ZShpZCwgdXBkYXRlcykpLFxuXG4gICAgXCJzZXR1cC5nZXRcIjogKHsgaWQgfSkgPT4gc2V0dXBTdG9yZS5nZXQoaWQpLFxuICAgIFwic2V0dXAuc2V0XCI6ICh7IGlkLCB2YWx1ZSB9KSA9PiBvbldyaXRlKCgpID0+IHNldHVwU3RvcmUuc2V0KGlkLCB2YWx1ZSkpLFxuICB9O1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBzaG91bGRGYWxsYmFja1RvS1YyKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFwcm9jZXNzLmVudi5CTE9CX1JFQURfV1JJVEVfVE9LRU47XG59XG4iLCAiaW1wb3J0IHR5cGUge1xuICBJbmZlclRvb2xJbnB1dCxcbiAgSW5mZXJVSVRvb2xzLFxuICBNb2RlbE1lc3NhZ2UsXG4gIFRvb2xTZXQsXG4gIFVJTWVzc2FnZSxcbn0gZnJvbSBcImFpXCI7XG5pbXBvcnQgKiBhcyBlcnJvcmUgZnJvbSBcImVycm9yZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQnVpbHRJblRvb2xOYW1lLCBidWlsdEluVG9vbHMsIFRvb2xDb250ZXh0IH0gZnJvbSBcIi4uL3Rvb2xzXCI7XG5pbXBvcnQgdHlwZSB7IEFueUFnZW50IH0gZnJvbSBcIi4vY2xpZW50XCI7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBZ2VudCBTdGF0dXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogVHJhbnNpZW50IHN0YXR1cyBpbmRpY2F0b3JzIGVtaXR0ZWQgb3ZlciB0aGUgc3RyZWFtIGR1cmluZyBsb25nLXJ1bm5pbmcgcGhhc2VzLlxuICogRGVsaXZlcmVkIHRvIHRoZSBjbGllbnQgYXMgYGRhdGEtc3RhdHVzYCBjaHVua3Mgd2l0aCBgdHJhbnNpZW50OiB0cnVlYCBcdTIwMTQgbm90IHBlcnNpc3RlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFnZW50U3RhdHVzID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJzYW5kYm94LXNldHVwXCIpIH0pLFxuICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbChcInNhbmRib3gtc2V0dXAtY29sZFwiKSB9KSxcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJsb2FkaW5nLXNraWxsc1wiKSB9KSxcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJwcm9jZXNzaW5nLWFwcHJvdmFsc1wiKSB9KSxcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJuZWVkcy1hcHByb3ZhbFwiKSB9KSxcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJ0aGlua2luZ1wiKSB9KSxcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJjdXN0b21cIiksIHN0YXR1czogei5zdHJpbmcoKSB9KSxcbl0pO1xuXG5leHBvcnQgdHlwZSBBZ2VudFN0YXR1cyA9IHouaW5mZXI8dHlwZW9mIEFnZW50U3RhdHVzPjtcblxuZXhwb3J0IHR5cGUgQWdlbnREYXRhVHlwZXMgPSB7IHN0YXR1czogQWdlbnRTdGF0dXMgfTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEhvb2tzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQgdHlwZSBBZ2VudEhvb2tzID0ge1xuICBcInRvb2wuYmVmb3JlXCI/OiAob3B0czoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBpbnB1dDogdW5rbm93bjtcbiAgICBjb250ZXh0OiBUb29sQ29udGV4dDtcbiAgfSkgPT4gUHJvbWlzZTx1bmRlZmluZWQgfCB7IGlucHV0OiB1bmtub3duIH0+O1xuICBcInRvb2wuYWZ0ZXJcIj86IChvcHRzOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlucHV0OiB1bmtub3duO1xuICAgIHJlc3VsdDogdW5rbm93bjtcbiAgICBjb250ZXh0OiBUb29sQ29udGV4dDtcbiAgfSkgPT4gUHJvbWlzZTx1bmRlZmluZWQgfCB7IHJlc3VsdDogdW5rbm93biB9PjtcbiAgc3RhdHVzPzogKHN0YXR1czogQWdlbnRTdGF0dXMpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIE5lZWRzIEFwcHJvdmFsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG50eXBlIFRvb2xOYW1lPFRvb2xzPiA9IEV4dHJhY3Q8a2V5b2YgVG9vbHMsIHN0cmluZz4gfCBCdWlsdEluVG9vbE5hbWU7XG5cbnR5cGUgVG9vbElucHV0PFRvb2xzLCBLPiA9IEsgZXh0ZW5kcyBCdWlsdEluVG9vbE5hbWVcbiAgPyBJbmZlclRvb2xJbnB1dDwodHlwZW9mIGJ1aWx0SW5Ub29scylbS10+XG4gIDogSyBleHRlbmRzIGtleW9mIFRvb2xzXG4gICAgPyBUb29sc1tLXSBleHRlbmRzIGltcG9ydChcImFpXCIpLlRvb2xcbiAgICAgID8gSW5mZXJUb29sSW5wdXQ8VG9vbHNbS10+XG4gICAgICA6IHVua25vd25cbiAgICA6IHVua25vd247XG5cbmV4cG9ydCB0eXBlIE5lZWRzQXBwcm92YWxNYXA8VG9vbHM+ID0ge1xuICBbSyBpbiBUb29sTmFtZTxUb29scz5dPzpcbiAgICB8IGJvb2xlYW5cbiAgICB8ICgoXG4gICAgICAgIGlucHV0OiBUb29sSW5wdXQ8VG9vbHMsIEs+LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgdG9vbENhbGxJZDogc3RyaW5nO1xuICAgICAgICAgIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXTtcbiAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDogdW5rbm93bjtcbiAgICAgICAgfVxuICAgICAgKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik7XG59O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgSW5mZXIgVUkgTWVzc2FnZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHR5cGUgSW5mZXJVSU1lc3NhZ2U8QT4gPSBBIGV4dGVuZHMge1xuICB0b29sczogaW5mZXIgVCBleHRlbmRzIFRvb2xTZXQ7XG4gICRVSU1lc3NhZ2U6IFVJTWVzc2FnZTxpbmZlciBNPjtcbn1cbiAgPyBVSU1lc3NhZ2U8TSwgQWdlbnREYXRhVHlwZXMsIEluZmVyVUlUb29sczxUPj5cbiAgOiBBIGV4dGVuZHMgeyB0b29sczogaW5mZXIgVCBleHRlbmRzIFRvb2xTZXQgfVxuICAgID8gVUlNZXNzYWdlPHVua25vd24sIEFnZW50RGF0YVR5cGVzLCBJbmZlclVJVG9vbHM8VD4+XG4gICAgOiBVSU1lc3NhZ2U8dW5rbm93biwgQWdlbnREYXRhVHlwZXM+O1xuXG5leHBvcnQgdHlwZSBUeXBlZFVJTWVzc2FnZTxcbiAgVE1lc3NhZ2VNZXRhZGF0YSA9IHVua25vd24sXG4gIFRvb2xzIGV4dGVuZHMgVG9vbFNldCA9IFRvb2xTZXQsXG4+ID0gVUlNZXNzYWdlPFRNZXNzYWdlTWV0YWRhdGEsIEFnZW50RGF0YVR5cGVzLCBJbmZlclVJVG9vbHM8VG9vbHM+PjtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJlZ2lzdHJ5IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5jbGFzcyBBZ2VudE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIkFnZW50Tm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBgQWdlbnQgXCIkYWdlbnROYW1lXCIgbm90IGZvdW5kIGluIHJlZ2lzdHJ5LlxuXG5oaW50OiBhZ2VudCgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB3b3JrZmxvdyBzdGVwcyBleGVjdXRlLlxuICAgICAgVmFsaWQgbG9jYXRpb25zOiBtb2R1bGUgc2NvcGUsIG9yIGluc2lkZSBhIFwidXNlIHdvcmtmbG93XCIgYm9keS5cblxuICAvLyBNb2R1bGUgc2NvcGUgKHN0YXRpYyBhZ2VudHMpXG4gIGV4cG9ydCBjb25zdCBteUFnZW50ID0gYWdlbnQoXCIkYWdlbnROYW1lXCIsIHsgLi4uIH0pO1xuXG4gIC8vIFdvcmtmbG93IGJvZHkgKGR5bmFtaWMgYWdlbnRzKVxuICBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KHsgaW5wdXQgfSkge1xuICAgIFwidXNlIHdvcmtmbG93XCI7XG4gICAgY29uc3QgbXlBZ2VudCA9IGFnZW50KFwiJGFnZW50TmFtZVwiLCB7IC4uLiB9KTtcbiAgICAuLi5cbiAgfWAsXG59KSB7fVxuXG5jb25zdCBBR0VOVF9SRUdJU1RSWV9LRVkgPSBTeW1ib2wuZm9yKFwiZXhwZXJpbWVudGFsLWFnZW50LXJlZ2lzdHJ5XCIpO1xuXG5mdW5jdGlvbiBnZXRBZ2VudFJlZ2lzdHJ5KCk6IE1hcDxzdHJpbmcsIEFueUFnZW50PiB7XG4gIGNvbnN0IGcgPSBnbG9iYWxUaGlzIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+O1xuICBsZXQgcmVnaXN0cnkgPSBnW0FHRU5UX1JFR0lTVFJZX0tFWV0gYXMgTWFwPHN0cmluZywgQW55QWdlbnQ+IHwgdW5kZWZpbmVkO1xuICBpZiAoIXJlZ2lzdHJ5KSB7XG4gICAgcmVnaXN0cnkgPSBuZXcgTWFwKCk7XG4gICAgZ1tBR0VOVF9SRUdJU1RSWV9LRVldID0gcmVnaXN0cnk7XG4gIH1cbiAgcmV0dXJuIHJlZ2lzdHJ5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBZ2VudChuYW1lOiBzdHJpbmcsIGFnZW50OiBBbnlBZ2VudCkge1xuICBnZXRBZ2VudFJlZ2lzdHJ5KCkuc2V0KG5hbWUsIGFnZW50KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRBZ2VudDxSZXF1aXJlZCBleHRlbmRzIGJvb2xlYW4+KFxuICBuYW1lOiBzdHJpbmcsXG4gIHJlcXVpcmVkPzogUmVxdWlyZWRcbik6IFJlcXVpcmVkIGV4dGVuZHMgdHJ1ZSA/IEFueUFnZW50IDogQW55QWdlbnQgfCB1bmRlZmluZWQge1xuICBjb25zdCBhZ2VudCA9IGdldEFnZW50UmVnaXN0cnkoKS5nZXQobmFtZSk7XG4gIGlmIChyZXF1aXJlZCAmJiAhYWdlbnQpIHtcbiAgICB0aHJvdyBuZXcgQWdlbnROb3RGb3VuZEVycm9yKHsgYWdlbnROYW1lOiBuYW1lIH0pO1xuICB9XG4gIHJldHVybiBhZ2VudCBhcyBSZXF1aXJlZCBleHRlbmRzIHRydWUgPyBBbnlBZ2VudCA6IEFueUFnZW50IHwgdW5kZWZpbmVkO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkJBLFNBQVMsU0FBUyxRQUFpQztBQUNqRCxTQUFPLE9BQU8sU0FBUztBQUN6QjtBQUVBLFNBQVMsVUFBVSxRQUErQjtBQUNoRCxTQUFPLE9BQU8sVUFBVTtBQUMx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Q2Q7QUFFQSxVQUFNQyxPQUFNLGFBQWE7QUFBQSxNQUN2QixRQUFRLEVBQUUsR0FBRyxLQUFLLFFBQVEsU0FBUyxNQUFNLEtBQUssS0FBSztBQUFBLE1BQ25ELFdBQVc7QUFBQSxJQUNiLENBQUM7QUFFRCxRQUFJLG9CQUFvQixHQUFHO0FBQ3pCLE1BQUFBLEtBQUk7QUFBQSxRQUNGLCtEQUEwRCxLQUFLLElBQUk7QUFBQSxNQUNyRTtBQUNBLFdBQUssbUJBQW1CO0FBQUEsUUFDdEIsa0JBQWtCLEVBQUUsUUFBUSxLQUFLLEtBQUssQ0FBQztBQUFBLE1BQ3pDO0FBQ0EsYUFBTyxLQUFLO0FBQUEsSUFDZDtBQUVBLElBQUFBLEtBQUk7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUNBLFNBQUssbUJBQW1CLFVBQVUsYUFBYSxDQUFDO0FBQ2hELFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQSxFQUVBLElBQUksUUFBUTtBQUNWLFdBQU8sRUFBRSxHQUFHLGNBQWMsR0FBRyxLQUFLLFFBQVEsTUFBTTtBQUFBLEVBRWxEO0FBQUEsRUFFQSxJQUFJLFFBQW9CO0FBQ3RCLFdBQU8sS0FBSyxRQUFRLFNBQVMsQ0FBQztBQUFBLEVBQ2hDO0FBQUEsRUFFUztBQUFBLEVBRUE7QUFRWDtBQUVPLFNBQVMsTUFLZCxNQUFjLFNBQTJEO0FBQ3pFLFFBQU0sV0FBVyxJQUFJLE1BS25CLE1BQU0sT0FBTztBQUNmLGdCQUFjLE1BQU0sUUFBUTtBQUM1QixTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbImxvZyIsICJzbmFwc2hvdCIsICJsb2ciLCAibG9hZFNhbmRib3hTREsiLCAiZ2V0VGVzdENyZWRlbnRpYWxzIiwgImxvZyIsICJzbmFwc2hvdCIsICJhZ2VudCIsICJzZXR1cCIsICJzdGFydFdvcmtmbG93IiwgInNkayIsICJpbnN0YW5jZSIsICJwYXRoIiwgInJlc29sdmUiLCAicGF0aCIsICJmcyIsICJpbXBvcnRfdWxpZCIsICJwYXRoIiwgInJlc29sdmUiLCAiZnMiLCAicmVzb2x2ZSIsICJpbXBvcnRfc2VyZGUiLCAiaW1wb3J0X3VsaWQiLCAidmVyY2VsU2FuZGJveCIsICJkb2NrZXJTYW5kYm94IiwgImxvY2FsU2FuZGJveCIsICJhZ2VudCIsICJsb2ciLCAicmVzb2x2ZSIsICJhZ2VudCIsICJpbXBvcnRfdWxpZCIsICJ1c2FnZSIsICJlcnJvcmUiLCAiaW1wb3J0X3VsaWQiLCAiaW1wb3J0X2FpIiwgImFnZW50IiwgImxvZyIsICJyZWFkRmlsZSIsICJyZXNvbHZlIiwgImxvZyIsICJpbXBvcnRfYWkiLCAiaW1wb3J0X3VsaWQiLCAiaW1wb3J0X3pvZCIsICJleGVjIiwgImFnZW50IiwgImFnZW50IiwgInBhdGgiLCAiY3JlYXRlUHJvY2Vzc01hbmFnZXIiLCAic3RhcnQiLCAiYWdlbnQiLCAicmVzb2x2ZSIsICJsb2ciLCAic2FuZGJveCIsICJzdHJlYW0iLCAic3RyZWFtVGV4dEFpIiwgInVzYWdlIiwgImFnZW50IiwgImxvZyIsICJ1c2FnZSIsICJub3ciLCAiaWQiLCAiZXJyb3JlIiwgImFnZW50IiwgInJlYWRGaWxlIiwgImFsbCIsICJlcnJvcmUiLCAiaW1wb3J0X3pvZCIsICJhZ2VudCIsICJhZ2VudCIsICJsb2ciXQp9Cg==