@mnaoumov/typescript-dev-toolkit 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/dist/lib/cjs/build.d.cts +1 -1
  2. package/dist/lib/cjs/bundlers/esbuild-impl/change-extension-plugin.d.cts +1 -1
  3. package/dist/lib/cjs/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.cts +1 -1
  4. package/dist/lib/cjs/bundlers/esbuild-impl/fix-esm-plugin.d.cts +1 -1
  5. package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +1 -1
  6. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +1 -1
  7. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.d.cts +1 -1
  8. package/dist/lib/cjs/bundlers/index.d.cts +1 -1
  9. package/dist/lib/cjs/check-project-types.d.cts +1 -1
  10. package/dist/lib/cjs/cli-utils.d.cts +1 -1
  11. package/dist/lib/cjs/code-generator.d.cts +1 -1
  12. package/dist/lib/cjs/commitlint-config.d.cts +1 -1
  13. package/dist/lib/cjs/commitlint-forbidden-patterns.d.cts +1 -1
  14. package/dist/lib/cjs/commitlint-spellcheck-header.d.cts +1 -1
  15. package/dist/lib/cjs/env-toggle.d.cts +1 -1
  16. package/dist/lib/cjs/exec.d.cts +1 -1
  17. package/dist/lib/cjs/forbidden-patterns.d.cts +1 -1
  18. package/dist/lib/cjs/formatters/dprint.d.cts +1 -1
  19. package/dist/lib/cjs/formatters/index.d.cts +1 -1
  20. package/dist/lib/cjs/fs.d.cts +1 -1
  21. package/dist/lib/cjs/gate.d.cts +1 -1
  22. package/dist/lib/cjs/git.d.cts +1 -1
  23. package/dist/lib/cjs/json.d.cts +1 -1
  24. package/dist/lib/cjs/library-build.cjs +14 -6
  25. package/dist/lib/cjs/library-build.d.cts +6 -2
  26. package/dist/lib/cjs/library-references.d.cts +5 -0
  27. package/dist/lib/cjs/linters/cspell-content.d.cts +1 -1
  28. package/dist/lib/cjs/linters/cspell.d.cts +1 -1
  29. package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.d.cts +1 -1
  30. package/dist/lib/cjs/linters/eslint-config.d.cts +1 -1
  31. package/dist/lib/cjs/linters/eslint-no-restricted-syntax.d.cts +1 -1
  32. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.d.cts +1 -1
  33. package/dist/lib/cjs/linters/eslint-rules/index.d.cts +1 -1
  34. package/dist/lib/cjs/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +1 -1
  35. package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.d.cts +1 -1
  36. package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.d.cts +1 -1
  37. package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.d.cts +1 -1
  38. package/dist/lib/cjs/linters/eslint-rules/params-options-name-match.d.cts +1 -1
  39. package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.d.cts +1 -1
  40. package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.d.cts +1 -1
  41. package/dist/lib/cjs/linters/eslint-rules/require-method-template.d.cts +1 -1
  42. package/dist/lib/cjs/linters/eslint-rules/require-super-call.d.cts +1 -1
  43. package/dist/lib/cjs/linters/eslint-rules/rule-tester-helper.d.cts +1 -1
  44. package/dist/lib/cjs/linters/eslint-rules/ts-estree-node.d.cts +1 -1
  45. package/dist/lib/cjs/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.cts +1 -1
  46. package/dist/lib/cjs/linters/eslint-types/@types/eslint-plugin-verify-tsdoc.d.cts +1 -1
  47. package/dist/lib/cjs/linters/eslint.cjs +77 -3
  48. package/dist/lib/cjs/linters/eslint.d.cts +40 -1
  49. package/dist/lib/cjs/linters/index.d.cts +1 -1
  50. package/dist/lib/cjs/linters/lint-ignores.d.cts +1 -1
  51. package/dist/lib/cjs/linters/markdownlint-cli2-config.d.cts +1 -1
  52. package/dist/lib/cjs/linters/markdownlint-content.d.cts +1 -1
  53. package/dist/lib/cjs/linters/markdownlint-ignores.d.cts +1 -1
  54. package/dist/lib/cjs/linters/markdownlint-rules/index.d.cts +1 -1
  55. package/dist/lib/cjs/linters/markdownlint-rules/no-soft-break-in-paragraph.d.cts +1 -1
  56. package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.cts +1 -1
  57. package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2.d.cts +1 -1
  58. package/dist/lib/cjs/linters/markdownlint.d.cts +1 -1
  59. package/dist/lib/cjs/linters/over-exposure.d.cts +1 -1
  60. package/dist/lib/cjs/nano-staged-config.d.cts +1 -1
  61. package/dist/lib/cjs/npm-publish.d.cts +1 -1
  62. package/dist/lib/cjs/npm-run.d.cts +1 -1
  63. package/dist/lib/cjs/npm.d.cts +1 -1
  64. package/dist/lib/cjs/package-lock-integrity.d.cts +1 -1
  65. package/dist/lib/cjs/package-manager.d.cts +1 -1
  66. package/dist/lib/cjs/released-issues.d.cts +1 -1
  67. package/dist/lib/cjs/repo-paths.d.cts +1 -1
  68. package/dist/lib/cjs/root.d.cts +1 -1
  69. package/dist/lib/cjs/test-runners/index.d.cts +1 -1
  70. package/dist/lib/cjs/test-runners/vitest-config.d.cts +1 -1
  71. package/dist/lib/cjs/test-runners/vitest.d.cts +1 -1
  72. package/dist/lib/cjs/validate-declarations.d.cts +1 -1
  73. package/dist/lib/cjs/version.d.cts +1 -1
  74. package/dist/lib/esm/build.d.mts +1 -1
  75. package/dist/lib/esm/bundlers/esbuild-impl/change-extension-plugin.d.mts +1 -1
  76. package/dist/lib/esm/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.mts +1 -1
  77. package/dist/lib/esm/bundlers/esbuild-impl/fix-esm-plugin.d.mts +1 -1
  78. package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +1 -1
  79. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +1 -1
  80. package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.d.mts +1 -1
  81. package/dist/lib/esm/bundlers/index.d.mts +1 -1
  82. package/dist/lib/esm/check-project-types.d.mts +1 -1
  83. package/dist/lib/esm/cli-utils.d.mts +1 -1
  84. package/dist/lib/esm/code-generator.d.mts +1 -1
  85. package/dist/lib/esm/commitlint-config.d.mts +1 -1
  86. package/dist/lib/esm/commitlint-forbidden-patterns.d.mts +1 -1
  87. package/dist/lib/esm/commitlint-spellcheck-header.d.mts +1 -1
  88. package/dist/lib/esm/env-toggle.d.mts +1 -1
  89. package/dist/lib/esm/exec.d.mts +1 -1
  90. package/dist/lib/esm/forbidden-patterns.d.mts +1 -1
  91. package/dist/lib/esm/formatters/dprint.d.mts +1 -1
  92. package/dist/lib/esm/formatters/index.d.mts +1 -1
  93. package/dist/lib/esm/fs.d.mts +1 -1
  94. package/dist/lib/esm/gate.d.mts +1 -1
  95. package/dist/lib/esm/git.d.mts +1 -1
  96. package/dist/lib/esm/json.d.mts +1 -1
  97. package/dist/lib/esm/library-build.d.mts +6 -2
  98. package/dist/lib/esm/library-build.mjs +14 -6
  99. package/dist/lib/esm/library-references.d.mts +5 -0
  100. package/dist/lib/esm/linters/cspell-content.d.mts +1 -1
  101. package/dist/lib/esm/linters/cspell.d.mts +1 -1
  102. package/dist/lib/esm/linters/eslint-agnostic-core-boundary.d.mts +1 -1
  103. package/dist/lib/esm/linters/eslint-config.d.mts +1 -1
  104. package/dist/lib/esm/linters/eslint-no-restricted-syntax.d.mts +1 -1
  105. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.d.mts +1 -1
  106. package/dist/lib/esm/linters/eslint-rules/index.d.mts +1 -1
  107. package/dist/lib/esm/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +1 -1
  108. package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.d.mts +1 -1
  109. package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.d.mts +1 -1
  110. package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.d.mts +1 -1
  111. package/dist/lib/esm/linters/eslint-rules/params-options-name-match.d.mts +1 -1
  112. package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.d.mts +1 -1
  113. package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.d.mts +1 -1
  114. package/dist/lib/esm/linters/eslint-rules/require-method-template.d.mts +1 -1
  115. package/dist/lib/esm/linters/eslint-rules/require-super-call.d.mts +1 -1
  116. package/dist/lib/esm/linters/eslint-rules/rule-tester-helper.d.mts +1 -1
  117. package/dist/lib/esm/linters/eslint-rules/ts-estree-node.d.mts +1 -1
  118. package/dist/lib/esm/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.mts +1 -1
  119. package/dist/lib/esm/linters/eslint-types/@types/eslint-plugin-verify-tsdoc.d.mts +1 -1
  120. package/dist/lib/esm/linters/eslint.d.mts +40 -1
  121. package/dist/lib/esm/linters/eslint.mjs +74 -3
  122. package/dist/lib/esm/linters/index.d.mts +1 -1
  123. package/dist/lib/esm/linters/lint-ignores.d.mts +1 -1
  124. package/dist/lib/esm/linters/markdownlint-cli2-config.d.mts +1 -1
  125. package/dist/lib/esm/linters/markdownlint-content.d.mts +1 -1
  126. package/dist/lib/esm/linters/markdownlint-ignores.d.mts +1 -1
  127. package/dist/lib/esm/linters/markdownlint-rules/index.d.mts +1 -1
  128. package/dist/lib/esm/linters/markdownlint-rules/no-soft-break-in-paragraph.d.mts +1 -1
  129. package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.mts +1 -1
  130. package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2.d.mts +1 -1
  131. package/dist/lib/esm/linters/markdownlint.d.mts +1 -1
  132. package/dist/lib/esm/linters/over-exposure.d.mts +1 -1
  133. package/dist/lib/esm/nano-staged-config.d.mts +1 -1
  134. package/dist/lib/esm/npm-publish.d.mts +1 -1
  135. package/dist/lib/esm/npm-run.d.mts +1 -1
  136. package/dist/lib/esm/npm.d.mts +1 -1
  137. package/dist/lib/esm/package-lock-integrity.d.mts +1 -1
  138. package/dist/lib/esm/package-manager.d.mts +1 -1
  139. package/dist/lib/esm/released-issues.d.mts +1 -1
  140. package/dist/lib/esm/repo-paths.d.mts +1 -1
  141. package/dist/lib/esm/root.d.mts +1 -1
  142. package/dist/lib/esm/test-runners/index.d.mts +1 -1
  143. package/dist/lib/esm/test-runners/vitest-config.d.mts +1 -1
  144. package/dist/lib/esm/test-runners/vitest.d.mts +1 -1
  145. package/dist/lib/esm/validate-declarations.d.mts +1 -1
  146. package/dist/lib/esm/version.d.mts +1 -1
  147. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- /// <reference path="./index.d.cts" />
1
+ /// <reference path="./library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  export * as 'change-extension-plugin' from './change-extension-plugin.cjs';
3
3
  export * as 'custom-esbuild-options-plugin' from './custom-esbuild-options-plugin.cjs';
4
4
  export * as 'fix-esm-plugin' from './fix-esm-plugin.cjs';
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,2 +1,2 @@
1
- /// <reference path="../index.d.cts" />
1
+ /// <reference path="../library-references.d.cts" />
2
2
  export * as 'esbuild-impl' from './esbuild-impl/index.cjs';
@@ -1,4 +1,4 @@
1
- /// <reference path="./index.d.cts" />
1
+ /// <reference path="./library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="./index.d.cts" />
1
+ /// <reference path="./library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="./index.d.cts" />
1
+ /// <reference path="./library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="./index.d.cts" />
1
+ /// <reference path="./library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="./index.d.cts" />
1
+ /// <reference path="./library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="./index.d.cts" />
1
+ /// <reference path="./library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="./index.d.cts" />
1
+ /// <reference path="./library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="./index.d.cts" />
1
+ /// <reference path="./library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="./index.d.cts" />
1
+ /// <reference path="./library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../index.d.cts" />
1
+ /// <reference path="../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,2 +1,2 @@
1
- /// <reference path="../index.d.cts" />
1
+ /// <reference path="../library-references.d.cts" />
2
2
  export * as 'dprint' from './dprint.cjs';
@@ -1,4 +1,4 @@
1
- /// <reference path="./index.d.cts" />
1
+ /// <reference path="./library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="./index.d.cts" />
1
+ /// <reference path="./library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="./index.d.cts" />
1
+ /// <reference path="./library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="./index.d.cts" />
1
+ /// <reference path="./library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -137,6 +137,7 @@ const LIBRARY_BUILD_STEPS = [
137
137
  ];
138
138
  const SOURCE_CONDITION = "@mnaoumov/source";
139
139
  const DECLARATION_REFERENCE_TYPES = /* @__PURE__ */ new Set(["node"]);
140
+ const LIBRARY_REFERENCES_FILE_NAME = "library-references";
140
141
  const REFERENCE_LIB_DIRECTIVE = ["<reference", "lib="].join(" ");
141
142
  const REFERENCE_LIB_REG_EXP = /\/\/\/ <reference lib="(?<Lib>[^"]+)" \/>/gm;
142
143
  const BARE_TYPE_IMPORT_REG_EXP = /^import type (?<Clause>.+?) from '(?<Specifier>[^.'][^']*)';$/gm;
@@ -167,10 +168,18 @@ async function buildLibrary(options = {}) {
167
168
  await buildLibraryFormat({ format: "esm", libFiles, preprocessPluginFactory });
168
169
  }
169
170
  async function buildLibraryTypes() {
171
+ if ((0, import_node_fs.existsSync)((0, import_path.join)(import_repo_paths.RepoPaths.Src, `${LIBRARY_REFERENCES_FILE_NAME}${import_repo_paths.RepoPaths.TsExtension}`))) {
172
+ throw new Error(`src/${LIBRARY_REFERENCES_FILE_NAME}${import_repo_paths.RepoPaths.TsExtension} collides with the generated declaration of the same name.`);
173
+ }
170
174
  await (0, import_root.execFromRoot)([...(0, import_package_manager.resolveToolCommand)({ tool: "tsc" }), "--project", "./tsconfig.types.json"]);
171
175
  const libraryFileName = (0, import_node_fs.existsSync)((0, import_path.join)(import_repo_paths.RepoPaths.Src, "library.ts")) ? "library" : "index";
172
176
  const allLibs = await collectAllLibs();
173
177
  const allTypes = collectAllTypes();
178
+ const directives = buildAllReferenceLibDirectives(allLibs) + buildAllReferenceTypesDirectives(allTypes);
179
+ await (0, import_promises.mkdir)((0, import_path.join)(import_repo_paths.RepoPaths.DistLib, import_repo_paths.RepoPaths.Cjs), { recursive: true });
180
+ await (0, import_promises.mkdir)((0, import_path.join)(import_repo_paths.RepoPaths.DistLib, import_repo_paths.RepoPaths.Esm), { recursive: true });
181
+ await (0, import_promises.writeFile)((0, import_path.join)(import_repo_paths.RepoPaths.DistLib, import_repo_paths.RepoPaths.Cjs, LIBRARY_REFERENCES_FILE_NAME + import_repo_paths.RepoPaths.DctsExtension), directives);
182
+ await (0, import_promises.writeFile)((0, import_path.join)(import_repo_paths.RepoPaths.DistLib, import_repo_paths.RepoPaths.Esm, LIBRARY_REFERENCES_FILE_NAME + import_repo_paths.RepoPaths.DmtsExtension), directives);
174
183
  for (const file of await (0, import_fs.readdirPosix)(import_repo_paths.RepoPaths.Src, { recursive: true })) {
175
184
  if (!file.endsWith(import_repo_paths.RepoPaths.DtsExtension) || file.startsWith(import_repo_paths.RepoPaths.TestHelpers)) {
176
185
  continue;
@@ -185,12 +194,11 @@ async function buildLibraryTypes() {
185
194
  let ctsContent = toCtsContent(content);
186
195
  let mtsContent = toMtsContent(content);
187
196
  if (name === libraryFileName && folder === ".") {
188
- const directives = buildAllReferenceLibDirectives(allLibs) + buildAllReferenceTypesDirectives(allTypes);
189
197
  ctsContent = directives + ctsContent;
190
198
  mtsContent = directives + mtsContent;
191
199
  } else {
192
- ctsContent = buildReferencePathDirective({ declarationFilePath: ctsPath, extension: import_repo_paths.RepoPaths.DctsExtension, libraryFileName, moduleDirectory: import_repo_paths.RepoPaths.Cjs }) + ctsContent;
193
- mtsContent = buildReferencePathDirective({ declarationFilePath: mtsPath, extension: import_repo_paths.RepoPaths.DmtsExtension, libraryFileName, moduleDirectory: import_repo_paths.RepoPaths.Esm }) + mtsContent;
200
+ ctsContent = buildReferencePathDirective({ declarationFilePath: ctsPath, extension: import_repo_paths.RepoPaths.DctsExtension, moduleDirectory: import_repo_paths.RepoPaths.Cjs }) + ctsContent;
201
+ mtsContent = buildReferencePathDirective({ declarationFilePath: mtsPath, extension: import_repo_paths.RepoPaths.DmtsExtension, moduleDirectory: import_repo_paths.RepoPaths.Esm }) + mtsContent;
194
202
  }
195
203
  await (0, import_promises.writeFile)(ctsPath, ctsContent);
196
204
  await (0, import_promises.writeFile)(mtsPath, mtsContent);
@@ -275,8 +283,8 @@ async function buildLibraryFormat(params) {
275
283
  }
276
284
  }
277
285
  function buildReferencePathDirective(params) {
278
- const { declarationFilePath, extension, libraryFileName, moduleDirectory } = params;
279
- const libraryFilePath = (0, import_path.join)(import_repo_paths.RepoPaths.DistLib, moduleDirectory, libraryFileName + extension);
286
+ const { declarationFilePath, extension, moduleDirectory } = params;
287
+ const libraryFilePath = (0, import_path.join)(import_repo_paths.RepoPaths.DistLib, moduleDirectory, LIBRARY_REFERENCES_FILE_NAME + extension);
280
288
  let relativePath = (0, import_node_path.relative)((0, import_path.dirname)(declarationFilePath), libraryFilePath).replaceAll("\\", "/");
281
289
  if (!relativePath.startsWith(".")) {
282
290
  relativePath = `./${relativePath}`;
@@ -472,4 +480,4 @@ async function writeSubpathPackageJson(folder, packageJson) {
472
480
  generateLibraryIndex,
473
481
  runBuildSteps
474
482
  });
475
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2xpYnJhcnktYnVpbGQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJy4vbnBtLnRzJztcblxuaW1wb3J0IHsgYnVpbGRDbGVhbiB9IGZyb20gJy4vYnVpbGQudHMnO1xuaW1wb3J0IHsgY2hhbmdlRXh0ZW5zaW9uUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvY2hhbmdlLWV4dGVuc2lvbi1wbHVnaW4udHMnO1xuaW1wb3J0IHsgZml4RXNtUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvZml4LWVzbS1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcHJlcHJvY2Vzc1BsdWdpbiB9IGZyb20gJy4vYnVuZGxlcnMvZXNidWlsZC1pbXBsL3ByZXByb2Nlc3MtcGx1Z2luLnRzJztcbmltcG9ydCB7IHBhcnNlVHNDb25maWcgfSBmcm9tICcuL2NoZWNrLXByb2plY3QtdHlwZXMudHMnO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICcuL2NvZGUtZ2VuZXJhdG9yLnRzJztcbmltcG9ydCB7IHJlYWRkaXJQb3NpeCB9IGZyb20gJy4vZnMudHMnO1xuaW1wb3J0IHsgd3JpdGVKc29uIH0gZnJvbSAnLi9qc29uLnRzJztcbmltcG9ydCB7IG5wbVJ1bk9wdGlvbmFsIH0gZnJvbSAnLi9ucG0tcnVuLnRzJztcbmltcG9ydCB7IGVkaXRQYWNrYWdlSnNvbiB9IGZyb20gJy4vbnBtLnRzJztcbmltcG9ydCB7IHJlc29sdmVUb29sQ29tbWFuZCB9IGZyb20gJy4vcGFja2FnZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7IFJlcG9QYXRocyB9IGZyb20gJy4vcmVwby1wYXRocy50cyc7XG5pbXBvcnQgeyBleGVjRnJvbVJvb3QgfSBmcm9tICcuL3Jvb3QudHMnO1xuXG4vKipcbiAqIFRoZSBiYW5uZXIgZXZlcnkgZW1pdHRlZCBsaWJyYXJ5IG1vZHVsZSBvcGVucyB3aXRoLlxuICovXG5leHBvcnQgY29uc3QgTElCUkFSWV9CQU5ORVIgPSBgLypcblRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEVTQlVJTERcbmlmIHlvdSB3YW50IHRvIHZpZXcgdGhlIHNvdXJjZSwgcGxlYXNlIHZpc2l0IHRoZSBnaXRodWIgcmVwb3NpdG9yeSBvZiB0aGlzIHBsdWdpblxuKi9cbmA7XG5cbi8qKlxuICogVGhlIHN0ZXBzIG9mIGEgbGlicmFyeSBidWlsZCwgaW4gdGhlIG9yZGVyIHtAbGluayBydW5CdWlsZFN0ZXBzfSBydW5zIHRoZW0uXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JVSUxEX1NURVBTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgJ2J1aWxkOmNsZWFuJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWluZGV4JyxcbiAgJ2J1aWxkOmNvbXBpbGUnLFxuICAnYnVpbGQ6dHlwZXMnLFxuICAnYnVpbGQ6dmFsaWRhdGUtZGVjbGFyYXRpb25zJyxcbiAgJ2J1aWxkOmxpYicsXG4gICdidWlsZDpnZW5lcmF0ZS1leHBvcnRzJ1xuXTtcblxuLyoqXG4gKiBUaGUgZXhwb3J0IGNvbmRpdGlvbiB0aGUgYG9ic2lkaWFuLWRldi11dGlsc2Agd29ya3NwYWNlIG1hcHMgZXZlcnkgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZSB3aXRoLCBzbyBhXG4gKiBwYWNrYWdlIHRoZXJlIGNhbiBpbXBvcnQgYSBzaWJsaW5nIHBhY2thZ2UncyBzb3VyY2UgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LiBQYXNzIGl0IHRvXG4gKiB7QGxpbmsgZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0c30gdGhyb3VnaCB7QGxpbmsgR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnMuc291cmNlQ29uZGl0aW9ufS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9DT05ESVRJT04gPSAnQG1uYW91bW92L3NvdXJjZSc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkTGlicmFyeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRMaWJyYXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBwcmVwcm9jZXNzIHBsdWdpbiBmb3Igb25lIG91dHB1dCBmb3JtYXQuIERlZmF1bHRzIHRvIHRoZSBnZW5lcmljIG9uZSwgd2hpY2ggY2FycmllcyBub1xuICAgKiBlbnZpcm9ubWVudC1zcGVjaWZpYyBgcmVxdWlyZWAgcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeT86IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBleHBvcnQgY29uZGl0aW9uIHRvIHB1dCBmaXJzdCBpbiBldmVyeSBlbnRyeSwgbWFwcGluZyB0aGUgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZS4gT25seSBhXG4gICAqIHJlcG9zaXRvcnkgaG9sZGluZyBzZXZlcmFsIHBhY2thZ2VzIHRoYXQgaW1wb3J0IGVhY2ggb3RoZXIgbmVlZHMgb25lOyBub3RoaW5nIG91dHNpZGUgaXQgc2V0cyB0aGUgY29uZGl0aW9uLCBhbmRcbiAgICogdGhlIHNvdXJjZXMgaXQgcG9pbnRzIGF0IGRvIG5vdCBzaGlwLCBzbyB0aGUgcHVibGlzaCBoYXMgdG8gc3RyaXAgaXQgYWdhaW4uIE9taXR0ZWQsIHRoZSBtYXAgaGFzIG5vbmUuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTW9kdWxlRm9ybWF0ID0gJ2NqcycgfCAnZXNtJztcblxuY29uc3QgREVDTEFSQVRJT05fUkVGRVJFTkNFX1RZUEVTID0gbmV3IFNldChbJ25vZGUnXSk7XG4vLyBTcGVsbGVkIGFwYXJ0IG9uIHB1cnBvc2U6IHtAbGluayBjb2xsZWN0QWxsTGlic30gc2NhbnMgZXZlcnkgc291cmNlIGZpbGUgb2YgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQgZm9yIHRoZVxuLy8gZGlyZWN0aXZlLCB0aGlzIG9uZSBpbmNsdWRlZCwgc28gYSBsaXRlcmFsIG9uZSBoZXJlIHdvdWxkIGJlIHJlYWQgYXMgYSBsaWIgdGhpcyBwYWNrYWdlIG5lZWRzLlxuY29uc3QgUkVGRVJFTkNFX0xJQl9ESVJFQ1RJVkUgPSBbJzxyZWZlcmVuY2UnLCAnbGliPSddLmpvaW4oJyAnKTtcbmNvbnN0IFJFRkVSRU5DRV9MSUJfUkVHX0VYUCA9IC9cXC9cXC9cXC8gPHJlZmVyZW5jZSBsaWI9XCIoPzxMaWI+W15cIl0rKVwiIFxcLz4vZ207XG5cbi8vIEEgYmFyZS1zcGVjaWZpZXIgKG5vbi1yZWxhdGl2ZSkgdHlwZS1vbmx5IGltcG9ydCwgZS5nLiBgaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztgLlxuY29uc3QgQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQID0gL15pbXBvcnQgdHlwZSAoPzxDbGF1c2U+Lis/KSBmcm9tICcoPzxTcGVjaWZpZXI+W14uJ11bXiddKiknOyQvZ207XG5cbi8vIEEgYmFyZS1zcGVjaWZpZXIgKG5vbi1yZWxhdGl2ZSkgaW5saW5lIGltcG9ydCB0eXBlIG5vZGUsIGUuZy4gYGltcG9ydChcInR5cGUtZmVzdFwiKS5Qcm9taXNhYmxlYC5cbmNvbnN0IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFAgPSAvaW1wb3J0XFwoXCIoPzxTcGVjaWZpZXI+W14uXCJdW15cIl0qKVwiXFwpL2c7XG5cbmNvbnN0IFNUQVRJQ19JTVBPUlRfUkVHX0VYUCA9IC9mcm9tICcoPzxJbXBvcnRQYXRoPi4rPylcXC50cyc7L2dtO1xuXG4vLyBJbmxpbmUgaW1wb3J0LXR5cGUgbm9kZXMgKGB0eXBlb2YgaW1wb3J0KCcuL2Zvby50cycpYCkgcHJlc2VydmUgdGhlIHNvdXJjZSBxdW90ZSBzdHlsZS5cbi8vIEhhbmQtYXV0aG9yZWQgYC5kLnRzYCBmaWxlcyBlbWl0IHNpbmdsZSBxdW90ZXM7IHRzYy1nZW5lcmF0ZWQgZGVjbGFyYXRpb25zIGVtaXQgZG91YmxlIHF1b3Rlcy5cbi8vIENhcHR1cmUgdGhlIHF1b3RlIGFuZCByZXVzZSBpdCBpbiB0aGUgcmVwbGFjZW1lbnQgc28gYm90aCBzdHlsZXMgYXJlIHJld3JpdHRlbi5cbmNvbnN0IERZTkFNSUNfSU1QT1JUX1JFR19FWFAgPSAvaW1wb3J0XFwoKD88UXVvdGU+WydcIl0pKD88SW1wb3J0UGF0aD4uKz8pXFwudHNcXGs8UXVvdGU+XFwpL2dtO1xuXG5lbnVtIEdlbmVyYXRlSW5kZXhSZXN1bHQge1xuICBTa2lwcGVkID0gJ3NraXBwZWQnLFxuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnXG59XG5cbmludGVyZmFjZSBCdWlsZExpYnJhcnlGb3JtYXRQYXJhbXMge1xuICByZWFkb25seSBmb3JtYXQ6IE1vZHVsZUZvcm1hdDtcbiAgcmVhZG9ubHkgbGliRmlsZXM6IHN0cmluZ1tdO1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeTogKGlzRXNtOiBib29sZWFuKSA9PiBQbHVnaW47XG59XG5cbmludGVyZmFjZSBCdWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmVQYXJhbXMge1xuICByZWFkb25seSBkZWNsYXJhdGlvbkZpbGVQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV4dGVuc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBsaWJyYXJ5RmlsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kdWxlRGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTZXRFeHBvcnRQYXJhbXMge1xuICByZWFkb25seSBleHBvcnRDb25kaXRpb25zOiBQYWNrYWdlSnNvbi5FeHBvcnRDb25kaXRpb25zO1xuICByZWFkb25seSBpc1dpbGRjYXJkOiBib29sZWFuO1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgc3JjRm9sZGVyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUb0Rpc3RQYXRoUGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltcG9ydFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXZlcnl0aGluZyBhbiBlYXJsaWVyIGJ1aWxkIGxlZnQ6IGBkaXN0L2AsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCB0aGUgYC5kLnRzYCBmaWxlcyBgdHNjYCB3cm90ZVxuICogYmVzaWRlIHRoZSBzb3VyY2VzIChoYW5kLWF1dGhvcmVkIG9uZXMgdW5kZXIgYEB0eXBlc2Agc3RheSksIGFuZCB0aGUgcGVyLXN1YnBhdGggYHBhY2thZ2UuanNvbmAgc3R1YnMuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xlYW5MaWJyYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBidWlsZENsZWFuKCk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoYmFzZW5hbWUoZmlsZSkgPT09IFJlcG9QYXRocy5JbmRleFRzIGFzIHN0cmluZykge1xuICAgICAgYXdhaXQgcm0oam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSk7XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuc3BsaXQoJy8nKS5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpKSB7XG4gICAgICBhd2FpdCBybShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5DdXJyZW50Rm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICgoYmFzZW5hbWUoZmlsZSkgIT09IFJlcG9QYXRocy5QYWNrYWdlSnNvbiBhcyBzdHJpbmcpIHx8IChmaWxlID09PSBSZXBvUGF0aHMuUGFja2FnZUpzb24gYXMgc3RyaW5nKSB8fCBmaWxlLnN0YXJ0c1dpdGgoUmVwb1BhdGhzLk5vZGVNb2R1bGVzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYXdhaXQgcm0oZmlsZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgZXZlcnkgc291cmNlIG1vZHVsZSwgdW5idW5kbGVkLCBpbnRvIGBkaXN0L2xpYi9janNgIChgLmNqc2ApIGFuZCBgZGlzdC9saWIvZXNtYCAoYC5tanNgKS5cbiAqXG4gKiBUaGUgb3V0cHV0IGZvbGRlcnMgbXVzdCBhbHJlYWR5IGV4aXN0OyB7QGxpbmsgYnVpbGRMaWJyYXJ5VHlwZXN9IGNyZWF0ZXMgdGhlbS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBidWlsZCBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGJvdGggZm9ybWF0cyBoYXZlIGJlZW4gYnVpbHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnkob3B0aW9uczogQnVpbGRMaWJyYXJ5T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgPSAoaXNFc206IGJvb2xlYW4pOiBQbHVnaW4gPT4gcHJlcHJvY2Vzc1BsdWdpbih7IGlzRXNtIH0pIH0gPSBvcHRpb25zO1xuICBjb25zdCBsaWJGaWxlcyA9IGF3YWl0IGdldExpYkZpbGVzKCk7XG4gIGF3YWl0IGJ1aWxkTGlicmFyeUZvcm1hdCh7IGZvcm1hdDogJ2NqcycsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9KTtcbiAgYXdhaXQgYnVpbGRMaWJyYXJ5Rm9ybWF0KHsgZm9ybWF0OiAnZXNtJywgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0pO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBkZWNsYXJhdGlvbnMgd2l0aCBgdHNjIC0tcHJvamVjdCAuL3RzY29uZmlnLnR5cGVzLmpzb25gLCB0aGVuIGNvcGllcyBlYWNoIG9uZSBpbnRvIGBkaXN0L2xpYmAgdHdpY2U6IGFzIGFcbiAqIGAuZC5jdHNgIHdob3NlIHJlbGF0aXZlIGltcG9ydHMgbmFtZSBgLmNqc2AgZmlsZXMgYW5kIHdob3NlIGJhcmUgdHlwZSBpbXBvcnRzIGNhcnJ5IGByZXNvbHV0aW9uLW1vZGU6IGltcG9ydGAsIGFuZFxuICogYXMgYSBgLmQubXRzYCB3aG9zZSByZWxhdGl2ZSBpbXBvcnRzIG5hbWUgYC5tanNgIGZpbGVzLlxuICpcbiAqIFRoZSBsaWJyYXJ5J3Mgcm9vdCBkZWNsYXJhdGlvbiAoYGxpYnJhcnkudHNgIHdoZXJlIHRoZSBwYWNrYWdlIGhhcyBvbmUsIG90aGVyd2lzZSB0aGUgZ2VuZXJhdGVkIGBpbmRleC50c2ApIGNhcnJpZXNcbiAqIGV2ZXJ5IGBsaWJgIGFuZCBgdHlwZXNgIHJlZmVyZW5jZSB0aGUgcGFja2FnZSBuZWVkczsgZXZlcnkgb3RoZXIgZGVjbGFyYXRpb24gcmVmZXJlbmNlcyBpdCBieSBwYXRoLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVjbGFyYXRpb25zIGhhdmUgYmVlbiB3cml0dGVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5VHlwZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChbLi4ucmVzb2x2ZVRvb2xDb21tYW5kKHsgdG9vbDogJ3RzYycgfSksICctLXByb2plY3QnLCAnLi90c2NvbmZpZy50eXBlcy5qc29uJ10pO1xuXG4gIGNvbnN0IGxpYnJhcnlGaWxlTmFtZSA9IGV4aXN0c1N5bmMoam9pbihSZXBvUGF0aHMuU3JjLCAnbGlicmFyeS50cycpKSA/ICdsaWJyYXJ5JyA6ICdpbmRleCc7XG4gIGNvbnN0IGFsbExpYnMgPSBhd2FpdCBjb2xsZWN0QWxsTGlicygpO1xuICBjb25zdCBhbGxUeXBlcyA9IGNvbGxlY3RBbGxUeXBlcygpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoIWZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgfHwgZmlsZS5zdGFydHNXaXRoKFJlcG9QYXRocy5UZXN0SGVscGVycykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoZmlsZSk7XG4gICAgY29uc3QgbmFtZSA9IGJhc2VuYW1lKGZpbGUsIFJlcG9QYXRocy5EdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpLCAndXRmLTgnKTtcblxuICAgIGNvbnN0IGN0c1BhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzLCBmb2xkZXIsIG5hbWUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgbXRzUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20sIGZvbGRlciwgbmFtZSArIFJlcG9QYXRocy5EbXRzRXh0ZW5zaW9uKTtcblxuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoY3RzUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUobXRzUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgbGV0IGN0c0NvbnRlbnQgPSB0b0N0c0NvbnRlbnQoY29udGVudCk7XG4gICAgbGV0IG10c0NvbnRlbnQgPSB0b010c0NvbnRlbnQoY29udGVudCk7XG5cbiAgICBpZiAobmFtZSA9PT0gbGlicmFyeUZpbGVOYW1lICYmIGZvbGRlciA9PT0gJy4nKSB7XG4gICAgICBjb25zdCBkaXJlY3RpdmVzID0gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKGFsbExpYnMpICsgYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXMoYWxsVHlwZXMpO1xuICAgICAgY3RzQ29udGVudCA9IGRpcmVjdGl2ZXMgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGRpcmVjdGl2ZXMgKyBtdHNDb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBjdHNDb250ZW50ID0gYnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlKHsgZGVjbGFyYXRpb25GaWxlUGF0aDogY3RzUGF0aCwgZXh0ZW5zaW9uOiBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbiwgbGlicmFyeUZpbGVOYW1lLCBtb2R1bGVEaXJlY3Rvcnk6IFJlcG9QYXRocy5DanMgfSlcbiAgICAgICAgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZSh7IGRlY2xhcmF0aW9uRmlsZVBhdGg6IG10c1BhdGgsIGV4dGVuc2lvbjogUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24sIGxpYnJhcnlGaWxlTmFtZSwgbW9kdWxlRGlyZWN0b3J5OiBSZXBvUGF0aHMuRXNtIH0pXG4gICAgICAgICsgbXRzQ29udGVudDtcbiAgICB9XG5cbiAgICBhd2FpdCB3cml0ZUZpbGUoY3RzUGF0aCwgY3RzQ29udGVudCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKG10c1BhdGgsIG10c0NvbnRlbnQpO1xuICB9XG59XG5cbi8qKlxuICogUmVnZW5lcmF0ZXMgdGhlIGBleHBvcnRzYCBtYXAgb2YgdGhlIHBhY2thZ2UncyBgcGFja2FnZS5qc29uYCBmcm9tIGl0cyBzb3VyY2UgZm9sZGVycywgYW5kIHdyaXRlcyBhIGBwYWNrYWdlLmpzb25gXG4gKiBzdHViIHBlciBzdWJwYXRoIGZvciByZXNvbHZlcnMgdGhhdCBkbyBub3QgcmVhZCBgZXhwb3J0c2AuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWFwIGlzIGN1cnJlbnQuXG4gKiBAdGhyb3dzIElmIHRoZSBtYXAgY2hhbmdlZCwgc28gdGhlIGNoYW5nZSBnZXRzIHJldmlld2VkIGFuZCBjb21taXR0ZWQgcmF0aGVyIHRoYW4gc2hpcHBlZCB1bnNlZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzKG9wdGlvbnM6IEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzb3VyY2VDb25kaXRpb24gfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHNyY0ZvbGRlcnM6IHN0cmluZ1tdID0gW1JlcG9QYXRocy5TcmNdO1xuXG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmICghZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBqb2luKGRpcmVudC5wYXJlbnRQYXRoLCBkaXJlbnQubmFtZSk7XG5cbiAgICBpZiAocGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuU3R5bGVzKSB8fCBwYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UZXN0SGVscGVycykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHNyY0ZvbGRlcnMucHVzaChwYXRoKTtcbiAgfVxuXG4gIHNyY0ZvbGRlcnMuc29ydCgpO1xuXG4gIGxldCBpc0NoYW5nZWQgPSBmYWxzZTtcblxuICBhd2FpdCBlZGl0UGFja2FnZUpzb24oYXN5bmMgKHBhY2thZ2VKc29uKSA9PiB7XG4gICAgY29uc3Qgb2xkRXhwb3J0cyA9IHBhY2thZ2VKc29uLmV4cG9ydHM7XG4gICAgY29uc3QgZXhwb3J0Q29uZGl0aW9uczogUGFja2FnZUpzb24uRXhwb3J0Q29uZGl0aW9ucyA9IHt9O1xuICAgIHBhY2thZ2VKc29uLmV4cG9ydHMgPSBleHBvcnRDb25kaXRpb25zO1xuICAgIGZvciAoY29uc3Qgc3JjRm9sZGVyIG9mIHNyY0ZvbGRlcnMpIHtcbiAgICAgIGF3YWl0IHNldEV4cG9ydCh7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQ6IGZhbHNlLCBzb3VyY2VDb25kaXRpb24sIHNyY0ZvbGRlciB9KTtcbiAgICAgIGF3YWl0IHNldEV4cG9ydCh7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQ6IHRydWUsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0pO1xuICAgIH1cblxuICAgIGlzQ2hhbmdlZCA9ICFpc0RlZXBFcXVhbChvbGRFeHBvcnRzLCBwYWNrYWdlSnNvbi5leHBvcnRzKTtcbiAgfSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gSXQgY2hhbmdlZCBpbiB0aGUgYGVkaXRQYWNrYWdlSnNvbmAsIEVTTGludCBtaXN0YWtlbmx5IGRvZXMgbm90IHJlY29nbml6ZSBpdC5cbiAgaWYgKGlzQ2hhbmdlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGFja2FnZSBleHBvcnRzIGhhdmUgY2hhbmdlZC4gUGxlYXNlIHJldmlldyB0aGUgY2hhbmdlcyBhbmQgY29tbWl0IHRoZW0uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYW4gYGluZGV4LnRzYCBiYXJyZWwgaW4gZXZlcnkgc291cmNlIGZvbGRlciB0aGF0IGhhcyBzb21ldGhpbmcgdG8gZXhwb3J0LCByZS1leHBvcnRpbmcgZWFjaCBtb2R1bGUgYW5kXG4gKiBlYWNoIHN1Yi1iYXJyZWwgdW5kZXIgaXRzIG93biBuYW1lLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYmFycmVscyBoYXZlIGJlZW4gd3JpdHRlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGlicmFyeUluZGV4KCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBnZW5lcmF0ZUluZGV4KFJlcG9QYXRocy5TcmMpO1xufVxuXG4vKipcbiAqIFJ1bnMgZWFjaCBuYW1lZCBucG0gc2NyaXB0IHRoZSBwYWNrYWdlIGRlZmluZXMsIGluIG9yZGVyLCBza2lwcGluZyB0aGUgb25lcyBpdCBkb2VzIG5vdCBkZWZpbmUuXG4gKlxuICogQHBhcmFtIHN0ZXBzIC0gVGhlIG5wbSBzY3JpcHQgbmFtZXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlcnkgc3RlcCBoYXMgcnVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGRTdGVwcyhzdGVwczogcmVhZG9ubHkgc3RyaW5nW10gPSBMSUJSQVJZX0JVSUxEX1NURVBTKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3Qgc3RlcCBvZiBzdGVwcykge1xuICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKHN0ZXApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhsaWJzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtcbiAgICBsaWJzXG4gICAgICAubWFwKChsaWIpID0+IGAvLy8gJHtSRUZFUkVOQ0VfTElCX0RJUkVDVElWRX1cIiR7bGlifVwiIC8+YClcbiAgICAgIC5qb2luKCdcXG4nKVxuICB9XFxuYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXModHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVzLmxlbmd0aCA9PT0gMFxuICAgID8gJydcbiAgICA6IGAke1xuICAgICAgdHlwZXNcbiAgICAgICAgLm1hcCgodHlwZSkgPT4gYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiJHt0eXBlfVwiIC8+YClcbiAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgfVxcbmA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeUZvcm1hdChwYXJhbXM6IEJ1aWxkTGlicmFyeUZvcm1hdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGZvcm1hdCwgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGZvcm1hdCA9PT0gJ2NqcycgPyBSZXBvUGF0aHMuQ2pzRXh0ZW5zaW9uIDogUmVwb1BhdGhzLk1qc0V4dGVuc2lvbjtcbiAgY29uc3QgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7XG4gICAgLy8gRXhwbGljaXQsIGJlY2F1c2UgZXNidWlsZCBvdGhlcndpc2UgdGFrZXMgdGhlIGZvbGRlciBpdHMgc2VydmljZSBwcm9jZXNzIHN0YXJ0ZWQgaW4uXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gZXNidWlsZCdzIG93biBvcHRpb24gbmFtZS5cbiAgICBhYnNXb3JraW5nRGlyOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGJhbm5lcjoge1xuICAgICAganM6IExJQlJBUllfQkFOTkVSXG4gICAgfSxcbiAgICBidW5kbGU6IGZhbHNlLFxuICAgIGVudHJ5UG9pbnRzOiBsaWJGaWxlcyxcbiAgICBmb3JtYXQsXG4gICAgbG9nTGV2ZWw6ICdpbmZvJyxcbiAgICBvdXRkaXI6IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIGZvcm1hdCksXG4gICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICBwbHVnaW5zOiBbXG4gICAgICBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeShmb3JtYXQgPT09ICdlc20nKSxcbiAgICAgIGZpeEVzbVBsdWdpbigpLFxuICAgICAgY2hhbmdlRXh0ZW5zaW9uUGx1Z2luKGV4dGVuc2lvbilcbiAgICBdLFxuICAgIHNvdXJjZW1hcDogJ2lubGluZScsXG4gICAgdGFyZ2V0OiAnRVMyMDIyJyxcbiAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICB3cml0ZTogZmFsc2VcbiAgfTtcblxuICBjb25zdCBidWlsZENvbnRleHQgPSBhd2FpdCBjb250ZXh0KGJ1aWxkT3B0aW9ucyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYnVpbGRDb250ZXh0LnJlYnVpbGQoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBidWlsZENvbnRleHQuZGlzcG9zZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZShwYXJhbXM6IEJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZVBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZGVjbGFyYXRpb25GaWxlUGF0aCwgZXh0ZW5zaW9uLCBsaWJyYXJ5RmlsZU5hbWUsIG1vZHVsZURpcmVjdG9yeSB9ID0gcGFyYW1zO1xuICBjb25zdCBsaWJyYXJ5RmlsZVBhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBtb2R1bGVEaXJlY3RvcnksIGxpYnJhcnlGaWxlTmFtZSArIGV4dGVuc2lvbik7XG4gIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZU5hdGl2ZShkaXJuYW1lKGRlY2xhcmF0aW9uRmlsZVBhdGgpLCBsaWJyYXJ5RmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICB9XG4gIHJldHVybiBgLy8vIDxyZWZlcmVuY2UgcGF0aD1cIiR7cmVsYXRpdmVQYXRofVwiIC8+XFxuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdEFsbExpYnMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAvLyBUaGUgUkVTT0xWRUQgb3B0aW9ucywgYmVjYXVzZSBhIHBhY2thZ2UncyBgdHNjb25maWcuanNvbmAgaW5oZXJpdHMgYGxpYmAgZnJvbSB0aGUgc2hhcmVkIGJhc2UuIFRoZSByZXNvbHZlZFxuICAvLyBuYW1lcyBhcmUgZmlsZSBuYW1lcyAoYGxpYi5kb20uaXRlcmFibGUuZC50c2ApLCBzbyB0aGV5IGFyZSBtYXBwZWQgYmFjayBvbnRvIHRoZSBuYW1lcyBhIGRpcmVjdGl2ZSB0YWtlcy5cbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICBjb25zdCBsaWJzID0gbmV3IFNldCgob3B0aW9ucy5saWIgPz8gW10pLm1hcCgobGliKSA9PiBsaWIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ebGliXFwuLywgJycpLnJlcGxhY2UoL1xcLmRcXC50cyQvLCAnJykpKTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKCcudHMnKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlQ29udGVudCA9IHJlYWRGaWxlU3luYyhqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpLCAndXRmLTgnKTtcbiAgICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIGFsd2F5cyBjYXB0dXJlcyBpdHMgb25lIGdyb3VwLCBzbyBubyBmYWxsYmFjayBmb3IgYSBtaXNzaW5nIG9uZSBpcyBuZWVkZWQuXG4gICAgZm9yIChjb25zdCBbLCBsaWJdIG9mIHNvdXJjZUNvbnRlbnQubWF0Y2hBbGwoUkVGRVJFTkNFX0xJQl9SRUdfRVhQKSkge1xuICAgICAgbGlicy5hZGQoU3RyaW5nKGxpYikudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFsuLi5saWJzXS5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RBbGxUeXBlcygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhSZXBvUGF0aHMuVHNDb25maWdKc29uKTtcbiAgcmV0dXJuIChvcHRpb25zLnR5cGVzID8/IFtdKVxuICAgIC5maWx0ZXIoKHR5cGUpID0+IERFQ0xBUkFUSU9OX1JFRkVSRU5DRV9UWVBFUy5oYXModHlwZSkpXG4gICAgLnNvcnQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleChmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8R2VuZXJhdGVJbmRleFJlc3VsdD4ge1xuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgcmVhZGRpclBvc2l4KGZvbGRlciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBtYXliZUxpbmVzID0gYXdhaXQgYXN5bmNNYXAoZGlyZW50cywgKGRpcmVudCkgPT4gaGFuZGxlSW5kZXhEaXJlbnQoZm9sZGVyLCBkaXJlbnQpKTtcbiAgY29uc3QgbGluZXMgPSBtYXliZUxpbmVzLmZpbHRlcigobGluZSkgPT4gbGluZSAhPT0gdW5kZWZpbmVkKTtcblxuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU2tpcHBlZDtcbiAgfVxuXG4gIGF3YWl0IGdlbmVyYXRlKGpvaW4oZm9sZGVyLCBSZXBvUGF0aHMuSW5kZXhUcyksIGxpbmVzKTtcbiAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGliRmlsZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBsZXQgZmlsZXMgPSBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGZpbGVzID0gZmlsZXMubWFwKChmaWxlKSA9PiBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpKTtcbiAgcmV0dXJuIGZpbGVzLmZpbHRlcigoZmlsZSkgPT5cbiAgICBmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5Uc0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoJy50ZXN0LnRzJylcbiAgICAmJiAhZmlsZS5pbmNsdWRlcyhgLyR7UmVwb1BhdGhzLlRlc3RIZWxwZXJzfS9gKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVJbmRleERpcmVudChmb2xkZXI6IHN0cmluZywgZGlyZW50OiBEaXJlbnQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoaXNFeGNsdWRlZEZyb21JbmRleChmb2xkZXIsIGRpcmVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgc291cmNlRmlsZTogc3RyaW5nO1xuICBsZXQgbmFtZTogc3RyaW5nO1xuICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZUluZGV4KGpvaW4oZm9sZGVyLCBkaXJlbnQubmFtZSkpO1xuICAgIGlmIChyZXN1bHQgIT09IEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShqb2luKGRpcmVudC5uYW1lLCBSZXBvUGF0aHMuSW5kZXhUcykpO1xuICAgIG5hbWUgPSBkaXJlbnQubmFtZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKGRpcmVudC5uYW1lKTtcbiAgICBuYW1lID0gYmFzZW5hbWUoZGlyZW50Lm5hbWUsIGV4dGVuc2lvbik7XG4gICAgc291cmNlRmlsZSA9IG5vcm1hbGl6ZUlmUmVsYXRpdmUoZGlyZW50Lm5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIGBleHBvcnQgKiBhcyAnJHtuYW1lfScgZnJvbSAnJHtzb3VyY2VGaWxlfSc7YDtcbn1cblxuZnVuY3Rpb24gaXNFeGNsdWRlZEZpbGVOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gIW5hbWUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSB8fCBuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpIHx8IG5hbWUgPT09ICdzZXR1cC50cycgfHwgbmFtZS5lbmRzV2l0aCgnLXNldHVwLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGcm9tSW5kZXgoZm9sZGVyOiBzdHJpbmcsIGRpcmVudDogRGlyZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IGV4Y2x1ZGVkTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JlcG9QYXRocy5JbmRleFRzLCBSZXBvUGF0aHMuVHlwZXMsIFJlcG9QYXRocy5TdHlsZXMsIFJlcG9QYXRocy5UZXN0SGVscGVyc107XG4gIGNvbnN0IGlzRXhjbHVkZWRFbnRyeSA9IGV4Y2x1ZGVkTmFtZXMuaW5jbHVkZXMoZGlyZW50Lm5hbWUpIHx8IGRpcmVudC5uYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pIHx8IGZvbGRlci5zcGxpdCgnLycpLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIHJldHVybiBpc0V4Y2x1ZGVkRW50cnkgfHwgKGRpcmVudC5pc0ZpbGUoKSAmJiBpc0V4Y2x1ZGVkRmlsZU5hbWUoZGlyZW50Lm5hbWUpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0RXhwb3J0KHBhcmFtczogU2V0RXhwb3J0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZCwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgaW1wb3J0UGF0aCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IHNyY0ZvbGRlcixcbiAgICByZXBsYWNlcjogUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsXG4gICAgc2VhcmNoVmFsdWU6IFJlcG9QYXRocy5TcmNcbiAgfSk7XG4gIGNvbnN0IGNvbmRpdGlvblBhdGggPSBpc1dpbGRjYXJkID8gYCR7aW1wb3J0UGF0aH0vJHtSZXBvUGF0aHMuQW55fWAgOiBpbXBvcnRQYXRoO1xuICBjb25zdCBkbXRzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5Fc20sIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RG10cyA6IFJlcG9QYXRocy5JbmRleERtdHMgfSk7XG4gIGNvbnN0IGRjdHNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkNqcywgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlEY3RzIDogUmVwb1BhdGhzLkluZGV4RGN0cyB9KTtcbiAgY29uc3QgZG10c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRtdHNQYXRoKTtcbiAgY29uc3QgZGN0c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRjdHNQYXRoKTtcblxuICBpZiAoIWlzV2lsZGNhcmQgJiYgIWV4aXN0c1N5bmMoZGN0c1BhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNUeXBlc09ubHkgPSBpbXBvcnRQYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIGNvbnN0IG1qc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueU1qcyA6IFJlcG9QYXRocy5JbmRleE1qcyB9KTtcbiAgY29uc3QgY2pzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55Q2pzIDogUmVwb1BhdGhzLkluZGV4Q2pzIH0pO1xuXG4gIGlmIChpc1R5cGVzT25seSkge1xuICAgIGV4cG9ydENvbmRpdGlvbnNbY29uZGl0aW9uUGF0aF0gPSB7XG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGhcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgaW1wb3J0UGF0aCwgaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlUcyA6IFJlcG9QYXRocy5JbmRleFRzKSk7XG5cbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgICAvLyBGaXJzdCwgc28gaXQgd2lucyB3aGVyZXZlciBpdCBpcyBzZXQ6IGluc2lkZSB0aGUgcmVwb3NpdG9yeSwgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LlxuICAgICAgLi4uKHNvdXJjZUNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgW3NvdXJjZUNvbmRpdGlvbl06IHNvdXJjZVBhdGggfSksXG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBtanNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGgsXG4gICAgICAgIGRlZmF1bHQ6IGNqc1BhdGhcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpbXBvcnRQYXRoID09PSBSZXBvUGF0aHMuQ3VycmVudEZvbGRlciBhcyBzdHJpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzV2lsZGNhcmQpIHtcbiAgICBhd2FpdCB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihcbiAgICAgIGltcG9ydFBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzOiByZWxhdGl2ZShpbXBvcnRQYXRoLCBkY3RzUGF0aCkgfVxuICAgICAgICA6IHsgbWFpbjogcmVsYXRpdmUoaW1wb3J0UGF0aCwgY2pzUGF0aCksIG1vZHVsZTogcmVsYXRpdmUoaW1wb3J0UGF0aCwgbWpzUGF0aCksIHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoZGN0c0ZvbGRlclBhdGgpKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgcGFja2FnZUpzb25Gb2xkZXJQYXRoID0gam9pbihpbXBvcnRQYXRoLCBuYW1lKTtcbiAgICBjb25zdCB0eXBlcyA9IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSk7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBwYWNrYWdlSnNvbkZvbGRlclBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgbWFpbjogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRjdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLkNqc0V4dGVuc2lvbikpLFxuICAgICAgICAgIG1vZHVsZTogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRtdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLk1qc0V4dGVuc2lvbikpLFxuICAgICAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgIHR5cGVzXG4gICAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ3RzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGNvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdmcm9tIFxcJyQ8SW1wb3J0UGF0aD4uY2pzXFwnOycsXG4gICAgc2VhcmNoVmFsdWU6IFNUQVRJQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoJDxRdW90ZT4kPEltcG9ydFBhdGg+LmNqcyQ8UXVvdGU+KScsXG4gICAgc2VhcmNoVmFsdWU6IERZTkFNSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG5cbiAgLy8gQSBgLmQuY3RzYCBmaWxlIGlzIGEgQ29tbW9uSlMgbW9kdWxlLiBUeXBlLW9ubHkgaW1wb3J0cyBvZiBhIGJhcmUgc3BlY2lmaWVyIHJlc29sdmluZyB0byBhblxuICAvLyBFU00tb25seSBwYWNrYWdlIG5lZWQgYSBgcmVzb2x1dGlvbi1tb2RlYCBhdHRyaWJ1dGUsIGVsc2UgYHRzY2AgcmVwb3J0cyBUUzE1NDEgLyBUUzE1NDIuXG4gIC8vIFBhc3NpbmcgYCdpbXBvcnQnYCBpcyB2YWxpZCBmb3IgQ29tbW9uSlMgdGFyZ2V0cyB0b28sIHNvIGV2ZXJ5IGJhcmUgc3BlY2lmaWVyIHJlY2VpdmVzIGl0LlxuICAvLyBUaGUgRVNNIGAuZC5tdHNgIG5lZWRzIG5vIHN1Y2ggYXR0cmlidXRlLCBzbyB0aGlzIHRyYW5zZm9ybSBydW5zIG9uIENvbW1vbkpTIGNvbnRlbnQgb25seS5cbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQgdHlwZSAkPENsYXVzZT4gZnJvbSBcXCckPFNwZWNpZmllcj5cXCcgd2l0aCB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH07JyxcbiAgICBzZWFyY2hWYWx1ZTogQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY3RzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydChcIiQ8U3BlY2lmaWVyPlwiLCB7IHdpdGg6IHsgXFwncmVzb2x1dGlvbi1tb2RlXFwnOiBcXCdpbXBvcnRcXCcgfSB9KScsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRGlzdFBhdGgocGFyYW1zOiBUb0Rpc3RQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgcGFyYW1zLmZvcm1hdCwgcGFyYW1zLmltcG9ydFBhdGgsIHBhcmFtcy5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHRvTXRzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtdHNDb250ZW50ID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY29udGVudCxcbiAgICByZXBsYWNlcjogJ2Zyb20gXFwnJDxJbXBvcnRQYXRoPi5tanNcXCc7JyxcbiAgICBzZWFyY2hWYWx1ZTogU1RBVElDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogbXRzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydCgkPFF1b3RlPiQ8SW1wb3J0UGF0aD4ubWpzJDxRdW90ZT4pJyxcbiAgICBzZWFyY2hWYWx1ZTogRFlOQU1JQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oZm9sZGVyOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBta2Rpcihmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUpzb24oam9pbihmb2xkZXIsIFJlcG9QYXRocy5QYWNrYWdlSnNvbiksIHBhY2thZ2VKc29uKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWlCQSxtQkFBeUI7QUFDekIsMEJBQTRCO0FBQzVCLGtCQU9PO0FBQ1Asb0JBQTJCO0FBQzNCLHFCQUF3QjtBQUN4QixxQkFHTztBQUNQLHNCQUtPO0FBQ1AsdUJBQTJDO0FBQzNDLDBCQUFvQjtBQUlwQixtQkFBMkI7QUFDM0IscUNBQXNDO0FBQ3RDLDRCQUE2QjtBQUM3QiwrQkFBaUM7QUFDakMsaUNBQThCO0FBQzlCLDRCQUF5QjtBQUN6QixnQkFBNkI7QUFDN0Isa0JBQTBCO0FBQzFCLHFCQUErQjtBQUMvQixpQkFBZ0M7QUFDaEMsNkJBQW1DO0FBQ25DLHdCQUEwQjtBQUMxQixrQkFBNkI7QUFLdEIsTUFBTSxpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVN2QixNQUFNLHNCQUF5QztBQUFBLEVBQ3BEO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFPTyxNQUFNLG1CQUFtQjtBQTJCaEMsTUFBTSw4QkFBOEIsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUdwRCxNQUFNLDBCQUEwQixDQUFDLGNBQWMsTUFBTSxFQUFFLEtBQUssR0FBRztBQUMvRCxNQUFNLHdCQUF3QjtBQUc5QixNQUFNLDJCQUEyQjtBQUdqQyxNQUFNLGtDQUFrQztBQUV4QyxNQUFNLHdCQUF3QjtBQUs5QixNQUFNLHlCQUF5QjtBQXVDL0IsZUFBc0Isb0JBQW1DO0FBQ3ZELFlBQU0seUJBQVc7QUFDakIs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
483
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2xpYnJhcnktYnVpbGQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJy4vbnBtLnRzJztcblxuaW1wb3J0IHsgYnVpbGRDbGVhbiB9IGZyb20gJy4vYnVpbGQudHMnO1xuaW1wb3J0IHsgY2hhbmdlRXh0ZW5zaW9uUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvY2hhbmdlLWV4dGVuc2lvbi1wbHVnaW4udHMnO1xuaW1wb3J0IHsgZml4RXNtUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvZml4LWVzbS1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcHJlcHJvY2Vzc1BsdWdpbiB9IGZyb20gJy4vYnVuZGxlcnMvZXNidWlsZC1pbXBsL3ByZXByb2Nlc3MtcGx1Z2luLnRzJztcbmltcG9ydCB7IHBhcnNlVHNDb25maWcgfSBmcm9tICcuL2NoZWNrLXByb2plY3QtdHlwZXMudHMnO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICcuL2NvZGUtZ2VuZXJhdG9yLnRzJztcbmltcG9ydCB7IHJlYWRkaXJQb3NpeCB9IGZyb20gJy4vZnMudHMnO1xuaW1wb3J0IHsgd3JpdGVKc29uIH0gZnJvbSAnLi9qc29uLnRzJztcbmltcG9ydCB7IG5wbVJ1bk9wdGlvbmFsIH0gZnJvbSAnLi9ucG0tcnVuLnRzJztcbmltcG9ydCB7IGVkaXRQYWNrYWdlSnNvbiB9IGZyb20gJy4vbnBtLnRzJztcbmltcG9ydCB7IHJlc29sdmVUb29sQ29tbWFuZCB9IGZyb20gJy4vcGFja2FnZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7IFJlcG9QYXRocyB9IGZyb20gJy4vcmVwby1wYXRocy50cyc7XG5pbXBvcnQgeyBleGVjRnJvbVJvb3QgfSBmcm9tICcuL3Jvb3QudHMnO1xuXG4vKipcbiAqIFRoZSBiYW5uZXIgZXZlcnkgZW1pdHRlZCBsaWJyYXJ5IG1vZHVsZSBvcGVucyB3aXRoLlxuICovXG5leHBvcnQgY29uc3QgTElCUkFSWV9CQU5ORVIgPSBgLypcblRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEVTQlVJTERcbmlmIHlvdSB3YW50IHRvIHZpZXcgdGhlIHNvdXJjZSwgcGxlYXNlIHZpc2l0IHRoZSBnaXRodWIgcmVwb3NpdG9yeSBvZiB0aGlzIHBsdWdpblxuKi9cbmA7XG5cbi8qKlxuICogVGhlIHN0ZXBzIG9mIGEgbGlicmFyeSBidWlsZCwgaW4gdGhlIG9yZGVyIHtAbGluayBydW5CdWlsZFN0ZXBzfSBydW5zIHRoZW0uXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JVSUxEX1NURVBTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgJ2J1aWxkOmNsZWFuJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWluZGV4JyxcbiAgJ2J1aWxkOmNvbXBpbGUnLFxuICAnYnVpbGQ6dHlwZXMnLFxuICAnYnVpbGQ6dmFsaWRhdGUtZGVjbGFyYXRpb25zJyxcbiAgJ2J1aWxkOmxpYicsXG4gICdidWlsZDpnZW5lcmF0ZS1leHBvcnRzJ1xuXTtcblxuLyoqXG4gKiBUaGUgZXhwb3J0IGNvbmRpdGlvbiB0aGUgYG9ic2lkaWFuLWRldi11dGlsc2Agd29ya3NwYWNlIG1hcHMgZXZlcnkgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZSB3aXRoLCBzbyBhXG4gKiBwYWNrYWdlIHRoZXJlIGNhbiBpbXBvcnQgYSBzaWJsaW5nIHBhY2thZ2UncyBzb3VyY2UgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LiBQYXNzIGl0IHRvXG4gKiB7QGxpbmsgZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0c30gdGhyb3VnaCB7QGxpbmsgR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnMuc291cmNlQ29uZGl0aW9ufS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9DT05ESVRJT04gPSAnQG1uYW91bW92L3NvdXJjZSc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkTGlicmFyeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRMaWJyYXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBwcmVwcm9jZXNzIHBsdWdpbiBmb3Igb25lIG91dHB1dCBmb3JtYXQuIERlZmF1bHRzIHRvIHRoZSBnZW5lcmljIG9uZSwgd2hpY2ggY2FycmllcyBub1xuICAgKiBlbnZpcm9ubWVudC1zcGVjaWZpYyBgcmVxdWlyZWAgcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeT86IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBleHBvcnQgY29uZGl0aW9uIHRvIHB1dCBmaXJzdCBpbiBldmVyeSBlbnRyeSwgbWFwcGluZyB0aGUgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZS4gT25seSBhXG4gICAqIHJlcG9zaXRvcnkgaG9sZGluZyBzZXZlcmFsIHBhY2thZ2VzIHRoYXQgaW1wb3J0IGVhY2ggb3RoZXIgbmVlZHMgb25lOyBub3RoaW5nIG91dHNpZGUgaXQgc2V0cyB0aGUgY29uZGl0aW9uLCBhbmRcbiAgICogdGhlIHNvdXJjZXMgaXQgcG9pbnRzIGF0IGRvIG5vdCBzaGlwLCBzbyB0aGUgcHVibGlzaCBoYXMgdG8gc3RyaXAgaXQgYWdhaW4uIE9taXR0ZWQsIHRoZSBtYXAgaGFzIG5vbmUuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTW9kdWxlRm9ybWF0ID0gJ2NqcycgfCAnZXNtJztcblxuY29uc3QgREVDTEFSQVRJT05fUkVGRVJFTkNFX1RZUEVTID0gbmV3IFNldChbJ25vZGUnXSk7XG5cbi8vIFRoZSBkZWNsYXJhdGlvbiB0aGF0IGNhcnJpZXMgb25seSB0aGUgYGxpYmAgYW5kIGB0eXBlc2AgcmVmZXJlbmNlcy4gRXZlcnkgZGVjbGFyYXRpb24gYnV0IHRoZSByb290IG9uZSByZWZlcmVuY2VzXG4vLyBpdCwgcmF0aGVyIHRoYW4gdGhlIHJvb3QgYmFycmVsLCB3aGljaCB3b3VsZCBsb2FkIGV2ZXJ5IG1vZHVsZSBvZiB0aGUgcGFja2FnZSwgb3B0aW9uYWwgcGVlcnMnIHR5cGVzIGluY2x1ZGVkLlxuY29uc3QgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSA9ICdsaWJyYXJ5LXJlZmVyZW5jZXMnO1xuLy8gU3BlbGxlZCBhcGFydCBvbiBwdXJwb3NlOiB7QGxpbmsgY29sbGVjdEFsbExpYnN9IHNjYW5zIGV2ZXJ5IHNvdXJjZSBmaWxlIG9mIHRoZSBwYWNrYWdlIGJlaW5nIGJ1aWx0IGZvciB0aGVcbi8vIGRpcmVjdGl2ZSwgdGhpcyBvbmUgaW5jbHVkZWQsIHNvIGEgbGl0ZXJhbCBvbmUgaGVyZSB3b3VsZCBiZSByZWFkIGFzIGEgbGliIHRoaXMgcGFja2FnZSBuZWVkcy5cbmNvbnN0IFJFRkVSRU5DRV9MSUJfRElSRUNUSVZFID0gWyc8cmVmZXJlbmNlJywgJ2xpYj0nXS5qb2luKCcgJyk7XG5jb25zdCBSRUZFUkVOQ0VfTElCX1JFR19FWFAgPSAvXFwvXFwvXFwvIDxyZWZlcmVuY2UgbGliPVwiKD88TGliPlteXCJdKylcIiBcXC8+L2dtO1xuXG4vLyBBIGJhcmUtc3BlY2lmaWVyIChub24tcmVsYXRpdmUpIHR5cGUtb25seSBpbXBvcnQsIGUuZy4gYGltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7YC5cbmNvbnN0IEJBUkVfVFlQRV9JTVBPUlRfUkVHX0VYUCA9IC9eaW1wb3J0IHR5cGUgKD88Q2xhdXNlPi4rPykgZnJvbSAnKD88U3BlY2lmaWVyPlteLiddW14nXSopJzskL2dtO1xuXG4vLyBBIGJhcmUtc3BlY2lmaWVyIChub24tcmVsYXRpdmUpIGlubGluZSBpbXBvcnQgdHlwZSBub2RlLCBlLmcuIGBpbXBvcnQoXCJ0eXBlLWZlc3RcIikuUHJvbWlzYWJsZWAuXG5jb25zdCBCQVJFX0lOTElORV9JTVBPUlRfVFlQRV9SRUdfRVhQID0gL2ltcG9ydFxcKFwiKD88U3BlY2lmaWVyPlteLlwiXVteXCJdKilcIlxcKS9nO1xuXG5jb25zdCBTVEFUSUNfSU1QT1JUX1JFR19FWFAgPSAvZnJvbSAnKD88SW1wb3J0UGF0aD4uKz8pXFwudHMnOy9nbTtcblxuLy8gSW5saW5lIGltcG9ydC10eXBlIG5vZGVzIChgdHlwZW9mIGltcG9ydCgnLi9mb28udHMnKWApIHByZXNlcnZlIHRoZSBzb3VyY2UgcXVvdGUgc3R5bGUuXG4vLyBIYW5kLWF1dGhvcmVkIGAuZC50c2AgZmlsZXMgZW1pdCBzaW5nbGUgcXVvdGVzOyB0c2MtZ2VuZXJhdGVkIGRlY2xhcmF0aW9ucyBlbWl0IGRvdWJsZSBxdW90ZXMuXG4vLyBDYXB0dXJlIHRoZSBxdW90ZSBhbmQgcmV1c2UgaXQgaW4gdGhlIHJlcGxhY2VtZW50IHNvIGJvdGggc3R5bGVzIGFyZSByZXdyaXR0ZW4uXG5jb25zdCBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQID0gL2ltcG9ydFxcKCg/PFF1b3RlPlsnXCJdKSg/PEltcG9ydFBhdGg+Lis/KVxcLnRzXFxrPFF1b3RlPlxcKS9nbTtcblxuZW51bSBHZW5lcmF0ZUluZGV4UmVzdWx0IHtcbiAgU2tpcHBlZCA9ICdza2lwcGVkJyxcbiAgU3VjY2VzcyA9ICdzdWNjZXNzJ1xufVxuXG5pbnRlcmZhY2UgQnVpbGRMaWJyYXJ5Rm9ybWF0UGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBNb2R1bGVGb3JtYXQ7XG4gIHJlYWRvbmx5IGxpYkZpbGVzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcHJlcHJvY2Vzc1BsdWdpbkZhY3Rvcnk6IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZGVjbGFyYXRpb25GaWxlUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBleHRlbnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kdWxlRGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTZXRFeHBvcnRQYXJhbXMge1xuICByZWFkb25seSBleHBvcnRDb25kaXRpb25zOiBQYWNrYWdlSnNvbi5FeHBvcnRDb25kaXRpb25zO1xuICByZWFkb25seSBpc1dpbGRjYXJkOiBib29sZWFuO1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgc3JjRm9sZGVyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUb0Rpc3RQYXRoUGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltcG9ydFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXZlcnl0aGluZyBhbiBlYXJsaWVyIGJ1aWxkIGxlZnQ6IGBkaXN0L2AsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCB0aGUgYC5kLnRzYCBmaWxlcyBgdHNjYCB3cm90ZVxuICogYmVzaWRlIHRoZSBzb3VyY2VzIChoYW5kLWF1dGhvcmVkIG9uZXMgdW5kZXIgYEB0eXBlc2Agc3RheSksIGFuZCB0aGUgcGVyLXN1YnBhdGggYHBhY2thZ2UuanNvbmAgc3R1YnMuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xlYW5MaWJyYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBidWlsZENsZWFuKCk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoYmFzZW5hbWUoZmlsZSkgPT09IFJlcG9QYXRocy5JbmRleFRzIGFzIHN0cmluZykge1xuICAgICAgYXdhaXQgcm0oam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSk7XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuc3BsaXQoJy8nKS5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpKSB7XG4gICAgICBhd2FpdCBybShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5DdXJyZW50Rm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICgoYmFzZW5hbWUoZmlsZSkgIT09IFJlcG9QYXRocy5QYWNrYWdlSnNvbiBhcyBzdHJpbmcpIHx8IChmaWxlID09PSBSZXBvUGF0aHMuUGFja2FnZUpzb24gYXMgc3RyaW5nKSB8fCBmaWxlLnN0YXJ0c1dpdGgoUmVwb1BhdGhzLk5vZGVNb2R1bGVzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYXdhaXQgcm0oZmlsZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgZXZlcnkgc291cmNlIG1vZHVsZSwgdW5idW5kbGVkLCBpbnRvIGBkaXN0L2xpYi9janNgIChgLmNqc2ApIGFuZCBgZGlzdC9saWIvZXNtYCAoYC5tanNgKS5cbiAqXG4gKiBUaGUgb3V0cHV0IGZvbGRlcnMgbXVzdCBhbHJlYWR5IGV4aXN0OyB7QGxpbmsgYnVpbGRMaWJyYXJ5VHlwZXN9IGNyZWF0ZXMgdGhlbS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBidWlsZCBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGJvdGggZm9ybWF0cyBoYXZlIGJlZW4gYnVpbHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnkob3B0aW9uczogQnVpbGRMaWJyYXJ5T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgPSAoaXNFc206IGJvb2xlYW4pOiBQbHVnaW4gPT4gcHJlcHJvY2Vzc1BsdWdpbih7IGlzRXNtIH0pIH0gPSBvcHRpb25zO1xuICBjb25zdCBsaWJGaWxlcyA9IGF3YWl0IGdldExpYkZpbGVzKCk7XG4gIGF3YWl0IGJ1aWxkTGlicmFyeUZvcm1hdCh7IGZvcm1hdDogJ2NqcycsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9KTtcbiAgYXdhaXQgYnVpbGRMaWJyYXJ5Rm9ybWF0KHsgZm9ybWF0OiAnZXNtJywgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0pO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBkZWNsYXJhdGlvbnMgd2l0aCBgdHNjIC0tcHJvamVjdCAuL3RzY29uZmlnLnR5cGVzLmpzb25gLCB0aGVuIGNvcGllcyBlYWNoIG9uZSBpbnRvIGBkaXN0L2xpYmAgdHdpY2U6IGFzIGFcbiAqIGAuZC5jdHNgIHdob3NlIHJlbGF0aXZlIGltcG9ydHMgbmFtZSBgLmNqc2AgZmlsZXMgYW5kIHdob3NlIGJhcmUgdHlwZSBpbXBvcnRzIGNhcnJ5IGByZXNvbHV0aW9uLW1vZGU6IGltcG9ydGAsIGFuZFxuICogYXMgYSBgLmQubXRzYCB3aG9zZSByZWxhdGl2ZSBpbXBvcnRzIG5hbWUgYC5tanNgIGZpbGVzLlxuICpcbiAqIFRoZSBsaWJyYXJ5J3Mgcm9vdCBkZWNsYXJhdGlvbiAoYGxpYnJhcnkudHNgIHdoZXJlIHRoZSBwYWNrYWdlIGhhcyBvbmUsIG90aGVyd2lzZSB0aGUgZ2VuZXJhdGVkIGBpbmRleC50c2ApIGNhcnJpZXNcbiAqIGV2ZXJ5IGBsaWJgIGFuZCBgdHlwZXNgIHJlZmVyZW5jZSB0aGUgcGFja2FnZSBuZWVkcywgYW5kIHNvIGRvZXMgYSBgbGlicmFyeS1yZWZlcmVuY2VzYCBkZWNsYXJhdGlvbiBiZXNpZGUgaXQgdGhhdFxuICogY2FycmllcyBub3RoaW5nIGVsc2UuIEV2ZXJ5IG90aGVyIGRlY2xhcmF0aW9uIHJlZmVyZW5jZXMgdGhhdCBvbmUgYnkgcGF0aCwgbmV2ZXIgdGhlIHJvb3Q6IHRoZSByb290IGJhcnJlbFxuICogcmUtZXhwb3J0cyBldmVyeSBtb2R1bGUsIHNvIHJlZmVyZW5jaW5nIGl0IG1hZGUgZWFjaCBzdWJwYXRoIGxvYWQgdGhlIHdob2xlIHBhY2thZ2UsIGFuZCBhIGNvbnN1bWVyIHR5cGUtY2hlY2tpbmdcbiAqIHdpdGggYHNraXBMaWJDaGVjazogZmFsc2VgIHRoZW4gbmVlZGVkIGV2ZXJ5IG9wdGlvbmFsIHBlZXIgaW5zdGFsbGVkLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVjbGFyYXRpb25zIGhhdmUgYmVlbiB3cml0dGVuLlxuICogQHRocm93cyBJZiBhIHNvdXJjZSBtb2R1bGUgaXMgbmFtZWQgYGxpYnJhcnktcmVmZXJlbmNlc2AsIHdoaWNoIHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgZ2VuZXJhdGVkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5VHlwZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChleGlzdHNTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgYCR7TElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRX0ke1JlcG9QYXRocy5Uc0V4dGVuc2lvbn1gKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNyYy8ke0xJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUV9JHtSZXBvUGF0aHMuVHNFeHRlbnNpb259IGNvbGxpZGVzIHdpdGggdGhlIGdlbmVyYXRlZCBkZWNsYXJhdGlvbiBvZiB0aGUgc2FtZSBuYW1lLmApO1xuICB9XG5cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFsuLi5yZXNvbHZlVG9vbENvbW1hbmQoeyB0b29sOiAndHNjJyB9KSwgJy0tcHJvamVjdCcsICcuL3RzY29uZmlnLnR5cGVzLmpzb24nXSk7XG5cbiAgY29uc3QgbGlicmFyeUZpbGVOYW1lID0gZXhpc3RzU3luYyhqb2luKFJlcG9QYXRocy5TcmMsICdsaWJyYXJ5LnRzJykpID8gJ2xpYnJhcnknIDogJ2luZGV4JztcbiAgY29uc3QgYWxsTGlicyA9IGF3YWl0IGNvbGxlY3RBbGxMaWJzKCk7XG4gIGNvbnN0IGFsbFR5cGVzID0gY29sbGVjdEFsbFR5cGVzKCk7XG4gIGNvbnN0IGRpcmVjdGl2ZXMgPSBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoYWxsTGlicykgKyBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyhhbGxUeXBlcyk7XG5cbiAgYXdhaXQgbWtkaXIoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBta2Rpcihqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzLCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pLCBkaXJlY3RpdmVzKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20sIExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgKyBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbiksIGRpcmVjdGl2ZXMpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoIWZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgfHwgZmlsZS5zdGFydHNXaXRoKFJlcG9QYXRocy5UZXN0SGVscGVycykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoZmlsZSk7XG4gICAgY29uc3QgbmFtZSA9IGJhc2VuYW1lKGZpbGUsIFJlcG9QYXRocy5EdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpLCAndXRmLTgnKTtcblxuICAgIGNvbnN0IGN0c1BhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzLCBmb2xkZXIsIG5hbWUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgbXRzUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20sIGZvbGRlciwgbmFtZSArIFJlcG9QYXRocy5EbXRzRXh0ZW5zaW9uKTtcblxuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoY3RzUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUobXRzUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgbGV0IGN0c0NvbnRlbnQgPSB0b0N0c0NvbnRlbnQoY29udGVudCk7XG4gICAgbGV0IG10c0NvbnRlbnQgPSB0b010c0NvbnRlbnQoY29udGVudCk7XG5cbiAgICBpZiAobmFtZSA9PT0gbGlicmFyeUZpbGVOYW1lICYmIGZvbGRlciA9PT0gJy4nKSB7XG4gICAgICBjdHNDb250ZW50ID0gZGlyZWN0aXZlcyArIGN0c0NvbnRlbnQ7XG4gICAgICBtdHNDb250ZW50ID0gZGlyZWN0aXZlcyArIG10c0NvbnRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN0c0NvbnRlbnQgPSBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUoeyBkZWNsYXJhdGlvbkZpbGVQYXRoOiBjdHNQYXRoLCBleHRlbnNpb246IFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3Rvcnk6IFJlcG9QYXRocy5DanMgfSlcbiAgICAgICAgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZSh7IGRlY2xhcmF0aW9uRmlsZVBhdGg6IG10c1BhdGgsIGV4dGVuc2lvbjogUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24sIG1vZHVsZURpcmVjdG9yeTogUmVwb1BhdGhzLkVzbSB9KVxuICAgICAgICArIG10c0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGN0c1BhdGgsIGN0c0NvbnRlbnQpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShtdHNQYXRoLCBtdHNDb250ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2VuZXJhdGVzIHRoZSBgZXhwb3J0c2AgbWFwIG9mIHRoZSBwYWNrYWdlJ3MgYHBhY2thZ2UuanNvbmAgZnJvbSBpdHMgc291cmNlIGZvbGRlcnMsIGFuZCB3cml0ZXMgYSBgcGFja2FnZS5qc29uYFxuICogc3R1YiBwZXIgc3VicGF0aCBmb3IgcmVzb2x2ZXJzIHRoYXQgZG8gbm90IHJlYWQgYGV4cG9ydHNgLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9uc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG1hcCBpcyBjdXJyZW50LlxuICogQHRocm93cyBJZiB0aGUgbWFwIGNoYW5nZWQsIHNvIHRoZSBjaGFuZ2UgZ2V0cyByZXZpZXdlZCBhbmQgY29tbWl0dGVkIHJhdGhlciB0aGFuIHNoaXBwZWQgdW5zZWVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0cyhvcHRpb25zOiBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc291cmNlQ29uZGl0aW9uIH0gPSBvcHRpb25zO1xuICBjb25zdCBzcmNGb2xkZXJzOiBzdHJpbmdbXSA9IFtSZXBvUGF0aHMuU3JjXTtcblxuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUsIHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gam9pbihkaXJlbnQucGFyZW50UGF0aCwgZGlyZW50Lm5hbWUpO1xuXG4gICAgaWYgKHBhdGguaW5jbHVkZXMoUmVwb1BhdGhzLlN0eWxlcykgfHwgcGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuVGVzdEhlbHBlcnMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBzcmNGb2xkZXJzLnB1c2gocGF0aCk7XG4gIH1cblxuICBzcmNGb2xkZXJzLnNvcnQoKTtcblxuICBsZXQgaXNDaGFuZ2VkID0gZmFsc2U7XG5cbiAgYXdhaXQgZWRpdFBhY2thZ2VKc29uKGFzeW5jIChwYWNrYWdlSnNvbikgPT4ge1xuICAgIGNvbnN0IG9sZEV4cG9ydHMgPSBwYWNrYWdlSnNvbi5leHBvcnRzO1xuICAgIGNvbnN0IGV4cG9ydENvbmRpdGlvbnM6IFBhY2thZ2VKc29uLkV4cG9ydENvbmRpdGlvbnMgPSB7fTtcbiAgICBwYWNrYWdlSnNvbi5leHBvcnRzID0gZXhwb3J0Q29uZGl0aW9ucztcbiAgICBmb3IgKGNvbnN0IHNyY0ZvbGRlciBvZiBzcmNGb2xkZXJzKSB7XG4gICAgICBhd2FpdCBzZXRFeHBvcnQoeyBleHBvcnRDb25kaXRpb25zLCBpc1dpbGRjYXJkOiBmYWxzZSwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSk7XG4gICAgICBhd2FpdCBzZXRFeHBvcnQoeyBleHBvcnRDb25kaXRpb25zLCBpc1dpbGRjYXJkOiB0cnVlLCBzb3VyY2VDb25kaXRpb24sIHNyY0ZvbGRlciB9KTtcbiAgICB9XG5cbiAgICBpc0NoYW5nZWQgPSAhaXNEZWVwRXF1YWwob2xkRXhwb3J0cywgcGFja2FnZUpzb24uZXhwb3J0cyk7XG4gIH0pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IGNoYW5nZWQgaW4gdGhlIGBlZGl0UGFja2FnZUpzb25gLCBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gIGlmIChpc0NoYW5nZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhY2thZ2UgZXhwb3J0cyBoYXZlIGNoYW5nZWQuIFBsZWFzZSByZXZpZXcgdGhlIGNoYW5nZXMgYW5kIGNvbW1pdCB0aGVtLicpO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGFuIGBpbmRleC50c2AgYmFycmVsIGluIGV2ZXJ5IHNvdXJjZSBmb2xkZXIgdGhhdCBoYXMgc29tZXRoaW5nIHRvIGV4cG9ydCwgcmUtZXhwb3J0aW5nIGVhY2ggbW9kdWxlIGFuZFxuICogZWFjaCBzdWItYmFycmVsIHVuZGVyIGl0cyBvd24gbmFtZS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhcnJlbHMgaGF2ZSBiZWVuIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZ2VuZXJhdGVJbmRleChSZXBvUGF0aHMuU3JjKTtcbn1cblxuLyoqXG4gKiBSdW5zIGVhY2ggbmFtZWQgbnBtIHNjcmlwdCB0aGUgcGFja2FnZSBkZWZpbmVzLCBpbiBvcmRlciwgc2tpcHBpbmcgdGhlIG9uZXMgaXQgZG9lcyBub3QgZGVmaW5lLlxuICpcbiAqIEBwYXJhbSBzdGVwcyAtIFRoZSBucG0gc2NyaXB0IG5hbWVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5IHN0ZXAgaGFzIHJ1bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkJ1aWxkU3RlcHMoc3RlcHM6IHJlYWRvbmx5IHN0cmluZ1tdID0gTElCUkFSWV9CVUlMRF9TVEVQUyk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbChzdGVwKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMobGliczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7XG4gICAgbGlic1xuICAgICAgLm1hcCgobGliKSA9PiBgLy8vICR7UkVGRVJFTkNFX0xJQl9ESVJFQ1RJVkV9XCIke2xpYn1cIiAvPmApXG4gICAgICAuam9pbignXFxuJylcbiAgfVxcbmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsUmVmZXJlbmNlVHlwZXNEaXJlY3RpdmVzKHR5cGVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlcy5sZW5ndGggPT09IDBcbiAgICA/ICcnXG4gICAgOiBgJHtcbiAgICAgIHR5cGVzXG4gICAgICAgIC5tYXAoKHR5cGUpID0+IGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIiR7dHlwZX1cIiAvPmApXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgIH1cXG5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnlGb3JtYXQocGFyYW1zOiBCdWlsZExpYnJhcnlGb3JtYXRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBmb3JtYXQsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9ID0gcGFyYW1zO1xuICBjb25zdCBleHRlbnNpb24gPSBmb3JtYXQgPT09ICdjanMnID8gUmVwb1BhdGhzLkNqc0V4dGVuc2lvbiA6IFJlcG9QYXRocy5NanNFeHRlbnNpb247XG4gIGNvbnN0IGJ1aWxkT3B0aW9uczogQnVpbGRPcHRpb25zID0ge1xuICAgIC8vIEV4cGxpY2l0LCBiZWNhdXNlIGVzYnVpbGQgb3RoZXJ3aXNlIHRha2VzIHRoZSBmb2xkZXIgaXRzIHNlcnZpY2UgcHJvY2VzcyBzdGFydGVkIGluLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGVzYnVpbGQncyBvd24gb3B0aW9uIG5hbWUuXG4gICAgYWJzV29ya2luZ0RpcjogcHJvY2Vzcy5jd2QoKSxcbiAgICBiYW5uZXI6IHtcbiAgICAgIGpzOiBMSUJSQVJZX0JBTk5FUlxuICAgIH0sXG4gICAgYnVuZGxlOiBmYWxzZSxcbiAgICBlbnRyeVBvaW50czogbGliRmlsZXMsXG4gICAgZm9ybWF0LFxuICAgIGxvZ0xldmVsOiAnaW5mbycsXG4gICAgb3V0ZGlyOiBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBmb3JtYXQpLFxuICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgcGx1Z2luczogW1xuICAgICAgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkoZm9ybWF0ID09PSAnZXNtJyksXG4gICAgICBmaXhFc21QbHVnaW4oKSxcbiAgICAgIGNoYW5nZUV4dGVuc2lvblBsdWdpbihleHRlbnNpb24pXG4gICAgXSxcbiAgICBzb3VyY2VtYXA6ICdpbmxpbmUnLFxuICAgIHRhcmdldDogJ0VTMjAyMicsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgd3JpdGU6IGZhbHNlXG4gIH07XG5cbiAgY29uc3QgYnVpbGRDb250ZXh0ID0gYXdhaXQgY29udGV4dChidWlsZE9wdGlvbnMpO1xuICB0cnkge1xuICAgIGF3YWl0IGJ1aWxkQ29udGV4dC5yZWJ1aWxkKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgYnVpbGRDb250ZXh0LmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUocGFyYW1zOiBCdWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmVQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGRlY2xhcmF0aW9uRmlsZVBhdGgsIGV4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGxpYnJhcnlGaWxlUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIG1vZHVsZURpcmVjdG9yeSwgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSArIGV4dGVuc2lvbik7XG4gIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZU5hdGl2ZShkaXJuYW1lKGRlY2xhcmF0aW9uRmlsZVBhdGgpLCBsaWJyYXJ5RmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICB9XG4gIHJldHVybiBgLy8vIDxyZWZlcmVuY2UgcGF0aD1cIiR7cmVsYXRpdmVQYXRofVwiIC8+XFxuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdEFsbExpYnMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAvLyBUaGUgUkVTT0xWRUQgb3B0aW9ucywgYmVjYXVzZSBhIHBhY2thZ2UncyBgdHNjb25maWcuanNvbmAgaW5oZXJpdHMgYGxpYmAgZnJvbSB0aGUgc2hhcmVkIGJhc2UuIFRoZSByZXNvbHZlZFxuICAvLyBuYW1lcyBhcmUgZmlsZSBuYW1lcyAoYGxpYi5kb20uaXRlcmFibGUuZC50c2ApLCBzbyB0aGV5IGFyZSBtYXBwZWQgYmFjayBvbnRvIHRoZSBuYW1lcyBhIGRpcmVjdGl2ZSB0YWtlcy5cbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICBjb25zdCBsaWJzID0gbmV3IFNldCgob3B0aW9ucy5saWIgPz8gW10pLm1hcCgobGliKSA9PiBsaWIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ebGliXFwuLywgJycpLnJlcGxhY2UoL1xcLmRcXC50cyQvLCAnJykpKTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKCcudHMnKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlQ29udGVudCA9IHJlYWRGaWxlU3luYyhqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpLCAndXRmLTgnKTtcbiAgICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIGFsd2F5cyBjYXB0dXJlcyBpdHMgb25lIGdyb3VwLCBzbyBubyBmYWxsYmFjayBmb3IgYSBtaXNzaW5nIG9uZSBpcyBuZWVkZWQuXG4gICAgZm9yIChjb25zdCBbLCBsaWJdIG9mIHNvdXJjZUNvbnRlbnQubWF0Y2hBbGwoUkVGRVJFTkNFX0xJQl9SRUdfRVhQKSkge1xuICAgICAgbGlicy5hZGQoU3RyaW5nKGxpYikudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFsuLi5saWJzXS5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RBbGxUeXBlcygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhSZXBvUGF0aHMuVHNDb25maWdKc29uKTtcbiAgcmV0dXJuIChvcHRpb25zLnR5cGVzID8/IFtdKVxuICAgIC5maWx0ZXIoKHR5cGUpID0+IERFQ0xBUkFUSU9OX1JFRkVSRU5DRV9UWVBFUy5oYXModHlwZSkpXG4gICAgLnNvcnQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleChmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8R2VuZXJhdGVJbmRleFJlc3VsdD4ge1xuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgcmVhZGRpclBvc2l4KGZvbGRlciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBtYXliZUxpbmVzID0gYXdhaXQgYXN5bmNNYXAoZGlyZW50cywgKGRpcmVudCkgPT4gaGFuZGxlSW5kZXhEaXJlbnQoZm9sZGVyLCBkaXJlbnQpKTtcbiAgY29uc3QgbGluZXMgPSBtYXliZUxpbmVzLmZpbHRlcigobGluZSkgPT4gbGluZSAhPT0gdW5kZWZpbmVkKTtcblxuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU2tpcHBlZDtcbiAgfVxuXG4gIGF3YWl0IGdlbmVyYXRlKGpvaW4oZm9sZGVyLCBSZXBvUGF0aHMuSW5kZXhUcyksIGxpbmVzKTtcbiAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGliRmlsZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBsZXQgZmlsZXMgPSBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGZpbGVzID0gZmlsZXMubWFwKChmaWxlKSA9PiBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpKTtcbiAgcmV0dXJuIGZpbGVzLmZpbHRlcigoZmlsZSkgPT5cbiAgICBmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5Uc0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoJy50ZXN0LnRzJylcbiAgICAmJiAhZmlsZS5pbmNsdWRlcyhgLyR7UmVwb1BhdGhzLlRlc3RIZWxwZXJzfS9gKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVJbmRleERpcmVudChmb2xkZXI6IHN0cmluZywgZGlyZW50OiBEaXJlbnQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoaXNFeGNsdWRlZEZyb21JbmRleChmb2xkZXIsIGRpcmVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgc291cmNlRmlsZTogc3RyaW5nO1xuICBsZXQgbmFtZTogc3RyaW5nO1xuICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZUluZGV4KGpvaW4oZm9sZGVyLCBkaXJlbnQubmFtZSkpO1xuICAgIGlmIChyZXN1bHQgIT09IEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShqb2luKGRpcmVudC5uYW1lLCBSZXBvUGF0aHMuSW5kZXhUcykpO1xuICAgIG5hbWUgPSBkaXJlbnQubmFtZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKGRpcmVudC5uYW1lKTtcbiAgICBuYW1lID0gYmFzZW5hbWUoZGlyZW50Lm5hbWUsIGV4dGVuc2lvbik7XG4gICAgc291cmNlRmlsZSA9IG5vcm1hbGl6ZUlmUmVsYXRpdmUoZGlyZW50Lm5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIGBleHBvcnQgKiBhcyAnJHtuYW1lfScgZnJvbSAnJHtzb3VyY2VGaWxlfSc7YDtcbn1cblxuZnVuY3Rpb24gaXNFeGNsdWRlZEZpbGVOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gIW5hbWUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSB8fCBuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpIHx8IG5hbWUgPT09ICdzZXR1cC50cycgfHwgbmFtZS5lbmRzV2l0aCgnLXNldHVwLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGcm9tSW5kZXgoZm9sZGVyOiBzdHJpbmcsIGRpcmVudDogRGlyZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IGV4Y2x1ZGVkTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JlcG9QYXRocy5JbmRleFRzLCBSZXBvUGF0aHMuVHlwZXMsIFJlcG9QYXRocy5TdHlsZXMsIFJlcG9QYXRocy5UZXN0SGVscGVyc107XG4gIGNvbnN0IGlzRXhjbHVkZWRFbnRyeSA9IGV4Y2x1ZGVkTmFtZXMuaW5jbHVkZXMoZGlyZW50Lm5hbWUpIHx8IGRpcmVudC5uYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pIHx8IGZvbGRlci5zcGxpdCgnLycpLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIHJldHVybiBpc0V4Y2x1ZGVkRW50cnkgfHwgKGRpcmVudC5pc0ZpbGUoKSAmJiBpc0V4Y2x1ZGVkRmlsZU5hbWUoZGlyZW50Lm5hbWUpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0RXhwb3J0KHBhcmFtczogU2V0RXhwb3J0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZCwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgaW1wb3J0UGF0aCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IHNyY0ZvbGRlcixcbiAgICByZXBsYWNlcjogUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsXG4gICAgc2VhcmNoVmFsdWU6IFJlcG9QYXRocy5TcmNcbiAgfSk7XG4gIGNvbnN0IGNvbmRpdGlvblBhdGggPSBpc1dpbGRjYXJkID8gYCR7aW1wb3J0UGF0aH0vJHtSZXBvUGF0aHMuQW55fWAgOiBpbXBvcnRQYXRoO1xuICBjb25zdCBkbXRzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5Fc20sIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RG10cyA6IFJlcG9QYXRocy5JbmRleERtdHMgfSk7XG4gIGNvbnN0IGRjdHNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkNqcywgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlEY3RzIDogUmVwb1BhdGhzLkluZGV4RGN0cyB9KTtcbiAgY29uc3QgZG10c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRtdHNQYXRoKTtcbiAgY29uc3QgZGN0c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRjdHNQYXRoKTtcblxuICBpZiAoIWlzV2lsZGNhcmQgJiYgIWV4aXN0c1N5bmMoZGN0c1BhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNUeXBlc09ubHkgPSBpbXBvcnRQYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIGNvbnN0IG1qc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueU1qcyA6IFJlcG9QYXRocy5JbmRleE1qcyB9KTtcbiAgY29uc3QgY2pzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55Q2pzIDogUmVwb1BhdGhzLkluZGV4Q2pzIH0pO1xuXG4gIGlmIChpc1R5cGVzT25seSkge1xuICAgIGV4cG9ydENvbmRpdGlvbnNbY29uZGl0aW9uUGF0aF0gPSB7XG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGhcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgaW1wb3J0UGF0aCwgaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlUcyA6IFJlcG9QYXRocy5JbmRleFRzKSk7XG5cbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgICAvLyBGaXJzdCwgc28gaXQgd2lucyB3aGVyZXZlciBpdCBpcyBzZXQ6IGluc2lkZSB0aGUgcmVwb3NpdG9yeSwgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LlxuICAgICAgLi4uKHNvdXJjZUNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgW3NvdXJjZUNvbmRpdGlvbl06IHNvdXJjZVBhdGggfSksXG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBtanNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGgsXG4gICAgICAgIGRlZmF1bHQ6IGNqc1BhdGhcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpbXBvcnRQYXRoID09PSBSZXBvUGF0aHMuQ3VycmVudEZvbGRlciBhcyBzdHJpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzV2lsZGNhcmQpIHtcbiAgICBhd2FpdCB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihcbiAgICAgIGltcG9ydFBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzOiByZWxhdGl2ZShpbXBvcnRQYXRoLCBkY3RzUGF0aCkgfVxuICAgICAgICA6IHsgbWFpbjogcmVsYXRpdmUoaW1wb3J0UGF0aCwgY2pzUGF0aCksIG1vZHVsZTogcmVsYXRpdmUoaW1wb3J0UGF0aCwgbWpzUGF0aCksIHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoZGN0c0ZvbGRlclBhdGgpKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgcGFja2FnZUpzb25Gb2xkZXJQYXRoID0gam9pbihpbXBvcnRQYXRoLCBuYW1lKTtcbiAgICBjb25zdCB0eXBlcyA9IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSk7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBwYWNrYWdlSnNvbkZvbGRlclBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgbWFpbjogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRjdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLkNqc0V4dGVuc2lvbikpLFxuICAgICAgICAgIG1vZHVsZTogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRtdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLk1qc0V4dGVuc2lvbikpLFxuICAgICAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgIHR5cGVzXG4gICAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ3RzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGNvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdmcm9tIFxcJyQ8SW1wb3J0UGF0aD4uY2pzXFwnOycsXG4gICAgc2VhcmNoVmFsdWU6IFNUQVRJQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoJDxRdW90ZT4kPEltcG9ydFBhdGg+LmNqcyQ8UXVvdGU+KScsXG4gICAgc2VhcmNoVmFsdWU6IERZTkFNSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG5cbiAgLy8gQSBgLmQuY3RzYCBmaWxlIGlzIGEgQ29tbW9uSlMgbW9kdWxlLiBUeXBlLW9ubHkgaW1wb3J0cyBvZiBhIGJhcmUgc3BlY2lmaWVyIHJlc29sdmluZyB0byBhblxuICAvLyBFU00tb25seSBwYWNrYWdlIG5lZWQgYSBgcmVzb2x1dGlvbi1tb2RlYCBhdHRyaWJ1dGUsIGVsc2UgYHRzY2AgcmVwb3J0cyBUUzE1NDEgLyBUUzE1NDIuXG4gIC8vIFBhc3NpbmcgYCdpbXBvcnQnYCBpcyB2YWxpZCBmb3IgQ29tbW9uSlMgdGFyZ2V0cyB0b28sIHNvIGV2ZXJ5IGJhcmUgc3BlY2lmaWVyIHJlY2VpdmVzIGl0LlxuICAvLyBUaGUgRVNNIGAuZC5tdHNgIG5lZWRzIG5vIHN1Y2ggYXR0cmlidXRlLCBzbyB0aGlzIHRyYW5zZm9ybSBydW5zIG9uIENvbW1vbkpTIGNvbnRlbnQgb25seS5cbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQgdHlwZSAkPENsYXVzZT4gZnJvbSBcXCckPFNwZWNpZmllcj5cXCcgd2l0aCB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH07JyxcbiAgICBzZWFyY2hWYWx1ZTogQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY3RzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydChcIiQ8U3BlY2lmaWVyPlwiLCB7IHdpdGg6IHsgXFwncmVzb2x1dGlvbi1tb2RlXFwnOiBcXCdpbXBvcnRcXCcgfSB9KScsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRGlzdFBhdGgocGFyYW1zOiBUb0Rpc3RQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgcGFyYW1zLmZvcm1hdCwgcGFyYW1zLmltcG9ydFBhdGgsIHBhcmFtcy5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHRvTXRzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtdHNDb250ZW50ID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY29udGVudCxcbiAgICByZXBsYWNlcjogJ2Zyb20gXFwnJDxJbXBvcnRQYXRoPi5tanNcXCc7JyxcbiAgICBzZWFyY2hWYWx1ZTogU1RBVElDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogbXRzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydCgkPFF1b3RlPiQ8SW1wb3J0UGF0aD4ubWpzJDxRdW90ZT4pJyxcbiAgICBzZWFyY2hWYWx1ZTogRFlOQU1JQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oZm9sZGVyOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBta2Rpcihmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUpzb24oam9pbihmb2xkZXIsIFJlcG9QYXRocy5QYWNrYWdlSnNvbiksIHBhY2thZ2VKc29uKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWlCQSxtQkFBeUI7QUFDekIsMEJBQTRCO0FBQzVCLGtCQU9PO0FBQ1Asb0JBQTJCO0FBQzNCLHFCQUF3QjtBQUN4QixxQkFHTztBQUNQLHNCQUtPO0FBQ1AsdUJBQTJDO0FBQzNDLDBCQUFvQjtBQUlwQixtQkFBMkI7QUFDM0IscUNBQXNDO0FBQ3RDLDRCQUE2QjtBQUM3QiwrQkFBaUM7QUFDakMsaUNBQThCO0FBQzlCLDRCQUF5QjtBQUN6QixnQkFBNkI7QUFDN0Isa0JBQTBCO0FBQzFCLHFCQUErQjtBQUMvQixpQkFBZ0M7QUFD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LElBQ1YsYUFBYTtBQUFBLEVBQ2YsQ0FBQztBQUNIO0FBRUEsU0FBUyxXQUFXLFFBQWtDO0FBQ3BELGFBQU8scUNBQW9CLGtCQUFLLDRCQUFVLFNBQVMsT0FBTyxRQUFRLE9BQU8sWUFBWSxPQUFPLElBQUksQ0FBQztBQUNuRztBQUVBLFNBQVMsYUFBYSxTQUF5QjtBQUM3QyxRQUFNLGlCQUFhLDBCQUFXO0FBQUEsSUFDNUIsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLEVBQ2YsQ0FBQztBQUNELGFBQU8sMEJBQVc7QUFBQSxJQUNoQixTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsRUFDZixDQUFDO0FBQ0g7QUFFQSxlQUFlLHdCQUF3QixRQUFnQixhQUF5QztBQUM5RixZQUFNLHVCQUFNLFFBQVEsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUN2QyxZQUFNLDJCQUFVLGtCQUFLLFFBQVEsNEJBQVUsV0FBVyxHQUFHLFdBQVc7QUFDbEU7IiwKICAibmFtZXMiOiBbInByb2Nlc3MiLCAicmVsYXRpdmVOYXRpdmUiXQp9Cg==
@@ -1,4 +1,4 @@
1
- /// <reference path="./index.d.cts" />
1
+ /// <reference path="./library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -67,9 +67,13 @@ export declare function buildLibrary(options?: BuildLibraryOptions): Promise<voi
67
67
  * as a `.d.mts` whose relative imports name `.mjs` files.
68
68
  *
69
69
  * The library's root declaration (`library.ts` where the package has one, otherwise the generated `index.ts`) carries
70
- * every `lib` and `types` reference the package needs; every other declaration references it by path.
70
+ * every `lib` and `types` reference the package needs, and so does a `library-references` declaration beside it that
71
+ * carries nothing else. Every other declaration references that one by path, never the root: the root barrel
72
+ * re-exports every module, so referencing it made each subpath load the whole package, and a consumer type-checking
73
+ * with `skipLibCheck: false` then needed every optional peer installed.
71
74
  *
72
75
  * @returns A {@link Promise} that resolves when the declarations have been written.
76
+ * @throws If a source module is named `library-references`, which would collide with the generated declaration.
73
77
  */
74
78
  export declare function buildLibraryTypes(): Promise<void>;
75
79
  /**
@@ -0,0 +1,5 @@
1
+ /// <reference lib="dom" />
2
+ /// <reference lib="dom.iterable" />
3
+ /// <reference lib="es2022" />
4
+ /// <reference lib="esnext.disposable" />
5
+ /// <reference types="node" />
@@ -1,4 +1,4 @@
1
- /// <reference path="../index.d.cts" />
1
+ /// <reference path="../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../index.d.cts" />
1
+ /// <reference path="../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../index.d.cts" />
1
+ /// <reference path="../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../index.d.cts" />
1
+ /// <reference path="../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../index.d.cts" />
1
+ /// <reference path="../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  export * as 'in-house-plugin' from './in-house-plugin.cjs';
3
3
  export * as 'no-async-callback-to-unsafe-return' from './no-async-callback-to-unsafe-return.cjs';
4
4
  export * as 'no-unresolved-jsdoc-link' from './no-unresolved-jsdoc-link.cjs';
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  import type { Rule } from 'eslint' with { 'resolution-mode': 'import' };
3
3
  /**
4
4
  Message ID reported when an async function is passed as a callback to a parameter whose return type is `any`/`unknown`, risking an unhandled promise rejection.
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  import type { Rule } from 'eslint' with { 'resolution-mode': 'import' };
3
3
  /**
4
4
  * Message ID reported when a JSDoc link target does not resolve to a symbol.
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  import type { Rule } from 'eslint' with { 'resolution-mode': 'import' };
3
3
  /**
4
4
  Message ID reported when `Promise.resolve()` is used for an async no-op instead of `noopAsync()`.
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  import type { Rule } from 'eslint' with { 'resolution-mode': 'import' };
3
3
  /**
4
4
  Message ID reported when a method type parameter has no matching `@typeParam` tag.
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  import type { Rule } from 'eslint' with { 'resolution-mode': 'import' };
3
3
  /**
4
4
  Message ID reported when an `override` method does not access its `super` counterpart.
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../../index.d.cts" />
1
+ /// <reference path="../../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../../../index.d.cts" />
1
+ /// <reference path="../../../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -1,4 +1,4 @@
1
- /// <reference path="../../../index.d.cts" />
1
+ /// <reference path="../../../library-references.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *