@nlabs/lex 1.49.0 → 1.49.2

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.
@@ -17,21 +17,8 @@ try {
17
17
  const createDefaultESLintConfig = (useTypescript, cwd) => {
18
18
  const configPath = pathResolve(cwd, ".lex-temp-default-eslint.cjs");
19
19
  const originalConfig = null;
20
- const possiblePaths = [
21
- pathResolve(currentDirname, "eslint.config.ts"),
22
- pathResolve(currentDirname, "eslint.config.js"),
23
- pathResolve(process.env.LEX_HOME || "./node_modules/@nlabs/lex", "eslint.config.ts"),
24
- pathResolve(process.env.LEX_HOME || "./node_modules/@nlabs/lex", "eslint.config.js")
25
- ];
26
- let foundConfig = "";
27
- for (const path of possiblePaths) {
28
- if (existsSync(path)) {
29
- foundConfig = path;
30
- break;
31
- }
32
- }
33
20
  const configContent = `// Temporary ESLint config generated by Lex
34
- const lexConfig = require('@nlabs/lex/eslint.config.js');
21
+ const lexConfig = require('@nlabs/lex/eslint.config.mjs');
35
22
 
36
23
  module.exports = lexConfig;`;
37
24
  writeFileSync(configPath, configContent, "utf8");
@@ -40,13 +27,6 @@ module.exports = lexConfig;`;
40
27
  originalConfig
41
28
  };
42
29
  };
43
- const createBasicESLintConfig = (useTypescript) => {
44
- const config = `// ESLint configuration
45
- import lexConfig from '@nlabs/lex/eslint.config.js';
46
-
47
- return lexConfig;`;
48
- return config;
49
- };
50
30
  const detectTypeScript = (cwd) => existsSync(pathResolve(cwd, "tsconfig.json"));
51
31
  const ensureModuleType = (cwd) => {
52
32
  const packageJsonPath = pathResolve(cwd, "package.json");
@@ -71,14 +51,14 @@ const installDependencies = async (cwd, useTypescript, quiet) => {
71
51
  const runEslintWithLex = async (cwd, quiet, cliName, fix, debug, useTypescript, captureOutput) => {
72
52
  const spinner = createSpinner(quiet);
73
53
  try {
74
- const projectConfigPath = pathResolve(cwd, "eslint.config.js");
54
+ const projectConfigPath = pathResolve(cwd, "eslint.config.mjs");
75
55
  const projectConfigPathTs = pathResolve(cwd, "eslint.config.ts");
76
56
  const hasProjectConfig = existsSync(projectConfigPath) || existsSync(projectConfigPathTs);
77
57
  const hasLexConfigEslint = LexConfig.config.eslint && Object.keys(LexConfig.config.eslint).length > 0;
78
58
  const possiblePaths = [
79
- pathResolve(currentDirname, "../../../../eslint.config.js"),
59
+ pathResolve(currentDirname, "../../../../eslint.config.mjs"),
80
60
  pathResolve(currentDirname, "../../../../eslint.config.ts"),
81
- pathResolve(process.env.LEX_HOME || "/usr/local/lib/node_modules/@nlabs/lex", "eslint.config.js"),
61
+ pathResolve(process.env.LEX_HOME || "/usr/local/lib/node_modules/@nlabs/lex", "eslint.config.mjs"),
82
62
  pathResolve(process.env.LEX_HOME || "/usr/local/lib/node_modules/@nlabs/lex", "eslint.config.ts")
83
63
  ];
84
64
  let lexConfigPath = "";
@@ -98,7 +78,7 @@ const runEslintWithLex = async (cwd, quiet, cliName, fix, debug, useTypescript,
98
78
  } else if (hasLexConfigEslint) {
99
79
  tempConfigPath = pathResolve(cwd, ".lex-temp-eslint.cjs");
100
80
  const configContent = `// Temporary ESLint config generated by Lex
101
- const lexConfig = require('@nlabs/lex/eslint.config.js');
81
+ const lexConfig = require('@nlabs/lex/eslint.config.mjs');
102
82
  const userConfig = ${JSON.stringify(LexConfig.config.eslint, null, 2)};
103
83
 
104
84
  // Merge Lex's config with user config
@@ -118,7 +98,7 @@ module.exports = {
118
98
  } else {
119
99
  tempConfigPath = pathResolve(cwd, ".lex-temp-default-eslint.cjs");
120
100
  const configContent = `// Temporary default ESLint config generated by Lex
121
- const lexConfig = require('@nlabs/lex/eslint.config.js');
101
+ const lexConfig = require('@nlabs/lex/eslint.config.mjs');
122
102
 
123
103
  module.exports = lexConfig;`;
124
104
  writeFileSync(tempConfigPath, configContent, "utf8");
@@ -148,10 +128,10 @@ ${cliName} Error: ESLint binary not found in Lex's node_modules`, "error", quiet
148
128
  ...configArgs,
149
129
  ...baseEslintArgs
150
130
  ], {
151
- reject: false,
152
- stdio: "pipe",
153
131
  cwd,
154
- shell: true
132
+ reject: false,
133
+ shell: true,
134
+ stdio: "pipe"
155
135
  });
156
136
  if (jsResult.stdout) {
157
137
  console.log(jsResult.stdout);
@@ -165,17 +145,17 @@ ${cliName} Error: ESLint binary not found in Lex's node_modules`, "error", quiet
165
145
  captureOutput(jsResult.stderr);
166
146
  }
167
147
  }
168
- let tsResult = { exitCode: 0, stdout: "", stderr: "" };
148
+ let tsResult = { exitCode: 0, stderr: "", stdout: "" };
169
149
  if (useTypescript) {
170
150
  tsResult = await execa(eslintBinary, [
171
151
  "src/**/*.{ts,tsx}",
172
152
  ...configArgs,
173
153
  ...baseEslintArgs
174
154
  ], {
175
- reject: false,
176
- stdio: "pipe",
177
155
  cwd,
178
- shell: true
156
+ reject: false,
157
+ shell: true,
158
+ stdio: "pipe"
179
159
  });
180
160
  if (tsResult.stdout) {
181
161
  console.log(tsResult.stdout);
@@ -370,16 +350,16 @@ Fix ONLY the specific ESLint errors. Return the properly formatted code.`;
370
350
  const promptFile = pathResolve(cwd, ".cursor_prompt_temp.txt");
371
351
  writeFileSync(promptFile, prompt, "utf8");
372
352
  await execa("cursor", ["edit", "--file", filePath, "--prompt-file", promptFile], {
353
+ cwd,
373
354
  reject: false,
374
- stdio: "pipe",
375
- cwd
355
+ stdio: "pipe"
376
356
  });
377
357
  try {
378
358
  unlinkSync(promptFile);
379
359
  } catch (_error) {
380
360
  }
381
361
  log(`Applied Cursor AI fixes to ${filePath}`, "info", quiet);
382
- } catch (error) {
362
+ } catch {
383
363
  const wasModified = await applyDirectFixes(filePath, quiet);
384
364
  if (wasModified) {
385
365
  log(`Applied direct fixes to ${filePath}`, "info", quiet);
@@ -798,16 +778,6 @@ const removeFileComments = (filePath, quiet) => {
798
778
  log(`Skipping comment removal for large file: ${filePath}`, "info", quiet);
799
779
  return false;
800
780
  }
801
- const ext = extname(filePath);
802
- let isTypeScript = false;
803
- let isJavaScript = false;
804
- if ([".ts", ".tsx"].includes(ext)) {
805
- isTypeScript = true;
806
- } else if ([".js", ".jsx"].includes(ext)) {
807
- isJavaScript = true;
808
- } else {
809
- return false;
810
- }
811
781
  let newContent = fileContent.replace(
812
782
  /\/\*[\s\S]*?\*\//g,
813
783
  (match) => {
@@ -846,7 +816,6 @@ const lint = async (cmd, callback = process.exit) => {
846
816
  quiet = false,
847
817
  config = null,
848
818
  removeComments = false,
849
- // Handle kebab-case CLI flag conversion
850
819
  "remove-comments": removeCommentsFlag = false
851
820
  } = cmd;
852
821
  const shouldRemoveComments = removeComments || removeCommentsFlag;
@@ -863,7 +832,7 @@ const lint = async (cmd, callback = process.exit) => {
863
832
  }
864
833
  ensureModuleType(cwd);
865
834
  await installDependencies(cwd, useTypescript, quiet);
866
- const projectConfigPath = pathResolve(cwd, "eslint.config.js");
835
+ const projectConfigPath = pathResolve(cwd, "eslint.config.mjs");
867
836
  const projectConfigPathTs = pathResolve(cwd, "eslint.config.ts");
868
837
  const hasEslintConfig = existsSync(projectConfigPath) || existsSync(projectConfigPathTs) || existsSync(pathResolve(cwd, ".eslintrc.js")) || existsSync(pathResolve(cwd, ".eslintrc.json")) || existsSync(pathResolve(cwd, ".eslintrc.yml")) || existsSync(pathResolve(cwd, ".eslintrc.yaml")) || existsSync(pathResolve(cwd, ".eslintrc"));
869
838
  const hasLexEslintConfig = await loadESLintConfig(cwd, quiet, debug);
@@ -878,9 +847,9 @@ const lint = async (cmd, callback = process.exit) => {
878
847
  if (!hasEslintConfig && !hasLexEslintConfig) {
879
848
  const possiblePaths = [
880
849
  pathResolve(currentDirname, "../../../../eslint.config.ts"),
881
- pathResolve(currentDirname, "../../../../eslint.config.js"),
850
+ pathResolve(currentDirname, "../../../../eslint.config.jms"),
882
851
  pathResolve(process.env.LEX_HOME || "./node_modules/@nlabs/lex", "eslint.config.ts"),
883
- pathResolve(process.env.LEX_HOME || "./node_modules/@nlabs/lex", "eslint.config.js")
852
+ pathResolve(process.env.LEX_HOME || "./node_modules/@nlabs/lex", "eslint.config.mjs")
884
853
  ];
885
854
  for (const path of possiblePaths) {
886
855
  if (existsSync(path)) {
@@ -926,7 +895,7 @@ const lint = async (cmd, callback = process.exit) => {
926
895
  const glob = await import("glob");
927
896
  const files = glob.sync("{src,lib}/**/*.{js,jsx,ts,tsx}", {
928
897
  cwd,
929
- ignore: ["**/node_modules/**", "**/dist/**", "**/build/**"]
898
+ ignore: ["**/node_modules/**", "**/lib/**", "**/dist/**", "**/build/**"]
930
899
  });
931
900
  let processedCount = 0;
932
901
  for (const file of files) {
@@ -981,7 +950,7 @@ ${cliName} Error: ${error.message}`, "error", quiet);
981
950
  if (debug) {
982
951
  log(`Cleaned up temporary ESLint config at ${filePath}`, "info", quiet);
983
952
  }
984
- } catch (_error) {
953
+ } catch {
985
954
  }
986
955
  }
987
956
  }
@@ -990,4 +959,4 @@ ${cliName} Error: ${error.message}`, "error", quiet);
990
959
  export {
991
960
  lint
992
961
  };
993
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2xpbnQvbGludC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjItUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB1bmxpbmtTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2Rpcm5hbWUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmUsIGV4dG5hbWV9IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lcn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7cmVzb2x2ZUJpbmFyeVBhdGh9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5cbmxldCBjdXJyZW50RmlsZW5hbWU6IHN0cmluZztcbmxldCBjdXJyZW50RGlybmFtZTogc3RyaW5nO1xuXG50cnkge1xuICBjdXJyZW50RmlsZW5hbWUgPSBldmFsKCdyZXF1aXJlKFwidXJsXCIpLmZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKScpO1xuICBjdXJyZW50RGlybmFtZSA9IGRpcm5hbWUoY3VycmVudEZpbGVuYW1lKTtcbn0gY2F0Y2gge1xuICBjdXJyZW50RmlsZW5hbWUgPSBwcm9jZXNzLmN3ZCgpO1xuICBjdXJyZW50RGlybmFtZSA9IHByb2Nlc3MuY3dkKCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGludE9wdGlvbnMge1xuICByZWFkb25seSBjYWNoZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNhY2hlRmlsZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY2FjaGVMb2NhdGlvbj86IHN0cmluZztcbiAgcmVhZG9ubHkgY2xpTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY29sb3I/OiBib29sZWFuO1xuICByZWFkb25seSBjb25maWc/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlYnVnPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZW52Pzogc3RyaW5nO1xuICByZWFkb25seSBlbnZJbmZvPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZXh0Pzogc3RyaW5nO1xuICByZWFkb25seSBmaXg/OiBib29sZWFuO1xuICByZWFkb25seSBmaXhEcnlSdW4/OiBib29sZWFuO1xuICByZWFkb25seSBmaXhUeXBlPzogc3RyaW5nO1xuICByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGdsb2JhbD86IHN0cmluZztcbiAgcmVhZG9ubHkgaWdub3JlUGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgaWdub3JlUGF0dGVybj86IHN0cmluZztcbiAgcmVhZG9ubHkgaW5pdD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG1heFdhcm5pbmdzPzogc3RyaW5nO1xuICByZWFkb25seSBub0NvbG9yPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbm9Fc2xpbnRyYz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG5vSWdub3JlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbm9JbmxpbmVDb25maWc/OiBib29sZWFuO1xuICByZWFkb25seSBvdXRwdXRGaWxlPzogc3RyaW5nO1xuICByZWFkb25seSBwYXJzZXI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhcnNlck9wdGlvbnM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbj86IHN0cmluZztcbiAgcmVhZG9ubHkgcHJpbnRDb25maWc/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVtb3ZlQ29tbWVudHM/OiBib29sZWFuO1xuICByZWFkb25seSByZXBvcnRVbnVzZWREaXNhYmxlRGlyZWN0aXZlcz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlc29sdmVQbHVnaW5zUmVsYXRpdmVUbz86IHN0cmluZztcbiAgcmVhZG9ubHkgcnVsZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcnVsZXNkaXI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0ZGluPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3RkaW5GaWxlbmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTGludENhbGxiYWNrID0gdHlwZW9mIHByb2Nlc3MuZXhpdDtcblxuaW50ZXJmYWNlIENvbmZpZ1Jlc3VsdCB7XG4gIGNvbmZpZ1BhdGg6IHN0cmluZztcbiAgb3JpZ2luYWxDb25maWc6IHN0cmluZyB8IG51bGw7XG59XG5cbmNvbnN0IGNyZWF0ZURlZmF1bHRFU0xpbnRDb25maWcgPSAodXNlVHlwZXNjcmlwdDogYm9vbGVhbiwgY3dkOiBzdHJpbmcpOiBDb25maWdSZXN1bHQgPT4ge1xuICAvLyBVc2UgYSB0ZW1wb3JhcnkgZmlsZSBwYXRoIGluc3RlYWQgb2YgY3JlYXRpbmcgaW4gdGhlIHByb2plY3QgZGlyZWN0b3J5XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoUmVzb2x2ZShjd2QsICcubGV4LXRlbXAtZGVmYXVsdC1lc2xpbnQuY2pzJyk7XG4gIGNvbnN0IG9yaWdpbmFsQ29uZmlnID0gbnVsbDtcblxuICAvLyBUcnkgdG8gbG9jYXRlIExleCdzIEVTTGludCBjb25maWdcbiAgY29uc3QgcG9zc2libGVQYXRocyA9IFtcbiAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJ2VzbGludC5jb25maWcudHMnKSxcbiAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJ2VzbGludC5jb25maWcuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmVudi5MRVhfSE9NRSB8fCAnLi9ub2RlX21vZHVsZXMvQG5sYWJzL2xleCcsICdlc2xpbnQuY29uZmlnLnRzJyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5lbnYuTEVYX0hPTUUgfHwgJy4vbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnZXNsaW50LmNvbmZpZy5qcycpXG4gIF07XG5cbiAgbGV0IGZvdW5kQ29uZmlnID0gJyc7XG5cbiAgZm9yKGNvbnN0IHBhdGggb2YgcG9zc2libGVQYXRocykge1xuICAgIGlmKGV4aXN0c1N5bmMocGF0aCkpIHtcbiAgICAgIGZvdW5kQ29uZmlnID0gcGF0aDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBDb21tb25KUyBtb2R1bGUgdGhhdCByZXF1aXJlcyBMZXgncyBFU0xpbnQgY29uZmlnXG4gIGNvbnN0IGNvbmZpZ0NvbnRlbnQgPSBgLy8gVGVtcG9yYXJ5IEVTTGludCBjb25maWcgZ2VuZXJhdGVkIGJ5IExleFxuY29uc3QgbGV4Q29uZmlnID0gcmVxdWlyZSgnQG5sYWJzL2xleC9lc2xpbnQuY29uZmlnLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbGV4Q29uZmlnO2A7XG5cbiAgd3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBjb25maWdDb250ZW50LCAndXRmOCcpO1xuXG4gIHJldHVybiB7XG4gICAgY29uZmlnUGF0aCxcbiAgICBvcmlnaW5hbENvbmZpZ1xuICB9O1xufTtcblxuY29uc3QgY3JlYXRlQmFzaWNFU0xpbnRDb25maWcgPSAodXNlVHlwZXNjcmlwdDogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIC8vIENyZWF0ZSBhIHNpbXBsaWZpZWQgY29uZmlnIHRoYXQgZXh0ZW5kcyBMZXgncyBFU0xpbnQgY29uZmlnXG4gIGNvbnN0IGNvbmZpZyA9IGAvLyBFU0xpbnQgY29uZmlndXJhdGlvblxuaW1wb3J0IGxleENvbmZpZyBmcm9tICdAbmxhYnMvbGV4L2VzbGludC5jb25maWcuanMnO1xuXG5yZXR1cm4gbGV4Q29uZmlnO2A7XG4gIHJldHVybiBjb25maWc7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIFR5cGVTY3JpcHQgaXMgYmVpbmcgdXNlZCBieSBsb29raW5nIGZvciB0c2NvbmZpZy5qc29uXG4gKi9cbmNvbnN0IGRldGVjdFR5cGVTY3JpcHQgPSAoY3dkOiBzdHJpbmcpOiBib29sZWFuID0+IGV4aXN0c1N5bmMocGF0aFJlc29sdmUoY3dkLCAndHNjb25maWcuanNvbicpKTtcblxuLyoqXG4gKiBFbnN1cmUgcGFja2FnZS5qc29uIGhhcyB0eXBlOiBtb2R1bGUgZm9yIEVTTSBzdXBwb3J0XG4gKi9cbmNvbnN0IGVuc3VyZU1vZHVsZVR5cGUgPSAoY3dkOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aFJlc29sdmUoY3dkLCAncGFja2FnZS5qc29uJyk7XG5cbiAgaWYoZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uQ29udGVudCA9IHJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25Db250ZW50KTtcblxuICAgICAgLy8gSWYgdHlwZSBpcyBub3Qgc2V0IHRvIG1vZHVsZSwgd2FybiBpbnN0ZWFkIG9mIGF1dG8tbW9kaWZ5aW5nXG4gICAgICBpZihwYWNrYWdlSnNvbi50eXBlICE9PSAnbW9kdWxlJykge1xuICAgICAgICBsb2coJ1dhcm5pbmc6IHBhY2thZ2UuanNvbiBzaG91bGQgaGF2ZSBcInR5cGVcIjogXCJtb2R1bGVcIiBmb3IgRVNNIHN1cHBvcnQuIFBsZWFzZSBhZGQgdGhpcyBtYW51YWxseS4nLCAnd2FybicsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IGluc3RhbGxEZXBlbmRlbmNpZXMgPSBhc3luYyAoY3dkOiBzdHJpbmcsIHVzZVR5cGVzY3JpcHQ6IGJvb2xlYW4sIHF1aWV0OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGlmKHVzZVR5cGVzY3JpcHQpIHtcbiAgICBsb2coJ1VzaW5nIFR5cGVTY3JpcHQgRVNMaW50IGZyb20gTGV4Li4uJywgJ2luZm8nLCBxdWlldCk7XG4gIH0gZWxzZSB7XG4gICAgbG9nKCdVc2luZyBFU0xpbnQgZnJvbSBMZXguLi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgfVxufTtcblxuY29uc3QgcnVuRXNsaW50V2l0aExleCA9IGFzeW5jIChcbiAgY3dkOiBzdHJpbmcsXG4gIHF1aWV0OiBib29sZWFuLFxuICBjbGlOYW1lOiBzdHJpbmcsXG4gIGZpeDogYm9vbGVhbixcbiAgZGVidWc6IGJvb2xlYW4sXG4gIHVzZVR5cGVzY3JpcHQ6IGJvb2xlYW4sXG4gIGNhcHR1cmVPdXRwdXQ/OiAob3V0cHV0OiBzdHJpbmcpID0+IHZvaWRcbik6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHNwaW5uZXIgPSBjcmVhdGVTcGlubmVyKHF1aWV0KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHByb2plY3RDb25maWdQYXRoID0gcGF0aFJlc29sdmUoY3dkLCAnZXNsaW50LmNvbmZpZy5qcycpO1xuICAgIGNvbnN0IHByb2plY3RDb25maWdQYXRoVHMgPSBwYXRoUmVzb2x2ZShjd2QsICdlc2xpbnQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgaGFzUHJvamVjdENvbmZpZyA9IGV4aXN0c1N5bmMocHJvamVjdENvbmZpZ1BhdGgpIHx8IGV4aXN0c1N5bmMocHJvamVjdENvbmZpZ1BhdGhUcyk7XG4gICAgY29uc3QgaGFzTGV4Q29uZmlnRXNsaW50ID0gTGV4Q29uZmlnLmNvbmZpZy5lc2xpbnQgJiYgT2JqZWN0LmtleXMoTGV4Q29uZmlnLmNvbmZpZy5lc2xpbnQpLmxlbmd0aCA+IDA7XG5cbiAgICBjb25zdCBwb3NzaWJsZVBhdGhzID0gW1xuICAgICAgcGF0aFJlc29sdmUoY3VycmVudERpcm5hbWUsICcuLi8uLi8uLi8uLi9lc2xpbnQuY29uZmlnLmpzJyksXG4gICAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJy4uLy4uLy4uLy4uL2VzbGludC5jb25maWcudHMnKSxcbiAgICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuZW52LkxFWF9IT01FIHx8ICcvdXNyL2xvY2FsL2xpYi9ub2RlX21vZHVsZXMvQG5sYWJzL2xleCcsICdlc2xpbnQuY29uZmlnLmpzJyksXG4gICAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmVudi5MRVhfSE9NRSB8fCAnL3Vzci9sb2NhbC9saWIvbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnZXNsaW50LmNvbmZpZy50cycpXG4gICAgXTtcblxuICAgIGxldCBsZXhDb25maWdQYXRoID0gJyc7XG4gICAgZm9yKGNvbnN0IHBhdGggb2YgcG9zc2libGVQYXRocykge1xuICAgICAgaWYoZXhpc3RzU3luYyhwYXRoKSkge1xuICAgICAgICBsZXhDb25maWdQYXRoID0gcGF0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGNvbmZpZ1BhdGggPSAnJztcbiAgICBsZXQgdGVtcENvbmZpZ1BhdGggPSAnJztcblxuICAgIC8vIFByaW9yaXR5OlxuICAgIC8vIDEuIFByb2plY3QgZXNsaW50LmNvbmZpZyBmaWxlc1xuICAgIC8vIDIuIEVTTGludCBjb25maWcgaW4gbGV4LmNvbmZpZy4qIGZpbGVcbiAgICAvLyAzLiBMZXgncyBkZWZhdWx0IGVzbGludC5jb25maWcuanNcbiAgICAvLyA0LiBDcmVhdGUgYSB0ZW1wb3JhcnkgY29uZmlnIGZpbGVcbiAgICBpZihoYXNQcm9qZWN0Q29uZmlnKSB7XG4gICAgICBjb25maWdQYXRoID0gZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aFRzKSA/IHByb2plY3RDb25maWdQYXRoVHMgOiBwcm9qZWN0Q29uZmlnUGF0aDtcbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgVXNpbmcgcHJvamVjdCBFU0xpbnQgY29uZmlnIGZpbGU6ICR7Y29uZmlnUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYoaGFzTGV4Q29uZmlnRXNsaW50KSB7XG4gICAgICAvLyBXaGVuIHVzaW5nIGxleC5jb25maWcuZXNsaW50LCBjcmVhdGUgYSB0ZW1wb3JhcnkgSlMgY29uZmlnIGZpbGUgKG5vdCBKU09OKVxuICAgICAgLy8gdG8gYXZvaWQgRVNNIEpTT04gaW1wb3J0IGlzc3Vlc1xuICAgICAgdGVtcENvbmZpZ1BhdGggPSBwYXRoUmVzb2x2ZShjd2QsICcubGV4LXRlbXAtZXNsaW50LmNqcycpO1xuXG4gICAgICAvLyBDcmVhdGUgYSBDb21tb25KUyBtb2R1bGUgdGhhdCBleHRlbmRzIExleCdzIGVzbGludCBjb25maWdcbiAgICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQgPSBgLy8gVGVtcG9yYXJ5IEVTTGludCBjb25maWcgZ2VuZXJhdGVkIGJ5IExleFxuY29uc3QgbGV4Q29uZmlnID0gcmVxdWlyZSgnQG5sYWJzL2xleC9lc2xpbnQuY29uZmlnLmpzJyk7XG5jb25zdCB1c2VyQ29uZmlnID0gJHtKU09OLnN0cmluZ2lmeShMZXhDb25maWcuY29uZmlnLmVzbGludCwgbnVsbCwgMil9O1xuXG4vLyBNZXJnZSBMZXgncyBjb25maWcgd2l0aCB1c2VyIGNvbmZpZ1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC4uLmxleENvbmZpZ1xufTtgO1xuXG4gICAgICB3cml0ZUZpbGVTeW5jKHRlbXBDb25maWdQYXRoLCBjb25maWdDb250ZW50LCAndXRmOCcpO1xuICAgICAgY29uZmlnUGF0aCA9IHRlbXBDb25maWdQYXRoO1xuXG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coYFVzaW5nIEVTTGludCBjb25maWcgZnJvbSBsZXguY29uZmlnLiogZmlsZSB2aWEgdGVtcCBmaWxlOiAke3RlbXBDb25maWdQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZihsZXhDb25maWdQYXRoICYmIGV4aXN0c1N5bmMobGV4Q29uZmlnUGF0aCkpIHtcbiAgICAgIGNvbmZpZ1BhdGggPSBsZXhDb25maWdQYXRoO1xuICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgbG9nKGBVc2luZyBMZXggRVNMaW50IGNvbmZpZyBmaWxlOiAke2NvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBkZWZhdWx0IGNvbmZpZyBmaWxlIGlmIG5vIG90aGVyIGNvbmZpZyBpcyBmb3VuZFxuICAgICAgdGVtcENvbmZpZ1BhdGggPSBwYXRoUmVzb2x2ZShjd2QsICcubGV4LXRlbXAtZGVmYXVsdC1lc2xpbnQuY2pzJyk7XG5cbiAgICAgIC8vIENyZWF0ZSBhIGJhc2ljIEVTTGludCBjb25maWdcbiAgICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQgPSBgLy8gVGVtcG9yYXJ5IGRlZmF1bHQgRVNMaW50IGNvbmZpZyBnZW5lcmF0ZWQgYnkgTGV4XG5jb25zdCBsZXhDb25maWcgPSByZXF1aXJlKCdAbmxhYnMvbGV4L2VzbGludC5jb25maWcuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBsZXhDb25maWc7YDtcblxuICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wQ29uZmlnUGF0aCwgY29uZmlnQ29udGVudCwgJ3V0ZjgnKTtcbiAgICAgIGNvbmZpZ1BhdGggPSB0ZW1wQ29uZmlnUGF0aDtcblxuICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgbG9nKGBDcmVhdGVkIHRlbXBvcmFyeSBkZWZhdWx0IEVTTGludCBjb25maWcgYXQ6ICR7dGVtcENvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coJ05vIEVTTGludCBjb25maWd1cmF0aW9uIGZvdW5kLiBVc2luZyBMZXggZGVmYXVsdCBjb25maWd1cmF0aW9uLicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVzbGludEJpbmFyeSA9IHJlc29sdmVCaW5hcnlQYXRoKCdlc2xpbnQnLCAnZXNsaW50Jyk7XG5cbiAgICBpZighZXNsaW50QmluYXJ5KSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEVTTGludCBiaW5hcnkgbm90IGZvdW5kIGluIExleCdzIG5vZGVfbW9kdWxlc2AsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGxvZygnUGxlYXNlIHJlaW5zdGFsbCBMZXggb3IgY2hlY2sgeW91ciBpbnN0YWxsYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICAvLyBCYXNlIEVTTGludCBhcmd1bWVudHNcbiAgICBjb25zdCBiYXNlRXNsaW50QXJncyA9IFtcbiAgICAgIC4uLihmaXggPyBbJy0tZml4J10gOiBbXSksXG4gICAgICAuLi4oZGVidWcgPyBbJy0tZGVidWcnXSA6IFtdKSxcbiAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgICctLW5vLXdhcm4taWdub3JlZCdcbiAgICBdO1xuXG4gICAgLy8gQWRkIGNvbmZpZyBwYXRoXG4gICAgY29uc3QgY29uZmlnQXJncyA9IGNvbmZpZ1BhdGggPyBbJy0tY29uZmlnJywgY29uZmlnUGF0aF0gOiBbXTtcblxuICAgIGNvbnN0IGpzUmVzdWx0ID0gYXdhaXQgZXhlY2EoZXNsaW50QmluYXJ5LCBbXG4gICAgICAnc3JjLyoqLyoue2pzLGpzeH0nLFxuICAgICAgLi4uY29uZmlnQXJncyxcbiAgICAgIC4uLmJhc2VFc2xpbnRBcmdzXG4gICAgXSwge1xuICAgICAgcmVqZWN0OiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBjd2QsXG4gICAgICBzaGVsbDogdHJ1ZVxuICAgIH0pO1xuXG4gICAgaWYoanNSZXN1bHQuc3Rkb3V0KSB7XG4gICAgICBjb25zb2xlLmxvZyhqc1Jlc3VsdC5zdGRvdXQpO1xuICAgICAgaWYoY2FwdHVyZU91dHB1dCkge1xuICAgICAgICBjYXB0dXJlT3V0cHV0KGpzUmVzdWx0LnN0ZG91dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoanNSZXN1bHQuc3RkZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGpzUmVzdWx0LnN0ZGVycik7XG4gICAgICBpZihjYXB0dXJlT3V0cHV0KSB7XG4gICAgICAgIGNhcHR1cmVPdXRwdXQoanNSZXN1bHQuc3RkZXJyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdHNSZXN1bHQ6IGFueSA9IHtleGl0Q29kZTogMCwgc3Rkb3V0OiAnJywgc3RkZXJyOiAnJ307XG4gICAgaWYodXNlVHlwZXNjcmlwdCkge1xuICAgICAgdHNSZXN1bHQgPSBhd2FpdCBleGVjYShlc2xpbnRCaW5hcnksIFtcbiAgICAgICAgJ3NyYy8qKi8qLnt0cyx0c3h9JyxcbiAgICAgICAgLi4uY29uZmlnQXJncyxcbiAgICAgICAgLi4uYmFzZUVzbGludEFyZ3NcbiAgICAgIF0sIHtcbiAgICAgICAgcmVqZWN0OiBmYWxzZSxcbiAgICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgICAgY3dkLFxuICAgICAgICBzaGVsbDogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmKHRzUmVzdWx0LnN0ZG91dCkge1xuICAgICAgICBjb25zb2xlLmxvZyh0c1Jlc3VsdC5zdGRvdXQpO1xuICAgICAgfVxuXG4gICAgICBpZih0c1Jlc3VsdC5zdGRlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcih0c1Jlc3VsdC5zdGRlcnIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsZWFuIHVwIHRlbXAgZmlsZSBpZiBjcmVhdGVkXG4gICAgaWYodGVtcENvbmZpZ1BhdGggJiYgZXhpc3RzU3luYyh0ZW1wQ29uZmlnUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHVubGlua1N5bmModGVtcENvbmZpZ1BhdGgpO1xuICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgIGxvZyhgUmVtb3ZlZCB0ZW1wb3JhcnkgRVNMaW50IGNvbmZpZyBhdCAke3RlbXBDb25maWdQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIHdoZW4gY2xlYW5pbmcgdXBcbiAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICBsb2coYEZhaWxlZCB0byByZW1vdmUgdGVtcG9yYXJ5IEVTTGludCBjb25maWc6ICR7ZXJyb3IubWVzc2FnZX1gLCAnd2FybicsIHF1aWV0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVzbGludE5vdEZvdW5kID0ganNSZXN1bHQuc3RkZXJyPy5pbmNsdWRlcygnY29tbWFuZCBub3QgZm91bmQnKSB8fCBqc1Jlc3VsdC5zdGRlcnI/LmluY2x1ZGVzKCdlc2xpbnQ6IGNvbW1hbmQgbm90IGZvdW5kJyk7XG4gICAgaWYoZXNsaW50Tm90Rm91bmQpIHtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRVNMaW50IG5vdCBmb3VuZCEnKTtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogTGV4J3MgRVNMaW50IGJpbmFyeSBub3QgZm91bmQuIFBsZWFzZSByZWluc3RhbGwgTGV4IG9yIGNoZWNrIHlvdXIgaW5zdGFsbGF0aW9uLmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGlmKGpzUmVzdWx0LmV4aXRDb2RlID09PSAwICYmIHRzUmVzdWx0LmV4aXRDb2RlID09PSAwKSB7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ0xpbnRpbmcgY29tcGxldGVkIScpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9GaWxlc0ZvdW5kID1cbiAgICAgIChqc1Jlc3VsdC5zdGRlcnI/LmluY2x1ZGVzKCdObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5JykgfHwganNSZXN1bHQuc3Rkb3V0Py5pbmNsdWRlcygnTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeScpKSAmJlxuICAgICAgKCF1c2VUeXBlc2NyaXB0IHx8IHRzUmVzdWx0LnN0ZGVycj8uaW5jbHVkZXMoJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknKSB8fCB0c1Jlc3VsdC5zdGRvdXQ/LmluY2x1ZGVzKCdObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5JykpO1xuXG4gICAgaWYobm9GaWxlc0ZvdW5kKSB7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ05vIGZpbGVzIGZvdW5kIHRvIGxpbnQnKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBzcGlubmVyLmZhaWwoJ0xpbnRpbmcgZmFpbGVkIScpO1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRVNMaW50IGZvdW5kIGlzc3VlcyBpbiB5b3VyIGNvZGUuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIHJldHVybiAxO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHNwaW5uZXIuZmFpbCgnTGludGluZyBmYWlsZWQhJyk7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIHJldHVybiAxO1xuICB9XG59O1xuXG5jb25zdCBhcHBseUFJRml4ID0gYXN5bmMgKFxuICBjd2Q6IHN0cmluZyxcbiAgZXJyb3JzOiBzdHJpbmcsXG4gIHF1aWV0OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgc3Bpbm5lciA9IGNyZWF0ZVNwaW5uZXIocXVpZXQpO1xuICBzcGlubmVyLnN0YXJ0KCdVc2luZyBBSSB0byBmaXggcmVtYWluaW5nIGxpbnQgaXNzdWVzLi4uJyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlRXJyb3JNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gICAgY29uc3QgbGluZXMgPSBlcnJvcnMuc3BsaXQoJ1xcbicpO1xuICAgIGxldCBjdXJyZW50RmlsZSA9ICcnO1xuXG4gICAgZm9yKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGlmKGxpbmUubWF0Y2goL14oXFwvfFtBLVpdOlxcXFwpLio/XFwuKGpzfGpzeHx0c3x0c3gpJC8pKSB7XG4gICAgICAgIGN1cnJlbnRGaWxlID0gbGluZS50cmltKCk7XG4gICAgICAgIGlmKCFmaWxlRXJyb3JNYXAuaGFzKGN1cnJlbnRGaWxlKSkge1xuICAgICAgICAgIGZpbGVFcnJvck1hcC5zZXQoY3VycmVudEZpbGUsIFtdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmKGN1cnJlbnRGaWxlICYmIGxpbmUudHJpbSgpICYmIGxpbmUubWF0Y2goL1xccytcXGQrOlxcZCtcXHMrKGVycm9yfHdhcm5pbmcpXFxzKy8pKSB7XG4gICAgICAgIGNvbnN0IGVycm9yQXJyYXkgPSBmaWxlRXJyb3JNYXAuZ2V0KGN1cnJlbnRGaWxlKTtcbiAgICAgICAgaWYoZXJyb3JBcnJheSkge1xuICAgICAgICAgIGVycm9yQXJyYXkucHVzaChsaW5lLnRyaW0oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihmaWxlRXJyb3JNYXAuc2l6ZSA9PT0gMCkge1xuICAgICAgbG9nKCdVc2luZyBhbHRlcm5hdGl2ZSBlcnJvciBwYXJzaW5nIHN0cmF0ZWd5JywgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAgIGNvbnN0IHNlY3Rpb25zID0gZXJyb3JzLnNwbGl0KCdcXG5cXG4nKTtcblxuICAgICAgZm9yKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICAgICAgaWYoc2VjdGlvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW5lcyA9IHNlY3Rpb24uc3BsaXQoJ1xcbicpO1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGxpbmVzWzBdLnRyaW0oKTtcblxuICAgICAgICBpZihmaWxlUGF0aC5tYXRjaCgvXFwuKGpzfGpzeHx0c3x0c3gpJC8pKSB7XG4gICAgICAgICAgZmlsZUVycm9yTWFwLnNldChmaWxlUGF0aCwgW10pO1xuXG4gICAgICAgICAgZm9yKGxldCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZihsaW5lc1tpXS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgIGZpbGVFcnJvck1hcC5nZXQoZmlsZVBhdGgpPy5wdXNoKGxpbmVzW2ldLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoZmlsZUVycm9yTWFwLnNpemUgPT09IDApIHtcbiAgICAgIGxvZygnVXNpbmcgZGlyZWN0IGZpbGUgcGF0aCBleHRyYWN0aW9uJywgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAgIGNvbnN0IGZpbGVQYXRoUmVnZXggPSAvKD86XFwvfFtBLVpdOlxcXFwpKD86W146XFxuXStcXC8pKlteOlxcbl0rXFwuKGpzfGpzeHx0c3x0c3gpL2c7XG4gICAgICBjb25zdCBmaWxlUGF0aHMgPSBlcnJvcnMubWF0Y2goZmlsZVBhdGhSZWdleCkgfHwgW107XG5cbiAgICAgIGZvcihjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICAgICAgaWYoIWZpbGVFcnJvck1hcC5oYXMoZmlsZVBhdGgpICYmIGV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgZmlsZUVycm9yTWFwLnNldChmaWxlUGF0aCwgW10pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtub3duRmlsZXMgPSBbXG4gICAgICAgIHBhdGhSZXNvbHZlKGN3ZCwgJ3NyYy9jcmVhdGUvY2hhbmdlbG9nLnRzJyksXG4gICAgICAgIHBhdGhSZXNvbHZlKGN3ZCwgJ3NyYy91dGlscy9haVNlcnZpY2UudHMnKSxcbiAgICAgICAgcGF0aFJlc29sdmUoY3dkLCAnc3JjL3V0aWxzL2FwcC50cycpLFxuICAgICAgICBwYXRoUmVzb2x2ZShjd2QsICdzcmMvdXRpbHMvcmVhY3RTaGltLnRzJyksXG4gICAgICAgIHBhdGhSZXNvbHZlKGN3ZCwgJ3NyYy9jb21tYW5kcy9saW50L2F1dG9maXguanMnKVxuICAgICAgXTtcblxuICAgICAgZm9yKGNvbnN0IGZpbGUgb2Yga25vd25GaWxlcykge1xuICAgICAgICBpZihleGlzdHNTeW5jKGZpbGUpICYmICFmaWxlRXJyb3JNYXAuaGFzKGZpbGUpKSB7XG4gICAgICAgICAgZmlsZUVycm9yTWFwLnNldChmaWxlLCBbXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IoY29uc3QgZmlsZVBhdGggb2YgZmlsZUVycm9yTWFwLmtleXMoKSkge1xuICAgICAgaWYoIWV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGxvZyhgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZVBhdGh9YCwgJ3dhcm4nLCBxdWlldCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsb2coYFByb2Nlc3NpbmcgZmlsZTogJHtmaWxlUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgY29uc3QgaXNDdXJzb3JJREUgPSBMZXhDb25maWcuY29uZmlnLmFpPy5wcm92aWRlciA9PT0gJ2N1cnNvcicgfHwgcHJvY2Vzcy5lbnYuQ1VSU09SX0lERSA9PT0gJ3RydWUnO1xuXG4gICAgICBpZihpc0N1cnNvcklERSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHByb21wdCA9IGBGaXggYWxsIEVTTGludCBlcnJvcnMgaW4gdGhpcyBmaWxlLiBGb2N1cyBvbjpcbjEuIEZpeGluZyBuYW1pbmcgY29udmVudGlvbnNcbjIuIEZpeGluZyBzb3J0LWtleXMgaXNzdWVzXG4zLiBSZXBsYWNpbmcgY29uc29sZS5sb2cgd2l0aCBsb2cgdXRpbGl0eVxuNC4gRml4aW5nIG5vLXBsdXNwbHVzIGlzc3Vlc1xuNS4gRml4aW5nIHVubmVjZXNzYXJ5IGVzY2FwZSBjaGFyYWN0ZXJzXG42LiBGaXhpbmcgb3RoZXIgRVNMaW50IGVycm9yc1xuXG5DUklUSUNBTCBSRVFVSVJFTUVOVFM6XG4tIE9OTFkgZml4IHRoZSBzcGVjaWZpYyBsaW5lcyB3aXRoIEVTTGludCBlcnJvcnNcbi0gRE8gTk9UIG1vZGlmeSBhbnkgb3RoZXIgbGluZXMgb2YgY29kZVxuLSBETyBOT1QgcmVtb3ZlIGxpbmUgYnJlYWtzIHVubGVzcyB0aGV5IGFyZSBzcGVjaWZpY2FsbHkgY2F1c2luZyBFU0xpbnQgZXJyb3JzXG4tIERPIE5PVCBjb25kZW5zZSBtdWx0aS1saW5lIHN0cnVjdHVyZXMgdG8gc2luZ2xlIGxpbmVzXG4tIFBSRVNFUlZFIGFsbCBleGlzdGluZyBsaW5lIGJyZWFrcyBhbmQgZm9ybWF0dGluZyB0aGF0IGlzIG5vdCBjYXVzaW5nIGVycm9yc1xuXG5TUEVDSUZJQyBGT1JNQVRUSU5HIFJVTEVTOlxuLSBNYWludGFpbiBwcm9wZXIgaW5kZW50YXRpb24gKDIgc3BhY2VzKVxuLSBLZWVwIGxpbmUgYnJlYWtzIGJldHdlZW4gY2xhc3MvaW50ZXJmYWNlIGRlY2xhcmF0aW9uIGFuZCB0aGVpciBtZW1iZXJzXG4tIEtlZXAgbGluZSBicmVha3MgYmV0d2VlbiBtZXRob2RzXG4tIEVuc3VyZSB0aGVyZSBpcyBhIGxpbmUgYnJlYWsgYWZ0ZXIgb3BlbmluZyBicmFjZXMgZm9yIGNsYXNzZXMsIGludGVyZmFjZXMsIGFuZCBtZXRob2RzXG4tIERPIE5PVCBwbGFjZSBjbGFzcy9pbnRlcmZhY2UgcHJvcGVydGllcyBvciBtZXRob2RzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIG9wZW5pbmcgYnJhY2Vcbi0gUHJlc2VydmUgZW1wdHkgbGluZXMgYmV0d2VlbiBsb2dpY2FsIGNvZGUgYmxvY2tzXG4tIFBSRVNFUlZFIG11bHRpLWxpbmUgaW1wb3J0cyAtIGRvIG5vdCBjb25kZW5zZSB0aGVtIHRvIHNpbmdsZSBsaW5lc1xuLSBQUkVTRVJWRSBtdWx0aS1saW5lIG9iamVjdC9hcnJheSBkZWNsYXJhdGlvbnMgLSBkbyBub3QgY29uZGVuc2UgdGhlbSB0byBzaW5nbGUgbGluZXNcblxuU09SVC1LRVlTIFJVTEUgKEhJR0hFU1QgUFJJT1JJVFkpOlxuLSBBbGwgb2JqZWN0IGxpdGVyYWwga2V5cyBNVVNUIGJlIHNvcnRlZCBhbHBoYWJldGljYWxseSBpbiBhc2NlbmRpbmcgb3JkZXJcbi0gVGhpcyBhcHBsaWVzIHRvIEFMTCBvYmplY3RzIGluIHRoZSBmaWxlLCBub3QganVzdCB0aG9zZSB3aXRoIGV4cGxpY2l0IHNvcnQta2V5cyBlcnJvcnNcbi0gRXhhbXBsZToge2I6IDIsIGE6IDEsIGM6IDN9IHNob3VsZCBiZWNvbWUge2E6IDEsIGI6IDIsIGM6IDN9XG4tIFByZXNlcnZlIHRoZSBvcmlnaW5hbCBmb3JtYXR0aW5nIGFuZCBsaW5lIGJyZWFrcyB3aGVuIHNvcnRpbmdcblxuRXhhbXBsZSBvZiBDT1JSRUNUIGZvcm1hdHRpbmcgKERPIE5PVCBDSEFOR0UpOlxuZXhwb3J0IGNsYXNzIFVzZXJDb25zdGFudHMge1xuICBzdGF0aWMgcmVhZG9ubHkgQUREX0lURU1fRVJST1I6IHN0cmluZyA9ICdVU0VSX0FERF9JVEVNX0VSUk9SJztcbiAgc3RhdGljIHJlYWRvbmx5IE9USEVSX0NPTlNUQU5UOiBzdHJpbmcgPSAnT1RIRVJfQ09OU1RBTlQnO1xufVxuXG5jb25zdHJ1Y3RvcihmbHV4OiBGbHV4RnJhbWV3b3JrLCBDdXN0b21BZGFwdGVyOiB0eXBlb2YgRXZlbnQgPSBFdmVudCkge1xuICB0aGlzLkN1c3RvbUFkYXB0ZXIgPSBDdXN0b21BZGFwdGVyO1xuICB0aGlzLmZsdXggPSBmbHV4O1xufVxuXG5pbXBvcnQge1xuICBhcHAsXG4gIGV2ZW50cyxcbiAgaW1hZ2VzLFxuICBsb2NhdGlvbnMsXG4gIG1lc3NhZ2VzLFxuICBwb3N0cyxcbiAgdGFncyxcbiAgdXNlcnMsXG4gIHdlYnNvY2tldFxufSBmcm9tICcuL3N0b3Jlcyc7XG5cbmNvbnN0IGNvbmZpZyA9IHtcbiAgYXBpS2V5OiAndmFsdWUnLFxuICBiYXNlVXJsOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLFxuICB0aW1lb3V0OiA1MDAwXG59O1xuXG5FeGFtcGxlIG9mIElOQ09SUkVDVCBmb3JtYXR0aW5nIChGSVggVEhJUyk6XG5leHBvcnQgY2xhc3MgVXNlckNvbnN0YW50cyB7c3RhdGljIHJlYWRvbmx5IEFERF9JVEVNX0VSUk9SOiBzdHJpbmcgPSAnVVNFUl9BRERfSVRFTV9FUlJPUic7XG4gIHN0YXRpYyByZWFkb25seSBPVEhFUl9DT05TVEFOVDogc3RyaW5nID0gJ09USEVSX0NPTlNUQU5UJztcbn1cblxuY29uc3RydWN0b3IoZmx1eDogRmx1eEZyYW1ld29yaywgQ3VzdG9tQWRhcHRlcjogdHlwZW9mIEV2ZW50ID0gRXZlbnQpIHt0aGlzLkN1c3RvbUFkYXB0ZXIgPSBDdXN0b21BZGFwdGVyO1xuICB0aGlzLmZsdXggPSBmbHV4O31cblxuaW1wb3J0IHthcHAsIGV2ZW50cywgaW1hZ2VzLCBsb2NhdGlvbnMsIG1lc3NhZ2VzLCBwb3N0cywgdGFncywgdXNlcnMsIHdlYnNvY2tldH0gZnJvbSAnLi9zdG9yZXMnO1xuXG5jb25zdCBjb25maWcgPSB7YmFzZVVybDogJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJywgYXBpS2V5OiAndmFsdWUnLCB0aW1lb3V0OiA1MDAwfTtcblxuRml4IE9OTFkgdGhlIHNwZWNpZmljIEVTTGludCBlcnJvcnMuIFJldHVybiB0aGUgcHJvcGVybHkgZm9ybWF0dGVkIGNvZGUuYDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwcm9tcHRGaWxlID0gcGF0aFJlc29sdmUoY3dkLCAnLmN1cnNvcl9wcm9tcHRfdGVtcC50eHQnKTtcbiAgICAgICAgICAgIHdyaXRlRmlsZVN5bmMocHJvbXB0RmlsZSwgcHJvbXB0LCAndXRmOCcpO1xuXG4gICAgICAgICAgICAvLyBVc2UgQ3Vyc29yIENMSSB0byBmaXggdGhlIGZpbGVcbiAgICAgICAgICAgIGF3YWl0IGV4ZWNhKCdjdXJzb3InLCBbJ2VkaXQnLCAnLS1maWxlJywgZmlsZVBhdGgsICctLXByb21wdC1maWxlJywgcHJvbXB0RmlsZV0sIHtcbiAgICAgICAgICAgICAgcmVqZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgICAgICAgICAgY3dkXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgdW5saW5rU3luYyhwcm9tcHRGaWxlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsb2coYEFwcGxpZWQgQ3Vyc29yIEFJIGZpeGVzIHRvICR7ZmlsZVBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHdhc01vZGlmaWVkID0gYXdhaXQgYXBwbHlEaXJlY3RGaXhlcyhmaWxlUGF0aCwgcXVpZXQpO1xuICAgICAgICAgICAgaWYod2FzTW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgbG9nKGBBcHBsaWVkIGRpcmVjdCBmaXhlcyB0byAke2ZpbGVQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2coYEVycm9yIHVzaW5nIEN1cnNvciBBSTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICBhd2FpdCBhcHBseURpcmVjdEZpeGVzKGZpbGVQYXRoLCBxdWlldCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHdhc01vZGlmaWVkID0gYXdhaXQgYXBwbHlEaXJlY3RGaXhlcyhmaWxlUGF0aCwgcXVpZXQpO1xuICAgICAgICBpZih3YXNNb2RpZmllZCkge1xuICAgICAgICAgIGxvZyhgQXBwbGllZCBkaXJlY3QgZml4ZXMgdG8gJHtmaWxlUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVFcnJvcnMgPSBmaWxlRXJyb3JNYXAuZ2V0KGZpbGVQYXRoKSB8fCBbXTtcbiAgICAgICAgaWYoZmlsZUVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHtjYWxsQUlTZXJ2aWNlfSA9IGF3YWl0IGltcG9ydCgnLi4vLi4vdXRpbHMvYWlTZXJ2aWNlLmpzJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gcmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgICAgICAgICBjb25zdCBwcm9tcHQgPSBgRml4IHRoZSBmb2xsb3dpbmcgRVNMaW50IGVycm9ycyBpbiB0aGlzIGNvZGU6XG4ke2ZpbGVFcnJvcnMuam9pbignXFxuJyl9XG5cbkhlcmUncyB0aGUgY29kZTpcblxcYFxcYFxcYFxuJHtmaWxlQ29udGVudH1cblxcYFxcYFxcYFxuXG5DUklUSUNBTCBSRVFVSVJFTUVOVFM6XG4tIE9OTFkgZml4IHRoZSBzcGVjaWZpYyBsaW5lcyB3aXRoIEVTTGludCBlcnJvcnNcbi0gRE8gTk9UIG1vZGlmeSBhbnkgb3RoZXIgbGluZXMgb2YgY29kZVxuLSBETyBOT1QgcmVtb3ZlIGxpbmUgYnJlYWtzIHVubGVzcyB0aGV5IGFyZSBzcGVjaWZpY2FsbHkgY2F1c2luZyBFU0xpbnQgZXJyb3JzXG4tIERPIE5PVCBjb25kZW5zZSBtdWx0aS1saW5lIHN0cnVjdHVyZXMgdG8gc2luZ2xlIGxpbmVzXG4tIFBSRVNFUlZFIGFsbCBleGlzdGluZyBsaW5lIGJyZWFrcyBhbmQgZm9ybWF0dGluZyB0aGF0IGlzIG5vdCBjYXVzaW5nIGVycm9yc1xuXG5TUEVDSUZJQyBGT1JNQVRUSU5HIFJVTEVTOlxuLSBNYWludGFpbiBwcm9wZXIgaW5kZW50YXRpb24gKDIgc3BhY2VzKVxuLSBLZWVwIGxpbmUgYnJlYWtzIGJldHdlZW4gY2xhc3MvaW50ZXJmYWNlIGRlY2xhcmF0aW9uIGFuZCB0aGVpciBtZW1iZXJzXG4tIEtlZXAgbGluZSBicmVha3MgYmV0d2VlbiBtZXRob2RzXG4tIEVuc3VyZSB0aGVyZSBpcyBhIGxpbmUgYnJlYWsgYWZ0ZXIgb3BlbmluZyBicmFjZXMgZm9yIGNsYXNzZXMsIGludGVyZmFjZXMsIGFuZCBtZXRob2RzXG4tIERPIE5PVCBwbGFjZSBjbGFzcy9pbnRlcmZhY2UgcHJvcGVydGllcyBvciBtZXRob2RzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIG9wZW5pbmcgYnJhY2Vcbi0gUHJlc2VydmUgZW1wdHkgbGluZXMgYmV0d2VlbiBsb2dpY2FsIGNvZGUgYmxvY2tzXG4tIFBSRVNFUlZFIG11bHRpLWxpbmUgaW1wb3J0cyAtIGRvIG5vdCBjb25kZW5zZSB0aGVtIHRvIHNpbmdsZSBsaW5lc1xuLSBQUkVTRVJWRSBtdWx0aS1saW5lIG9iamVjdC9hcnJheSBkZWNsYXJhdGlvbnMgLSBkbyBub3QgY29uZGVuc2UgdGhlbSB0byBzaW5nbGUgbGluZXNcblxuU09SVC1LRVlTIFJVTEUgKEhJR0hFU1QgUFJJT1JJVFkpOlxuLSBBbGwgb2JqZWN0IGxpdGVyYWwga2V5cyBNVVNUIGJlIHNvcnRlZCBhbHBoYWJldGljYWxseSBpbiBhc2NlbmRpbmcgb3JkZXJcbi0gVGhpcyBhcHBsaWVzIHRvIEFMTCBvYmplY3RzIGluIHRoZSBmaWxlLCBub3QganVzdCB0aG9zZSB3aXRoIGV4cGxpY2l0IHNvcnQta2V5cyBlcnJvcnNcbi0gRXhhbXBsZToge2I6IDIsIGE6IDEsIGM6IDN9IHNob3VsZCBiZWNvbWUge2E6IDEsIGI6IDIsIGM6IDN9XG4tIFByZXNlcnZlIHRoZSBvcmlnaW5hbCBmb3JtYXR0aW5nIGFuZCBsaW5lIGJyZWFrcyB3aGVuIHNvcnRpbmdcblxuV0hBVCBUTyBGSVg6XG4xLiBTb3J0aW5nIGFsbCBvYmplY3Qga2V5cyBhbHBoYWJldGljYWxseSAoc29ydC1rZXlzIHJ1bGUpIC0gQUxMIG9iamVjdHMgbXVzdCBoYXZlIHNvcnRlZCBrZXlzXG4yLiBGaXhpbmcgbmFtaW5nIGNvbnZlbnRpb25zIC0gT05MWSBmb3IgdmFyaWFibGVzL2Z1bmN0aW9ucyB3aXRoIG5hbWluZyBlcnJvcnNcbjMuIFJlcGxhY2luZyBjb25zb2xlLmxvZyB3aXRoIGxvZyB1dGlsaXR5IC0gT05MWSBmb3IgY29uc29sZS5sb2cgc3RhdGVtZW50c1xuNC4gRml4aW5nIG5vLXBsdXNwbHVzIGlzc3VlcyAtIE9OTFkgZm9yICsrLy0tIG9wZXJhdG9yc1xuNS4gRml4aW5nIHVubmVjZXNzYXJ5IGVzY2FwZSBjaGFyYWN0ZXJzIC0gT05MWSBmb3IgZXNjYXBlZCBjaGFyYWN0ZXJzIHRoYXQgZG9uJ3QgbmVlZCBlc2NhcGluZ1xuNi4gUHJvcGVyIGluZGVudGF0aW9uIGFuZCBzcGFjaW5nIC0gT05MWSB3aGVyZSBzcGVjaWZpY2FsbHkgcmVxdWlyZWQgYnkgZXJyb3JzXG43LiBTdHJpbmcgcXVvdGVzIGNvbnNpc3RlbmN5ICh1c2Ugc2luZ2xlIHF1b3RlcykgLSBPTkxZIGZvciBzdHJpbmcgbGl0ZXJhbHMgd2l0aCBxdW90ZSBlcnJvcnNcbjguIEltcG9ydCBvcmRlciBhbmQgc3BhY2luZyAtIE9OTFkgZm9yIGltcG9ydHMgd2l0aCBvcmRlci9zcGFjaW5nIGVycm9yc1xuOS4gRnVuY3Rpb24gcGFyYW1ldGVyIGZvcm1hdHRpbmcgLSBPTkxZIGZvciBmdW5jdGlvbnMgd2l0aCBwYXJhbWV0ZXIgZXJyb3JzXG4xMC4gVmFyaWFibGUgbmFtaW5nIGNvbnZlbnRpb25zIC0gT05MWSBmb3IgdmFyaWFibGVzIHdpdGggbmFtaW5nIGVycm9yc1xuMTEuIE5vIHVudXNlZCB2YXJpYWJsZXMgb3IgaW1wb3J0cyAtIE9OTFkgZm9yIHVudXNlZCB2YXJpYWJsZXMvaW1wb3J0c1xuMTIuIEF2b2lkaW5nIG5lc3RlZCB0ZXJuYXJpZXMgLSBPTkxZIGZvciBuZXN0ZWQgdGVybmFyeSBleHByZXNzaW9uc1xuMTMuIEFueSBvdGhlciBFU0xpbnQgZXJyb3JzIC0gT05MWSBmb3IgdGhlIHNwZWNpZmljIGVycm9ycyBsaXN0ZWQgYWJvdmVcblxuV0hBVCBOT1QgVE8gRklYOlxuLSBEbyBub3QgY2hhbmdlIHByb3Blcmx5IGZvcm1hdHRlZCBtdWx0aS1saW5lIHN0cnVjdHVyZXNcbi0gRG8gbm90IHJlbW92ZSBsaW5lIGJyZWFrcyB0aGF0IGFyZSBub3QgY2F1c2luZyBlcnJvcnNcbi0gRG8gbm90IGNoYW5nZSBpbmRlbnRhdGlvbiB0aGF0IGlzIGFscmVhZHkgY29ycmVjdFxuLSBEbyBub3QgbW9kaWZ5IHNwYWNpbmcgdGhhdCBpcyBhbHJlYWR5IGNvcnJlY3Rcbi0gRG8gbm90IGNvbmRlbnNlIHJlYWRhYmxlIG11bHRpLWxpbmUgY29kZSB0byBzaW5nbGUgbGluZXNcbi0gRG8gbm90IG1vZGlmeSBjb2RlIHRoYXQgaXMgbm90IG1lbnRpb25lZCBpbiB0aGUgRVNMaW50IGVycm9yc1xuXG5FeGFtcGxlIG9mIENPUlJFQ1QgZm9ybWF0dGluZyAoRE8gTk9UIENIQU5HRSk6XG5leHBvcnQgY2xhc3MgVXNlckNvbnN0YW50cyB7XG4gIHN0YXRpYyByZWFkb25seSBBRERfSVRFTV9FUlJPUjogc3RyaW5nID0gJ1VTRVJfQUREX0lURU1fRVJST1InO1xuICBzdGF0aWMgcmVhZG9ubHkgT1RIRVJfQ09OU1RBTlQ6IHN0cmluZyA9ICdPVEhFUl9DT05TVEFOVCc7XG59XG5cbmNvbnN0cnVjdG9yKGZsdXg6IEZsdXhGcmFtZXdvcmssIEN1c3RvbUFkYXB0ZXI6IHR5cGVvZiBFdmVudCA9IEV2ZW50KSB7XG4gIHRoaXMuQ3VzdG9tQWRhcHRlciA9IEN1c3RvbUFkYXB0ZXI7XG4gIHRoaXMuZmx1eCA9IGZsdXg7XG59XG5cbmltcG9ydCB7XG4gIGFwcCxcbiAgZXZlbnRzLFxuICBpbWFnZXMsXG4gIGxvY2F0aW9ucyxcbiAgbWVzc2FnZXMsXG4gIHBvc3RzLFxuICB0YWdzLFxuICB1c2VycyxcbiAgd2Vic29ja2V0XG59IGZyb20gJy4vc3RvcmVzJztcblxuY29uc3QgY29uZmlnID0ge1xuICBhcGlLZXk6ICd2YWx1ZScsXG4gIGJhc2VVcmw6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbScsXG4gIHRpbWVvdXQ6IDUwMDBcbn07XG5cbkV4YW1wbGUgb2YgSU5DT1JSRUNUIGZvcm1hdHRpbmcgKEZJWCBUSElTKTpcbmV4cG9ydCBjbGFzcyBVc2VyQ29uc3RhbnRzIHtzdGF0aWMgcmVhZG9ubHkgQUREX0lURU1fRVJST1I6IHN0cmluZyA9ICdVU0VSX0FERF9JVEVNX0VSUk9SJztcbiAgc3RhdGljIHJlYWRvbmx5IE9USEVSX0NPTlNUQU5UOiBzdHJpbmcgPSAnT1RIRVJfQ09OU1RBTlQnO1xufVxuXG5jb25zdHJ1Y3RvcihmbHV4OiBGbHV4RnJhbWV3b3JrLCBDdXN0b21BZGFwdGVyOiB0eXBlb2YgRXZlbnQgPSBFdmVudCkge3RoaXMuQ3VzdG9tQWRhcHRlciA9IEN1c3RvbUFkYXB0ZXI7XG4gIHRoaXMuZmx1eCA9IGZsdXg7fVxuXG5pbXBvcnQge2FwcCwgZXZlbnRzLCBpbWFnZXMsIGxvY2F0aW9ucywgbWVzc2FnZXMsIHBvc3RzLCB0YWdzLCB1c2Vycywgd2Vic29ja2V0fSBmcm9tICcuL3N0b3Jlcyc7XG5cbmNvbnN0IGNvbmZpZyA9IHtiYXNlVXJsOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLCBhcGlLZXk6ICd2YWx1ZScsIHRpbWVvdXQ6IDUwMDB9O1xuXG5GaXggT05MWSB0aGUgc3BlY2lmaWMgRVNMaW50IGVycm9ycyBsaXN0ZWQgYWJvdmUuIFJldmlldyB0aGUgZW50aXJlIGZpbGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCBhbGwgRVNMaW50IHJ1bGVzLlxuUmV0dXJuIG9ubHkgdGhlIHByb3Blcmx5IGZvcm1hdHRlZCBmaXhlZCBjb2RlIHdpdGhvdXQgYW55IGV4cGxhbmF0aW9ucy5gO1xuXG4gICAgICAgICAgICBjb25zdCBmaXhlZENvbnRlbnQgPSBhd2FpdCBjYWxsQUlTZXJ2aWNlKHByb21wdCwgcXVpZXQpO1xuXG4gICAgICAgICAgICBpZihmaXhlZENvbnRlbnQgJiYgZml4ZWRDb250ZW50ICE9PSBmaWxlQ29udGVudCkge1xuICAgICAgICAgICAgICB3cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBmaXhlZENvbnRlbnQsICd1dGY4Jyk7XG4gICAgICAgICAgICAgIGxvZyhgQXBwbGllZCBBSSBmaXhlcyB0byAke2ZpbGVQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2coYEVycm9yIGFwcGx5aW5nIEFJIGZpeGVzIHRvICR7ZmlsZVBhdGh9OiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNwaW5uZXIuc3VjY2VlZCgnQUkgZml4ZXMgYXBwbGllZCBzdWNjZXNzZnVsbHkhJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gYXBwbHkgQUkgZml4ZXMnKTtcbiAgICBsb2coYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIGlmKCFxdWlldCkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBhcHBseURpcmVjdEZpeGVzID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcsIHF1aWV0OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGxldCB3YXNNb2RpZmllZCA9IGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZUNvbnRlbnQgPSByZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBmaWxlQ29udGVudDtcblxuICAgIGlmKGZpbGVQYXRoLmluY2x1ZGVzKCdhaVNlcnZpY2UudHMnKSkge1xuICAgICAgbG9nKCdGaXhpbmcgaXNzdWVzIGluIGFpU2VydmljZS50cycsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvblxcL2pzb24nLFxccyonQXV0aG9yaXphdGlvbic6IGBCZWFyZXIvZyxcbiAgICAgICAgJ1xcJ0F1dGhvcml6YXRpb25cXCc6IGBCZWFyZXJcXCcsIFxcJ0NvbnRlbnQtVHlwZVxcJzogXFwnYXBwbGljYXRpb24vanNvblxcJydcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9oZWFkZXJzOiB7KFtefV0qKX0sXFxzKm1ldGhvZDogJ1BPU1QnL2csXG4gICAgICAgICdtZXRob2Q6IFxcJ1BPU1RcXCcsXFxuICAgICAgaGVhZGVyczogeyQxfSdcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC97cm9sZTogJ3N5c3RlbScsIGNvbnRlbnQ6L2csXG4gICAgICAgICd7Y29udGVudDosIHJvbGU6IFxcJ3N5c3RlbVxcJywnXG4gICAgICApO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL3tyb2xlOiAndXNlcicsIGNvbnRlbnQ6L2csXG4gICAgICAgICd7Y29udGVudDosIHJvbGU6IFxcJ3VzZXJcXCcsJ1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL1xcKChbXildKj8pXyhbYS16QS1aMC05XSspKFxccyo6W14pXSopXFwpL2csXG4gICAgICAgICcoJDEkMiQzKSdcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL2NvbnNvbGVcXC5sb2dcXCgvZywgJ2xvZygnKTtcblxuICAgICAgaWYoIW5ld0NvbnRlbnQuaW5jbHVkZXMoJ2ltcG9ydCB7bG9nfScpICYmIG5ld0NvbnRlbnQuaW5jbHVkZXMoJ2xvZygnKSkge1xuICAgICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAgIC9pbXBvcnQgeyhbXn1dKil9IGZyb20gJyguKiknOy8sXG4gICAgICAgICAgJ2ltcG9ydCB7JDF9IGZyb20gXFwnJDJcXCc7XFxuaW1wb3J0IHtsb2d9IGZyb20gXFwnLi9sb2cuanNcXCc7J1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKGZpbGVQYXRoLmluY2x1ZGVzKCdyZWFjdFNoaW0udHMnKSkge1xuICAgICAgbG9nKCdGaXhpbmcgbmFtaW5nLWNvbnZlbnRpb24gaXNzdWVzIGluIHJlYWN0U2hpbS50cycsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAnaW1wb3J0ICogYXMgUmVhY3QgZnJvbScsXG4gICAgICAgICdpbXBvcnQgKiBhcyByZWFjdCBmcm9tJ1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvUmVhY3RcXC4vZywgJ3JlYWN0LicpO1xuICAgIH1cblxuICAgIGlmKGZpbGVQYXRoLmluY2x1ZGVzKCdjaGFuZ2Vsb2cudHMnKSkge1xuICAgICAgbG9nKCdGaXhpbmcgaXNzdWVzIGluIGNoYW5nZWxvZy50cycsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKC8oXFx3KylcXCtcXCsvZywgJyQxICs9IDEnKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXFxcXFxcJC9nLCAnJCcpO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXFxcXFxcLi9nLCAnLicpO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXFxcXFxcKi9nLCAnKicpO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXFxcXDovZywgJzonKTtcbiAgICB9XG5cbiAgICBpZihmaWxlUGF0aC5pbmNsdWRlcygnYXBwLnRzJykpIHtcbiAgICAgIGxvZygnRml4aW5nIGlzc3VlcyBpbiBhcHAudHMnLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvY29uc29sZVxcLmxvZ1xcKC9nLCAnbG9nKCcpO1xuXG4gICAgICBpZighbmV3Q29udGVudC5pbmNsdWRlcygnaW1wb3J0IHtsb2d9JykgJiYgbmV3Q29udGVudC5pbmNsdWRlcygnbG9nKCcpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgICAgL2ltcG9ydCBib3hlbiBmcm9tICdib3hlbic7LyxcbiAgICAgICAgICAnaW1wb3J0IGJveGVuIGZyb20gXFwnYm94ZW5cXCc7XFxuaW1wb3J0IHtsb2d9IGZyb20gXFwnLi9sb2cuanNcXCc7J1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKC9cXFxcXFwvL2csICcvJyk7XG4gICAgfVxuXG4gICAgaWYoZmlsZVBhdGguaW5jbHVkZXMoJ2F1dG9maXguanMnKSkge1xuICAgICAgbG9nKCdGaXhpbmcgaXNzdWVzIGluIGF1dG9maXguanMnLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2ltcG9ydCB7KFtefV0qKX0gZnJvbSAncGF0aCc7W1xcc1xcbl0qaW1wb3J0IHsoW159XSopfSBmcm9tICdwYXRoJzsvLFxuICAgICAgICAnaW1wb3J0IHskMSwgJDJ9IGZyb20gXFwncGF0aFxcJzsnXG4gICAgICApO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvX19maWxlbmFtZS9nLFxuICAgICAgICAnY3VycmVudEZpbGVuYW1lJ1xuICAgICAgKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9fX2Rpcm5hbWUvZyxcbiAgICAgICAgJ2N1cnJlbnREaXJuYW1lJ1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2NvbnN0IHByZWZpeCA9IHR5cGUgPT09ICdlcnJvcicgXFw/ICdcdTI3NEMgJyA6IHR5cGUgPT09ICdzdWNjZXNzJyBcXD8gJ1x1MjcwNSAnIDogJ1x1MjEzOVx1RkUwRiAnOy8sXG4gICAgICAgICdsZXQgcHJlZml4ID0gXFwnXHUyMTM5XHVGRTBGIFxcJztcXG5pZih0eXBlID09PSBcXCdlcnJvclxcJykge1xcbiAgcHJlZml4ID0gXFwnXHUyNzRDIFxcJztcXG59IGVsc2UgaWYodHlwZSA9PT0gXFwnc3VjY2Vzc1xcJykge1xcbiAgcHJlZml4ID0gXFwnXHUyNzA1IFxcJztcXG59J1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2FzeW5jIGZ1bmN0aW9uIHJ1bkVzbGludEZpeFxcKFxcKS9nLFxuICAgICAgICAnY29uc3QgcnVuRXNsaW50Rml4ID0gYXN5bmMgKCknXG4gICAgICApO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2FzeW5jIGZ1bmN0aW9uIGdldEZpbGVzV2l0aEVycm9yc1xcKFxcKS9nLFxuICAgICAgICAnY29uc3QgZ2V0RmlsZXNXaXRoRXJyb3JzID0gYXN5bmMgKCknXG4gICAgICApO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2FzeW5jIGZ1bmN0aW9uIGlzQ3Vyc29yQXZhaWxhYmxlXFwoXFwpL2csXG4gICAgICAgICdjb25zdCBpc0N1cnNvckF2YWlsYWJsZSA9IGFzeW5jICgpJ1xuICAgICAgKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9hc3luYyBmdW5jdGlvbiBmaXhGaWxlV2l0aEN1cnNvckFJXFwoZmlsZVBhdGhcXCkvZyxcbiAgICAgICAgJ2NvbnN0IGZpeEZpbGVXaXRoQ3Vyc29yQUkgPSBhc3luYyAoZmlsZVBhdGgpJ1xuICAgICAgKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9hc3luYyBmdW5jdGlvbiBtYWluXFwoXFwpL2csXG4gICAgICAgICdjb25zdCBtYWluID0gYXN5bmMgKCknXG4gICAgICApO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvaW1wb3J0IHtleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMsIHdyaXRlRmlsZVN5bmN9L2csXG4gICAgICAgICdpbXBvcnQge3dyaXRlRmlsZVN5bmN9J1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2NvbnNvbGVcXC5sb2dcXChgXFwke3ByZWZpeH0gXFwke21lc3NhZ2V9YFxcKTsvZyxcbiAgICAgICAgJ3Byb2Nlc3Muc3Rkb3V0LndyaXRlKGAke3ByZWZpeH0gJHttZXNzYWdlfVxcXFxuYCk7J1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL30gY2F0Y2hcXChlcnJvclxcKSB7W1xcc1xcbl0qXFwvXFwvIElnbm9yZSBjbGVhbnVwIGVycm9ycy9nLFxuICAgICAgICAnfSBjYXRjaChfKSB7XFxuICAgICAgLy8gSWdub3JlIGNsZWFudXAgZXJyb3JzJ1xuICAgICAgKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC99IGNhdGNoXFwoZXJyb3JcXCkge1tcXHNcXG5dKmxvZ1xcKC9nLFxuICAgICAgICAnfSBjYXRjaChlcnIpIHtcXG4gICAgbG9nKCdcbiAgICAgICk7XG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvfSBjYXRjaFxcKGVycm9yXFwpIHtbXFxzXFxuXSpyZXR1cm4gZmFsc2U7L2csXG4gICAgICAgICd9IGNhdGNoKF8pIHtcXG4gICAgcmV0dXJuIGZhbHNlOydcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9mb3JcXChjb25zdCBmaWxlUGF0aCBvZiBmaWxlc1dpdGhFcnJvcnNcXCkge1tcXHNcXG5dKmNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBmaXhGaWxlV2l0aEN1cnNvckFJXFwoZmlsZVBhdGhcXCk7L2csXG4gICAgICAgICdjb25zdCBmaXhSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoZmlsZXNXaXRoRXJyb3JzLm1hcChmaWxlUGF0aCA9PiBmaXhGaWxlV2l0aEN1cnNvckFJKGZpbGVQYXRoKSkpO1xcbmZvcihjb25zdCBzdWNjZXNzIG9mIGZpeFJlc3VsdHMpIHsnXG4gICAgICApO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvZml4ZWRDb3VudFxcK1xcKzsvZyxcbiAgICAgICAgJ2ZpeGVkQ291bnQgKz0gMTsnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmKG5ld0NvbnRlbnQgIT09IGZpbGVDb250ZW50KSB7XG4gICAgICB3cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBuZXdDb250ZW50LCAndXRmOCcpO1xuICAgICAgbG9nKGBGaXhlZCBpc3N1ZXMgaW4gJHtmaWxlUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIHdhc01vZGlmaWVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2FzTW9kaWZpZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nKGBFcnJvciBhcHBseWluZyBkaXJlY3QgZml4ZXMgdG8gJHtmaWxlUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5jb25zdCBsb2FkQUlDb25maWcgPSBhc3luYyAoY3dkOiBzdHJpbmcsIHF1aWV0OiBib29sZWFuLCBkZWJ1ZzogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGNvbmZpZ0Zvcm1hdHMgPSBbJ2pzJywgJ21qcycsICdjanMnLCAndHMnLCAnanNvbiddO1xuICBjb25zdCBjb25maWdCYXNlTmFtZSA9ICdsZXguY29uZmlnJztcbiAgbGV0IGxleENvbmZpZ1BhdGggPSAnJztcblxuICBmb3IoY29uc3QgZm9ybWF0IG9mIGNvbmZpZ0Zvcm1hdHMpIHtcbiAgICBjb25zdCBwb3RlbnRpYWxQYXRoID0gcGF0aFJlc29sdmUoY3dkLCBgLi8ke2NvbmZpZ0Jhc2VOYW1lfS4ke2Zvcm1hdH1gKTtcbiAgICBpZihleGlzdHNTeW5jKHBvdGVudGlhbFBhdGgpKSB7XG4gICAgICBsZXhDb25maWdQYXRoID0gcG90ZW50aWFsUGF0aDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmKGxleENvbmZpZ1BhdGgpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRm9yIE1KUyBmaWxlcywgd2UgbmVlZCB0byB1c2UgZHluYW1pYyBpbXBvcnQgd2l0aCBVUkwgZm9yIGNvbXBhdGliaWxpdHlcbiAgICAgIGNvbnN0IGZvcm1hdCA9IGV4dG5hbWUobGV4Q29uZmlnUGF0aCkuc2xpY2UoMSk7XG4gICAgICBsZXQgaW1wb3J0UGF0aCA9IGxleENvbmZpZ1BhdGg7XG5cbiAgICAgIC8vIFVzZSBVUkwgcHJvdG9jb2wgZm9yIEVTTSBpbXBvcnRzXG4gICAgICBpZihmb3JtYXQgPT09ICdtanMnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChgZmlsZTovLyR7bGV4Q29uZmlnUGF0aH1gKTtcbiAgICAgICAgICBpbXBvcnRQYXRoID0gdXJsLmhyZWY7XG4gICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgIGxvZyhgVXNpbmcgVVJMIGZvcm1hdCBmb3IgTUpTIGltcG9ydDogJHtpbXBvcnRQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAodXJsRXJyb3IpIHtcbiAgICAgICAgICBsb2coYEVycm9yIGNyZWF0aW5nIFVSTCBmb3IgTUpTIGltcG9ydDogJHt1cmxFcnJvci5tZXNzYWdlfWAsICd3YXJuJywgZGVidWcgfHwgIXF1aWV0KTtcbiAgICAgICAgICBpbXBvcnRQYXRoID0gYGZpbGU6Ly8ke2xleENvbmZpZ1BhdGh9YDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coYFRyeWluZyB0byBpbXBvcnQgY29uZmlnIGZyb20gJHtpbXBvcnRQYXRofSAoZm9ybWF0OiAke2Zvcm1hdH0pYCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBsZXhDb25maWc7XG4gICAgICB0cnkge1xuICAgICAgICBsZXhDb25maWcgPSBhd2FpdCBpbXBvcnQoaW1wb3J0UGF0aCk7XG4gICAgICB9IGNhdGNoIChpbXBvcnRFcnJvcikge1xuICAgICAgICBpZihpbXBvcnRFcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdub3QgZGVmaW5lZCBpbiBFUyBtb2R1bGUgc2NvcGUnKSkge1xuICAgICAgICAgIGxvZyhgRVMgTW9kdWxlIHN5bnRheCBlcnJvciBpbiAke2xleENvbmZpZ1BhdGh9LiBNYWtlIHN1cmUgeW91J3JlIHVzaW5nICdleHBvcnQnIGluc3RlYWQgb2YgJ21vZHVsZS5leHBvcnRzJy5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoaW1wb3J0RXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgaW1wb3J0RXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBib3RoIEVTTSAoZGVmYXVsdCBleHBvcnQpIGFuZCBDb21tb25KUyAobW9kdWxlLmV4cG9ydHMpXG4gICAgICBsZXQgY29uZmlnRGF0YSA9IG51bGw7XG4gICAgICBpZihsZXhDb25maWcuZGVmYXVsdCkge1xuICAgICAgICBjb25maWdEYXRhID0gbGV4Q29uZmlnLmRlZmF1bHQ7XG4gICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgbG9nKGBGb3VuZCBkZWZhdWx0IGV4cG9ydCBpbiAke2xleENvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBDb21tb25KUyBvciBvdGhlciBtb2R1bGUgc3lzdGVtc1xuICAgICAgICBjb25maWdEYXRhID0gbGV4Q29uZmlnO1xuICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgIGxvZyhgVXNpbmcgZGlyZWN0IGV4cG9ydCBpbiAke2xleENvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYoY29uZmlnRGF0YSAmJiBjb25maWdEYXRhLmFpKSB7XG4gICAgICAgIGxvZyhgRm91bmQgQUkgY29uZmlndXJhdGlvbiBpbiAke3BhdGhSZXNvbHZlKGN3ZCwgbGV4Q29uZmlnUGF0aCl9LCBhcHBseWluZyBzZXR0aW5ncy4uLmAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICBMZXhDb25maWcuY29uZmlnLmFpID0gey4uLkxleENvbmZpZy5jb25maWcuYWksIC4uLmNvbmZpZ0RhdGEuYWl9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2coYEVycm9yIGxvYWRpbmcgQUkgY29uZmlndXJhdGlvbiBmcm9tICR7bGV4Q29uZmlnUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnd2FybicsIHF1aWV0KTtcbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMb2FkIEVTTGludCBjb25maWd1cmF0aW9uIGZyb20gbGV4LmNvbmZpZy4qIGZpbGVzXG4gKi9cbmNvbnN0IGxvYWRFU0xpbnRDb25maWcgPSBhc3luYyAoY3dkOiBzdHJpbmcsIHF1aWV0OiBib29sZWFuLCBkZWJ1ZzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAvLyBDaGVjayBpZiBMZXhDb25maWcgYWxyZWFkeSBoYXMgRVNMaW50IGNvbmZpZ3VyYXRpb24gbG9hZGVkXG4gIGlmKExleENvbmZpZy5jb25maWcuZXNsaW50ICYmIE9iamVjdC5rZXlzKExleENvbmZpZy5jb25maWcuZXNsaW50KS5sZW5ndGggPiAwKSB7XG4gICAgbG9nKCdGb3VuZCBFU0xpbnQgY29uZmlndXJhdGlvbiBpbiBsZXguY29uZmlnLiogZmlsZScsICdpbmZvJywgZGVidWcgfHwgIXF1aWV0KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIFRyeSB0byBsb2FkIGZyb20gbGV4LmNvbmZpZy4qIGZpbGVzIGlmIG5vdCBhbHJlYWR5IGxvYWRlZFxuICBjb25zdCBjb25maWdGb3JtYXRzID0gWydqcycsICdtanMnLCAnY2pzJywgJ3RzJywgJ2pzb24nXTtcbiAgY29uc3QgY29uZmlnQmFzZU5hbWUgPSAnbGV4LmNvbmZpZyc7XG5cbiAgZm9yKGNvbnN0IGZvcm1hdCBvZiBjb25maWdGb3JtYXRzKSB7XG4gICAgY29uc3QgcG90ZW50aWFsUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgYC4vJHtjb25maWdCYXNlTmFtZX0uJHtmb3JtYXR9YCk7XG4gICAgaWYoZXhpc3RzU3luYyhwb3RlbnRpYWxQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRm9yIE1KUyBmaWxlcywgd2UgbmVlZCB0byB1c2UgZHluYW1pYyBpbXBvcnQgd2l0aCBVUkwgZm9yIGNvbXBhdGliaWxpdHlcbiAgICAgICAgY29uc3QgZmlsZUZvcm1hdCA9IGV4dG5hbWUocG90ZW50aWFsUGF0aCkuc2xpY2UoMSk7XG4gICAgICAgIGxldCBpbXBvcnRQYXRoID0gcG90ZW50aWFsUGF0aDtcblxuICAgICAgICAvLyBVc2UgVVJMIHByb3RvY29sIGZvciBFU00gaW1wb3J0c1xuICAgICAgICBpZihmaWxlRm9ybWF0ID09PSAnbWpzJykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGBmaWxlOi8vJHtwb3RlbnRpYWxQYXRofWApO1xuICAgICAgICAgICAgaW1wb3J0UGF0aCA9IHVybC5ocmVmO1xuICAgICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgICAgbG9nKGBVc2luZyBVUkwgZm9ybWF0IGZvciBNSlMgaW1wb3J0OiAke2ltcG9ydFBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAodXJsRXJyb3IpIHtcbiAgICAgICAgICAgIGxvZyhgRXJyb3IgY3JlYXRpbmcgVVJMIGZvciBNSlMgaW1wb3J0OiAke3VybEVycm9yLm1lc3NhZ2V9YCwgJ3dhcm4nLCBkZWJ1ZyB8fCAhcXVpZXQpO1xuICAgICAgICAgICAgaW1wb3J0UGF0aCA9IGBmaWxlOi8vJHtwb3RlbnRpYWxQYXRofWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICBsb2coYFRyeWluZyB0byBpbXBvcnQgY29uZmlnIGZyb20gJHtpbXBvcnRQYXRofSAoZm9ybWF0OiAke2ZpbGVGb3JtYXR9KWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxleENvbmZpZztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsZXhDb25maWcgPSBhd2FpdCBpbXBvcnQoaW1wb3J0UGF0aCk7XG4gICAgICAgIH0gY2F0Y2ggKGltcG9ydEVycm9yKSB7XG4gICAgICAgICAgaWYoaW1wb3J0RXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbm90IGRlZmluZWQgaW4gRVMgbW9kdWxlIHNjb3BlJykpIHtcbiAgICAgICAgICAgIGxvZyhgRVMgTW9kdWxlIHN5bnRheCBlcnJvciBpbiAke3BvdGVudGlhbFBhdGh9LiBNYWtlIHN1cmUgeW91J3JlIHVzaW5nICdleHBvcnQnIGluc3RlYWQgb2YgJ21vZHVsZS5leHBvcnRzJy5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGltcG9ydEVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBpbXBvcnRFcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBib3RoIEVTTSAoZGVmYXVsdCBleHBvcnQpIGFuZCBDb21tb25KUyAobW9kdWxlLmV4cG9ydHMpXG4gICAgICAgIGxldCBjb25maWdEYXRhID0gbnVsbDtcbiAgICAgICAgaWYobGV4Q29uZmlnLmRlZmF1bHQpIHtcbiAgICAgICAgICBjb25maWdEYXRhID0gbGV4Q29uZmlnLmRlZmF1bHQ7XG4gICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgIGxvZyhgRm91bmQgZGVmYXVsdCBleHBvcnQgaW4gJHtwb3RlbnRpYWxQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3IgQ29tbW9uSlMgb3Igb3RoZXIgbW9kdWxlIHN5c3RlbXNcbiAgICAgICAgICBjb25maWdEYXRhID0gbGV4Q29uZmlnO1xuICAgICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgICBsb2coYFVzaW5nIGRpcmVjdCBleHBvcnQgaW4gJHtwb3RlbnRpYWxQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGNvbmZpZ0RhdGEgJiYgY29uZmlnRGF0YS5lc2xpbnQgJiYgT2JqZWN0LmtleXMoY29uZmlnRGF0YS5lc2xpbnQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsb2coYEZvdW5kIEVTTGludCBjb25maWd1cmF0aW9uIGluICR7cGF0aFJlc29sdmUoY3dkLCBwb3RlbnRpYWxQYXRoKX0sIGFwcGx5aW5nIHNldHRpbmdzLi4uYCwgJ2luZm8nLCBkZWJ1ZyB8fCAhcXVpZXQpO1xuICAgICAgICAgIExleENvbmZpZy5jb25maWcuZXNsaW50ID0gey4uLkxleENvbmZpZy5jb25maWcuZXNsaW50LCAuLi5jb25maWdEYXRhLmVzbGludH07XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZyhgRXJyb3IgbG9hZGluZyBFU0xpbnQgY29uZmlndXJhdGlvbiBmcm9tICR7cG90ZW50aWFsUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnd2FybicsIHF1aWV0KTtcbiAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBjb21tZW50cyBmcm9tIGEgZmlsZSBleGNlcHQgZm9yIFRPRE9zIGFuZCBjb3B5cmlnaHQgbm90aWNlc1xuICovXG5jb25zdCByZW1vdmVGaWxlQ29tbWVudHMgPSAoZmlsZVBhdGg6IHN0cmluZywgcXVpZXQ6IGJvb2xlYW4pOiBib29sZWFuID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlQ29udGVudCA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIC8vIFNraXAgZmlsZXMgdGhhdCBhcmUgdG9vIGxhcmdlIHRvIGF2b2lkIHBlcmZvcm1hbmNlIGlzc3Vlc1xuICAgIGlmKGZpbGVDb250ZW50Lmxlbmd0aCA+IDEwMDAwMDApIHsgLy8gMU1CIGxpbWl0XG4gICAgICBsb2coYFNraXBwaW5nIGNvbW1lbnQgcmVtb3ZhbCBmb3IgbGFyZ2UgZmlsZTogJHtmaWxlUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgZmlsZSB0eXBlIGZyb20gZXh0ZW5zaW9uXG4gICAgY29uc3QgZXh0ID0gZXh0bmFtZShmaWxlUGF0aCk7XG4gICAgbGV0IGlzVHlwZVNjcmlwdCA9IGZhbHNlO1xuICAgIGxldCBpc0phdmFTY3JpcHQgPSBmYWxzZTtcblxuICAgIGlmKFsnLnRzJywgJy50c3gnXS5pbmNsdWRlcyhleHQpKSB7XG4gICAgICBpc1R5cGVTY3JpcHQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZihbJy5qcycsICcuanN4J10uaW5jbHVkZXMoZXh0KSkge1xuICAgICAgaXNKYXZhU2NyaXB0ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2tpcCB1bnN1cHBvcnRlZCBmaWxlIHR5cGVzXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVXNlIHJlZ2V4IHRvIG1hdGNoIGRpZmZlcmVudCB0eXBlcyBvZiBjb21tZW50c1xuICAgIC8vIFByZXNlcnZlczpcbiAgICAvLyAxLiBDb3B5cmlnaHQgbm90aWNlcyAoLyogQ29weXJpZ2h0IC4uLiAqLylcbiAgICAvLyAyLiBUT0RPIGNvbW1lbnRzICgvLyBUT0RPOiAuLi4pXG4gICAgLy8gMy4gTGljZW5zZSBoZWFkZXJzICgvKiAuLi4gTGljZW5zZSAuLi4gKi8pXG5cbiAgICAvLyBIYW5kbGUgbXVsdGktbGluZSBjb21tZW50cyBmaXJzdCAtIHByZXNlcnZlIGNvcHlyaWdodC9saWNlbnNlIG5vdGljZXNcbiAgICBsZXQgbmV3Q29udGVudCA9IGZpbGVDb250ZW50LnJlcGxhY2UoXG4gICAgICAvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLFxuICAgICAgKG1hdGNoKSA9PiB7XG4gICAgICAgIGlmKG1hdGNoLmluY2x1ZGVzKCdDb3B5cmlnaHQnKSB8fFxuICAgICAgICAgIG1hdGNoLmluY2x1ZGVzKCdMSUNFTlNFJykgfHxcbiAgICAgICAgICBtYXRjaC5pbmNsdWRlcygnTGljZW5zZScpIHx8XG4gICAgICAgICAgbWF0Y2guaW5jbHVkZXMoJ2xpY2Vuc2UnKSkge1xuICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEhhbmRsZSBzaW5nbGUtbGluZSBjb21tZW50cyAtIHByZXNlcnZlIFRPRE9zXG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgIC9cXC9cXC8uKiQvZ20sXG4gICAgICAobWF0Y2gpID0+IHtcbiAgICAgICAgaWYobWF0Y2guaW5jbHVkZXMoJ1RPRE8nKSB8fCBtYXRjaC5pbmNsdWRlcygnRklYTUUnKSkge1xuICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIENsZWFuIHVwIGFueSBtdWx0aXBsZSBibGFuayBsaW5lcyBjcmVhdGVkIGJ5IGNvbW1lbnQgcmVtb3ZhbFxuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL1xcblxccypcXG5cXHMqXFxuL2csICdcXG5cXG4nKTtcblxuICAgIC8vIElmIHRoZSBmaWxlIHdhcyBtb2RpZmllZCwgc2F2ZSBpdFxuICAgIGlmKG5ld0NvbnRlbnQgIT09IGZpbGVDb250ZW50KSB7XG4gICAgICB3cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBuZXdDb250ZW50LCAndXRmOCcpO1xuICAgICAgbG9nKGBSZW1vdmVkIGNvbW1lbnRzIGZyb20gJHtmaWxlUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2coYEVycm9yIHJlbW92aW5nIGNvbW1lbnRzIGZyb20gJHtmaWxlUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgbGludCA9IGFzeW5jIChjbWQ6IExpbnRPcHRpb25zICYgeydyZW1vdmUtY29tbWVudHMnPzogYm9vbGVhbn0sIGNhbGxiYWNrOiBMaW50Q2FsbGJhY2sgPSBwcm9jZXNzLmV4aXQpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCB7XG4gICAgY2xpTmFtZSA9ICdMZXgnLFxuICAgIGZpeCA9IGZhbHNlLFxuICAgIGRlYnVnID0gZmFsc2UsXG4gICAgcXVpZXQgPSBmYWxzZSxcbiAgICBjb25maWcgPSBudWxsLFxuICAgIHJlbW92ZUNvbW1lbnRzID0gZmFsc2UsXG4gICAgLy8gSGFuZGxlIGtlYmFiLWNhc2UgQ0xJIGZsYWcgY29udmVyc2lvblxuICAgICdyZW1vdmUtY29tbWVudHMnOiByZW1vdmVDb21tZW50c0ZsYWcgPSBmYWxzZVxuICB9ID0gY21kO1xuXG4gIC8vIFVzZSBlaXRoZXIgdGhlIGNhbWVsQ2FzZSBvciBrZWJhYi1jYXNlIHZlcnNpb24gb2YgdGhlIGZsYWdcbiAgY29uc3Qgc2hvdWxkUmVtb3ZlQ29tbWVudHMgPSByZW1vdmVDb21tZW50cyB8fCByZW1vdmVDb21tZW50c0ZsYWc7XG5cbiAgbG9nKGAke2NsaU5hbWV9IGxpbnRpbmcuLi5gLCAnaW5mbycsIHF1aWV0KTtcblxuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgYXdhaXQgbG9hZEFJQ29uZmlnKGN3ZCwgcXVpZXQsIGRlYnVnKTtcblxuICBsZXQgdGVtcENvbmZpZ1BhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgdXNlVHlwZXNjcmlwdCA9IGRldGVjdFR5cGVTY3JpcHQoY3dkKTtcbiAgICBsb2coYFR5cGVTY3JpcHQgJHt1c2VUeXBlc2NyaXB0ID8gJ2RldGVjdGVkJyA6ICdub3QgZGV0ZWN0ZWQnfSBmcm9tIHRzY29uZmlnLmpzb25gLCAnaW5mbycsIHF1aWV0KTtcblxuICAgIGlmKHVzZVR5cGVzY3JpcHQpIHtcbiAgICAgIExleENvbmZpZy5jaGVja0xpbnRUeXBlc2NyaXB0Q29uZmlnKCk7XG4gICAgfVxuXG4gICAgZW5zdXJlTW9kdWxlVHlwZShjd2QpO1xuXG4gICAgYXdhaXQgaW5zdGFsbERlcGVuZGVuY2llcyhjd2QsIHVzZVR5cGVzY3JpcHQsIHF1aWV0KTtcblxuICAgIGNvbnN0IHByb2plY3RDb25maWdQYXRoID0gcGF0aFJlc29sdmUoY3dkLCAnZXNsaW50LmNvbmZpZy5qcycpO1xuICAgIGNvbnN0IHByb2plY3RDb25maWdQYXRoVHMgPSBwYXRoUmVzb2x2ZShjd2QsICdlc2xpbnQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgaGFzRXNsaW50Q29uZmlnID0gZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aCkgfHxcbiAgICAgIGV4aXN0c1N5bmMocHJvamVjdENvbmZpZ1BhdGhUcykgfHxcbiAgICAgIGV4aXN0c1N5bmMocGF0aFJlc29sdmUoY3dkLCAnLmVzbGludHJjLmpzJykpIHx8XG4gICAgICBleGlzdHNTeW5jKHBhdGhSZXNvbHZlKGN3ZCwgJy5lc2xpbnRyYy5qc29uJykpIHx8XG4gICAgICBleGlzdHNTeW5jKHBhdGhSZXNvbHZlKGN3ZCwgJy5lc2xpbnRyYy55bWwnKSkgfHxcbiAgICAgIGV4aXN0c1N5bmMocGF0aFJlc29sdmUoY3dkLCAnLmVzbGludHJjLnlhbWwnKSkgfHxcbiAgICAgIGV4aXN0c1N5bmMocGF0aFJlc29sdmUoY3dkLCAnLmVzbGludHJjJykpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIEVTTGludCBjb25maWcgaW4gbGV4LmNvbmZpZy4qXG4gICAgY29uc3QgaGFzTGV4RXNsaW50Q29uZmlnID0gYXdhaXQgbG9hZEVTTGludENvbmZpZyhjd2QsIHF1aWV0LCBkZWJ1Zyk7XG5cbiAgICBpZihoYXNMZXhFc2xpbnRDb25maWcpIHtcbiAgICAgIGxvZygnVXNpbmcgRVNMaW50IGNvbmZpZ3VyYXRpb24gZnJvbSBsZXguY29uZmlnLiogZmlsZScsICdpbmZvJywgcXVpZXQpO1xuICAgIH1cblxuICAgIGlmKGV4aXN0c1N5bmMocGF0aFJlc29sdmUoY3dkLCAnLmVzbGludHJjLmpzb24nKSkpIHtcbiAgICAgIHVubGlua1N5bmMocGF0aFJlc29sdmUoY3dkLCAnLmVzbGludHJjLmpzb24nKSk7XG4gICAgfVxuXG4gICAgbGV0IGxleENvbmZpZ1BhdGggPSAnJztcbiAgICBsZXQgc2hvdWxkQ3JlYXRlVGVtcENvbmZpZyA9IGZhbHNlO1xuXG4gICAgaWYoIWhhc0VzbGludENvbmZpZyAmJiAhaGFzTGV4RXNsaW50Q29uZmlnKSB7XG4gICAgICBjb25zdCBwb3NzaWJsZVBhdGhzID0gW1xuICAgICAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJy4uLy4uLy4uLy4uL2VzbGludC5jb25maWcudHMnKSxcbiAgICAgICAgcGF0aFJlc29sdmUoY3VycmVudERpcm5hbWUsICcuLi8uLi8uLi8uLi9lc2xpbnQuY29uZmlnLmpzJyksXG4gICAgICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuZW52LkxFWF9IT01FIHx8ICcuL25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4JywgJ2VzbGludC5jb25maWcudHMnKSxcbiAgICAgICAgcGF0aFJlc29sdmUocHJvY2Vzcy5lbnYuTEVYX0hPTUUgfHwgJy4vbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnZXNsaW50LmNvbmZpZy5qcycpXG4gICAgICBdO1xuXG4gICAgICBmb3IoY29uc3QgcGF0aCBvZiBwb3NzaWJsZVBhdGhzKSB7XG4gICAgICAgIGlmKGV4aXN0c1N5bmMocGF0aCkpIHtcbiAgICAgICAgICBsZXhDb25maWdQYXRoID0gcGF0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coYEN1cnJlbnQgZGlyZWN0b3J5OiAke2N1cnJlbnREaXJuYW1lfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICBsb2coYFByb2plY3QgY29uZmlnIHBhdGg6ICR7cHJvamVjdENvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIGxvZyhgUHJvamVjdCBjb25maWcgZXhpc3RzOiAke2hhc0VzbGludENvbmZpZ31gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgbG9nKGBGb3VuZCBMZXggY29uZmlnOiAke2xleENvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIGxvZyhgTGV4IGNvbmZpZyBleGlzdHM6ICR7ISFsZXhDb25maWdQYXRoICYmIGV4aXN0c1N5bmMobGV4Q29uZmlnUGF0aCl9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG5cbiAgICAgIGlmKGxleENvbmZpZ1BhdGggJiYgZXhpc3RzU3luYyhsZXhDb25maWdQYXRoKSkge1xuICAgICAgICBsb2coJ05vIEVTTGludCBjb25maWd1cmF0aW9uIGZvdW5kIGluIHByb2plY3QuIFVzaW5nIExleFxcJ3MgZGVmYXVsdCBjb25maWd1cmF0aW9uLicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvdWxkQ3JlYXRlVGVtcENvbmZpZyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoY29uZmlnKSB7XG4gICAgICBjb25zdCB1c2VyQ29uZmlnUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgY29uZmlnKTtcbiAgICAgIGlmKGV4aXN0c1N5bmModXNlckNvbmZpZ1BhdGgpKSB7XG4gICAgICAgIGxvZyhgVXNpbmcgc3BlY2lmaWVkIEVTTGludCBjb25maWd1cmF0aW9uOiAke2NvbmZpZ31gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgc2hvdWxkQ3JlYXRlVGVtcENvbmZpZyA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nKGBTcGVjaWZpZWQgRVNMaW50IGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kOiAke2NvbmZpZ30uIFVzaW5nIExleCdzIGRlZmF1bHQgY29uZmlndXJhdGlvbi5gLCAnd2FybicsIHF1aWV0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihzaG91bGRDcmVhdGVUZW1wQ29uZmlnKSB7XG4gICAgICBsb2coJ05vIEVTTGludCBjb25maWd1cmF0aW9uIGZvdW5kLiBDcmVhdGluZyBhIHRlbXBvcmFyeSBjb25maWd1cmF0aW9uLi4uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICBjb25zdCBjb25maWdSZXN1bHQgPSBjcmVhdGVEZWZhdWx0RVNMaW50Q29uZmlnKHVzZVR5cGVzY3JpcHQsIGN3ZCk7XG4gICAgICB0ZW1wQ29uZmlnUGF0aCA9IGNvbmZpZ1Jlc3VsdC5jb25maWdQYXRoO1xuICAgIH1cblxuICAgIGxldCBlc2xpbnRPdXRwdXQgPSAnJztcbiAgICBjb25zdCBjYXB0dXJlT3V0cHV0ID0gKG91dHB1dDogc3RyaW5nKSA9PiB7XG4gICAgICBlc2xpbnRPdXRwdXQgKz0gYCR7b3V0cHV0fVxcbmA7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bkVzbGludFdpdGhMZXgoY3dkLCBxdWlldCwgY2xpTmFtZSwgdHJ1ZSwgZGVidWcsIHVzZVR5cGVzY3JpcHQsIGNhcHR1cmVPdXRwdXQpO1xuXG4gICAgLy8gUmVtb3ZlIGNvbW1lbnRzIGlmIGVuYWJsZWRcbiAgICBpZihzaG91bGRSZW1vdmVDb21tZW50cykge1xuICAgICAgc3Bpbm5lci5zdGFydCgnUmVtb3ZpbmcgY29tbWVudHMgZnJvbSBmaWxlcy4uLicpO1xuXG4gICAgICAvLyBHZXQgYWxsIC5qcywgLmpzeCwgLnRzLCAudHN4IGZpbGVzIGluIHRoZSBwcm9qZWN0XG4gICAgICBjb25zdCBnbG9iID0gYXdhaXQgaW1wb3J0KCdnbG9iJyk7XG4gICAgICBjb25zdCBmaWxlcyA9IGdsb2Iuc3luYygne3NyYyxsaWJ9LyoqLyoue2pzLGpzeCx0cyx0c3h9Jywge1xuICAgICAgICBjd2QsXG4gICAgICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionLCAnKiovZGlzdC8qKicsICcqKi9idWlsZC8qKiddXG4gICAgICB9KTtcblxuICAgICAgbGV0IHByb2Nlc3NlZENvdW50ID0gMDtcbiAgICAgIGZvcihjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aFJlc29sdmUoY3dkLCBmaWxlKTtcbiAgICAgICAgaWYocmVtb3ZlRmlsZUNvbW1lbnRzKGZpbGVQYXRoLCBxdWlldCkpIHtcbiAgICAgICAgICBwcm9jZXNzZWRDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNwaW5uZXIuc3VjY2VlZChgUmVtb3ZlZCBjb21tZW50cyBmcm9tICR7cHJvY2Vzc2VkQ291bnR9IGZpbGVzYCk7XG4gICAgfVxuXG4gICAgaWYocmVzdWx0ICE9PSAwICYmIGZpeCkge1xuICAgICAgY29uc3QgYWlDb25maWd1cmVkID0gTGV4Q29uZmlnLmNvbmZpZy5haT8ucHJvdmlkZXIgJiYgTGV4Q29uZmlnLmNvbmZpZy5haS5wcm92aWRlciAhPT0gJ25vbmUnO1xuXG4gICAgICBpZihhaUNvbmZpZ3VyZWQpIHtcbiAgICAgICAgbG9nKCdBcHBseWluZyBBSSBmaXhlcyB0byByZW1haW5pbmcgaXNzdWVzLi4uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIGF3YWl0IGFwcGx5QUlGaXgoY3dkLCBlc2xpbnRPdXRwdXQsIHF1aWV0KTtcblxuICAgICAgICBjb25zdCBhZnRlckZpeFJlc3VsdCA9IGF3YWl0IHJ1bkVzbGludFdpdGhMZXgoY3dkLCBxdWlldCwgY2xpTmFtZSwgZmFsc2UsIGRlYnVnLCB1c2VUeXBlc2NyaXB0KTtcblxuICAgICAgICBjYWxsYmFjayhhZnRlckZpeFJlc3VsdCk7XG4gICAgICAgIHJldHVybiBhZnRlckZpeFJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGxvZygnRVNMaW50IGNvdWxkIG5vdCBmaXggYWxsIGlzc3VlcyBhdXRvbWF0aWNhbGx5LicsICd3YXJuJywgcXVpZXQpO1xuICAgICAgbG9nKCdUbyBlbmFibGUgQUktcG93ZXJlZCBmaXhlcywgYWRkIEFJIGNvbmZpZ3VyYXRpb24gdG8geW91ciBsZXguY29uZmlnIGZpbGU6JywgJ2luZm8nLCBxdWlldCk7XG4gICAgICBsb2coYFxuLy8gSW4gbGV4LmNvbmZpZy5qcyAob3IgbGV4LmNvbmZpZy5tanMsIGxleC5jb25maWcuY2pzLCBldGMuKVxuZXhwb3J0IGRlZmF1bHQge1xuICAvLyBZb3VyIGV4aXN0aW5nIGNvbmZpZ1xuICBhaToge1xuICAgIHByb3ZpZGVyOiAnY3Vyc29yJyAvLyBvciAnb3BlbmFpJywgJ2FudGhyb3BpYycsIGV0Yy5cbiAgICAvLyBBZGRpdGlvbmFsIHByb3ZpZGVyLXNwZWNpZmljIHNldHRpbmdzXG4gIH1cbn07YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgfVxuXG4gICAgY2FsbGJhY2socmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBpZihzcGlubmVyKSB7XG4gICAgICBzcGlubmVyLmZhaWwoJ0xpbnRpbmcgZmFpbGVkIScpO1xuICAgIH1cbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDbGVhbiB1cCB0ZW1wb3JhcnkgY29uZmlnIGZpbGVzXG4gICAgY29uc3QgdGVtcEZpbGVQYXRocyA9IFtcbiAgICAgIHRlbXBDb25maWdQYXRoLFxuICAgICAgcGF0aFJlc29sdmUoY3dkLCAnLmxleC10ZW1wLWVzbGludC5janMnKSxcbiAgICAgIHBhdGhSZXNvbHZlKGN3ZCwgJy5sZXgtdGVtcC1kZWZhdWx0LWVzbGludC5janMnKVxuICAgIF07XG5cbiAgICBmb3IoY29uc3QgZmlsZVBhdGggb2YgdGVtcEZpbGVQYXRocykge1xuICAgICAgaWYoZmlsZVBhdGggJiYgZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB1bmxpbmtTeW5jKGZpbGVQYXRoKTtcbiAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgbG9nKGBDbGVhbmVkIHVwIHRlbXBvcmFyeSBFU0xpbnQgY29uZmlnIGF0ICR7ZmlsZVBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07Il0sCiAgIm1hcHBpbmdzIjogIkFBSUEsU0FBUSxhQUFZO0FBQ3BCLFNBQVEsWUFBWSxjQUFjLFlBQVkscUJBQW9CO0FBQ2xFLFNBQVEsU0FBUyxXQUFXLGFBQWEsZUFBYztBQUV2RCxTQUFRLGlCQUFnQjtBQUN4QixTQUFRLHFCQUFvQjtBQUM1QixTQUFRLHlCQUF3QjtBQUNoQyxTQUFRLFdBQVU7QUFFbEIsSUFBSTtBQUNKLElBQUk7QUFFSixJQUFJO0FBQ0Ysb0JBQWtCLEtBQUssK0NBQStDO0FBQ3RFLG1CQUFpQixRQUFRLGVBQWU7QUFDMUMsUUFBUTtBQUNOLG9CQUFrQixRQUFRLElBQUk7QUFDOUIsbUJBQWlCLFFBQVEsSUFBSTtBQUMvQjtBQWdEQSxNQUFNLDRCQUE0QixDQUFDLGVBQXdCLFFBQThCO0FBRXZGLFFBQU0sYUFBYSxZQUFZLEtBQUssOEJBQThCO0FB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
962
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2xpbnQvbGludC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjItUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB1bmxpbmtTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2Rpcm5hbWUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmUsIGV4dG5hbWV9IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lcn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7cmVzb2x2ZUJpbmFyeVBhdGh9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5cbmxldCBjdXJyZW50RmlsZW5hbWU6IHN0cmluZztcbmxldCBjdXJyZW50RGlybmFtZTogc3RyaW5nO1xuXG50cnkge1xuICBjdXJyZW50RmlsZW5hbWUgPSBldmFsKCdyZXF1aXJlKFwidXJsXCIpLmZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKScpO1xuICBjdXJyZW50RGlybmFtZSA9IGRpcm5hbWUoY3VycmVudEZpbGVuYW1lKTtcbn0gY2F0Y2gge1xuICBjdXJyZW50RmlsZW5hbWUgPSBwcm9jZXNzLmN3ZCgpO1xuICBjdXJyZW50RGlybmFtZSA9IHByb2Nlc3MuY3dkKCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGludE9wdGlvbnMge1xuICByZWFkb25seSBjYWNoZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNhY2hlRmlsZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY2FjaGVMb2NhdGlvbj86IHN0cmluZztcbiAgcmVhZG9ubHkgY2xpTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY29sb3I/OiBib29sZWFuO1xuICByZWFkb25seSBjb25maWc/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlYnVnPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZW52Pzogc3RyaW5nO1xuICByZWFkb25seSBlbnZJbmZvPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZXh0Pzogc3RyaW5nO1xuICByZWFkb25seSBmaXg/OiBib29sZWFuO1xuICByZWFkb25seSBmaXhEcnlSdW4/OiBib29sZWFuO1xuICByZWFkb25seSBmaXhUeXBlPzogc3RyaW5nO1xuICByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGdsb2JhbD86IHN0cmluZztcbiAgcmVhZG9ubHkgaWdub3JlUGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgaWdub3JlUGF0dGVybj86IHN0cmluZztcbiAgcmVhZG9ubHkgaW5pdD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG1heFdhcm5pbmdzPzogc3RyaW5nO1xuICByZWFkb25seSBub0NvbG9yPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbm9Fc2xpbnRyYz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG5vSWdub3JlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbm9JbmxpbmVDb25maWc/OiBib29sZWFuO1xuICByZWFkb25seSBvdXRwdXRGaWxlPzogc3RyaW5nO1xuICByZWFkb25seSBwYXJzZXI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhcnNlck9wdGlvbnM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbj86IHN0cmluZztcbiAgcmVhZG9ubHkgcHJpbnRDb25maWc/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVtb3ZlQ29tbWVudHM/OiBib29sZWFuO1xuICByZWFkb25seSByZXBvcnRVbnVzZWREaXNhYmxlRGlyZWN0aXZlcz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlc29sdmVQbHVnaW5zUmVsYXRpdmVUbz86IHN0cmluZztcbiAgcmVhZG9ubHkgcnVsZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcnVsZXNkaXI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0ZGluPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3RkaW5GaWxlbmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTGludENhbGxiYWNrID0gdHlwZW9mIHByb2Nlc3MuZXhpdDtcblxuaW50ZXJmYWNlIENvbmZpZ1Jlc3VsdCB7XG4gIGNvbmZpZ1BhdGg6IHN0cmluZztcbiAgb3JpZ2luYWxDb25maWc6IHN0cmluZyB8IG51bGw7XG59XG5cbmNvbnN0IGNyZWF0ZURlZmF1bHRFU0xpbnRDb25maWcgPSAodXNlVHlwZXNjcmlwdDogYm9vbGVhbiwgY3dkOiBzdHJpbmcpOiBDb25maWdSZXN1bHQgPT4ge1xuICAvLyBVc2UgYSB0ZW1wb3JhcnkgZmlsZSBwYXRoIGluc3RlYWQgb2YgY3JlYXRpbmcgaW4gdGhlIHByb2plY3QgZGlyZWN0b3J5XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoUmVzb2x2ZShjd2QsICcubGV4LXRlbXAtZGVmYXVsdC1lc2xpbnQuY2pzJyk7XG4gIGNvbnN0IG9yaWdpbmFsQ29uZmlnID0gbnVsbDtcblxuICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgQ29tbW9uSlMgbW9kdWxlIHRoYXQgcmVxdWlyZXMgTGV4J3MgRVNMaW50IGNvbmZpZ1xuICBjb25zdCBjb25maWdDb250ZW50ID0gYC8vIFRlbXBvcmFyeSBFU0xpbnQgY29uZmlnIGdlbmVyYXRlZCBieSBMZXhcbmNvbnN0IGxleENvbmZpZyA9IHJlcXVpcmUoJ0BubGFicy9sZXgvZXNsaW50LmNvbmZpZy5tanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBsZXhDb25maWc7YDtcblxuICB3cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIGNvbmZpZ0NvbnRlbnQsICd1dGY4Jyk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb25maWdQYXRoLFxuICAgIG9yaWdpbmFsQ29uZmlnXG4gIH07XG59O1xuXG5jb25zdCBkZXRlY3RUeXBlU2NyaXB0ID0gKGN3ZDogc3RyaW5nKTogYm9vbGVhbiA9PiBleGlzdHNTeW5jKHBhdGhSZXNvbHZlKGN3ZCwgJ3RzY29uZmlnLmpzb24nKSk7XG5cbi8qKlxuICogRW5zdXJlIHBhY2thZ2UuanNvbiBoYXMgdHlwZTogbW9kdWxlIGZvciBFU00gc3VwcG9ydFxuICovXG5jb25zdCBlbnN1cmVNb2R1bGVUeXBlID0gKGN3ZDogc3RyaW5nKTogdm9pZCA9PiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgJ3BhY2thZ2UuanNvbicpO1xuXG4gIGlmKGV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbkNvbnRlbnQgPSByZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uQ29udGVudCk7XG5cbiAgICAgIC8vIElmIHR5cGUgaXMgbm90IHNldCB0byBtb2R1bGUsIHdhcm4gaW5zdGVhZCBvZiBhdXRvLW1vZGlmeWluZ1xuICAgICAgaWYocGFja2FnZUpzb24udHlwZSAhPT0gJ21vZHVsZScpIHtcbiAgICAgICAgbG9nKCdXYXJuaW5nOiBwYWNrYWdlLmpzb24gc2hvdWxkIGhhdmUgXCJ0eXBlXCI6IFwibW9kdWxlXCIgZm9yIEVTTSBzdXBwb3J0LiBQbGVhc2UgYWRkIHRoaXMgbWFudWFsbHkuJywgJ3dhcm4nLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAvLyBJZ25vcmUgZXJyb3JzXG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBpbnN0YWxsRGVwZW5kZW5jaWVzID0gYXN5bmMgKGN3ZDogc3RyaW5nLCB1c2VUeXBlc2NyaXB0OiBib29sZWFuLCBxdWlldDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBpZih1c2VUeXBlc2NyaXB0KSB7XG4gICAgbG9nKCdVc2luZyBUeXBlU2NyaXB0IEVTTGludCBmcm9tIExleC4uLicsICdpbmZvJywgcXVpZXQpO1xuICB9IGVsc2Uge1xuICAgIGxvZygnVXNpbmcgRVNMaW50IGZyb20gTGV4Li4uJywgJ2luZm8nLCBxdWlldCk7XG4gIH1cbn07XG5cbmNvbnN0IHJ1bkVzbGludFdpdGhMZXggPSBhc3luYyAoXG4gIGN3ZDogc3RyaW5nLFxuICBxdWlldDogYm9vbGVhbixcbiAgY2xpTmFtZTogc3RyaW5nLFxuICBmaXg6IGJvb2xlYW4sXG4gIGRlYnVnOiBib29sZWFuLFxuICB1c2VUeXBlc2NyaXB0OiBib29sZWFuLFxuICBjYXB0dXJlT3V0cHV0PzogKG91dHB1dDogc3RyaW5nKSA9PiB2b2lkXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcm9qZWN0Q29uZmlnUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgJ2VzbGludC5jb25maWcubWpzJyk7XG4gICAgY29uc3QgcHJvamVjdENvbmZpZ1BhdGhUcyA9IHBhdGhSZXNvbHZlKGN3ZCwgJ2VzbGludC5jb25maWcudHMnKTtcbiAgICBjb25zdCBoYXNQcm9qZWN0Q29uZmlnID0gZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aCkgfHwgZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aFRzKTtcbiAgICBjb25zdCBoYXNMZXhDb25maWdFc2xpbnQgPSBMZXhDb25maWcuY29uZmlnLmVzbGludCAmJiBPYmplY3Qua2V5cyhMZXhDb25maWcuY29uZmlnLmVzbGludCkubGVuZ3RoID4gMDtcblxuICAgIGNvbnN0IHBvc3NpYmxlUGF0aHMgPSBbXG4gICAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJy4uLy4uLy4uLy4uL2VzbGludC5jb25maWcubWpzJyksXG4gICAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJy4uLy4uLy4uLy4uL2VzbGludC5jb25maWcudHMnKSxcbiAgICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuZW52LkxFWF9IT01FIHx8ICcvdXNyL2xvY2FsL2xpYi9ub2RlX21vZHVsZXMvQG5sYWJzL2xleCcsICdlc2xpbnQuY29uZmlnLm1qcycpLFxuICAgICAgcGF0aFJlc29sdmUocHJvY2Vzcy5lbnYuTEVYX0hPTUUgfHwgJy91c3IvbG9jYWwvbGliL25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4JywgJ2VzbGludC5jb25maWcudHMnKVxuICAgIF07XG5cbiAgICBsZXQgbGV4Q29uZmlnUGF0aCA9ICcnO1xuXG4gICAgZm9yKGNvbnN0IHBhdGggb2YgcG9zc2libGVQYXRocykge1xuICAgICAgaWYoZXhpc3RzU3luYyhwYXRoKSkge1xuICAgICAgICBsZXhDb25maWdQYXRoID0gcGF0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGNvbmZpZ1BhdGggPSAnJztcbiAgICBsZXQgdGVtcENvbmZpZ1BhdGggPSAnJztcblxuICAgIC8vIFByaW9yaXR5OlxuICAgIC8vIDEuIFByb2plY3QgZXNsaW50LmNvbmZpZyBmaWxlc1xuICAgIC8vIDIuIEVTTGludCBjb25maWcgaW4gbGV4LmNvbmZpZy4qIGZpbGVcbiAgICAvLyAzLiBMZXgncyBkZWZhdWx0IGVzbGludC5jb25maWcubWpzXG4gICAgLy8gNC4gQ3JlYXRlIGEgdGVtcG9yYXJ5IGNvbmZpZyBmaWxlXG4gICAgaWYoaGFzUHJvamVjdENvbmZpZykge1xuICAgICAgY29uZmlnUGF0aCA9IGV4aXN0c1N5bmMocHJvamVjdENvbmZpZ1BhdGhUcykgPyBwcm9qZWN0Q29uZmlnUGF0aFRzIDogcHJvamVjdENvbmZpZ1BhdGg7XG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coYFVzaW5nIHByb2plY3QgRVNMaW50IGNvbmZpZyBmaWxlOiAke2NvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKGhhc0xleENvbmZpZ0VzbGludCkge1xuICAgICAgLy8gV2hlbiB1c2luZyBsZXguY29uZmlnLmVzbGludCwgY3JlYXRlIGEgdGVtcG9yYXJ5IEpTIGNvbmZpZyBmaWxlIChub3QgSlNPTilcbiAgICAgIC8vIHRvIGF2b2lkIEVTTSBKU09OIGltcG9ydCBpc3N1ZXNcbiAgICAgIHRlbXBDb25maWdQYXRoID0gcGF0aFJlc29sdmUoY3dkLCAnLmxleC10ZW1wLWVzbGludC5janMnKTtcblxuICAgICAgLy8gQ3JlYXRlIGEgQ29tbW9uSlMgbW9kdWxlIHRoYXQgZXh0ZW5kcyBMZXgncyBlc2xpbnQgY29uZmlnXG4gICAgICBjb25zdCBjb25maWdDb250ZW50ID0gYC8vIFRlbXBvcmFyeSBFU0xpbnQgY29uZmlnIGdlbmVyYXRlZCBieSBMZXhcbmNvbnN0IGxleENvbmZpZyA9IHJlcXVpcmUoJ0BubGFicy9sZXgvZXNsaW50LmNvbmZpZy5tanMnKTtcbmNvbnN0IHVzZXJDb25maWcgPSAke0pTT04uc3RyaW5naWZ5KExleENvbmZpZy5jb25maWcuZXNsaW50LCBudWxsLCAyKX07XG5cbi8vIE1lcmdlIExleCdzIGNvbmZpZyB3aXRoIHVzZXIgY29uZmlnXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLi4ubGV4Q29uZmlnXG59O2A7XG5cbiAgICAgIHdyaXRlRmlsZVN5bmModGVtcENvbmZpZ1BhdGgsIGNvbmZpZ0NvbnRlbnQsICd1dGY4Jyk7XG4gICAgICBjb25maWdQYXRoID0gdGVtcENvbmZpZ1BhdGg7XG5cbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgVXNpbmcgRVNMaW50IGNvbmZpZyBmcm9tIGxleC5jb25maWcuKiBmaWxlIHZpYSB0ZW1wIGZpbGU6ICR7dGVtcENvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKGxleENvbmZpZ1BhdGggJiYgZXhpc3RzU3luYyhsZXhDb25maWdQYXRoKSkge1xuICAgICAgY29uZmlnUGF0aCA9IGxleENvbmZpZ1BhdGg7XG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coYFVzaW5nIExleCBFU0xpbnQgY29uZmlnIGZpbGU6ICR7Y29uZmlnUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGRlZmF1bHQgY29uZmlnIGZpbGUgaWYgbm8gb3RoZXIgY29uZmlnIGlzIGZvdW5kXG4gICAgICB0ZW1wQ29uZmlnUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgJy5sZXgtdGVtcC1kZWZhdWx0LWVzbGludC5janMnKTtcblxuICAgICAgLy8gQ3JlYXRlIGEgYmFzaWMgRVNMaW50IGNvbmZpZ1xuICAgICAgY29uc3QgY29uZmlnQ29udGVudCA9IGAvLyBUZW1wb3JhcnkgZGVmYXVsdCBFU0xpbnQgY29uZmlnIGdlbmVyYXRlZCBieSBMZXhcbmNvbnN0IGxleENvbmZpZyA9IHJlcXVpcmUoJ0BubGFicy9sZXgvZXNsaW50LmNvbmZpZy5tanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBsZXhDb25maWc7YDtcblxuICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wQ29uZmlnUGF0aCwgY29uZmlnQ29udGVudCwgJ3V0ZjgnKTtcbiAgICAgIGNvbmZpZ1BhdGggPSB0ZW1wQ29uZmlnUGF0aDtcblxuICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgbG9nKGBDcmVhdGVkIHRlbXBvcmFyeSBkZWZhdWx0IEVTTGludCBjb25maWcgYXQ6ICR7dGVtcENvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coJ05vIEVTTGludCBjb25maWd1cmF0aW9uIGZvdW5kLiBVc2luZyBMZXggZGVmYXVsdCBjb25maWd1cmF0aW9uLicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVzbGludEJpbmFyeSA9IHJlc29sdmVCaW5hcnlQYXRoKCdlc2xpbnQnLCAnZXNsaW50Jyk7XG5cbiAgICBpZighZXNsaW50QmluYXJ5KSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEVTTGludCBiaW5hcnkgbm90IGZvdW5kIGluIExleCdzIG5vZGVfbW9kdWxlc2AsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGxvZygnUGxlYXNlIHJlaW5zdGFsbCBMZXggb3IgY2hlY2sgeW91ciBpbnN0YWxsYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICAvLyBCYXNlIEVTTGludCBhcmd1bWVudHNcbiAgICBjb25zdCBiYXNlRXNsaW50QXJncyA9IFtcbiAgICAgIC4uLihmaXggPyBbJy0tZml4J10gOiBbXSksXG4gICAgICAuLi4oZGVidWcgPyBbJy0tZGVidWcnXSA6IFtdKSxcbiAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgICctLW5vLXdhcm4taWdub3JlZCdcbiAgICBdO1xuXG4gICAgLy8gQWRkIGNvbmZpZyBwYXRoXG4gICAgY29uc3QgY29uZmlnQXJncyA9IGNvbmZpZ1BhdGggPyBbJy0tY29uZmlnJywgY29uZmlnUGF0aF0gOiBbXTtcblxuICAgIGNvbnN0IGpzUmVzdWx0ID0gYXdhaXQgZXhlY2EoZXNsaW50QmluYXJ5LCBbXG4gICAgICAnc3JjLyoqLyoue2pzLGpzeH0nLFxuICAgICAgLi4uY29uZmlnQXJncyxcbiAgICAgIC4uLmJhc2VFc2xpbnRBcmdzXG4gICAgXSwge1xuICAgICAgY3dkLFxuICAgICAgcmVqZWN0OiBmYWxzZSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJ1xuICAgIH0pO1xuXG4gICAgaWYoanNSZXN1bHQuc3Rkb3V0KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5sb2coanNSZXN1bHQuc3Rkb3V0KTtcbiAgICAgIGlmKGNhcHR1cmVPdXRwdXQpIHtcbiAgICAgICAgY2FwdHVyZU91dHB1dChqc1Jlc3VsdC5zdGRvdXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKGpzUmVzdWx0LnN0ZGVycikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoanNSZXN1bHQuc3RkZXJyKTtcbiAgICAgIGlmKGNhcHR1cmVPdXRwdXQpIHtcbiAgICAgICAgY2FwdHVyZU91dHB1dChqc1Jlc3VsdC5zdGRlcnIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB0c1Jlc3VsdDogYW55ID0ge2V4aXRDb2RlOiAwLCBzdGRlcnI6ICcnLCBzdGRvdXQ6ICcnfTtcbiAgICBpZih1c2VUeXBlc2NyaXB0KSB7XG4gICAgICB0c1Jlc3VsdCA9IGF3YWl0IGV4ZWNhKGVzbGludEJpbmFyeSwgW1xuICAgICAgICAnc3JjLyoqLyoue3RzLHRzeH0nLFxuICAgICAgICAuLi5jb25maWdBcmdzLFxuICAgICAgICAuLi5iYXNlRXNsaW50QXJnc1xuICAgICAgXSwge1xuICAgICAgICBjd2QsXG4gICAgICAgIHJlamVjdDogZmFsc2UsXG4gICAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgICBzdGRpbzogJ3BpcGUnXG4gICAgICB9KTtcblxuICAgICAgaWYodHNSZXN1bHQuc3Rkb3V0KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUubG9nKHRzUmVzdWx0LnN0ZG91dCk7XG4gICAgICB9XG5cbiAgICAgIGlmKHRzUmVzdWx0LnN0ZGVycikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKHRzUmVzdWx0LnN0ZGVycik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgdGVtcCBmaWxlIGlmIGNyZWF0ZWRcbiAgICBpZih0ZW1wQ29uZmlnUGF0aCAmJiBleGlzdHNTeW5jKHRlbXBDb25maWdQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdW5saW5rU3luYyh0ZW1wQ29uZmlnUGF0aCk7XG4gICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgbG9nKGBSZW1vdmVkIHRlbXBvcmFyeSBFU0xpbnQgY29uZmlnIGF0ICR7dGVtcENvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElnbm9yZSBlcnJvcnMgd2hlbiBjbGVhbmluZyB1cFxuICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgIGxvZyhgRmFpbGVkIHRvIHJlbW92ZSB0ZW1wb3JhcnkgRVNMaW50IGNvbmZpZzogJHtlcnJvci5tZXNzYWdlfWAsICd3YXJuJywgcXVpZXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZXNsaW50Tm90Rm91bmQgPSBqc1Jlc3VsdC5zdGRlcnI/LmluY2x1ZGVzKCdjb21tYW5kIG5vdCBmb3VuZCcpIHx8IGpzUmVzdWx0LnN0ZGVycj8uaW5jbHVkZXMoJ2VzbGludDogY29tbWFuZCBub3QgZm91bmQnKTtcbiAgICBpZihlc2xpbnROb3RGb3VuZCkge1xuICAgICAgc3Bpbm5lci5mYWlsKCdFU0xpbnQgbm90IGZvdW5kIScpO1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBMZXgncyBFU0xpbnQgYmluYXJ5IG5vdCBmb3VuZC4gUGxlYXNlIHJlaW5zdGFsbCBMZXggb3IgY2hlY2sgeW91ciBpbnN0YWxsYXRpb24uYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgaWYoanNSZXN1bHQuZXhpdENvZGUgPT09IDAgJiYgdHNSZXN1bHQuZXhpdENvZGUgPT09IDApIHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnTGludGluZyBjb21wbGV0ZWQhJyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBub0ZpbGVzRm91bmQgPVxuICAgICAgKGpzUmVzdWx0LnN0ZGVycj8uaW5jbHVkZXMoJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknKSB8fCBqc1Jlc3VsdC5zdGRvdXQ/LmluY2x1ZGVzKCdObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5JykpICYmXG4gICAgICAoIXVzZVR5cGVzY3JpcHQgfHwgdHNSZXN1bHQuc3RkZXJyPy5pbmNsdWRlcygnTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeScpIHx8IHRzUmVzdWx0LnN0ZG91dD8uaW5jbHVkZXMoJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknKSk7XG5cbiAgICBpZihub0ZpbGVzRm91bmQpIHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnTm8gZmlsZXMgZm91bmQgdG8gbGludCcpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHNwaW5uZXIuZmFpbCgnTGludGluZyBmYWlsZWQhJyk7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBFU0xpbnQgZm91bmQgaXNzdWVzIGluIHlvdXIgY29kZS5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgcmV0dXJuIDE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgc3Bpbm5lci5mYWlsKCdMaW50aW5nIGZhaWxlZCEnKTtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn07XG5cbmNvbnN0IGFwcGx5QUlGaXggPSBhc3luYyAoXG4gIGN3ZDogc3RyaW5nLFxuICBlcnJvcnM6IHN0cmluZyxcbiAgcXVpZXQ6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG4gIHNwaW5uZXIuc3RhcnQoJ1VzaW5nIEFJIHRvIGZpeCByZW1haW5pbmcgbGludCBpc3N1ZXMuLi4nKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGZpbGVFcnJvck1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgICBjb25zdCBsaW5lcyA9IGVycm9ycy5zcGxpdCgnXFxuJyk7XG4gICAgbGV0IGN1cnJlbnRGaWxlID0gJyc7XG5cbiAgICBmb3IoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgaWYobGluZS5tYXRjaCgvXihcXC98W0EtWl06XFxcXCkuKj9cXC4oanN8anN4fHRzfHRzeCkkLykpIHtcbiAgICAgICAgY3VycmVudEZpbGUgPSBsaW5lLnRyaW0oKTtcbiAgICAgICAgaWYoIWZpbGVFcnJvck1hcC5oYXMoY3VycmVudEZpbGUpKSB7XG4gICAgICAgICAgZmlsZUVycm9yTWFwLnNldChjdXJyZW50RmlsZSwgW10pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYoY3VycmVudEZpbGUgJiYgbGluZS50cmltKCkgJiYgbGluZS5tYXRjaCgvXFxzK1xcZCs6XFxkK1xccysoZXJyb3J8d2FybmluZylcXHMrLykpIHtcbiAgICAgICAgY29uc3QgZXJyb3JBcnJheSA9IGZpbGVFcnJvck1hcC5nZXQoY3VycmVudEZpbGUpO1xuICAgICAgICBpZihlcnJvckFycmF5KSB7XG4gICAgICAgICAgZXJyb3JBcnJheS5wdXNoKGxpbmUudHJpbSgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmKGZpbGVFcnJvck1hcC5zaXplID09PSAwKSB7XG4gICAgICBsb2coJ1VzaW5nIGFsdGVybmF0aXZlIGVycm9yIHBhcnNpbmcgc3RyYXRlZ3knLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgY29uc3Qgc2VjdGlvbnMgPSBlcnJvcnMuc3BsaXQoJ1xcblxcbicpO1xuXG4gICAgICBmb3IoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuICAgICAgICBpZihzZWN0aW9uLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmVzID0gc2VjdGlvbi5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gbGluZXNbMF0udHJpbSgpO1xuXG4gICAgICAgIGlmKGZpbGVQYXRoLm1hdGNoKC9cXC4oanN8anN4fHRzfHRzeCkkLykpIHtcbiAgICAgICAgICBmaWxlRXJyb3JNYXAuc2V0KGZpbGVQYXRoLCBbXSk7XG5cbiAgICAgICAgICBmb3IobGV0IGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmKGxpbmVzW2ldLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgZmlsZUVycm9yTWFwLmdldChmaWxlUGF0aCk/LnB1c2gobGluZXNbaV0udHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihmaWxlRXJyb3JNYXAuc2l6ZSA9PT0gMCkge1xuICAgICAgbG9nKCdVc2luZyBkaXJlY3QgZmlsZSBwYXRoIGV4dHJhY3Rpb24nLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgY29uc3QgZmlsZVBhdGhSZWdleCA9IC8oPzpcXC98W0EtWl06XFxcXCkoPzpbXjpcXG5dK1xcLykqW146XFxuXStcXC4oanN8anN4fHRzfHRzeCkvZztcbiAgICAgIGNvbnN0IGZpbGVQYXRocyA9IGVycm9ycy5tYXRjaChmaWxlUGF0aFJlZ2V4KSB8fCBbXTtcblxuICAgICAgZm9yKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgICAgICBpZighZmlsZUVycm9yTWFwLmhhcyhmaWxlUGF0aCkgJiYgZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICBmaWxlRXJyb3JNYXAuc2V0KGZpbGVQYXRoLCBbXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qga25vd25GaWxlcyA9IFtcbiAgICAgICAgcGF0aFJlc29sdmUoY3dkLCAnc3JjL2NyZWF0ZS9jaGFuZ2Vsb2cudHMnKSxcbiAgICAgICAgcGF0aFJlc29sdmUoY3dkLCAnc3JjL3V0aWxzL2FpU2VydmljZS50cycpLFxuICAgICAgICBwYXRoUmVzb2x2ZShjd2QsICdzcmMvdXRpbHMvYXBwLnRzJyksXG4gICAgICAgIHBhdGhSZXNvbHZlKGN3ZCwgJ3NyYy91dGlscy9yZWFjdFNoaW0udHMnKSxcbiAgICAgICAgcGF0aFJlc29sdmUoY3dkLCAnc3JjL2NvbW1hbmRzL2xpbnQvYXV0b2ZpeC5qcycpXG4gICAgICBdO1xuXG4gICAgICBmb3IoY29uc3QgZmlsZSBvZiBrbm93bkZpbGVzKSB7XG4gICAgICAgIGlmKGV4aXN0c1N5bmMoZmlsZSkgJiYgIWZpbGVFcnJvck1hcC5oYXMoZmlsZSkpIHtcbiAgICAgICAgICBmaWxlRXJyb3JNYXAuc2V0KGZpbGUsIFtdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvcihjb25zdCBmaWxlUGF0aCBvZiBmaWxlRXJyb3JNYXAua2V5cygpKSB7XG4gICAgICBpZighZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgbG9nKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlUGF0aH1gLCAnd2FybicsIHF1aWV0KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxvZyhgUHJvY2Vzc2luZyBmaWxlOiAke2ZpbGVQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgICBjb25zdCBpc0N1cnNvcklERSA9IExleENvbmZpZy5jb25maWcuYWk/LnByb3ZpZGVyID09PSAnY3Vyc29yJyB8fCBwcm9jZXNzLmVudi5DVVJTT1JfSURFID09PSAndHJ1ZSc7XG5cbiAgICAgIGlmKGlzQ3Vyc29ySURFKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcHJvbXB0ID0gYEZpeCBhbGwgRVNMaW50IGVycm9ycyBpbiB0aGlzIGZpbGUuIEZvY3VzIG9uOlxuMS4gRml4aW5nIG5hbWluZyBjb252ZW50aW9uc1xuMi4gRml4aW5nIHNvcnQta2V5cyBpc3N1ZXNcbjMuIFJlcGxhY2luZyBjb25zb2xlLmxvZyB3aXRoIGxvZyB1dGlsaXR5XG40LiBGaXhpbmcgbm8tcGx1c3BsdXMgaXNzdWVzXG41LiBGaXhpbmcgdW5uZWNlc3NhcnkgZXNjYXBlIGNoYXJhY3RlcnNcbjYuIEZpeGluZyBvdGhlciBFU0xpbnQgZXJyb3JzXG5cbkNSSVRJQ0FMIFJFUVVJUkVNRU5UUzpcbi0gT05MWSBmaXggdGhlIHNwZWNpZmljIGxpbmVzIHdpdGggRVNMaW50IGVycm9yc1xuLSBETyBOT1QgbW9kaWZ5IGFueSBvdGhlciBsaW5lcyBvZiBjb2RlXG4tIERPIE5PVCByZW1vdmUgbGluZSBicmVha3MgdW5sZXNzIHRoZXkgYXJlIHNwZWNpZmljYWxseSBjYXVzaW5nIEVTTGludCBlcnJvcnNcbi0gRE8gTk9UIGNvbmRlbnNlIG11bHRpLWxpbmUgc3RydWN0dXJlcyB0byBzaW5nbGUgbGluZXNcbi0gUFJFU0VSVkUgYWxsIGV4aXN0aW5nIGxpbmUgYnJlYWtzIGFuZCBmb3JtYXR0aW5nIHRoYXQgaXMgbm90IGNhdXNpbmcgZXJyb3JzXG5cblNQRUNJRklDIEZPUk1BVFRJTkcgUlVMRVM6XG4tIE1haW50YWluIHByb3BlciBpbmRlbnRhdGlvbiAoMiBzcGFjZXMpXG4tIEtlZXAgbGluZSBicmVha3MgYmV0d2VlbiBjbGFzcy9pbnRlcmZhY2UgZGVjbGFyYXRpb24gYW5kIHRoZWlyIG1lbWJlcnNcbi0gS2VlcCBsaW5lIGJyZWFrcyBiZXR3ZWVuIG1ldGhvZHNcbi0gRW5zdXJlIHRoZXJlIGlzIGEgbGluZSBicmVhayBhZnRlciBvcGVuaW5nIGJyYWNlcyBmb3IgY2xhc3NlcywgaW50ZXJmYWNlcywgYW5kIG1ldGhvZHNcbi0gRE8gTk9UIHBsYWNlIGNsYXNzL2ludGVyZmFjZSBwcm9wZXJ0aWVzIG9yIG1ldGhvZHMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgb3BlbmluZyBicmFjZVxuLSBQcmVzZXJ2ZSBlbXB0eSBsaW5lcyBiZXR3ZWVuIGxvZ2ljYWwgY29kZSBibG9ja3Ncbi0gUFJFU0VSVkUgbXVsdGktbGluZSBpbXBvcnRzIC0gZG8gbm90IGNvbmRlbnNlIHRoZW0gdG8gc2luZ2xlIGxpbmVzXG4tIFBSRVNFUlZFIG11bHRpLWxpbmUgb2JqZWN0L2FycmF5IGRlY2xhcmF0aW9ucyAtIGRvIG5vdCBjb25kZW5zZSB0aGVtIHRvIHNpbmdsZSBsaW5lc1xuXG5TT1JULUtFWVMgUlVMRSAoSElHSEVTVCBQUklPUklUWSk6XG4tIEFsbCBvYmplY3QgbGl0ZXJhbCBrZXlzIE1VU1QgYmUgc29ydGVkIGFscGhhYmV0aWNhbGx5IGluIGFzY2VuZGluZyBvcmRlclxuLSBUaGlzIGFwcGxpZXMgdG8gQUxMIG9iamVjdHMgaW4gdGhlIGZpbGUsIG5vdCBqdXN0IHRob3NlIHdpdGggZXhwbGljaXQgc29ydC1rZXlzIGVycm9yc1xuLSBFeGFtcGxlOiB7YjogMiwgYTogMSwgYzogM30gc2hvdWxkIGJlY29tZSB7YTogMSwgYjogMiwgYzogM31cbi0gUHJlc2VydmUgdGhlIG9yaWdpbmFsIGZvcm1hdHRpbmcgYW5kIGxpbmUgYnJlYWtzIHdoZW4gc29ydGluZ1xuXG5FeGFtcGxlIG9mIENPUlJFQ1QgZm9ybWF0dGluZyAoRE8gTk9UIENIQU5HRSk6XG5leHBvcnQgY2xhc3MgVXNlckNvbnN0YW50cyB7XG4gIHN0YXRpYyByZWFkb25seSBBRERfSVRFTV9FUlJPUjogc3RyaW5nID0gJ1VTRVJfQUREX0lURU1fRVJST1InO1xuICBzdGF0aWMgcmVhZG9ubHkgT1RIRVJfQ09OU1RBTlQ6IHN0cmluZyA9ICdPVEhFUl9DT05TVEFOVCc7XG59XG5cbmNvbnN0cnVjdG9yKGZsdXg6IEZsdXhGcmFtZXdvcmssIEN1c3RvbUFkYXB0ZXI6IHR5cGVvZiBFdmVudCA9IEV2ZW50KSB7XG4gIHRoaXMuQ3VzdG9tQWRhcHRlciA9IEN1c3RvbUFkYXB0ZXI7XG4gIHRoaXMuZmx1eCA9IGZsdXg7XG59XG5cbmltcG9ydCB7XG4gIGFwcCxcbiAgZXZlbnRzLFxuICBpbWFnZXMsXG4gIGxvY2F0aW9ucyxcbiAgbWVzc2FnZXMsXG4gIHBvc3RzLFxuICB0YWdzLFxuICB1c2VycyxcbiAgd2Vic29ja2V0XG59IGZyb20gJy4vc3RvcmVzJztcblxuY29uc3QgY29uZmlnID0ge1xuICBhcGlLZXk6ICd2YWx1ZScsXG4gIGJhc2VVcmw6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbScsXG4gIHRpbWVvdXQ6IDUwMDBcbn07XG5cbkV4YW1wbGUgb2YgSU5DT1JSRUNUIGZvcm1hdHRpbmcgKEZJWCBUSElTKTpcbmV4cG9ydCBjbGFzcyBVc2VyQ29uc3RhbnRzIHtzdGF0aWMgcmVhZG9ubHkgQUREX0lURU1fRVJST1I6IHN0cmluZyA9ICdVU0VSX0FERF9JVEVNX0VSUk9SJztcbiAgc3RhdGljIHJlYWRvbmx5IE9USEVSX0NPTlNUQU5UOiBzdHJpbmcgPSAnT1RIRVJfQ09OU1RBTlQnO1xufVxuXG5jb25zdHJ1Y3RvcihmbHV4OiBGbHV4RnJhbWV3b3JrLCBDdXN0b21BZGFwdGVyOiB0eXBlb2YgRXZlbnQgPSBFdmVudCkge3RoaXMuQ3VzdG9tQWRhcHRlciA9IEN1c3RvbUFkYXB0ZXI7XG4gIHRoaXMuZmx1eCA9IGZsdXg7fVxuXG5pbXBvcnQge2FwcCwgZXZlbnRzLCBpbWFnZXMsIGxvY2F0aW9ucywgbWVzc2FnZXMsIHBvc3RzLCB0YWdzLCB1c2Vycywgd2Vic29ja2V0fSBmcm9tICcuL3N0b3Jlcyc7XG5cbmNvbnN0IGNvbmZpZyA9IHtiYXNlVXJsOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLCBhcGlLZXk6ICd2YWx1ZScsIHRpbWVvdXQ6IDUwMDB9O1xuXG5GaXggT05MWSB0aGUgc3BlY2lmaWMgRVNMaW50IGVycm9ycy4gUmV0dXJuIHRoZSBwcm9wZXJseSBmb3JtYXR0ZWQgY29kZS5gO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHByb21wdEZpbGUgPSBwYXRoUmVzb2x2ZShjd2QsICcuY3Vyc29yX3Byb21wdF90ZW1wLnR4dCcpO1xuICAgICAgICAgICAgd3JpdGVGaWxlU3luYyhwcm9tcHRGaWxlLCBwcm9tcHQsICd1dGY4Jyk7XG5cbiAgICAgICAgICAgIC8vIFVzZSBDdXJzb3IgQ0xJIHRvIGZpeCB0aGUgZmlsZVxuICAgICAgICAgICAgYXdhaXQgZXhlY2EoJ2N1cnNvcicsIFsnZWRpdCcsICctLWZpbGUnLCBmaWxlUGF0aCwgJy0tcHJvbXB0LWZpbGUnLCBwcm9tcHRGaWxlXSwge1xuICAgICAgICAgICAgICBjd2QsXG4gICAgICAgICAgICAgIHJlamVjdDogZmFsc2UsXG4gICAgICAgICAgICAgIHN0ZGlvOiAncGlwZSdcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB1bmxpbmtTeW5jKHByb21wdEZpbGUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxvZyhgQXBwbGllZCBDdXJzb3IgQUkgZml4ZXMgdG8gJHtmaWxlUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGNvbnN0IHdhc01vZGlmaWVkID0gYXdhaXQgYXBwbHlEaXJlY3RGaXhlcyhmaWxlUGF0aCwgcXVpZXQpO1xuICAgICAgICAgICAgaWYod2FzTW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgbG9nKGBBcHBsaWVkIGRpcmVjdCBmaXhlcyB0byAke2ZpbGVQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2coYEVycm9yIHVzaW5nIEN1cnNvciBBSTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICBhd2FpdCBhcHBseURpcmVjdEZpeGVzKGZpbGVQYXRoLCBxdWlldCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHdhc01vZGlmaWVkID0gYXdhaXQgYXBwbHlEaXJlY3RGaXhlcyhmaWxlUGF0aCwgcXVpZXQpO1xuICAgICAgICBpZih3YXNNb2RpZmllZCkge1xuICAgICAgICAgIGxvZyhgQXBwbGllZCBkaXJlY3QgZml4ZXMgdG8gJHtmaWxlUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVFcnJvcnMgPSBmaWxlRXJyb3JNYXAuZ2V0KGZpbGVQYXRoKSB8fCBbXTtcbiAgICAgICAgaWYoZmlsZUVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHtjYWxsQUlTZXJ2aWNlfSA9IGF3YWl0IGltcG9ydCgnLi4vLi4vdXRpbHMvYWlTZXJ2aWNlLmpzJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gcmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgICAgICAgICBjb25zdCBwcm9tcHQgPSBgRml4IHRoZSBmb2xsb3dpbmcgRVNMaW50IGVycm9ycyBpbiB0aGlzIGNvZGU6XG4ke2ZpbGVFcnJvcnMuam9pbignXFxuJyl9XG5cbkhlcmUncyB0aGUgY29kZTpcblxcYFxcYFxcYFxuJHtmaWxlQ29udGVudH1cblxcYFxcYFxcYFxuXG5DUklUSUNBTCBSRVFVSVJFTUVOVFM6XG4tIE9OTFkgZml4IHRoZSBzcGVjaWZpYyBsaW5lcyB3aXRoIEVTTGludCBlcnJvcnNcbi0gRE8gTk9UIG1vZGlmeSBhbnkgb3RoZXIgbGluZXMgb2YgY29kZVxuLSBETyBOT1QgcmVtb3ZlIGxpbmUgYnJlYWtzIHVubGVzcyB0aGV5IGFyZSBzcGVjaWZpY2FsbHkgY2F1c2luZyBFU0xpbnQgZXJyb3JzXG4tIERPIE5PVCBjb25kZW5zZSBtdWx0aS1saW5lIHN0cnVjdHVyZXMgdG8gc2luZ2xlIGxpbmVzXG4tIFBSRVNFUlZFIGFsbCBleGlzdGluZyBsaW5lIGJyZWFrcyBhbmQgZm9ybWF0dGluZyB0aGF0IGlzIG5vdCBjYXVzaW5nIGVycm9yc1xuXG5TUEVDSUZJQyBGT1JNQVRUSU5HIFJVTEVTOlxuLSBNYWludGFpbiBwcm9wZXIgaW5kZW50YXRpb24gKDIgc3BhY2VzKVxuLSBLZWVwIGxpbmUgYnJlYWtzIGJldHdlZW4gY2xhc3MvaW50ZXJmYWNlIGRlY2xhcmF0aW9uIGFuZCB0aGVpciBtZW1iZXJzXG4tIEtlZXAgbGluZSBicmVha3MgYmV0d2VlbiBtZXRob2RzXG4tIEVuc3VyZSB0aGVyZSBpcyBhIGxpbmUgYnJlYWsgYWZ0ZXIgb3BlbmluZyBicmFjZXMgZm9yIGNsYXNzZXMsIGludGVyZmFjZXMsIGFuZCBtZXRob2RzXG4tIERPIE5PVCBwbGFjZSBjbGFzcy9pbnRlcmZhY2UgcHJvcGVydGllcyBvciBtZXRob2RzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIG9wZW5pbmcgYnJhY2Vcbi0gUHJlc2VydmUgZW1wdHkgbGluZXMgYmV0d2VlbiBsb2dpY2FsIGNvZGUgYmxvY2tzXG4tIFBSRVNFUlZFIG11bHRpLWxpbmUgaW1wb3J0cyAtIGRvIG5vdCBjb25kZW5zZSB0aGVtIHRvIHNpbmdsZSBsaW5lc1xuLSBQUkVTRVJWRSBtdWx0aS1saW5lIG9iamVjdC9hcnJheSBkZWNsYXJhdGlvbnMgLSBkbyBub3QgY29uZGVuc2UgdGhlbSB0byBzaW5nbGUgbGluZXNcblxuU09SVC1LRVlTIFJVTEUgKEhJR0hFU1QgUFJJT1JJVFkpOlxuLSBBbGwgb2JqZWN0IGxpdGVyYWwga2V5cyBNVVNUIGJlIHNvcnRlZCBhbHBoYWJldGljYWxseSBpbiBhc2NlbmRpbmcgb3JkZXJcbi0gVGhpcyBhcHBsaWVzIHRvIEFMTCBvYmplY3RzIGluIHRoZSBmaWxlLCBub3QganVzdCB0aG9zZSB3aXRoIGV4cGxpY2l0IHNvcnQta2V5cyBlcnJvcnNcbi0gRXhhbXBsZToge2I6IDIsIGE6IDEsIGM6IDN9IHNob3VsZCBiZWNvbWUge2E6IDEsIGI6IDIsIGM6IDN9XG4tIFByZXNlcnZlIHRoZSBvcmlnaW5hbCBmb3JtYXR0aW5nIGFuZCBsaW5lIGJyZWFrcyB3aGVuIHNvcnRpbmdcblxuV0hBVCBUTyBGSVg6XG4xLiBTb3J0aW5nIGFsbCBvYmplY3Qga2V5cyBhbHBoYWJldGljYWxseSAoc29ydC1rZXlzIHJ1bGUpIC0gQUxMIG9iamVjdHMgbXVzdCBoYXZlIHNvcnRlZCBrZXlzXG4yLiBGaXhpbmcgbmFtaW5nIGNvbnZlbnRpb25zIC0gT05MWSBmb3IgdmFyaWFibGVzL2Z1bmN0aW9ucyB3aXRoIG5hbWluZyBlcnJvcnNcbjMuIFJlcGxhY2luZyBjb25zb2xlLmxvZyB3aXRoIGxvZyB1dGlsaXR5IC0gT05MWSBmb3IgY29uc29sZS5sb2cgc3RhdGVtZW50c1xuNC4gRml4aW5nIG5vLXBsdXNwbHVzIGlzc3VlcyAtIE9OTFkgZm9yICsrLy0tIG9wZXJhdG9yc1xuNS4gRml4aW5nIHVubmVjZXNzYXJ5IGVzY2FwZSBjaGFyYWN0ZXJzIC0gT05MWSBmb3IgZXNjYXBlZCBjaGFyYWN0ZXJzIHRoYXQgZG9uJ3QgbmVlZCBlc2NhcGluZ1xuNi4gUHJvcGVyIGluZGVudGF0aW9uIGFuZCBzcGFjaW5nIC0gT05MWSB3aGVyZSBzcGVjaWZpY2FsbHkgcmVxdWlyZWQgYnkgZXJyb3JzXG43LiBTdHJpbmcgcXVvdGVzIGNvbnNpc3RlbmN5ICh1c2Ugc2luZ2xlIHF1b3RlcykgLSBPTkxZIGZvciBzdHJpbmcgbGl0ZXJhbHMgd2l0aCBxdW90ZSBlcnJvcnNcbjguIEltcG9ydCBvcmRlciBhbmQgc3BhY2luZyAtIE9OTFkgZm9yIGltcG9ydHMgd2l0aCBvcmRlci9zcGFjaW5nIGVycm9yc1xuOS4gRnVuY3Rpb24gcGFyYW1ldGVyIGZvcm1hdHRpbmcgLSBPTkxZIGZvciBmdW5jdGlvbnMgd2l0aCBwYXJhbWV0ZXIgZXJyb3JzXG4xMC4gVmFyaWFibGUgbmFtaW5nIGNvbnZlbnRpb25zIC0gT05MWSBmb3IgdmFyaWFibGVzIHdpdGggbmFtaW5nIGVycm9yc1xuMTEuIE5vIHVudXNlZCB2YXJpYWJsZXMgb3IgaW1wb3J0cyAtIE9OTFkgZm9yIHVudXNlZCB2YXJpYWJsZXMvaW1wb3J0c1xuMTIuIEF2b2lkaW5nIG5lc3RlZCB0ZXJuYXJpZXMgLSBPTkxZIGZvciBuZXN0ZWQgdGVybmFyeSBleHByZXNzaW9uc1xuMTMuIEFueSBvdGhlciBFU0xpbnQgZXJyb3JzIC0gT05MWSBmb3IgdGhlIHNwZWNpZmljIGVycm9ycyBsaXN0ZWQgYWJvdmVcblxuV0hBVCBOT1QgVE8gRklYOlxuLSBEbyBub3QgY2hhbmdlIHByb3Blcmx5IGZvcm1hdHRlZCBtdWx0aS1saW5lIHN0cnVjdHVyZXNcbi0gRG8gbm90IHJlbW92ZSBsaW5lIGJyZWFrcyB0aGF0IGFyZSBub3QgY2F1c2luZyBlcnJvcnNcbi0gRG8gbm90IGNoYW5nZSBpbmRlbnRhdGlvbiB0aGF0IGlzIGFscmVhZHkgY29ycmVjdFxuLSBEbyBub3QgbW9kaWZ5IHNwYWNpbmcgdGhhdCBpcyBhbHJlYWR5IGNvcnJlY3Rcbi0gRG8gbm90IGNvbmRlbnNlIHJlYWRhYmxlIG11bHRpLWxpbmUgY29kZSB0byBzaW5nbGUgbGluZXNcbi0gRG8gbm90IG1vZGlmeSBjb2RlIHRoYXQgaXMgbm90IG1lbnRpb25lZCBpbiB0aGUgRVNMaW50IGVycm9yc1xuXG5FeGFtcGxlIG9mIENPUlJFQ1QgZm9ybWF0dGluZyAoRE8gTk9UIENIQU5HRSk6XG5leHBvcnQgY2xhc3MgVXNlckNvbnN0YW50cyB7XG4gIHN0YXRpYyByZWFkb25seSBBRERfSVRFTV9FUlJPUjogc3RyaW5nID0gJ1VTRVJfQUREX0lURU1fRVJST1InO1xuICBzdGF0aWMgcmVhZG9ubHkgT1RIRVJfQ09OU1RBTlQ6IHN0cmluZyA9ICdPVEhFUl9DT05TVEFOVCc7XG59XG5cbmNvbnN0cnVjdG9yKGZsdXg6IEZsdXhGcmFtZXdvcmssIEN1c3RvbUFkYXB0ZXI6IHR5cGVvZiBFdmVudCA9IEV2ZW50KSB7XG4gIHRoaXMuQ3VzdG9tQWRhcHRlciA9IEN1c3RvbUFkYXB0ZXI7XG4gIHRoaXMuZmx1eCA9IGZsdXg7XG59XG5cbmltcG9ydCB7XG4gIGFwcCxcbiAgZXZlbnRzLFxuICBpbWFnZXMsXG4gIGxvY2F0aW9ucyxcbiAgbWVzc2FnZXMsXG4gIHBvc3RzLFxuICB0YWdzLFxuICB1c2VycyxcbiAgd2Vic29ja2V0XG59IGZyb20gJy4vc3RvcmVzJztcblxuY29uc3QgY29uZmlnID0ge1xuICBhcGlLZXk6ICd2YWx1ZScsXG4gIGJhc2VVcmw6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbScsXG4gIHRpbWVvdXQ6IDUwMDBcbn07XG5cbkV4YW1wbGUgb2YgSU5DT1JSRUNUIGZvcm1hdHRpbmcgKEZJWCBUSElTKTpcbmV4cG9ydCBjbGFzcyBVc2VyQ29uc3RhbnRzIHtzdGF0aWMgcmVhZG9ubHkgQUREX0lURU1fRVJST1I6IHN0cmluZyA9ICdVU0VSX0FERF9JVEVNX0VSUk9SJztcbiAgc3RhdGljIHJlYWRvbmx5IE9USEVSX0NPTlNUQU5UOiBzdHJpbmcgPSAnT1RIRVJfQ09OU1RBTlQnO1xufVxuXG5jb25zdHJ1Y3RvcihmbHV4OiBGbHV4RnJhbWV3b3JrLCBDdXN0b21BZGFwdGVyOiB0eXBlb2YgRXZlbnQgPSBFdmVudCkge3RoaXMuQ3VzdG9tQWRhcHRlciA9IEN1c3RvbUFkYXB0ZXI7XG4gIHRoaXMuZmx1eCA9IGZsdXg7fVxuXG5pbXBvcnQge2FwcCwgZXZlbnRzLCBpbWFnZXMsIGxvY2F0aW9ucywgbWVzc2FnZXMsIHBvc3RzLCB0YWdzLCB1c2Vycywgd2Vic29ja2V0fSBmcm9tICcuL3N0b3Jlcyc7XG5cbmNvbnN0IGNvbmZpZyA9IHtiYXNlVXJsOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLCBhcGlLZXk6ICd2YWx1ZScsIHRpbWVvdXQ6IDUwMDB9O1xuXG5GaXggT05MWSB0aGUgc3BlY2lmaWMgRVNMaW50IGVycm9ycyBsaXN0ZWQgYWJvdmUuIFJldmlldyB0aGUgZW50aXJlIGZpbGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCBhbGwgRVNMaW50IHJ1bGVzLlxuUmV0dXJuIG9ubHkgdGhlIHByb3Blcmx5IGZvcm1hdHRlZCBmaXhlZCBjb2RlIHdpdGhvdXQgYW55IGV4cGxhbmF0aW9ucy5gO1xuXG4gICAgICAgICAgICBjb25zdCBmaXhlZENvbnRlbnQgPSBhd2FpdCBjYWxsQUlTZXJ2aWNlKHByb21wdCwgcXVpZXQpO1xuXG4gICAgICAgICAgICBpZihmaXhlZENvbnRlbnQgJiYgZml4ZWRDb250ZW50ICE9PSBmaWxlQ29udGVudCkge1xuICAgICAgICAgICAgICB3cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBmaXhlZENvbnRlbnQsICd1dGY4Jyk7XG4gICAgICAgICAgICAgIGxvZyhgQXBwbGllZCBBSSBmaXhlcyB0byAke2ZpbGVQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2coYEVycm9yIGFwcGx5aW5nIEFJIGZpeGVzIHRvICR7ZmlsZVBhdGh9OiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNwaW5uZXIuc3VjY2VlZCgnQUkgZml4ZXMgYXBwbGllZCBzdWNjZXNzZnVsbHkhJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gYXBwbHkgQUkgZml4ZXMnKTtcbiAgICBsb2coYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIGlmKCFxdWlldCkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBhcHBseURpcmVjdEZpeGVzID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcsIHF1aWV0OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGxldCB3YXNNb2RpZmllZCA9IGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZUNvbnRlbnQgPSByZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBmaWxlQ29udGVudDtcblxuICAgIGlmKGZpbGVQYXRoLmluY2x1ZGVzKCdhaVNlcnZpY2UudHMnKSkge1xuICAgICAgbG9nKCdGaXhpbmcgaXNzdWVzIGluIGFpU2VydmljZS50cycsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvblxcL2pzb24nLFxccyonQXV0aG9yaXphdGlvbic6IGBCZWFyZXIvZyxcbiAgICAgICAgJ1xcJ0F1dGhvcml6YXRpb25cXCc6IGBCZWFyZXJcXCcsIFxcJ0NvbnRlbnQtVHlwZVxcJzogXFwnYXBwbGljYXRpb24vanNvblxcJydcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9oZWFkZXJzOiB7KFtefV0qKX0sXFxzKm1ldGhvZDogJ1BPU1QnL2csXG4gICAgICAgICdtZXRob2Q6IFxcJ1BPU1RcXCcsXFxuICAgICAgaGVhZGVyczogeyQxfSdcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC97cm9sZTogJ3N5c3RlbScsIGNvbnRlbnQ6L2csXG4gICAgICAgICd7Y29udGVudDosIHJvbGU6IFxcJ3N5c3RlbVxcJywnXG4gICAgICApO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL3tyb2xlOiAndXNlcicsIGNvbnRlbnQ6L2csXG4gICAgICAgICd7Y29udGVudDosIHJvbGU6IFxcJ3VzZXJcXCcsJ1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL1xcKChbXildKj8pXyhbYS16QS1aMC05XSspKFxccyo6W14pXSopXFwpL2csXG4gICAgICAgICcoJDEkMiQzKSdcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL2NvbnNvbGVcXC5sb2dcXCgvZywgJ2xvZygnKTtcblxuICAgICAgaWYoIW5ld0NvbnRlbnQuaW5jbHVkZXMoJ2ltcG9ydCB7bG9nfScpICYmIG5ld0NvbnRlbnQuaW5jbHVkZXMoJ2xvZygnKSkge1xuICAgICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAgIC9pbXBvcnQgeyhbXn1dKil9IGZyb20gJyguKiknOy8sXG4gICAgICAgICAgJ2ltcG9ydCB7JDF9IGZyb20gXFwnJDJcXCc7XFxuaW1wb3J0IHtsb2d9IGZyb20gXFwnLi9sb2cuanNcXCc7J1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKGZpbGVQYXRoLmluY2x1ZGVzKCdyZWFjdFNoaW0udHMnKSkge1xuICAgICAgbG9nKCdGaXhpbmcgbmFtaW5nLWNvbnZlbnRpb24gaXNzdWVzIGluIHJlYWN0U2hpbS50cycsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAnaW1wb3J0ICogYXMgUmVhY3QgZnJvbScsXG4gICAgICAgICdpbXBvcnQgKiBhcyByZWFjdCBmcm9tJ1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvUmVhY3RcXC4vZywgJ3JlYWN0LicpO1xuICAgIH1cblxuICAgIGlmKGZpbGVQYXRoLmluY2x1ZGVzKCdjaGFuZ2Vsb2cudHMnKSkge1xuICAgICAgbG9nKCdGaXhpbmcgaXNzdWVzIGluIGNoYW5nZWxvZy50cycsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKC8oXFx3KylcXCtcXCsvZywgJyQxICs9IDEnKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXFxcXFxcJC9nLCAnJCcpO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXFxcXFxcLi9nLCAnLicpO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXFxcXFxcKi9nLCAnKicpO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXFxcXDovZywgJzonKTtcbiAgICB9XG5cbiAgICBpZihmaWxlUGF0aC5pbmNsdWRlcygnYXBwLnRzJykpIHtcbiAgICAgIGxvZygnRml4aW5nIGlzc3VlcyBpbiBhcHAudHMnLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvY29uc29sZVxcLmxvZ1xcKC9nLCAnbG9nKCcpO1xuXG4gICAgICBpZighbmV3Q29udGVudC5pbmNsdWRlcygnaW1wb3J0IHtsb2d9JykgJiYgbmV3Q29udGVudC5pbmNsdWRlcygnbG9nKCcpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgICAgL2ltcG9ydCBib3hlbiBmcm9tICdib3hlbic7LyxcbiAgICAgICAgICAnaW1wb3J0IGJveGVuIGZyb20gXFwnYm94ZW5cXCc7XFxuaW1wb3J0IHtsb2d9IGZyb20gXFwnLi9sb2cuanNcXCc7J1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKC9cXFxcXFwvL2csICcvJyk7XG4gICAgfVxuXG4gICAgaWYoZmlsZVBhdGguaW5jbHVkZXMoJ2F1dG9maXguanMnKSkge1xuICAgICAgbG9nKCdGaXhpbmcgaXNzdWVzIGluIGF1dG9maXguanMnLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2ltcG9ydCB7KFtefV0qKX0gZnJvbSAncGF0aCc7W1xcc1xcbl0qaW1wb3J0IHsoW159XSopfSBmcm9tICdwYXRoJzsvLFxuICAgICAgICAnaW1wb3J0IHskMSwgJDJ9IGZyb20gXFwncGF0aFxcJzsnXG4gICAgICApO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvX19maWxlbmFtZS9nLFxuICAgICAgICAnY3VycmVudEZpbGVuYW1lJ1xuICAgICAgKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9fX2Rpcm5hbWUvZyxcbiAgICAgICAgJ2N1cnJlbnREaXJuYW1lJ1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2NvbnN0IHByZWZpeCA9IHR5cGUgPT09ICdlcnJvcicgXFw/ICdcdTI3NEMgJyA6IHR5cGUgPT09ICdzdWNjZXNzJyBcXD8gJ1x1MjcwNSAnIDogJ1x1MjEzOVx1RkUwRiAnOy8sXG4gICAgICAgICdsZXQgcHJlZml4ID0gXFwnXHUyMTM5XHVGRTBGIFxcJztcXG5pZih0eXBlID09PSBcXCdlcnJvclxcJykge1xcbiAgcHJlZml4ID0gXFwnXHUyNzRDIFxcJztcXG59IGVsc2UgaWYodHlwZSA9PT0gXFwnc3VjY2Vzc1xcJykge1xcbiAgcHJlZml4ID0gXFwnXHUyNzA1IFxcJztcXG59J1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2FzeW5jIGZ1bmN0aW9uIHJ1bkVzbGludEZpeFxcKFxcKS9nLFxuICAgICAgICAnY29uc3QgcnVuRXNsaW50Rml4ID0gYXN5bmMgKCknXG4gICAgICApO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2FzeW5jIGZ1bmN0aW9uIGdldEZpbGVzV2l0aEVycm9yc1xcKFxcKS9nLFxuICAgICAgICAnY29uc3QgZ2V0RmlsZXNXaXRoRXJyb3JzID0gYXN5bmMgKCknXG4gICAgICApO1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2FzeW5jIGZ1bmN0aW9uIGlzQ3Vyc29yQXZhaWxhYmxlXFwoXFwpL2csXG4gICAgICAgICdjb25zdCBpc0N1cnNvckF2YWlsYWJsZSA9IGFzeW5jICgpJ1xuICAgICAgKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9hc3luYyBmdW5jdGlvbiBmaXhGaWxlV2l0aEN1cnNvckFJXFwoZmlsZVBhdGhcXCkvZyxcbiAgICAgICAgJ2NvbnN0IGZpeEZpbGVXaXRoQ3Vyc29yQUkgPSBhc3luYyAoZmlsZVBhdGgpJ1xuICAgICAgKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9hc3luYyBmdW5jdGlvbiBtYWluXFwoXFwpL2csXG4gICAgICAgICdjb25zdCBtYWluID0gYXN5bmMgKCknXG4gICAgICApO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvaW1wb3J0IHtleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMsIHdyaXRlRmlsZVN5bmN9L2csXG4gICAgICAgICdpbXBvcnQge3dyaXRlRmlsZVN5bmN9J1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL2NvbnNvbGVcXC5sb2dcXChgXFwke3ByZWZpeH0gXFwke21lc3NhZ2V9YFxcKTsvZyxcbiAgICAgICAgJ3Byb2Nlc3Muc3Rkb3V0LndyaXRlKGAke3ByZWZpeH0gJHttZXNzYWdlfVxcXFxuYCk7J1xuICAgICAgKTtcblxuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL30gY2F0Y2hcXChlcnJvclxcKSB7W1xcc1xcbl0qXFwvXFwvIElnbm9yZSBjbGVhbnVwIGVycm9ycy9nLFxuICAgICAgICAnfSBjYXRjaChfKSB7XFxuICAgICAgLy8gSWdub3JlIGNsZWFudXAgZXJyb3JzJ1xuICAgICAgKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC99IGNhdGNoXFwoZXJyb3JcXCkge1tcXHNcXG5dKmxvZ1xcKC9nLFxuICAgICAgICAnfSBjYXRjaChlcnIpIHtcXG4gICAgbG9nKCdcbiAgICAgICk7XG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvfSBjYXRjaFxcKGVycm9yXFwpIHtbXFxzXFxuXSpyZXR1cm4gZmFsc2U7L2csXG4gICAgICAgICd9IGNhdGNoKF8pIHtcXG4gICAgcmV0dXJuIGZhbHNlOydcbiAgICAgICk7XG5cbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9mb3JcXChjb25zdCBmaWxlUGF0aCBvZiBmaWxlc1dpdGhFcnJvcnNcXCkge1tcXHNcXG5dKmNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBmaXhGaWxlV2l0aEN1cnNvckFJXFwoZmlsZVBhdGhcXCk7L2csXG4gICAgICAgICdjb25zdCBmaXhSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoZmlsZXNXaXRoRXJyb3JzLm1hcChmaWxlUGF0aCA9PiBmaXhGaWxlV2l0aEN1cnNvckFJKGZpbGVQYXRoKSkpO1xcbmZvcihjb25zdCBzdWNjZXNzIG9mIGZpeFJlc3VsdHMpIHsnXG4gICAgICApO1xuXG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgICAvZml4ZWRDb3VudFxcK1xcKzsvZyxcbiAgICAgICAgJ2ZpeGVkQ291bnQgKz0gMTsnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmKG5ld0NvbnRlbnQgIT09IGZpbGVDb250ZW50KSB7XG4gICAgICB3cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBuZXdDb250ZW50LCAndXRmOCcpO1xuICAgICAgbG9nKGBGaXhlZCBpc3N1ZXMgaW4gJHtmaWxlUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIHdhc01vZGlmaWVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2FzTW9kaWZpZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nKGBFcnJvciBhcHBseWluZyBkaXJlY3QgZml4ZXMgdG8gJHtmaWxlUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5jb25zdCBsb2FkQUlDb25maWcgPSBhc3luYyAoY3dkOiBzdHJpbmcsIHF1aWV0OiBib29sZWFuLCBkZWJ1ZzogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGNvbmZpZ0Zvcm1hdHMgPSBbJ2pzJywgJ21qcycsICdjanMnLCAndHMnLCAnanNvbiddO1xuICBjb25zdCBjb25maWdCYXNlTmFtZSA9ICdsZXguY29uZmlnJztcbiAgbGV0IGxleENvbmZpZ1BhdGggPSAnJztcblxuICBmb3IoY29uc3QgZm9ybWF0IG9mIGNvbmZpZ0Zvcm1hdHMpIHtcbiAgICBjb25zdCBwb3RlbnRpYWxQYXRoID0gcGF0aFJlc29sdmUoY3dkLCBgLi8ke2NvbmZpZ0Jhc2VOYW1lfS4ke2Zvcm1hdH1gKTtcbiAgICBpZihleGlzdHNTeW5jKHBvdGVudGlhbFBhdGgpKSB7XG4gICAgICBsZXhDb25maWdQYXRoID0gcG90ZW50aWFsUGF0aDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmKGxleENvbmZpZ1BhdGgpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRm9yIE1KUyBmaWxlcywgd2UgbmVlZCB0byB1c2UgZHluYW1pYyBpbXBvcnQgd2l0aCBVUkwgZm9yIGNvbXBhdGliaWxpdHlcbiAgICAgIGNvbnN0IGZvcm1hdCA9IGV4dG5hbWUobGV4Q29uZmlnUGF0aCkuc2xpY2UoMSk7XG4gICAgICBsZXQgaW1wb3J0UGF0aCA9IGxleENvbmZpZ1BhdGg7XG5cbiAgICAgIC8vIFVzZSBVUkwgcHJvdG9jb2wgZm9yIEVTTSBpbXBvcnRzXG4gICAgICBpZihmb3JtYXQgPT09ICdtanMnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChgZmlsZTovLyR7bGV4Q29uZmlnUGF0aH1gKTtcbiAgICAgICAgICBpbXBvcnRQYXRoID0gdXJsLmhyZWY7XG4gICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgIGxvZyhgVXNpbmcgVVJMIGZvcm1hdCBmb3IgTUpTIGltcG9ydDogJHtpbXBvcnRQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAodXJsRXJyb3IpIHtcbiAgICAgICAgICBsb2coYEVycm9yIGNyZWF0aW5nIFVSTCBmb3IgTUpTIGltcG9ydDogJHt1cmxFcnJvci5tZXNzYWdlfWAsICd3YXJuJywgZGVidWcgfHwgIXF1aWV0KTtcbiAgICAgICAgICBpbXBvcnRQYXRoID0gYGZpbGU6Ly8ke2xleENvbmZpZ1BhdGh9YDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coYFRyeWluZyB0byBpbXBvcnQgY29uZmlnIGZyb20gJHtpbXBvcnRQYXRofSAoZm9ybWF0OiAke2Zvcm1hdH0pYCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBsZXhDb25maWc7XG4gICAgICB0cnkge1xuICAgICAgICBsZXhDb25maWcgPSBhd2FpdCBpbXBvcnQoaW1wb3J0UGF0aCk7XG4gICAgICB9IGNhdGNoIChpbXBvcnRFcnJvcikge1xuICAgICAgICBpZihpbXBvcnRFcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdub3QgZGVmaW5lZCBpbiBFUyBtb2R1bGUgc2NvcGUnKSkge1xuICAgICAgICAgIGxvZyhgRVMgTW9kdWxlIHN5bnRheCBlcnJvciBpbiAke2xleENvbmZpZ1BhdGh9LiBNYWtlIHN1cmUgeW91J3JlIHVzaW5nICdleHBvcnQnIGluc3RlYWQgb2YgJ21vZHVsZS5leHBvcnRzJy5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoaW1wb3J0RXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgaW1wb3J0RXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBib3RoIEVTTSAoZGVmYXVsdCBleHBvcnQpIGFuZCBDb21tb25KUyAobW9kdWxlLmV4cG9ydHMpXG4gICAgICBsZXQgY29uZmlnRGF0YSA9IG51bGw7XG4gICAgICBpZihsZXhDb25maWcuZGVmYXVsdCkge1xuICAgICAgICBjb25maWdEYXRhID0gbGV4Q29uZmlnLmRlZmF1bHQ7XG4gICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgbG9nKGBGb3VuZCBkZWZhdWx0IGV4cG9ydCBpbiAke2xleENvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBDb21tb25KUyBvciBvdGhlciBtb2R1bGUgc3lzdGVtc1xuICAgICAgICBjb25maWdEYXRhID0gbGV4Q29uZmlnO1xuICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgIGxvZyhgVXNpbmcgZGlyZWN0IGV4cG9ydCBpbiAke2xleENvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYoY29uZmlnRGF0YSAmJiBjb25maWdEYXRhLmFpKSB7XG4gICAgICAgIGxvZyhgRm91bmQgQUkgY29uZmlndXJhdGlvbiBpbiAke3BhdGhSZXNvbHZlKGN3ZCwgbGV4Q29uZmlnUGF0aCl9LCBhcHBseWluZyBzZXR0aW5ncy4uLmAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICBMZXhDb25maWcuY29uZmlnLmFpID0gey4uLkxleENvbmZpZy5jb25maWcuYWksIC4uLmNvbmZpZ0RhdGEuYWl9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2coYEVycm9yIGxvYWRpbmcgQUkgY29uZmlndXJhdGlvbiBmcm9tICR7bGV4Q29uZmlnUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnd2FybicsIHF1aWV0KTtcbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMb2FkIEVTTGludCBjb25maWd1cmF0aW9uIGZyb20gbGV4LmNvbmZpZy4qIGZpbGVzXG4gKi9cbmNvbnN0IGxvYWRFU0xpbnRDb25maWcgPSBhc3luYyAoY3dkOiBzdHJpbmcsIHF1aWV0OiBib29sZWFuLCBkZWJ1ZzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAvLyBDaGVjayBpZiBMZXhDb25maWcgYWxyZWFkeSBoYXMgRVNMaW50IGNvbmZpZ3VyYXRpb24gbG9hZGVkXG4gIGlmKExleENvbmZpZy5jb25maWcuZXNsaW50ICYmIE9iamVjdC5rZXlzKExleENvbmZpZy5jb25maWcuZXNsaW50KS5sZW5ndGggPiAwKSB7XG4gICAgbG9nKCdGb3VuZCBFU0xpbnQgY29uZmlndXJhdGlvbiBpbiBsZXguY29uZmlnLiogZmlsZScsICdpbmZvJywgZGVidWcgfHwgIXF1aWV0KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIFRyeSB0byBsb2FkIGZyb20gbGV4LmNvbmZpZy4qIGZpbGVzIGlmIG5vdCBhbHJlYWR5IGxvYWRlZFxuICBjb25zdCBjb25maWdGb3JtYXRzID0gWydqcycsICdtanMnLCAnY2pzJywgJ3RzJywgJ2pzb24nXTtcbiAgY29uc3QgY29uZmlnQmFzZU5hbWUgPSAnbGV4LmNvbmZpZyc7XG5cbiAgZm9yKGNvbnN0IGZvcm1hdCBvZiBjb25maWdGb3JtYXRzKSB7XG4gICAgY29uc3QgcG90ZW50aWFsUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgYC4vJHtjb25maWdCYXNlTmFtZX0uJHtmb3JtYXR9YCk7XG4gICAgaWYoZXhpc3RzU3luYyhwb3RlbnRpYWxQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRm9yIE1KUyBmaWxlcywgd2UgbmVlZCB0byB1c2UgZHluYW1pYyBpbXBvcnQgd2l0aCBVUkwgZm9yIGNvbXBhdGliaWxpdHlcbiAgICAgICAgY29uc3QgZmlsZUZvcm1hdCA9IGV4dG5hbWUocG90ZW50aWFsUGF0aCkuc2xpY2UoMSk7XG4gICAgICAgIGxldCBpbXBvcnRQYXRoID0gcG90ZW50aWFsUGF0aDtcblxuICAgICAgICAvLyBVc2UgVVJMIHByb3RvY29sIGZvciBFU00gaW1wb3J0c1xuICAgICAgICBpZihmaWxlRm9ybWF0ID09PSAnbWpzJykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGBmaWxlOi8vJHtwb3RlbnRpYWxQYXRofWApO1xuICAgICAgICAgICAgaW1wb3J0UGF0aCA9IHVybC5ocmVmO1xuICAgICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgICAgbG9nKGBVc2luZyBVUkwgZm9ybWF0IGZvciBNSlMgaW1wb3J0OiAke2ltcG9ydFBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAodXJsRXJyb3IpIHtcbiAgICAgICAgICAgIGxvZyhgRXJyb3IgY3JlYXRpbmcgVVJMIGZvciBNSlMgaW1wb3J0OiAke3VybEVycm9yLm1lc3NhZ2V9YCwgJ3dhcm4nLCBkZWJ1ZyB8fCAhcXVpZXQpO1xuICAgICAgICAgICAgaW1wb3J0UGF0aCA9IGBmaWxlOi8vJHtwb3RlbnRpYWxQYXRofWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICBsb2coYFRyeWluZyB0byBpbXBvcnQgY29uZmlnIGZyb20gJHtpbXBvcnRQYXRofSAoZm9ybWF0OiAke2ZpbGVGb3JtYXR9KWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxleENvbmZpZztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsZXhDb25maWcgPSBhd2FpdCBpbXBvcnQoaW1wb3J0UGF0aCk7XG4gICAgICAgIH0gY2F0Y2ggKGltcG9ydEVycm9yKSB7XG4gICAgICAgICAgaWYoaW1wb3J0RXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbm90IGRlZmluZWQgaW4gRVMgbW9kdWxlIHNjb3BlJykpIHtcbiAgICAgICAgICAgIGxvZyhgRVMgTW9kdWxlIHN5bnRheCBlcnJvciBpbiAke3BvdGVudGlhbFBhdGh9LiBNYWtlIHN1cmUgeW91J3JlIHVzaW5nICdleHBvcnQnIGluc3RlYWQgb2YgJ21vZHVsZS5leHBvcnRzJy5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGltcG9ydEVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBpbXBvcnRFcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBib3RoIEVTTSAoZGVmYXVsdCBleHBvcnQpIGFuZCBDb21tb25KUyAobW9kdWxlLmV4cG9ydHMpXG4gICAgICAgIGxldCBjb25maWdEYXRhID0gbnVsbDtcbiAgICAgICAgaWYobGV4Q29uZmlnLmRlZmF1bHQpIHtcbiAgICAgICAgICBjb25maWdEYXRhID0gbGV4Q29uZmlnLmRlZmF1bHQ7XG4gICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgIGxvZyhgRm91bmQgZGVmYXVsdCBleHBvcnQgaW4gJHtwb3RlbnRpYWxQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3IgQ29tbW9uSlMgb3Igb3RoZXIgbW9kdWxlIHN5c3RlbXNcbiAgICAgICAgICBjb25maWdEYXRhID0gbGV4Q29uZmlnO1xuICAgICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgICBsb2coYFVzaW5nIGRpcmVjdCBleHBvcnQgaW4gJHtwb3RlbnRpYWxQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGNvbmZpZ0RhdGEgJiYgY29uZmlnRGF0YS5lc2xpbnQgJiYgT2JqZWN0LmtleXMoY29uZmlnRGF0YS5lc2xpbnQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsb2coYEZvdW5kIEVTTGludCBjb25maWd1cmF0aW9uIGluICR7cGF0aFJlc29sdmUoY3dkLCBwb3RlbnRpYWxQYXRoKX0sIGFwcGx5aW5nIHNldHRpbmdzLi4uYCwgJ2luZm8nLCBkZWJ1ZyB8fCAhcXVpZXQpO1xuICAgICAgICAgIExleENvbmZpZy5jb25maWcuZXNsaW50ID0gey4uLkxleENvbmZpZy5jb25maWcuZXNsaW50LCAuLi5jb25maWdEYXRhLmVzbGludH07XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZyhgRXJyb3IgbG9hZGluZyBFU0xpbnQgY29uZmlndXJhdGlvbiBmcm9tICR7cG90ZW50aWFsUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnd2FybicsIHF1aWV0KTtcbiAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmNvbnN0IHJlbW92ZUZpbGVDb21tZW50cyA9IChmaWxlUGF0aDogc3RyaW5nLCBxdWlldDogYm9vbGVhbik6IGJvb2xlYW4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVDb250ZW50ID0gcmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYoZmlsZUNvbnRlbnQubGVuZ3RoID4gMTAwMDAwMCkgeyAvLyAxTUIgbGltaXRcbiAgICAgIGxvZyhgU2tpcHBpbmcgY29tbWVudCByZW1vdmFsIGZvciBsYXJnZSBmaWxlOiAke2ZpbGVQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBVc2UgcmVnZXggdG8gbWF0Y2ggZGlmZmVyZW50IHR5cGVzIG9mIGNvbW1lbnRzXG4gICAgLy8gUHJlc2VydmVzOlxuICAgIC8vIDEuIENvcHlyaWdodCBub3RpY2VzICgvKiBDb3B5cmlnaHQgLi4uICovKVxuICAgIC8vIDIuIFRPRE8gY29tbWVudHMgKC8vIFRPRE86IC4uLilcbiAgICAvLyAzLiBMaWNlbnNlIGhlYWRlcnMgKC8qIC4uLiBMaWNlbnNlIC4uLiAqLylcblxuICAgIC8vIEhhbmRsZSBtdWx0aS1saW5lIGNvbW1lbnRzIGZpcnN0IC0gcHJlc2VydmUgY29weXJpZ2h0L2xpY2Vuc2Ugbm90aWNlc1xuICAgIGxldCBuZXdDb250ZW50ID0gZmlsZUNvbnRlbnQucmVwbGFjZShcbiAgICAgIC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csXG4gICAgICAobWF0Y2gpID0+IHtcbiAgICAgICAgaWYobWF0Y2guaW5jbHVkZXMoJ0NvcHlyaWdodCcpIHx8XG4gICAgICAgICAgbWF0Y2guaW5jbHVkZXMoJ0xJQ0VOU0UnKSB8fFxuICAgICAgICAgIG1hdGNoLmluY2x1ZGVzKCdMaWNlbnNlJykgfHxcbiAgICAgICAgICBtYXRjaC5pbmNsdWRlcygnbGljZW5zZScpKSB7XG4gICAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gSGFuZGxlIHNpbmdsZS1saW5lIGNvbW1lbnRzIC0gcHJlc2VydmUgVE9ET3NcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFxuICAgICAgL1xcL1xcLy4qJC9nbSxcbiAgICAgIChtYXRjaCkgPT4ge1xuICAgICAgICBpZihtYXRjaC5pbmNsdWRlcygnVE9ETycpIHx8IG1hdGNoLmluY2x1ZGVzKCdGSVhNRScpKSB7XG4gICAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gQ2xlYW4gdXAgYW55IG11bHRpcGxlIGJsYW5rIGxpbmVzIGNyZWF0ZWQgYnkgY29tbWVudCByZW1vdmFsXG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXFxuXFxzKlxcblxccypcXG4vZywgJ1xcblxcbicpO1xuXG4gICAgLy8gSWYgdGhlIGZpbGUgd2FzIG1vZGlmaWVkLCBzYXZlIGl0XG4gICAgaWYobmV3Q29udGVudCAhPT0gZmlsZUNvbnRlbnQpIHtcbiAgICAgIHdyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIG5ld0NvbnRlbnQsICd1dGY4Jyk7XG4gICAgICBsb2coYFJlbW92ZWQgY29tbWVudHMgZnJvbSAke2ZpbGVQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZyhgRXJyb3IgcmVtb3ZpbmcgY29tbWVudHMgZnJvbSAke2ZpbGVQYXRofTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBsaW50ID0gYXN5bmMgKGNtZDogTGludE9wdGlvbnMgJiB7J3JlbW92ZS1jb21tZW50cyc/OiBib29sZWFufSwgY2FsbGJhY2s6IExpbnRDYWxsYmFjayA9IHByb2Nlc3MuZXhpdCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgZml4ID0gZmFsc2UsXG4gICAgZGVidWcgPSBmYWxzZSxcbiAgICBxdWlldCA9IGZhbHNlLFxuICAgIGNvbmZpZyA9IG51bGwsXG4gICAgcmVtb3ZlQ29tbWVudHMgPSBmYWxzZSxcbiAgICAncmVtb3ZlLWNvbW1lbnRzJzogcmVtb3ZlQ29tbWVudHNGbGFnID0gZmFsc2VcbiAgfSA9IGNtZDtcblxuICBjb25zdCBzaG91bGRSZW1vdmVDb21tZW50cyA9IHJlbW92ZUNvbW1lbnRzIHx8IHJlbW92ZUNvbW1lbnRzRmxhZztcblxuICBsb2coYCR7Y2xpTmFtZX0gbGludGluZy4uLmAsICdpbmZvJywgcXVpZXQpO1xuXG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHNwaW5uZXIgPSBjcmVhdGVTcGlubmVyKHF1aWV0KTtcblxuICBhd2FpdCBsb2FkQUlDb25maWcoY3dkLCBxdWlldCwgZGVidWcpO1xuXG4gIGxldCB0ZW1wQ29uZmlnUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB1c2VUeXBlc2NyaXB0ID0gZGV0ZWN0VHlwZVNjcmlwdChjd2QpO1xuICAgIGxvZyhgVHlwZVNjcmlwdCAke3VzZVR5cGVzY3JpcHQgPyAnZGV0ZWN0ZWQnIDogJ25vdCBkZXRlY3RlZCd9IGZyb20gdHNjb25maWcuanNvbmAsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgaWYodXNlVHlwZXNjcmlwdCkge1xuICAgICAgTGV4Q29uZmlnLmNoZWNrTGludFR5cGVzY3JpcHRDb25maWcoKTtcbiAgICB9XG5cbiAgICBlbnN1cmVNb2R1bGVUeXBlKGN3ZCk7XG5cbiAgICBhd2FpdCBpbnN0YWxsRGVwZW5kZW5jaWVzKGN3ZCwgdXNlVHlwZXNjcmlwdCwgcXVpZXQpO1xuXG4gICAgY29uc3QgcHJvamVjdENvbmZpZ1BhdGggPSBwYXRoUmVzb2x2ZShjd2QsICdlc2xpbnQuY29uZmlnLm1qcycpO1xuICAgIGNvbnN0IHByb2plY3RDb25maWdQYXRoVHMgPSBwYXRoUmVzb2x2ZShjd2QsICdlc2xpbnQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgaGFzRXNsaW50Q29uZmlnID0gZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aCkgfHxcbiAgICAgIGV4aXN0c1N5bmMocHJvamVjdENvbmZpZ1BhdGhUcykgfHxcbiAgICAgIGV4aXN0c1N5bmMocGF0aFJlc29sdmUoY3dkLCAnLmVzbGludHJjLmpzJykpIHx8XG4gICAgICBleGlzdHNTeW5jKHBhdGhSZXNvbHZlKGN3ZCwgJy5lc2xpbnRyYy5qc29uJykpIHx8XG4gICAgICBleGlzdHNTeW5jKHBhdGhSZXNvbHZlKGN3ZCwgJy5lc2xpbnRyYy55bWwnKSkgfHxcbiAgICAgIGV4aXN0c1N5bmMocGF0aFJlc29sdmUoY3dkLCAnLmVzbGludHJjLnlhbWwnKSkgfHxcbiAgICAgIGV4aXN0c1N5bmMocGF0aFJlc29sdmUoY3dkLCAnLmVzbGludHJjJykpO1xuXG4gICAgY29uc3QgaGFzTGV4RXNsaW50Q29uZmlnID0gYXdhaXQgbG9hZEVTTGludENvbmZpZyhjd2QsIHF1aWV0LCBkZWJ1Zyk7XG5cbiAgICBpZihoYXNMZXhFc2xpbnRDb25maWcpIHtcbiAgICAgIGxvZygnVXNpbmcgRVNMaW50IGNvbmZpZ3VyYXRpb24gZnJvbSBsZXguY29uZmlnLiogZmlsZScsICdpbmZvJywgcXVpZXQpO1xuICAgIH1cblxuICAgIGlmKGV4aXN0c1N5bmMocGF0aFJlc29sdmUoY3dkLCAnLmVzbGludHJjLmpzb24nKSkpIHtcbiAgICAgIHVubGlua1N5bmMocGF0aFJlc29sdmUoY3dkLCAnLmVzbGludHJjLmpzb24nKSk7XG4gICAgfVxuXG4gICAgbGV0IGxleENvbmZpZ1BhdGggPSAnJztcbiAgICBsZXQgc2hvdWxkQ3JlYXRlVGVtcENvbmZpZyA9IGZhbHNlO1xuXG4gICAgaWYoIWhhc0VzbGludENvbmZpZyAmJiAhaGFzTGV4RXNsaW50Q29uZmlnKSB7XG4gICAgICBjb25zdCBwb3NzaWJsZVBhdGhzID0gW1xuICAgICAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJy4uLy4uLy4uLy4uL2VzbGludC5jb25maWcudHMnKSxcbiAgICAgICAgcGF0aFJlc29sdmUoY3VycmVudERpcm5hbWUsICcuLi8uLi8uLi8uLi9lc2xpbnQuY29uZmlnLmptcycpLFxuICAgICAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmVudi5MRVhfSE9NRSB8fCAnLi9ub2RlX21vZHVsZXMvQG5sYWJzL2xleCcsICdlc2xpbnQuY29uZmlnLnRzJyksXG4gICAgICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuZW52LkxFWF9IT01FIHx8ICcuL25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4JywgJ2VzbGludC5jb25maWcubWpzJylcbiAgICAgIF07XG5cbiAgICAgIGZvcihjb25zdCBwYXRoIG9mIHBvc3NpYmxlUGF0aHMpIHtcbiAgICAgICAgaWYoZXhpc3RzU3luYyhwYXRoKSkge1xuICAgICAgICAgIGxleENvbmZpZ1BhdGggPSBwYXRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgQ3VycmVudCBkaXJlY3Rvcnk6ICR7Y3VycmVudERpcm5hbWV9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIGxvZyhgUHJvamVjdCBjb25maWcgcGF0aDogJHtwcm9qZWN0Q29uZmlnUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgbG9nKGBQcm9qZWN0IGNvbmZpZyBleGlzdHM6ICR7aGFzRXNsaW50Q29uZmlnfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICBsb2coYEZvdW5kIExleCBjb25maWc6ICR7bGV4Q29uZmlnUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgbG9nKGBMZXggY29uZmlnIGV4aXN0czogJHshIWxleENvbmZpZ1BhdGggJiYgZXhpc3RzU3luYyhsZXhDb25maWdQYXRoKX1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIH1cblxuICAgICAgaWYobGV4Q29uZmlnUGF0aCAmJiBleGlzdHNTeW5jKGxleENvbmZpZ1BhdGgpKSB7XG4gICAgICAgIGxvZygnTm8gRVNMaW50IGNvbmZpZ3VyYXRpb24gZm91bmQgaW4gcHJvamVjdC4gVXNpbmcgTGV4XFwncyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG91bGRDcmVhdGVUZW1wQ29uZmlnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihjb25maWcpIHtcbiAgICAgIGNvbnN0IHVzZXJDb25maWdQYXRoID0gcGF0aFJlc29sdmUoY3dkLCBjb25maWcpO1xuICAgICAgaWYoZXhpc3RzU3luYyh1c2VyQ29uZmlnUGF0aCkpIHtcbiAgICAgICAgbG9nKGBVc2luZyBzcGVjaWZpZWQgRVNMaW50IGNvbmZpZ3VyYXRpb246ICR7Y29uZmlnfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICBzaG91bGRDcmVhdGVUZW1wQ29uZmlnID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coYFNwZWNpZmllZCBFU0xpbnQgY29uZmlndXJhdGlvbiBub3QgZm91bmQ6ICR7Y29uZmlnfS4gVXNpbmcgTGV4J3MgZGVmYXVsdCBjb25maWd1cmF0aW9uLmAsICd3YXJuJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKHNob3VsZENyZWF0ZVRlbXBDb25maWcpIHtcbiAgICAgIGxvZygnTm8gRVNMaW50IGNvbmZpZ3VyYXRpb24gZm91bmQuIENyZWF0aW5nIGEgdGVtcG9yYXJ5IGNvbmZpZ3VyYXRpb24uLi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIGNvbnN0IGNvbmZpZ1Jlc3VsdCA9IGNyZWF0ZURlZmF1bHRFU0xpbnRDb25maWcodXNlVHlwZXNjcmlwdCwgY3dkKTtcbiAgICAgIHRlbXBDb25maWdQYXRoID0gY29uZmlnUmVzdWx0LmNvbmZpZ1BhdGg7XG4gICAgfVxuXG4gICAgbGV0IGVzbGludE91dHB1dCA9ICcnO1xuICAgIGNvbnN0IGNhcHR1cmVPdXRwdXQgPSAob3V0cHV0OiBzdHJpbmcpID0+IHtcbiAgICAgIGVzbGludE91dHB1dCArPSBgJHtvdXRwdXR9XFxuYDtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuRXNsaW50V2l0aExleChjd2QsIHF1aWV0LCBjbGlOYW1lLCB0cnVlLCBkZWJ1ZywgdXNlVHlwZXNjcmlwdCwgY2FwdHVyZU91dHB1dCk7XG5cbiAgICBpZihzaG91bGRSZW1vdmVDb21tZW50cykge1xuICAgICAgc3Bpbm5lci5zdGFydCgnUmVtb3ZpbmcgY29tbWVudHMgZnJvbSBmaWxlcy4uLicpO1xuXG4gICAgICBjb25zdCBnbG9iID0gYXdhaXQgaW1wb3J0KCdnbG9iJyk7XG4gICAgICBjb25zdCBmaWxlcyA9IGdsb2Iuc3luYygne3NyYyxsaWJ9LyoqLyoue2pzLGpzeCx0cyx0c3h9Jywge1xuICAgICAgICBjd2QsXG4gICAgICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionLCAnKiovbGliLyoqJywgJyoqL2Rpc3QvKionLCAnKiovYnVpbGQvKionXVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBwcm9jZXNzZWRDb3VudCA9IDA7XG4gICAgICBmb3IoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgZmlsZSk7XG4gICAgICAgIGlmKHJlbW92ZUZpbGVDb21tZW50cyhmaWxlUGF0aCwgcXVpZXQpKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzcGlubmVyLnN1Y2NlZWQoYFJlbW92ZWQgY29tbWVudHMgZnJvbSAke3Byb2Nlc3NlZENvdW50fSBmaWxlc2ApO1xuICAgIH1cblxuICAgIGlmKHJlc3VsdCAhPT0gMCAmJiBmaXgpIHtcbiAgICAgIGNvbnN0IGFpQ29uZmlndXJlZCA9IExleENvbmZpZy5jb25maWcuYWk/LnByb3ZpZGVyICYmIExleENvbmZpZy5jb25maWcuYWkucHJvdmlkZXIgIT09ICdub25lJztcblxuICAgICAgaWYoYWlDb25maWd1cmVkKSB7XG4gICAgICAgIGxvZygnQXBwbHlpbmcgQUkgZml4ZXMgdG8gcmVtYWluaW5nIGlzc3Vlcy4uLicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICBhd2FpdCBhcHBseUFJRml4KGN3ZCwgZXNsaW50T3V0cHV0LCBxdWlldCk7XG5cbiAgICAgICAgY29uc3QgYWZ0ZXJGaXhSZXN1bHQgPSBhd2FpdCBydW5Fc2xpbnRXaXRoTGV4KGN3ZCwgcXVpZXQsIGNsaU5hbWUsIGZhbHNlLCBkZWJ1ZywgdXNlVHlwZXNjcmlwdCk7XG5cbiAgICAgICAgY2FsbGJhY2soYWZ0ZXJGaXhSZXN1bHQpO1xuICAgICAgICByZXR1cm4gYWZ0ZXJGaXhSZXN1bHQ7XG4gICAgICB9XG4gICAgICBsb2coJ0VTTGludCBjb3VsZCBub3QgZml4IGFsbCBpc3N1ZXMgYXV0b21hdGljYWxseS4nLCAnd2FybicsIHF1aWV0KTtcbiAgICAgIGxvZygnVG8gZW5hYmxlIEFJLXBvd2VyZWQgZml4ZXMsIGFkZCBBSSBjb25maWd1cmF0aW9uIHRvIHlvdXIgbGV4LmNvbmZpZyBmaWxlOicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgbG9nKGBcbi8vIEluIGxleC5jb25maWcuanMgKG9yIGxleC5jb25maWcubWpzLCBsZXguY29uZmlnLmNqcywgZXRjLilcbmV4cG9ydCBkZWZhdWx0IHtcbiAgLy8gWW91ciBleGlzdGluZyBjb25maWdcbiAgYWk6IHtcbiAgICBwcm92aWRlcjogJ2N1cnNvcicgLy8gb3IgJ29wZW5haScsICdhbnRocm9waWMnLCBldGMuXG4gICAgLy8gQWRkaXRpb25hbCBwcm92aWRlci1zcGVjaWZpYyBzZXR0aW5nc1xuICB9XG59O2AsICdpbmZvJywgcXVpZXQpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgaWYoc3Bpbm5lcikge1xuICAgICAgc3Bpbm5lci5mYWlsKCdMaW50aW5nIGZhaWxlZCEnKTtcbiAgICB9XG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH0gZmluYWxseSB7XG4gICAgY29uc3QgdGVtcEZpbGVQYXRocyA9IFtcbiAgICAgIHRlbXBDb25maWdQYXRoLFxuICAgICAgcGF0aFJlc29sdmUoY3dkLCAnLmxleC10ZW1wLWVzbGludC5janMnKSxcbiAgICAgIHBhdGhSZXNvbHZlKGN3ZCwgJy5sZXgtdGVtcC1kZWZhdWx0LWVzbGludC5janMnKVxuICAgIF07XG5cbiAgICBmb3IoY29uc3QgZmlsZVBhdGggb2YgdGVtcEZpbGVQYXRocykge1xuICAgICAgaWYoZmlsZVBhdGggJiYgZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB1bmxpbmtTeW5jKGZpbGVQYXRoKTtcbiAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgbG9nKGBDbGVhbmVkIHVwIHRlbXBvcmFyeSBFU0xpbnQgY29uZmlnIGF0ICR7ZmlsZVBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufTsiXSwKICAibWFwcGluZ3MiOiAiQUFJQSxTQUFRLGFBQVk7QUFDcEIsU0FBUSxZQUFZLGNBQWMsWUFBWSxxQkFBb0I7QUFDbEUsU0FBUSxTQUFTLFdBQVcsYUFBYSxl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Q0EsUUFBUSxDQUFDLHNCQUFzQixhQUFhLGNBQWMsYUFBYTtBQUFBLE1BQ3pFLENBQUM7QUFFRCxVQUFJLGlCQUFpQjtBQUNyQixpQkFBVSxRQUFRLE9BQU87QUFDdkIsY0FBTSxXQUFXLFlBQVksS0FBSyxJQUFJO0FBQ3RDLFlBQUcsbUJBQW1CLFVBQVUsS0FBSyxHQUFHO0FBQ3RDO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFFQSxjQUFRLFFBQVEseUJBQXlCLGNBQWMsUUFBUTtBQUFBLElBQ2pFO0FBRUEsUUFBRyxXQUFXLEtBQUssS0FBSztBQUN0QixZQUFNLGVBQWUsVUFBVSxPQUFPLElBQUksWUFBWSxVQUFVLE9BQU8sR0FBRyxhQUFhO0FBRXZGLFVBQUcsY0FBYztBQUNmLFlBQUksNENBQTRDLFFBQVEsS0FBSztBQUM3RCxjQUFNLFdBQVcsS0FBSyxjQUFjLEtBQUs7QUFFekMsY0FBTSxpQkFBaUIsTUFBTSxpQkFBaUIsS0FBSyxPQUFPLFNBQVMsT0FBTyxPQUFPLGFBQWE7QUFFOUYsaUJBQVMsY0FBYztBQUN2QixlQUFPO0FBQUEsTUFDVDtBQUNBLFVBQUksa0RBQWtELFFBQVEsS0FBSztBQUNuRSxVQUFJLDZFQUE2RSxRQUFRLEtBQUs7QUFDOUYsVUFBSTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FRTCxRQUFRLEtBQUs7QUFBQSxJQUNkO0FBRUEsYUFBUyxNQUFNO0FBQ2YsV0FBTztBQUFBLEVBQ1QsU0FBUyxPQUFPO0FBQ2QsUUFBSTtBQUFBLEVBQUssT0FBTyxXQUFXLE1BQU0sT0FBTyxJQUFJLFNBQVMsS0FBSztBQUMxRCxRQUFHLFNBQVM7QUFDVixjQUFRLEtBQUssaUJBQWlCO0FBQUEsSUFDaEM7QUFDQSxhQUFTLENBQUM7QUFDVixXQUFPO0FBQUEsRUFDVCxVQUFFO0FBQ0EsVUFBTSxnQkFBZ0I7QUFBQSxNQUNwQjtBQUFBLE1BQ0EsWUFBWSxLQUFLLHNCQUFzQjtBQUFBLE1BQ3ZDLFlBQVksS0FBSyw4QkFBOEI7QUFBQSxJQUNqRDtBQUVBLGVBQVUsWUFBWSxlQUFlO0FBQ25DLFVBQUcsWUFBWSxXQUFXLFFBQVEsR0FBRztBQUNuQyxZQUFJO0FBQ0YscUJBQVcsUUFBUTtBQUNuQixjQUFHLE9BQU87QUFDUixnQkFBSSx5Q0FBeUMsUUFBUSxJQUFJLFFBQVEsS0FBSztBQUFBLFVBQ3hFO0FBQUEsUUFDRixRQUFRO0FBQUEsUUFDUjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogWyJsaW5lcyJdCn0K