@dollhousemcp/mcp-server 2.0.35 → 2.0.37

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 (42) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  3. package/dist/elements/base/BaseElementManager.js +6 -2
  4. package/dist/elements/memories/Memory.d.ts.map +1 -1
  5. package/dist/elements/memories/Memory.js +9 -2
  6. package/dist/elements/memories/MemoryManager.d.ts +13 -0
  7. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  8. package/dist/elements/memories/MemoryManager.js +57 -44
  9. package/dist/elements/memories/constants.js +2 -2
  10. package/dist/elements/templates/Template.d.ts +2 -0
  11. package/dist/elements/templates/Template.d.ts.map +1 -1
  12. package/dist/elements/templates/Template.js +9 -1
  13. package/dist/generated/version.d.ts +2 -2
  14. package/dist/generated/version.js +3 -3
  15. package/dist/handlers/GitHubAuthHandler.d.ts +12 -0
  16. package/dist/handlers/GitHubAuthHandler.d.ts.map +1 -1
  17. package/dist/handlers/GitHubAuthHandler.js +303 -60
  18. package/dist/handlers/element-crud/editElement.d.ts.map +1 -1
  19. package/dist/handlers/element-crud/editElement.js +24 -11
  20. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +62 -0
  21. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  22. package/dist/handlers/mcp-aql/MCPAQLHandler.js +209 -34
  23. package/dist/security/contentValidator.d.ts +32 -1
  24. package/dist/security/contentValidator.d.ts.map +1 -1
  25. package/dist/security/contentValidator.js +79 -33
  26. package/dist/security/secureYamlParser.d.ts.map +1 -1
  27. package/dist/security/secureYamlParser.js +5 -2
  28. package/dist/security/tokenManager.d.ts +1 -1
  29. package/dist/security/tokenManager.d.ts.map +1 -1
  30. package/dist/security/tokenManager.js +10 -7
  31. package/dist/storage/MemoryMetadataExtractor.d.ts +4 -1
  32. package/dist/storage/MemoryMetadataExtractor.d.ts.map +1 -1
  33. package/dist/storage/MemoryMetadataExtractor.js +7 -3
  34. package/dist/utils/pathSecurity.d.ts +3 -1
  35. package/dist/utils/pathSecurity.d.ts.map +1 -1
  36. package/dist/utils/pathSecurity.js +38 -2
  37. package/dist/web/routes/setupRoutes.d.ts +23 -7
  38. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  39. package/dist/web/routes/setupRoutes.js +138 -20
  40. package/oauth-helper.mjs +233 -92
  41. package/package.json +1 -1
  42. package/server.json +2 -2
@@ -8,11 +8,11 @@
8
8
  * and command arguments are hardcoded — no user-supplied shell input.
9
9
  */
10
10
  import { execFile } from 'node:child_process';
11
- import { accessSync, constants as fsConstants } from 'node:fs';
11
+ import { accessSync, existsSync, constants as fsConstants } from 'node:fs';
12
12
  import { access, chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
13
- import { join, dirname } from 'node:path';
13
+ import { join, dirname, sep } from 'node:path';
14
14
  import { fileURLToPath } from 'node:url';
15
- import { homedir, platform } from 'node:os';
15
+ import { homedir, platform, tmpdir } from 'node:os';
16
16
  const __filename = fileURLToPath(import.meta.url);
17
17
  const __dirname = dirname(__filename);
18
18
  import { logger } from '../../utils/logger.js';
@@ -74,9 +74,15 @@ const installLimiter = new SlidingWindowRateLimiter(5, 60_000);
74
74
  /**
75
75
  * Known config file paths per client.
76
76
  * Returns the absolute path for the current platform.
77
+ *
78
+ * @param home - Home directory used to resolve every path. Defaults to
79
+ * os.homedir(), but is injectable so callers (and tests) can make
80
+ * `home` authoritative and keep config writes inside a sandbox.
81
+ * See https://github.com/DollhouseMCP/mcp-server/issues/2338 —
82
+ * without this override, NVM helpers driven by a fake home still
83
+ * resolved to the real client configs and patched them.
77
84
  */
78
- function getConfigPath(client) {
79
- const home = homedir();
85
+ function getConfigPath(client, home = homedir()) {
80
86
  const plat = platform();
81
87
  const paths = {
82
88
  'claude': () => {
@@ -485,6 +491,7 @@ function logLicenseWorkerDeliveryFailure(message, licenseData, deliveryResult) {
485
491
  export function createSetupRoutes(opts) {
486
492
  const installer = opts?._runInstallMcp ?? runInstallMcp;
487
493
  const permissionHookInstaller = opts?._installPermissionHook ?? installPermissionHook;
494
+ const nvmLauncherApplier = opts?._applyNvmLauncher ?? applyNvmLauncherIfNeeded;
488
495
  const autoRepairPermissionHooksOnDetect = opts?._autoRepairPermissionHooksOnDetect ?? process.env.NODE_ENV !== 'test';
489
496
  const hookStatusReconciler = opts?._reconcilePermissionHookStatus ?? (async (client) => reconcilePermissionHookStatus(client, { autoRepair: autoRepairPermissionHooksOnDetect }));
490
497
  const skipRateLimit = opts?._skipRateLimit ?? false;
@@ -585,7 +592,8 @@ export function createSetupRoutes(opts) {
585
592
  // Best-effort NVM mitigation (macOS/Linux only).
586
593
  // Extracted into applyNvmLauncherIfNeeded to keep this handler's
587
594
  // cognitive complexity within bounds (SonarCloud S3776).
588
- const nvmResult = await applyNvmLauncherIfNeeded(normalizedClient);
595
+ // Injectable (_applyNvmLauncher) so tests don't touch the real homedir.
596
+ const nvmResult = await nvmLauncherApplier(normalizedClient);
589
597
  const nvmMitigationApplied = toNvmMitigationApplied(nvmResult);
590
598
  const hookInstall = await permissionHookInstaller(normalizedClient);
591
599
  res.json({
@@ -909,9 +917,17 @@ function captureInstallAnalytics(event, properties) {
909
917
  })
910
918
  .catch(() => { });
911
919
  }
912
- /** JSON-format clients eligible for NVM launcher repair on startup. */
920
+ /**
921
+ * JSON-format clients eligible for NVM launcher patch/repair/heal.
922
+ *
923
+ * This MUST be the full set of clients whose JSON config the install flow can
924
+ * patch via applyNvmLauncherIfNeeded → patchConfigForNvmLauncher — otherwise a
925
+ * client that was patched at install time (e.g. VS Code or Cline pointing at a
926
+ * now-dead wrapper) would never self-heal on startup (issue #2338). Codex is
927
+ * excluded because its config is TOML, which patchConfigForNvmLauncher skips.
928
+ */
913
929
  const JSON_FORMAT_CLIENTS = [
914
- 'claude', 'claude-code', 'cursor', 'windsurf', 'lmstudio', 'gemini-cli',
930
+ 'claude', 'claude-code', 'cursor', 'vscode', 'cline', 'windsurf', 'lmstudio', 'gemini-cli',
915
931
  ];
916
932
  /**
917
933
  * Orchestrates the NVM mitigation: detect → create launcher → patch config → telemetry.
@@ -929,7 +945,11 @@ export async function applyNvmLauncherIfNeeded(client, home = homedir()) {
929
945
  }
930
946
  try {
931
947
  const wrapperPath = await ensureNvmLauncher(home);
932
- await patchConfigForNvmLauncher(client, wrapperPath);
948
+ // Derive the config path from the SAME `home` that located NVM and the
949
+ // wrapper. Passing it explicitly (rather than letting patchConfigForNvmLauncher
950
+ // fall back to the real homedir()) is what makes `home` authoritative and
951
+ // keeps a fake-home test from patching real client configs (#2338).
952
+ await patchConfigForNvmLauncher(client, wrapperPath, getConfigPath(client, home) ?? undefined);
933
953
  logger.info(`[Setup] NVM-aware launcher applied for ${client}`);
934
954
  captureInstallAnalytics('nvm_launcher_applied', { client, platform: platform() });
935
955
  return 'applied';
@@ -945,25 +965,37 @@ export async function applyNvmLauncherIfNeeded(client, home = homedir()) {
945
965
  }
946
966
  }
947
967
  /**
948
- * Startup repair: re-creates the wrapper and re-patches all known JSON-format
949
- * client configs on every server start. Handles two cases:
950
- * 1. Wrapper was deleted recreates it so configs pointing to it keep working.
951
- * 2. Pre-existing install (user installed before this fix shipped) — patches
952
- * configs that still use bare `npx`.
968
+ * Startup repair + self-heal: reconciles every known JSON-format client config
969
+ * on each server start. Behaviour depends on whether NVM is installed, matching
970
+ * the acceptance matrix in https://github.com/DollhouseMCP/mcp-server/issues/2338:
971
+ *
972
+ * NVM present → (re)create the wrapper and point each config at it. Covers a
973
+ * deleted wrapper, a pre-fix install still on bare `npx`, and a config left
974
+ * pointing at a dead temp-dir wrapper (regenerates the real one). Healthy
975
+ * configs re-serialise byte-identically, so this is a no-op for them.
976
+ * • NVM absent → never create a wrapper, but SELF-HEAL any config whose
977
+ * command points at a `dollhousemcp-nvm.sh` that no longer exists (e.g. the
978
+ * #2338 test leak, or a user who removed ~/.dollhouse/bin) back to bare `npx`,
979
+ * preserving args so the client can launch DollhouseMCP again.
953
980
  *
954
981
  * Fire-and-forget from startWebServer. All errors are swallowed and logged.
955
982
  *
956
983
  * @param home - Override home directory (injectable for tests)
957
984
  * @param configPathResolver - Override config path lookup (injectable for tests).
958
- * Return null to skip a client entirely.
959
- * Defaults to the production getConfigPath.
985
+ * Return null to skip a client entirely. Defaults to a
986
+ * home-derived resolver so `home` stays authoritative
987
+ * — the default must NOT reach the real homedir() when
988
+ * a fake home is supplied (#2338).
960
989
  */
961
- export async function repairNvmLauncherOnStartup(home = homedir(), configPathResolver = getConfigPath) {
990
+ export async function repairNvmLauncherOnStartup(home = homedir(), configPathResolver = (client) => getConfigPath(client, home)) {
962
991
  if (platform() === 'win32')
963
992
  return;
964
993
  logger.debug('[Setup] NVM launcher startup repair: checking for NVM...');
965
994
  if (!await isNvmPresent(home)) {
966
- logger.debug('[Setup] NVM launcher startup repair: NVM not present nothing to repair');
995
+ // NVM absent: we must NOT create a wrapper, but we DO restore any config
996
+ // still pointing at a now-missing wrapper so the client is not left broken.
997
+ logger.debug('[Setup] NVM launcher startup repair: NVM not present — scanning for dead wrapper references');
998
+ await healClientsWithoutNvm(configPathResolver);
967
999
  return;
968
1000
  }
969
1001
  let wrapperPath;
@@ -974,6 +1006,15 @@ export async function repairNvmLauncherOnStartup(home = homedir(), configPathRes
974
1006
  logger.warn(`[Setup] NVM startup repair: could not create launcher: ${err instanceof Error ? err.message : String(err)}`);
975
1007
  return;
976
1008
  }
1009
+ await patchClientsForNvm(wrapperPath, configPathResolver);
1010
+ logger.info('[Setup] NVM launcher startup repair complete');
1011
+ }
1012
+ /**
1013
+ * Point every resolvable JSON-format client config at the (real) NVM wrapper.
1014
+ * Extracted from repairNvmLauncherOnStartup to keep its cognitive complexity
1015
+ * within SonarCloud limits (S3776).
1016
+ */
1017
+ async function patchClientsForNvm(wrapperPath, configPathResolver) {
977
1018
  await Promise.allSettled(JSON_FORMAT_CLIENTS.map(client => {
978
1019
  const configPath = configPathResolver(client);
979
1020
  if (!configPath)
@@ -981,7 +1022,63 @@ export async function repairNvmLauncherOnStartup(home = homedir(), configPathRes
981
1022
  return patchConfigForNvmLauncher(client, wrapperPath, configPath)
982
1023
  .catch(err => logger.warn(`[Setup] NVM startup repair: failed to patch ${client}: ${err instanceof Error ? err.message : String(err)}`));
983
1024
  }));
984
- logger.info('[Setup] NVM launcher startup repair complete');
1025
+ }
1026
+ /**
1027
+ * Self-heal path for machines WITHOUT NVM: restore any config that points at a
1028
+ * missing wrapper back to bare `npx`. Extracted for cognitive-complexity limits.
1029
+ */
1030
+ async function healClientsWithoutNvm(configPathResolver) {
1031
+ await Promise.allSettled(JSON_FORMAT_CLIENTS.map(client => {
1032
+ const configPath = configPathResolver(client);
1033
+ if (!configPath)
1034
+ return Promise.resolve(); // resolver returned null — skip this client
1035
+ return restoreNpxIfWrapperMissing(client, configPath)
1036
+ .catch(err => logger.warn(`[Setup] NVM self-heal: failed to heal ${client}: ${err instanceof Error ? err.message : String(err)}`));
1037
+ }));
1038
+ }
1039
+ /**
1040
+ * If a client's dollhousemcp entry points at a `dollhousemcp-nvm.sh` wrapper
1041
+ * that no longer exists on disk, rewrite `command` back to `npx` (args preserved)
1042
+ * and persist the config. Any other state is left byte-for-byte untouched.
1043
+ *
1044
+ * The trigger is intentionally prefix-independent (command ends with
1045
+ * `dollhousemcp-nvm.sh` AND the file is missing) so it heals not just the
1046
+ * original `dollhouse-nvm-test-*` leak but any future temp-dir leak or a user
1047
+ * who wiped ~/.dollhouse/bin. A wrapper that still exists is deliberately kept.
1048
+ */
1049
+ async function restoreNpxIfWrapperMissing(client, configPath) {
1050
+ let raw;
1051
+ try {
1052
+ raw = await readFile(configPath, 'utf-8');
1053
+ }
1054
+ catch {
1055
+ return; // Config not present/readable — nothing to heal
1056
+ }
1057
+ let parsed;
1058
+ try {
1059
+ parsed = JSON.parse(raw);
1060
+ }
1061
+ catch {
1062
+ return; // Malformed JSON — don't touch it
1063
+ }
1064
+ let healed = false;
1065
+ for (const key of ['mcpServers', 'servers']) {
1066
+ const section = parsed[key];
1067
+ const entry = section?.dollhousemcp;
1068
+ if (!entry)
1069
+ continue;
1070
+ const command = entry.command;
1071
+ if (typeof command === 'string' && command.endsWith('dollhousemcp-nvm.sh') && !existsSync(command)) {
1072
+ entry.command = 'npx';
1073
+ healed = true;
1074
+ }
1075
+ break; // dollhousemcp entry located (healed or already healthy) — stop scanning keys
1076
+ }
1077
+ if (!healed)
1078
+ return;
1079
+ const indent = detectIndent(raw);
1080
+ await writeFile(configPath, JSON.stringify(parsed, null, indent) + '\n', 'utf-8');
1081
+ logger.info(`[Setup] NVM self-heal: restored ${client} config to bare npx (dead wrapper path removed)`);
985
1082
  }
986
1083
  /**
987
1084
  * Returns true if NVM is installed on this machine (macOS/Linux only).
@@ -1109,6 +1206,16 @@ function detectIndent(raw) {
1109
1206
  }
1110
1207
  return 2;
1111
1208
  }
1209
+ /**
1210
+ * Returns true if `p` resolves inside the OS temp directory.
1211
+ * Used as a production guardrail so a wrapper created in a throwaway temp dir
1212
+ * (the shape of the #2338 test leak) can never be persisted into a real,
1213
+ * long-lived client config.
1214
+ */
1215
+ function isUnderTmpdir(p) {
1216
+ const t = tmpdir();
1217
+ return p === t || p.startsWith(t + sep);
1218
+ }
1112
1219
  /**
1113
1220
  * Patches the dollhousemcp entry in an MCP client's JSON config to use
1114
1221
  * the NVM-aware launcher instead of bare `npx`.
@@ -1128,6 +1235,17 @@ export async function patchConfigForNvmLauncher(client, wrapperPath, configPathO
1128
1235
  logger.debug(`[Setup] patchConfigForNvmLauncher: TOML config for ${client} — skipping (not JSON-format)`);
1129
1236
  return;
1130
1237
  }
1238
+ // Guardrail (#2338): never persist a temp-dir wrapper into a real, persistent
1239
+ // client config. A wrapper under os.tmpdir() is a throwaway path that will be
1240
+ // deleted, so writing it into a durable config would break the client on the
1241
+ // next launch. When BOTH the wrapper and the config live under tmpdir we are
1242
+ // in a sandboxed test and allow it, so NVM-present coverage still exercises
1243
+ // the real patch path.
1244
+ if (isUnderTmpdir(wrapperPath) && !isUnderTmpdir(configPath)) {
1245
+ logger.warn(`[Setup] patchConfigForNvmLauncher: refusing to write a temp-dir wrapper (${wrapperPath}) ` +
1246
+ `into a persistent ${client} config (${configPath}) — see issue #2338`);
1247
+ return;
1248
+ }
1131
1249
  let raw;
1132
1250
  try {
1133
1251
  raw = await readFile(configPath, 'utf-8');
@@ -1243,4 +1361,4 @@ function runInstallMcp(client, version) {
1243
1361
  });
1244
1362
  });
1245
1363
  }
1246
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXBSb3V0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL3JvdXRlcy9zZXR1cFJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUdILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsSUFBSSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRTVDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsNkJBQTZCLEdBRzlCLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEMsTUFBTSxXQUFXLEdBQUcseUJBQXlCLENBQUM7QUFDOUMsTUFBTSxrQkFBa0IsR0FBRyx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFP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QUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2hELE1BQU0sSUFBSSxHQUFHO1lBQ1gsR0FBRyxVQUFVO1lBQ2IsMkJBQTJCLEdBQUcsRUFBRTtZQUNoQyxVQUFVLEVBQUUsTUFBTTtZQUNsQixRQUFRLEVBQUUsY0FBYztZQUN4QixPQUFPO1NBQ1IsQ0FBQztRQUVGLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMvRCxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLE9BQU87WUFDVCxDQUFDO1lBQ0QsT0FBTyxDQUFDLE1BQU0sSUFBSSx5QkFBeUIsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZXR1cCBSb3V0ZXMg4oCUIEF1dG8taW5zdGFsbCBEb2xsaG91c2VNQ1AgdG8gTUNQIGNsaWVudHNcbiAqXG4gKiBVc2VzIGBpbnN0YWxsLW1jcGAgKGh0dHBzOi8vZ2l0aHViLmNvbS9zdXBlcm1lbW9yeWFpL2luc3RhbGwtbWNwKVxuICogdG8gaW5qZWN0IHNlcnZlciBjb25maWd1cmF0aW9uIGludG8gc3VwcG9ydGVkIE1DUCBjbGllbnQgY29uZmlnIGZpbGVzLlxuICpcbiAqIFNlY3VyaXR5OiBsb2NhbGhvc3Qtb25seSBiaW5kaW5nIChlbmZvcmNlZCBieSBzZXJ2ZXIudHMpLCByYXRlLWxpbWl0ZWQsXG4gKiBhbmQgY29tbWFuZCBhcmd1bWVudHMgYXJlIGhhcmRjb2RlZCDigJQgbm8gdXNlci1zdXBwbGllZCBzaGVsbCBpbnB1dC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBhY2Nlc3NTeW5jLCBjb25zdGFudHMgYXMgZnNDb25zdGFudHMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGFjY2VzcywgY2htb2QsIG1rZGlyLCByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgeyBob21lZGlyLCBwbGF0Zm9ybSB9IGZyb20gJ25vZGU6b3MnO1xuXG5jb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShfX2ZpbGVuYW1lKTtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFBBQ0tBR0VfVkVSU0lPTiB9IGZyb20gJy4uLy4uL2dlbmVyYXRlZC92ZXJzaW9uLmpzJztcbmltcG9ydCB7XG4gIGluc3RhbGxQZXJtaXNzaW9uSG9vayxcbiAgcmVjb25jaWxlUGVybWlzc2lvbkhvb2tTdGF0dXMsXG4gIHR5cGUgSW5zdGFsbFBlcm1pc3Npb25Ib29rUmVzdWx0LFxuICB0eXBlIFBlcm1pc3Npb25Ib29rU3RhdHVzLFxufSBmcm9tICcuLi8uLi91dGlscy9wZXJtaXNzaW9uSG9va3MuanMnO1xuXG5jb25zdCBHSVRIVUJfUkVQTyA9ICdEb2xsaG91c2VNQ1AvbWNwLXNlcnZlcic7XG5jb25zdCBNQ1BCX0FTU0VUX1BBVFRFUk4gPSAvXmRvbGxob3VzZW1jcC0uKlxcLm1jcGIkLztcbmltcG9ydCB7IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlciB9IGZyb20gJy4uLy4uL3V0aWxzL1NsaWRpbmdXaW5kb3dSYXRlTGltaXRlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgcmFuZG9tSW50IH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgUG9zdEhvZyB9IGZyb20gJ3Bvc3Rob2ctbm9kZSc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcblxuZnVuY3Rpb24gaXNNaXNzaW5nUGF0aEVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKFxuICAgIGVycm9yXG4gICAgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0J1xuICAgICYmICdjb2RlJyBpbiBlcnJvclxuICAgICYmIChlcnJvciBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZSA9PT0gJ0VOT0VOVCcsXG4gICk7XG59XG5cbi8vIFBvc3RIb2cgcHJvamVjdCBjYXB0dXJlIGtleSDigJQgd3JpdGUtb25seSBieSBkZXNpZ24sIHNhZmUgdG8gZXhwb3NlIHB1YmxpY2x5LlxuLy8gVGhpcyBrZXkgY2FuIE9OTFkgc2VuZCBldmVudHMgdG8gUG9zdEhvZzsgaXQgY2Fubm90IHJlYWQgZGF0YSwgcXVlcnkgYW5hbHl0aWNzLFxuLy8gY29uZmlndXJlIGRlc3RpbmF0aW9ucywgb3IgYWNjZXNzIGFueSBvdGhlciBQb3N0SG9nIEFQSS4gU2FtZSBrZXkgdXNlZCBpblxuLy8gc3JjL3RlbGVtZXRyeS9PcGVyYXRpb25hbFRlbGVtZXRyeS50cy4gVmVyaWZpZWQgd3JpdGUtb25seSAyMDI2LTA0LTA3LlxuLy8gQ2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBQT1NUSE9HX0FQSV9LRVkgZW52IHZhciBmb3IgY3VzdG9tIFBvc3RIb2cgaW5zdGFsbGF0aW9ucy5cbmNvbnN0IFBPU1RIT0dfUFJPSkVDVF9LRVkgPSBwcm9jZXNzLmVudi5QT1NUSE9HX0FQSV9LRVkgfHwgJ3BoY194RkpLSUhBcVJYMVlMYTBUU2RUR3dHajE5ZDFKZW9YREtqSk5ZcTQ5MnZxJztcbmNvbnN0IExJQ0VOU0VfV09SS0VSX0RJUkVDVF9QQVRIID0gJy9kaXJlY3QtdmVyaWZpY2F0aW9uJztcblxuLyoqIFN1cHBvcnRlZCBjbGllbnQgaWRlbnRpZmllcnMgZm9yIG9uZS1jbGljayBzZXR1cC4gKi9cbmNvbnN0IEFMTE9XRURfQ0xJRU5UUyA9IG5ldyBTZXQoW1xuICAnY2xhdWRlJyxcbiAgJ2NsYXVkZS1jb2RlJyxcbiAgJ2N1cnNvcicsXG4gICd2c2NvZGUnLFxuICAnY2xpbmUnLFxuICAncm9vLWNsaW5lJyxcbiAgJ3dpbmRzdXJmJyxcbiAgJ3dpdHN5JyxcbiAgJ2VuY29udm8nLFxuICAnZ2VtaW5pLWNsaScsXG4gICdnb29zZScsXG4gICd6ZWQnLFxuICAnd2FycCcsXG4gICdjb2RleCcsXG4gICdsbXN0dWRpbycsXG5dKTtcblxudHlwZSBDb25maWdQYXRoQ2xpZW50ID1cbiAgfCAnY2xhdWRlJ1xuICB8ICdjbGF1ZGUtY29kZSdcbiAgfCAnY3Vyc29yJ1xuICB8ICd2c2NvZGUnXG4gIHwgJ3dpbmRzdXJmJ1xuICB8ICdjbGluZSdcbiAgfCAnbG1zdHVkaW8nXG4gIHwgJ2dlbWluaS1jbGknXG4gIHwgJ2NvZGV4JztcblxudHlwZSBTZXR1cFN1cHBvcnRMZXZlbCA9XG4gIHwgJ2Z1bGxfbmF0aXZlJ1xuICB8ICdwYXJ0aWFsX25hdGl2ZSdcbiAgfCAnbWNwX29ubHknXG4gIHwgJ3Vuc3VwcG9ydGVkJztcblxuY29uc3QgU0VUVVBfU1VQUE9SVF9MRVZFTFM6IFJlY29yZDxzdHJpbmcsIFNldHVwU3VwcG9ydExldmVsPiA9IHtcbiAgJ2NsYXVkZSc6ICd1bnN1cHBvcnRlZCcsXG4gICdjbGF1ZGUtY29kZSc6ICdmdWxsX25hdGl2ZScsXG4gICdjdXJzb3InOiAncGFydGlhbF9uYXRpdmUnLFxuICAnY2xpbmUnOiAnbWNwX29ubHknLFxuICAnd2luZHN1cmYnOiAncGFydGlhbF9uYXRpdmUnLFxuICAnbG1zdHVkaW8nOiAnbWNwX29ubHknLFxuICAnZ2VtaW5pLWNsaSc6ICdwYXJ0aWFsX25hdGl2ZScsXG4gICdjb2RleCc6ICdwYXJ0aWFsX25hdGl2ZScsXG59O1xuXG4vKiogQWxsb3dlZCByZWxlYXNlIGNoYW5uZWxzIGZvciB0aGUgaW5zdGFsbCBlbmRwb2ludC4gKi9cbmNvbnN0IEFMTE9XRURfSU5TVEFMTF9DSEFOTkVMUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoWydsYXRlc3QnLCAnYmV0YScsICdyYyddKTtcblxuLyoqIFJhdGUgbGltaXQ6IDUgaW5zdGFsbHMgcGVyIG1pbnV0ZSAqL1xuY29uc3QgaW5zdGFsbExpbWl0ZXIgPSBuZXcgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyKDUsIDYwXzAwMCk7XG5cbi8qKlxuICogS25vd24gY29uZmlnIGZpbGUgcGF0aHMgcGVyIGNsaWVudC5cbiAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLlxuICovXG5mdW5jdGlvbiBnZXRDb25maWdQYXRoKGNsaWVudDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGhvbWUgPSBob21lZGlyKCk7XG4gIGNvbnN0IHBsYXQgPSBwbGF0Zm9ybSgpO1xuXG4gIGNvbnN0IHBhdGhzOiBSZWNvcmQ8Q29uZmlnUGF0aENsaWVudCwgKCkgPT4gc3RyaW5nIHwgbnVsbD4gPSB7XG4gICAgJ2NsYXVkZSc6ICgpID0+IHtcbiAgICAgIGlmIChwbGF0ID09PSAnZGFyd2luJykgcmV0dXJuIGpvaW4oaG9tZSwgJ0xpYnJhcnknLCAnQXBwbGljYXRpb24gU3VwcG9ydCcsICdDbGF1ZGUnLCAnY2xhdWRlX2Rlc2t0b3BfY29uZmlnLmpzb24nKTtcbiAgICAgIGlmIChwbGF0ID09PSAnd2luMzInKSByZXR1cm4gam9pbihwcm9jZXNzLmVudi5BUFBEQVRBIHx8IGpvaW4oaG9tZSwgJ0FwcERhdGEnLCAnUm9hbWluZycpLCAnQ2xhdWRlJywgJ2NsYXVkZV9kZXNrdG9wX2NvbmZpZy5qc29uJyk7XG4gICAgICByZXR1cm4gam9pbihob21lLCAnLmNvbmZpZycsICdDbGF1ZGUnLCAnY2xhdWRlX2Rlc2t0b3BfY29uZmlnLmpzb24nKTtcbiAgICB9LFxuICAgICdjbGF1ZGUtY29kZSc6ICgpID0+IGpvaW4oaG9tZSwgJy5jbGF1ZGUuanNvbicpLFxuICAgICdjdXJzb3InOiAoKSA9PiBqb2luKGhvbWUsICcuY3Vyc29yJywgJ21jcC5qc29uJyksXG4gICAgJ3ZzY29kZSc6ICgpID0+IHtcbiAgICAgIGlmIChwbGF0ID09PSAnZGFyd2luJykgcmV0dXJuIGpvaW4oaG9tZSwgJ0xpYnJhcnknLCAnQXBwbGljYXRpb24gU3VwcG9ydCcsICdDb2RlJywgJ1VzZXInLCAnc2V0dGluZ3MuanNvbicpO1xuICAgICAgaWYgKHBsYXQgPT09ICd3aW4zMicpIHJldHVybiBqb2luKHByb2Nlc3MuZW52LkFQUERBVEEgfHwgam9pbihob21lLCAnQXBwRGF0YScsICdSb2FtaW5nJyksICdDb2RlJywgJ1VzZXInLCAnc2V0dGluZ3MuanNvbicpO1xuICAgICAgcmV0dXJuIGpvaW4oaG9tZSwgJy5jb25maWcnLCAnQ29kZScsICdVc2VyJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICB9LFxuICAgICd3aW5kc3VyZic6ICgpID0+IGpvaW4oaG9tZSwgJy5jb2RlaXVtJywgJ3dpbmRzdXJmJywgJ21jcF9jb25maWcuanNvbicpLFxuICAgICdjbGluZSc6ICgpID0+IHtcbiAgICAgIGlmIChwbGF0ID09PSAnZGFyd2luJykgcmV0dXJuIGpvaW4oaG9tZSwgJ0xpYnJhcnknLCAnQXBwbGljYXRpb24gU3VwcG9ydCcsICdDb2RlJywgJ1VzZXInLCAnZ2xvYmFsU3RvcmFnZScsICdzYW91ZHJpendhbi5jbGF1ZGUtZGV2JywgJ3NldHRpbmdzJywgJ2NsaW5lX21jcF9zZXR0aW5ncy5qc29uJyk7XG4gICAgICBpZiAocGxhdCA9PT0gJ3dpbjMyJykgcmV0dXJuIGpvaW4ocHJvY2Vzcy5lbnYuQVBQREFUQSB8fCBqb2luKGhvbWUsICdBcHBEYXRhJywgJ1JvYW1pbmcnKSwgJ0NvZGUnLCAnVXNlcicsICdnbG9iYWxTdG9yYWdlJywgJ3Nhb3Vkcml6d2FuLmNsYXVkZS1kZXYnLCAnc2V0dGluZ3MnLCAnY2xpbmVfbWNwX3NldHRpbmdzLmpzb24nKTtcbiAgICAgIHJldHVybiBqb2luKGhvbWUsICcuY29uZmlnJywgJ0NvZGUnLCAnVXNlcicsICdnbG9iYWxTdG9yYWdlJywgJ3Nhb3Vkcml6d2FuLmNsYXVkZS1kZXYnLCAnc2V0dGluZ3MnLCAnY2xpbmVfbWNwX3NldHRpbmdzLmpzb24nKTtcbiAgICB9LFxuICAgICdsbXN0dWRpbyc6ICgpID0+IGpvaW4oaG9tZSwgJy5sbXN0dWRpbycsICdtY3AuanNvbicpLFxuICAgICdnZW1pbmktY2xpJzogKCkgPT4gam9pbihob21lLCAnLmdlbWluaScsICdzZXR0aW5ncy5qc29uJyksXG4gICAgJ2NvZGV4JzogKCkgPT4gam9pbihob21lLCAnLmNvZGV4JywgJ2NvbmZpZy50b21sJyksXG4gIH07XG5cbiAgY29uc3QgcmVzb2x2ZXIgPSBwYXRoc1tjbGllbnQgYXMgQ29uZmlnUGF0aENsaWVudF07XG4gIHJldHVybiByZXNvbHZlciA/IHJlc29sdmVyKCkgOiBudWxsO1xufVxuXG4vKipcbiAqIE9wZW4gYSBmaWxlIGluIHRoZSBzeXN0ZW0ncyBkZWZhdWx0IHRleHQgZWRpdG9yLlxuICovXG5mdW5jdGlvbiBvcGVuSW5FZGl0b3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcGxhdCA9IHBsYXRmb3JtKCk7XG4gICAgbGV0IGNtZDogc3RyaW5nO1xuICAgIGxldCBhcmdzOiBzdHJpbmdbXTtcblxuICAgIGlmIChwbGF0ID09PSAnZGFyd2luJykge1xuICAgICAgY21kID0gJ29wZW4nO1xuICAgICAgYXJncyA9IFsnLXQnLCBmaWxlUGF0aF07XG4gICAgfSBlbHNlIGlmIChwbGF0ID09PSAnd2luMzInKSB7XG4gICAgICBjbWQgPSAnbm90ZXBhZCc7XG4gICAgICBhcmdzID0gW2ZpbGVQYXRoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY21kID0gJ3hkZy1vcGVuJztcbiAgICAgIGFyZ3MgPSBbZmlsZVBhdGhdO1xuICAgIH1cblxuICAgIGV4ZWNGaWxlKGNtZCwgYXJncywgeyB0aW1lb3V0OiAxMF8wMDAgfSwgKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb3VsZCBub3Qgb3BlbiBlZGl0b3I6ICR7ZXJyLm1lc3NhZ2V9YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKCdPcGVuZWQgaW4gZWRpdG9yLicpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqIENsaWVudHMgd2hvc2UgY29uZmlnIGZpbGVzIHdlIGNhbiBsb2NhdGUgYW5kIG9wZW4gKi9cbmNvbnN0IE9QRU5BQkxFX0NMSUVOVFMgPSBuZXcgU2V0KFtcbiAgJ2NsYXVkZScsICdjbGF1ZGUtY29kZScsICdjdXJzb3InLCAnY2xpbmUnLCAnd2luZHN1cmYnLCAnbG1zdHVkaW8nLCAnZ2VtaW5pLWNsaScsICdjb2RleCcsXG5dKTtcblxuLyoqXG4gKiBDcmVhdGUgc2V0dXAgaGFuZGxlcnMgKEV4cHJlc3MgNSBjb21wYXRpYmxlIOKAlCBwbGFpbiBoYW5kbGVyIGZ1bmN0aW9ucywgbm90IFJvdXRlcikuXG4gKi9cbmludGVyZmFjZSBEZXRlY3RSZXN1bHQge1xuICBpbnN0YWxsZWQ6IGJvb2xlYW47XG4gIGNvbmZpZ1BhdGg6IHN0cmluZyB8IG51bGw7XG4gIGN1cnJlbnRDb25maWc/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgc2VydmVyS2V5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgc2luZ2xlIGBbbWNwX3NlcnZlcnMuPG5hbWU+XWAgVE9NTCBzZWN0aW9uIGludG8gYSBjb25maWcgc3VtbWFyeS5cbiAqXG4gKiBXaGVuIGBjYXNlU2Vuc2l0aXZlYCBpcyB0cnVlLCB0aGUgc2VjdGlvbiBoZWFkZXIgbXVzdCBtYXRjaCBleGFjdGx5LiBUaGlzIGlzXG4gKiBpbXBvcnRhbnQgZm9yIENvZGV4IGJlY2F1c2UgdGhlIGluc3RhbGxlciB3cml0ZXMgYFttY3Bfc2VydmVycy5kb2xsaG91c2VtY3BdYFxuICogaW4gbG93ZXJjYXNlIGFuZCB3ZSB3YW50IHRvIHByZWZlciB0aGF0IGNhbm9uaWNhbCBlbnRyeSBvdmVyIGxlZ2FjeSBtaXhlZC1jYXNlXG4gKiBzZWN0aW9ucyB0aGF0IG1heSBzdGlsbCBiZSBwcmVzZW50IGluIHRoZSBmaWxlLlxuICovXG5mdW5jdGlvbiBwYXJzZVRvbWxTZWN0aW9uQ29uZmlnKFxuICBzZWN0aW9uTmFtZTogc3RyaW5nLFxuICByYXc6IHN0cmluZyxcbiAgY2FzZVNlbnNpdGl2ZSA9IGZhbHNlLFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHtcbiAgY29uc3QgZXNjYXBlZFNlY3Rpb25OYW1lID0gc2VjdGlvbk5hbWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xuICBjb25zdCBzZWN0aW9uUmVnZXggPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXFxbbWNwX3NlcnZlcnNcXC4ke2VzY2FwZWRTZWN0aW9uTmFtZX1cXF1gLCBjYXNlU2Vuc2l0aXZlID8gJycgOiAnaScpO1xuICBjb25zdCBzZWN0aW9uTWF0Y2ggPSBzZWN0aW9uUmVnZXguZXhlYyhyYXcpO1xuICBpZiAoIXNlY3Rpb25NYXRjaCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgdG9tbENvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IHNlcnZlck5hbWU6IHNlY3Rpb25OYW1lIH07XG4gIGNvbnN0IHNlY3Rpb25TdGFydCA9IHNlY3Rpb25NYXRjaC5pbmRleCArIHNlY3Rpb25NYXRjaFswXS5sZW5ndGg7XG4gIGNvbnN0IG5leHRTZWN0aW9uID0gcmF3LmluZGV4T2YoJ1xcblsnLCBzZWN0aW9uU3RhcnQpO1xuICBjb25zdCBzZWN0aW9uQ29udGVudCA9IG5leHRTZWN0aW9uID4gLTEgPyByYXcuc2xpY2Uoc2VjdGlvblN0YXJ0LCBuZXh0U2VjdGlvbikgOiByYXcuc2xpY2Uoc2VjdGlvblN0YXJ0KTtcblxuICBjb25zdCBjb21tYW5kTWF0Y2ggPSAvY29tbWFuZFxccyo9XFxzKlwiKFteXCJdKylcIi8uZXhlYyhzZWN0aW9uQ29udGVudCk7XG4gIGNvbnN0IGFyZ3NNYXRjaCA9IC9hcmdzXFxzKj1cXHMqXFxbKFteXFxdXSopXFxdLy5leGVjKHNlY3Rpb25Db250ZW50KTtcbiAgY29uc3QgZW5hYmxlZE1hdGNoID0gL2VuYWJsZWRcXHMqPVxccyoodHJ1ZXxmYWxzZSkvaS5leGVjKHNlY3Rpb25Db250ZW50KTtcblxuICBpZiAoY29tbWFuZE1hdGNoKSB0b21sQ29uZmlnLmNvbW1hbmQgPSBjb21tYW5kTWF0Y2hbMV07XG4gIGlmIChhcmdzTWF0Y2gpIHtcbiAgICB0b21sQ29uZmlnLmFyZ3MgPSBhcmdzTWF0Y2hbMV0uc3BsaXQoJywnKS5tYXAoKGFyZykgPT4gYXJnLnRyaW0oKS5yZXBsYWNlQWxsKCdcIicsICcnKSk7XG4gIH1cbiAgaWYgKGVuYWJsZWRNYXRjaCkge1xuICAgIHRvbWxDb25maWcuZW5hYmxlZCA9IGVuYWJsZWRNYXRjaFsxXS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG4gIH1cblxuICByZXR1cm4gdG9tbENvbmZpZztcbn1cblxuLyoqXG4gKiBQYXJzZSBhIFRPTUwgY29uZmlnIGZpbGUgZm9yIGEgRG9sbGhvdXNlTUNQIHNlcnZlciBlbnRyeS5cbiAqXG4gKiBEZXRlY3Rpb24gcHJlZmVycyB0aGUgY2Fub25pY2FsIGxvd2VyY2FzZSBDb2RleCBzZWN0aW9uIG5hbWUgZmlyc3QsIHRoZW5cbiAqIGZhbGxzIGJhY2sgdG8gb2xkZXIgRG9sbGhvdXNlLXJlbGF0ZWQgc2VjdGlvbiBuYW1lcyBzbyBzdGFsZSBjb25maWdzIGFyZVxuICogc3RpbGwgdmlzaWJsZSBpbiB0aGUgVUkgaW5zdGVhZCBvZiBiZWluZyBtaXN0YWtlbiBmb3IgYSBmcmVzaCBpbnN0YWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUb21sQ29uZmlnKHJhdzogc3RyaW5nKTogT21pdDxEZXRlY3RSZXN1bHQsICdjb25maWdQYXRoJz4ge1xuICBpZiAoIXJhdy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdkb2xsaG91c2VtY3AnKSkge1xuICAgIHJldHVybiB7IGluc3RhbGxlZDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IGV4YWN0Q29uZmlnID0gcGFyc2VUb21sU2VjdGlvbkNvbmZpZygnZG9sbGhvdXNlbWNwJywgcmF3LCB0cnVlKTtcbiAgaWYgKGV4YWN0Q29uZmlnKSB7XG4gICAgcmV0dXJuIHsgaW5zdGFsbGVkOiB0cnVlLCBjdXJyZW50Q29uZmlnOiBleGFjdENvbmZpZywgc2VydmVyS2V5OiAnbWNwX3NlcnZlcnMnIH07XG4gIH1cblxuICBjb25zdCBzZWN0aW9uTWF0Y2ggPSAvXFxbbWNwX3NlcnZlcnNcXC4oW15cXF1dKmRvbGxob3VzZW1jcFteXFxdXSopXFxdL2kuZXhlYyhyYXcpO1xuICBpZiAoIXNlY3Rpb25NYXRjaCkgcmV0dXJuIHsgaW5zdGFsbGVkOiB0cnVlLCBjdXJyZW50Q29uZmlnOiB7fSwgc2VydmVyS2V5OiAnbWNwX3NlcnZlcnMnIH07XG5cbiAgY29uc3QgZmFsbGJhY2tDb25maWcgPSBwYXJzZVRvbWxTZWN0aW9uQ29uZmlnKHNlY3Rpb25NYXRjaFsxXSwgcmF3KSA/PyB7IHNlcnZlck5hbWU6IHNlY3Rpb25NYXRjaFsxXSB9O1xuICByZXR1cm4geyBpbnN0YWxsZWQ6IHRydWUsIGN1cnJlbnRDb25maWc6IGZhbGxiYWNrQ29uZmlnLCBzZXJ2ZXJLZXk6ICdtY3Bfc2VydmVycycgfTtcbn1cblxuLyoqIFBhcnNlIGEgSlNPTiBjb25maWcgZmlsZSBmb3IgYSBEb2xsaG91c2VNQ1Agc2VydmVyIGVudHJ5ICovXG5mdW5jdGlvbiBwYXJzZUpzb25Db25maWcocmF3OiBzdHJpbmcpOiBPbWl0PERldGVjdFJlc3VsdCwgJ2NvbmZpZ1BhdGgnPiB7XG4gIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KTtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydtY3BTZXJ2ZXJzJywgJ3NlcnZlcnMnXSkge1xuICAgIGlmIChwYXJzZWRba2V5XT8uZG9sbGhvdXNlbWNwKSB7XG4gICAgICByZXR1cm4geyBpbnN0YWxsZWQ6IHRydWUsIGN1cnJlbnRDb25maWc6IHBhcnNlZFtrZXldLmRvbGxob3VzZW1jcCwgc2VydmVyS2V5OiBrZXkgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgaW5zdGFsbGVkOiBmYWxzZSB9O1xufVxuXG4vKiogQ2hlY2sgYSBzaW5nbGUgY2xpZW50IGNvbmZpZyBmaWxlIGZvciBhbiBleGlzdGluZyBEb2xsaG91c2VNQ1AgZW50cnkgKi9cbmFzeW5jIGZ1bmN0aW9uIGRldGVjdENsaWVudChjbGllbnQ6IHN0cmluZyk6IFByb21pc2U8RGV0ZWN0UmVzdWx0IHwgbnVsbD4ge1xuICBjb25zdCBjb25maWdQYXRoID0gZ2V0Q29uZmlnUGF0aChjbGllbnQpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybiBudWxsO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYWNjZXNzKGNvbmZpZ1BhdGgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBpbnN0YWxsZWQ6IGZhbHNlLCBjb25maWdQYXRoIH07XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlYWRGaWxlKGNvbmZpZ1BhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZ1BhdGguZW5kc1dpdGgoJy50b21sJykgPyBwYXJzZVRvbWxDb25maWcocmF3KSA6IHBhcnNlSnNvbkNvbmZpZyhyYXcpO1xuICAgIHJldHVybiB7IGNvbmZpZ1BhdGgsIC4uLnJlc3VsdCB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBpbnN0YWxsZWQ6IGZhbHNlLCBjb25maWdQYXRoIH07XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgbm9ybWFsaXplIGEgY2xpZW50IG5hbWUgZnJvbSByZXF1ZXN0IGJvZHkuXG4gKiBSZXR1cm5zIHRoZSBub3JtYWxpemVkIGNsaWVudCBuYW1lIG9yIG51bGwgKHdpdGggZXJyb3IgcmVzcG9uc2Ugc2VudCkuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ2xpZW50KFxuICByZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIGFsbG93ZWRTZXQ6IFNldDxzdHJpbmc+LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHsgY2xpZW50IH0gPSByZXEuYm9keSBhcyB7IGNsaWVudD86IHN0cmluZyB9O1xuICBpZiAoIWNsaWVudCB8fCB0eXBlb2YgY2xpZW50ICE9PSAnc3RyaW5nJykge1xuICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6ICdNaXNzaW5nIHJlcXVpcmVkIGZpZWxkOiBjbGllbnQnIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShjbGllbnQpLm5vcm1hbGl6ZWRDb250ZW50LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICBpZiAoIWFsbG93ZWRTZXQuaGFzKG5vcm1hbGl6ZWQpKSB7XG4gICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe1xuICAgICAgZXJyb3I6IGBVbnN1cHBvcnRlZCBjbGllbnQ6ICR7Y2xpZW50fWAsXG4gICAgICBzdXBwb3J0ZWQ6IEFycmF5LmZyb20oYWxsb3dlZFNldCksXG4gICAgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbnR5cGUgUmVxdWVzdGVkSW5zdGFsbFZlcnNpb25SZXN1bHQgPVxuICB8IHsgZWZmZWN0aXZlVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkOyBlcnJvcjogbnVsbCB9XG4gIHwgeyBlZmZlY3RpdmVWZXJzaW9uOiBudWxsOyBlcnJvcjogc3RyaW5nIH07XG5cbmZ1bmN0aW9uIHJlc29sdmVSZXF1ZXN0ZWRJbnN0YWxsVmVyc2lvbihib2R5OiB1bmtub3duKTogUmVxdWVzdGVkSW5zdGFsbFZlcnNpb25SZXN1bHQge1xuICBjb25zdCB7IHZlcnNpb24sIGNoYW5uZWwgfSA9IChib2R5ID8/IHt9KSBhcyB7IHZlcnNpb24/OiBzdHJpbmc7IGNoYW5uZWw/OiBzdHJpbmcgfTtcbiAgY29uc3Qgbm9ybWFsaXplZFZlcnNpb24gPSB2ZXJzaW9uID8gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodmVyc2lvbikubm9ybWFsaXplZENvbnRlbnQgOiB1bmRlZmluZWQ7XG4gIGlmIChub3JtYWxpemVkVmVyc2lvbiAmJiAhL15cXGQrXFwuXFxkK1xcLlxcZCsvLnRlc3Qobm9ybWFsaXplZFZlcnNpb24pKSB7XG4gICAgcmV0dXJuIHsgZWZmZWN0aXZlVmVyc2lvbjogbnVsbCwgZXJyb3I6ICdJbnZhbGlkIHZlcnNpb24gZm9ybWF0LiBFeHBlY3RlZCBzZW12ZXIgKGUuZy4sIDIuMC4yKScgfTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRDaGFubmVsID0gY2hhbm5lbCA/IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGNoYW5uZWwpLm5vcm1hbGl6ZWRDb250ZW50IDogdW5kZWZpbmVkO1xuICBjb25zdCBlZmZlY3RpdmVWZXJzaW9uID0gbm9ybWFsaXplZENoYW5uZWwgJiYgQUxMT1dFRF9JTlNUQUxMX0NIQU5ORUxTLmhhcyhub3JtYWxpemVkQ2hhbm5lbCkgJiYgbm9ybWFsaXplZENoYW5uZWwgIT09ICdsYXRlc3QnXG4gICAgPyBub3JtYWxpemVkQ2hhbm5lbFxuICAgIDogbm9ybWFsaXplZFZlcnNpb247XG5cbiAgcmV0dXJuIHsgZWZmZWN0aXZlVmVyc2lvbiwgZXJyb3I6IG51bGwgfTtcbn1cblxuZnVuY3Rpb24gdG9Odm1NaXRpZ2F0aW9uQXBwbGllZChyZXN1bHQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgYXBwbHlOdm1MYXVuY2hlcklmTmVlZGVkPj4pOiBib29sZWFuIHwgbnVsbCB7XG4gIGlmIChyZXN1bHQgPT09ICdhcHBsaWVkJykgcmV0dXJuIHRydWU7XG4gIGlmIChyZXN1bHQgPT09ICdmYWlsZWQnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBudWxsO1xufVxuXG4vLyDilIDilIAgTGljZW5zZSB2ZXJpZmljYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IE1TX1BFUl9NSU5VVEUgPSA2MCAqIDEwMDA7XG5jb25zdCBWRVJJRklDQVRJT05fQ09ERV9UVExfTUlOVVRFUyA9IDEwO1xuY29uc3QgVkVSSUZJQ0FUSU9OX0NPREVfVFRMX01TID0gVkVSSUZJQ0FUSU9OX0NPREVfVFRMX01JTlVURVMgKiBNU19QRVJfTUlOVVRFO1xuY29uc3QgVkVSSUZJQ0FUSU9OX01BWF9BVFRFTVBUUyA9IDU7XG5jb25zdCBMSUNFTlNFX1dPUktFUl9USU1FT1VUX01TID0gOF8wMDA7XG5jb25zdCBMSUNFTlNFX1dPUktFUl9FUlJPUl9CT0RZX0xJTUlUID0gMzAwO1xuY29uc3QgREVGQVVMVF9MSUNFTlNFX1dPUktFUl9VUkwgPSAnaHR0cHM6Ly9kb2xsaG91c2VtY3AtbGljZW5zZS1lbWFpbC5taWNrLWViYS53b3JrZXJzLmRldic7XG5cbi8qKiBHZW5lcmF0ZSBhIGNyeXB0b2dyYXBoaWNhbGx5IHJhbmRvbSA2LWRpZ2l0IHZlcmlmaWNhdGlvbiBjb2RlLiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVWZXJpZmljYXRpb25Db2RlKCk6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmcocmFuZG9tSW50KDEwMDAwMCwgOTk5OTk5KSk7XG59XG5cbi8qKiBDaGVjayBpZiBhIHZlcmlmaWNhdGlvbiBjb2RlIGhhcyBleHBpcmVkLiAqL1xuZnVuY3Rpb24gaXNDb2RlRXhwaXJlZChleHBpcmVzQXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbmV3IERhdGUoZXhwaXJlc0F0KS5nZXRUaW1lKCkgPCBEYXRlLm5vdygpO1xufVxuXG4vLyDilIDilIAgTGljZW5zZSBoZWxwZXJzIChtb2R1bGUgc2NvcGUgZm9yIFNvbmFyQ2xvdWQgUzc3MjEpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5jb25zdCBWQUxJRF9MSUNFTlNFX1RJRVJTID0gbmV3IFNldChbJ2FncGwnLCAnZnJlZS1jb21tZXJjaWFsJywgJ3BhaWQtY29tbWVyY2lhbCddKTtcbmNvbnN0IFZBTElEX1JFVkVOVUVfU0NBTEVTID0gbmV3IFNldChbJyQxTeKAkyQ1TScsICckNU3igJMkMjVNJywgJyQyNU3igJMkMTAwTScsICckMTAwTSsnXSk7XG4vLyBTYWZlIGZyb20gUmVEb1M6IGlucHV0IGlzIHByZS1jaGVja2VkIHRvIOKJpDI1NCBjaGFycywgYW5kIHsxLDY0fS97MSwyNTN9L3syLDYzfVxuLy8gYm91bmRzIHByZXZlbnQgY2F0YXN0cm9waGljIGJhY2t0cmFja2luZyBvbiBhbnkgaW5wdXQgd2l0aGluIHRoYXQgbGVuZ3RoLlxuY29uc3QgRU1BSUxfUEFUVEVSTiA9IC9eW15cXHNAXXsxLDY0fUBbXlxcc0BdezEsMjUzfVxcLlteXFxzQF17Miw2M30kLztcblxuLyoqIFNhbml0aXplIGEgc3RyaW5nIGZpZWxkOiB0cmltLCB0cnVuY2F0ZSwgcmV0dXJuIHVuZGVmaW5lZCBpZiBlbXB0eS4gKi9cbmZ1bmN0aW9uIHNhbml0aXplKHZhbDogdW5rbm93biwgbWF4TGVuOiBudW1iZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbCAhPT0gJ3N0cmluZycgfHwgIXZhbC50cmltKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB2YWwudHJpbSgpLnNsaWNlKDAsIG1heExlbik7XG59XG5cbi8qKiBWYWxpZGF0ZSBlbWFpbCBmb3JtYXQgYW5kIGNvbW1lcmNpYWwgYWNrbm93bGVkZ21lbnRzLiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDb21tZXJjaWFsRmllbGRzKGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHsgZW1haWwsIHRlbGVtZXRyeUFja25vd2xlZGdlZCB9ID0gYm9keTtcbiAgaWYgKCFlbWFpbCB8fCB0eXBlb2YgZW1haWwgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuICdFbWFpbCBhZGRyZXNzIGlzIHJlcXVpcmVkIGZvciBDb21tZXJjaWFsIGFuZCBFbnRlcnByaXNlIGxpY2Vuc2VzJztcbiAgfVxuICBpZiAoZW1haWwubGVuZ3RoID4gMjU0IHx8ICFFTUFJTF9QQVRURVJOLnRlc3QoZW1haWwpKSB7XG4gICAgcmV0dXJuICdQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnO1xuICB9XG4gIGlmICghdGVsZW1ldHJ5QWNrbm93bGVkZ2VkKSB7XG4gICAgcmV0dXJuICdUZWxlbWV0cnkgYWNrbm93bGVkZ21lbnQgaXMgcmVxdWlyZWQgZm9yIENvbW1lcmNpYWwgYW5kIEVudGVycHJpc2UgbGljZW5zZXMnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogVmFsaWRhdGUgZnJlZS1jb21tZXJjaWFsIHNwZWNpZmljIGZpZWxkcy4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRnJlZUNvbW1lcmNpYWxGaWVsZHMoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyBhdHRyaWJ1dGlvbkFja25vd2xlZGdlZCwgcmV2ZW51ZUF0dGVzdGVkIH0gPSBib2R5O1xuICBpZiAoIWF0dHJpYnV0aW9uQWNrbm93bGVkZ2VkKSB7XG4gICAgcmV0dXJuICdBdHRyaWJ1dGlvbiBhY2tub3dsZWRnbWVudCBpcyByZXF1aXJlZCBmb3IgQ29tbWVyY2lhbCBsaWNlbnNlcyc7XG4gIH1cbiAgaWYgKCFyZXZlbnVlQXR0ZXN0ZWQpIHtcbiAgICByZXR1cm4gJ1JldmVudWUgYXR0ZXN0YXRpb24gaXMgcmVxdWlyZWQgZm9yIENvbW1lcmNpYWwgbGljZW5zZXMnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogVmFsaWRhdGUgZW50ZXJwcmlzZSBzcGVjaWZpYyBmaWVsZHMuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUVudGVycHJpc2VGaWVsZHMoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyByZXZlbnVlU2NhbGUsIGNvbXBhbnlOYW1lLCB1c2VDYXNlIH0gPSBib2R5O1xuICBpZiAoIXJldmVudWVTY2FsZSB8fCAhVkFMSURfUkVWRU5VRV9TQ0FMRVMuaGFzKHJldmVudWVTY2FsZSBhcyBzdHJpbmcpKSB7XG4gICAgcmV0dXJuIGBSZXZlbnVlIHNjYWxlIGlzIHJlcXVpcmVkLiBNdXN0IGJlIG9uZSBvZjogJHtbLi4uVkFMSURfUkVWRU5VRV9TQ0FMRVNdLmpvaW4oJywgJyl9YDtcbiAgfVxuICBpZiAoIWNvbXBhbnlOYW1lIHx8IHR5cGVvZiBjb21wYW55TmFtZSAhPT0gJ3N0cmluZycgfHwgIWNvbXBhbnlOYW1lLnRyaW0oKSkge1xuICAgIHJldHVybiAnQ29tcGFueSBuYW1lIGlzIHJlcXVpcmVkIGZvciBFbnRlcnByaXNlIGxpY2Vuc2VzJztcbiAgfVxuICBpZiAoIXVzZUNhc2UgfHwgdHlwZW9mIHVzZUNhc2UgIT09ICdzdHJpbmcnIHx8ICF1c2VDYXNlLnRyaW0oKSkge1xuICAgIHJldHVybiAnVXNlIGNhc2UgaXMgcmVxdWlyZWQgZm9yIEVudGVycHJpc2UgbGljZW5zZXMnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogVmFsaWRhdGUgbGljZW5zZSBmb3JtIGlucHV0LiBSZXR1cm5zIGVycm9yIHN0cmluZyBvciBudWxsIGlmIHZhbGlkLiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVMaWNlbnNlSW5wdXQoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyB0aWVyIH0gPSBib2R5O1xuICBpZiAoIXRpZXIgfHwgIVZBTElEX0xJQ0VOU0VfVElFUlMuaGFzKHRpZXIgYXMgc3RyaW5nKSkge1xuICAgIHJldHVybiBgSW52YWxpZCBsaWNlbnNlIHRpZXIuIE11c3QgYmUgb25lIG9mOiAke1suLi5WQUxJRF9MSUNFTlNFX1RJRVJTXS5qb2luKCcsICcpfWA7XG4gIH1cbiAgaWYgKHRpZXIgIT09ICdhZ3BsJykge1xuICAgIGNvbnN0IGNvbW1lcmNpYWxFcnJvciA9IHZhbGlkYXRlQ29tbWVyY2lhbEZpZWxkcyhib2R5KTtcbiAgICBpZiAoY29tbWVyY2lhbEVycm9yKSByZXR1cm4gY29tbWVyY2lhbEVycm9yO1xuICB9XG4gIGlmICh0aWVyID09PSAnZnJlZS1jb21tZXJjaWFsJykge1xuICAgIGNvbnN0IGZyZWVFcnJvciA9IHZhbGlkYXRlRnJlZUNvbW1lcmNpYWxGaWVsZHMoYm9keSk7XG4gICAgaWYgKGZyZWVFcnJvcikgcmV0dXJuIGZyZWVFcnJvcjtcbiAgfVxuICBpZiAodGllciA9PT0gJ3BhaWQtY29tbWVyY2lhbCcpIHtcbiAgICBjb25zdCBlbnRlcnByaXNlRXJyb3IgPSB2YWxpZGF0ZUVudGVycHJpc2VGaWVsZHMoYm9keSk7XG4gICAgaWYgKGVudGVycHJpc2VFcnJvcikgcmV0dXJuIGVudGVycHJpc2VFcnJvcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIEJ1aWxkIGxpY2Vuc2UgZGF0YSBvYmplY3QgZnJvbSB2YWxpZGF0ZWQgaW5wdXQuICovXG5mdW5jdGlvbiBidWlsZExpY2Vuc2VEYXRhKGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCB7IHRpZXIsIGVtYWlsLCByZXZlbnVlU2NhbGUsIGNvbXBhbnlOYW1lLCB1c2VDYXNlIH0gPSBib2R5O1xuICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgdGllciB9O1xuICBpZiAodGllciAhPT0gJ2FncGwnKSB7XG4gICAgZGF0YS5lbWFpbCA9IHNhbml0aXplKGVtYWlsLCAyNTQpO1xuICAgIGRhdGEuYXR0ZXN0ZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICBkYXRhLnRlbGVtZXRyeVJlcXVpcmVkID0gdHJ1ZTtcbiAgfVxuICBpZiAodGllciA9PT0gJ3BhaWQtY29tbWVyY2lhbCcpIHtcbiAgICBpZiAocmV2ZW51ZVNjYWxlKSBkYXRhLnJldmVudWVTY2FsZSA9IHJldmVudWVTY2FsZTtcbiAgICBpZiAoY29tcGFueU5hbWUpIGRhdGEuY29tcGFueU5hbWUgPSBzYW5pdGl6ZShjb21wYW55TmFtZSwgMjAwKTtcbiAgICBpZiAodXNlQ2FzZSkgZGF0YS51c2VDYXNlID0gc2FuaXRpemUodXNlQ2FzZSwgNTAwKTtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqIFNlbmQgbGljZW5zZV9hY3RpdmF0aW9uIGV2ZW50IHRvIFBvc3RIb2cgZm9yIGNvbW1lcmNpYWwgdGllcnMuICovXG5hc3luYyBmdW5jdGlvbiBjYXB0dXJlUG9zdEhvZ0xpY2Vuc2VFdmVudChsaWNlbnNlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcG9zdGhvZyA9IG5ldyBQb3N0SG9nKFBPU1RIT0dfUFJPSkVDVF9LRVksIHtcbiAgICBob3N0OiBwcm9jZXNzLmVudi5QT1NUSE9HX0hPU1QgfHwgJ2h0dHBzOi8vYXBwLnBvc3Rob2cuY29tJyxcbiAgICBmbHVzaEF0OiAxLFxuICAgIGZsdXNoSW50ZXJ2YWw6IDUwMDAsXG4gIH0pO1xuICBsZXQgaW5zdGFsbElkOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY29uc3QgaWRQYXRoID0gam9pbihob21lZGlyKCksICcuZG9sbGhvdXNlJywgJy50ZWxlbWV0cnktaWQnKTtcbiAgICBpbnN0YWxsSWQgPSAoYXdhaXQgcmVhZEZpbGUoaWRQYXRoLCAndXRmLTgnKSkudHJpbSgpO1xuICB9IGNhdGNoIHtcbiAgICBpbnN0YWxsSWQgPSB1dWlkdjQoKTtcbiAgfVxuICBjb25zdCBldmVudFR5cGUgPSAobGljZW5zZURhdGEuZXZlbnRUeXBlIGFzIHN0cmluZykgPz8gJ2FjdGl2YXRpb24nO1xuICBwb3N0aG9nLmNhcHR1cmUoe1xuICAgIGRpc3RpbmN0SWQ6IGluc3RhbGxJZCxcbiAgICBldmVudDogJ2xpY2Vuc2VfYWN0aXZhdGlvbicsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgdGllcjogbGljZW5zZURhdGEudGllcixcbiAgICAgIGVtYWlsOiBsaWNlbnNlRGF0YS5lbWFpbCxcbiAgICAgIGV2ZW50X3R5cGU6IGV2ZW50VHlwZSxcbiAgICAgIHNlcnZlcl92ZXJzaW9uOiBQQUNLQUdFX1ZFUlNJT04sXG4gICAgICBvczogcGxhdGZvcm0oKSxcbiAgICAgIC4uLihldmVudFR5cGUgPT09ICd2ZXJpZmljYXRpb24nID8ge1xuICAgICAgICB2ZXJpZmljYXRpb25fY29kZTogbGljZW5zZURhdGEudmVyaWZpY2F0aW9uQ29kZSxcbiAgICAgIH0gOiB7fSksXG4gICAgICAuLi4oZXZlbnRUeXBlID09PSAnYWN0aXZhdGlvbicgPyB7XG4gICAgICAgIHZlcmlmaWNhdGlvbl90aW1lX21zOiBsaWNlbnNlRGF0YS52ZXJpZmljYXRpb25fdGltZV9tcyxcbiAgICAgICAgdmVyaWZpY2F0aW9uX3RpbWVfc2Vjb25kczogbGljZW5zZURhdGEudmVyaWZpY2F0aW9uX3RpbWVfbXNcbiAgICAgICAgICA/IE1hdGgucm91bmQoKGxpY2Vuc2VEYXRhLnZlcmlmaWNhdGlvbl90aW1lX21zIGFzIG51bWJlcikgLyAxMDAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdmVyaWZpY2F0aW9uX2F0dGVtcHRzOiBsaWNlbnNlRGF0YS52ZXJpZmljYXRpb25fYXR0ZW1wdHMsXG4gICAgICB9IDoge30pLFxuICAgICAgLi4uKGxpY2Vuc2VEYXRhLnRpZXIgPT09ICdwYWlkLWNvbW1lcmNpYWwnID8ge1xuICAgICAgICByZXZlbnVlX3NjYWxlOiBsaWNlbnNlRGF0YS5yZXZlbnVlU2NhbGUsXG4gICAgICAgIGNvbXBhbnlfbmFtZTogbGljZW5zZURhdGEuY29tcGFueU5hbWUsXG4gICAgICAgIHVzZV9jYXNlOiBsaWNlbnNlRGF0YS51c2VDYXNlLFxuICAgICAgfSA6IHt9KSxcbiAgICB9LFxuICB9KTtcbiAgYXdhaXQgcG9zdGhvZy5zaHV0ZG93bigpO1xufVxuXG5mdW5jdGlvbiBidWlsZExpY2Vuc2VXb3JrZXJSZXF1ZXN0Qm9keShcbiAgbGljZW5zZURhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB2ZXJpZmljYXRpb25Db2RlOiBzdHJpbmcsXG4gIGRpc3RpbmN0SWQ6IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgZXZlbnQ6ICdsaWNlbnNlX2FjdGl2YXRpb24nLFxuICAgIGRpc3RpbmN0X2lkOiBkaXN0aW5jdElkLFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHRpZXI6IGxpY2Vuc2VEYXRhLnRpZXIsXG4gICAgICBlbWFpbDogbGljZW5zZURhdGEuZW1haWwsXG4gICAgICBldmVudF90eXBlOiAndmVyaWZpY2F0aW9uJyxcbiAgICAgIHZlcmlmaWNhdGlvbl9jb2RlOiB2ZXJpZmljYXRpb25Db2RlLFxuICAgICAgc2VydmVyX3ZlcnNpb246IFBBQ0tBR0VfVkVSU0lPTixcbiAgICAgIG9zOiBwbGF0Zm9ybSgpLFxuICAgIH0sXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZW5kTGljZW5zZVdvcmtlclZlcmlmaWNhdGlvbkVtYWlsKFxuICBsaWNlbnNlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHZlcmlmaWNhdGlvbkNvZGU6IHN0cmluZyxcbiAgZGlzdGluY3RJZDogc3RyaW5nLFxuKTogUHJvbWlzZTx7IG9rOiB0cnVlIH0gfCB7IG9rOiBmYWxzZTsgc3RhdHVzPzogbnVtYmVyOyBlcnJvcjogc3RyaW5nOyByZXNwb25zZUJvZHk/OiBzdHJpbmcgfT4ge1xuICBjb25zdCB3b3JrZXJVcmwgPSBuZXcgVVJMKExJQ0VOU0VfV09SS0VSX0RJUkVDVF9QQVRILCBwcm9jZXNzLmVudi5ET0xMSE9VU0VfTElDRU5TRV9XT1JLRVJfVVJMIHx8IERFRkFVTFRfTElDRU5TRV9XT1JLRVJfVVJMKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2god29ya2VyVXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0sXG4gICAgICBib2R5OiBidWlsZExpY2Vuc2VXb3JrZXJSZXF1ZXN0Qm9keShsaWNlbnNlRGF0YSwgdmVyaWZpY2F0aW9uQ29kZSwgZGlzdGluY3RJZCksXG4gICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoTElDRU5TRV9XT1JLRVJfVElNRU9VVF9NUyksXG4gICAgfSk7XG5cbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHJldHVybiB7IG9rOiB0cnVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgZXJyb3I6IGB3b3JrZXJfaHR0cF8ke3Jlc3BvbnNlLnN0YXR1c31gLFxuICAgICAgcmVzcG9uc2VCb2R5OiAoYXdhaXQgcmVzcG9uc2UudGV4dCgpKS5zbGljZSgwLCBMSUNFTlNFX1dPUktFUl9FUlJPUl9CT0RZX0xJTUlUKSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICAgIChlcnJvci5uYW1lID09PSAnVGltZW91dEVycm9yJyB8fFxuICAgICAgICBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicgfHxcbiAgICAgICAgZXJyb3IubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCd0aW1lb3V0JykgfHxcbiAgICAgICAgZXJyb3IubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCd0aW1lZCBvdXQnKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6ICd3b3JrZXJfdGltZW91dCcgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRMaWNlbnNlV29ya2VyRmFpbHVyZU1lc3NhZ2UocmVzdWx0OiB7IHN0YXR1cz86IG51bWJlcjsgZXJyb3I6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDQwMSB8fCByZXN1bHQuc3RhdHVzID09PSA0MDMpIHtcbiAgICByZXR1cm4gJ1ZlcmlmaWNhdGlvbiBlbWFpbCBzZXJ2aWNlIHJlamVjdGVkIHRoZSByZXF1ZXN0LiBQbGVhc2UgY2hlY2sgdGhlIGxvY2FsIGVtYWlsIGRlbGl2ZXJ5IGNvbmZpZ3VyYXRpb24gYW5kIHRyeSBhZ2Fpbi4nO1xuICB9XG4gIGlmIChyZXN1bHQuZXJyb3IgPT09ICd3b3JrZXJfdGltZW91dCcpIHtcbiAgICByZXR1cm4gJ1ZlcmlmaWNhdGlvbiBlbWFpbCBzZXJ2aWNlIHRpbWVkIG91dC4gUGxlYXNlIHRyeSBhZ2FpbiBpbiBhIG1vbWVudC4nO1xuICB9XG4gIHJldHVybiAnV2UgY291bGQgbm90IHNlbmQgdGhlIHZlcmlmaWNhdGlvbiBlbWFpbCByaWdodCBub3cuIFBsZWFzZSB0cnkgYWdhaW4gaW4gYSBtb21lbnQuJztcbn1cblxuZnVuY3Rpb24gbG9nTGljZW5zZVdvcmtlckRlbGl2ZXJ5RmFpbHVyZShcbiAgbWVzc2FnZTogc3RyaW5nLFxuICBsaWNlbnNlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGRlbGl2ZXJ5UmVzdWx0OiB7IHN0YXR1cz86IG51bWJlcjsgZXJyb3I6IHN0cmluZzsgcmVzcG9uc2VCb2R5Pzogc3RyaW5nIH0sXG4pOiB2b2lkIHtcbiAgbG9nZ2VyLmVycm9yKG1lc3NhZ2UsIHtcbiAgICB0aWVyOiBsaWNlbnNlRGF0YS50aWVyLFxuICAgIHN0YXR1czogZGVsaXZlcnlSZXN1bHQuc3RhdHVzID8/IG51bGwsXG4gICAgZXJyb3I6IGRlbGl2ZXJ5UmVzdWx0LmVycm9yLFxuICAgIHJlc3BvbnNlQm9keUxlbmd0aDogZGVsaXZlcnlSZXN1bHQucmVzcG9uc2VCb2R5Py5sZW5ndGggPz8gMCxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZXR1cFJvdXRlcyhvcHRzPzoge1xuICAvKiogT3ZlcnJpZGUgaW5zdGFsbC1tY3AgcnVubmVyLiBGb3IgdGVzdGluZyBvbmx5IOKAlCBwcmVmaXggc2lnbmFscyB0ZXN0LW9ubHkgdXNlLiAqL1xuICBfcnVuSW5zdGFsbE1jcD86IChjbGllbnQ6IHN0cmluZywgdmVyc2lvbj86IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xuICAvKiogT3ZlcnJpZGUgcGVybWlzc2lvbiBob29rIGluc3RhbGxlci4gRm9yIHRlc3Rpbmcgb25seS4gKi9cbiAgX2luc3RhbGxQZXJtaXNzaW9uSG9vaz86IChjbGllbnQ6IHN0cmluZykgPT4gUHJvbWlzZTxJbnN0YWxsUGVybWlzc2lvbkhvb2tSZXN1bHQ+O1xuICAvKiogT3ZlcnJpZGUgcGVybWlzc2lvbiBob29rIHN0YXR1cyByZWNvbmNpbGVyLiBGb3IgdGVzdGluZyBvbmx5LiAqL1xuICBfcmVjb25jaWxlUGVybWlzc2lvbkhvb2tTdGF0dXM/OiAoY2xpZW50OiBzdHJpbmcpID0+IFByb21pc2U8UGVybWlzc2lvbkhvb2tTdGF0dXM+O1xuICAvKiogRW5hYmxlIGF1dG9tYXRpYyBob29rIGFzc2V0IHJlcGFpciBkdXJpbmcgZGV0ZWN0LiBEZWZhdWx0cyBvZmYgaW4gdGVzdHMuICovXG4gIF9hdXRvUmVwYWlyUGVybWlzc2lvbkhvb2tzT25EZXRlY3Q/OiBib29sZWFuO1xuICAvKiogU2tpcCB0aGUgc2xpZGluZy13aW5kb3cgcmF0ZSBsaW1pdGVyLiBGb3IgdGVzdGluZyBvbmx5LiAqL1xuICBfc2tpcFJhdGVMaW1pdD86IGJvb2xlYW47XG59KToge1xuICBpbnN0YWxsSGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgb3BlbkNvbmZpZ0hhbmRsZXI6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IFByb21pc2U8dm9pZD47XG4gIHZlcnNpb25IYW5kbGVyOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBtY3BiUmVkaXJlY3RIYW5kbGVyOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBkZXRlY3RIYW5kbGVyOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBnZXRMaWNlbnNlSGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgc2V0TGljZW5zZUhhbmRsZXI6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IFByb21pc2U8dm9pZD47XG4gIHZlcmlmeUxpY2Vuc2VIYW5kbGVyOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZXNlbmRWZXJpZmljYXRpb25IYW5kbGVyOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+O1xufSB7XG4gIGNvbnN0IGluc3RhbGxlciA9IG9wdHM/Ll9ydW5JbnN0YWxsTWNwID8/IHJ1bkluc3RhbGxNY3A7XG4gIGNvbnN0IHBlcm1pc3Npb25Ib29rSW5zdGFsbGVyID0gb3B0cz8uX2luc3RhbGxQZXJtaXNzaW9uSG9vayA/PyBpbnN0YWxsUGVybWlzc2lvbkhvb2s7XG4gIGNvbnN0IGF1dG9SZXBhaXJQZXJtaXNzaW9uSG9va3NPbkRldGVjdCA9IG9wdHM/Ll9hdXRvUmVwYWlyUGVybWlzc2lvbkhvb2tzT25EZXRlY3QgPz8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0JztcbiAgY29uc3QgaG9va1N0YXR1c1JlY29uY2lsZXIgPSBvcHRzPy5fcmVjb25jaWxlUGVybWlzc2lvbkhvb2tTdGF0dXMgPz8gKGFzeW5jIChjbGllbnQ6IHN0cmluZykgPT5cbiAgICByZWNvbmNpbGVQZXJtaXNzaW9uSG9va1N0YXR1cyhjbGllbnQsIHsgYXV0b1JlcGFpcjogYXV0b1JlcGFpclBlcm1pc3Npb25Ib29rc09uRGV0ZWN0IH0pKTtcbiAgY29uc3Qgc2tpcFJhdGVMaW1pdCA9IG9wdHM/Ll9za2lwUmF0ZUxpbWl0ID8/IGZhbHNlO1xuICAvLyDilIDilIAgRGV0ZWN0IGV4aXN0aW5nIGluc3RhbGxhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGNvbnN0IGRldGVjdEhhbmRsZXIgPSBhc3luYyAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGNsaWVudHMgPSBbXG4gICAgICB7IGlkOiAnY2xhdWRlJywgbmFtZTogJ0NsYXVkZSBEZXNrdG9wJyB9LFxuICAgICAgeyBpZDogJ2NsYXVkZS1jb2RlJywgbmFtZTogJ0NsYXVkZSBDb2RlJyB9LFxuICAgICAgeyBpZDogJ2N1cnNvcicsIG5hbWU6ICdDdXJzb3InIH0sXG4gICAgICB7IGlkOiAndnNjb2RlJywgbmFtZTogJ1ZTIENvZGUnIH0sXG4gICAgICB7IGlkOiAnY2xpbmUnLCBuYW1lOiAnQ2xpbmUnIH0sXG4gICAgICB7IGlkOiAnd2luZHN1cmYnLCBuYW1lOiAnV2luZHN1cmYnIH0sXG4gICAgICB7IGlkOiAnbG1zdHVkaW8nLCBuYW1lOiAnTE0gU3R1ZGlvJyB9LFxuICAgICAgeyBpZDogJ2dlbWluaS1jbGknLCBuYW1lOiAnR2VtaW5pIENMSScgfSxcbiAgICAgIHsgaWQ6ICdjb2RleCcsIG5hbWU6ICdDb2RleCcgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgcmVzdWx0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRzLm1hcChhc3luYyAoeyBpZCwgbmFtZSB9KSA9PiB7XG4gICAgICBjb25zdCBkZXRlY3Rpb24gPSBhd2FpdCBkZXRlY3RDbGllbnQoaWQpO1xuICAgICAgaWYgKGRldGVjdGlvbikge1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgc3VwcG9ydDogeyBsZXZlbDogU0VUVVBfU1VQUE9SVF9MRVZFTFNbaWRdIH0sXG4gICAgICAgICAgLi4uZGV0ZWN0aW9uLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoaWQgPT09ICdjbGF1ZGUtY29kZScgfHwgaWQgPT09ICdjdXJzb3InIHx8IGlkID09PSAndnNjb2RlJyB8fCBpZCA9PT0gJ3dpbmRzdXJmJyB8fCBpZCA9PT0gJ2dlbWluaS1jbGknIHx8IGlkID09PSAnY29kZXgnKSB7XG4gICAgICAgICAgY29uc3QgaG9va1N0YXR1cyA9IGF3YWl0IGhvb2tTdGF0dXNSZWNvbmNpbGVyKGlkKTtcbiAgICAgICAgICByZXN1bHQuaG9va0luc3RhbGxlZCA9IGhvb2tTdGF0dXMuaW5zdGFsbGVkO1xuICAgICAgICAgIHJlc3VsdC5ob29rQXNzZXRzUHJlcGFyZWQgPSBob29rU3RhdHVzLmFzc2V0c1ByZXBhcmVkO1xuICAgICAgICAgIHJlc3VsdC5ob29rQXNzZXRzQ3VycmVudCA9IGhvb2tTdGF0dXMuYXNzZXRzQ3VycmVudDtcbiAgICAgICAgICByZXN1bHQuaG9va0F1dG9SZXBhaXJlZCA9IGhvb2tTdGF0dXMuYXV0b1JlcGFpcmVkO1xuICAgICAgICAgIHJlc3VsdC5ob29rTmVlZHNSZXBhaXIgPSBob29rU3RhdHVzLm5lZWRzUmVwYWlyO1xuICAgICAgICAgIHJlc3VsdC5ob29rUmVwYWlyRXJyb3IgPSBob29rU3RhdHVzLnJlcGFpckVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdHNbaWRdID0gcmVzdWx0O1xuICAgICAgfVxuICAgIH0pKTtcblxuICAgIHJlcy5qc29uKHJlc3VsdHMpO1xuICB9O1xuXG4gIC8vIOKUgOKUgCBPcGVuIGNvbmZpZyBmaWxlIGluIGVkaXRvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29uc3Qgb3BlbkNvbmZpZ0hhbmRsZXIgPSBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENsaWVudCA9IHZhbGlkYXRlQ2xpZW50KHJlcSwgcmVzLCBPUEVOQUJMRV9DTElFTlRTKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWRDbGllbnQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBnZXRDb25maWdQYXRoKG5vcm1hbGl6ZWRDbGllbnQpO1xuICAgIGlmICghY29uZmlnUGF0aCkge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogYENvbmZpZyBwYXRoIHVua25vd24gZm9yOiAke25vcm1hbGl6ZWRDbGllbnR9YCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIGZpbGUgd2l0aCBlbXB0eSBjb250ZW50IGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFjY2Vzcyhjb25maWdQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoY29uZmlnUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gY29uZmlnUGF0aC5lbmRzV2l0aCgnLnRvbWwnKSA/ICcnIDogJ3t9JztcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKGNvbmZpZ1BhdGgsIGNvbnRlbnQgKyAnXFxuJywgJ3V0Zi04Jyk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIENyZWF0ZWQgZW1wdHkgY29uZmlnOiAke2NvbmZpZ1BhdGh9YCk7XG4gICAgICB9IGNhdGNoIChta0Vycikge1xuICAgICAgICBjb25zdCBtc2cgPSBta0VyciBpbnN0YW5jZW9mIEVycm9yID8gbWtFcnIubWVzc2FnZSA6IFN0cmluZyhta0Vycik7XG4gICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgZXJyb3I6IGBDb3VsZCBub3QgY3JlYXRlIGNvbmZpZyBmaWxlOiAke21zZ31gIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oYFtTZXR1cF0gT3BlbmluZyBjb25maWcgZm9yICR7bm9ybWFsaXplZENsaWVudH06ICR7Y29uZmlnUGF0aH1gKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBvcGVuSW5FZGl0b3IoY29uZmlnUGF0aCk7XG4gICAgICByZXMuanNvbih7IHN1Y2Nlc3M6IHRydWUsIHBhdGg6IGNvbmZpZ1BhdGggfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IG1lc3NhZ2UsIHBhdGg6IGNvbmZpZ1BhdGggfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIOKUgOKUgCBBdXRvLWluc3RhbGwgdmlhIGluc3RhbGwtbWNwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjb25zdCBpbnN0YWxsSGFuZGxlciA9IGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoIXNraXBSYXRlTGltaXQgJiYgIWluc3RhbGxMaW1pdGVyLnRyeUFjcXVpcmUoKSkge1xuICAgICAgcmVzLnN0YXR1cyg0MjkpLmpzb24oeyBlcnJvcjogJ1RvbyBtYW55IGluc3RhbGwgcmVxdWVzdHMuIFRyeSBhZ2FpbiBpbiBhIG1pbnV0ZS4nIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRDbGllbnQgPSB2YWxpZGF0ZUNsaWVudChyZXEsIHJlcywgQUxMT1dFRF9DTElFTlRTKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWRDbGllbnQpIHJldHVybjtcblxuICAgIGNvbnN0IHsgZWZmZWN0aXZlVmVyc2lvbiwgZXJyb3IgfSA9IHJlc29sdmVSZXF1ZXN0ZWRJbnN0YWxsVmVyc2lvbihyZXEuYm9keSk7XG4gICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhZyA9IGVmZmVjdGl2ZVZlcnNpb24gPyBgQCR7ZWZmZWN0aXZlVmVyc2lvbn1gIDogJ0BsYXRlc3QnO1xuICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIEluc3RhbGxpbmcgRG9sbGhvdXNlTUNQJHt0YWd9IHRvIGNsaWVudDogJHtub3JtYWxpemVkQ2xpZW50fWApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IG5vcm1hbGl6ZWRDbGllbnQgPT09ICdsbXN0dWRpbydcbiAgICAgICAgPyBhd2FpdCBpbnN0YWxsTG1TdHVkaW9Db25maWcoZWZmZWN0aXZlVmVyc2lvbilcbiAgICAgICAgOiBhd2FpdCBpbnN0YWxsZXIobm9ybWFsaXplZENsaWVudCwgZWZmZWN0aXZlVmVyc2lvbik7XG4gICAgICBsb2dnZXIuaW5mbyhgW1NldHVwXSBTdWNjZXNzZnVsbHkgaW5zdGFsbGVkIHRvICR7bm9ybWFsaXplZENsaWVudH1gKTtcblxuICAgICAgLy8gQmVzdC1lZmZvcnQgTlZNIG1pdGlnYXRpb24gKG1hY09TL0xpbnV4IG9ubHkpLlxuICAgICAgLy8gRXh0cmFjdGVkIGludG8gYXBwbHlOdm1MYXVuY2hlcklmTmVlZGVkIHRvIGtlZXAgdGhpcyBoYW5kbGVyJ3NcbiAgICAgIC8vIGNvZ25pdGl2ZSBjb21wbGV4aXR5IHdpdGhpbiBib3VuZHMgKFNvbmFyQ2xvdWQgUzM3NzYpLlxuICAgICAgY29uc3QgbnZtUmVzdWx0ID0gYXdhaXQgYXBwbHlOdm1MYXVuY2hlcklmTmVlZGVkKG5vcm1hbGl6ZWRDbGllbnQpO1xuXG4gICAgICBjb25zdCBudm1NaXRpZ2F0aW9uQXBwbGllZCA9IHRvTnZtTWl0aWdhdGlvbkFwcGxpZWQobnZtUmVzdWx0KTtcblxuICAgICAgY29uc3QgaG9va0luc3RhbGwgPSBhd2FpdCBwZXJtaXNzaW9uSG9va0luc3RhbGxlcihub3JtYWxpemVkQ2xpZW50KTtcblxuICAgICAgcmVzLmpzb24oe1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBvdXRwdXQsXG4gICAgICAgIGNsaWVudDogbm9ybWFsaXplZENsaWVudCxcbiAgICAgICAgdmVyc2lvbjogZWZmZWN0aXZlVmVyc2lvbiB8fCAnbGF0ZXN0JyxcbiAgICAgICAgbnZtTWl0aWdhdGlvbkFwcGxpZWQsXG4gICAgICAgIGhvb2tJbnN0YWxsLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgbG9nZ2VyLndhcm4oYFtTZXR1cF0gSW5zdGFsbCBmYWlsZWQgZm9yICR7bm9ybWFsaXplZENsaWVudH06ICR7bWVzc2FnZX1gKTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBtZXNzYWdlLCBjbGllbnQ6IG5vcm1hbGl6ZWRDbGllbnQgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIOKUgOKUgCBWZXJzaW9uIGluZm8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGNvbnN0IHZlcnNpb25IYW5kbGVyID0gYXN5bmMgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBsb2NhbCA9IHtcbiAgICAgIHZlcnNpb246IFBBQ0tBR0VfVkVSU0lPTixcbiAgICAgIG1jcGJVcmw6IGBodHRwczovL2dpdGh1Yi5jb20vJHtHSVRIVUJfUkVQT30vcmVsZWFzZXMvZG93bmxvYWQvdiR7UEFDS0FHRV9WRVJTSU9OfS9kb2xsaG91c2VtY3AtJHtQQUNLQUdFX1ZFUlNJT059Lm1jcGJgLFxuICAgIH07XG5cbiAgICAvLyBRdWVyeSBHaXRIdWIgZm9yIHRoZSBhY3R1YWwgbGF0ZXN0IHJlbGVhc2VcbiAgICBsZXQgbGF0ZXN0ID0gbG9jYWw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdoUmVzID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtHSVRIVUJfUkVQT30vcmVsZWFzZXMvbGF0ZXN0YCwge1xuICAgICAgICBoZWFkZXJzOiB7ICdBY2NlcHQnOiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uJywgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLVNldHVwJyB9LFxuICAgICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoNTAwMCksXG4gICAgICB9KTtcbiAgICAgIGlmIChnaFJlcy5vaykge1xuICAgICAgICBjb25zdCByZWxlYXNlID0gYXdhaXQgZ2hSZXMuanNvbigpIGFzIHsgdGFnX25hbWU6IHN0cmluZzsgYXNzZXRzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgYnJvd3Nlcl9kb3dubG9hZF91cmw6IHN0cmluZyB9PiB9O1xuICAgICAgICBjb25zdCBtY3BiQXNzZXQgPSByZWxlYXNlLmFzc2V0cy5maW5kKGEgPT4gTUNQQl9BU1NFVF9QQVRURVJOLnRlc3QoYS5uYW1lKSk7XG4gICAgICAgIGxhdGVzdCA9IHtcbiAgICAgICAgICB2ZXJzaW9uOiByZWxlYXNlLnRhZ19uYW1lLnJlcGxhY2UoL152LywgJycpLFxuICAgICAgICAgIG1jcGJVcmw6IG1jcGJBc3NldD8uYnJvd3Nlcl9kb3dubG9hZF91cmwgfHxcbiAgICAgICAgICAgIGBodHRwczovL2dpdGh1Yi5jb20vJHtHSVRIVUJfUkVQT30vcmVsZWFzZXMvZG93bmxvYWQvJHtyZWxlYXNlLnRhZ19uYW1lfS9kb2xsaG91c2VtY3AtJHtyZWxlYXNlLnRhZ19uYW1lLnJlcGxhY2UoL152LywgJycpfS5tY3BiYCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEdpdEh1YiB1bnJlYWNoYWJsZSDigJQgdXNlIGxvY2FsIHZlcnNpb24gaW5mb1xuICAgIH1cblxuICAgIHJlcy5qc29uKHtcbiAgICAgIHJ1bm5pbmc6IGxvY2FsLFxuICAgICAgbGF0ZXN0LFxuICAgICAgaXNMYXRlc3Q6IGxvY2FsLnZlcnNpb24gPT09IGxhdGVzdC52ZXJzaW9uLFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIOKUgOKUgCAubWNwYiBkb3dubG9hZCByZWRpcmVjdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29uc3QgbWNwYlJlZGlyZWN0SGFuZGxlciA9IGFzeW5jIChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgLy8gVHJ5IEdpdEh1YiBBUEkgZm9yIHRoZSBhY3R1YWwgbGF0ZXN0IC5tY3BiIGFzc2V0IFVSTFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBnaFJlcyA9IGF3YWl0IGZldGNoKGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7R0lUSFVCX1JFUE99L3JlbGVhc2VzL2xhdGVzdGAsIHtcbiAgICAgICAgaGVhZGVyczogeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbicsICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC1TZXR1cCcgfSxcbiAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDUwMDApLFxuICAgICAgfSk7XG4gICAgICBpZiAoZ2hSZXMub2spIHtcbiAgICAgICAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IGdoUmVzLmpzb24oKSBhcyB7IHRhZ19uYW1lOiBzdHJpbmc7IGFzc2V0czogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGJyb3dzZXJfZG93bmxvYWRfdXJsOiBzdHJpbmcgfT4gfTtcbiAgICAgICAgY29uc3QgbWNwYkFzc2V0ID0gcmVsZWFzZS5hc3NldHMuZmluZChhID0+IE1DUEJfQVNTRVRfUEFUVEVSTi50ZXN0KGEubmFtZSkpO1xuICAgICAgICBpZiAobWNwYkFzc2V0KSB7XG4gICAgICAgICAgcmVzLnJlZGlyZWN0KG1jcGJBc3NldC5icm93c2VyX2Rvd25sb2FkX3VybCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGYWxsIHRocm91Z2ggdG8gY29uc3RydWN0ZWQgVVJMXG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2s6IGNvbnN0cnVjdCBVUkwgZnJvbSBydW5uaW5nIHZlcnNpb25cbiAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7R0lUSFVCX1JFUE99L3JlbGVhc2VzL2Rvd25sb2FkL3Yke1BBQ0tBR0VfVkVSU0lPTn0vZG9sbGhvdXNlbWNwLSR7UEFDS0FHRV9WRVJTSU9OfS5tY3BiYDtcbiAgICByZXMucmVkaXJlY3QodXJsKTtcbiAgfTtcblxuICAvLyDilIDilIAgTGljZW5zZSBzZWxlY3Rpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGNvbnN0IGxpY2Vuc2VDb25maWdQYXRoID0gam9pbihob21lZGlyKCksICcuZG9sbGhvdXNlJywgJ2xpY2Vuc2UuanNvbicpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlYWRMaWNlbnNlKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gYXdhaXQgcmVhZEZpbGUobGljZW5zZUNvbmZpZ1BhdGgsICd1dGYtOCcpO1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmF3KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IHRpZXI6ICdhZ3BsJyB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHdyaXRlTGljZW5zZShkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRpciA9IGpvaW4oaG9tZWRpcigpLCAnLmRvbGxob3VzZScpO1xuICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGxpY2Vuc2VDb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgfVxuXG4gIGNvbnN0IGdldExpY2Vuc2VIYW5kbGVyID0gYXN5bmMgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBsaWNlbnNlID0gYXdhaXQgcmVhZExpY2Vuc2UoKTtcbiAgICAvLyBOZXZlciBleHBvc2UgdmVyaWZpY2F0aW9uIGludGVybmFscyB0byBjbGllbnRcbiAgICBjb25zdCB7IHZlcmlmaWNhdGlvbkNvZGU6IF9jb2RlLCB2ZXJpZmljYXRpb25BdHRlbXB0czogX2F0dGVtcHRzLCAuLi5wdWJsaWNMaWNlbnNlIH0gPSBsaWNlbnNlO1xuICAgIHJlcy5qc29uKHB1YmxpY0xpY2Vuc2UpO1xuICB9O1xuXG4gIGNvbnN0IGxpY2Vuc2VSYXRlTGltaXRlciA9IG5ldyBTbGlkaW5nV2luZG93UmF0ZUxpbWl0ZXIoNSwgNjBfMDAwKTsgLy8gNSByZXF1ZXN0cy9taW51dGVcblxuICBjb25zdCBzZXRMaWNlbnNlSGFuZGxlciA9IGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoIWxpY2Vuc2VSYXRlTGltaXRlci50cnlBY3F1aXJlKCkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ3NldHVwUm91dGVzLnNldExpY2Vuc2VIYW5kbGVyJyxcbiAgICAgICAgZGV0YWlsczogJ0xpY2Vuc2UgZW5kcG9pbnQgcmF0ZSBsaW1pdCBleGNlZWRlZCAoNSByZXEvbWluKScsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zdGF0dXMoNDI5KS5qc29uKHsgZXJyb3I6ICdUb28gbWFueSBsaWNlbnNlIHJlcXVlc3RzLiBQbGVhc2UgdHJ5IGFnYWluIGluIGEgbWludXRlLicgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IHJlcS5ib2R5ID8/IHt9O1xuICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvciA9IHZhbGlkYXRlTGljZW5zZUlucHV0KGJvZHkpO1xuICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6IHZhbGlkYXRpb25FcnJvciB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaWNlbnNlRGF0YSA9IGJ1aWxkTGljZW5zZURhdGEoYm9keSk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKGxpY2Vuc2VEYXRhLnRpZXIgPT09ICdhZ3BsJykge1xuICAgICAgICAvLyBBR1BMOiBhY3RpdmF0ZSBpbW1lZGlhdGVseSwgbm8gdmVyaWZpY2F0aW9uIG5lZWRlZFxuICAgICAgICBsaWNlbnNlRGF0YS5zdGF0dXMgPSAnYWN0aXZlJztcbiAgICAgICAgYXdhaXQgd3JpdGVMaWNlbnNlKGxpY2Vuc2VEYXRhKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1tTZXR1cF0gTGljZW5zZSBzZXQgdG8gQUdQTCAoYWN0aXZlLCBubyB2ZXJpZmljYXRpb24pJyk7XG4gICAgICAgIHJlcy5qc29uKHsgc3VjY2VzczogdHJ1ZSwgbGljZW5zZTogbGljZW5zZURhdGEgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQ29tbWVyY2lhbCB0aWVyczogc2F2ZSBhcyBwZW5kaW5nLCBnZW5lcmF0ZSB2ZXJpZmljYXRpb24gY29kZVxuICAgICAgY29uc3QgY29kZSA9IGdlbmVyYXRlVmVyaWZpY2F0aW9uQ29kZSgpO1xuICAgICAgbGljZW5zZURhdGEuc3RhdHVzID0gJ3BlbmRpbmcnO1xuICAgICAgbGljZW5zZURhdGEudmVyaWZpY2F0aW9uQ29kZSA9IGNvZGU7XG4gICAgICBsaWNlbnNlRGF0YS52ZXJpZmljYXRpb25FeHBpcnkgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgVkVSSUZJQ0FUSU9OX0NPREVfVFRMX01TKS50b0lTT1N0cmluZygpO1xuICAgICAgbGljZW5zZURhdGEudmVyaWZpY2F0aW9uQXR0ZW1wdHMgPSAwO1xuICAgICAgbGljZW5zZURhdGEudmVyaWZpY2F0aW9uUmVxdWVzdGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBhd2FpdCB3cml0ZUxpY2Vuc2UobGljZW5zZURhdGEpO1xuXG4gICAgICBsb2dnZXIuaW5mbyhgW1NldHVwXSBMaWNlbnNlIHBlbmRpbmcgdmVyaWZpY2F0aW9uOiAke2xpY2Vuc2VEYXRhLnRpZXJ9YCk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0NPTkZJR19VUERBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdzZXR1cFJvdXRlcy5zZXRMaWNlbnNlSGFuZGxlcicsXG4gICAgICAgIGRldGFpbHM6IGBMaWNlbnNlIHZlcmlmaWNhdGlvbiBpbml0aWF0ZWQ6ICR7bGljZW5zZURhdGEudGllcn1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIHRpZXI6IGxpY2Vuc2VEYXRhLnRpZXIsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gU2VuZCB2ZXJpZmljYXRpb24gZW1haWwgZGlyZWN0bHkgdG8gV29ya2VyIGZvciBpbnN0YW50IGRlbGl2ZXJ5LlxuICAgICAgLy8gUG9zdEhvZyBldmVudCBhbHNvIGZpcmVzIGZvciBhbmFseXRpY3MsIGJ1dCB0aGUgZW1haWwgY2FuJ3Qgd2FpdCBmb3JcbiAgICAgIC8vIFBvc3RIb2cncyBldmVudCBwaXBlbGluZSAoMS01IG1pbiBkZWxheSkuXG4gICAgICBjb25zdCBkZWxpdmVyeVJlc3VsdCA9IGF3YWl0IHNlbmRMaWNlbnNlV29ya2VyVmVyaWZpY2F0aW9uRW1haWwobGljZW5zZURhdGEsIGNvZGUsICdkaXJlY3QtdmVyaWZpY2F0aW9uJyk7XG4gICAgICBpZiAoZGVsaXZlcnlSZXN1bHQub2spIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtTZXR1cF0gVmVyaWZpY2F0aW9uIGVtYWlsIHNlbnQgZGlyZWN0bHkgdmlhIFdvcmtlciBmb3IgJHtsaWNlbnNlRGF0YS50aWVyfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nTGljZW5zZVdvcmtlckRlbGl2ZXJ5RmFpbHVyZSgnW1NldHVwXSBWZXJpZmljYXRpb24gZW1haWwgZGVsaXZlcnkgZmFpbGVkJywgbGljZW5zZURhdGEsIGRlbGl2ZXJ5UmVzdWx0KTtcblxuICAgICAgICBjb25zdCB7IHZlcmlmaWNhdGlvbkNvZGU6IF9jLCB2ZXJpZmljYXRpb25BdHRlbXB0czogX2EsIC4uLnB1YmxpY0RhdGEgfSA9IGxpY2Vuc2VEYXRhO1xuICAgICAgICByZXMuc3RhdHVzKDUwMikuanNvbih7XG4gICAgICAgICAgZXJyb3I6IGdldExpY2Vuc2VXb3JrZXJGYWlsdXJlTWVzc2FnZShkZWxpdmVyeVJlc3VsdCksXG4gICAgICAgICAgdmVyaWZpY2F0aW9uUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgbGljZW5zZTogcHVibGljRGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQWxzbyBmaXJlIFBvc3RIb2cgZXZlbnQgZm9yIGFuYWx5dGljcyAobm9uLWJsb2NraW5nLCBkZWxheSBpcyBmaW5lKVxuICAgICAgY2FwdHVyZVBvc3RIb2dMaWNlbnNlRXZlbnQoeyAuLi5saWNlbnNlRGF0YSwgdmVyaWZpY2F0aW9uQ29kZTogY29kZSwgZXZlbnRUeXBlOiAndmVyaWZpY2F0aW9uJyB9KS5jYXRjaChcbiAgICAgICAgKGVycikgPT4gbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIFBvc3RIb2cgY2FwdHVyZSBmYWlsZWQ6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApLFxuICAgICAgKTtcblxuICAgICAgLy8gUmV0dXJuIHN1Y2Nlc3Mgd2l0aG91dCBleHBvc2luZyB0aGUgY29kZVxuICAgICAgY29uc3QgeyB2ZXJpZmljYXRpb25Db2RlOiBfYywgdmVyaWZpY2F0aW9uQXR0ZW1wdHM6IF9hLCAuLi5wdWJsaWNEYXRhIH0gPSBsaWNlbnNlRGF0YTtcbiAgICAgIHJlcy5qc29uKHsgc3VjY2VzczogdHJ1ZSwgbGljZW5zZTogcHVibGljRGF0YSwgdmVyaWZpY2F0aW9uUmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW1NldHVwXSBGYWlsZWQgdG8gc2F2ZSBsaWNlbnNlJywgeyBlcnJvciB9KTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgZXJyb3I6ICdGYWlsZWQgdG8gc2F2ZSBsaWNlbnNlIGNvbmZpZ3VyYXRpb24nIH0pO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB2ZXJpZnlSYXRlTGltaXRlciA9IG5ldyBTbGlkaW5nV2luZG93UmF0ZUxpbWl0ZXIoNSwgNjBfMDAwKTsgLy8gNSBhdHRlbXB0cy9taW51dGVcblxuICBjb25zdCB2ZXJpZnlMaWNlbnNlSGFuZGxlciA9IGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoIXZlcmlmeVJhdGVMaW1pdGVyLnRyeUFjcXVpcmUoKSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnc2V0dXBSb3V0ZXMudmVyaWZ5TGljZW5zZUhhbmRsZXInLFxuICAgICAgICBkZXRhaWxzOiAnVmVyaWZpY2F0aW9uIGVuZHBvaW50IHJhdGUgbGltaXQgZXhjZWVkZWQgKDUgcmVxL21pbiknLFxuICAgICAgfSk7XG4gICAgICByZXMuc3RhdHVzKDQyOSkuanNvbih7IGVycm9yOiAnVG9vIG1hbnkgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBQbGVhc2UgdHJ5IGFnYWluIGluIGEgbWludXRlLicgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlIH0gPSByZXEuYm9keSA/PyB7fTtcbiAgICBpZiAoIWNvZGUgfHwgdHlwZW9mIGNvZGUgIT09ICdzdHJpbmcnIHx8ICEvXlxcZHs2fSQvLnRlc3QoY29kZSkpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCA2LWRpZ2l0IHZlcmlmaWNhdGlvbiBjb2RlJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaWNlbnNlID0gYXdhaXQgcmVhZExpY2Vuc2UoKTtcbiAgICBpZiAobGljZW5zZS5zdGF0dXMgIT09ICdwZW5kaW5nJykge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogJ05vIHBlbmRpbmcgbGljZW5zZSB2ZXJpZmljYXRpb24uIFBsZWFzZSBzdWJtaXQgdGhlIGxpY2Vuc2UgZm9ybSBmaXJzdC4nIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGV4cGlyeVxuICAgIGlmICghbGljZW5zZS52ZXJpZmljYXRpb25FeHBpcnkgfHwgaXNDb2RlRXhwaXJlZChsaWNlbnNlLnZlcmlmaWNhdGlvbkV4cGlyeSBhcyBzdHJpbmcpKSB7XG4gICAgICBsaWNlbnNlLnN0YXR1cyA9ICdleHBpcmVkJztcbiAgICAgIGF3YWl0IHdyaXRlTGljZW5zZShsaWNlbnNlKTtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6ICdWZXJpZmljYXRpb24gY29kZSBoYXMgZXhwaXJlZC4gUGxlYXNlIHN1Ym1pdCB0aGUgZm9ybSBhZ2FpbiB0byByZWNlaXZlIGEgbmV3IGNvZGUuJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBtYXggYXR0ZW1wdHNcbiAgICBjb25zdCBhdHRlbXB0cyA9ICgobGljZW5zZS52ZXJpZmljYXRpb25BdHRlbXB0cyBhcyBudW1iZXIpID8/IDApICsgMTtcbiAgICBpZiAoYXR0ZW1wdHMgPiBWRVJJRklDQVRJT05fTUFYX0FUVEVNUFRTKSB7XG4gICAgICBsaWNlbnNlLnN0YXR1cyA9ICdleHBpcmVkJztcbiAgICAgIGF3YWl0IHdyaXRlTGljZW5zZShsaWNlbnNlKTtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdzZXR1cFJvdXRlcy52ZXJpZnlMaWNlbnNlSGFuZGxlcicsXG4gICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gbWF4IGF0dGVtcHRzIGV4Y2VlZGVkIGZvciB0aWVyOiAke2xpY2Vuc2UudGllcn1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyB0aWVyOiBsaWNlbnNlLnRpZXIgfSxcbiAgICAgIH0pO1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogJ1RvbyBtYW55IGZhaWxlZCBhdHRlbXB0cy4gUGxlYXNlIHN1Ym1pdCB0aGUgZm9ybSBhZ2FpbiB0byByZWNlaXZlIGEgbmV3IGNvZGUuJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBjb2RlXG4gICAgaWYgKGNvZGUgIT09IGxpY2Vuc2UudmVyaWZpY2F0aW9uQ29kZSkge1xuICAgICAgbGljZW5zZS52ZXJpZmljYXRpb25BdHRlbXB0cyA9IGF0dGVtcHRzO1xuICAgICAgYXdhaXQgd3JpdGVMaWNlbnNlKGxpY2Vuc2UpO1xuICAgICAgY29uc3QgcmVtYWluaW5nID0gVkVSSUZJQ0FUSU9OX01BWF9BVFRFTVBUUyAtIGF0dGVtcHRzO1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogYEluY29ycmVjdCB2ZXJpZmljYXRpb24gY29kZS4gJHtyZW1haW5pbmd9IGF0dGVtcHQke3JlbWFpbmluZyA9PT0gMSA/ICcnIDogJ3MnfSByZW1haW5pbmcuYCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDb2RlIGlzIGNvcnJlY3Qg4oCUIGFjdGl2YXRlIGxpY2Vuc2VcbiAgICBjb25zdCB2ZXJpZmllZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIGNvbnN0IHJlcXVlc3RlZEF0ID0gbGljZW5zZS52ZXJpZmljYXRpb25SZXF1ZXN0ZWRBdCBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGltZVRvVmVyaWZ5TXMgPSByZXF1ZXN0ZWRBdCA/IERhdGUubm93KCkgLSBuZXcgRGF0ZShyZXF1ZXN0ZWRBdCkuZ2V0VGltZSgpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGF0dGVtcHRzVXNlZCA9ICgobGljZW5zZS52ZXJpZmljYXRpb25BdHRlbXB0cyBhcyBudW1iZXIpID8/IDApICsgMTtcblxuICAgIGxpY2Vuc2Uuc3RhdHVzID0gJ2FjdGl2ZSc7XG4gICAgbGljZW5zZS52ZXJpZmllZEF0ID0gdmVyaWZpZWRBdDtcbiAgICBkZWxldGUgbGljZW5zZS52ZXJpZmljYXRpb25Db2RlO1xuICAgIGRlbGV0ZSBsaWNlbnNlLnZlcmlmaWNhdGlvbkV4cGlyeTtcbiAgICBkZWxldGUgbGljZW5zZS52ZXJpZmljYXRpb25BdHRlbXB0cztcbiAgICBkZWxldGUgbGljZW5zZS52ZXJpZmljYXRpb25SZXF1ZXN0ZWRBdDtcbiAgICBhd2FpdCB3cml0ZUxpY2Vuc2UobGljZW5zZSk7XG5cbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBbU2V0dXBdIExpY2Vuc2UgdmVyaWZpZWQgYW5kIGFjdGl2YXRlZDogJHtsaWNlbnNlLnRpZXJ9IOKAlCBgICtcbiAgICAgIGAke3RpbWVUb1ZlcmlmeU1zID8gTWF0aC5yb3VuZCh0aW1lVG9WZXJpZnlNcyAvIDEwMDApICsgJ3MnIDogJ3Vua25vd24nfSwgJHthdHRlbXB0c1VzZWR9IGF0dGVtcHQocylgLFxuICAgICk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnQ09ORklHX1VQREFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnc2V0dXBSb3V0ZXMudmVyaWZ5TGljZW5zZUhhbmRsZXInLFxuICAgICAgZGV0YWlsczogYExpY2Vuc2UgYWN0aXZhdGVkIGFmdGVyIGVtYWlsIHZlcmlmaWNhdGlvbjogJHtsaWNlbnNlLnRpZXJ9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IHRpZXI6IGxpY2Vuc2UudGllciB9LFxuICAgIH0pO1xuXG4gICAgLy8gU2VuZCBjb25maXJtYXRpb24gZW1haWwgKyBQb3N0SG9nIGFjdGl2YXRpb24gZXZlbnQgd2l0aCBhbmFseXRpY3NcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2FwdHVyZVBvc3RIb2dMaWNlbnNlRXZlbnQoe1xuICAgICAgICAuLi5saWNlbnNlLFxuICAgICAgICBldmVudFR5cGU6ICdhY3RpdmF0aW9uJyxcbiAgICAgICAgdmVyaWZpY2F0aW9uX3RpbWVfbXM6IHRpbWVUb1ZlcmlmeU1zLFxuICAgICAgICB2ZXJpZmljYXRpb25fYXR0ZW1wdHM6IGF0dGVtcHRzVXNlZCxcbiAgICAgICAgdmVyaWZpY2F0aW9uX21ldGhvZDogY29kZS5sZW5ndGggPT09IDYgPyAnY29kZV9vcl9jbGljaycgOiAndW5rbm93bicsXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIExpY2Vuc2UgYWN0aXZhdGlvbiBldmVudCBzZW50IHRvIFBvc3RIb2c6ICR7bGljZW5zZS50aWVyfWApO1xuICAgIH0gY2F0Y2ggKHBvc3Rob2dFcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIFBvc3RIb2cgY2FwdHVyZSBmYWlsZWQ6ICR7cG9zdGhvZ0Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBwb3N0aG9nRXJyb3IubWVzc2FnZSA6IFN0cmluZyhwb3N0aG9nRXJyb3IpfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdmVyaWZpY2F0aW9uQ29kZTogX2MsIHZlcmlmaWNhdGlvbkF0dGVtcHRzOiBfYSwgdmVyaWZpY2F0aW9uRXhwaXJ5OiBfZSwgLi4ucHVibGljTGljZW5zZSB9ID0gbGljZW5zZTtcbiAgICByZXMuanNvbih7IHN1Y2Nlc3M6IHRydWUsIGxpY2Vuc2U6IHB1YmxpY0xpY2Vuc2UgfSk7XG4gIH07XG5cbiAgY29uc3QgcmVzZW5kUmF0ZUxpbWl0ZXIgPSBuZXcgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyKDMsIDEyMF8wMDApOyAvLyAzIHJlc2VuZHMgcGVyIDIgbWludXRlc1xuXG4gIGNvbnN0IHJlc2VuZFZlcmlmaWNhdGlvbkhhbmRsZXIgPSBhc3luYyAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICghcmVzZW5kUmF0ZUxpbWl0ZXIudHJ5QWNxdWlyZSgpKSB7XG4gICAgICByZXMuc3RhdHVzKDQyOSkuanNvbih7IGVycm9yOiAnUGxlYXNlIHdhaXQgYmVmb3JlIHJlcXVlc3RpbmcgYW5vdGhlciBjb2RlLicgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGljZW5zZSA9IGF3YWl0IHJlYWRMaWNlbnNlKCk7XG4gICAgaWYgKGxpY2Vuc2Uuc3RhdHVzICE9PSAncGVuZGluZycgJiYgbGljZW5zZS5zdGF0dXMgIT09ICdleHBpcmVkJykge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogJ05vIHBlbmRpbmcgbGljZW5zZSB2ZXJpZmljYXRpb24uJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBuZXcgY29kZSBhbmQgcmVzZXRcbiAgICBjb25zdCBjb2RlID0gZ2VuZXJhdGVWZXJpZmljYXRpb25Db2RlKCk7XG4gICAgbGljZW5zZS5zdGF0dXMgPSAncGVuZGluZyc7XG4gICAgbGljZW5zZS52ZXJpZmljYXRpb25Db2RlID0gY29kZTtcbiAgICBsaWNlbnNlLnZlcmlmaWNhdGlvbkV4cGlyeSA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBWRVJJRklDQVRJT05fQ09ERV9UVExfTVMpLnRvSVNPU3RyaW5nKCk7XG4gICAgbGljZW5zZS52ZXJpZmljYXRpb25BdHRlbXB0cyA9IDA7XG4gICAgYXdhaXQgd3JpdGVMaWNlbnNlKGxpY2Vuc2UpO1xuXG4gICAgLy8gU2VuZCB2ZXJpZmljYXRpb24gZW1haWwgZGlyZWN0bHkgdG8gV29ya2VyIGZvciBpbnN0YW50IGRlbGl2ZXJ5XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlbGl2ZXJ5UmVzdWx0ID0gYXdhaXQgc2VuZExpY2Vuc2VXb3JrZXJWZXJpZmljYXRpb25FbWFpbChsaWNlbnNlLCBjb2RlLCAnZGlyZWN0LXJlc2VuZCcpO1xuICAgICAgaWYgKCFkZWxpdmVyeVJlc3VsdC5vaykge1xuICAgICAgICBsb2dMaWNlbnNlV29ya2VyRGVsaXZlcnlGYWlsdXJlKCdbU2V0dXBdIFZlcmlmaWNhdGlvbiByZXNlbmQgZGVsaXZlcnkgZmFpbGVkJywgbGljZW5zZSwgZGVsaXZlcnlSZXN1bHQpO1xuICAgICAgICByZXMuc3RhdHVzKDUwMikuanNvbih7XG4gICAgICAgICAgZXJyb3I6IGdldExpY2Vuc2VXb3JrZXJGYWlsdXJlTWVzc2FnZShkZWxpdmVyeVJlc3VsdCksXG4gICAgICAgICAgdmVyaWZpY2F0aW9uUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIFZlcmlmaWNhdGlvbiBjb2RlIHJlc2VudCBkaXJlY3RseSB2aWEgV29ya2VyIGZvciAke2xpY2Vuc2UudGllcn1gKTtcbiAgICB9IGNhdGNoICh3b3JrZXJFcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbU2V0dXBdIFVuZXhwZWN0ZWQgdmVyaWZpY2F0aW9uIHJlc2VuZCBmYWlsdXJlJywge1xuICAgICAgICB0aWVyOiBsaWNlbnNlLnRpZXIsXG4gICAgICAgIGVycm9yOiB3b3JrZXJFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gd29ya2VyRXJyb3IubWVzc2FnZSA6IFN0cmluZyh3b3JrZXJFcnJvciksXG4gICAgICB9KTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgZXJyb3I6ICdGYWlsZWQgdG8gcmVzZW5kIHZlcmlmaWNhdGlvbiBjb2RlLicgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVzLmpzb24oeyBzdWNjZXNzOiB0cnVlLCBtZXNzYWdlOiAnQSBuZXcgdmVyaWZpY2F0aW9uIGNvZGUgaGFzIGJlZW4gc2VudCB0byB5b3VyIGVtYWlsLicgfSk7XG4gIH07XG5cbiAgcmV0dXJuIHsgaW5zdGFsbEhhbmRsZXIsIG9wZW5Db25maWdIYW5kbGVyLCB2ZXJzaW9uSGFuZGxlciwgbWNwYlJlZGlyZWN0SGFuZGxlciwgZGV0ZWN0SGFuZGxlciwgZ2V0TGljZW5zZUhhbmRsZXIsIHNldExpY2Vuc2VIYW5kbGVyLCB2ZXJpZnlMaWNlbnNlSGFuZGxlciwgcmVzZW5kVmVyaWZpY2F0aW9uSGFuZGxlciB9O1xufVxuXG4vLyDilIDilIAgSW5zdGFsbCBhbmFseXRpY3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRmlyZS1hbmQtZm9yZ2V0IFBvc3RIb2cgZXZlbnQgZm9yIGluc3RhbGxhdGlvbiBhbmFseXRpY3MuXG4gKiBVc2VzIHRoZSBzYW1lIGluc3RhbGwgSUQgYXMgdGhlIGxpY2Vuc2UgdGVsZW1ldHJ5IHN5c3RlbS5cbiAqIFNpbGVudGx5IHN3YWxsb3dzIGFsbCBlcnJvcnMg4oCUIGFuYWx5dGljcyBtdXN0IG5ldmVyIGJyZWFrIGluc3RhbGxzLlxuICovXG5mdW5jdGlvbiBjYXB0dXJlSW5zdGFsbEFuYWx5dGljcyhldmVudDogc3RyaW5nLCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICBjb25zdCBwb3N0aG9nID0gbmV3IFBvc3RIb2coUE9TVEhPR19QUk9KRUNUX0tFWSwge1xuICAgIGhvc3Q6IHByb2Nlc3MuZW52LlBPU1RIT0dfSE9TVCB8fCAnaHR0cHM6Ly9hcHAucG9zdGhvZy5jb20nLFxuICAgIGZsdXNoQXQ6IDEsXG4gICAgZmx1c2hJbnRlcnZhbDogNTAwMCxcbiAgfSk7XG4gIHJlYWRGaWxlKGpvaW4oaG9tZWRpcigpLCAnLmRvbGxob3VzZScsICcudGVsZW1ldHJ5LWlkJyksICd1dGYtOCcpXG4gICAgLnRoZW4oaWQgPT4gaWQudHJpbSgpKVxuICAgIC5jYXRjaCgoKSA9PiAnYW5vbnltb3VzJylcbiAgICAudGhlbihpbnN0YWxsSWQgPT4ge1xuICAgICAgcG9zdGhvZy5jYXB0dXJlKHsgZGlzdGluY3RJZDogaW5zdGFsbElkLCBldmVudCwgcHJvcGVydGllcyB9KTtcbiAgICAgIHJldHVybiBwb3N0aG9nLnNodXRkb3duKCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKCkgPT4geyAvKiB0ZWxlbWV0cnkgbXVzdCBuZXZlciB0aHJvdyAqLyB9KTtcbn1cblxuLy8g4pSA4pSAIE5WTSBtaXRpZ2F0aW9uIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBDbGF1ZGUgRGVza3RvcCBoYXMgYSBidWcgd2hlcmUgaXQgc2NhbnMgfi8ubnZtL3ZlcnNpb25zL25vZGUvLCBidWlsZHMgYSBQQVRIXG4vLyBmcm9tIGFsbCBpbnN0YWxsZWQgdmVyc2lvbnMgaW4gYXNjZW5kaW5nIG9yZGVyIChvbGRlc3QgZmlyc3QpLCBhbmQgcnVucyBucHhcbi8vIHVuZGVyIGFuIG91dGRhdGVkIE5vZGUgZXZlbiB3aGVuIGEgbmV3ZXIgdmVyc2lvbiBpcyBpbnN0YWxsZWQgYW5kIHNlbGVjdGVkLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXIvaXNzdWVzLzE5MDJcbi8vXG4vLyBGaXg6IHdoZW4gTlZNIGlzIHByZXNlbnQsIGNyZWF0ZSBhIHNtYWxsIGJhc2ggbGF1bmNoZXIgdGhhdCBpbml0aWFsaXNlcyBOVk1cbi8vIHByb3Blcmx5IGJlZm9yZSBkZWxlZ2F0aW5nIHRvIG5weCwgdGhlbiBwYXRjaCB0aGUgd3JpdHRlbiBNQ1AgY2xpZW50IGNvbmZpZ1xuLy8gdG8gdXNlIHRoYXQgbGF1bmNoZXIgaW5zdGVhZCBvZiBiYXJlIGBucHhgLlxuXG4vKiogUmVzdWx0IG9mIGF0dGVtcHRpbmcgdG8gYXBwbHkgdGhlIE5WTSBsYXVuY2hlciBtaXRpZ2F0aW9uLiAqL1xuZXhwb3J0IHR5cGUgTnZtTGF1bmNoZXJSZXN1bHQgPSAnYXBwbGllZCcgfCAnbm90LWFwcGxpY2FibGUnIHwgJ2ZhaWxlZCc7XG5cbi8qKiBKU09OLWZvcm1hdCBjbGllbnRzIGVsaWdpYmxlIGZvciBOVk0gbGF1bmNoZXIgcmVwYWlyIG9uIHN0YXJ0dXAuICovXG5jb25zdCBKU09OX0ZPUk1BVF9DTElFTlRTID0gW1xuICAnY2xhdWRlJywgJ2NsYXVkZS1jb2RlJywgJ2N1cnNvcicsICd3aW5kc3VyZicsICdsbXN0dWRpbycsICdnZW1pbmktY2xpJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogT3JjaGVzdHJhdGVzIHRoZSBOVk0gbWl0aWdhdGlvbjogZGV0ZWN0IOKGkiBjcmVhdGUgbGF1bmNoZXIg4oaSIHBhdGNoIGNvbmZpZyDihpIgdGVsZW1ldHJ5LlxuICogRXh0cmFjdGVkIGZyb20gaW5zdGFsbEhhbmRsZXIgdG8ga2VlcCBpdHMgY29nbml0aXZlIGNvbXBsZXhpdHkgd2l0aGluIFNvbmFyQ2xvdWQgbGltaXRzLlxuICogUmV0dXJucyBhIHJlc3VsdCBlbnVtIHJhdGhlciB0aGFuIHRocm93aW5nIHNvIHRoZSBjYWxsZXIgYWx3YXlzIGdldHMgYSBjbGVhbiBzaWduYWwuXG4gKlxuICogQHBhcmFtIGhvbWUgLSBPdmVycmlkZSBob21lIGRpcmVjdG9yeSAoaW5qZWN0YWJsZSBmb3IgdGVzdHMpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseU52bUxhdW5jaGVySWZOZWVkZWQoY2xpZW50OiBzdHJpbmcsIGhvbWUgPSBob21lZGlyKCkpOiBQcm9taXNlPE52bUxhdW5jaGVyUmVzdWx0PiB7XG4gIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBOVk0gbWl0aWdhdGlvbiBjaGVjayBmb3IgY2xpZW50OiAke2NsaWVudH1gKTtcbiAgaWYgKCFhd2FpdCBpc052bVByZXNlbnQoaG9tZSkpIHtcbiAgICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gTlZNIG5vdCBwcmVzZW50IOKAlCBza2lwcGluZyBsYXVuY2hlciBtaXRpZ2F0aW9uIGZvciAke2NsaWVudH1gKTtcbiAgICBjYXB0dXJlSW5zdGFsbEFuYWx5dGljcygnbnZtX2xhdW5jaGVyX25vdF9hcHBsaWNhYmxlJywgeyBjbGllbnQsIHBsYXRmb3JtOiBwbGF0Zm9ybSgpIH0pO1xuICAgIHJldHVybiAnbm90LWFwcGxpY2FibGUnO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3Qgd3JhcHBlclBhdGggPSBhd2FpdCBlbnN1cmVOdm1MYXVuY2hlcihob21lKTtcbiAgICBhd2FpdCBwYXRjaENvbmZpZ0Zvck52bUxhdW5jaGVyKGNsaWVudCwgd3JhcHBlclBhdGgpO1xuICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIE5WTS1hd2FyZSBsYXVuY2hlciBhcHBsaWVkIGZvciAke2NsaWVudH1gKTtcbiAgICBjYXB0dXJlSW5zdGFsbEFuYWx5dGljcygnbnZtX2xhdW5jaGVyX2FwcGxpZWQnLCB7IGNsaWVudCwgcGxhdGZvcm06IHBsYXRmb3JtKCkgfSk7XG4gICAgcmV0dXJuICdhcHBsaWVkJztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFtTZXR1cF0gTlZNIGxhdW5jaGVyIHNldHVwIGZhaWxlZCAobm9uLWZhdGFsKTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7XG4gICAgY2FwdHVyZUluc3RhbGxBbmFseXRpY3MoJ252bV9sYXVuY2hlcl9mYWlsZWQnLCB7XG4gICAgICBjbGllbnQsXG4gICAgICBwbGF0Zm9ybTogcGxhdGZvcm0oKSxcbiAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuICdmYWlsZWQnO1xuICB9XG59XG5cbi8qKlxuICogU3RhcnR1cCByZXBhaXI6IHJlLWNyZWF0ZXMgdGhlIHdyYXBwZXIgYW5kIHJlLXBhdGNoZXMgYWxsIGtub3duIEpTT04tZm9ybWF0XG4gKiBjbGllbnQgY29uZmlncyBvbiBldmVyeSBzZXJ2ZXIgc3RhcnQuIEhhbmRsZXMgdHdvIGNhc2VzOlxuICogICAxLiBXcmFwcGVyIHdhcyBkZWxldGVkIOKAlCByZWNyZWF0ZXMgaXQgc28gY29uZmlncyBwb2ludGluZyB0byBpdCBrZWVwIHdvcmtpbmcuXG4gKiAgIDIuIFByZS1leGlzdGluZyBpbnN0YWxsICh1c2VyIGluc3RhbGxlZCBiZWZvcmUgdGhpcyBmaXggc2hpcHBlZCkg4oCUIHBhdGNoZXNcbiAqICAgICAgY29uZmlncyB0aGF0IHN0aWxsIHVzZSBiYXJlIGBucHhgLlxuICpcbiAqIEZpcmUtYW5kLWZvcmdldCBmcm9tIHN0YXJ0V2ViU2VydmVyLiBBbGwgZXJyb3JzIGFyZSBzd2FsbG93ZWQgYW5kIGxvZ2dlZC5cbiAqXG4gKiBAcGFyYW0gaG9tZSAgICAgICAgICAgICAgIC0gT3ZlcnJpZGUgaG9tZSBkaXJlY3RvcnkgKGluamVjdGFibGUgZm9yIHRlc3RzKVxuICogQHBhcmFtIGNvbmZpZ1BhdGhSZXNvbHZlciAtIE92ZXJyaWRlIGNvbmZpZyBwYXRoIGxvb2t1cCAoaW5qZWN0YWJsZSBmb3IgdGVzdHMpLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybiBudWxsIHRvIHNraXAgYSBjbGllbnQgZW50aXJlbHkuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gdGhlIHByb2R1Y3Rpb24gZ2V0Q29uZmlnUGF0aC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcGFpck52bUxhdW5jaGVyT25TdGFydHVwKFxuICBob21lID0gaG9tZWRpcigpLFxuICBjb25maWdQYXRoUmVzb2x2ZXI6IChjbGllbnQ6IHN0cmluZykgPT4gc3RyaW5nIHwgbnVsbCA9IGdldENvbmZpZ1BhdGgsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHBsYXRmb3JtKCkgPT09ICd3aW4zMicpIHJldHVybjtcbiAgbG9nZ2VyLmRlYnVnKCdbU2V0dXBdIE5WTSBsYXVuY2hlciBzdGFydHVwIHJlcGFpcjogY2hlY2tpbmcgZm9yIE5WTS4uLicpO1xuICBpZiAoIWF3YWl0IGlzTnZtUHJlc2VudChob21lKSkge1xuICAgIGxvZ2dlci5kZWJ1ZygnW1NldHVwXSBOVk0gbGF1bmNoZXIgc3RhcnR1cCByZXBhaXI6IE5WTSBub3QgcHJlc2VudCDigJQgbm90aGluZyB0byByZXBhaXInKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgd3JhcHBlclBhdGg6IHN0cmluZztcbiAgdHJ5IHtcbiAgICB3cmFwcGVyUGF0aCA9IGF3YWl0IGVuc3VyZU52bUxhdW5jaGVyKGhvbWUpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgW1NldHVwXSBOVk0gc3RhcnR1cCByZXBhaXI6IGNvdWxkIG5vdCBjcmVhdGUgbGF1bmNoZXI6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICBKU09OX0ZPUk1BVF9DTElFTlRTLm1hcChjbGllbnQgPT4ge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGNvbmZpZ1BhdGhSZXNvbHZlcihjbGllbnQpO1xuICAgICAgaWYgKCFjb25maWdQYXRoKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIHJlc29sdmVyIHJldHVybmVkIG51bGwg4oCUIHNraXAgdGhpcyBjbGllbnRcbiAgICAgIHJldHVybiBwYXRjaENvbmZpZ0Zvck52bUxhdW5jaGVyKGNsaWVudCwgd3JhcHBlclBhdGgsIGNvbmZpZ1BhdGgpXG4gICAgICAgIC5jYXRjaChlcnIgPT5cbiAgICAgICAgICBsb2dnZXIud2FybihgW1NldHVwXSBOVk0gc3RhcnR1cCByZXBhaXI6IGZhaWxlZCB0byBwYXRjaCAke2NsaWVudH06ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApXG4gICAgICAgICk7XG4gICAgfSlcbiAgKTtcblxuICBsb2dnZXIuaW5mbygnW1NldHVwXSBOVk0gbGF1bmNoZXIgc3RhcnR1cCByZXBhaXIgY29tcGxldGUnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgTlZNIGlzIGluc3RhbGxlZCBvbiB0aGlzIG1hY2hpbmUgKG1hY09TL0xpbnV4IG9ubHkpLlxuICogQ2hlY2tzIHByb2Nlc3MuZW52Lk5WTV9ESVIgZmlyc3QgKGhhbmRsZXMgbm9uLXN0YW5kYXJkIGluc3RhbGwgbG9jYXRpb25zKSxcbiAqIHRoZW4gZmFsbHMgYmFjayB0byB+Ly5udm0uXG4gKlxuICogQHBhcmFtIGhvbWUgLSBPdmVycmlkZSBob21lIGRpcmVjdG9yeSAoZGVmYXVsdHMgdG8gb3MuaG9tZWRpcigpOyBpbmplY3RhYmxlIGZvciB0ZXN0cylcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzTnZtUHJlc2VudChob21lID0gaG9tZWRpcigpKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChwbGF0Zm9ybSgpID09PSAnd2luMzInKSByZXR1cm4gZmFsc2U7XG4gIC8vIENoZWNrIGNhbmRpZGF0ZXMgaW4gb3JkZXI6IGVudiB2YXIgb3ZlcnJpZGUg4oaSIGRlZmF1bHQgbG9jYXRpb25cbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICBwcm9jZXNzLmVudi5OVk1fRElSLFxuICAgIGpvaW4oaG9tZSwgJy5udm0nKSxcbiAgXS5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW107XG4gIGZvciAoY29uc3QgZGlyIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWNjZXNzKGpvaW4oZGlyLCAnbnZtLnNoJykpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIE5WTSBkZXRlY3RlZCBhdDogJHtkaXJ9YCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHsgLyogdHJ5IG5leHQgY2FuZGlkYXRlICovIH1cbiAgfVxuICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gTlZNIG5vdCBmb3VuZCAoY2hlY2tlZDogJHtjYW5kaWRhdGVzLmpvaW4oJywgJyl9KWApO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIE5WTSBkaXJlY3Rvcnk6IHByb2Nlc3MuZW52Lk5WTV9ESVIgaWYgc2V0LCBvdGhlcndpc2Ugfi8ubnZtLlxuICogVXNlZCB0byBoYXJkY29kZSB0aGUgcGF0aCBpbiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgc28gaXQgd29ya3MgZXZlbiB3aGVuXG4gKiBDbGF1ZGUgRGVza3RvcCBkb2VzIG5vdCBzb3VyY2UgdGhlIHVzZXIncyBzaGVsbCBwcm9maWxlLlxuICpcbiAqIHByb2Nlc3MuZW52Lk5WTV9ESVIgaXMgdmFsaWRhdGVkIGJlZm9yZSB1c2UgdG8gcHJldmVudCBzaGVsbCBpbmplY3Rpb24gaW5cbiAqIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBzY3JpcHQgKG9ubHkgYWJzb2x1dGUgcGF0aHMgd2l0aCBzYWZlIGNoYXJhY3RlcnMgYXJlXG4gKiBhY2NlcHRlZDsgdW5zYWZlIHZhbHVlcyBmYWxsIGJhY2sgdG8gfi8ubnZtKS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU52bURpcihob21lID0gaG9tZWRpcigpKTogc3RyaW5nIHtcbiAgY29uc3QgZW52RGlyID0gcHJvY2Vzcy5lbnYuTlZNX0RJUjtcbiAgaWYgKGVudkRpciAmJiAvXlxcL1tcXHcuL34tXSskLy50ZXN0KGVudkRpcikpIHtcbiAgICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gTlZNIGRpciByZXNvbHZlZCBmcm9tIE5WTV9ESVIgZW52IHZhcjogJHtlbnZEaXJ9YCk7XG4gICAgcmV0dXJuIGVudkRpcjtcbiAgfVxuICBpZiAoZW52RGlyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIE5WTV9ESVIgZW52IHZhciByZWplY3RlZCAodW5zYWZlIHBhdGgpOiAke2VudkRpcn0g4oCUIGZhbGxpbmcgYmFjayB0byB+Ly5udm1gKTtcbiAgfVxuICBjb25zdCBmYWxsYmFjayA9IGpvaW4oaG9tZSwgJy5udm0nKTtcbiAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIE5WTSBkaXIgcmVzb2x2ZWQgdG8gZGVmYXVsdDogJHtmYWxsYmFja31gKTtcbiAgcmV0dXJuIGZhbGxiYWNrO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgfi8uZG9sbGhvdXNlL2Jpbi9kb2xsaG91c2VtY3AtbnZtLnNoIGFuZCByZXR1cm5zIGl0cyBwYXRoLlxuICpcbiAqIFRoZSBOVk0gZGlyZWN0b3J5IGlzIHJlc29sdmVkIGF0IGdlbmVyYXRpb24gdGltZSBhbmQgaGFyZGNvZGVkIGludG8gdGhlXG4gKiBzY3JpcHQuIFRoaXMgaXMgaW50ZW50aW9uYWw6IENsYXVkZSBEZXNrdG9wIGRvZXMgbm90IHNvdXJjZSB0aGUgdXNlcidzXG4gKiBzaGVsbCBwcm9maWxlLCBzbyAkTlZNX0RJUiB3b3VsZCBiZSB1bnNldCB3aGVuIHRoZSB3cmFwcGVyIHJ1bnMuIEJ5XG4gKiBlbWJlZGRpbmcgdGhlIGFic29sdXRlIHBhdGggd2UgZ3VhcmFudGVlIHRoZSBjb3JyZWN0IE5WTSBpcyBmb3VuZC5cbiAqXG4gKiBUaGUgc2NyaXB0IHNvdXJjZXMgTlZNLCB0aGVuIGNoZWNrcyB0aGUgYWN0aXZlIE5vZGUgbWFqb3IgdmVyc2lvbi4gSWYgaXRcbiAqIGlzIGJlbG93IDE4ICh0aGUgRG9sbGhvdXNlTUNQIG1pbmltdW0pLCBpdCB0cmllcyBgbnZtIHVzZSBub2RlYCAoaGlnaGVzdFxuICogaW5zdGFsbGVkKSB0aGVuIGBudm0gdXNlIC0tbHRzYCBhcyBhIGZhbGxiYWNrLiBBIGZpbmFsIHZlcnNpb24gY2hlY2tcbiAqIHdyaXRlcyBhIHdhcm5pbmcgdG8gc3RkZXJyIGlmIHRoZSBub2RlIGlzIHN0aWxsIHRvbyBvbGQg4oCUIHRoYXQgd2FybmluZ1xuICogd2lsbCBhcHBlYXIgaW4gQ2xhdWRlIERlc2t0b3AncyBlcnJvciBsb2cuXG4gKlxuICogQHBhcmFtIGhvbWUgICAgICAgLSBPdmVycmlkZSBob21lIGRpcmVjdG9yeSAoaW5qZWN0YWJsZSBmb3IgdGVzdHMpXG4gKiBAcGFyYW0gbnZtRGlyT3ZlcnJpZGUgLSBPdmVycmlkZSB0aGUgcmVzb2x2ZWQgTlZNIHBhdGggKGluamVjdGFibGUgZm9yIHRlc3RzKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlTnZtTGF1bmNoZXIoaG9tZSA9IGhvbWVkaXIoKSwgbnZtRGlyT3ZlcnJpZGU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBiaW5EaXIgPSBqb2luKGhvbWUsICcuZG9sbGhvdXNlJywgJ2JpbicpO1xuICBjb25zdCB3cmFwcGVyUGF0aCA9IGpvaW4oYmluRGlyLCAnZG9sbGhvdXNlbWNwLW52bS5zaCcpO1xuICBjb25zdCBudm1EaXIgPSBudm1EaXJPdmVycmlkZSA/PyByZXNvbHZlTnZtRGlyKGhvbWUpO1xuXG4gIGF3YWl0IG1rZGlyKGJpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgLy8gU2luZ2xlLWV4cHJlc3Npb24gaGVscGVyIHJldXNlZCB0d2ljZSB0byBnZXQgdGhlIE5vZGUgbWFqb3IgdmVyc2lvbi5cbiAgY29uc3QgZ2V0TWFqb3IgPSAnbm9kZSAtZSBcInByb2Nlc3Muc3Rkb3V0LndyaXRlKFN0cmluZyhwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoXFwnLlxcJylbMF0pKVwiIDI+L2Rldi9udWxsIHx8IGVjaG8gXCIwXCInO1xuXG4gIGNvbnN0IHNjcmlwdCA9IFtcbiAgICAnIyEvYmluL2Jhc2gnLFxuICAgICcjIERvbGxob3VzZU1DUCBOVk0tYXdhcmUgbGF1bmNoZXInLFxuICAgICcjIEF1dG8tZ2VuZXJhdGVkIGJ5IHRoZSBEb2xsaG91c2VNQ1AgaW5zdGFsbGVyLicsXG4gICAgJyMgRW5zdXJlcyB0aGUgY29ycmVjdCBOb2RlLmpzIHZlcnNpb24gaXMgYWN0aXZlIGJlZm9yZSBydW5uaW5nIG5weCwnLFxuICAgICcjIHdvcmtpbmcgYXJvdW5kIGEgQ2xhdWRlIERlc2t0b3AgYnVnIHdoZXJlIE5WTSBQQVRIIG9yZGVyaW5nIGNhdXNlcycsXG4gICAgJyMgbnB4IHRvIGV4ZWN1dGUgdW5kZXIgYW4gb2xkZXIgTm9kZSB2ZXJzaW9uIChlLmcuIHYxMikgZXZlbiB3aGVuIGEnLFxuICAgICcjIG5ld2VyIHZlcnNpb24gaXMgaW5zdGFsbGVkLicsXG4gICAgJyMgU2VlOiBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXIvaXNzdWVzLzE5MDInLFxuICAgICcnLFxuICAgIGBOVk1fRElSPVwiJHtudm1EaXJ9XCJgLFxuICAgICdpZiBbIC1zIFwiJE5WTV9ESVIvbnZtLnNoXCIgXTsgdGhlbicsXG4gICAgJyAgICAjIHNoZWxsY2hlY2sgc291cmNlPS9kZXYvbnVsbCcsXG4gICAgJyAgICAuIFwiJE5WTV9ESVIvbnZtLnNoXCIgMj4vZGV2L251bGwnLFxuICAgICcgICAgIyBJZiB0aGUgYWN0aXZlIE5vZGUgaXMgYmVsb3cgdjE4IChtaW5pbXVtIGZvciBEb2xsaG91c2VNQ1ApLCcsXG4gICAgYCAgICAjIHRyeSAnbm9kZScgYWxpYXMgKGhpZ2hlc3QgaW5zdGFsbGVkKSB0aGVuIExUUyBhcyBhIGZhbGxiYWNrLmAsXG4gICAgYCAgICBNQUpPUj0kKCR7Z2V0TWFqb3J9KWAsXG4gICAgJyAgICBpZiBbIFwiJE1BSk9SXCIgLWx0IDE4IF07IHRoZW4nLFxuICAgICcgICAgICAgIG52bSB1c2Ugbm9kZSAyPi9kZXYvbnVsbCB8fCBudm0gdXNlIC0tbHRzIDI+L2Rldi9udWxsIHx8IHRydWUnLFxuICAgIGAgICAgICAgIE1BSk9SPSQoJHtnZXRNYWpvcn0pYCxcbiAgICAnICAgICAgICBpZiBbIFwiJE1BSk9SXCIgLWx0IDE4IF07IHRoZW4nLFxuICAgICcgICAgICAgICAgICBlY2hvIFwiW0RvbGxob3VzZU1DUF0gV0FSTklORzogTm9kZS5qcyAkTUFKT1IgaXMgYmVsb3cgdGhlIG1pbmltdW0gKDE4KS4gRG9sbGhvdXNlTUNQIG1heSBub3Qgc3RhcnQgY29ycmVjdGx5LlwiID4mMicsXG4gICAgJyAgICAgICAgZmknLFxuICAgICcgICAgZmknLFxuICAgICdmaScsXG4gICAgJycsXG4gICAgJ2V4ZWMgbnB4IFwiJEBcIicsXG4gIF0uam9pbignXFxuJykgKyAnXFxuJztcblxuICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gV3JpdGluZyBOVk0gbGF1bmNoZXIgd3JhcHBlciB0bzogJHt3cmFwcGVyUGF0aH0gKE5WTV9ESVI9JHtudm1EaXJ9KWApO1xuICBhd2FpdCB3cml0ZUZpbGUod3JhcHBlclBhdGgsIHNjcmlwdCwgJ3V0Zi04Jyk7XG4gIGF3YWl0IGNobW9kKHdyYXBwZXJQYXRoLCAwbzc1NSk7XG4gIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBOVk0gbGF1bmNoZXIgd3JhcHBlciB3cml0dGVuIGFuZCBtYWRlIGV4ZWN1dGFibGVgKTtcbiAgcmV0dXJuIHdyYXBwZXJQYXRoO1xufVxuXG4vKipcbiAqIERldGVjdHMgdGhlIGluZGVudGF0aW9uIHVzZWQgaW4gYSBKU09OIHN0cmluZyBzbyB0aGUgcmVzZXJpYWxpc2VkIG91dHB1dFxuICogcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBzdHlsZSAoYXZvaWRzIG5vaXN5IGRpZmZzIGluIHVzZXItbWFpbnRhaW5lZCBjb25maWdzKS5cbiAqIFJldHVybnMgdGhlIHRhYiBjaGFyYWN0ZXIgZm9yIHRhYi1pbmRlbnRlZCBmaWxlcywgb3IgdGhlIGxlYWRpbmctc3BhY2UgY291bnRcbiAqIChtaW5pbXVtIDIpIGZvciBzcGFjZS1pbmRlbnRlZCBmaWxlcy4gRGVmYXVsdHMgdG8gMiB3aGVuIHVuZGV0ZWN0YWJsZS5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0SW5kZW50KHJhdzogc3RyaW5nKTogbnVtYmVyIHwgc3RyaW5nIHtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHJhdy5zcGxpdCgnXFxuJykpIHtcbiAgICBpZiAobGluZS5sZW5ndGggPT09IDAgfHwgbGluZS5zdGFydHNXaXRoKCd7JykgfHwgbGluZS5zdGFydHNXaXRoKCd9JykpIGNvbnRpbnVlO1xuICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJ1xcdCcpKSByZXR1cm4gJ1xcdCc7XG4gICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnICcpKSB7XG4gICAgICBjb25zdCBzcGFjZXMgPSBsaW5lLmxlbmd0aCAtIGxpbmUudHJpbVN0YXJ0KCkubGVuZ3RoO1xuICAgICAgaWYgKHNwYWNlcyA+PSAyKSByZXR1cm4gc3BhY2VzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMjtcbn1cblxuLyoqXG4gKiBQYXRjaGVzIHRoZSBkb2xsaG91c2VtY3AgZW50cnkgaW4gYW4gTUNQIGNsaWVudCdzIEpTT04gY29uZmlnIHRvIHVzZVxuICogdGhlIE5WTS1hd2FyZSBsYXVuY2hlciBpbnN0ZWFkIG9mIGJhcmUgYG5weGAuXG4gKlxuICogT25seSBhY3RzIG9uIEpTT04tZm9ybWF0IGNvbmZpZ3MuIFRPTUwgY29uZmlncyAoY29kZXgpIGFyZSBza2lwcGVkLlxuICogU2lsZW50bHkgbm8tb3BzIGlmIHRoZSBjb25maWcgZmlsZSBpcyBtaXNzaW5nIG9yIHVucmVhZGFibGUuXG4gKlxuICogQHBhcmFtIGNvbmZpZ1BhdGhPdmVycmlkZSAtIFVzZSB0aGlzIHBhdGggaW5zdGVhZCBvZiB0aGUgcGxhdGZvcm0gZGVmYXVsdCAoaW5qZWN0YWJsZSBmb3IgdGVzdHMpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXRjaENvbmZpZ0Zvck52bUxhdW5jaGVyKGNsaWVudDogc3RyaW5nLCB3cmFwcGVyUGF0aDogc3RyaW5nLCBjb25maWdQYXRoT3ZlcnJpZGU/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGNvbmZpZ1BhdGhPdmVycmlkZSA/PyBnZXRDb25maWdQYXRoKGNsaWVudCk7XG4gIGlmICghY29uZmlnUGF0aCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBwYXRjaENvbmZpZ0Zvck52bUxhdW5jaGVyOiBubyBjb25maWcgcGF0aCBmb3IgJHtjbGllbnR9IOKAlCBza2lwcGluZ2ApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoY29uZmlnUGF0aC5lbmRzV2l0aCgnLnRvbWwnKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBwYXRjaENvbmZpZ0Zvck52bUxhdW5jaGVyOiBUT01MIGNvbmZpZyBmb3IgJHtjbGllbnR9IOKAlCBza2lwcGluZyAobm90IEpTT04tZm9ybWF0KWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCByYXc6IHN0cmluZztcbiAgdHJ5IHtcbiAgICByYXcgPSBhd2FpdCByZWFkRmlsZShjb25maWdQYXRoLCAndXRmLTgnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuOyAvLyBDb25maWcgbm90IHJlYWRhYmxlIOKAlCBpbnN0YWxsLW1jcCBtYXkgbm90IGhhdmUgd3JpdHRlbiBpdCB5ZXRcbiAgfVxuXG4gIGxldCBwYXJzZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuOyAvLyBNYWxmb3JtZWQgSlNPTiDigJQgZG9uJ3QgdG91Y2ggaXRcbiAgfVxuXG4gIGxldCBwYXRjaGVkID0gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnbWNwU2VydmVycycsICdzZXJ2ZXJzJ10pIHtcbiAgICBjb25zdCBzZWN0aW9uID0gcGFyc2VkW2tleV0gYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChzZWN0aW9uPy5kb2xsaG91c2VtY3ApIHtcbiAgICAgIHNlY3Rpb24uZG9sbGhvdXNlbWNwLmNvbW1hbmQgPSB3cmFwcGVyUGF0aDtcbiAgICAgIHBhdGNoZWQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFwYXRjaGVkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIHBhdGNoQ29uZmlnRm9yTnZtTGF1bmNoZXI6IG5vIGRvbGxob3VzZW1jcCBlbnRyeSBpbiAke2NsaWVudH0gY29uZmlnIOKAlCBub3RoaW5nIHRvIHBhdGNoYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaW5kZW50ID0gZGV0ZWN0SW5kZW50KHJhdyk7XG4gIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBwYXRjaENvbmZpZ0Zvck52bUxhdW5jaGVyOiB3cml0aW5nICR7Y2xpZW50fSBjb25maWcgKGluZGVudD0ke0pTT04uc3RyaW5naWZ5KGluZGVudCl9KWApO1xuICBhd2FpdCB3cml0ZUZpbGUoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCBpbmRlbnQpICsgJ1xcbicsICd1dGYtOCcpO1xuICBsb2dnZXIuaW5mbyhgW1NldHVwXSBQYXRjaGVkICR7Y2xpZW50fSBjb25maWcgdG8gdXNlIE5WTS1hd2FyZSBsYXVuY2hlcjogJHt3cmFwcGVyUGF0aH1gKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRNY3BTZXJ2ZXJFbnRyeSh2ZXJzaW9uPzogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCB0YWcgPSB2ZXJzaW9uID8gYEAke3ZlcnNpb259YCA6ICdAbGF0ZXN0JztcbiAgcmV0dXJuIHtcbiAgICBjb21tYW5kOiAnbnB4JyxcbiAgICBhcmdzOiBbYEBkb2xsaG91c2VtY3AvbWNwLXNlcnZlciR7dGFnfWBdLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEpzb25NY3BDbGllbnRDb25maWcoXG4gIGNsaWVudDogc3RyaW5nLFxuICB2ZXJzaW9uPzogc3RyaW5nLFxuICBjb25maWdQYXRoT3ZlcnJpZGU/OiBzdHJpbmcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb25maWdQYXRoID0gY29uZmlnUGF0aE92ZXJyaWRlID8/IGdldENvbmZpZ1BhdGgoY2xpZW50KTtcbiAgaWYgKCFjb25maWdQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb25maWcgcGF0aCB1bmtub3duIGZvciBjbGllbnQ6ICR7Y2xpZW50fWApO1xuICB9XG4gIGlmIChjb25maWdQYXRoLmVuZHNXaXRoKCcudG9tbCcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBKU09OIE1DUCBpbnN0YWxsIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFRPTUwgY2xpZW50OiAke2NsaWVudH1gKTtcbiAgfVxuXG4gIGF3YWl0IG1rZGlyKGRpcm5hbWUoY29uZmlnUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGxldCByYXcgPSAnJztcbiAgbGV0IHBhcnNlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgdHJ5IHtcbiAgICByYXcgPSBhd2FpdCByZWFkRmlsZShjb25maWdQYXRoLCAndXRmLTgnKTtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFpc01pc3NpbmdQYXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwYXJzZSBleGlzdGluZyBjb25maWcgYXQgJHtjb25maWdQYXRofWApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJvb3RLZXkgPSBjbGllbnQgPT09ICd2c2NvZGUnID8gJ3NlcnZlcnMnIDogJ21jcFNlcnZlcnMnO1xuICBjb25zdCBleGlzdGluZ1Jvb3QgPSBwYXJzZWRbcm9vdEtleV07XG4gIGNvbnN0IHJvb3QgPSBleGlzdGluZ1Jvb3QgJiYgdHlwZW9mIGV4aXN0aW5nUm9vdCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZXhpc3RpbmdSb290KVxuICAgID8gZXhpc3RpbmdSb290IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgOiB7fTtcblxuICByb290LmRvbGxob3VzZW1jcCA9IGJ1aWxkTWNwU2VydmVyRW50cnkodmVyc2lvbik7XG4gIHBhcnNlZFtyb290S2V5XSA9IHJvb3Q7XG5cbiAgY29uc3QgaW5kZW50ID0gcmF3ID8gZGV0ZWN0SW5kZW50KHJhdykgOiAyO1xuICBhd2FpdCB3cml0ZUZpbGUoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCBpbmRlbnQpICsgJ1xcbicsICd1dGYtOCcpO1xuXG4gIHJldHVybiBgSW5zdGFsbGVkIE1DUCBzZXJ2ZXIgXCJkb2xsaG91c2VtY3BcIiBpbiAke2NsaWVudH0gKCR7Y29uZmlnUGF0aH0pYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbExtU3R1ZGlvQ29uZmlnKHZlcnNpb24/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gaW5zdGFsbEpzb25NY3BDbGllbnRDb25maWcoJ2xtc3R1ZGlvJywgdmVyc2lvbik7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgaW5zdGFsbC1tY3AgYmluYXJ5IHBhdGguXG4gKiBVc2VzIHRoZSBsb2NhbCBkZXBlbmRlbmN5IChub2RlX21vZHVsZXMvLmJpbi9pbnN0YWxsLW1jcCkgZmlyc3QsXG4gKiBmYWxscyBiYWNrIHRvIG5weCBpZiBub3QgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVJbnN0YWxsTWNwQmluKCk6IHsgY21kOiBzdHJpbmc7IHByZWZpeEFyZ3M6IHN0cmluZ1tdIH0ge1xuICBjb25zdCBsb2NhbEJpbiA9IGpvaW4oZGlybmFtZShkaXJuYW1lKGRpcm5hbWUoX19kaXJuYW1lKSkpLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nLCAnaW5zdGFsbC1tY3AnKTtcbiAgdHJ5IHtcbiAgICBhY2Nlc3NTeW5jKGxvY2FsQmluLCBmc0NvbnN0YW50cy5YX09LKTtcbiAgICByZXR1cm4geyBjbWQ6IGxvY2FsQmluLCBwcmVmaXhBcmdzOiBbXSB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBjbWQ6ICducHgnLCBwcmVmaXhBcmdzOiBbJ2luc3RhbGwtbWNwJ10gfTtcbiAgfVxufVxuXG4vKipcbiAqIFJ1biBpbnN0YWxsLW1jcCB0byBjb25maWd1cmUgYSBzcGVjaWZpYyBNQ1AgY2xpZW50LlxuICpcbiAqIFVzZXMgdGhlIGJ1bmRsZWQgaW5zdGFsbC1tY3AgZGVwZW5kZW5jeSAoTUlULCBodHRwczovL2dpdGh1Yi5jb20vc3VwZXJtZW1vcnlhaS9pbnN0YWxsLW1jcCkuXG4gKiBDb21tYW5kIGFyZ3VtZW50cyBhcmUgZnVsbHkgaGFyZGNvZGVkIOKAlCBubyB1c2VyIGlucHV0IHJlYWNoZXMgdGhlIHNoZWxsLlxuICogZXhlY0ZpbGUgaXMgdXNlZCAobm90IGV4ZWMpIHRvIHByZXZlbnQgc2hlbGwgaW5qZWN0aW9uLlxuICovXG5mdW5jdGlvbiBydW5JbnN0YWxsTWNwKGNsaWVudDogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB7IGNtZCwgcHJlZml4QXJncyB9ID0gcmVzb2x2ZUluc3RhbGxNY3BCaW4oKTtcbiAgICBjb25zdCB0YWcgPSB2ZXJzaW9uID8gYEAke3ZlcnNpb259YCA6ICdAbGF0ZXN0JztcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgLi4ucHJlZml4QXJncyxcbiAgICAgIGBAZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXIke3RhZ31gLFxuICAgICAgJy0tY2xpZW50JywgY2xpZW50LFxuICAgICAgJy0tbmFtZScsICdkb2xsaG91c2VtY3AnLFxuICAgICAgJy0teWVzJyxcbiAgICBdO1xuXG4gICAgZXhlY0ZpbGUoY21kLCBhcmdzLCB7IHRpbWVvdXQ6IDMwXzAwMCB9LCAoZXJyLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKHN0ZGVyciB8fCBlcnIubWVzc2FnZSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKHN0ZG91dCB8fCAnSW5zdGFsbGF0aW9uIGNvbXBsZXRlZC4nKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXX0=
1364
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXBSb3V0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL3JvdXRlcy9zZXR1cFJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUdILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLElBQUksV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0UsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXBELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsNkJBQTZCLEdBRzlCLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEMsTUFBTSxXQUFXLEdBQUcseUJBQXlCLENBQUM7QUFDOUMsTUFBTSxrQkFBa0IsR0FBRyx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsd0JBQXdCLEVB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RUFBRTtZQUMvRCxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLE9BQU87WUFDVCxDQUFDO1lBQ0QsT0FBTyxDQUFDLE1BQU0sSUFBSSx5QkFBeUIsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZXR1cCBSb3V0ZXMg4oCUIEF1dG8taW5zdGFsbCBEb2xsaG91c2VNQ1AgdG8gTUNQIGNsaWVudHNcbiAqXG4gKiBVc2VzIGBpbnN0YWxsLW1jcGAgKGh0dHBzOi8vZ2l0aHViLmNvbS9zdXBlcm1lbW9yeWFpL2luc3RhbGwtbWNwKVxuICogdG8gaW5qZWN0IHNlcnZlciBjb25maWd1cmF0aW9uIGludG8gc3VwcG9ydGVkIE1DUCBjbGllbnQgY29uZmlnIGZpbGVzLlxuICpcbiAqIFNlY3VyaXR5OiBsb2NhbGhvc3Qtb25seSBiaW5kaW5nIChlbmZvcmNlZCBieSBzZXJ2ZXIudHMpLCByYXRlLWxpbWl0ZWQsXG4gKiBhbmQgY29tbWFuZCBhcmd1bWVudHMgYXJlIGhhcmRjb2RlZCDigJQgbm8gdXNlci1zdXBwbGllZCBzaGVsbCBpbnB1dC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBhY2Nlc3NTeW5jLCBleGlzdHNTeW5jLCBjb25zdGFudHMgYXMgZnNDb25zdGFudHMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGFjY2VzcywgY2htb2QsIG1rZGlyLCByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luLCBkaXJuYW1lLCBzZXAgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IGhvbWVkaXIsIHBsYXRmb3JtLCB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcblxuY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoX19maWxlbmFtZSk7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBQQUNLQUdFX1ZFUlNJT04gfSBmcm9tICcuLi8uLi9nZW5lcmF0ZWQvdmVyc2lvbi5qcyc7XG5pbXBvcnQge1xuICBpbnN0YWxsUGVybWlzc2lvbkhvb2ssXG4gIHJlY29uY2lsZVBlcm1pc3Npb25Ib29rU3RhdHVzLFxuICB0eXBlIEluc3RhbGxQZXJtaXNzaW9uSG9va1Jlc3VsdCxcbiAgdHlwZSBQZXJtaXNzaW9uSG9va1N0YXR1cyxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvcGVybWlzc2lvbkhvb2tzLmpzJztcblxuY29uc3QgR0lUSFVCX1JFUE8gPSAnRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXInO1xuY29uc3QgTUNQQl9BU1NFVF9QQVRURVJOID0gL15kb2xsaG91c2VtY3AtLipcXC5tY3BiJC87XG5pbXBvcnQgeyBTbGlkaW5nV2luZG93UmF0ZUxpbWl0ZXIgfSBmcm9tICcuLi8uLi91dGlscy9TbGlkaW5nV2luZG93UmF0ZUxpbWl0ZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IHJhbmRvbUludCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IFBvc3RIb2cgfSBmcm9tICdwb3N0aG9nLW5vZGUnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5cbmZ1bmN0aW9uIGlzTWlzc2luZ1BhdGhFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICBlcnJvclxuICAgICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCdcbiAgICAmJiAnY29kZScgaW4gZXJyb3JcbiAgICAmJiAoZXJyb3IgYXMgeyBjb2RlPzogc3RyaW5nIH0pLmNvZGUgPT09ICdFTk9FTlQnLFxuICApO1xufVxuXG4vLyBQb3N0SG9nIHByb2plY3QgY2FwdHVyZSBrZXkg4oCUIHdyaXRlLW9ubHkgYnkgZGVzaWduLCBzYWZlIHRvIGV4cG9zZSBwdWJsaWNseS5cbi8vIFRoaXMga2V5IGNhbiBPTkxZIHNlbmQgZXZlbnRzIHRvIFBvc3RIb2c7IGl0IGNhbm5vdCByZWFkIGRhdGEsIHF1ZXJ5IGFuYWx5dGljcyxcbi8vIGNvbmZpZ3VyZSBkZXN0aW5hdGlvbnMsIG9yIGFjY2VzcyBhbnkgb3RoZXIgUG9zdEhvZyBBUEkuIFNhbWUga2V5IHVzZWQgaW5cbi8vIHNyYy90ZWxlbWV0cnkvT3BlcmF0aW9uYWxUZWxlbWV0cnkudHMuIFZlcmlmaWVkIHdyaXRlLW9ubHkgMjAyNi0wNC0wNy5cbi8vIENhbiBiZSBvdmVycmlkZGVuIHdpdGggUE9TVEhPR19BUElfS0VZIGVudiB2YXIgZm9yIGN1c3RvbSBQb3N0SG9nIGluc3RhbGxhdGlvbnMuXG5jb25zdCBQT1NUSE9HX1BST0pFQ1RfS0VZID0gcHJvY2Vzcy5lbnYuUE9TVEhPR19BUElfS0VZIHx8ICdwaGNfeEZKS0lIQXFSWDFZTGEwVFNkVEd3R2oxOWQxSmVvWERLakpOWXE0OTJ2cSc7XG5jb25zdCBMSUNFTlNFX1dPUktFUl9ESVJFQ1RfUEFUSCA9ICcvZGlyZWN0LXZlcmlmaWNhdGlvbic7XG5cbi8qKiBTdXBwb3J0ZWQgY2xpZW50IGlkZW50aWZpZXJzIGZvciBvbmUtY2xpY2sgc2V0dXAuICovXG5jb25zdCBBTExPV0VEX0NMSUVOVFMgPSBuZXcgU2V0KFtcbiAgJ2NsYXVkZScsXG4gICdjbGF1ZGUtY29kZScsXG4gICdjdXJzb3InLFxuICAndnNjb2RlJyxcbiAgJ2NsaW5lJyxcbiAgJ3Jvby1jbGluZScsXG4gICd3aW5kc3VyZicsXG4gICd3aXRzeScsXG4gICdlbmNvbnZvJyxcbiAgJ2dlbWluaS1jbGknLFxuICAnZ29vc2UnLFxuICAnemVkJyxcbiAgJ3dhcnAnLFxuICAnY29kZXgnLFxuICAnbG1zdHVkaW8nLFxuXSk7XG5cbnR5cGUgQ29uZmlnUGF0aENsaWVudCA9XG4gIHwgJ2NsYXVkZSdcbiAgfCAnY2xhdWRlLWNvZGUnXG4gIHwgJ2N1cnNvcidcbiAgfCAndnNjb2RlJ1xuICB8ICd3aW5kc3VyZidcbiAgfCAnY2xpbmUnXG4gIHwgJ2xtc3R1ZGlvJ1xuICB8ICdnZW1pbmktY2xpJ1xuICB8ICdjb2RleCc7XG5cbnR5cGUgU2V0dXBTdXBwb3J0TGV2ZWwgPVxuICB8ICdmdWxsX25hdGl2ZSdcbiAgfCAncGFydGlhbF9uYXRpdmUnXG4gIHwgJ21jcF9vbmx5J1xuICB8ICd1bnN1cHBvcnRlZCc7XG5cbmNvbnN0IFNFVFVQX1NVUFBPUlRfTEVWRUxTOiBSZWNvcmQ8c3RyaW5nLCBTZXR1cFN1cHBvcnRMZXZlbD4gPSB7XG4gICdjbGF1ZGUnOiAndW5zdXBwb3J0ZWQnLFxuICAnY2xhdWRlLWNvZGUnOiAnZnVsbF9uYXRpdmUnLFxuICAnY3Vyc29yJzogJ3BhcnRpYWxfbmF0aXZlJyxcbiAgJ2NsaW5lJzogJ21jcF9vbmx5JyxcbiAgJ3dpbmRzdXJmJzogJ3BhcnRpYWxfbmF0aXZlJyxcbiAgJ2xtc3R1ZGlvJzogJ21jcF9vbmx5JyxcbiAgJ2dlbWluaS1jbGknOiAncGFydGlhbF9uYXRpdmUnLFxuICAnY29kZXgnOiAncGFydGlhbF9uYXRpdmUnLFxufTtcblxuLyoqIEFsbG93ZWQgcmVsZWFzZSBjaGFubmVscyBmb3IgdGhlIGluc3RhbGwgZW5kcG9pbnQuICovXG5jb25zdCBBTExPV0VEX0lOU1RBTExfQ0hBTk5FTFM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFsnbGF0ZXN0JywgJ2JldGEnLCAncmMnXSk7XG5cbi8qKiBSYXRlIGxpbWl0OiA1IGluc3RhbGxzIHBlciBtaW51dGUgKi9cbmNvbnN0IGluc3RhbGxMaW1pdGVyID0gbmV3IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlcig1LCA2MF8wMDApO1xuXG4vKipcbiAqIEtub3duIGNvbmZpZyBmaWxlIHBhdGhzIHBlciBjbGllbnQuXG4gKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS5cbiAqXG4gKiBAcGFyYW0gaG9tZSAtIEhvbWUgZGlyZWN0b3J5IHVzZWQgdG8gcmVzb2x2ZSBldmVyeSBwYXRoLiBEZWZhdWx0cyB0b1xuICogICAgICAgICAgICAgICBvcy5ob21lZGlyKCksIGJ1dCBpcyBpbmplY3RhYmxlIHNvIGNhbGxlcnMgKGFuZCB0ZXN0cykgY2FuIG1ha2VcbiAqICAgICAgICAgICAgICAgYGhvbWVgIGF1dGhvcml0YXRpdmUgYW5kIGtlZXAgY29uZmlnIHdyaXRlcyBpbnNpZGUgYSBzYW5kYm94LlxuICogICAgICAgICAgICAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9tY3Atc2VydmVyL2lzc3Vlcy8yMzM4IOKAlFxuICogICAgICAgICAgICAgICB3aXRob3V0IHRoaXMgb3ZlcnJpZGUsIE5WTSBoZWxwZXJzIGRyaXZlbiBieSBhIGZha2UgaG9tZSBzdGlsbFxuICogICAgICAgICAgICAgICByZXNvbHZlZCB0byB0aGUgcmVhbCBjbGllbnQgY29uZmlncyBhbmQgcGF0Y2hlZCB0aGVtLlxuICovXG5mdW5jdGlvbiBnZXRDb25maWdQYXRoKGNsaWVudDogc3RyaW5nLCBob21lID0gaG9tZWRpcigpKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHBsYXQgPSBwbGF0Zm9ybSgpO1xuXG4gIGNvbnN0IHBhdGhzOiBSZWNvcmQ8Q29uZmlnUGF0aENsaWVudCwgKCkgPT4gc3RyaW5nIHwgbnVsbD4gPSB7XG4gICAgJ2NsYXVkZSc6ICgpID0+IHtcbiAgICAgIGlmIChwbGF0ID09PSAnZGFyd2luJykgcmV0dXJuIGpvaW4oaG9tZSwgJ0xpYnJhcnknLCAnQXBwbGljYXRpb24gU3VwcG9ydCcsICdDbGF1ZGUnLCAnY2xhdWRlX2Rlc2t0b3BfY29uZmlnLmpzb24nKTtcbiAgICAgIGlmIChwbGF0ID09PSAnd2luMzInKSByZXR1cm4gam9pbihwcm9jZXNzLmVudi5BUFBEQVRBIHx8IGpvaW4oaG9tZSwgJ0FwcERhdGEnLCAnUm9hbWluZycpLCAnQ2xhdWRlJywgJ2NsYXVkZV9kZXNrdG9wX2NvbmZpZy5qc29uJyk7XG4gICAgICByZXR1cm4gam9pbihob21lLCAnLmNvbmZpZycsICdDbGF1ZGUnLCAnY2xhdWRlX2Rlc2t0b3BfY29uZmlnLmpzb24nKTtcbiAgICB9LFxuICAgICdjbGF1ZGUtY29kZSc6ICgpID0+IGpvaW4oaG9tZSwgJy5jbGF1ZGUuanNvbicpLFxuICAgICdjdXJzb3InOiAoKSA9PiBqb2luKGhvbWUsICcuY3Vyc29yJywgJ21jcC5qc29uJyksXG4gICAgJ3ZzY29kZSc6ICgpID0+IHtcbiAgICAgIGlmIChwbGF0ID09PSAnZGFyd2luJykgcmV0dXJuIGpvaW4oaG9tZSwgJ0xpYnJhcnknLCAnQXBwbGljYXRpb24gU3VwcG9ydCcsICdDb2RlJywgJ1VzZXInLCAnc2V0dGluZ3MuanNvbicpO1xuICAgICAgaWYgKHBsYXQgPT09ICd3aW4zMicpIHJldHVybiBqb2luKHByb2Nlc3MuZW52LkFQUERBVEEgfHwgam9pbihob21lLCAnQXBwRGF0YScsICdSb2FtaW5nJyksICdDb2RlJywgJ1VzZXInLCAnc2V0dGluZ3MuanNvbicpO1xuICAgICAgcmV0dXJuIGpvaW4oaG9tZSwgJy5jb25maWcnLCAnQ29kZScsICdVc2VyJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICB9LFxuICAgICd3aW5kc3VyZic6ICgpID0+IGpvaW4oaG9tZSwgJy5jb2RlaXVtJywgJ3dpbmRzdXJmJywgJ21jcF9jb25maWcuanNvbicpLFxuICAgICdjbGluZSc6ICgpID0+IHtcbiAgICAgIGlmIChwbGF0ID09PSAnZGFyd2luJykgcmV0dXJuIGpvaW4oaG9tZSwgJ0xpYnJhcnknLCAnQXBwbGljYXRpb24gU3VwcG9ydCcsICdDb2RlJywgJ1VzZXInLCAnZ2xvYmFsU3RvcmFnZScsICdzYW91ZHJpendhbi5jbGF1ZGUtZGV2JywgJ3NldHRpbmdzJywgJ2NsaW5lX21jcF9zZXR0aW5ncy5qc29uJyk7XG4gICAgICBpZiAocGxhdCA9PT0gJ3dpbjMyJykgcmV0dXJuIGpvaW4ocHJvY2Vzcy5lbnYuQVBQREFUQSB8fCBqb2luKGhvbWUsICdBcHBEYXRhJywgJ1JvYW1pbmcnKSwgJ0NvZGUnLCAnVXNlcicsICdnbG9iYWxTdG9yYWdlJywgJ3Nhb3Vkcml6d2FuLmNsYXVkZS1kZXYnLCAnc2V0dGluZ3MnLCAnY2xpbmVfbWNwX3NldHRpbmdzLmpzb24nKTtcbiAgICAgIHJldHVybiBqb2luKGhvbWUsICcuY29uZmlnJywgJ0NvZGUnLCAnVXNlcicsICdnbG9iYWxTdG9yYWdlJywgJ3Nhb3Vkcml6d2FuLmNsYXVkZS1kZXYnLCAnc2V0dGluZ3MnLCAnY2xpbmVfbWNwX3NldHRpbmdzLmpzb24nKTtcbiAgICB9LFxuICAgICdsbXN0dWRpbyc6ICgpID0+IGpvaW4oaG9tZSwgJy5sbXN0dWRpbycsICdtY3AuanNvbicpLFxuICAgICdnZW1pbmktY2xpJzogKCkgPT4gam9pbihob21lLCAnLmdlbWluaScsICdzZXR0aW5ncy5qc29uJyksXG4gICAgJ2NvZGV4JzogKCkgPT4gam9pbihob21lLCAnLmNvZGV4JywgJ2NvbmZpZy50b21sJyksXG4gIH07XG5cbiAgY29uc3QgcmVzb2x2ZXIgPSBwYXRoc1tjbGllbnQgYXMgQ29uZmlnUGF0aENsaWVudF07XG4gIHJldHVybiByZXNvbHZlciA/IHJlc29sdmVyKCkgOiBudWxsO1xufVxuXG4vKipcbiAqIE9wZW4gYSBmaWxlIGluIHRoZSBzeXN0ZW0ncyBkZWZhdWx0IHRleHQgZWRpdG9yLlxuICovXG5mdW5jdGlvbiBvcGVuSW5FZGl0b3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcGxhdCA9IHBsYXRmb3JtKCk7XG4gICAgbGV0IGNtZDogc3RyaW5nO1xuICAgIGxldCBhcmdzOiBzdHJpbmdbXTtcblxuICAgIGlmIChwbGF0ID09PSAnZGFyd2luJykge1xuICAgICAgY21kID0gJ29wZW4nO1xuICAgICAgYXJncyA9IFsnLXQnLCBmaWxlUGF0aF07XG4gICAgfSBlbHNlIGlmIChwbGF0ID09PSAnd2luMzInKSB7XG4gICAgICBjbWQgPSAnbm90ZXBhZCc7XG4gICAgICBhcmdzID0gW2ZpbGVQYXRoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY21kID0gJ3hkZy1vcGVuJztcbiAgICAgIGFyZ3MgPSBbZmlsZVBhdGhdO1xuICAgIH1cblxuICAgIGV4ZWNGaWxlKGNtZCwgYXJncywgeyB0aW1lb3V0OiAxMF8wMDAgfSwgKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb3VsZCBub3Qgb3BlbiBlZGl0b3I6ICR7ZXJyLm1lc3NhZ2V9YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKCdPcGVuZWQgaW4gZWRpdG9yLicpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqIENsaWVudHMgd2hvc2UgY29uZmlnIGZpbGVzIHdlIGNhbiBsb2NhdGUgYW5kIG9wZW4gKi9cbmNvbnN0IE9QRU5BQkxFX0NMSUVOVFMgPSBuZXcgU2V0KFtcbiAgJ2NsYXVkZScsICdjbGF1ZGUtY29kZScsICdjdXJzb3InLCAnY2xpbmUnLCAnd2luZHN1cmYnLCAnbG1zdHVkaW8nLCAnZ2VtaW5pLWNsaScsICdjb2RleCcsXG5dKTtcblxuLyoqXG4gKiBDcmVhdGUgc2V0dXAgaGFuZGxlcnMgKEV4cHJlc3MgNSBjb21wYXRpYmxlIOKAlCBwbGFpbiBoYW5kbGVyIGZ1bmN0aW9ucywgbm90IFJvdXRlcikuXG4gKi9cbmludGVyZmFjZSBEZXRlY3RSZXN1bHQge1xuICBpbnN0YWxsZWQ6IGJvb2xlYW47XG4gIGNvbmZpZ1BhdGg6IHN0cmluZyB8IG51bGw7XG4gIGN1cnJlbnRDb25maWc/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgc2VydmVyS2V5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgc2luZ2xlIGBbbWNwX3NlcnZlcnMuPG5hbWU+XWAgVE9NTCBzZWN0aW9uIGludG8gYSBjb25maWcgc3VtbWFyeS5cbiAqXG4gKiBXaGVuIGBjYXNlU2Vuc2l0aXZlYCBpcyB0cnVlLCB0aGUgc2VjdGlvbiBoZWFkZXIgbXVzdCBtYXRjaCBleGFjdGx5LiBUaGlzIGlzXG4gKiBpbXBvcnRhbnQgZm9yIENvZGV4IGJlY2F1c2UgdGhlIGluc3RhbGxlciB3cml0ZXMgYFttY3Bfc2VydmVycy5kb2xsaG91c2VtY3BdYFxuICogaW4gbG93ZXJjYXNlIGFuZCB3ZSB3YW50IHRvIHByZWZlciB0aGF0IGNhbm9uaWNhbCBlbnRyeSBvdmVyIGxlZ2FjeSBtaXhlZC1jYXNlXG4gKiBzZWN0aW9ucyB0aGF0IG1heSBzdGlsbCBiZSBwcmVzZW50IGluIHRoZSBmaWxlLlxuICovXG5mdW5jdGlvbiBwYXJzZVRvbWxTZWN0aW9uQ29uZmlnKFxuICBzZWN0aW9uTmFtZTogc3RyaW5nLFxuICByYXc6IHN0cmluZyxcbiAgY2FzZVNlbnNpdGl2ZSA9IGZhbHNlLFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHtcbiAgY29uc3QgZXNjYXBlZFNlY3Rpb25OYW1lID0gc2VjdGlvbk5hbWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xuICBjb25zdCBzZWN0aW9uUmVnZXggPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXFxbbWNwX3NlcnZlcnNcXC4ke2VzY2FwZWRTZWN0aW9uTmFtZX1cXF1gLCBjYXNlU2Vuc2l0aXZlID8gJycgOiAnaScpO1xuICBjb25zdCBzZWN0aW9uTWF0Y2ggPSBzZWN0aW9uUmVnZXguZXhlYyhyYXcpO1xuICBpZiAoIXNlY3Rpb25NYXRjaCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgdG9tbENvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IHNlcnZlck5hbWU6IHNlY3Rpb25OYW1lIH07XG4gIGNvbnN0IHNlY3Rpb25TdGFydCA9IHNlY3Rpb25NYXRjaC5pbmRleCArIHNlY3Rpb25NYXRjaFswXS5sZW5ndGg7XG4gIGNvbnN0IG5leHRTZWN0aW9uID0gcmF3LmluZGV4T2YoJ1xcblsnLCBzZWN0aW9uU3RhcnQpO1xuICBjb25zdCBzZWN0aW9uQ29udGVudCA9IG5leHRTZWN0aW9uID4gLTEgPyByYXcuc2xpY2Uoc2VjdGlvblN0YXJ0LCBuZXh0U2VjdGlvbikgOiByYXcuc2xpY2Uoc2VjdGlvblN0YXJ0KTtcblxuICBjb25zdCBjb21tYW5kTWF0Y2ggPSAvY29tbWFuZFxccyo9XFxzKlwiKFteXCJdKylcIi8uZXhlYyhzZWN0aW9uQ29udGVudCk7XG4gIGNvbnN0IGFyZ3NNYXRjaCA9IC9hcmdzXFxzKj1cXHMqXFxbKFteXFxdXSopXFxdLy5leGVjKHNlY3Rpb25Db250ZW50KTtcbiAgY29uc3QgZW5hYmxlZE1hdGNoID0gL2VuYWJsZWRcXHMqPVxccyoodHJ1ZXxmYWxzZSkvaS5leGVjKHNlY3Rpb25Db250ZW50KTtcblxuICBpZiAoY29tbWFuZE1hdGNoKSB0b21sQ29uZmlnLmNvbW1hbmQgPSBjb21tYW5kTWF0Y2hbMV07XG4gIGlmIChhcmdzTWF0Y2gpIHtcbiAgICB0b21sQ29uZmlnLmFyZ3MgPSBhcmdzTWF0Y2hbMV0uc3BsaXQoJywnKS5tYXAoKGFyZykgPT4gYXJnLnRyaW0oKS5yZXBsYWNlQWxsKCdcIicsICcnKSk7XG4gIH1cbiAgaWYgKGVuYWJsZWRNYXRjaCkge1xuICAgIHRvbWxDb25maWcuZW5hYmxlZCA9IGVuYWJsZWRNYXRjaFsxXS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG4gIH1cblxuICByZXR1cm4gdG9tbENvbmZpZztcbn1cblxuLyoqXG4gKiBQYXJzZSBhIFRPTUwgY29uZmlnIGZpbGUgZm9yIGEgRG9sbGhvdXNlTUNQIHNlcnZlciBlbnRyeS5cbiAqXG4gKiBEZXRlY3Rpb24gcHJlZmVycyB0aGUgY2Fub25pY2FsIGxvd2VyY2FzZSBDb2RleCBzZWN0aW9uIG5hbWUgZmlyc3QsIHRoZW5cbiAqIGZhbGxzIGJhY2sgdG8gb2xkZXIgRG9sbGhvdXNlLXJlbGF0ZWQgc2VjdGlvbiBuYW1lcyBzbyBzdGFsZSBjb25maWdzIGFyZVxuICogc3RpbGwgdmlzaWJsZSBpbiB0aGUgVUkgaW5zdGVhZCBvZiBiZWluZyBtaXN0YWtlbiBmb3IgYSBmcmVzaCBpbnN0YWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUb21sQ29uZmlnKHJhdzogc3RyaW5nKTogT21pdDxEZXRlY3RSZXN1bHQsICdjb25maWdQYXRoJz4ge1xuICBpZiAoIXJhdy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdkb2xsaG91c2VtY3AnKSkge1xuICAgIHJldHVybiB7IGluc3RhbGxlZDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IGV4YWN0Q29uZmlnID0gcGFyc2VUb21sU2VjdGlvbkNvbmZpZygnZG9sbGhvdXNlbWNwJywgcmF3LCB0cnVlKTtcbiAgaWYgKGV4YWN0Q29uZmlnKSB7XG4gICAgcmV0dXJuIHsgaW5zdGFsbGVkOiB0cnVlLCBjdXJyZW50Q29uZmlnOiBleGFjdENvbmZpZywgc2VydmVyS2V5OiAnbWNwX3NlcnZlcnMnIH07XG4gIH1cblxuICBjb25zdCBzZWN0aW9uTWF0Y2ggPSAvXFxbbWNwX3NlcnZlcnNcXC4oW15cXF1dKmRvbGxob3VzZW1jcFteXFxdXSopXFxdL2kuZXhlYyhyYXcpO1xuICBpZiAoIXNlY3Rpb25NYXRjaCkgcmV0dXJuIHsgaW5zdGFsbGVkOiB0cnVlLCBjdXJyZW50Q29uZmlnOiB7fSwgc2VydmVyS2V5OiAnbWNwX3NlcnZlcnMnIH07XG5cbiAgY29uc3QgZmFsbGJhY2tDb25maWcgPSBwYXJzZVRvbWxTZWN0aW9uQ29uZmlnKHNlY3Rpb25NYXRjaFsxXSwgcmF3KSA/PyB7IHNlcnZlck5hbWU6IHNlY3Rpb25NYXRjaFsxXSB9O1xuICByZXR1cm4geyBpbnN0YWxsZWQ6IHRydWUsIGN1cnJlbnRDb25maWc6IGZhbGxiYWNrQ29uZmlnLCBzZXJ2ZXJLZXk6ICdtY3Bfc2VydmVycycgfTtcbn1cblxuLyoqIFBhcnNlIGEgSlNPTiBjb25maWcgZmlsZSBmb3IgYSBEb2xsaG91c2VNQ1Agc2VydmVyIGVudHJ5ICovXG5mdW5jdGlvbiBwYXJzZUpzb25Db25maWcocmF3OiBzdHJpbmcpOiBPbWl0PERldGVjdFJlc3VsdCwgJ2NvbmZpZ1BhdGgnPiB7XG4gIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KTtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydtY3BTZXJ2ZXJzJywgJ3NlcnZlcnMnXSkge1xuICAgIGlmIChwYXJzZWRba2V5XT8uZG9sbGhvdXNlbWNwKSB7XG4gICAgICByZXR1cm4geyBpbnN0YWxsZWQ6IHRydWUsIGN1cnJlbnRDb25maWc6IHBhcnNlZFtrZXldLmRvbGxob3VzZW1jcCwgc2VydmVyS2V5OiBrZXkgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgaW5zdGFsbGVkOiBmYWxzZSB9O1xufVxuXG4vKiogQ2hlY2sgYSBzaW5nbGUgY2xpZW50IGNvbmZpZyBmaWxlIGZvciBhbiBleGlzdGluZyBEb2xsaG91c2VNQ1AgZW50cnkgKi9cbmFzeW5jIGZ1bmN0aW9uIGRldGVjdENsaWVudChjbGllbnQ6IHN0cmluZyk6IFByb21pc2U8RGV0ZWN0UmVzdWx0IHwgbnVsbD4ge1xuICBjb25zdCBjb25maWdQYXRoID0gZ2V0Q29uZmlnUGF0aChjbGllbnQpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybiBudWxsO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYWNjZXNzKGNvbmZpZ1BhdGgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBpbnN0YWxsZWQ6IGZhbHNlLCBjb25maWdQYXRoIH07XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlYWRGaWxlKGNvbmZpZ1BhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZ1BhdGguZW5kc1dpdGgoJy50b21sJykgPyBwYXJzZVRvbWxDb25maWcocmF3KSA6IHBhcnNlSnNvbkNvbmZpZyhyYXcpO1xuICAgIHJldHVybiB7IGNvbmZpZ1BhdGgsIC4uLnJlc3VsdCB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBpbnN0YWxsZWQ6IGZhbHNlLCBjb25maWdQYXRoIH07XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgbm9ybWFsaXplIGEgY2xpZW50IG5hbWUgZnJvbSByZXF1ZXN0IGJvZHkuXG4gKiBSZXR1cm5zIHRoZSBub3JtYWxpemVkIGNsaWVudCBuYW1lIG9yIG51bGwgKHdpdGggZXJyb3IgcmVzcG9uc2Ugc2VudCkuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ2xpZW50KFxuICByZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIGFsbG93ZWRTZXQ6IFNldDxzdHJpbmc+LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHsgY2xpZW50IH0gPSByZXEuYm9keSBhcyB7IGNsaWVudD86IHN0cmluZyB9O1xuICBpZiAoIWNsaWVudCB8fCB0eXBlb2YgY2xpZW50ICE9PSAnc3RyaW5nJykge1xuICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6ICdNaXNzaW5nIHJlcXVpcmVkIGZpZWxkOiBjbGllbnQnIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShjbGllbnQpLm5vcm1hbGl6ZWRDb250ZW50LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICBpZiAoIWFsbG93ZWRTZXQuaGFzKG5vcm1hbGl6ZWQpKSB7XG4gICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe1xuICAgICAgZXJyb3I6IGBVbnN1cHBvcnRlZCBjbGllbnQ6ICR7Y2xpZW50fWAsXG4gICAgICBzdXBwb3J0ZWQ6IEFycmF5LmZyb20oYWxsb3dlZFNldCksXG4gICAgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbnR5cGUgUmVxdWVzdGVkSW5zdGFsbFZlcnNpb25SZXN1bHQgPVxuICB8IHsgZWZmZWN0aXZlVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkOyBlcnJvcjogbnVsbCB9XG4gIHwgeyBlZmZlY3RpdmVWZXJzaW9uOiBudWxsOyBlcnJvcjogc3RyaW5nIH07XG5cbmZ1bmN0aW9uIHJlc29sdmVSZXF1ZXN0ZWRJbnN0YWxsVmVyc2lvbihib2R5OiB1bmtub3duKTogUmVxdWVzdGVkSW5zdGFsbFZlcnNpb25SZXN1bHQge1xuICBjb25zdCB7IHZlcnNpb24sIGNoYW5uZWwgfSA9IChib2R5ID8/IHt9KSBhcyB7IHZlcnNpb24/OiBzdHJpbmc7IGNoYW5uZWw/OiBzdHJpbmcgfTtcbiAgY29uc3Qgbm9ybWFsaXplZFZlcnNpb24gPSB2ZXJzaW9uID8gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodmVyc2lvbikubm9ybWFsaXplZENvbnRlbnQgOiB1bmRlZmluZWQ7XG4gIGlmIChub3JtYWxpemVkVmVyc2lvbiAmJiAhL15cXGQrXFwuXFxkK1xcLlxcZCsvLnRlc3Qobm9ybWFsaXplZFZlcnNpb24pKSB7XG4gICAgcmV0dXJuIHsgZWZmZWN0aXZlVmVyc2lvbjogbnVsbCwgZXJyb3I6ICdJbnZhbGlkIHZlcnNpb24gZm9ybWF0LiBFeHBlY3RlZCBzZW12ZXIgKGUuZy4sIDIuMC4yKScgfTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRDaGFubmVsID0gY2hhbm5lbCA/IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGNoYW5uZWwpLm5vcm1hbGl6ZWRDb250ZW50IDogdW5kZWZpbmVkO1xuICBjb25zdCBlZmZlY3RpdmVWZXJzaW9uID0gbm9ybWFsaXplZENoYW5uZWwgJiYgQUxMT1dFRF9JTlNUQUxMX0NIQU5ORUxTLmhhcyhub3JtYWxpemVkQ2hhbm5lbCkgJiYgbm9ybWFsaXplZENoYW5uZWwgIT09ICdsYXRlc3QnXG4gICAgPyBub3JtYWxpemVkQ2hhbm5lbFxuICAgIDogbm9ybWFsaXplZFZlcnNpb247XG5cbiAgcmV0dXJuIHsgZWZmZWN0aXZlVmVyc2lvbiwgZXJyb3I6IG51bGwgfTtcbn1cblxuZnVuY3Rpb24gdG9Odm1NaXRpZ2F0aW9uQXBwbGllZChyZXN1bHQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgYXBwbHlOdm1MYXVuY2hlcklmTmVlZGVkPj4pOiBib29sZWFuIHwgbnVsbCB7XG4gIGlmIChyZXN1bHQgPT09ICdhcHBsaWVkJykgcmV0dXJuIHRydWU7XG4gIGlmIChyZXN1bHQgPT09ICdmYWlsZWQnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBudWxsO1xufVxuXG4vLyDilIDilIAgTGljZW5zZSB2ZXJpZmljYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IE1TX1BFUl9NSU5VVEUgPSA2MCAqIDEwMDA7XG5jb25zdCBWRVJJRklDQVRJT05fQ09ERV9UVExfTUlOVVRFUyA9IDEwO1xuY29uc3QgVkVSSUZJQ0FUSU9OX0NPREVfVFRMX01TID0gVkVSSUZJQ0FUSU9OX0NPREVfVFRMX01JTlVURVMgKiBNU19QRVJfTUlOVVRFO1xuY29uc3QgVkVSSUZJQ0FUSU9OX01BWF9BVFRFTVBUUyA9IDU7XG5jb25zdCBMSUNFTlNFX1dPUktFUl9USU1FT1VUX01TID0gOF8wMDA7XG5jb25zdCBMSUNFTlNFX1dPUktFUl9FUlJPUl9CT0RZX0xJTUlUID0gMzAwO1xuY29uc3QgREVGQVVMVF9MSUNFTlNFX1dPUktFUl9VUkwgPSAnaHR0cHM6Ly9kb2xsaG91c2VtY3AtbGljZW5zZS1lbWFpbC5taWNrLWViYS53b3JrZXJzLmRldic7XG5cbi8qKiBHZW5lcmF0ZSBhIGNyeXB0b2dyYXBoaWNhbGx5IHJhbmRvbSA2LWRpZ2l0IHZlcmlmaWNhdGlvbiBjb2RlLiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVWZXJpZmljYXRpb25Db2RlKCk6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmcocmFuZG9tSW50KDEwMDAwMCwgOTk5OTk5KSk7XG59XG5cbi8qKiBDaGVjayBpZiBhIHZlcmlmaWNhdGlvbiBjb2RlIGhhcyBleHBpcmVkLiAqL1xuZnVuY3Rpb24gaXNDb2RlRXhwaXJlZChleHBpcmVzQXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbmV3IERhdGUoZXhwaXJlc0F0KS5nZXRUaW1lKCkgPCBEYXRlLm5vdygpO1xufVxuXG4vLyDilIDilIAgTGljZW5zZSBoZWxwZXJzIChtb2R1bGUgc2NvcGUgZm9yIFNvbmFyQ2xvdWQgUzc3MjEpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5jb25zdCBWQUxJRF9MSUNFTlNFX1RJRVJTID0gbmV3IFNldChbJ2FncGwnLCAnZnJlZS1jb21tZXJjaWFsJywgJ3BhaWQtY29tbWVyY2lhbCddKTtcbmNvbnN0IFZBTElEX1JFVkVOVUVfU0NBTEVTID0gbmV3IFNldChbJyQxTeKAkyQ1TScsICckNU3igJMkMjVNJywgJyQyNU3igJMkMTAwTScsICckMTAwTSsnXSk7XG4vLyBTYWZlIGZyb20gUmVEb1M6IGlucHV0IGlzIHByZS1jaGVja2VkIHRvIOKJpDI1NCBjaGFycywgYW5kIHsxLDY0fS97MSwyNTN9L3syLDYzfVxuLy8gYm91bmRzIHByZXZlbnQgY2F0YXN0cm9waGljIGJhY2t0cmFja2luZyBvbiBhbnkgaW5wdXQgd2l0aGluIHRoYXQgbGVuZ3RoLlxuY29uc3QgRU1BSUxfUEFUVEVSTiA9IC9eW15cXHNAXXsxLDY0fUBbXlxcc0BdezEsMjUzfVxcLlteXFxzQF17Miw2M30kLztcblxuLyoqIFNhbml0aXplIGEgc3RyaW5nIGZpZWxkOiB0cmltLCB0cnVuY2F0ZSwgcmV0dXJuIHVuZGVmaW5lZCBpZiBlbXB0eS4gKi9cbmZ1bmN0aW9uIHNhbml0aXplKHZhbDogdW5rbm93biwgbWF4TGVuOiBudW1iZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbCAhPT0gJ3N0cmluZycgfHwgIXZhbC50cmltKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB2YWwudHJpbSgpLnNsaWNlKDAsIG1heExlbik7XG59XG5cbi8qKiBWYWxpZGF0ZSBlbWFpbCBmb3JtYXQgYW5kIGNvbW1lcmNpYWwgYWNrbm93bGVkZ21lbnRzLiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDb21tZXJjaWFsRmllbGRzKGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHsgZW1haWwsIHRlbGVtZXRyeUFja25vd2xlZGdlZCB9ID0gYm9keTtcbiAgaWYgKCFlbWFpbCB8fCB0eXBlb2YgZW1haWwgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuICdFbWFpbCBhZGRyZXNzIGlzIHJlcXVpcmVkIGZvciBDb21tZXJjaWFsIGFuZCBFbnRlcnByaXNlIGxpY2Vuc2VzJztcbiAgfVxuICBpZiAoZW1haWwubGVuZ3RoID4gMjU0IHx8ICFFTUFJTF9QQVRURVJOLnRlc3QoZW1haWwpKSB7XG4gICAgcmV0dXJuICdQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnO1xuICB9XG4gIGlmICghdGVsZW1ldHJ5QWNrbm93bGVkZ2VkKSB7XG4gICAgcmV0dXJuICdUZWxlbWV0cnkgYWNrbm93bGVkZ21lbnQgaXMgcmVxdWlyZWQgZm9yIENvbW1lcmNpYWwgYW5kIEVudGVycHJpc2UgbGljZW5zZXMnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogVmFsaWRhdGUgZnJlZS1jb21tZXJjaWFsIHNwZWNpZmljIGZpZWxkcy4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRnJlZUNvbW1lcmNpYWxGaWVsZHMoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyBhdHRyaWJ1dGlvbkFja25vd2xlZGdlZCwgcmV2ZW51ZUF0dGVzdGVkIH0gPSBib2R5O1xuICBpZiAoIWF0dHJpYnV0aW9uQWNrbm93bGVkZ2VkKSB7XG4gICAgcmV0dXJuICdBdHRyaWJ1dGlvbiBhY2tub3dsZWRnbWVudCBpcyByZXF1aXJlZCBmb3IgQ29tbWVyY2lhbCBsaWNlbnNlcyc7XG4gIH1cbiAgaWYgKCFyZXZlbnVlQXR0ZXN0ZWQpIHtcbiAgICByZXR1cm4gJ1JldmVudWUgYXR0ZXN0YXRpb24gaXMgcmVxdWlyZWQgZm9yIENvbW1lcmNpYWwgbGljZW5zZXMnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogVmFsaWRhdGUgZW50ZXJwcmlzZSBzcGVjaWZpYyBmaWVsZHMuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUVudGVycHJpc2VGaWVsZHMoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyByZXZlbnVlU2NhbGUsIGNvbXBhbnlOYW1lLCB1c2VDYXNlIH0gPSBib2R5O1xuICBpZiAoIXJldmVudWVTY2FsZSB8fCAhVkFMSURfUkVWRU5VRV9TQ0FMRVMuaGFzKHJldmVudWVTY2FsZSBhcyBzdHJpbmcpKSB7XG4gICAgcmV0dXJuIGBSZXZlbnVlIHNjYWxlIGlzIHJlcXVpcmVkLiBNdXN0IGJlIG9uZSBvZjogJHtbLi4uVkFMSURfUkVWRU5VRV9TQ0FMRVNdLmpvaW4oJywgJyl9YDtcbiAgfVxuICBpZiAoIWNvbXBhbnlOYW1lIHx8IHR5cGVvZiBjb21wYW55TmFtZSAhPT0gJ3N0cmluZycgfHwgIWNvbXBhbnlOYW1lLnRyaW0oKSkge1xuICAgIHJldHVybiAnQ29tcGFueSBuYW1lIGlzIHJlcXVpcmVkIGZvciBFbnRlcnByaXNlIGxpY2Vuc2VzJztcbiAgfVxuICBpZiAoIXVzZUNhc2UgfHwgdHlwZW9mIHVzZUNhc2UgIT09ICdzdHJpbmcnIHx8ICF1c2VDYXNlLnRyaW0oKSkge1xuICAgIHJldHVybiAnVXNlIGNhc2UgaXMgcmVxdWlyZWQgZm9yIEVudGVycHJpc2UgbGljZW5zZXMnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogVmFsaWRhdGUgbGljZW5zZSBmb3JtIGlucHV0LiBSZXR1cm5zIGVycm9yIHN0cmluZyBvciBudWxsIGlmIHZhbGlkLiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVMaWNlbnNlSW5wdXQoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyB0aWVyIH0gPSBib2R5O1xuICBpZiAoIXRpZXIgfHwgIVZBTElEX0xJQ0VOU0VfVElFUlMuaGFzKHRpZXIgYXMgc3RyaW5nKSkge1xuICAgIHJldHVybiBgSW52YWxpZCBsaWNlbnNlIHRpZXIuIE11c3QgYmUgb25lIG9mOiAke1suLi5WQUxJRF9MSUNFTlNFX1RJRVJTXS5qb2luKCcsICcpfWA7XG4gIH1cbiAgaWYgKHRpZXIgIT09ICdhZ3BsJykge1xuICAgIGNvbnN0IGNvbW1lcmNpYWxFcnJvciA9IHZhbGlkYXRlQ29tbWVyY2lhbEZpZWxkcyhib2R5KTtcbiAgICBpZiAoY29tbWVyY2lhbEVycm9yKSByZXR1cm4gY29tbWVyY2lhbEVycm9yO1xuICB9XG4gIGlmICh0aWVyID09PSAnZnJlZS1jb21tZXJjaWFsJykge1xuICAgIGNvbnN0IGZyZWVFcnJvciA9IHZhbGlkYXRlRnJlZUNvbW1lcmNpYWxGaWVsZHMoYm9keSk7XG4gICAgaWYgKGZyZWVFcnJvcikgcmV0dXJuIGZyZWVFcnJvcjtcbiAgfVxuICBpZiAodGllciA9PT0gJ3BhaWQtY29tbWVyY2lhbCcpIHtcbiAgICBjb25zdCBlbnRlcnByaXNlRXJyb3IgPSB2YWxpZGF0ZUVudGVycHJpc2VGaWVsZHMoYm9keSk7XG4gICAgaWYgKGVudGVycHJpc2VFcnJvcikgcmV0dXJuIGVudGVycHJpc2VFcnJvcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIEJ1aWxkIGxpY2Vuc2UgZGF0YSBvYmplY3QgZnJvbSB2YWxpZGF0ZWQgaW5wdXQuICovXG5mdW5jdGlvbiBidWlsZExpY2Vuc2VEYXRhKGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCB7IHRpZXIsIGVtYWlsLCByZXZlbnVlU2NhbGUsIGNvbXBhbnlOYW1lLCB1c2VDYXNlIH0gPSBib2R5O1xuICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgdGllciB9O1xuICBpZiAodGllciAhPT0gJ2FncGwnKSB7XG4gICAgZGF0YS5lbWFpbCA9IHNhbml0aXplKGVtYWlsLCAyNTQpO1xuICAgIGRhdGEuYXR0ZXN0ZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICBkYXRhLnRlbGVtZXRyeVJlcXVpcmVkID0gdHJ1ZTtcbiAgfVxuICBpZiAodGllciA9PT0gJ3BhaWQtY29tbWVyY2lhbCcpIHtcbiAgICBpZiAocmV2ZW51ZVNjYWxlKSBkYXRhLnJldmVudWVTY2FsZSA9IHJldmVudWVTY2FsZTtcbiAgICBpZiAoY29tcGFueU5hbWUpIGRhdGEuY29tcGFueU5hbWUgPSBzYW5pdGl6ZShjb21wYW55TmFtZSwgMjAwKTtcbiAgICBpZiAodXNlQ2FzZSkgZGF0YS51c2VDYXNlID0gc2FuaXRpemUodXNlQ2FzZSwgNTAwKTtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqIFNlbmQgbGljZW5zZV9hY3RpdmF0aW9uIGV2ZW50IHRvIFBvc3RIb2cgZm9yIGNvbW1lcmNpYWwgdGllcnMuICovXG5hc3luYyBmdW5jdGlvbiBjYXB0dXJlUG9zdEhvZ0xpY2Vuc2VFdmVudChsaWNlbnNlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcG9zdGhvZyA9IG5ldyBQb3N0SG9nKFBPU1RIT0dfUFJPSkVDVF9LRVksIHtcbiAgICBob3N0OiBwcm9jZXNzLmVudi5QT1NUSE9HX0hPU1QgfHwgJ2h0dHBzOi8vYXBwLnBvc3Rob2cuY29tJyxcbiAgICBmbHVzaEF0OiAxLFxuICAgIGZsdXNoSW50ZXJ2YWw6IDUwMDAsXG4gIH0pO1xuICBsZXQgaW5zdGFsbElkOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY29uc3QgaWRQYXRoID0gam9pbihob21lZGlyKCksICcuZG9sbGhvdXNlJywgJy50ZWxlbWV0cnktaWQnKTtcbiAgICBpbnN0YWxsSWQgPSAoYXdhaXQgcmVhZEZpbGUoaWRQYXRoLCAndXRmLTgnKSkudHJpbSgpO1xuICB9IGNhdGNoIHtcbiAgICBpbnN0YWxsSWQgPSB1dWlkdjQoKTtcbiAgfVxuICBjb25zdCBldmVudFR5cGUgPSAobGljZW5zZURhdGEuZXZlbnRUeXBlIGFzIHN0cmluZykgPz8gJ2FjdGl2YXRpb24nO1xuICBwb3N0aG9nLmNhcHR1cmUoe1xuICAgIGRpc3RpbmN0SWQ6IGluc3RhbGxJZCxcbiAgICBldmVudDogJ2xpY2Vuc2VfYWN0aXZhdGlvbicsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgdGllcjogbGljZW5zZURhdGEudGllcixcbiAgICAgIGVtYWlsOiBsaWNlbnNlRGF0YS5lbWFpbCxcbiAgICAgIGV2ZW50X3R5cGU6IGV2ZW50VHlwZSxcbiAgICAgIHNlcnZlcl92ZXJzaW9uOiBQQUNLQUdFX1ZFUlNJT04sXG4gICAgICBvczogcGxhdGZvcm0oKSxcbiAgICAgIC4uLihldmVudFR5cGUgPT09ICd2ZXJpZmljYXRpb24nID8ge1xuICAgICAgICB2ZXJpZmljYXRpb25fY29kZTogbGljZW5zZURhdGEudmVyaWZpY2F0aW9uQ29kZSxcbiAgICAgIH0gOiB7fSksXG4gICAgICAuLi4oZXZlbnRUeXBlID09PSAnYWN0aXZhdGlvbicgPyB7XG4gICAgICAgIHZlcmlmaWNhdGlvbl90aW1lX21zOiBsaWNlbnNlRGF0YS52ZXJpZmljYXRpb25fdGltZV9tcyxcbiAgICAgICAgdmVyaWZpY2F0aW9uX3RpbWVfc2Vjb25kczogbGljZW5zZURhdGEudmVyaWZpY2F0aW9uX3RpbWVfbXNcbiAgICAgICAgICA/IE1hdGgucm91bmQoKGxpY2Vuc2VEYXRhLnZlcmlmaWNhdGlvbl90aW1lX21zIGFzIG51bWJlcikgLyAxMDAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdmVyaWZpY2F0aW9uX2F0dGVtcHRzOiBsaWNlbnNlRGF0YS52ZXJpZmljYXRpb25fYXR0ZW1wdHMsXG4gICAgICB9IDoge30pLFxuICAgICAgLi4uKGxpY2Vuc2VEYXRhLnRpZXIgPT09ICdwYWlkLWNvbW1lcmNpYWwnID8ge1xuICAgICAgICByZXZlbnVlX3NjYWxlOiBsaWNlbnNlRGF0YS5yZXZlbnVlU2NhbGUsXG4gICAgICAgIGNvbXBhbnlfbmFtZTogbGljZW5zZURhdGEuY29tcGFueU5hbWUsXG4gICAgICAgIHVzZV9jYXNlOiBsaWNlbnNlRGF0YS51c2VDYXNlLFxuICAgICAgfSA6IHt9KSxcbiAgICB9LFxuICB9KTtcbiAgYXdhaXQgcG9zdGhvZy5zaHV0ZG93bigpO1xufVxuXG5mdW5jdGlvbiBidWlsZExpY2Vuc2VXb3JrZXJSZXF1ZXN0Qm9keShcbiAgbGljZW5zZURhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB2ZXJpZmljYXRpb25Db2RlOiBzdHJpbmcsXG4gIGRpc3RpbmN0SWQ6IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgZXZlbnQ6ICdsaWNlbnNlX2FjdGl2YXRpb24nLFxuICAgIGRpc3RpbmN0X2lkOiBkaXN0aW5jdElkLFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHRpZXI6IGxpY2Vuc2VEYXRhLnRpZXIsXG4gICAgICBlbWFpbDogbGljZW5zZURhdGEuZW1haWwsXG4gICAgICBldmVudF90eXBlOiAndmVyaWZpY2F0aW9uJyxcbiAgICAgIHZlcmlmaWNhdGlvbl9jb2RlOiB2ZXJpZmljYXRpb25Db2RlLFxuICAgICAgc2VydmVyX3ZlcnNpb246IFBBQ0tBR0VfVkVSU0lPTixcbiAgICAgIG9zOiBwbGF0Zm9ybSgpLFxuICAgIH0sXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZW5kTGljZW5zZVdvcmtlclZlcmlmaWNhdGlvbkVtYWlsKFxuICBsaWNlbnNlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHZlcmlmaWNhdGlvbkNvZGU6IHN0cmluZyxcbiAgZGlzdGluY3RJZDogc3RyaW5nLFxuKTogUHJvbWlzZTx7IG9rOiB0cnVlIH0gfCB7IG9rOiBmYWxzZTsgc3RhdHVzPzogbnVtYmVyOyBlcnJvcjogc3RyaW5nOyByZXNwb25zZUJvZHk/OiBzdHJpbmcgfT4ge1xuICBjb25zdCB3b3JrZXJVcmwgPSBuZXcgVVJMKExJQ0VOU0VfV09SS0VSX0RJUkVDVF9QQVRILCBwcm9jZXNzLmVudi5ET0xMSE9VU0VfTElDRU5TRV9XT1JLRVJfVVJMIHx8IERFRkFVTFRfTElDRU5TRV9XT1JLRVJfVVJMKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2god29ya2VyVXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0sXG4gICAgICBib2R5OiBidWlsZExpY2Vuc2VXb3JrZXJSZXF1ZXN0Qm9keShsaWNlbnNlRGF0YSwgdmVyaWZpY2F0aW9uQ29kZSwgZGlzdGluY3RJZCksXG4gICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoTElDRU5TRV9XT1JLRVJfVElNRU9VVF9NUyksXG4gICAgfSk7XG5cbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHJldHVybiB7IG9rOiB0cnVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgZXJyb3I6IGB3b3JrZXJfaHR0cF8ke3Jlc3BvbnNlLnN0YXR1c31gLFxuICAgICAgcmVzcG9uc2VCb2R5OiAoYXdhaXQgcmVzcG9uc2UudGV4dCgpKS5zbGljZSgwLCBMSUNFTlNFX1dPUktFUl9FUlJPUl9CT0RZX0xJTUlUKSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICAgIChlcnJvci5uYW1lID09PSAnVGltZW91dEVycm9yJyB8fFxuICAgICAgICBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicgfHxcbiAgICAgICAgZXJyb3IubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCd0aW1lb3V0JykgfHxcbiAgICAgICAgZXJyb3IubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCd0aW1lZCBvdXQnKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6ICd3b3JrZXJfdGltZW91dCcgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRMaWNlbnNlV29ya2VyRmFpbHVyZU1lc3NhZ2UocmVzdWx0OiB7IHN0YXR1cz86IG51bWJlcjsgZXJyb3I6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDQwMSB8fCByZXN1bHQuc3RhdHVzID09PSA0MDMpIHtcbiAgICByZXR1cm4gJ1ZlcmlmaWNhdGlvbiBlbWFpbCBzZXJ2aWNlIHJlamVjdGVkIHRoZSByZXF1ZXN0LiBQbGVhc2UgY2hlY2sgdGhlIGxvY2FsIGVtYWlsIGRlbGl2ZXJ5IGNvbmZpZ3VyYXRpb24gYW5kIHRyeSBhZ2Fpbi4nO1xuICB9XG4gIGlmIChyZXN1bHQuZXJyb3IgPT09ICd3b3JrZXJfdGltZW91dCcpIHtcbiAgICByZXR1cm4gJ1ZlcmlmaWNhdGlvbiBlbWFpbCBzZXJ2aWNlIHRpbWVkIG91dC4gUGxlYXNlIHRyeSBhZ2FpbiBpbiBhIG1vbWVudC4nO1xuICB9XG4gIHJldHVybiAnV2UgY291bGQgbm90IHNlbmQgdGhlIHZlcmlmaWNhdGlvbiBlbWFpbCByaWdodCBub3cuIFBsZWFzZSB0cnkgYWdhaW4gaW4gYSBtb21lbnQuJztcbn1cblxuZnVuY3Rpb24gbG9nTGljZW5zZVdvcmtlckRlbGl2ZXJ5RmFpbHVyZShcbiAgbWVzc2FnZTogc3RyaW5nLFxuICBsaWNlbnNlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGRlbGl2ZXJ5UmVzdWx0OiB7IHN0YXR1cz86IG51bWJlcjsgZXJyb3I6IHN0cmluZzsgcmVzcG9uc2VCb2R5Pzogc3RyaW5nIH0sXG4pOiB2b2lkIHtcbiAgbG9nZ2VyLmVycm9yKG1lc3NhZ2UsIHtcbiAgICB0aWVyOiBsaWNlbnNlRGF0YS50aWVyLFxuICAgIHN0YXR1czogZGVsaXZlcnlSZXN1bHQuc3RhdHVzID8/IG51bGwsXG4gICAgZXJyb3I6IGRlbGl2ZXJ5UmVzdWx0LmVycm9yLFxuICAgIHJlc3BvbnNlQm9keUxlbmd0aDogZGVsaXZlcnlSZXN1bHQucmVzcG9uc2VCb2R5Py5sZW5ndGggPz8gMCxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZXR1cFJvdXRlcyhvcHRzPzoge1xuICAvKiogT3ZlcnJpZGUgaW5zdGFsbC1tY3AgcnVubmVyLiBGb3IgdGVzdGluZyBvbmx5IOKAlCBwcmVmaXggc2lnbmFscyB0ZXN0LW9ubHkgdXNlLiAqL1xuICBfcnVuSW5zdGFsbE1jcD86IChjbGllbnQ6IHN0cmluZywgdmVyc2lvbj86IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xuICAvKiogT3ZlcnJpZGUgcGVybWlzc2lvbiBob29rIGluc3RhbGxlci4gRm9yIHRlc3Rpbmcgb25seS4gKi9cbiAgX2luc3RhbGxQZXJtaXNzaW9uSG9vaz86IChjbGllbnQ6IHN0cmluZykgPT4gUHJvbWlzZTxJbnN0YWxsUGVybWlzc2lvbkhvb2tSZXN1bHQ+O1xuICAvKiogT3ZlcnJpZGUgcGVybWlzc2lvbiBob29rIHN0YXR1cyByZWNvbmNpbGVyLiBGb3IgdGVzdGluZyBvbmx5LiAqL1xuICBfcmVjb25jaWxlUGVybWlzc2lvbkhvb2tTdGF0dXM/OiAoY2xpZW50OiBzdHJpbmcpID0+IFByb21pc2U8UGVybWlzc2lvbkhvb2tTdGF0dXM+O1xuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIE5WTSBsYXVuY2hlciBtaXRpZ2F0aW9uIGFwcGxpZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGluc3RhbGwuXG4gICAqIEZvciB0ZXN0aW5nIG9ubHkuIFdpdGhvdXQgdGhpcyBzZWFtIHRoZSBpbnN0YWxsIGhhbmRsZXIgcnVucyB0aGUgcmVhbFxuICAgKiBhcHBseU52bUxhdW5jaGVySWZOZWVkZWQgYWdhaW5zdCB0aGUgcmVhbCBob21lZGlyKCk7IG9uIGEgbWFjaGluZSBXSVRIIE5WTVxuICAgKiB0aGF0IHBhdGNoZXMgdGhlIGRldmVsb3BlcidzIHJlYWwgY2xpZW50IGNvbmZpZ3MgKGlzc3VlICMyMzM4KS5cbiAgICovXG4gIF9hcHBseU52bUxhdW5jaGVyPzogKGNsaWVudDogc3RyaW5nKSA9PiBQcm9taXNlPE52bUxhdW5jaGVyUmVzdWx0PjtcbiAgLyoqIEVuYWJsZSBhdXRvbWF0aWMgaG9vayBhc3NldCByZXBhaXIgZHVyaW5nIGRldGVjdC4gRGVmYXVsdHMgb2ZmIGluIHRlc3RzLiAqL1xuICBfYXV0b1JlcGFpclBlcm1pc3Npb25Ib29rc09uRGV0ZWN0PzogYm9vbGVhbjtcbiAgLyoqIFNraXAgdGhlIHNsaWRpbmctd2luZG93IHJhdGUgbGltaXRlci4gRm9yIHRlc3Rpbmcgb25seS4gKi9cbiAgX3NraXBSYXRlTGltaXQ/OiBib29sZWFuO1xufSk6IHtcbiAgaW5zdGFsbEhhbmRsZXI6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IFByb21pc2U8dm9pZD47XG4gIG9wZW5Db25maWdIYW5kbGVyOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB2ZXJzaW9uSGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgbWNwYlJlZGlyZWN0SGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgZGV0ZWN0SGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgZ2V0TGljZW5zZUhhbmRsZXI6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IFByb21pc2U8dm9pZD47XG4gIHNldExpY2Vuc2VIYW5kbGVyOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB2ZXJpZnlMaWNlbnNlSGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmVzZW5kVmVyaWZpY2F0aW9uSGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbn0ge1xuICBjb25zdCBpbnN0YWxsZXIgPSBvcHRzPy5fcnVuSW5zdGFsbE1jcCA/PyBydW5JbnN0YWxsTWNwO1xuICBjb25zdCBwZXJtaXNzaW9uSG9va0luc3RhbGxlciA9IG9wdHM/Ll9pbnN0YWxsUGVybWlzc2lvbkhvb2sgPz8gaW5zdGFsbFBlcm1pc3Npb25Ib29rO1xuICBjb25zdCBudm1MYXVuY2hlckFwcGxpZXIgPSBvcHRzPy5fYXBwbHlOdm1MYXVuY2hlciA/PyBhcHBseU52bUxhdW5jaGVySWZOZWVkZWQ7XG4gIGNvbnN0IGF1dG9SZXBhaXJQZXJtaXNzaW9uSG9va3NPbkRldGVjdCA9IG9wdHM/Ll9hdXRvUmVwYWlyUGVybWlzc2lvbkhvb2tzT25EZXRlY3QgPz8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0JztcbiAgY29uc3QgaG9va1N0YXR1c1JlY29uY2lsZXIgPSBvcHRzPy5fcmVjb25jaWxlUGVybWlzc2lvbkhvb2tTdGF0dXMgPz8gKGFzeW5jIChjbGllbnQ6IHN0cmluZykgPT5cbiAgICByZWNvbmNpbGVQZXJtaXNzaW9uSG9va1N0YXR1cyhjbGllbnQsIHsgYXV0b1JlcGFpcjogYXV0b1JlcGFpclBlcm1pc3Npb25Ib29rc09uRGV0ZWN0IH0pKTtcbiAgY29uc3Qgc2tpcFJhdGVMaW1pdCA9IG9wdHM/Ll9za2lwUmF0ZUxpbWl0ID8/IGZhbHNlO1xuICAvLyDilIDilIAgRGV0ZWN0IGV4aXN0aW5nIGluc3RhbGxhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGNvbnN0IGRldGVjdEhhbmRsZXIgPSBhc3luYyAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGNsaWVudHMgPSBbXG4gICAgICB7IGlkOiAnY2xhdWRlJywgbmFtZTogJ0NsYXVkZSBEZXNrdG9wJyB9LFxuICAgICAgeyBpZDogJ2NsYXVkZS1jb2RlJywgbmFtZTogJ0NsYXVkZSBDb2RlJyB9LFxuICAgICAgeyBpZDogJ2N1cnNvcicsIG5hbWU6ICdDdXJzb3InIH0sXG4gICAgICB7IGlkOiAndnNjb2RlJywgbmFtZTogJ1ZTIENvZGUnIH0sXG4gICAgICB7IGlkOiAnY2xpbmUnLCBuYW1lOiAnQ2xpbmUnIH0sXG4gICAgICB7IGlkOiAnd2luZHN1cmYnLCBuYW1lOiAnV2luZHN1cmYnIH0sXG4gICAgICB7IGlkOiAnbG1zdHVkaW8nLCBuYW1lOiAnTE0gU3R1ZGlvJyB9LFxuICAgICAgeyBpZDogJ2dlbWluaS1jbGknLCBuYW1lOiAnR2VtaW5pIENMSScgfSxcbiAgICAgIHsgaWQ6ICdjb2RleCcsIG5hbWU6ICdDb2RleCcgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgcmVzdWx0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRzLm1hcChhc3luYyAoeyBpZCwgbmFtZSB9KSA9PiB7XG4gICAgICBjb25zdCBkZXRlY3Rpb24gPSBhd2FpdCBkZXRlY3RDbGllbnQoaWQpO1xuICAgICAgaWYgKGRldGVjdGlvbikge1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgc3VwcG9ydDogeyBsZXZlbDogU0VUVVBfU1VQUE9SVF9MRVZFTFNbaWRdIH0sXG4gICAgICAgICAgLi4uZGV0ZWN0aW9uLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoaWQgPT09ICdjbGF1ZGUtY29kZScgfHwgaWQgPT09ICdjdXJzb3InIHx8IGlkID09PSAndnNjb2RlJyB8fCBpZCA9PT0gJ3dpbmRzdXJmJyB8fCBpZCA9PT0gJ2dlbWluaS1jbGknIHx8IGlkID09PSAnY29kZXgnKSB7XG4gICAgICAgICAgY29uc3QgaG9va1N0YXR1cyA9IGF3YWl0IGhvb2tTdGF0dXNSZWNvbmNpbGVyKGlkKTtcbiAgICAgICAgICByZXN1bHQuaG9va0luc3RhbGxlZCA9IGhvb2tTdGF0dXMuaW5zdGFsbGVkO1xuICAgICAgICAgIHJlc3VsdC5ob29rQXNzZXRzUHJlcGFyZWQgPSBob29rU3RhdHVzLmFzc2V0c1ByZXBhcmVkO1xuICAgICAgICAgIHJlc3VsdC5ob29rQXNzZXRzQ3VycmVudCA9IGhvb2tTdGF0dXMuYXNzZXRzQ3VycmVudDtcbiAgICAgICAgICByZXN1bHQuaG9va0F1dG9SZXBhaXJlZCA9IGhvb2tTdGF0dXMuYXV0b1JlcGFpcmVkO1xuICAgICAgICAgIHJlc3VsdC5ob29rTmVlZHNSZXBhaXIgPSBob29rU3RhdHVzLm5lZWRzUmVwYWlyO1xuICAgICAgICAgIHJlc3VsdC5ob29rUmVwYWlyRXJyb3IgPSBob29rU3RhdHVzLnJlcGFpckVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdHNbaWRdID0gcmVzdWx0O1xuICAgICAgfVxuICAgIH0pKTtcblxuICAgIHJlcy5qc29uKHJlc3VsdHMpO1xuICB9O1xuXG4gIC8vIOKUgOKUgCBPcGVuIGNvbmZpZyBmaWxlIGluIGVkaXRvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29uc3Qgb3BlbkNvbmZpZ0hhbmRsZXIgPSBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENsaWVudCA9IHZhbGlkYXRlQ2xpZW50KHJlcSwgcmVzLCBPUEVOQUJMRV9DTElFTlRTKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWRDbGllbnQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBnZXRDb25maWdQYXRoKG5vcm1hbGl6ZWRDbGllbnQpO1xuICAgIGlmICghY29uZmlnUGF0aCkge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogYENvbmZpZyBwYXRoIHVua25vd24gZm9yOiAke25vcm1hbGl6ZWRDbGllbnR9YCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIGZpbGUgd2l0aCBlbXB0eSBjb250ZW50IGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFjY2Vzcyhjb25maWdQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoY29uZmlnUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gY29uZmlnUGF0aC5lbmRzV2l0aCgnLnRvbWwnKSA/ICcnIDogJ3t9JztcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKGNvbmZpZ1BhdGgsIGNvbnRlbnQgKyAnXFxuJywgJ3V0Zi04Jyk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIENyZWF0ZWQgZW1wdHkgY29uZmlnOiAke2NvbmZpZ1BhdGh9YCk7XG4gICAgICB9IGNhdGNoIChta0Vycikge1xuICAgICAgICBjb25zdCBtc2cgPSBta0VyciBpbnN0YW5jZW9mIEVycm9yID8gbWtFcnIubWVzc2FnZSA6IFN0cmluZyhta0Vycik7XG4gICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgZXJyb3I6IGBDb3VsZCBub3QgY3JlYXRlIGNvbmZpZyBmaWxlOiAke21zZ31gIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oYFtTZXR1cF0gT3BlbmluZyBjb25maWcgZm9yICR7bm9ybWFsaXplZENsaWVudH06ICR7Y29uZmlnUGF0aH1gKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBvcGVuSW5FZGl0b3IoY29uZmlnUGF0aCk7XG4gICAgICByZXMuanNvbih7IHN1Y2Nlc3M6IHRydWUsIHBhdGg6IGNvbmZpZ1BhdGggfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IG1lc3NhZ2UsIHBhdGg6IGNvbmZpZ1BhdGggfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIOKUgOKUgCBBdXRvLWluc3RhbGwgdmlhIGluc3RhbGwtbWNwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjb25zdCBpbnN0YWxsSGFuZGxlciA9IGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoIXNraXBSYXRlTGltaXQgJiYgIWluc3RhbGxMaW1pdGVyLnRyeUFjcXVpcmUoKSkge1xuICAgICAgcmVzLnN0YXR1cyg0MjkpLmpzb24oeyBlcnJvcjogJ1RvbyBtYW55IGluc3RhbGwgcmVxdWVzdHMuIFRyeSBhZ2FpbiBpbiBhIG1pbnV0ZS4nIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRDbGllbnQgPSB2YWxpZGF0ZUNsaWVudChyZXEsIHJlcywgQUxMT1dFRF9DTElFTlRTKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWRDbGllbnQpIHJldHVybjtcblxuICAgIGNvbnN0IHsgZWZmZWN0aXZlVmVyc2lvbiwgZXJyb3IgfSA9IHJlc29sdmVSZXF1ZXN0ZWRJbnN0YWxsVmVyc2lvbihyZXEuYm9keSk7XG4gICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhZyA9IGVmZmVjdGl2ZVZlcnNpb24gPyBgQCR7ZWZmZWN0aXZlVmVyc2lvbn1gIDogJ0BsYXRlc3QnO1xuICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIEluc3RhbGxpbmcgRG9sbGhvdXNlTUNQJHt0YWd9IHRvIGNsaWVudDogJHtub3JtYWxpemVkQ2xpZW50fWApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IG5vcm1hbGl6ZWRDbGllbnQgPT09ICdsbXN0dWRpbydcbiAgICAgICAgPyBhd2FpdCBpbnN0YWxsTG1TdHVkaW9Db25maWcoZWZmZWN0aXZlVmVyc2lvbilcbiAgICAgICAgOiBhd2FpdCBpbnN0YWxsZXIobm9ybWFsaXplZENsaWVudCwgZWZmZWN0aXZlVmVyc2lvbik7XG4gICAgICBsb2dnZXIuaW5mbyhgW1NldHVwXSBTdWNjZXNzZnVsbHkgaW5zdGFsbGVkIHRvICR7bm9ybWFsaXplZENsaWVudH1gKTtcblxuICAgICAgLy8gQmVzdC1lZmZvcnQgTlZNIG1pdGlnYXRpb24gKG1hY09TL0xpbnV4IG9ubHkpLlxuICAgICAgLy8gRXh0cmFjdGVkIGludG8gYXBwbHlOdm1MYXVuY2hlcklmTmVlZGVkIHRvIGtlZXAgdGhpcyBoYW5kbGVyJ3NcbiAgICAgIC8vIGNvZ25pdGl2ZSBjb21wbGV4aXR5IHdpdGhpbiBib3VuZHMgKFNvbmFyQ2xvdWQgUzM3NzYpLlxuICAgICAgLy8gSW5qZWN0YWJsZSAoX2FwcGx5TnZtTGF1bmNoZXIpIHNvIHRlc3RzIGRvbid0IHRvdWNoIHRoZSByZWFsIGhvbWVkaXIuXG4gICAgICBjb25zdCBudm1SZXN1bHQgPSBhd2FpdCBudm1MYXVuY2hlckFwcGxpZXIobm9ybWFsaXplZENsaWVudCk7XG5cbiAgICAgIGNvbnN0IG52bU1pdGlnYXRpb25BcHBsaWVkID0gdG9Odm1NaXRpZ2F0aW9uQXBwbGllZChudm1SZXN1bHQpO1xuXG4gICAgICBjb25zdCBob29rSW5zdGFsbCA9IGF3YWl0IHBlcm1pc3Npb25Ib29rSW5zdGFsbGVyKG5vcm1hbGl6ZWRDbGllbnQpO1xuXG4gICAgICByZXMuanNvbih7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgY2xpZW50OiBub3JtYWxpemVkQ2xpZW50LFxuICAgICAgICB2ZXJzaW9uOiBlZmZlY3RpdmVWZXJzaW9uIHx8ICdsYXRlc3QnLFxuICAgICAgICBudm1NaXRpZ2F0aW9uQXBwbGllZCxcbiAgICAgICAgaG9va0luc3RhbGwsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICBsb2dnZXIud2FybihgW1NldHVwXSBJbnN0YWxsIGZhaWxlZCBmb3IgJHtub3JtYWxpemVkQ2xpZW50fTogJHttZXNzYWdlfWApO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IG1lc3NhZ2UsIGNsaWVudDogbm9ybWFsaXplZENsaWVudCB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8g4pSA4pSAIFZlcnNpb24gaW5mbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29uc3QgdmVyc2lvbkhhbmRsZXIgPSBhc3luYyAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGxvY2FsID0ge1xuICAgICAgdmVyc2lvbjogUEFDS0FHRV9WRVJTSU9OLFxuICAgICAgbWNwYlVybDogYGh0dHBzOi8vZ2l0aHViLmNvbS8ke0dJVEhVQl9SRVBPfS9yZWxlYXNlcy9kb3dubG9hZC92JHtQQUNLQUdFX1ZFUlNJT059L2RvbGxob3VzZW1jcC0ke1BBQ0tBR0VfVkVSU0lPTn0ubWNwYmAsXG4gICAgfTtcblxuICAgIC8vIFF1ZXJ5IEdpdEh1YiBmb3IgdGhlIGFjdHVhbCBsYXRlc3QgcmVsZWFzZVxuICAgIGxldCBsYXRlc3QgPSBsb2NhbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZ2hSZXMgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke0dJVEhVQl9SRVBPfS9yZWxlYXNlcy9sYXRlc3RgLCB7XG4gICAgICAgIGhlYWRlcnM6IHsgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24nLCAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AtU2V0dXAnIH0sXG4gICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCg1MDAwKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGdoUmVzLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlbGVhc2UgPSBhd2FpdCBnaFJlcy5qc29uKCkgYXMgeyB0YWdfbmFtZTogc3RyaW5nOyBhc3NldHM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBicm93c2VyX2Rvd25sb2FkX3VybDogc3RyaW5nIH0+IH07XG4gICAgICAgIGNvbnN0IG1jcGJBc3NldCA9IHJlbGVhc2UuYXNzZXRzLmZpbmQoYSA9PiBNQ1BCX0FTU0VUX1BBVFRFUk4udGVzdChhLm5hbWUpKTtcbiAgICAgICAgbGF0ZXN0ID0ge1xuICAgICAgICAgIHZlcnNpb246IHJlbGVhc2UudGFnX25hbWUucmVwbGFjZSgvXnYvLCAnJyksXG4gICAgICAgICAgbWNwYlVybDogbWNwYkFzc2V0Py5icm93c2VyX2Rvd25sb2FkX3VybCB8fFxuICAgICAgICAgICAgYGh0dHBzOi8vZ2l0aHViLmNvbS8ke0dJVEhVQl9SRVBPfS9yZWxlYXNlcy9kb3dubG9hZC8ke3JlbGVhc2UudGFnX25hbWV9L2RvbGxob3VzZW1jcC0ke3JlbGVhc2UudGFnX25hbWUucmVwbGFjZSgvXnYvLCAnJyl9Lm1jcGJgLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gR2l0SHViIHVucmVhY2hhYmxlIOKAlCB1c2UgbG9jYWwgdmVyc2lvbiBpbmZvXG4gICAgfVxuXG4gICAgcmVzLmpzb24oe1xuICAgICAgcnVubmluZzogbG9jYWwsXG4gICAgICBsYXRlc3QsXG4gICAgICBpc0xhdGVzdDogbG9jYWwudmVyc2lvbiA9PT0gbGF0ZXN0LnZlcnNpb24sXG4gICAgfSk7XG4gIH07XG5cbiAgLy8g4pSA4pSAIC5tY3BiIGRvd25sb2FkIHJlZGlyZWN0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjb25zdCBtY3BiUmVkaXJlY3RIYW5kbGVyID0gYXN5bmMgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvLyBUcnkgR2l0SHViIEFQSSBmb3IgdGhlIGFjdHVhbCBsYXRlc3QgLm1jcGIgYXNzZXQgVVJMXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdoUmVzID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtHSVRIVUJfUkVQT30vcmVsZWFzZXMvbGF0ZXN0YCwge1xuICAgICAgICBoZWFkZXJzOiB7ICdBY2NlcHQnOiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uJywgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLVNldHVwJyB9LFxuICAgICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoNTAwMCksXG4gICAgICB9KTtcbiAgICAgIGlmIChnaFJlcy5vaykge1xuICAgICAgICBjb25zdCByZWxlYXNlID0gYXdhaXQgZ2hSZXMuanNvbigpIGFzIHsgdGFnX25hbWU6IHN0cmluZzsgYXNzZXRzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgYnJvd3Nlcl9kb3dubG9hZF91cmw6IHN0cmluZyB9PiB9O1xuICAgICAgICBjb25zdCBtY3BiQXNzZXQgPSByZWxlYXNlLmFzc2V0cy5maW5kKGEgPT4gTUNQQl9BU1NFVF9QQVRURVJOLnRlc3QoYS5uYW1lKSk7XG4gICAgICAgIGlmIChtY3BiQXNzZXQpIHtcbiAgICAgICAgICByZXMucmVkaXJlY3QobWNwYkFzc2V0LmJyb3dzZXJfZG93bmxvYWRfdXJsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBjb25zdHJ1Y3RlZCBVUkxcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogY29uc3RydWN0IFVSTCBmcm9tIHJ1bm5pbmcgdmVyc2lvblxuICAgIGNvbnN0IHVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtHSVRIVUJfUkVQT30vcmVsZWFzZXMvZG93bmxvYWQvdiR7UEFDS0FHRV9WRVJTSU9OfS9kb2xsaG91c2VtY3AtJHtQQUNLQUdFX1ZFUlNJT059Lm1jcGJgO1xuICAgIHJlcy5yZWRpcmVjdCh1cmwpO1xuICB9O1xuXG4gIC8vIOKUgOKUgCBMaWNlbnNlIHNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29uc3QgbGljZW5zZUNvbmZpZ1BhdGggPSBqb2luKGhvbWVkaXIoKSwgJy5kb2xsaG91c2UnLCAnbGljZW5zZS5qc29uJyk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVhZExpY2Vuc2UoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkRmlsZShsaWNlbnNlQ29uZmlnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyYXcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgdGllcjogJ2FncGwnIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd3JpdGVMaWNlbnNlKGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGlyID0gam9pbihob21lZGlyKCksICcuZG9sbGhvdXNlJyk7XG4gICAgYXdhaXQgbWtkaXIoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCB3cml0ZUZpbGUobGljZW5zZUNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpLCB7IG1vZGU6IDBvNjAwIH0pO1xuICB9XG5cbiAgY29uc3QgZ2V0TGljZW5zZUhhbmRsZXIgPSBhc3luYyAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGxpY2Vuc2UgPSBhd2FpdCByZWFkTGljZW5zZSgpO1xuICAgIC8vIE5ldmVyIGV4cG9zZSB2ZXJpZmljYXRpb24gaW50ZXJuYWxzIHRvIGNsaWVudFxuICAgIGNvbnN0IHsgdmVyaWZpY2F0aW9uQ29kZTogX2NvZGUsIHZlcmlmaWNhdGlvbkF0dGVtcHRzOiBfYXR0ZW1wdHMsIC4uLnB1YmxpY0xpY2Vuc2UgfSA9IGxpY2Vuc2U7XG4gICAgcmVzLmpzb24ocHVibGljTGljZW5zZSk7XG4gIH07XG5cbiAgY29uc3QgbGljZW5zZVJhdGVMaW1pdGVyID0gbmV3IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlcig1LCA2MF8wMDApOyAvLyA1IHJlcXVlc3RzL21pbnV0ZVxuXG4gIGNvbnN0IHNldExpY2Vuc2VIYW5kbGVyID0gYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICghbGljZW5zZVJhdGVMaW1pdGVyLnRyeUFjcXVpcmUoKSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnc2V0dXBSb3V0ZXMuc2V0TGljZW5zZUhhbmRsZXInLFxuICAgICAgICBkZXRhaWxzOiAnTGljZW5zZSBlbmRwb2ludCByYXRlIGxpbWl0IGV4Y2VlZGVkICg1IHJlcS9taW4pJyxcbiAgICAgIH0pO1xuICAgICAgcmVzLnN0YXR1cyg0MjkpLmpzb24oeyBlcnJvcjogJ1RvbyBtYW55IGxpY2Vuc2UgcmVxdWVzdHMuIFBsZWFzZSB0cnkgYWdhaW4gaW4gYSBtaW51dGUuJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5ID0gcmVxLmJvZHkgPz8ge307XG4gICAgY29uc3QgdmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdGVMaWNlbnNlSW5wdXQoYm9keSk7XG4gICAgaWYgKHZhbGlkYXRpb25FcnJvcikge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogdmFsaWRhdGlvbkVycm9yIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxpY2Vuc2VEYXRhID0gYnVpbGRMaWNlbnNlRGF0YShib2R5KTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAobGljZW5zZURhdGEudGllciA9PT0gJ2FncGwnKSB7XG4gICAgICAgIC8vIEFHUEw6IGFjdGl2YXRlIGltbWVkaWF0ZWx5LCBubyB2ZXJpZmljYXRpb24gbmVlZGVkXG4gICAgICAgIGxpY2Vuc2VEYXRhLnN0YXR1cyA9ICdhY3RpdmUnO1xuICAgICAgICBhd2FpdCB3cml0ZUxpY2Vuc2UobGljZW5zZURhdGEpO1xuICAgICAgICBsb2dnZXIuaW5mbygnW1NldHVwXSBMaWNlbnNlIHNldCB0byBBR1BMIChhY3RpdmUsIG5vIHZlcmlmaWNhdGlvbiknKTtcbiAgICAgICAgcmVzLmpzb24oeyBzdWNjZXNzOiB0cnVlLCBsaWNlbnNlOiBsaWNlbnNlRGF0YSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDb21tZXJjaWFsIHRpZXJzOiBzYXZlIGFzIHBlbmRpbmcsIGdlbmVyYXRlIHZlcmlmaWNhdGlvbiBjb2RlXG4gICAgICBjb25zdCBjb2RlID0gZ2VuZXJhdGVWZXJpZmljYXRpb25Db2RlKCk7XG4gICAgICBsaWNlbnNlRGF0YS5zdGF0dXMgPSAncGVuZGluZyc7XG4gICAgICBsaWNlbnNlRGF0YS52ZXJpZmljYXRpb25Db2RlID0gY29kZTtcbiAgICAgIGxpY2Vuc2VEYXRhLnZlcmlmaWNhdGlvbkV4cGlyeSA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBWRVJJRklDQVRJT05fQ09ERV9UVExfTVMpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBsaWNlbnNlRGF0YS52ZXJpZmljYXRpb25BdHRlbXB0cyA9IDA7XG4gICAgICBsaWNlbnNlRGF0YS52ZXJpZmljYXRpb25SZXF1ZXN0ZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHdyaXRlTGljZW5zZShsaWNlbnNlRGF0YSk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIExpY2Vuc2UgcGVuZGluZyB2ZXJpZmljYXRpb246ICR7bGljZW5zZURhdGEudGllcn1gKTtcblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnQ09ORklHX1VQREFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ3NldHVwUm91dGVzLnNldExpY2Vuc2VIYW5kbGVyJyxcbiAgICAgICAgZGV0YWlsczogYExpY2Vuc2UgdmVyaWZpY2F0aW9uIGluaXRpYXRlZDogJHtsaWNlbnNlRGF0YS50aWVyfWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgdGllcjogbGljZW5zZURhdGEudGllcixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZW5kIHZlcmlmaWNhdGlvbiBlbWFpbCBkaXJlY3RseSB0byBXb3JrZXIgZm9yIGluc3RhbnQgZGVsaXZlcnkuXG4gICAgICAvLyBQb3N0SG9nIGV2ZW50IGFsc28gZmlyZXMgZm9yIGFuYWx5dGljcywgYnV0IHRoZSBlbWFpbCBjYW4ndCB3YWl0IGZvclxuICAgICAgLy8gUG9zdEhvZydzIGV2ZW50IHBpcGVsaW5lICgxLTUgbWluIGRlbGF5KS5cbiAgICAgIGNvbnN0IGRlbGl2ZXJ5UmVzdWx0ID0gYXdhaXQgc2VuZExpY2Vuc2VXb3JrZXJWZXJpZmljYXRpb25FbWFpbChsaWNlbnNlRGF0YSwgY29kZSwgJ2RpcmVjdC12ZXJpZmljYXRpb24nKTtcbiAgICAgIGlmIChkZWxpdmVyeVJlc3VsdC5vaykge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW1NldHVwXSBWZXJpZmljYXRpb24gZW1haWwgc2VudCBkaXJlY3RseSB2aWEgV29ya2VyIGZvciAke2xpY2Vuc2VEYXRhLnRpZXJ9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dMaWNlbnNlV29ya2VyRGVsaXZlcnlGYWlsdXJlKCdbU2V0dXBdIFZlcmlmaWNhdGlvbiBlbWFpbCBkZWxpdmVyeSBmYWlsZWQnLCBsaWNlbnNlRGF0YSwgZGVsaXZlcnlSZXN1bHQpO1xuXG4gICAgICAgIGNvbnN0IHsgdmVyaWZpY2F0aW9uQ29kZTogX2MsIHZlcmlmaWNhdGlvbkF0dGVtcHRzOiBfYSwgLi4ucHVibGljRGF0YSB9ID0gbGljZW5zZURhdGE7XG4gICAgICAgIHJlcy5zdGF0dXMoNTAyKS5qc29uKHtcbiAgICAgICAgICBlcnJvcjogZ2V0TGljZW5zZVdvcmtlckZhaWx1cmVNZXNzYWdlKGRlbGl2ZXJ5UmVzdWx0KSxcbiAgICAgICAgICB2ZXJpZmljYXRpb25SZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBsaWNlbnNlOiBwdWJsaWNEYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBbHNvIGZpcmUgUG9zdEhvZyBldmVudCBmb3IgYW5hbHl0aWNzIChub24tYmxvY2tpbmcsIGRlbGF5IGlzIGZpbmUpXG4gICAgICBjYXB0dXJlUG9zdEhvZ0xpY2Vuc2VFdmVudCh7IC4uLmxpY2Vuc2VEYXRhLCB2ZXJpZmljYXRpb25Db2RlOiBjb2RlLCBldmVudFR5cGU6ICd2ZXJpZmljYXRpb24nIH0pLmNhdGNoKFxuICAgICAgICAoZXJyKSA9PiBsb2dnZXIuZGVidWcoYFtTZXR1cF0gUG9zdEhvZyBjYXB0dXJlIGZhaWxlZDogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCksXG4gICAgICApO1xuXG4gICAgICAvLyBSZXR1cm4gc3VjY2VzcyB3aXRob3V0IGV4cG9zaW5nIHRoZSBjb2RlXG4gICAgICBjb25zdCB7IHZlcmlmaWNhdGlvbkNvZGU6IF9jLCB2ZXJpZmljYXRpb25BdHRlbXB0czogX2EsIC4uLnB1YmxpY0RhdGEgfSA9IGxpY2Vuc2VEYXRhO1xuICAgICAgcmVzLmpzb24oeyBzdWNjZXNzOiB0cnVlLCBsaWNlbnNlOiBwdWJsaWNEYXRhLCB2ZXJpZmljYXRpb25SZXF1aXJlZDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbU2V0dXBdIEZhaWxlZCB0byBzYXZlIGxpY2Vuc2UnLCB7IGVycm9yIH0pO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogJ0ZhaWxlZCB0byBzYXZlIGxpY2Vuc2UgY29uZmlndXJhdGlvbicgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHZlcmlmeVJhdGVMaW1pdGVyID0gbmV3IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlcig1LCA2MF8wMDApOyAvLyA1IGF0dGVtcHRzL21pbnV0ZVxuXG4gIGNvbnN0IHZlcmlmeUxpY2Vuc2VIYW5kbGVyID0gYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICghdmVyaWZ5UmF0ZUxpbWl0ZXIudHJ5QWNxdWlyZSgpKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdzZXR1cFJvdXRlcy52ZXJpZnlMaWNlbnNlSGFuZGxlcicsXG4gICAgICAgIGRldGFpbHM6ICdWZXJpZmljYXRpb24gZW5kcG9pbnQgcmF0ZSBsaW1pdCBleGNlZWRlZCAoNSByZXEvbWluKScsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zdGF0dXMoNDI5KS5qc29uKHsgZXJyb3I6ICdUb28gbWFueSB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFBsZWFzZSB0cnkgYWdhaW4gaW4gYSBtaW51dGUuJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IHJlcS5ib2R5ID8/IHt9O1xuICAgIGlmICghY29kZSB8fCB0eXBlb2YgY29kZSAhPT0gJ3N0cmluZycgfHwgIS9eXFxkezZ9JC8udGVzdChjb2RlKSkge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogJ1BsZWFzZSBlbnRlciBhIHZhbGlkIDYtZGlnaXQgdmVyaWZpY2F0aW9uIGNvZGUnIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxpY2Vuc2UgPSBhd2FpdCByZWFkTGljZW5zZSgpO1xuICAgIGlmIChsaWNlbnNlLnN0YXR1cyAhPT0gJ3BlbmRpbmcnKSB7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiAnTm8gcGVuZGluZyBsaWNlbnNlIHZlcmlmaWNhdGlvbi4gUGxlYXNlIHN1Ym1pdCB0aGUgbGljZW5zZSBmb3JtIGZpcnN0LicgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZXhwaXJ5XG4gICAgaWYgKCFsaWNlbnNlLnZlcmlmaWNhdGlvbkV4cGlyeSB8fCBpc0NvZGVFeHBpcmVkKGxpY2Vuc2UudmVyaWZpY2F0aW9uRXhwaXJ5IGFzIHN0cmluZykpIHtcbiAgICAgIGxpY2Vuc2Uuc3RhdHVzID0gJ2V4cGlyZWQnO1xuICAgICAgYXdhaXQgd3JpdGVMaWNlbnNlKGxpY2Vuc2UpO1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogJ1ZlcmlmaWNhdGlvbiBjb2RlIGhhcyBleHBpcmVkLiBQbGVhc2Ugc3VibWl0IHRoZSBmb3JtIGFnYWluIHRvIHJlY2VpdmUgYSBuZXcgY29kZS4nIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIG1heCBhdHRlbXB0c1xuICAgIGNvbnN0IGF0dGVtcHRzID0gKChsaWNlbnNlLnZlcmlmaWNhdGlvbkF0dGVtcHRzIGFzIG51bWJlcikgPz8gMCkgKyAxO1xuICAgIGlmIChhdHRlbXB0cyA+IFZFUklGSUNBVElPTl9NQVhfQVRURU1QVFMpIHtcbiAgICAgIGxpY2Vuc2Uuc3RhdHVzID0gJ2V4cGlyZWQnO1xuICAgICAgYXdhaXQgd3JpdGVMaWNlbnNlKGxpY2Vuc2UpO1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ3NldHVwUm91dGVzLnZlcmlmeUxpY2Vuc2VIYW5kbGVyJyxcbiAgICAgICAgZGV0YWlsczogYFZlcmlmaWNhdGlvbiBtYXggYXR0ZW1wdHMgZXhjZWVkZWQgZm9yIHRpZXI6ICR7bGljZW5zZS50aWVyfWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IHRpZXI6IGxpY2Vuc2UudGllciB9LFxuICAgICAgfSk7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiAnVG9vIG1hbnkgZmFpbGVkIGF0dGVtcHRzLiBQbGVhc2Ugc3VibWl0IHRoZSBmb3JtIGFnYWluIHRvIHJlY2VpdmUgYSBuZXcgY29kZS4nIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNvZGVcbiAgICBpZiAoY29kZSAhPT0gbGljZW5zZS52ZXJpZmljYXRpb25Db2RlKSB7XG4gICAgICBsaWNlbnNlLnZlcmlmaWNhdGlvbkF0dGVtcHRzID0gYXR0ZW1wdHM7XG4gICAgICBhd2FpdCB3cml0ZUxpY2Vuc2UobGljZW5zZSk7XG4gICAgICBjb25zdCByZW1haW5pbmcgPSBWRVJJRklDQVRJT05fTUFYX0FUVEVNUFRTIC0gYXR0ZW1wdHM7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiBgSW5jb3JyZWN0IHZlcmlmaWNhdGlvbiBjb2RlLiAke3JlbWFpbmluZ30gYXR0ZW1wdCR7cmVtYWluaW5nID09PSAxID8gJycgOiAncyd9IHJlbWFpbmluZy5gIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENvZGUgaXMgY29ycmVjdCDigJQgYWN0aXZhdGUgbGljZW5zZVxuICAgIGNvbnN0IHZlcmlmaWVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgY29uc3QgcmVxdWVzdGVkQXQgPSBsaWNlbnNlLnZlcmlmaWNhdGlvblJlcXVlc3RlZEF0IGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0aW1lVG9WZXJpZnlNcyA9IHJlcXVlc3RlZEF0ID8gRGF0ZS5ub3coKSAtIG5ldyBEYXRlKHJlcXVlc3RlZEF0KS5nZXRUaW1lKCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYXR0ZW1wdHNVc2VkID0gKChsaWNlbnNlLnZlcmlmaWNhdGlvbkF0dGVtcHRzIGFzIG51bWJlcikgPz8gMCkgKyAxO1xuXG4gICAgbGljZW5zZS5zdGF0dXMgPSAnYWN0aXZlJztcbiAgICBsaWNlbnNlLnZlcmlmaWVkQXQgPSB2ZXJpZmllZEF0O1xuICAgIGRlbGV0ZSBsaWNlbnNlLnZlcmlmaWNhdGlvbkNvZGU7XG4gICAgZGVsZXRlIGxpY2Vuc2UudmVyaWZpY2F0aW9uRXhwaXJ5O1xuICAgIGRlbGV0ZSBsaWNlbnNlLnZlcmlmaWNhdGlvbkF0dGVtcHRzO1xuICAgIGRlbGV0ZSBsaWNlbnNlLnZlcmlmaWNhdGlvblJlcXVlc3RlZEF0O1xuICAgIGF3YWl0IHdyaXRlTGljZW5zZShsaWNlbnNlKTtcblxuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYFtTZXR1cF0gTGljZW5zZSB2ZXJpZmllZCBhbmQgYWN0aXZhdGVkOiAke2xpY2Vuc2UudGllcn0g4oCUIGAgK1xuICAgICAgYCR7dGltZVRvVmVyaWZ5TXMgPyBNYXRoLnJvdW5kKHRpbWVUb1ZlcmlmeU1zIC8gMTAwMCkgKyAncycgOiAndW5rbm93bid9LCAke2F0dGVtcHRzVXNlZH0gYXR0ZW1wdChzKWAsXG4gICAgKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdDT05GSUdfVVBEQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdzZXR1cFJvdXRlcy52ZXJpZnlMaWNlbnNlSGFuZGxlcicsXG4gICAgICBkZXRhaWxzOiBgTGljZW5zZSBhY3RpdmF0ZWQgYWZ0ZXIgZW1haWwgdmVyaWZpY2F0aW9uOiAke2xpY2Vuc2UudGllcn1gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHsgdGllcjogbGljZW5zZS50aWVyIH0sXG4gICAgfSk7XG5cbiAgICAvLyBTZW5kIGNvbmZpcm1hdGlvbiBlbWFpbCArIFBvc3RIb2cgYWN0aXZhdGlvbiBldmVudCB3aXRoIGFuYWx5dGljc1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjYXB0dXJlUG9zdEhvZ0xpY2Vuc2VFdmVudCh7XG4gICAgICAgIC4uLmxpY2Vuc2UsXG4gICAgICAgIGV2ZW50VHlwZTogJ2FjdGl2YXRpb24nLFxuICAgICAgICB2ZXJpZmljYXRpb25fdGltZV9tczogdGltZVRvVmVyaWZ5TXMsXG4gICAgICAgIHZlcmlmaWNhdGlvbl9hdHRlbXB0czogYXR0ZW1wdHNVc2VkLFxuICAgICAgICB2ZXJpZmljYXRpb25fbWV0aG9kOiBjb2RlLmxlbmd0aCA9PT0gNiA/ICdjb2RlX29yX2NsaWNrJyA6ICd1bmtub3duJyxcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmluZm8oYFtTZXR1cF0gTGljZW5zZSBhY3RpdmF0aW9uIGV2ZW50IHNlbnQgdG8gUG9zdEhvZzogJHtsaWNlbnNlLnRpZXJ9YCk7XG4gICAgfSBjYXRjaCAocG9zdGhvZ0Vycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gUG9zdEhvZyBjYXB0dXJlIGZhaWxlZDogJHtwb3N0aG9nRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IHBvc3Rob2dFcnJvci5tZXNzYWdlIDogU3RyaW5nKHBvc3Rob2dFcnJvcil9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB2ZXJpZmljYXRpb25Db2RlOiBfYywgdmVyaWZpY2F0aW9uQXR0ZW1wdHM6IF9hLCB2ZXJpZmljYXRpb25FeHBpcnk6IF9lLCAuLi5wdWJsaWNMaWNlbnNlIH0gPSBsaWNlbnNlO1xuICAgIHJlcy5qc29uKHsgc3VjY2VzczogdHJ1ZSwgbGljZW5zZTogcHVibGljTGljZW5zZSB9KTtcbiAgfTtcblxuICBjb25zdCByZXNlbmRSYXRlTGltaXRlciA9IG5ldyBTbGlkaW5nV2luZG93UmF0ZUxpbWl0ZXIoMywgMTIwXzAwMCk7IC8vIDMgcmVzZW5kcyBwZXIgMiBtaW51dGVzXG5cbiAgY29uc3QgcmVzZW5kVmVyaWZpY2F0aW9uSGFuZGxlciA9IGFzeW5jIChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKCFyZXNlbmRSYXRlTGltaXRlci50cnlBY3F1aXJlKCkpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDI5KS5qc29uKHsgZXJyb3I6ICdQbGVhc2Ugd2FpdCBiZWZvcmUgcmVxdWVzdGluZyBhbm90aGVyIGNvZGUuJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaWNlbnNlID0gYXdhaXQgcmVhZExpY2Vuc2UoKTtcbiAgICBpZiAobGljZW5zZS5zdGF0dXMgIT09ICdwZW5kaW5nJyAmJiBsaWNlbnNlLnN0YXR1cyAhPT0gJ2V4cGlyZWQnKSB7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiAnTm8gcGVuZGluZyBsaWNlbnNlIHZlcmlmaWNhdGlvbi4nIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIG5ldyBjb2RlIGFuZCByZXNldFxuICAgIGNvbnN0IGNvZGUgPSBnZW5lcmF0ZVZlcmlmaWNhdGlvbkNvZGUoKTtcbiAgICBsaWNlbnNlLnN0YXR1cyA9ICdwZW5kaW5nJztcbiAgICBsaWNlbnNlLnZlcmlmaWNhdGlvbkNvZGUgPSBjb2RlO1xuICAgIGxpY2Vuc2UudmVyaWZpY2F0aW9uRXhwaXJ5ID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIFZFUklGSUNBVElPTl9DT0RFX1RUTF9NUykudG9JU09TdHJpbmcoKTtcbiAgICBsaWNlbnNlLnZlcmlmaWNhdGlvbkF0dGVtcHRzID0gMDtcbiAgICBhd2FpdCB3cml0ZUxpY2Vuc2UobGljZW5zZSk7XG5cbiAgICAvLyBTZW5kIHZlcmlmaWNhdGlvbiBlbWFpbCBkaXJlY3RseSB0byBXb3JrZXIgZm9yIGluc3RhbnQgZGVsaXZlcnlcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVsaXZlcnlSZXN1bHQgPSBhd2FpdCBzZW5kTGljZW5zZVdvcmtlclZlcmlmaWNhdGlvbkVtYWlsKGxpY2Vuc2UsIGNvZGUsICdkaXJlY3QtcmVzZW5kJyk7XG4gICAgICBpZiAoIWRlbGl2ZXJ5UmVzdWx0Lm9rKSB7XG4gICAgICAgIGxvZ0xpY2Vuc2VXb3JrZXJEZWxpdmVyeUZhaWx1cmUoJ1tTZXR1cF0gVmVyaWZpY2F0aW9uIHJlc2VuZCBkZWxpdmVyeSBmYWlsZWQnLCBsaWNlbnNlLCBkZWxpdmVyeVJlc3VsdCk7XG4gICAgICAgIHJlcy5zdGF0dXMoNTAyKS5qc29uKHtcbiAgICAgICAgICBlcnJvcjogZ2V0TGljZW5zZVdvcmtlckZhaWx1cmVNZXNzYWdlKGRlbGl2ZXJ5UmVzdWx0KSxcbiAgICAgICAgICB2ZXJpZmljYXRpb25SZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oYFtTZXR1cF0gVmVyaWZpY2F0aW9uIGNvZGUgcmVzZW50IGRpcmVjdGx5IHZpYSBXb3JrZXIgZm9yICR7bGljZW5zZS50aWVyfWApO1xuICAgIH0gY2F0Y2ggKHdvcmtlckVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1tTZXR1cF0gVW5leHBlY3RlZCB2ZXJpZmljYXRpb24gcmVzZW5kIGZhaWx1cmUnLCB7XG4gICAgICAgIHRpZXI6IGxpY2Vuc2UudGllcixcbiAgICAgICAgZXJyb3I6IHdvcmtlckVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyB3b3JrZXJFcnJvci5tZXNzYWdlIDogU3RyaW5nKHdvcmtlckVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogJ0ZhaWxlZCB0byByZXNlbmQgdmVyaWZpY2F0aW9uIGNvZGUuJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXMuanNvbih7IHN1Y2Nlc3M6IHRydWUsIG1lc3NhZ2U6ICdBIG5ldyB2ZXJpZmljYXRpb24gY29kZSBoYXMgYmVlbiBzZW50IHRvIHlvdXIgZW1haWwuJyB9KTtcbiAgfTtcblxuICByZXR1cm4geyBpbnN0YWxsSGFuZGxlciwgb3BlbkNvbmZpZ0hhbmRsZXIsIHZlcnNpb25IYW5kbGVyLCBtY3BiUmVkaXJlY3RIYW5kbGVyLCBkZXRlY3RIYW5kbGVyLCBnZXRMaWNlbnNlSGFuZGxlciwgc2V0TGljZW5zZUhhbmRsZXIsIHZlcmlmeUxpY2Vuc2VIYW5kbGVyLCByZXNlbmRWZXJpZmljYXRpb25IYW5kbGVyIH07XG59XG5cbi8vIOKUgOKUgCBJbnN0YWxsIGFuYWx5dGljcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBGaXJlLWFuZC1mb3JnZXQgUG9zdEhvZyBldmVudCBmb3IgaW5zdGFsbGF0aW9uIGFuYWx5dGljcy5cbiAqIFVzZXMgdGhlIHNhbWUgaW5zdGFsbCBJRCBhcyB0aGUgbGljZW5zZSB0ZWxlbWV0cnkgc3lzdGVtLlxuICogU2lsZW50bHkgc3dhbGxvd3MgYWxsIGVycm9ycyDigJQgYW5hbHl0aWNzIG11c3QgbmV2ZXIgYnJlYWsgaW5zdGFsbHMuXG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVJbnN0YWxsQW5hbHl0aWNzKGV2ZW50OiBzdHJpbmcsIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gIGNvbnN0IHBvc3Rob2cgPSBuZXcgUG9zdEhvZyhQT1NUSE9HX1BST0pFQ1RfS0VZLCB7XG4gICAgaG9zdDogcHJvY2Vzcy5lbnYuUE9TVEhPR19IT1NUIHx8ICdodHRwczovL2FwcC5wb3N0aG9nLmNvbScsXG4gICAgZmx1c2hBdDogMSxcbiAgICBmbHVzaEludGVydmFsOiA1MDAwLFxuICB9KTtcbiAgcmVhZEZpbGUoam9pbihob21lZGlyKCksICcuZG9sbGhvdXNlJywgJy50ZWxlbWV0cnktaWQnKSwgJ3V0Zi04JylcbiAgICAudGhlbihpZCA9PiBpZC50cmltKCkpXG4gICAgLmNhdGNoKCgpID0+ICdhbm9ueW1vdXMnKVxuICAgIC50aGVuKGluc3RhbGxJZCA9PiB7XG4gICAgICBwb3N0aG9nLmNhcHR1cmUoeyBkaXN0aW5jdElkOiBpbnN0YWxsSWQsIGV2ZW50LCBwcm9wZXJ0aWVzIH0pO1xuICAgICAgcmV0dXJuIHBvc3Rob2cuc2h1dGRvd24oKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoKSA9PiB7IC8qIHRlbGVtZXRyeSBtdXN0IG5ldmVyIHRocm93ICovIH0pO1xufVxuXG4vLyDilIDilIAgTlZNIG1pdGlnYXRpb24gaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIENsYXVkZSBEZXNrdG9wIGhhcyBhIGJ1ZyB3aGVyZSBpdCBzY2FucyB+Ly5udm0vdmVyc2lvbnMvbm9kZS8sIGJ1aWxkcyBhIFBBVEhcbi8vIGZyb20gYWxsIGluc3RhbGxlZCB2ZXJzaW9ucyBpbiBhc2NlbmRpbmcgb3JkZXIgKG9sZGVzdCBmaXJzdCksIGFuZCBydW5zIG5weFxuLy8gdW5kZXIgYW4gb3V0ZGF0ZWQgTm9kZSBldmVuIHdoZW4gYSBuZXdlciB2ZXJzaW9uIGlzIGluc3RhbGxlZCBhbmQgc2VsZWN0ZWQuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2xsaG91c2VNQ1AvbWNwLXNlcnZlci9pc3N1ZXMvMTkwMlxuLy9cbi8vIEZpeDogd2hlbiBOVk0gaXMgcHJlc2VudCwgY3JlYXRlIGEgc21hbGwgYmFzaCBsYXVuY2hlciB0aGF0IGluaXRpYWxpc2VzIE5WTVxuLy8gcHJvcGVybHkgYmVmb3JlIGRlbGVnYXRpbmcgdG8gbnB4LCB0aGVuIHBhdGNoIHRoZSB3cml0dGVuIE1DUCBjbGllbnQgY29uZmlnXG4vLyB0byB1c2UgdGhhdCBsYXVuY2hlciBpbnN0ZWFkIG9mIGJhcmUgYG5weGAuXG5cbi8qKiBSZXN1bHQgb2YgYXR0ZW1wdGluZyB0byBhcHBseSB0aGUgTlZNIGxhdW5jaGVyIG1pdGlnYXRpb24uICovXG5leHBvcnQgdHlwZSBOdm1MYXVuY2hlclJlc3VsdCA9ICdhcHBsaWVkJyB8ICdub3QtYXBwbGljYWJsZScgfCAnZmFpbGVkJztcblxuLyoqXG4gKiBKU09OLWZvcm1hdCBjbGllbnRzIGVsaWdpYmxlIGZvciBOVk0gbGF1bmNoZXIgcGF0Y2gvcmVwYWlyL2hlYWwuXG4gKlxuICogVGhpcyBNVVNUIGJlIHRoZSBmdWxsIHNldCBvZiBjbGllbnRzIHdob3NlIEpTT04gY29uZmlnIHRoZSBpbnN0YWxsIGZsb3cgY2FuXG4gKiBwYXRjaCB2aWEgYXBwbHlOdm1MYXVuY2hlcklmTmVlZGVkIOKGkiBwYXRjaENvbmZpZ0Zvck52bUxhdW5jaGVyIOKAlCBvdGhlcndpc2UgYVxuICogY2xpZW50IHRoYXQgd2FzIHBhdGNoZWQgYXQgaW5zdGFsbCB0aW1lIChlLmcuIFZTIENvZGUgb3IgQ2xpbmUgcG9pbnRpbmcgYXQgYVxuICogbm93LWRlYWQgd3JhcHBlcikgd291bGQgbmV2ZXIgc2VsZi1oZWFsIG9uIHN0YXJ0dXAgKGlzc3VlICMyMzM4KS4gQ29kZXggaXNcbiAqIGV4Y2x1ZGVkIGJlY2F1c2UgaXRzIGNvbmZpZyBpcyBUT01MLCB3aGljaCBwYXRjaENvbmZpZ0Zvck52bUxhdW5jaGVyIHNraXBzLlxuICovXG5jb25zdCBKU09OX0ZPUk1BVF9DTElFTlRTID0gW1xuICAnY2xhdWRlJywgJ2NsYXVkZS1jb2RlJywgJ2N1cnNvcicsICd2c2NvZGUnLCAnY2xpbmUnLCAnd2luZHN1cmYnLCAnbG1zdHVkaW8nLCAnZ2VtaW5pLWNsaScsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIE9yY2hlc3RyYXRlcyB0aGUgTlZNIG1pdGlnYXRpb246IGRldGVjdCDihpIgY3JlYXRlIGxhdW5jaGVyIOKGkiBwYXRjaCBjb25maWcg4oaSIHRlbGVtZXRyeS5cbiAqIEV4dHJhY3RlZCBmcm9tIGluc3RhbGxIYW5kbGVyIHRvIGtlZXAgaXRzIGNvZ25pdGl2ZSBjb21wbGV4aXR5IHdpdGhpbiBTb25hckNsb3VkIGxpbWl0cy5cbiAqIFJldHVybnMgYSByZXN1bHQgZW51bSByYXRoZXIgdGhhbiB0aHJvd2luZyBzbyB0aGUgY2FsbGVyIGFsd2F5cyBnZXRzIGEgY2xlYW4gc2lnbmFsLlxuICpcbiAqIEBwYXJhbSBob21lIC0gT3ZlcnJpZGUgaG9tZSBkaXJlY3RvcnkgKGluamVjdGFibGUgZm9yIHRlc3RzKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlOdm1MYXVuY2hlcklmTmVlZGVkKGNsaWVudDogc3RyaW5nLCBob21lID0gaG9tZWRpcigpKTogUHJvbWlzZTxOdm1MYXVuY2hlclJlc3VsdD4ge1xuICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gTlZNIG1pdGlnYXRpb24gY2hlY2sgZm9yIGNsaWVudDogJHtjbGllbnR9YCk7XG4gIGlmICghYXdhaXQgaXNOdm1QcmVzZW50KGhvbWUpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIE5WTSBub3QgcHJlc2VudCDigJQgc2tpcHBpbmcgbGF1bmNoZXIgbWl0aWdhdGlvbiBmb3IgJHtjbGllbnR9YCk7XG4gICAgY2FwdHVyZUluc3RhbGxBbmFseXRpY3MoJ252bV9sYXVuY2hlcl9ub3RfYXBwbGljYWJsZScsIHsgY2xpZW50LCBwbGF0Zm9ybTogcGxhdGZvcm0oKSB9KTtcbiAgICByZXR1cm4gJ25vdC1hcHBsaWNhYmxlJztcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHdyYXBwZXJQYXRoID0gYXdhaXQgZW5zdXJlTnZtTGF1bmNoZXIoaG9tZSk7XG4gICAgLy8gRGVyaXZlIHRoZSBjb25maWcgcGF0aCBmcm9tIHRoZSBTQU1FIGBob21lYCB0aGF0IGxvY2F0ZWQgTlZNIGFuZCB0aGVcbiAgICAvLyB3cmFwcGVyLiBQYXNzaW5nIGl0IGV4cGxpY2l0bHkgKHJhdGhlciB0aGFuIGxldHRpbmcgcGF0Y2hDb25maWdGb3JOdm1MYXVuY2hlclxuICAgIC8vIGZhbGwgYmFjayB0byB0aGUgcmVhbCBob21lZGlyKCkpIGlzIHdoYXQgbWFrZXMgYGhvbWVgIGF1dGhvcml0YXRpdmUgYW5kXG4gICAgLy8ga2VlcHMgYSBmYWtlLWhvbWUgdGVzdCBmcm9tIHBhdGNoaW5nIHJlYWwgY2xpZW50IGNvbmZpZ3MgKCMyMzM4KS5cbiAgICBhd2FpdCBwYXRjaENvbmZpZ0Zvck52bUxhdW5jaGVyKGNsaWVudCwgd3JhcHBlclBhdGgsIGdldENvbmZpZ1BhdGgoY2xpZW50LCBob21lKSA/PyB1bmRlZmluZWQpO1xuICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIE5WTS1hd2FyZSBsYXVuY2hlciBhcHBsaWVkIGZvciAke2NsaWVudH1gKTtcbiAgICBjYXB0dXJlSW5zdGFsbEFuYWx5dGljcygnbnZtX2xhdW5jaGVyX2FwcGxpZWQnLCB7IGNsaWVudCwgcGxhdGZvcm06IHBsYXRmb3JtKCkgfSk7XG4gICAgcmV0dXJuICdhcHBsaWVkJztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFtTZXR1cF0gTlZNIGxhdW5jaGVyIHNldHVwIGZhaWxlZCAobm9uLWZhdGFsKTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7XG4gICAgY2FwdHVyZUluc3RhbGxBbmFseXRpY3MoJ252bV9sYXVuY2hlcl9mYWlsZWQnLCB7XG4gICAgICBjbGllbnQsXG4gICAgICBwbGF0Zm9ybTogcGxhdGZvcm0oKSxcbiAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuICdmYWlsZWQnO1xuICB9XG59XG5cbi8qKlxuICogU3RhcnR1cCByZXBhaXIgKyBzZWxmLWhlYWw6IHJlY29uY2lsZXMgZXZlcnkga25vd24gSlNPTi1mb3JtYXQgY2xpZW50IGNvbmZpZ1xuICogb24gZWFjaCBzZXJ2ZXIgc3RhcnQuIEJlaGF2aW91ciBkZXBlbmRzIG9uIHdoZXRoZXIgTlZNIGlzIGluc3RhbGxlZCwgbWF0Y2hpbmdcbiAqIHRoZSBhY2NlcHRhbmNlIG1hdHJpeCBpbiBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXIvaXNzdWVzLzIzMzg6XG4gKlxuICogICDigKIgTlZNIHByZXNlbnQgIOKGkiAocmUpY3JlYXRlIHRoZSB3cmFwcGVyIGFuZCBwb2ludCBlYWNoIGNvbmZpZyBhdCBpdC4gQ292ZXJzIGFcbiAqICAgICBkZWxldGVkIHdyYXBwZXIsIGEgcHJlLWZpeCBpbnN0YWxsIHN0aWxsIG9uIGJhcmUgYG5weGAsIGFuZCBhIGNvbmZpZyBsZWZ0XG4gKiAgICAgcG9pbnRpbmcgYXQgYSBkZWFkIHRlbXAtZGlyIHdyYXBwZXIgKHJlZ2VuZXJhdGVzIHRoZSByZWFsIG9uZSkuIEhlYWx0aHlcbiAqICAgICBjb25maWdzIHJlLXNlcmlhbGlzZSBieXRlLWlkZW50aWNhbGx5LCBzbyB0aGlzIGlzIGEgbm8tb3AgZm9yIHRoZW0uXG4gKiAgIOKAoiBOVk0gYWJzZW50ICAg4oaSIG5ldmVyIGNyZWF0ZSBhIHdyYXBwZXIsIGJ1dCBTRUxGLUhFQUwgYW55IGNvbmZpZyB3aG9zZVxuICogICAgIGNvbW1hbmQgcG9pbnRzIGF0IGEgYGRvbGxob3VzZW1jcC1udm0uc2hgIHRoYXQgbm8gbG9uZ2VyIGV4aXN0cyAoZS5nLiB0aGVcbiAqICAgICAjMjMzOCB0ZXN0IGxlYWssIG9yIGEgdXNlciB3aG8gcmVtb3ZlZCB+Ly5kb2xsaG91c2UvYmluKSBiYWNrIHRvIGJhcmUgYG5weGAsXG4gKiAgICAgcHJlc2VydmluZyBhcmdzIHNvIHRoZSBjbGllbnQgY2FuIGxhdW5jaCBEb2xsaG91c2VNQ1AgYWdhaW4uXG4gKlxuICogRmlyZS1hbmQtZm9yZ2V0IGZyb20gc3RhcnRXZWJTZXJ2ZXIuIEFsbCBlcnJvcnMgYXJlIHN3YWxsb3dlZCBhbmQgbG9nZ2VkLlxuICpcbiAqIEBwYXJhbSBob21lICAgICAgICAgICAgICAgLSBPdmVycmlkZSBob21lIGRpcmVjdG9yeSAoaW5qZWN0YWJsZSBmb3IgdGVzdHMpXG4gKiBAcGFyYW0gY29uZmlnUGF0aFJlc29sdmVyIC0gT3ZlcnJpZGUgY29uZmlnIHBhdGggbG9va3VwIChpbmplY3RhYmxlIGZvciB0ZXN0cykuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuIG51bGwgdG8gc2tpcCBhIGNsaWVudCBlbnRpcmVseS4gRGVmYXVsdHMgdG8gYVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbWUtZGVyaXZlZCByZXNvbHZlciBzbyBgaG9tZWAgc3RheXMgYXV0aG9yaXRhdGl2ZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKAlCB0aGUgZGVmYXVsdCBtdXN0IE5PVCByZWFjaCB0aGUgcmVhbCBob21lZGlyKCkgd2hlblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgZmFrZSBob21lIGlzIHN1cHBsaWVkICgjMjMzOCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXBhaXJOdm1MYXVuY2hlck9uU3RhcnR1cChcbiAgaG9tZSA9IGhvbWVkaXIoKSxcbiAgY29uZmlnUGF0aFJlc29sdmVyOiAoY2xpZW50OiBzdHJpbmcpID0+IHN0cmluZyB8IG51bGwgPSAoY2xpZW50KSA9PiBnZXRDb25maWdQYXRoKGNsaWVudCwgaG9tZSksXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHBsYXRmb3JtKCkgPT09ICd3aW4zMicpIHJldHVybjtcbiAgbG9nZ2VyLmRlYnVnKCdbU2V0dXBdIE5WTSBsYXVuY2hlciBzdGFydHVwIHJlcGFpcjogY2hlY2tpbmcgZm9yIE5WTS4uLicpO1xuXG4gIGlmICghYXdhaXQgaXNOdm1QcmVzZW50KGhvbWUpKSB7XG4gICAgLy8gTlZNIGFic2VudDogd2UgbXVzdCBOT1QgY3JlYXRlIGEgd3JhcHBlciwgYnV0IHdlIERPIHJlc3RvcmUgYW55IGNvbmZpZ1xuICAgIC8vIHN0aWxsIHBvaW50aW5nIGF0IGEgbm93LW1pc3Npbmcgd3JhcHBlciBzbyB0aGUgY2xpZW50IGlzIG5vdCBsZWZ0IGJyb2tlbi5cbiAgICBsb2dnZXIuZGVidWcoJ1tTZXR1cF0gTlZNIGxhdW5jaGVyIHN0YXJ0dXAgcmVwYWlyOiBOVk0gbm90IHByZXNlbnQg4oCUIHNjYW5uaW5nIGZvciBkZWFkIHdyYXBwZXIgcmVmZXJlbmNlcycpO1xuICAgIGF3YWl0IGhlYWxDbGllbnRzV2l0aG91dE52bShjb25maWdQYXRoUmVzb2x2ZXIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCB3cmFwcGVyUGF0aDogc3RyaW5nO1xuICB0cnkge1xuICAgIHdyYXBwZXJQYXRoID0gYXdhaXQgZW5zdXJlTnZtTGF1bmNoZXIoaG9tZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKGBbU2V0dXBdIE5WTSBzdGFydHVwIHJlcGFpcjogY291bGQgbm90IGNyZWF0ZSBsYXVuY2hlcjogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgcGF0Y2hDbGllbnRzRm9yTnZtKHdyYXBwZXJQYXRoLCBjb25maWdQYXRoUmVzb2x2ZXIpO1xuICBsb2dnZXIuaW5mbygnW1NldHVwXSBOVk0gbGF1bmNoZXIgc3RhcnR1cCByZXBhaXIgY29tcGxldGUnKTtcbn1cblxuLyoqXG4gKiBQb2ludCBldmVyeSByZXNvbHZhYmxlIEpTT04tZm9ybWF0IGNsaWVudCBjb25maWcgYXQgdGhlIChyZWFsKSBOVk0gd3JhcHBlci5cbiAqIEV4dHJhY3RlZCBmcm9tIHJlcGFpck52bUxhdW5jaGVyT25TdGFydHVwIHRvIGtlZXAgaXRzIGNvZ25pdGl2ZSBjb21wbGV4aXR5XG4gKiB3aXRoaW4gU29uYXJDbG91ZCBsaW1pdHMgKFMzNzc2KS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGF0Y2hDbGllbnRzRm9yTnZtKFxuICB3cmFwcGVyUGF0aDogc3RyaW5nLFxuICBjb25maWdQYXRoUmVzb2x2ZXI6IChjbGllbnQ6IHN0cmluZykgPT4gc3RyaW5nIHwgbnVsbCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgSlNPTl9GT1JNQVRfQ0xJRU5UUy5tYXAoY2xpZW50ID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBjb25maWdQYXRoUmVzb2x2ZXIoY2xpZW50KTtcbiAgICAgIGlmICghY29uZmlnUGF0aCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOyAvLyByZXNvbHZlciByZXR1cm5lZCBudWxsIOKAlCBza2lwIHRoaXMgY2xpZW50XG4gICAgICByZXR1cm4gcGF0Y2hDb25maWdGb3JOdm1MYXVuY2hlcihjbGllbnQsIHdyYXBwZXJQYXRoLCBjb25maWdQYXRoKVxuICAgICAgICAuY2F0Y2goZXJyID0+XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtTZXR1cF0gTlZNIHN0YXJ0dXAgcmVwYWlyOiBmYWlsZWQgdG8gcGF0Y2ggJHtjbGllbnR9OiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gKVxuICAgICAgICApO1xuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogU2VsZi1oZWFsIHBhdGggZm9yIG1hY2hpbmVzIFdJVEhPVVQgTlZNOiByZXN0b3JlIGFueSBjb25maWcgdGhhdCBwb2ludHMgYXQgYVxuICogbWlzc2luZyB3cmFwcGVyIGJhY2sgdG8gYmFyZSBgbnB4YC4gRXh0cmFjdGVkIGZvciBjb2duaXRpdmUtY29tcGxleGl0eSBsaW1pdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhlYWxDbGllbnRzV2l0aG91dE52bShcbiAgY29uZmlnUGF0aFJlc29sdmVyOiAoY2xpZW50OiBzdHJpbmcpID0+IHN0cmluZyB8IG51bGwsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIEpTT05fRk9STUFUX0NMSUVOVFMubWFwKGNsaWVudCA9PiB7XG4gICAgICBjb25zdCBjb25maWdQYXRoID0gY29uZmlnUGF0aFJlc29sdmVyKGNsaWVudCk7XG4gICAgICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsgLy8gcmVzb2x2ZXIgcmV0dXJuZWQgbnVsbCDigJQgc2tpcCB0aGlzIGNsaWVudFxuICAgICAgcmV0dXJuIHJlc3RvcmVOcHhJZldyYXBwZXJNaXNzaW5nKGNsaWVudCwgY29uZmlnUGF0aClcbiAgICAgICAgLmNhdGNoKGVyciA9PlxuICAgICAgICAgIGxvZ2dlci53YXJuKGBbU2V0dXBdIE5WTSBzZWxmLWhlYWw6IGZhaWxlZCB0byBoZWFsICR7Y2xpZW50fTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YClcbiAgICAgICAgKTtcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIElmIGEgY2xpZW50J3MgZG9sbGhvdXNlbWNwIGVudHJ5IHBvaW50cyBhdCBhIGBkb2xsaG91c2VtY3AtbnZtLnNoYCB3cmFwcGVyXG4gKiB0aGF0IG5vIGxvbmdlciBleGlzdHMgb24gZGlzaywgcmV3cml0ZSBgY29tbWFuZGAgYmFjayB0byBgbnB4YCAoYXJncyBwcmVzZXJ2ZWQpXG4gKiBhbmQgcGVyc2lzdCB0aGUgY29uZmlnLiBBbnkgb3RoZXIgc3RhdGUgaXMgbGVmdCBieXRlLWZvci1ieXRlIHVudG91Y2hlZC5cbiAqXG4gKiBUaGUgdHJpZ2dlciBpcyBpbnRlbnRpb25hbGx5IHByZWZpeC1pbmRlcGVuZGVudCAoY29tbWFuZCBlbmRzIHdpdGhcbiAqIGBkb2xsaG91c2VtY3AtbnZtLnNoYCBBTkQgdGhlIGZpbGUgaXMgbWlzc2luZykgc28gaXQgaGVhbHMgbm90IGp1c3QgdGhlXG4gKiBvcmlnaW5hbCBgZG9sbGhvdXNlLW52bS10ZXN0LSpgIGxlYWsgYnV0IGFueSBmdXR1cmUgdGVtcC1kaXIgbGVhayBvciBhIHVzZXJcbiAqIHdobyB3aXBlZCB+Ly5kb2xsaG91c2UvYmluLiBBIHdyYXBwZXIgdGhhdCBzdGlsbCBleGlzdHMgaXMgZGVsaWJlcmF0ZWx5IGtlcHQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVOcHhJZldyYXBwZXJNaXNzaW5nKGNsaWVudDogc3RyaW5nLCBjb25maWdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IHJhdzogc3RyaW5nO1xuICB0cnkge1xuICAgIHJhdyA9IGF3YWl0IHJlYWRGaWxlKGNvbmZpZ1BhdGgsICd1dGYtOCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47IC8vIENvbmZpZyBub3QgcHJlc2VudC9yZWFkYWJsZSDigJQgbm90aGluZyB0byBoZWFsXG4gIH1cblxuICBsZXQgcGFyc2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjsgLy8gTWFsZm9ybWVkIEpTT04g4oCUIGRvbid0IHRvdWNoIGl0XG4gIH1cblxuICBsZXQgaGVhbGVkID0gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnbWNwU2VydmVycycsICdzZXJ2ZXJzJ10pIHtcbiAgICBjb25zdCBzZWN0aW9uID0gcGFyc2VkW2tleV0gYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVudHJ5ID0gc2VjdGlvbj8uZG9sbGhvdXNlbWNwO1xuICAgIGlmICghZW50cnkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNvbW1hbmQgPSBlbnRyeS5jb21tYW5kO1xuICAgIGlmICh0eXBlb2YgY29tbWFuZCA9PT0gJ3N0cmluZycgJiYgY29tbWFuZC5lbmRzV2l0aCgnZG9sbGhvdXNlbWNwLW52bS5zaCcpICYmICFleGlzdHNTeW5jKGNvbW1hbmQpKSB7XG4gICAgICBlbnRyeS5jb21tYW5kID0gJ25weCc7XG4gICAgICBoZWFsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBicmVhazsgLy8gZG9sbGhvdXNlbWNwIGVudHJ5IGxvY2F0ZWQgKGhlYWxlZCBvciBhbHJlYWR5IGhlYWx0aHkpIOKAlCBzdG9wIHNjYW5uaW5nIGtleXNcbiAgfVxuXG4gIGlmICghaGVhbGVkKSByZXR1cm47XG5cbiAgY29uc3QgaW5kZW50ID0gZGV0ZWN0SW5kZW50KHJhdyk7XG4gIGF3YWl0IHdyaXRlRmlsZShjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShwYXJzZWQsIG51bGwsIGluZGVudCkgKyAnXFxuJywgJ3V0Zi04Jyk7XG4gIGxvZ2dlci5pbmZvKGBbU2V0dXBdIE5WTSBzZWxmLWhlYWw6IHJlc3RvcmVkICR7Y2xpZW50fSBjb25maWcgdG8gYmFyZSBucHggKGRlYWQgd3JhcHBlciBwYXRoIHJlbW92ZWQpYCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIE5WTSBpcyBpbnN0YWxsZWQgb24gdGhpcyBtYWNoaW5lIChtYWNPUy9MaW51eCBvbmx5KS5cbiAqIENoZWNrcyBwcm9jZXNzLmVudi5OVk1fRElSIGZpcnN0IChoYW5kbGVzIG5vbi1zdGFuZGFyZCBpbnN0YWxsIGxvY2F0aW9ucyksXG4gKiB0aGVuIGZhbGxzIGJhY2sgdG8gfi8ubnZtLlxuICpcbiAqIEBwYXJhbSBob21lIC0gT3ZlcnJpZGUgaG9tZSBkaXJlY3RvcnkgKGRlZmF1bHRzIHRvIG9zLmhvbWVkaXIoKTsgaW5qZWN0YWJsZSBmb3IgdGVzdHMpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc052bVByZXNlbnQoaG9tZSA9IGhvbWVkaXIoKSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAocGxhdGZvcm0oKSA9PT0gJ3dpbjMyJykgcmV0dXJuIGZhbHNlO1xuICAvLyBDaGVjayBjYW5kaWRhdGVzIGluIG9yZGVyOiBlbnYgdmFyIG92ZXJyaWRlIOKGkiBkZWZhdWx0IGxvY2F0aW9uXG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbXG4gICAgcHJvY2Vzcy5lbnYuTlZNX0RJUixcbiAgICBqb2luKGhvbWUsICcubnZtJyksXG4gIF0uZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdO1xuICBmb3IgKGNvbnN0IGRpciBvZiBjYW5kaWRhdGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFjY2Vzcyhqb2luKGRpciwgJ252bS5zaCcpKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBOVk0gZGV0ZWN0ZWQgYXQ6ICR7ZGlyfWApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7IC8qIHRyeSBuZXh0IGNhbmRpZGF0ZSAqLyB9XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIE5WTSBub3QgZm91bmQgKGNoZWNrZWQ6ICR7Y2FuZGlkYXRlcy5qb2luKCcsICcpfSlgKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBOVk0gZGlyZWN0b3J5OiBwcm9jZXNzLmVudi5OVk1fRElSIGlmIHNldCwgb3RoZXJ3aXNlIH4vLm52bS5cbiAqIFVzZWQgdG8gaGFyZGNvZGUgdGhlIHBhdGggaW4gdGhlIGdlbmVyYXRlZCB3cmFwcGVyIHNvIGl0IHdvcmtzIGV2ZW4gd2hlblxuICogQ2xhdWRlIERlc2t0b3AgZG9lcyBub3Qgc291cmNlIHRoZSB1c2VyJ3Mgc2hlbGwgcHJvZmlsZS5cbiAqXG4gKiBwcm9jZXNzLmVudi5OVk1fRElSIGlzIHZhbGlkYXRlZCBiZWZvcmUgdXNlIHRvIHByZXZlbnQgc2hlbGwgaW5qZWN0aW9uIGluXG4gKiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgc2NyaXB0IChvbmx5IGFic29sdXRlIHBhdGhzIHdpdGggc2FmZSBjaGFyYWN0ZXJzIGFyZVxuICogYWNjZXB0ZWQ7IHVuc2FmZSB2YWx1ZXMgZmFsbCBiYWNrIHRvIH4vLm52bSkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVOdm1EaXIoaG9tZSA9IGhvbWVkaXIoKSk6IHN0cmluZyB7XG4gIGNvbnN0IGVudkRpciA9IHByb2Nlc3MuZW52Lk5WTV9ESVI7XG4gIGlmIChlbnZEaXIgJiYgL15cXC9bXFx3Li9+LV0rJC8udGVzdChlbnZEaXIpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIE5WTSBkaXIgcmVzb2x2ZWQgZnJvbSBOVk1fRElSIGVudiB2YXI6ICR7ZW52RGlyfWApO1xuICAgIHJldHVybiBlbnZEaXI7XG4gIH1cbiAgaWYgKGVudkRpcikge1xuICAgIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBOVk1fRElSIGVudiB2YXIgcmVqZWN0ZWQgKHVuc2FmZSBwYXRoKTogJHtlbnZEaXJ9IOKAlCBmYWxsaW5nIGJhY2sgdG8gfi8ubnZtYCk7XG4gIH1cbiAgY29uc3QgZmFsbGJhY2sgPSBqb2luKGhvbWUsICcubnZtJyk7XG4gIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBOVk0gZGlyIHJlc29sdmVkIHRvIGRlZmF1bHQ6ICR7ZmFsbGJhY2t9YCk7XG4gIHJldHVybiBmYWxsYmFjaztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIH4vLmRvbGxob3VzZS9iaW4vZG9sbGhvdXNlbWNwLW52bS5zaCBhbmQgcmV0dXJucyBpdHMgcGF0aC5cbiAqXG4gKiBUaGUgTlZNIGRpcmVjdG9yeSBpcyByZXNvbHZlZCBhdCBnZW5lcmF0aW9uIHRpbWUgYW5kIGhhcmRjb2RlZCBpbnRvIHRoZVxuICogc2NyaXB0LiBUaGlzIGlzIGludGVudGlvbmFsOiBDbGF1ZGUgRGVza3RvcCBkb2VzIG5vdCBzb3VyY2UgdGhlIHVzZXInc1xuICogc2hlbGwgcHJvZmlsZSwgc28gJE5WTV9ESVIgd291bGQgYmUgdW5zZXQgd2hlbiB0aGUgd3JhcHBlciBydW5zLiBCeVxuICogZW1iZWRkaW5nIHRoZSBhYnNvbHV0ZSBwYXRoIHdlIGd1YXJhbnRlZSB0aGUgY29ycmVjdCBOVk0gaXMgZm91bmQuXG4gKlxuICogVGhlIHNjcmlwdCBzb3VyY2VzIE5WTSwgdGhlbiBjaGVja3MgdGhlIGFjdGl2ZSBOb2RlIG1ham9yIHZlcnNpb24uIElmIGl0XG4gKiBpcyBiZWxvdyAxOCAodGhlIERvbGxob3VzZU1DUCBtaW5pbXVtKSwgaXQgdHJpZXMgYG52bSB1c2Ugbm9kZWAgKGhpZ2hlc3RcbiAqIGluc3RhbGxlZCkgdGhlbiBgbnZtIHVzZSAtLWx0c2AgYXMgYSBmYWxsYmFjay4gQSBmaW5hbCB2ZXJzaW9uIGNoZWNrXG4gKiB3cml0ZXMgYSB3YXJuaW5nIHRvIHN0ZGVyciBpZiB0aGUgbm9kZSBpcyBzdGlsbCB0b28gb2xkIOKAlCB0aGF0IHdhcm5pbmdcbiAqIHdpbGwgYXBwZWFyIGluIENsYXVkZSBEZXNrdG9wJ3MgZXJyb3IgbG9nLlxuICpcbiAqIEBwYXJhbSBob21lICAgICAgIC0gT3ZlcnJpZGUgaG9tZSBkaXJlY3RvcnkgKGluamVjdGFibGUgZm9yIHRlc3RzKVxuICogQHBhcmFtIG52bURpck92ZXJyaWRlIC0gT3ZlcnJpZGUgdGhlIHJlc29sdmVkIE5WTSBwYXRoIChpbmplY3RhYmxlIGZvciB0ZXN0cylcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU52bUxhdW5jaGVyKGhvbWUgPSBob21lZGlyKCksIG52bURpck92ZXJyaWRlPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgYmluRGlyID0gam9pbihob21lLCAnLmRvbGxob3VzZScsICdiaW4nKTtcbiAgY29uc3Qgd3JhcHBlclBhdGggPSBqb2luKGJpbkRpciwgJ2RvbGxob3VzZW1jcC1udm0uc2gnKTtcbiAgY29uc3QgbnZtRGlyID0gbnZtRGlyT3ZlcnJpZGUgPz8gcmVzb2x2ZU52bURpcihob21lKTtcblxuICBhd2FpdCBta2RpcihiaW5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIC8vIFNpbmdsZS1leHByZXNzaW9uIGhlbHBlciByZXVzZWQgdHdpY2UgdG8gZ2V0IHRoZSBOb2RlIG1ham9yIHZlcnNpb24uXG4gIGNvbnN0IGdldE1ham9yID0gJ25vZGUgLWUgXCJwcm9jZXNzLnN0ZG91dC53cml0ZShTdHJpbmcocHJvY2Vzcy52ZXJzaW9ucy5ub2RlLnNwbGl0KFxcJy5cXCcpWzBdKSlcIiAyPi9kZXYvbnVsbCB8fCBlY2hvIFwiMFwiJztcblxuICBjb25zdCBzY3JpcHQgPSBbXG4gICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAnIyBEb2xsaG91c2VNQ1AgTlZNLWF3YXJlIGxhdW5jaGVyJyxcbiAgICAnIyBBdXRvLWdlbmVyYXRlZCBieSB0aGUgRG9sbGhvdXNlTUNQIGluc3RhbGxlci4nLFxuICAgICcjIEVuc3VyZXMgdGhlIGNvcnJlY3QgTm9kZS5qcyB2ZXJzaW9uIGlzIGFjdGl2ZSBiZWZvcmUgcnVubmluZyBucHgsJyxcbiAgICAnIyB3b3JraW5nIGFyb3VuZCBhIENsYXVkZSBEZXNrdG9wIGJ1ZyB3aGVyZSBOVk0gUEFUSCBvcmRlcmluZyBjYXVzZXMnLFxuICAgICcjIG5weCB0byBleGVjdXRlIHVuZGVyIGFuIG9sZGVyIE5vZGUgdmVyc2lvbiAoZS5nLiB2MTIpIGV2ZW4gd2hlbiBhJyxcbiAgICAnIyBuZXdlciB2ZXJzaW9uIGlzIGluc3RhbGxlZC4nLFxuICAgICcjIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9tY3Atc2VydmVyL2lzc3Vlcy8xOTAyJyxcbiAgICAnJyxcbiAgICBgTlZNX0RJUj1cIiR7bnZtRGlyfVwiYCxcbiAgICAnaWYgWyAtcyBcIiROVk1fRElSL252bS5zaFwiIF07IHRoZW4nLFxuICAgICcgICAgIyBzaGVsbGNoZWNrIHNvdXJjZT0vZGV2L251bGwnLFxuICAgICcgICAgLiBcIiROVk1fRElSL252bS5zaFwiIDI+L2Rldi9udWxsJyxcbiAgICAnICAgICMgSWYgdGhlIGFjdGl2ZSBOb2RlIGlzIGJlbG93IHYxOCAobWluaW11bSBmb3IgRG9sbGhvdXNlTUNQKSwnLFxuICAgIGAgICAgIyB0cnkgJ25vZGUnIGFsaWFzIChoaWdoZXN0IGluc3RhbGxlZCkgdGhlbiBMVFMgYXMgYSBmYWxsYmFjay5gLFxuICAgIGAgICAgTUFKT1I9JCgke2dldE1ham9yfSlgLFxuICAgICcgICAgaWYgWyBcIiRNQUpPUlwiIC1sdCAxOCBdOyB0aGVuJyxcbiAgICAnICAgICAgICBudm0gdXNlIG5vZGUgMj4vZGV2L251bGwgfHwgbnZtIHVzZSAtLWx0cyAyPi9kZXYvbnVsbCB8fCB0cnVlJyxcbiAgICBgICAgICAgICBNQUpPUj0kKCR7Z2V0TWFqb3J9KWAsXG4gICAgJyAgICAgICAgaWYgWyBcIiRNQUpPUlwiIC1sdCAxOCBdOyB0aGVuJyxcbiAgICAnICAgICAgICAgICAgZWNobyBcIltEb2xsaG91c2VNQ1BdIFdBUk5JTkc6IE5vZGUuanMgJE1BSk9SIGlzIGJlbG93IHRoZSBtaW5pbXVtICgxOCkuIERvbGxob3VzZU1DUCBtYXkgbm90IHN0YXJ0IGNvcnJlY3RseS5cIiA+JjInLFxuICAgICcgICAgICAgIGZpJyxcbiAgICAnICAgIGZpJyxcbiAgICAnZmknLFxuICAgICcnLFxuICAgICdleGVjIG5weCBcIiRAXCInLFxuICBdLmpvaW4oJ1xcbicpICsgJ1xcbic7XG5cbiAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIFdyaXRpbmcgTlZNIGxhdW5jaGVyIHdyYXBwZXIgdG86ICR7d3JhcHBlclBhdGh9IChOVk1fRElSPSR7bnZtRGlyfSlgKTtcbiAgYXdhaXQgd3JpdGVGaWxlKHdyYXBwZXJQYXRoLCBzY3JpcHQsICd1dGYtOCcpO1xuICBhd2FpdCBjaG1vZCh3cmFwcGVyUGF0aCwgMG83NTUpO1xuICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gTlZNIGxhdW5jaGVyIHdyYXBwZXIgd3JpdHRlbiBhbmQgbWFkZSBleGVjdXRhYmxlYCk7XG4gIHJldHVybiB3cmFwcGVyUGF0aDtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBpbmRlbnRhdGlvbiB1c2VkIGluIGEgSlNPTiBzdHJpbmcgc28gdGhlIHJlc2VyaWFsaXNlZCBvdXRwdXRcbiAqIHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc3R5bGUgKGF2b2lkcyBub2lzeSBkaWZmcyBpbiB1c2VyLW1haW50YWluZWQgY29uZmlncykuXG4gKiBSZXR1cm5zIHRoZSB0YWIgY2hhcmFjdGVyIGZvciB0YWItaW5kZW50ZWQgZmlsZXMsIG9yIHRoZSBsZWFkaW5nLXNwYWNlIGNvdW50XG4gKiAobWluaW11bSAyKSBmb3Igc3BhY2UtaW5kZW50ZWQgZmlsZXMuIERlZmF1bHRzIHRvIDIgd2hlbiB1bmRldGVjdGFibGUuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdEluZGVudChyYXc6IHN0cmluZyk6IG51bWJlciB8IHN0cmluZyB7XG4gIGZvciAoY29uc3QgbGluZSBvZiByYXcuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKGxpbmUubGVuZ3RoID09PSAwIHx8IGxpbmUuc3RhcnRzV2l0aCgneycpIHx8IGxpbmUuc3RhcnRzV2l0aCgnfScpKSBjb250aW51ZTtcbiAgICBpZiAobGluZS5zdGFydHNXaXRoKCdcXHQnKSkgcmV0dXJuICdcXHQnO1xuICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyAnKSkge1xuICAgICAgY29uc3Qgc3BhY2VzID0gbGluZS5sZW5ndGggLSBsaW5lLnRyaW1TdGFydCgpLmxlbmd0aDtcbiAgICAgIGlmIChzcGFjZXMgPj0gMikgcmV0dXJuIHNwYWNlcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDI7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGBwYCByZXNvbHZlcyBpbnNpZGUgdGhlIE9TIHRlbXAgZGlyZWN0b3J5LlxuICogVXNlZCBhcyBhIHByb2R1Y3Rpb24gZ3VhcmRyYWlsIHNvIGEgd3JhcHBlciBjcmVhdGVkIGluIGEgdGhyb3dhd2F5IHRlbXAgZGlyXG4gKiAodGhlIHNoYXBlIG9mIHRoZSAjMjMzOCB0ZXN0IGxlYWspIGNhbiBuZXZlciBiZSBwZXJzaXN0ZWQgaW50byBhIHJlYWwsXG4gKiBsb25nLWxpdmVkIGNsaWVudCBjb25maWcuXG4gKi9cbmZ1bmN0aW9uIGlzVW5kZXJUbXBkaXIocDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHQgPSB0bXBkaXIoKTtcbiAgcmV0dXJuIHAgPT09IHQgfHwgcC5zdGFydHNXaXRoKHQgKyBzZXApO1xufVxuXG4vKipcbiAqIFBhdGNoZXMgdGhlIGRvbGxob3VzZW1jcCBlbnRyeSBpbiBhbiBNQ1AgY2xpZW50J3MgSlNPTiBjb25maWcgdG8gdXNlXG4gKiB0aGUgTlZNLWF3YXJlIGxhdW5jaGVyIGluc3RlYWQgb2YgYmFyZSBgbnB4YC5cbiAqXG4gKiBPbmx5IGFjdHMgb24gSlNPTi1mb3JtYXQgY29uZmlncy4gVE9NTCBjb25maWdzIChjb2RleCkgYXJlIHNraXBwZWQuXG4gKiBTaWxlbnRseSBuby1vcHMgaWYgdGhlIGNvbmZpZyBmaWxlIGlzIG1pc3Npbmcgb3IgdW5yZWFkYWJsZS5cbiAqXG4gKiBAcGFyYW0gY29uZmlnUGF0aE92ZXJyaWRlIC0gVXNlIHRoaXMgcGF0aCBpbnN0ZWFkIG9mIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IChpbmplY3RhYmxlIGZvciB0ZXN0cylcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhdGNoQ29uZmlnRm9yTnZtTGF1bmNoZXIoY2xpZW50OiBzdHJpbmcsIHdyYXBwZXJQYXRoOiBzdHJpbmcsIGNvbmZpZ1BhdGhPdmVycmlkZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb25maWdQYXRoID0gY29uZmlnUGF0aE92ZXJyaWRlID8/IGdldENvbmZpZ1BhdGgoY2xpZW50KTtcbiAgaWYgKCFjb25maWdQYXRoKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIHBhdGNoQ29uZmlnRm9yTnZtTGF1bmNoZXI6IG5vIGNvbmZpZyBwYXRoIGZvciAke2NsaWVudH0g4oCUIHNraXBwaW5nYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChjb25maWdQYXRoLmVuZHNXaXRoKCcudG9tbCcpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIHBhdGNoQ29uZmlnRm9yTnZtTGF1bmNoZXI6IFRPTUwgY29uZmlnIGZvciAke2NsaWVudH0g4oCUIHNraXBwaW5nIChub3QgSlNPTi1mb3JtYXQpYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIEd1YXJkcmFpbCAoIzIzMzgpOiBuZXZlciBwZXJzaXN0IGEgdGVtcC1kaXIgd3JhcHBlciBpbnRvIGEgcmVhbCwgcGVyc2lzdGVudFxuICAvLyBjbGllbnQgY29uZmlnLiBBIHdyYXBwZXIgdW5kZXIgb3MudG1wZGlyKCkgaXMgYSB0aHJvd2F3YXkgcGF0aCB0aGF0IHdpbGwgYmVcbiAgLy8gZGVsZXRlZCwgc28gd3JpdGluZyBpdCBpbnRvIGEgZHVyYWJsZSBjb25maWcgd291bGQgYnJlYWsgdGhlIGNsaWVudCBvbiB0aGVcbiAgLy8gbmV4dCBsYXVuY2guIFdoZW4gQk9USCB0aGUgd3JhcHBlciBhbmQgdGhlIGNvbmZpZyBsaXZlIHVuZGVyIHRtcGRpciB3ZSBhcmVcbiAgLy8gaW4gYSBzYW5kYm94ZWQgdGVzdCBhbmQgYWxsb3cgaXQsIHNvIE5WTS1wcmVzZW50IGNvdmVyYWdlIHN0aWxsIGV4ZXJjaXNlc1xuICAvLyB0aGUgcmVhbCBwYXRjaCBwYXRoLlxuICBpZiAoaXNVbmRlclRtcGRpcih3cmFwcGVyUGF0aCkgJiYgIWlzVW5kZXJUbXBkaXIoY29uZmlnUGF0aCkpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgIGBbU2V0dXBdIHBhdGNoQ29uZmlnRm9yTnZtTGF1bmNoZXI6IHJlZnVzaW5nIHRvIHdyaXRlIGEgdGVtcC1kaXIgd3JhcHBlciAoJHt3cmFwcGVyUGF0aH0pIGAgK1xuICAgICAgYGludG8gYSBwZXJzaXN0ZW50ICR7Y2xpZW50fSBjb25maWcgKCR7Y29uZmlnUGF0aH0pIOKAlCBzZWUgaXNzdWUgIzIzMzhgLFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHJhdzogc3RyaW5nO1xuICB0cnkge1xuICAgIHJhdyA9IGF3YWl0IHJlYWRGaWxlKGNvbmZpZ1BhdGgsICd1dGYtOCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47IC8vIENvbmZpZyBub3QgcmVhZGFibGUg4oCUIGluc3RhbGwtbWNwIG1heSBub3QgaGF2ZSB3cml0dGVuIGl0IHlldFxuICB9XG5cbiAgbGV0IHBhcnNlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47IC8vIE1hbGZvcm1lZCBKU09OIOKAlCBkb24ndCB0b3VjaCBpdFxuICB9XG5cbiAgbGV0IHBhdGNoZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydtY3BTZXJ2ZXJzJywgJ3NlcnZlcnMnXSkge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBwYXJzZWRba2V5XSBhcyBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHNlY3Rpb24/LmRvbGxob3VzZW1jcCkge1xuICAgICAgc2VjdGlvbi5kb2xsaG91c2VtY3AuY29tbWFuZCA9IHdyYXBwZXJQYXRoO1xuICAgICAgcGF0Y2hlZCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoIXBhdGNoZWQpIHtcbiAgICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gcGF0Y2hDb25maWdGb3JOdm1MYXVuY2hlcjogbm8gZG9sbGhvdXNlbWNwIGVudHJ5IGluICR7Y2xpZW50fSBjb25maWcg4oCUIG5vdGhpbmcgdG8gcGF0Y2hgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBpbmRlbnQgPSBkZXRlY3RJbmRlbnQocmF3KTtcbiAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIHBhdGNoQ29uZmlnRm9yTnZtTGF1bmNoZXI6IHdyaXRpbmcgJHtjbGllbnR9IGNvbmZpZyAoaW5kZW50PSR7SlNPTi5zdHJpbmdpZnkoaW5kZW50KX0pYCk7XG4gIGF3YWl0IHdyaXRlRmlsZShjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShwYXJzZWQsIG51bGwsIGluZGVudCkgKyAnXFxuJywgJ3V0Zi04Jyk7XG4gIGxvZ2dlci5pbmZvKGBbU2V0dXBdIFBhdGNoZWQgJHtjbGllbnR9IGNvbmZpZyB0byB1c2UgTlZNLWF3YXJlIGxhdW5jaGVyOiAke3dyYXBwZXJQYXRofWApO1xufVxuXG5mdW5jdGlvbiBidWlsZE1jcFNlcnZlckVudHJ5KHZlcnNpb24/OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IHRhZyA9IHZlcnNpb24gPyBgQCR7dmVyc2lvbn1gIDogJ0BsYXRlc3QnO1xuICByZXR1cm4ge1xuICAgIGNvbW1hbmQ6ICducHgnLFxuICAgIGFyZ3M6IFtgQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyJHt0YWd9YF0sXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsSnNvbk1jcENsaWVudENvbmZpZyhcbiAgY2xpZW50OiBzdHJpbmcsXG4gIHZlcnNpb24/OiBzdHJpbmcsXG4gIGNvbmZpZ1BhdGhPdmVycmlkZT86IHN0cmluZyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBjb25maWdQYXRoT3ZlcnJpZGUgPz8gZ2V0Q29uZmlnUGF0aChjbGllbnQpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZyBwYXRoIHVua25vd24gZm9yIGNsaWVudDogJHtjbGllbnR9YCk7XG4gIH1cbiAgaWYgKGNvbmZpZ1BhdGguZW5kc1dpdGgoJy50b21sJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEpTT04gTUNQIGluc3RhbGwgaXMgbm90IHN1cHBvcnRlZCBmb3IgVE9NTCBjbGllbnQ6ICR7Y2xpZW50fWApO1xuICB9XG5cbiAgYXdhaXQgbWtkaXIoZGlybmFtZShjb25maWdQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgbGV0IHJhdyA9ICcnO1xuICBsZXQgcGFyc2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICB0cnkge1xuICAgIHJhdyA9IGF3YWl0IHJlYWRGaWxlKGNvbmZpZ1BhdGgsICd1dGYtOCcpO1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIWlzTWlzc2luZ1BhdGhFcnJvcihlcnJvcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIGV4aXN0aW5nIGNvbmZpZyBhdCAke2NvbmZpZ1BhdGh9YCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgcm9vdEtleSA9IGNsaWVudCA9PT0gJ3ZzY29kZScgPyAnc2VydmVycycgOiAnbWNwU2VydmVycyc7XG4gIGNvbnN0IGV4aXN0aW5nUm9vdCA9IHBhcnNlZFtyb290S2V5XTtcbiAgY29uc3Qgcm9vdCA9IGV4aXN0aW5nUm9vdCAmJiB0eXBlb2YgZXhpc3RpbmdSb290ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShleGlzdGluZ1Jvb3QpXG4gICAgPyBleGlzdGluZ1Jvb3QgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICA6IHt9O1xuXG4gIHJvb3QuZG9sbGhvdXNlbWNwID0gYnVpbGRNY3BTZXJ2ZXJFbnRyeSh2ZXJzaW9uKTtcbiAgcGFyc2VkW3Jvb3RLZXldID0gcm9vdDtcblxuICBjb25zdCBpbmRlbnQgPSByYXcgPyBkZXRlY3RJbmRlbnQocmF3KSA6IDI7XG4gIGF3YWl0IHdyaXRlRmlsZShjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShwYXJzZWQsIG51bGwsIGluZGVudCkgKyAnXFxuJywgJ3V0Zi04Jyk7XG5cbiAgcmV0dXJuIGBJbnN0YWxsZWQgTUNQIHNlcnZlciBcImRvbGxob3VzZW1jcFwiIGluICR7Y2xpZW50fSAoJHtjb25maWdQYXRofSlgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsTG1TdHVkaW9Db25maWcodmVyc2lvbj86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBpbnN0YWxsSnNvbk1jcENsaWVudENvbmZpZygnbG1zdHVkaW8nLCB2ZXJzaW9uKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBpbnN0YWxsLW1jcCBiaW5hcnkgcGF0aC5cbiAqIFVzZXMgdGhlIGxvY2FsIGRlcGVuZGVuY3kgKG5vZGVfbW9kdWxlcy8uYmluL2luc3RhbGwtbWNwKSBmaXJzdCxcbiAqIGZhbGxzIGJhY2sgdG8gbnB4IGlmIG5vdCBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxNY3BCaW4oKTogeyBjbWQ6IHN0cmluZzsgcHJlZml4QXJnczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IGxvY2FsQmluID0gam9pbihkaXJuYW1lKGRpcm5hbWUoZGlybmFtZShfX2Rpcm5hbWUpKSksICdub2RlX21vZHVsZXMnLCAnLmJpbicsICdpbnN0YWxsLW1jcCcpO1xuICB0cnkge1xuICAgIGFjY2Vzc1N5bmMobG9jYWxCaW4sIGZzQ29uc3RhbnRzLlhfT0spO1xuICAgIHJldHVybiB7IGNtZDogbG9jYWxCaW4sIHByZWZpeEFyZ3M6IFtdIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IGNtZDogJ25weCcsIHByZWZpeEFyZ3M6IFsnaW5zdGFsbC1tY3AnXSB9O1xuICB9XG59XG5cbi8qKlxuICogUnVuIGluc3RhbGwtbWNwIHRvIGNvbmZpZ3VyZSBhIHNwZWNpZmljIE1DUCBjbGllbnQuXG4gKlxuICogVXNlcyB0aGUgYnVuZGxlZCBpbnN0YWxsLW1jcCBkZXBlbmRlbmN5IChNSVQsIGh0dHBzOi8vZ2l0aHViLmNvbS9zdXBlcm1lbW9yeWFpL2luc3RhbGwtbWNwKS5cbiAqIENvbW1hbmQgYXJndW1lbnRzIGFyZSBmdWxseSBoYXJkY29kZWQg4oCUIG5vIHVzZXIgaW5wdXQgcmVhY2hlcyB0aGUgc2hlbGwuXG4gKiBleGVjRmlsZSBpcyB1c2VkIChub3QgZXhlYykgdG8gcHJldmVudCBzaGVsbCBpbmplY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHJ1bkluc3RhbGxNY3AoY2xpZW50OiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHsgY21kLCBwcmVmaXhBcmdzIH0gPSByZXNvbHZlSW5zdGFsbE1jcEJpbigpO1xuICAgIGNvbnN0IHRhZyA9IHZlcnNpb24gPyBgQCR7dmVyc2lvbn1gIDogJ0BsYXRlc3QnO1xuICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICAuLi5wcmVmaXhBcmdzLFxuICAgICAgYEBkb2xsaG91c2VtY3AvbWNwLXNlcnZlciR7dGFnfWAsXG4gICAgICAnLS1jbGllbnQnLCBjbGllbnQsXG4gICAgICAnLS1uYW1lJywgJ2RvbGxob3VzZW1jcCcsXG4gICAgICAnLS15ZXMnLFxuICAgIF07XG5cbiAgICBleGVjRmlsZShjbWQsIGFyZ3MsIHsgdGltZW91dDogMzBfMDAwIH0sIChlcnIsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3Ioc3RkZXJyIHx8IGVyci5tZXNzYWdlKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoc3Rkb3V0IHx8ICdJbnN0YWxsYXRpb24gY29tcGxldGVkLicpO1xuICAgIH0pO1xuICB9KTtcbn1cbiJdfQ==