obsidian-dev-utils 87.0.2 → 87.0.4

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 (69) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/demo-vault-helper/main.js +232 -0
  3. package/dist/demo-vault-helper/manifest.json +9 -0
  4. package/dist/lib/cjs/__merged.cjs +13 -1
  5. package/dist/lib/cjs/__merged.d.cts +4 -2
  6. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  7. package/dist/lib/cjs/obsidian/code-block-reg-exp.cjs +138 -0
  8. package/dist/lib/cjs/obsidian/code-block-reg-exp.d.cts +33 -0
  9. package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.cjs +13 -6
  10. package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.d.cts +13 -5
  11. package/dist/lib/cjs/obsidian/community-plugins.cjs +25 -1
  12. package/dist/lib/cjs/obsidian/community-plugins.d.cts +28 -0
  13. package/dist/lib/cjs/obsidian/demo-vault-helper.cjs +159 -0
  14. package/dist/lib/cjs/obsidian/demo-vault-helper.d.cts +40 -0
  15. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +17 -13
  16. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +13 -5
  17. package/dist/lib/cjs/obsidian/index.cjs +7 -1
  18. package/dist/lib/cjs/obsidian/index.d.cts +2 -0
  19. package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +12 -10
  20. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +2 -1
  21. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +2 -0
  22. package/dist/lib/cjs/reg-exp.cjs +11 -1
  23. package/dist/lib/cjs/reg-exp.d.cts +34 -0
  24. package/dist/lib/cjs/script-utils/demo-vault-coverage.cjs +329 -0
  25. package/dist/lib/cjs/script-utils/demo-vault-coverage.d.cts +298 -0
  26. package/dist/lib/cjs/script-utils/demo-vault.cjs +36 -3
  27. package/dist/lib/cjs/script-utils/demo-vault.d.cts +5 -5
  28. package/dist/lib/cjs/script-utils/index.cjs +4 -1
  29. package/dist/lib/cjs/script-utils/index.d.cts +1 -0
  30. package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +14 -1
  31. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +4 -5
  32. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +2 -1
  33. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +2 -0
  34. package/dist/lib/cjs/script-utils/version.cjs +2 -2
  35. package/dist/lib/esm/__merged.d.mts +4 -2
  36. package/dist/lib/esm/__merged.mjs +11 -1
  37. package/dist/lib/esm/generated-during-build.mjs +1 -1
  38. package/dist/lib/esm/obsidian/code-block-reg-exp.d.mts +33 -0
  39. package/dist/lib/esm/obsidian/code-block-reg-exp.mjs +30 -0
  40. package/dist/lib/esm/obsidian/command-handlers/open-demo-vault-command-handler.d.mts +13 -5
  41. package/dist/lib/esm/obsidian/command-handlers/open-demo-vault-command-handler.mjs +13 -6
  42. package/dist/lib/esm/obsidian/community-plugins.d.mts +28 -0
  43. package/dist/lib/esm/obsidian/community-plugins.mjs +24 -1
  44. package/dist/lib/esm/obsidian/demo-vault-helper.d.mts +40 -0
  45. package/dist/lib/esm/obsidian/demo-vault-helper.mjs +56 -0
  46. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +13 -5
  47. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +17 -13
  48. package/dist/lib/esm/obsidian/index.d.mts +2 -0
  49. package/dist/lib/esm/obsidian/index.mjs +5 -1
  50. package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +15 -10
  51. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +2 -0
  52. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +2 -1
  53. package/dist/lib/esm/reg-exp.d.mts +34 -0
  54. package/dist/lib/esm/reg-exp.mjs +11 -2
  55. package/dist/lib/esm/script-utils/demo-vault-coverage.d.mts +298 -0
  56. package/dist/lib/esm/script-utils/demo-vault-coverage.mjs +230 -0
  57. package/dist/lib/esm/script-utils/demo-vault.d.mts +5 -5
  58. package/dist/lib/esm/script-utils/demo-vault.mjs +31 -5
  59. package/dist/lib/esm/script-utils/index.d.mts +1 -0
  60. package/dist/lib/esm/script-utils/index.mjs +3 -1
  61. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +14 -1
  62. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +4 -5
  63. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +2 -0
  64. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +2 -1
  65. package/dist/lib/esm/script-utils/version.mjs +2 -2
  66. package/obsidian/code-block-reg-exp/package.json +6 -0
  67. package/obsidian/demo-vault-helper/package.json +6 -0
  68. package/package.json +6 -5
  69. package/script-utils/demo-vault-coverage/package.json +6 -0
@@ -24,6 +24,10 @@ if you want to view the source, please visit the github repository of this plugi
24
24
  import { abortSignalAny } from "../abort-controller.mjs";
25
25
  import { requestAnimationFrameAsync } from "../async.mjs";
26
26
  import { normalizeOptionalProperties } from "../object-utils.mjs";
27
+ import {
28
+ getMandatoryNamedGroup,
29
+ getOptionalNamedGroup
30
+ } from "../reg-exp.mjs";
27
31
  import {
28
32
  ensureLfEndings,
29
33
  getLfNormalizedOffsetToOriginalOffsetMapper,
@@ -33,6 +37,7 @@ import {
33
37
  } from "../string.mjs";
34
38
  import { assertNonNullable } from "../type-guards.mjs";
35
39
  import { resolveValue } from "../value-provider.mjs";
40
+ import { createCodeBlockRegExp } from "./code-block-reg-exp.mjs";
36
41
  import { getFileOrNull } from "./file-system.mjs";
37
42
  import {
38
43
  invokeWithFileSystemLock,
@@ -80,7 +85,7 @@ async function getCodeBlockMarkdownInfo(params) {
80
85
  }
81
86
  const potentialCodeBlockTextLines = textLines.map((line, index) => approximateSectionInfo.lineStart <= index && index <= approximateSectionInfo.lineEnd ? line : "");
82
87
  const potentialCodeBlockText = potentialCodeBlockTextLines.join("\n");
83
- const REG_EXP = /(?<=^|\n)(?<LinePrefix> {0,3}(?:> {1,3})*)(?<CodeBlockStartDelimiter>(?<CodeBlockStartDelimiterChar>[`~])(?:\k<CodeBlockStartDelimiterChar>{2,}))(?<CodeBlockLanguage>\S*)(?:[ \t](?<CodeBlockArgs>.*?))?(?:\n(?<CodeBlockContent>(?:\n?\k<LinePrefix>.*)+?))?\n\k<LinePrefix>(?<CodeBlockEndDelimiter>\k<CodeBlockStartDelimiter>\k<CodeBlockStartDelimiterChar>*)[ \t]*(?=\n|$)/g;
88
+ const REG_EXP = createCodeBlockRegExp();
84
89
  for (const match of potentialCodeBlockText.matchAll(REG_EXP)) {
85
90
  if (!isSuitableCodeBlock({ isInCallout, language, match, sourceLf })) {
86
91
  continue;
@@ -222,11 +227,11 @@ function createMarkdownInfoFromMatch(params) {
222
227
  sourceLinesCount,
223
228
  textLineOffsets
224
229
  } = params;
225
- const linePrefix = match.groups?.["LinePrefix"] ?? "";
226
- const codeBlockStartDelimiter = match.groups?.["CodeBlockStartDelimiter"] ?? "";
227
- const codeBlockEndDelimiter = match.groups?.["CodeBlockEndDelimiter"] ?? "";
228
- const codeBlockArgsStr = match.groups?.["CodeBlockArgs"] ?? "";
229
- const language = match.groups?.["CodeBlockLanguage"] ?? "";
230
+ const linePrefix = getMandatoryNamedGroup(match, "LinePrefix");
231
+ const codeBlockStartDelimiter = getMandatoryNamedGroup(match, "CodeBlockStartDelimiter");
232
+ const codeBlockEndDelimiter = getMandatoryNamedGroup(match, "CodeBlockEndDelimiter");
233
+ const codeBlockArgsStr = getOptionalNamedGroup(match, "CodeBlockArgs") ?? "";
234
+ const language = getMandatoryNamedGroup(match, "CodeBlockLanguage");
230
235
  const previousText = potentialCodeBlockText.slice(0, match.index);
231
236
  const previousTextLinesCount = previousText.split("\n").length - 1;
232
237
  const startLine = linesBeforeSectionCount + previousTextLinesCount;
@@ -291,15 +296,15 @@ function insertText(params) {
291
296
  }
292
297
  function isSuitableCodeBlock(params) {
293
298
  const { isInCallout, language, match, sourceLf } = params;
294
- const codeBlockLanguage = match.groups?.["CodeBlockLanguage"] ?? "";
299
+ const codeBlockLanguage = getMandatoryNamedGroup(match, "CodeBlockLanguage");
295
300
  if (codeBlockLanguage !== language) {
296
301
  return false;
297
302
  }
298
- const linePrefix = match.groups?.["LinePrefix"] ?? "";
303
+ const linePrefix = getMandatoryNamedGroup(match, "LinePrefix");
299
304
  if (isInCallout && !linePrefix.includes("> ")) {
300
305
  return false;
301
306
  }
302
- const codeBlockContent = match.groups?.["CodeBlockContent"] ?? "";
307
+ const codeBlockContent = getOptionalNamedGroup(match, "CodeBlockContent") ?? "";
303
308
  const cleanCodeBlockContent = codeBlockContent.split("\n").map((line) => line.slice(linePrefix.length)).join("\n");
304
309
  return cleanCodeBlockContent === sourceLf;
305
310
  }
@@ -310,4 +315,4 @@ export {
310
315
  removeCodeBlock,
311
316
  replaceCodeBlock
312
317
  };
313
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21hcmtkb3duLWNvZGUtYmxvY2stcHJvY2Vzc29yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgY29kZSBibG9ja3MgaW4gT2JzaWRpYW4uXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQsXG4gIE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnLi4vdmFsdWUtcHJvdmlkZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBDb2RlQmxvY2tNYXJrZG93bkluZm9ybWF0aW9uIH0gZnJvbSAnLi9jb2RlLWJsb2NrLW1hcmtkb3duLWluZm9ybWF0aW9uLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VMb2NrQ29tcG9uZW50IH0gZnJvbSAnLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB0eXBlIHsgQ29udGVudEFyZ3MgfSBmcm9tICcuL3ZhdWx0LnRzJztcblxuaW1wb3J0IHsgYWJvcnRTaWduYWxBbnkgfSBmcm9tICcuLi9hYm9ydC1jb250cm9sbGVyLnRzJztcbmltcG9ydCB7IHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7XG4gIGVuc3VyZUxmRW5kaW5ncyxcbiAgZ2V0TGZOb3JtYWxpemVkT2Zmc2V0VG9PcmlnaW5hbE9mZnNldE1hcHBlcixcbiAgaGFzU2luZ2xlT2NjdXJyZW5jZSxcbiAgaW5kZW50LFxuICB1bmluZGVudFxufSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyByZXNvbHZlVmFsdWUgfSBmcm9tICcuLi92YWx1ZS1wcm92aWRlci50cyc7XG5pbXBvcnQgeyBnZXRGaWxlT3JOdWxsIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBpbnZva2VXaXRoRmlsZVN5c3RlbUxvY2ssXG4gIHByb2Nlc3MsXG4gIHNhdmVOb3RlXG59IGZyb20gJy4vdmF1bHQudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZXRDb2RlQmxvY2tNYXJrZG93bkluZm99LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldENvZGVCbG9ja01hcmtkb3duSW5mb1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSB7QGxpbmsgTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dH0gb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgY3R4OiBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBBIHtAbGluayBIVE1MRWxlbWVudH0gcmVwcmVzZW50aW5nIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgZWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBvZiB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBpbnNlcnRBZnRlckNvZGVCbG9ja30gLyB7QGxpbmsgaW5zZXJ0QmVmb3JlQ29kZUJsb2NrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnNlcnRDb2RlQmxvY2tQYXJhbXMgZXh0ZW5kcyBHZXRDb2RlQmxvY2tNYXJrZG93bkluZm9QYXJhbXMge1xuICAvKipcbiAgICogQSBudW1iZXIgb2YgbGluZXMgdG8gb2Zmc2V0IHRoZSBpbnNlcnRpb24gYnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbGluZU9mZnNldD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlLWxvY2sgY29tcG9uZW50IHVzZWQgdG8gbG9jayB0aGUgbm90ZSB3aGlsZSBpdCBpcyBiZWluZyBtb2RpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwcmVzZXJ2ZSB0aGUgbGluZSBwcmVmaXggb2YgdGhlIGNvZGUgYmxvY2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFByZXNlcnZlTGluZVByZWZpeD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGV4dCB0byBpbnNlcnQgYWZ0ZXIgdGhlIGNvZGUgYmxvY2suXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJlbW92ZUNvZGVCbG9ja30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlQ29kZUJsb2NrUGFyYW1zIGV4dGVuZHMgR2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZS1sb2NrIGNvbXBvbmVudCB1c2VkIHRvIGxvY2sgdGhlIG5vdGUgd2hpbGUgaXQgaXMgYmVpbmcgbW9kaWZpZWQuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8ga2VlcCB0aGUgZ2FwIGFmdGVyIHJlbW92aW5nIHRoZSBjb2RlIGJsb2NrLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRLZWVwR2FwPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmVwbGFjZUNvZGVCbG9ja30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwbGFjZUNvZGVCbG9ja1BhcmFtcyBleHRlbmRzIEdldENvZGVCbG9ja01hcmtkb3duSW5mb1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhYm9ydCBzaWduYWwgdG8gY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGEgbmV3IGNvZGUgYmxvY2suXG4gICAqL1xuICByZWFkb25seSBjb2RlQmxvY2tQcm92aWRlcjogVmFsdWVQcm92aWRlcjxzdHJpbmcsIENvbnRlbnRBcmdzPjtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlLWxvY2sgY29tcG9uZW50IHVzZWQgdG8gbG9jayB0aGUgbm90ZSB3aGlsZSBpdCBpcyBiZWluZyBtb2RpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBrZWVwIHRoZSBnYXAgd2hlbiB0aGUgbmV3IGNvZGUgYmxvY2sgaXMgZW1wdHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEtlZXBHYXBXaGVuRW1wdHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXNlcnZlIHRoZSBsaW5lIHByZWZpeCBvZiB0aGUgY29kZSBibG9jay5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4PzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIENyZWF0ZU1hcmtkb3duSW5mb0Zyb21NYXRjaFBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcHJveGltYXRlU2VjdGlvbkluZm86IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uO1xuICByZWFkb25seSBsaW5lc0JlZm9yZVNlY3Rpb25Db3VudDogbnVtYmVyO1xuICByZWFkb25seSBtYXRjaDogUmVnRXhwTWF0Y2hBcnJheTtcbiAgcmVhZG9ubHkgbm90ZUNvbnRlbnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcG90ZW50aWFsQ29kZUJsb2NrVGV4dDogc3RyaW5nO1xuICByZWFkb25seSBzb3VyY2VMaW5lc0NvdW50OiBudW1iZXI7XG4gIHJlYWRvbmx5IHRleHRMaW5lT2Zmc2V0czogUmVhZG9ubHlNYXA8bnVtYmVyLCBudW1iZXI+O1xufVxuXG5pbnRlcmZhY2UgSW5zZXJ0VGV4dFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29udGVudCB0byBpbnNlcnQgdGhlIHRleHQgaW50by5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxpbmUgaW5kZXggdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5zZXJ0TGluZUluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJlc2VydmUgdGhlIGxpbmUgcHJlZml4IG9mIHRoZSBsaW5lIGF0IHRoZSBpbnNlcnRpb24gcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFByZXNlcnZlTGluZVByZWZpeD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHRvIGluc2VydC5cbiAgICovXG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIElzU3VpdGFibGVDb2RlQmxvY2tQYXJhbXMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY29kZSBibG9jayBpcyBpbnNpZGUgYSBjYWxsb3V0LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNJbkNhbGxvdXQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSB0aGUgY29kZSBibG9jayBpcyBleHBlY3RlZCB0byBoYXZlLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBvZiB0aGUgY29kZSBibG9jayBjYW5kaWRhdGUuXG4gICAqL1xuICByZWFkb25seSBtYXRjaDogUmVnRXhwTWF0Y2hBcnJheTtcblxuICAvKipcbiAgICogVGhlIExGLW5vcm1hbGl6ZWQgc291cmNlIG9mIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlTGY6IHN0cmluZztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIGNvZGUgYmxvY2sgaW4gYSBNYXJrZG93biBzZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgVGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlIGJsb2NrIGluIHRoZSBNYXJrZG93biBzZWN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvKHBhcmFtczogR2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvUGFyYW1zKTogUHJvbWlzZTxDb2RlQmxvY2tNYXJrZG93bkluZm9ybWF0aW9uIHwgbnVsbD4ge1xuICBjb25zdCB7IGFwcCwgY3R4LCBlbCwgc291cmNlIH0gPSBwYXJhbXM7XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IGN0eC5zb3VyY2VQYXRoIH0pO1xuICBhc3NlcnROb25OdWxsYWJsZShzb3VyY2VGaWxlLCBgU291cmNlIGZpbGUgJHtjdHguc291cmNlUGF0aH0gbm90IGZvdW5kLmApO1xuXG4gIGF3YWl0IHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jKCk7XG4gIGF3YWl0IHNhdmVOb3RlKGFwcCwgc291cmNlRmlsZSk7XG5cbiAgbGV0IG1hcmtkb3duSW5mbzogQ29kZUJsb2NrTWFya2Rvd25JbmZvcm1hdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGF3YWl0IGludm9rZVdpdGhGaWxlU3lzdGVtTG9jayh7XG4gICAgYXBwLFxuICAgIGZuKG5vdGVDb250ZW50KSB7XG4gICAgICBjb25zdCBub3RlQ29udGVudExmID0gZW5zdXJlTGZFbmRpbmdzKG5vdGVDb250ZW50KTtcblxuICAgICAgY29uc3QgYXBwcm94aW1hdGVTZWN0aW9uSW5mbzogTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24gPSB7XG4gICAgICAgIGxpbmVFbmQ6IG5vdGVDb250ZW50TGYuc3BsaXQoJ1xcbicpLmxlbmd0aCAtIDEsXG4gICAgICAgIGxpbmVTdGFydDogMCxcbiAgICAgICAgdGV4dDogbm90ZUNvbnRlbnRMZlxuICAgICAgfTtcblxuICAgICAgYXBwcm94aW1hdGVTZWN0aW9uSW5mby50ZXh0ID0gZW5zdXJlTGZFbmRpbmdzKGFwcHJveGltYXRlU2VjdGlvbkluZm8udGV4dCk7XG4gICAgICBjb25zdCBzb3VyY2VMZiA9IGVuc3VyZUxmRW5kaW5ncyhzb3VyY2UpO1xuXG4gICAgICBpZiAoXG4gICAgICAgICFoYXNTaW5nbGVPY2N1cnJlbmNlKHtcbiAgICAgICAgICBzZWFyY2hWYWx1ZTogYXBwcm94aW1hdGVTZWN0aW9uSW5mby50ZXh0LFxuICAgICAgICAgIHN0cjogbm90ZUNvbnRlbnRMZlxuICAgICAgICB9KVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VjdGlvbk9mZnNldCA9IG5vdGVDb250ZW50TGYuaW5kZXhPZihhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLnRleHQpO1xuICAgICAgY29uc3QgbGluZXNCZWZvcmVTZWN0aW9uQ291bnQgPSBub3RlQ29udGVudExmLnNsaWNlKDAsIHNlY3Rpb25PZmZzZXQpLnNwbGl0KCdcXG4nKS5sZW5ndGggLSAxO1xuXG4gICAgICBjb25zdCBpc0luQ2FsbG91dCA9ICEhZWwucGFyZW50RWxlbWVudD8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjYWxsb3V0LWNvbnRlbnQnKTtcblxuICAgICAgY29uc3QgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZUZyb21FbGVtZW50KGVsKTtcbiAgICAgIGNvbnN0IHNvdXJjZUxpbmVzID0gc291cmNlTGYuc3BsaXQoJ1xcbicpO1xuXG4gICAgICBjb25zdCB0ZXh0TGluZXMgPSBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLnRleHQuc3BsaXQoJ1xcbicpO1xuICAgICAgY29uc3QgdGV4dExpbmVPZmZzZXRzID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgICAgIHRleHRMaW5lT2Zmc2V0cy5zZXQobGluZXNCZWZvcmVTZWN0aW9uQ291bnQsIHNlY3Rpb25PZmZzZXQpO1xuXG4gICAgICBsZXQgbGFzdFRleHRMaW5lT2Zmc2V0ID0gc2VjdGlvbk9mZnNldDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dExpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHRleHRMaW5lID0gdGV4dExpbmVzW2ldID8/ICcnO1xuICAgICAgICBjb25zdCBsaW5lT2Zmc2V0ID0gbGFzdFRleHRMaW5lT2Zmc2V0ICsgdGV4dExpbmUubGVuZ3RoICsgMTtcbiAgICAgICAgdGV4dExpbmVPZmZzZXRzLnNldChsaW5lc0JlZm9yZVNlY3Rpb25Db3VudCArIGkgKyAxLCBsaW5lT2Zmc2V0KTtcbiAgICAgICAgbGFzdFRleHRMaW5lT2Zmc2V0ID0gbGluZU9mZnNldDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcG90ZW50aWFsQ29kZUJsb2NrVGV4dExpbmVzID0gdGV4dExpbmVzLm1hcCgobGluZSwgaW5kZXgpID0+IGFwcHJveGltYXRlU2VjdGlvbkluZm8ubGluZVN0YXJ0IDw9IGluZGV4ICYmIGluZGV4IDw9IGFwcHJveGltYXRlU2VjdGlvbkluZm8ubGluZUVuZCA/IGxpbmUgOiAnJyk7XG4gICAgICBjb25zdCBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0ID0gcG90ZW50aWFsQ29kZUJsb2NrVGV4dExpbmVzLmpvaW4oJ1xcbicpO1xuXG4gICAgICBjb25zdCBSRUdfRVhQID0gLyg/PD1efFxcbikoPzxMaW5lUHJlZml4PiB7MCwzfSg/Oj4gezEsM30pKikoPzxDb2RlQmxvY2tTdGFydERlbGltaXRlcj4oPzxDb2RlQmxvY2tTdGFydERlbGltaXRlckNoYXI+W2B+XSkoPzpcXGs8Q29kZUJsb2NrU3RhcnREZWxpbWl0ZXJDaGFyPnsyLH0pKSg/PENvZGVCbG9ja0xhbmd1YWdlPlxcUyopKD86WyBcXHRdKD88Q29kZUJsb2NrQXJncz4uKj8pKT8oPzpcXG4oPzxDb2RlQmxvY2tDb250ZW50Pig/Olxcbj9cXGs8TGluZVByZWZpeD4uKikrPykpP1xcblxcazxMaW5lUHJlZml4Pig/PENvZGVCbG9ja0VuZERlbGltaXRlcj5cXGs8Q29kZUJsb2NrU3RhcnREZWxpbWl0ZXI+XFxrPENvZGVCbG9ja1N0YXJ0RGVsaW1pdGVyQ2hhcj4qKVsgXFx0XSooPz1cXG58JCkvZztcblxuICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0Lm1hdGNoQWxsKFJFR19FWFApKSB7XG4gICAgICAgIGlmICghaXNTdWl0YWJsZUNvZGVCbG9jayh7IGlzSW5DYWxsb3V0LCBsYW5ndWFnZSwgbWF0Y2gsIHNvdXJjZUxmIH0pKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWFya2Rvd25JbmZvKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFya2Rvd25JbmZvID0gY3JlYXRlTWFya2Rvd25JbmZvRnJvbU1hdGNoKHtcbiAgICAgICAgICBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLFxuICAgICAgICAgIGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50LFxuICAgICAgICAgIG1hdGNoLFxuICAgICAgICAgIG5vdGVDb250ZW50LFxuICAgICAgICAgIHBvdGVudGlhbENvZGVCbG9ja1RleHQsXG4gICAgICAgICAgc291cmNlTGluZXNDb3VudDogc291cmNlTGluZXMubGVuZ3RoLFxuICAgICAgICAgIHRleHRMaW5lT2Zmc2V0c1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFtYXJrZG93bkluZm8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobm90ZUNvbnRlbnRMZiA9PT0gbm90ZUNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsZk9mZnNldE1hcHBlciA9IGdldExmTm9ybWFsaXplZE9mZnNldFRvT3JpZ2luYWxPZmZzZXRNYXBwZXIobm90ZUNvbnRlbnQpO1xuICAgICAgbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLnN0YXJ0Lm9mZnNldCA9IGxmT2Zmc2V0TWFwcGVyKG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5zdGFydC5vZmZzZXQpO1xuICAgICAgbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLmVuZC5vZmZzZXQgPSBsZk9mZnNldE1hcHBlcihtYXJrZG93bkluZm8ucG9zaXRpb25Jbk5vdGUuZW5kLm9mZnNldCk7XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlOiBzb3VyY2VGaWxlXG4gIH0pO1xuXG4gIHJldHVybiBtYXJrZG93bkluZm87XG59XG5cbi8qKlxuICogSW5zZXJ0cyB0ZXh0IGFmdGVyIHRoZSBjb2RlIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW4tZGV2LXV0aWxzL3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2ggLS0gSW50ZW50aW9uYWxseSBzaGFyZXMgSW5zZXJ0Q29kZUJsb2NrUGFyYW1zIHdpdGggaW5zZXJ0QmVmb3JlQ29kZUJsb2NrLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc2VydEFmdGVyQ29kZUJsb2NrKHBhcmFtczogSW5zZXJ0Q29kZUJsb2NrUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYXBwLCBjdHgsIGxpbmVPZmZzZXQgPSAwLCB0ZXh0IH0gPSBwYXJhbXM7XG5cbiAgYXdhaXQgcHJvY2Vzcyh7XG4gICAgYXBwLFxuICAgIGFzeW5jIG5ld0NvbnRlbnRQcm92aWRlcih7IGNvbnRlbnQgfSkge1xuICAgICAgY29uc3QgbWFya2Rvd25JbmZvID0gYXdhaXQgZ2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvKHBhcmFtcyk7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShtYXJrZG93bkluZm8sICdDb3VsZCBub3QgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGNvZGUgYmxvY2suJyk7XG5cbiAgICAgIGlmIChjb250ZW50ICE9PSBtYXJrZG93bkluZm8ubm90ZUNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluc2VydExpbmVJbmRleCA9IG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5lbmQubGluZSArIGxpbmVPZmZzZXQgKyAxO1xuICAgICAgcmV0dXJuIGluc2VydFRleHQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEluc2VydFRleHRQYXJhbXM+KHtcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgaW5zZXJ0TGluZUluZGV4LFxuICAgICAgICBzaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXg6IHBhcmFtcy5zaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXgsXG4gICAgICAgIHRleHRcbiAgICAgIH0pKTtcbiAgICB9LFxuICAgIHBhdGhPckZpbGU6IGN0eC5zb3VyY2VQYXRoLFxuICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogcGFyYW1zLnJlc291cmNlTG9ja0NvbXBvbmVudFxuICB9KTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIHRleHQgYmVmb3JlIHRoZSBjb2RlIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW4tZGV2LXV0aWxzL3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2ggLS0gSW50ZW50aW9uYWxseSBzaGFyZXMgSW5zZXJ0Q29kZUJsb2NrUGFyYW1zIHdpdGggaW5zZXJ0QWZ0ZXJDb2RlQmxvY2suXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zZXJ0QmVmb3JlQ29kZUJsb2NrKHBhcmFtczogSW5zZXJ0Q29kZUJsb2NrUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYXBwLCBjdHgsIGxpbmVPZmZzZXQgPSAwLCB0ZXh0IH0gPSBwYXJhbXM7XG5cbiAgYXdhaXQgcHJvY2Vzcyh7XG4gICAgYXBwLFxuICAgIGFzeW5jIG5ld0NvbnRlbnRQcm92aWRlcih7IGNvbnRlbnQgfSkge1xuICAgICAgY29uc3QgbWFya2Rvd25JbmZvID0gYXdhaXQgZ2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvKHBhcmFtcyk7XG4gICAgICBpZiAoIW1hcmtkb3duSW5mbykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29kZSBibG9jay4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRlbnQgIT09IG1hcmtkb3duSW5mby5ub3RlQ29udGVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5zZXJ0TGluZUluZGV4ID0gbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLnN0YXJ0LmxpbmUgLSBsaW5lT2Zmc2V0O1xuICAgICAgcmV0dXJuIGluc2VydFRleHQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEluc2VydFRleHRQYXJhbXM+KHtcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgaW5zZXJ0TGluZUluZGV4LFxuICAgICAgICBzaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXg6IHBhcmFtcy5zaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXgsXG4gICAgICAgIHRleHRcbiAgICAgIH0pKTtcbiAgICB9LFxuICAgIHBhdGhPckZpbGU6IGN0eC5zb3VyY2VQYXRoLFxuICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogcGFyYW1zLnJlc291cmNlTG9ja0NvbXBvbmVudFxuICB9KTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBjb2RlIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlQ29kZUJsb2NrKHBhcmFtczogUmVtb3ZlQ29kZUJsb2NrUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlcGxhY2VDb2RlQmxvY2soe1xuICAgIC4uLnBhcmFtcyxcbiAgICBjb2RlQmxvY2tQcm92aWRlcjogJycsXG4gICAgc2hvdWxkS2VlcEdhcFdoZW5FbXB0eTogcGFyYW1zLnNob3VsZEtlZXBHYXAgPz8gZmFsc2VcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIGNvZGUgYmxvY2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXBsYWNlQ29kZUJsb2NrKHBhcmFtczogUmVwbGFjZUNvZGVCbG9ja1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCwgY29kZUJsb2NrUHJvdmlkZXIsIGN0eCB9ID0gcGFyYW1zO1xuICBwYXJhbXMuYWJvcnRTaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG5cbiAgYXdhaXQgcHJvY2Vzcyh7XG4gICAgYXBwLFxuICAgIGFzeW5jIG5ld0NvbnRlbnRQcm92aWRlcih7IGFib3J0U2lnbmFsLCBjb250ZW50IH0pIHtcbiAgICAgIGFib3J0U2lnbmFsID0gYWJvcnRTaWduYWxBbnkoYWJvcnRTaWduYWwsIHBhcmFtcy5hYm9ydFNpZ25hbCk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgbWFya2Rvd25JbmZvID0gYXdhaXQgZ2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvKHBhcmFtcyk7XG4gICAgICBpZiAoIW1hcmtkb3duSW5mbykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29kZSBibG9jay4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRlbnQgIT09IG1hcmtkb3duSW5mby5ub3RlQ29udGVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbGV0IG9sZENvZGVCbG9jayA9IGNvbnRlbnQuc2xpY2UobWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLnN0YXJ0Lm9mZnNldCwgbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLmVuZC5vZmZzZXQpO1xuICAgICAgaWYgKHBhcmFtcy5zaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXgpIHtcbiAgICAgICAgb2xkQ29kZUJsb2NrID0gdW5pbmRlbnQoe1xuICAgICAgICAgIHByZWZpeDogbWFya2Rvd25JbmZvLmxpbmVQcmVmaXgsXG4gICAgICAgICAgdGV4dDogb2xkQ29kZUJsb2NrXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV3Q29kZUJsb2NrID0gYXdhaXQgcmVzb2x2ZVZhbHVlKGNvZGVCbG9ja1Byb3ZpZGVyLCB7IGFib3J0U2lnbmFsLCBjb250ZW50OiBvbGRDb2RlQmxvY2sgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgaWYgKChuZXdDb2RlQmxvY2sgfHwgcGFyYW1zLnNob3VsZEtlZXBHYXBXaGVuRW1wdHkpICYmIHBhcmFtcy5zaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXgpIHtcbiAgICAgICAgbmV3Q29kZUJsb2NrID0gaW5kZW50KHtcbiAgICAgICAgICBwcmVmaXg6IG1hcmtkb3duSW5mby5saW5lUHJlZml4LFxuICAgICAgICAgIHRleHQ6IG5ld0NvZGVCbG9ja1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGV4dEJlZm9yZUNvZGVCbG9jayA9IGNvbnRlbnQuc2xpY2UoMCwgbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLnN0YXJ0Lm9mZnNldCk7XG4gICAgICBjb25zdCB0ZXh0QWZ0ZXJDb2RlQmxvY2sgPSBjb250ZW50LnNsaWNlKG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5lbmQub2Zmc2V0KTtcblxuICAgICAgaWYgKG5ld0NvZGVCbG9jayB8fCBwYXJhbXMuc2hvdWxkS2VlcEdhcFdoZW5FbXB0eSkge1xuICAgICAgICByZXR1cm4gYCR7dGV4dEJlZm9yZUNvZGVCbG9ja30ke25ld0NvZGVCbG9ja30ke3RleHRBZnRlckNvZGVCbG9ja31gO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRleHRCZWZvcmVDb2RlQmxvY2sgJiYgIXRleHRBZnRlckNvZGVCbG9jaykge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0ZXh0QmVmb3JlQ29kZUJsb2NrKSB7XG4gICAgICAgIHJldHVybiBgJHt0ZXh0QmVmb3JlQ29kZUJsb2NrLnNsaWNlKDAsIC0xKX0ke3RleHRBZnRlckNvZGVCbG9ja31gO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYCR7dGV4dEJlZm9yZUNvZGVCbG9ja30ke3RleHRBZnRlckNvZGVCbG9jay5zbGljZSgxKX1gO1xuICAgIH0sXG4gICAgcGF0aE9yRmlsZTogY3R4LnNvdXJjZVBhdGgsXG4gICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBwYXJhbXMucmVzb3VyY2VMb2NrQ29tcG9uZW50XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNYXJrZG93bkluZm9Gcm9tTWF0Y2gocGFyYW1zOiBDcmVhdGVNYXJrZG93bkluZm9Gcm9tTWF0Y2hQYXJhbXMpOiBDb2RlQmxvY2tNYXJrZG93bkluZm9ybWF0aW9uIHtcbiAgY29uc3Qge1xuICAgIGFwcHJveGltYXRlU2VjdGlvbkluZm8sXG4gICAgbGluZXNCZWZvcmVTZWN0aW9uQ291bnQsXG4gICAgbWF0Y2gsXG4gICAgbm90ZUNvbnRlbnQsXG4gICAgcG90ZW50aWFsQ29kZUJsb2NrVGV4dCxcbiAgICBzb3VyY2VMaW5lc0NvdW50LFxuICAgIHRleHRMaW5lT2Zmc2V0c1xuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGxpbmVQcmVmaXggPSBtYXRjaC5ncm91cHM/LlsnTGluZVByZWZpeCddID8/ICcnO1xuICBjb25zdCBjb2RlQmxvY2tTdGFydERlbGltaXRlciA9IG1hdGNoLmdyb3Vwcz8uWydDb2RlQmxvY2tTdGFydERlbGltaXRlciddID8/ICcnO1xuICBjb25zdCBjb2RlQmxvY2tFbmREZWxpbWl0ZXIgPSBtYXRjaC5ncm91cHM/LlsnQ29kZUJsb2NrRW5kRGVsaW1pdGVyJ10gPz8gJyc7XG4gIGNvbnN0IGNvZGVCbG9ja0FyZ3NTdHIgPSBtYXRjaC5ncm91cHM/LlsnQ29kZUJsb2NrQXJncyddID8/ICcnO1xuICBjb25zdCBsYW5ndWFnZSA9IG1hdGNoLmdyb3Vwcz8uWydDb2RlQmxvY2tMYW5ndWFnZSddID8/ICcnO1xuXG4gIGNvbnN0IHByZXZpb3VzVGV4dCA9IHBvdGVudGlhbENvZGVCbG9ja1RleHQuc2xpY2UoMCwgbWF0Y2guaW5kZXgpO1xuICBjb25zdCBwcmV2aW91c1RleHRMaW5lc0NvdW50ID0gcHJldmlvdXNUZXh0LnNwbGl0KCdcXG4nKS5sZW5ndGggLSAxO1xuXG4gIGNvbnN0IHN0YXJ0TGluZSA9IGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50ICsgcHJldmlvdXNUZXh0TGluZXNDb3VudDtcbiAgY29uc3QgZW5kTGluZSA9IHN0YXJ0TGluZSArIHNvdXJjZUxpbmVzQ291bnQgKyAxO1xuXG4gIHJldHVybiB7XG4gICAgYXJnczogY29kZUJsb2NrQXJnc1N0ci5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKSxcbiAgICBlbmREZWxpbWl0ZXI6IGNvZGVCbG9ja0VuZERlbGltaXRlcixcbiAgICBsYW5ndWFnZSxcbiAgICBsaW5lUHJlZml4LFxuICAgIG5vdGVDb250ZW50LFxuICAgIHBvc2l0aW9uSW5Ob3RlOiB7XG4gICAgICBlbmQ6IHtcbiAgICAgICAgY29sOiAodGV4dExpbmVPZmZzZXRzLmdldChlbmRMaW5lICsgMSkgPz8gMCkgLSAodGV4dExpbmVPZmZzZXRzLmdldChlbmRMaW5lKSA/PyAwKSAtIDEsXG4gICAgICAgIGxpbmU6IGVuZExpbmUsXG4gICAgICAgIG9mZnNldDogKHRleHRMaW5lT2Zmc2V0cy5nZXQoZW5kTGluZSArIDEpID8/IDApIC0gMVxuICAgICAgfSxcbiAgICAgIHN0YXJ0OiB7XG4gICAgICAgIGNvbDogMCxcbiAgICAgICAgbGluZTogc3RhcnRMaW5lLFxuICAgICAgICBvZmZzZXQ6IHRleHRMaW5lT2Zmc2V0cy5nZXQoc3RhcnRMaW5lKSA/PyAwXG4gICAgICB9XG4gICAgfSxcbiAgICByYXdBcmdzU3RyOiBjb2RlQmxvY2tBcmdzU3RyLFxuICAgIHNlY3Rpb25JbmZvOiB7XG4gICAgICBsaW5lRW5kOiBwcmV2aW91c1RleHRMaW5lc0NvdW50ICsgc291cmNlTGluZXNDb3VudCArIDEsXG4gICAgICBsaW5lU3RhcnQ6IHByZXZpb3VzVGV4dExpbmVzQ291bnQsXG4gICAgICB0ZXh0OiBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLnRleHRcbiAgICB9LFxuICAgIHN0YXJ0RGVsaW1pdGVyOiBjb2RlQmxvY2tTdGFydERlbGltaXRlclxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRMYW5ndWFnZUZyb21FbGVtZW50KGVsOiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XG4gIGNvbnN0IEJMT0NLX0xBTkdVQUdFX1BSRUZJWCA9ICdibG9jay1sYW5ndWFnZS0nO1xuICByZXR1cm4gQXJyYXkuZnJvbShlbC5jbGFzc0xpc3QpLmZpbmQoKGNscykgPT4gY2xzLnN0YXJ0c1dpdGgoQkxPQ0tfTEFOR1VBR0VfUFJFRklYKSk/LnNsaWNlKEJMT0NLX0xBTkdVQUdFX1BSRUZJWC5sZW5ndGgpID8/ICcnO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRUZXh0KHBhcmFtczogSW5zZXJ0VGV4dFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgY29udGVudCwgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4ID0gZmFsc2UsIHRleHQgfSA9IHBhcmFtcztcbiAgbGV0IHsgaW5zZXJ0TGluZUluZGV4IH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgbmV3TGluZXMgPSBsaW5lcy5zbGljZSgpO1xuICBjb25zdCB0ZXh0TGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcblxuICBpZiAoaW5zZXJ0TGluZUluZGV4IDwgMCkge1xuICAgIGluc2VydExpbmVJbmRleCA9IDA7XG4gIH1cbiAgaWYgKGluc2VydExpbmVJbmRleCA+IGxpbmVzLmxlbmd0aCkge1xuICAgIGluc2VydExpbmVJbmRleCA9IGxpbmVzLmxlbmd0aDtcbiAgfVxuXG4gIGNvbnN0IFBSRUZJWF9MSU5FX1JFR19FWFAgPSAvXiB7MCwzfSg/Oj4gezEsM30pKi9nO1xuICBjb25zdCBtYXRjaCA9IChsaW5lc1tpbnNlcnRMaW5lSW5kZXhdID8/ICcnKS5tYXRjaChQUkVGSVhfTElORV9SRUdfRVhQKTtcbiAgY29uc3QgbGluZVByZWZpeCA9IG1hdGNoPy5bMF0gPz8gJyc7XG4gIG5ld0xpbmVzLnNwbGljZShcbiAgICBpbnNlcnRMaW5lSW5kZXgsXG4gICAgMCxcbiAgICAuLi4oc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4XG4gICAgICA/IHRleHRMaW5lcy5tYXAoKGxpbmUpID0+XG4gICAgICAgIGluZGVudCh7XG4gICAgICAgICAgcHJlZml4OiBsaW5lUHJlZml4LFxuICAgICAgICAgIHRleHQ6IGxpbmVcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIDogdGV4dExpbmVzKVxuICApO1xuICByZXR1cm4gbmV3TGluZXMuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGlzU3VpdGFibGVDb2RlQmxvY2socGFyYW1zOiBJc1N1aXRhYmxlQ29kZUJsb2NrUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgaXNJbkNhbGxvdXQsIGxhbmd1YWdlLCBtYXRjaCwgc291cmNlTGYgfSA9IHBhcmFtcztcblxuICBjb25zdCBjb2RlQmxvY2tMYW5ndWFnZSA9IG1hdGNoLmdyb3Vwcz8uWydDb2RlQmxvY2tMYW5ndWFnZSddID8/ICcnO1xuICBpZiAoY29kZUJsb2NrTGFuZ3VhZ2UgIT09IGxhbmd1YWdlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbGluZVByZWZpeCA9IG1hdGNoLmdyb3Vwcz8uWydMaW5lUHJlZml4J10gPz8gJyc7XG5cbiAgaWYgKGlzSW5DYWxsb3V0ICYmICFsaW5lUHJlZml4LmluY2x1ZGVzKCc+ICcpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY29kZUJsb2NrQ29udGVudCA9IG1hdGNoLmdyb3Vwcz8uWydDb2RlQmxvY2tDb250ZW50J10gPz8gJyc7XG4gIGNvbnN0IGNsZWFuQ29kZUJsb2NrQ29udGVudCA9IGNvZGVCbG9ja0NvbnRlbnQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS5zbGljZShsaW5lUHJlZml4Lmxlbmd0aCkpLmpvaW4oJ1xcbicpO1xuXG4gIHJldHVybiBjbGVhbkNvZGVCbG9ja0NvbnRlbnQgPT09IHNvdXJjZUxmO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkEsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxrQ0FBa0M7QUFDM0MsU0FBUyxtQ0FBbUM7QUFDNUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG9CQUFvQjtBQUM3QixTQUFTLHFCQUFxQjtBQUM5QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUF5S1AsZUFBc0IseUJBQXlCLFFBQXNGO0FBQ25JLFFBQU0sRUFBRSxLQUFLLEtBQUssSUFBSSxPQUFPLElBQUk7QUFFakMsUUFBTSxhQUFhLGNBQWMsRUFBRSxLQUFLLFlBQVksSUFBSSxXQUFXLENBQUM7QUFDcEUsb0JBQWtCLFlBQVksZUFBZSxJQUFJLFVBQVUsYUFBYTtBQUV4RSxRQUFNLDJCQUEyQjtBQUNqQyxRQUFNLFNBQVMsS0FBSyxVQUFVO0FBRTlCLE1BQUksZUFBb0Q7QUFFeEQsUUFBTSx5QkFBeUI7QUFBQSxJQUM3QjtBQUFBLElBQ0EsR0FBRyxhQUFhO0FBQ2QsWUFBTSxnQkFBZ0IsZ0JBQWdCLFdBQVc7QUFFakQsWUFBTSx5QkFBcUQ7QUFBQSxRQUN6RCxTQUFTLGNBQWMsTUFBTSxJQUFJLEVBQUUsU0FBUztBQUFBLFFBQzVDLFdBQVc7QUFBQSxRQUNYLE1BQU07QUFBQSxNQUNSO0FBRUEsNkJBQXVCLE9BQU8sZ0JBQWdCLHVCQUF1QixJQUFJO0FBQ3pFLFlBQU0sV0FBVyxnQkFBZ0IsTUFBTTtBQUV2QyxVQUNFLENBQUMsb0JBQW9CO0FBQUEsUUFDbkIsYUFBYSx1QkFBdUI7QUFBQSxRQUNwQyxLQUFLO0FBQUEsTUFDUCxDQUFDLEdBQ0Q7QUFDQTtBQUFBLE1BQ0Y7QUFFQSxZQUFNLGdCQUFnQixjQUFjLFFBQVEsdUJBQXVCLElBQUk7QUFDdkUsWUFBTSwwQkFBMEIsY0FBYyxNQUFNLEdBQUcsYUFBYSxFQUFFLE1BQU0sSUFBSSxFQUFFLFNBQVM7QUFFM0YsWUFBTSxjQUFjLENBQUMsQ0FBQyxHQUFHLGVBQWUsVUFBVSxTQUFTLGlCQUFpQjtBQUU1RSxZQUFNLFdBQVcsdUJBQXVCLEVBQUU7QUFDMUMsWUFBTSxjQUFjLFNBQVMsTUFBTSxJQUFJO0FBRXZDLFlBQU0sWUFBWSx1QkFBdUIsS0FBSyxNQUFNLElBQUk7QUFDeEQsWUFBTSxrQkFBa0Isb0JBQUksSUFBb0I7QUFDaEQsc0JBQWdCLElBQUkseUJBQXlCLGFBQWE7QUFFMUQsVUFBSSxxQkFBcUI7QUFDekIsZUFBUyxJQUFJLEdBQUcsSUFBSSxVQUFVLFFBQVEsS0FBSztBQUN6QyxjQUFNLFdBQVcsVUFBVSxDQUFDLEtBQUs7QUFDakMsY0FBTSxhQUFhLHFCQUFxQixTQUFTLFNBQVM7QUFDMUQsd0JBQWdCLElBQUksMEJBQTBCLElBQUksR0FBRyxVQUFVO0FBQy9ELDZCQUFxQjtBQUFBLE1BQ3ZCO0FBRUEsWUFBTSw4QkFBOEIsVUFBVSxJQUFJLENBQUMsTUFBTSxVQUFVLHVCQUF1QixhQUFhLFNBQVMsU0FBUyx1QkFBdUIsVUFBVSxPQUFPLEVBQUU7QUFDbkssWUFBTSx5QkFBeUIsNEJBQTRCLEtBQUssSUFBSTtBQUVwRSxZQUFNLFVBQVU7QUFFaEIsaUJBQVcsU0FBUyx1QkFBdUIsU0FBUyxPQUFPLEdBQUc7QUFDNUQsWUFBSSxDQUFDLG9CQUFvQixFQUFFLGFBQWEsVUFBVSxPQUFPLFNBQVMsQ0FBQyxHQUFHO0FBQ3BFO0FBQUEsUUFDRjtBQUVBLFlBQUksY0FBYztBQUNoQjtBQUFBLFFBQ0Y7QUFFQSx1QkFBZSw0QkFBNEI7QUFBQSxVQUN6QztBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBLGtCQUFrQixZQUFZO0FBQUEsVUFDOUI7QUFBQSxRQUNGLENBQUM7QUFBQSxNQUNIO0FBRUEsVUFBSSxDQUFDLGNBQWM7QUFDakI7QUFBQSxNQUNGO0FBRUEsVUFBSSxrQkFBa0IsYUFBYTtBQUNqQztBQUFBLE1BQ0Y7QUFFQSxZQUFNLGlCQUFpQiw0Q0FBNEMsV0FBVztBQUM5RSxtQkFBYSxlQUFlLE1BQU0sU0FBUyxlQUFlLGFBQWEsZUFBZSxNQUFNLE1BQU07QUFDbEcsbUJBQWEsZUFBZSxJQUFJLFNBQVMsZUFBZSxhQUFhLGVBQWUsSUFBSSxNQUFNO0FBQUEsSUFDaEc7QUFBQSxJQUNBLFlBQVk7QUFBQSxFQUNkLENBQUM7QUFFRCxTQUFPO0FBQ1Q7QUFRQSxlQUFzQixxQkFBcUIsUUFBOEM7QUFDdkYsUUFBTSxFQUFFLEtBQUssS0FBSyxhQUFhLEdBQUcsS0FBSyxJQUFJO0FBRTNDLFFBQU0sUUFBUTtBQUFBLElBQ1o7QUFBQSxJQUNBLE1BQU0sbUJBQW1CLEVBQUUsUUFBUSxHQUFHO0FBQ3BDLFlBQU0sZUFBZSxNQUFNLHlCQUF5QixNQUFNO0FBQzFELHdCQUFrQixjQUFjLDZDQUE2QztBQUU3RSxVQUFJLFlBQVksYUFBYSxhQUFhO0FBQ3hDLGVBQU87QUFBQSxNQUNUO0FBRUEsWUFBTSxrQkFBa0IsYUFBYSxlQUFlLElBQUksT0FBTyxhQUFhO0FBQzVFLGFBQU8sV0FBVyw0QkFBOEM7QUFBQSxRQUM5RDtBQUFBLFFBQ0E7QUFBQSxRQUNBLDBCQUEwQixPQUFPO0FBQUEsUUFDakM7QUFBQSxNQUNGLENBQUMsQ0FBQztBQUFBLElBQ0o7QUFBQSxJQUNBLFlBQVksSUFBSTtBQUFBLElBQ2hCLHVCQUF1QixPQUFPO0FBQUEsRUFDaEMsQ0FBQztBQUNIO0FBUUEsZUFBc0Isc0JBQXNCLFFBQThDO0FBQ3hGLFFBQU0sRUFBRSxLQUFLLEtBQUssYUFBYSxHQUFHLEtBQUssSUFBSTtBQUUzQyxRQUFNLFFBQVE7QUFBQSxJQUNaO0FBQUEsSUFDQSxNQUFNLG1CQUFtQixFQUFFLFFBQVEsR0FBRztBQUNwQyxZQUFNLGVBQWUsTUFBTSx5QkFBeUIsTUFBTTtBQUMxRCxVQUFJLENBQUMsY0FBYztBQUNqQixjQUFNLElBQUksTUFBTSw2Q0FBNkM7QUFBQSxNQUMvRDtBQUVBLFVBQUksWUFBWSxhQUFhLGFBQWE7QUFDeEMsZUFBTztBQUFBLE1BQ1Q7QUFFQSxZQUFNLGtCQUFrQixhQUFhLGVBQWUsTUFBTSxPQUFPO0FBQ2pFLGFBQU8sV0FBVyw0QkFBOEM7QUFBQSxRQUM5RDtBQUFBLFFBQ0E7QUFBQSxRQUNBLDBCQUEwQixPQUFPO0FBQUEsUUFDakM7QUFBQSxNQUNGLENBQUMsQ0FBQztBQUFBLElBQ0o7QUFBQSxJQUNBLFlBQVksSUFBSTtBQUFBLElBQ2hCLHVCQUF1QixPQUFPO0FBQUEsRUFDaEMsQ0FBQztBQUNIO0FBT0EsZUFBc0IsZ0JBQWdCLFFBQThDO0FBQ2xGLFFBQU0saUJBQWlCO0FBQUEsSUFDckIsR0FBRztBQUFBLElBQ0gsbUJBQW1CO0FBQUEsSUFDbkIsd0JBQXdCLE9BQU8saUJBQWlCO0FBQUEsRUFDbEQsQ0FBQztBQUNIO0FBT0EsZUFBc0IsaUJBQWlCLFFBQStDO0FBQ3BGLFFBQU0sRUFBRSxLQUFLLG1CQUFtQixJQUFJLElBQUk7QUFDeEMsU0FBTyxhQUFhLGVBQWU7QUFFbkMsUUFBTSxRQUFRO0FBQUEsSUFDWjtBQUFBLElBQ0EsTUFBTSxtQkFBbUIsRUFBRSxhQUFhLFFBQVEsR0FBRztBQUNqRCxvQkFBYyxlQUFlLGFBQWEsT0FBTyxXQUFXO0FBQzVELGtCQUFZLGVBQWU7QUFDM0IsWUFBTSxlQUFlLE1BQU0seUJBQXlCLE1BQU07QUFDMUQsVUFBSSxDQUFDLGNBQWM7QUFDakIsY0FBTSxJQUFJLE1BQU0sNkNBQTZDO0FBQUEsTUFDL0Q7QUFFQSxVQUFJLFlBQVksYUFBYSxhQUFhO0FBQ3hDLGVBQU87QUFBQSxNQUNUO0FBRUEsVUFBSSxlQUFlLFFBQVEsTUFBTSxhQUFhLGVBQWUsTUFBTSxRQUFRLGFBQWEsZUFBZSxJQUFJLE1BQU07QUFDakgsVUFBSSxPQUFPLDBCQUEwQjtBQUNuQyx1QkFBZSxTQUFTO0FBQUEsVUFDdEIsUUFBUSxhQUFhO0FBQUEsVUFDckIsTUFBTTtBQUFBLFFBQ1IsQ0FBQztBQUFBLE1BQ0g7QUFFQSxVQUFJLGVBQWUsTUFBTSxhQUFhLG1CQUFtQixFQUFFLGFBQWEsU0FBUyxhQUFhLENBQUM7QUFDL0Ysa0JBQVksZUFBZTtBQUMzQixXQUFLLGdCQUFnQixPQUFPLDJCQUEyQixPQUFPLDBCQUEwQjtBQUN0Rix1QkFBZSxPQUFPO0FBQUEsVUFDcEIsUUFBUSxhQUFhO0FBQUEsVUFDckIsTUFBTTtBQUFBLFFBQ1IsQ0FBQztBQUFBLE1BQ0g7QUFFQSxZQUFNLHNCQUFzQixRQUFRLE1BQU0sR0FBRyxhQUFhLGVBQWUsTUFBTSxNQUFNO0FBQ3JGLFlBQU0scUJBQXFCLFFBQVEsTUFBTSxhQUFhLGVBQWUsSUFBSSxNQUFNO0FBRS9FLFVBQUksZ0JBQWdCLE9BQU8sd0JBQXdCO0FBQ2pELGVBQU8sR0FBRyxtQkFBbUIsR0FBRyxZQUFZLEdBQUcsa0JBQWtCO0FBQUEsTUFDbkU7QUFFQSxVQUFJLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CO0FBQy9DLGVBQU87QUFBQSxNQUNUO0FBRUEsVUFBSSxxQkFBcUI7QUFDdkIsZUFBTyxHQUFHLG9CQUFvQixNQUFNLEdBQUcsRUFBRSxDQUFDLEdBQUcsa0JBQWtCO0FBQUEsTUFDakU7QUFFQSxhQUFPLEdBQUcsbUJBQW1CLEdBQUcsbUJBQW1CLE1BQU0sQ0FBQyxDQUFDO0FBQUEsSUFDN0Q7QUFBQSxJQUNBLFlBQVksSUFBSTtBQUFBLElBQ2hCLHVCQUF1QixPQUFPO0FBQUEsRUFDaEMsQ0FBQztBQUNIO0FBRUEsU0FBUyw0QkFBNEIsUUFBeUU7QUFDNUcsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFFSixRQUFNLGFBQWEsTUFBTSxTQUFTLFlBQVksS0FBSztBQUNuRCxRQUFNLDBCQUEwQixNQUFNLFNBQVMseUJBQXlCLEtBQUs7QUFDN0UsUUFBTSx3QkFBd0IsTUFBTSxTQUFTLHVCQUF1QixLQUFLO0FBQ3pFLFFBQU0sbUJBQW1CLE1BQU0sU0FBUyxlQUFlLEtBQUs7QUFDNUQsUUFBTSxXQUFXLE1BQU0sU0FBUyxtQkFBbUIsS0FBSztBQUV4RCxRQUFNLGVBQWUsdUJBQXVCLE1BQU0sR0FBRyxNQUFNLEtBQUs7QUFDaEUsUUFBTSx5QkFBeUIsYUFBYSxNQUFNLElBQUksRUFBRSxTQUFTO0FBRWpFLFFBQU0sWUFBWSwwQkFBMEI7QUFDNUMsUUFBTSxVQUFVLFlBQVksbUJBQW1CO0FBRS9DLFNBQU87QUFBQSxJQUNMLE1BQU0saUJBQWlCLE1BQU0sS0FBSyxFQUFFLE9BQU8sT0FBTztBQUFBLElBQ2xELGNBQWM7QUFBQSxJQUNkO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLGdCQUFnQjtBQUFBLE1BQ2QsS0FBSztBQUFBLFFBQ0gsTUFBTSxnQkFBZ0IsSUFBSSxVQUFVLENBQUMsS0FBSyxNQUFNLGdCQUFnQixJQUFJLE9BQU8sS0FBSyxLQUFLO0FBQUEsUUFDckYsTUFBTTtBQUFBLFFBQ04sU0FBUyxnQkFBZ0IsSUFBSSxVQUFVLENBQUMsS0FBSyxLQUFLO0FBQUEsTUFDcEQ7QUFBQSxNQUNBLE9BQU87QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLE1BQU07QUFBQSxRQUNOLFFBQVEsZ0JBQWdCLElBQUksU0FBUyxLQUFLO0FBQUEsTUFDNUM7QUFBQSxJQUNGO0FBQUEsSUFDQSxZQUFZO0FBQUEsSUFDWixhQUFhO0FBQUEsTUFDWCxTQUFTLHlCQUF5QixtQkFBbUI7QUFBQSxNQUNyRCxXQUFXO0FBQUEsTUFDWCxNQUFNLHVCQUF1QjtBQUFBLElBQy9CO0FBQUEsSUFDQSxnQkFBZ0I7QUFBQSxFQUNsQjtBQUNGO0FBRUEsU0FBUyx1QkFBdUIsSUFBeUI7QUFDdkQsUUFBTSx3QkFBd0I7QUFDOUIsU0FBTyxNQUFNLEtBQUssR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxXQUFXLHFCQUFxQixDQUFDLEdBQUcsTUFBTSxzQkFBc0IsTUFBTSxLQUFLO0FBQy9IO0FBRUEsU0FBUyxXQUFXLFFBQWtDO0FBQ3BELFFBQU0sRUFBRSxTQUFTLDJCQUEyQixPQUFPLEtBQUssSUFBSTtBQUM1RCxNQUFJLEVBQUUsZ0JBQWdCLElBQUk7QUFFMUIsUUFBTSxRQUFRLFFBQVEsTUFBTSxJQUFJO0FBQ2hDLFFBQU0sV0FBVyxNQUFNLE1BQU07QUFDN0IsUUFBTSxZQUFZLEtBQUssTUFBTSxJQUFJO0FBRWpDLE1BQUksa0JBQWtCLEdBQUc7QUFDdkIsc0JBQWtCO0FBQUEsRUFDcEI7QUFDQSxNQUFJLGtCQUFrQixNQUFNLFFBQVE7QUFDbEMsc0JBQWtCLE1BQU07QUFBQSxFQUMxQjtBQUVBLFFBQU0sc0JBQXNCO0FBQzVCLFFBQU0sU0FBUyxNQUFNLGVBQWUsS0FBSyxJQUFJLE1BQU0sbUJBQW1CO0FBQ3RFLFFBQU0sYUFBYSxRQUFRLENBQUMsS0FBSztBQUNqQyxXQUFTO0FBQUEsSUFDUDtBQUFBLElBQ0E7QUFBQSxJQUNBLEdBQUksMkJBQ0EsVUFBVTtBQUFBLE1BQUksQ0FBQyxTQUNmLE9BQU87QUFBQSxRQUNMLFFBQVE7QUFBQSxRQUNSLE1BQU07QUFBQSxNQUNSLENBQUM7QUFBQSxJQUNILElBQ0U7QUFBQSxFQUNOO0FBQ0EsU0FBTyxTQUFTLEtBQUssSUFBSTtBQUMzQjtBQUVBLFNBQVMsb0JBQW9CLFFBQTRDO0FBQ3ZFLFFBQU0sRUFBRSxhQUFhLFVBQVUsT0FBTyxTQUFTLElBQUk7QUFFbkQsUUFBTSxvQkFBb0IsTUFBTSxTQUFTLG1CQUFtQixLQUFLO0FBQ2pFLE1BQUksc0JBQXNCLFVBQVU7QUFDbEMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGFBQWEsTUFBTSxTQUFTLFlBQVksS0FBSztBQUVuRCxNQUFJLGVBQWUsQ0FBQyxXQUFXLFNBQVMsSUFBSSxHQUFHO0FBQzdDLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxtQkFBbUIsTUFBTSxTQUFTLGtCQUFrQixLQUFLO0FBQy9ELFFBQU0sd0JBQXdCLGlCQUFpQixNQUFNLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxLQUFLLE1BQU0sV0FBVyxNQUFNLENBQUMsRUFBRSxLQUFLLElBQUk7QUFFakgsU0FBTywwQkFBMEI7QUFDbkM7IiwKICAibmFtZXMiOiBbXQp9Cg==
318
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21hcmtkb3duLWNvZGUtYmxvY2stcHJvY2Vzc29yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgY29kZSBibG9ja3MgaW4gT2JzaWRpYW4uXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQsXG4gIE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnLi4vdmFsdWUtcHJvdmlkZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBDb2RlQmxvY2tNYXJrZG93bkluZm9ybWF0aW9uIH0gZnJvbSAnLi9jb2RlLWJsb2NrLW1hcmtkb3duLWluZm9ybWF0aW9uLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VMb2NrQ29tcG9uZW50IH0gZnJvbSAnLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB0eXBlIHsgQ29udGVudEFyZ3MgfSBmcm9tICcuL3ZhdWx0LnRzJztcblxuaW1wb3J0IHsgYWJvcnRTaWduYWxBbnkgfSBmcm9tICcuLi9hYm9ydC1jb250cm9sbGVyLnRzJztcbmltcG9ydCB7IHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7XG4gIGdldE1hbmRhdG9yeU5hbWVkR3JvdXAsXG4gIGdldE9wdGlvbmFsTmFtZWRHcm91cFxufSBmcm9tICcuLi9yZWctZXhwLnRzJztcbmltcG9ydCB7XG4gIGVuc3VyZUxmRW5kaW5ncyxcbiAgZ2V0TGZOb3JtYWxpemVkT2Zmc2V0VG9PcmlnaW5hbE9mZnNldE1hcHBlcixcbiAgaGFzU2luZ2xlT2NjdXJyZW5jZSxcbiAgaW5kZW50LFxuICB1bmluZGVudFxufSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyByZXNvbHZlVmFsdWUgfSBmcm9tICcuLi92YWx1ZS1wcm92aWRlci50cyc7XG5pbXBvcnQgeyBjcmVhdGVDb2RlQmxvY2tSZWdFeHAgfSBmcm9tICcuL2NvZGUtYmxvY2stcmVnLWV4cC50cyc7XG5pbXBvcnQgeyBnZXRGaWxlT3JOdWxsIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBpbnZva2VXaXRoRmlsZVN5c3RlbUxvY2ssXG4gIHByb2Nlc3MsXG4gIHNhdmVOb3RlXG59IGZyb20gJy4vdmF1bHQudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZXRDb2RlQmxvY2tNYXJrZG93bkluZm99LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldENvZGVCbG9ja01hcmtkb3duSW5mb1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSB7QGxpbmsgTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dH0gb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgY3R4OiBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBBIHtAbGluayBIVE1MRWxlbWVudH0gcmVwcmVzZW50aW5nIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgZWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBvZiB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBpbnNlcnRBZnRlckNvZGVCbG9ja30gLyB7QGxpbmsgaW5zZXJ0QmVmb3JlQ29kZUJsb2NrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnNlcnRDb2RlQmxvY2tQYXJhbXMgZXh0ZW5kcyBHZXRDb2RlQmxvY2tNYXJrZG93bkluZm9QYXJhbXMge1xuICAvKipcbiAgICogQSBudW1iZXIgb2YgbGluZXMgdG8gb2Zmc2V0IHRoZSBpbnNlcnRpb24gYnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbGluZU9mZnNldD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlLWxvY2sgY29tcG9uZW50IHVzZWQgdG8gbG9jayB0aGUgbm90ZSB3aGlsZSBpdCBpcyBiZWluZyBtb2RpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwcmVzZXJ2ZSB0aGUgbGluZSBwcmVmaXggb2YgdGhlIGNvZGUgYmxvY2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFByZXNlcnZlTGluZVByZWZpeD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGV4dCB0byBpbnNlcnQgYWZ0ZXIgdGhlIGNvZGUgYmxvY2suXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJlbW92ZUNvZGVCbG9ja30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlQ29kZUJsb2NrUGFyYW1zIGV4dGVuZHMgR2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZS1sb2NrIGNvbXBvbmVudCB1c2VkIHRvIGxvY2sgdGhlIG5vdGUgd2hpbGUgaXQgaXMgYmVpbmcgbW9kaWZpZWQuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8ga2VlcCB0aGUgZ2FwIGFmdGVyIHJlbW92aW5nIHRoZSBjb2RlIGJsb2NrLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRLZWVwR2FwPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmVwbGFjZUNvZGVCbG9ja30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwbGFjZUNvZGVCbG9ja1BhcmFtcyBleHRlbmRzIEdldENvZGVCbG9ja01hcmtkb3duSW5mb1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhYm9ydCBzaWduYWwgdG8gY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGEgbmV3IGNvZGUgYmxvY2suXG4gICAqL1xuICByZWFkb25seSBjb2RlQmxvY2tQcm92aWRlcjogVmFsdWVQcm92aWRlcjxzdHJpbmcsIENvbnRlbnRBcmdzPjtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlLWxvY2sgY29tcG9uZW50IHVzZWQgdG8gbG9jayB0aGUgbm90ZSB3aGlsZSBpdCBpcyBiZWluZyBtb2RpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBrZWVwIHRoZSBnYXAgd2hlbiB0aGUgbmV3IGNvZGUgYmxvY2sgaXMgZW1wdHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEtlZXBHYXBXaGVuRW1wdHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXNlcnZlIHRoZSBsaW5lIHByZWZpeCBvZiB0aGUgY29kZSBibG9jay5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4PzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIENyZWF0ZU1hcmtkb3duSW5mb0Zyb21NYXRjaFBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcHJveGltYXRlU2VjdGlvbkluZm86IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uO1xuICByZWFkb25seSBsaW5lc0JlZm9yZVNlY3Rpb25Db3VudDogbnVtYmVyO1xuICByZWFkb25seSBtYXRjaDogUmVnRXhwTWF0Y2hBcnJheTtcbiAgcmVhZG9ubHkgbm90ZUNvbnRlbnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcG90ZW50aWFsQ29kZUJsb2NrVGV4dDogc3RyaW5nO1xuICByZWFkb25seSBzb3VyY2VMaW5lc0NvdW50OiBudW1iZXI7XG4gIHJlYWRvbmx5IHRleHRMaW5lT2Zmc2V0czogUmVhZG9ubHlNYXA8bnVtYmVyLCBudW1iZXI+O1xufVxuXG5pbnRlcmZhY2UgSW5zZXJ0VGV4dFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29udGVudCB0byBpbnNlcnQgdGhlIHRleHQgaW50by5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxpbmUgaW5kZXggdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5zZXJ0TGluZUluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJlc2VydmUgdGhlIGxpbmUgcHJlZml4IG9mIHRoZSBsaW5lIGF0IHRoZSBpbnNlcnRpb24gcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFByZXNlcnZlTGluZVByZWZpeD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHRvIGluc2VydC5cbiAgICovXG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIElzU3VpdGFibGVDb2RlQmxvY2tQYXJhbXMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY29kZSBibG9jayBpcyBpbnNpZGUgYSBjYWxsb3V0LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNJbkNhbGxvdXQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSB0aGUgY29kZSBibG9jayBpcyBleHBlY3RlZCB0byBoYXZlLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBvZiB0aGUgY29kZSBibG9jayBjYW5kaWRhdGUuXG4gICAqL1xuICByZWFkb25seSBtYXRjaDogUmVnRXhwTWF0Y2hBcnJheTtcblxuICAvKipcbiAgICogVGhlIExGLW5vcm1hbGl6ZWQgc291cmNlIG9mIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlTGY6IHN0cmluZztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIGNvZGUgYmxvY2sgaW4gYSBNYXJrZG93biBzZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgVGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlIGJsb2NrIGluIHRoZSBNYXJrZG93biBzZWN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvKHBhcmFtczogR2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvUGFyYW1zKTogUHJvbWlzZTxDb2RlQmxvY2tNYXJrZG93bkluZm9ybWF0aW9uIHwgbnVsbD4ge1xuICBjb25zdCB7IGFwcCwgY3R4LCBlbCwgc291cmNlIH0gPSBwYXJhbXM7XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IGN0eC5zb3VyY2VQYXRoIH0pO1xuICBhc3NlcnROb25OdWxsYWJsZShzb3VyY2VGaWxlLCBgU291cmNlIGZpbGUgJHtjdHguc291cmNlUGF0aH0gbm90IGZvdW5kLmApO1xuXG4gIGF3YWl0IHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jKCk7XG4gIGF3YWl0IHNhdmVOb3RlKGFwcCwgc291cmNlRmlsZSk7XG5cbiAgbGV0IG1hcmtkb3duSW5mbzogQ29kZUJsb2NrTWFya2Rvd25JbmZvcm1hdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGF3YWl0IGludm9rZVdpdGhGaWxlU3lzdGVtTG9jayh7XG4gICAgYXBwLFxuICAgIGZuKG5vdGVDb250ZW50KSB7XG4gICAgICBjb25zdCBub3RlQ29udGVudExmID0gZW5zdXJlTGZFbmRpbmdzKG5vdGVDb250ZW50KTtcblxuICAgICAgY29uc3QgYXBwcm94aW1hdGVTZWN0aW9uSW5mbzogTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24gPSB7XG4gICAgICAgIGxpbmVFbmQ6IG5vdGVDb250ZW50TGYuc3BsaXQoJ1xcbicpLmxlbmd0aCAtIDEsXG4gICAgICAgIGxpbmVTdGFydDogMCxcbiAgICAgICAgdGV4dDogbm90ZUNvbnRlbnRMZlxuICAgICAgfTtcblxuICAgICAgYXBwcm94aW1hdGVTZWN0aW9uSW5mby50ZXh0ID0gZW5zdXJlTGZFbmRpbmdzKGFwcHJveGltYXRlU2VjdGlvbkluZm8udGV4dCk7XG4gICAgICBjb25zdCBzb3VyY2VMZiA9IGVuc3VyZUxmRW5kaW5ncyhzb3VyY2UpO1xuXG4gICAgICBpZiAoXG4gICAgICAgICFoYXNTaW5nbGVPY2N1cnJlbmNlKHtcbiAgICAgICAgICBzZWFyY2hWYWx1ZTogYXBwcm94aW1hdGVTZWN0aW9uSW5mby50ZXh0LFxuICAgICAgICAgIHN0cjogbm90ZUNvbnRlbnRMZlxuICAgICAgICB9KVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VjdGlvbk9mZnNldCA9IG5vdGVDb250ZW50TGYuaW5kZXhPZihhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLnRleHQpO1xuICAgICAgY29uc3QgbGluZXNCZWZvcmVTZWN0aW9uQ291bnQgPSBub3RlQ29udGVudExmLnNsaWNlKDAsIHNlY3Rpb25PZmZzZXQpLnNwbGl0KCdcXG4nKS5sZW5ndGggLSAxO1xuXG4gICAgICBjb25zdCBpc0luQ2FsbG91dCA9ICEhZWwucGFyZW50RWxlbWVudD8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjYWxsb3V0LWNvbnRlbnQnKTtcblxuICAgICAgY29uc3QgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZUZyb21FbGVtZW50KGVsKTtcbiAgICAgIGNvbnN0IHNvdXJjZUxpbmVzID0gc291cmNlTGYuc3BsaXQoJ1xcbicpO1xuXG4gICAgICBjb25zdCB0ZXh0TGluZXMgPSBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLnRleHQuc3BsaXQoJ1xcbicpO1xuICAgICAgY29uc3QgdGV4dExpbmVPZmZzZXRzID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgICAgIHRleHRMaW5lT2Zmc2V0cy5zZXQobGluZXNCZWZvcmVTZWN0aW9uQ291bnQsIHNlY3Rpb25PZmZzZXQpO1xuXG4gICAgICBsZXQgbGFzdFRleHRMaW5lT2Zmc2V0ID0gc2VjdGlvbk9mZnNldDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dExpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHRleHRMaW5lID0gdGV4dExpbmVzW2ldID8/ICcnO1xuICAgICAgICBjb25zdCBsaW5lT2Zmc2V0ID0gbGFzdFRleHRMaW5lT2Zmc2V0ICsgdGV4dExpbmUubGVuZ3RoICsgMTtcbiAgICAgICAgdGV4dExpbmVPZmZzZXRzLnNldChsaW5lc0JlZm9yZVNlY3Rpb25Db3VudCArIGkgKyAxLCBsaW5lT2Zmc2V0KTtcbiAgICAgICAgbGFzdFRleHRMaW5lT2Zmc2V0ID0gbGluZU9mZnNldDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcG90ZW50aWFsQ29kZUJsb2NrVGV4dExpbmVzID0gdGV4dExpbmVzLm1hcCgobGluZSwgaW5kZXgpID0+IGFwcHJveGltYXRlU2VjdGlvbkluZm8ubGluZVN0YXJ0IDw9IGluZGV4ICYmIGluZGV4IDw9IGFwcHJveGltYXRlU2VjdGlvbkluZm8ubGluZUVuZCA/IGxpbmUgOiAnJyk7XG4gICAgICBjb25zdCBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0ID0gcG90ZW50aWFsQ29kZUJsb2NrVGV4dExpbmVzLmpvaW4oJ1xcbicpO1xuXG4gICAgICBjb25zdCBSRUdfRVhQID0gY3JlYXRlQ29kZUJsb2NrUmVnRXhwKCk7XG5cbiAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgcG90ZW50aWFsQ29kZUJsb2NrVGV4dC5tYXRjaEFsbChSRUdfRVhQKSkge1xuICAgICAgICBpZiAoIWlzU3VpdGFibGVDb2RlQmxvY2soeyBpc0luQ2FsbG91dCwgbGFuZ3VhZ2UsIG1hdGNoLCBzb3VyY2VMZiB9KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hcmtkb3duSW5mbykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcmtkb3duSW5mbyA9IGNyZWF0ZU1hcmtkb3duSW5mb0Zyb21NYXRjaCh7XG4gICAgICAgICAgYXBwcm94aW1hdGVTZWN0aW9uSW5mbyxcbiAgICAgICAgICBsaW5lc0JlZm9yZVNlY3Rpb25Db3VudCxcbiAgICAgICAgICBtYXRjaCxcbiAgICAgICAgICBub3RlQ29udGVudCxcbiAgICAgICAgICBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0LFxuICAgICAgICAgIHNvdXJjZUxpbmVzQ291bnQ6IHNvdXJjZUxpbmVzLmxlbmd0aCxcbiAgICAgICAgICB0ZXh0TGluZU9mZnNldHNcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghbWFya2Rvd25JbmZvKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vdGVDb250ZW50TGYgPT09IG5vdGVDb250ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGZPZmZzZXRNYXBwZXIgPSBnZXRMZk5vcm1hbGl6ZWRPZmZzZXRUb09yaWdpbmFsT2Zmc2V0TWFwcGVyKG5vdGVDb250ZW50KTtcbiAgICAgIG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5zdGFydC5vZmZzZXQgPSBsZk9mZnNldE1hcHBlcihtYXJrZG93bkluZm8ucG9zaXRpb25Jbk5vdGUuc3RhcnQub2Zmc2V0KTtcbiAgICAgIG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5lbmQub2Zmc2V0ID0gbGZPZmZzZXRNYXBwZXIobWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLmVuZC5vZmZzZXQpO1xuICAgIH0sXG4gICAgcGF0aE9yRmlsZTogc291cmNlRmlsZVxuICB9KTtcblxuICByZXR1cm4gbWFya2Rvd25JbmZvO1xufVxuXG4vKipcbiAqIEluc2VydHMgdGV4dCBhZnRlciB0aGUgY29kZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi11dGlscy9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIEludGVudGlvbmFsbHkgc2hhcmVzIEluc2VydENvZGVCbG9ja1BhcmFtcyB3aXRoIGluc2VydEJlZm9yZUNvZGVCbG9jay5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnNlcnRBZnRlckNvZGVCbG9jayhwYXJhbXM6IEluc2VydENvZGVCbG9ja1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCwgY3R4LCBsaW5lT2Zmc2V0ID0gMCwgdGV4dCB9ID0gcGFyYW1zO1xuXG4gIGF3YWl0IHByb2Nlc3Moe1xuICAgIGFwcCxcbiAgICBhc3luYyBuZXdDb250ZW50UHJvdmlkZXIoeyBjb250ZW50IH0pIHtcbiAgICAgIGNvbnN0IG1hcmtkb3duSW5mbyA9IGF3YWl0IGdldENvZGVCbG9ja01hcmtkb3duSW5mbyhwYXJhbXMpO1xuICAgICAgYXNzZXJ0Tm9uTnVsbGFibGUobWFya2Rvd25JbmZvLCAnQ291bGQgbm90IHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBjb2RlIGJsb2NrLicpO1xuXG4gICAgICBpZiAoY29udGVudCAhPT0gbWFya2Rvd25JbmZvLm5vdGVDb250ZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbnNlcnRMaW5lSW5kZXggPSBtYXJrZG93bkluZm8ucG9zaXRpb25Jbk5vdGUuZW5kLmxpbmUgKyBsaW5lT2Zmc2V0ICsgMTtcbiAgICAgIHJldHVybiBpbnNlcnRUZXh0KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxJbnNlcnRUZXh0UGFyYW1zPih7XG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGluc2VydExpbmVJbmRleCxcbiAgICAgICAgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4OiBwYXJhbXMuc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4LFxuICAgICAgICB0ZXh0XG4gICAgICB9KSk7XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlOiBjdHguc291cmNlUGF0aCxcbiAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHBhcmFtcy5yZXNvdXJjZUxvY2tDb21wb25lbnRcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyB0ZXh0IGJlZm9yZSB0aGUgY29kZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi11dGlscy9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIEludGVudGlvbmFsbHkgc2hhcmVzIEluc2VydENvZGVCbG9ja1BhcmFtcyB3aXRoIGluc2VydEFmdGVyQ29kZUJsb2NrLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc2VydEJlZm9yZUNvZGVCbG9jayhwYXJhbXM6IEluc2VydENvZGVCbG9ja1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCwgY3R4LCBsaW5lT2Zmc2V0ID0gMCwgdGV4dCB9ID0gcGFyYW1zO1xuXG4gIGF3YWl0IHByb2Nlc3Moe1xuICAgIGFwcCxcbiAgICBhc3luYyBuZXdDb250ZW50UHJvdmlkZXIoeyBjb250ZW50IH0pIHtcbiAgICAgIGNvbnN0IG1hcmtkb3duSW5mbyA9IGF3YWl0IGdldENvZGVCbG9ja01hcmtkb3duSW5mbyhwYXJhbXMpO1xuICAgICAgaWYgKCFtYXJrZG93bkluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGNvZGUgYmxvY2suJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb250ZW50ICE9PSBtYXJrZG93bkluZm8ubm90ZUNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluc2VydExpbmVJbmRleCA9IG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5zdGFydC5saW5lIC0gbGluZU9mZnNldDtcbiAgICAgIHJldHVybiBpbnNlcnRUZXh0KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxJbnNlcnRUZXh0UGFyYW1zPih7XG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGluc2VydExpbmVJbmRleCxcbiAgICAgICAgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4OiBwYXJhbXMuc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4LFxuICAgICAgICB0ZXh0XG4gICAgICB9KSk7XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlOiBjdHguc291cmNlUGF0aCxcbiAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHBhcmFtcy5yZXNvdXJjZUxvY2tDb21wb25lbnRcbiAgfSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgY29kZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUNvZGVCbG9jayhwYXJhbXM6IFJlbW92ZUNvZGVCbG9ja1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZXBsYWNlQ29kZUJsb2NrKHtcbiAgICAuLi5wYXJhbXMsXG4gICAgY29kZUJsb2NrUHJvdmlkZXI6ICcnLFxuICAgIHNob3VsZEtlZXBHYXBXaGVuRW1wdHk6IHBhcmFtcy5zaG91bGRLZWVwR2FwID8/IGZhbHNlXG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2VzIHRoZSBjb2RlIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVwbGFjZUNvZGVCbG9jayhwYXJhbXM6IFJlcGxhY2VDb2RlQmxvY2tQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAsIGNvZGVCbG9ja1Byb3ZpZGVyLCBjdHggfSA9IHBhcmFtcztcbiAgcGFyYW1zLmFib3J0U2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGF3YWl0IHByb2Nlc3Moe1xuICAgIGFwcCxcbiAgICBhc3luYyBuZXdDb250ZW50UHJvdmlkZXIoeyBhYm9ydFNpZ25hbCwgY29udGVudCB9KSB7XG4gICAgICBhYm9ydFNpZ25hbCA9IGFib3J0U2lnbmFsQW55KGFib3J0U2lnbmFsLCBwYXJhbXMuYWJvcnRTaWduYWwpO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IG1hcmtkb3duSW5mbyA9IGF3YWl0IGdldENvZGVCbG9ja01hcmtkb3duSW5mbyhwYXJhbXMpO1xuICAgICAgaWYgKCFtYXJrZG93bkluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGNvZGUgYmxvY2suJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb250ZW50ICE9PSBtYXJrZG93bkluZm8ubm90ZUNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGxldCBvbGRDb2RlQmxvY2sgPSBjb250ZW50LnNsaWNlKG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5zdGFydC5vZmZzZXQsIG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5lbmQub2Zmc2V0KTtcbiAgICAgIGlmIChwYXJhbXMuc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4KSB7XG4gICAgICAgIG9sZENvZGVCbG9jayA9IHVuaW5kZW50KHtcbiAgICAgICAgICBwcmVmaXg6IG1hcmtkb3duSW5mby5saW5lUHJlZml4LFxuICAgICAgICAgIHRleHQ6IG9sZENvZGVCbG9ja1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbGV0IG5ld0NvZGVCbG9jayA9IGF3YWl0IHJlc29sdmVWYWx1ZShjb2RlQmxvY2tQcm92aWRlciwgeyBhYm9ydFNpZ25hbCwgY29udGVudDogb2xkQ29kZUJsb2NrIH0pO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGlmICgobmV3Q29kZUJsb2NrIHx8IHBhcmFtcy5zaG91bGRLZWVwR2FwV2hlbkVtcHR5KSAmJiBwYXJhbXMuc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4KSB7XG4gICAgICAgIG5ld0NvZGVCbG9jayA9IGluZGVudCh7XG4gICAgICAgICAgcHJlZml4OiBtYXJrZG93bkluZm8ubGluZVByZWZpeCxcbiAgICAgICAgICB0ZXh0OiBuZXdDb2RlQmxvY2tcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRleHRCZWZvcmVDb2RlQmxvY2sgPSBjb250ZW50LnNsaWNlKDAsIG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5zdGFydC5vZmZzZXQpO1xuICAgICAgY29uc3QgdGV4dEFmdGVyQ29kZUJsb2NrID0gY29udGVudC5zbGljZShtYXJrZG93bkluZm8ucG9zaXRpb25Jbk5vdGUuZW5kLm9mZnNldCk7XG5cbiAgICAgIGlmIChuZXdDb2RlQmxvY2sgfHwgcGFyYW1zLnNob3VsZEtlZXBHYXBXaGVuRW1wdHkpIHtcbiAgICAgICAgcmV0dXJuIGAke3RleHRCZWZvcmVDb2RlQmxvY2t9JHtuZXdDb2RlQmxvY2t9JHt0ZXh0QWZ0ZXJDb2RlQmxvY2t9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0ZXh0QmVmb3JlQ29kZUJsb2NrICYmICF0ZXh0QWZ0ZXJDb2RlQmxvY2spIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICBpZiAodGV4dEJlZm9yZUNvZGVCbG9jaykge1xuICAgICAgICByZXR1cm4gYCR7dGV4dEJlZm9yZUNvZGVCbG9jay5zbGljZSgwLCAtMSl9JHt0ZXh0QWZ0ZXJDb2RlQmxvY2t9YDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGAke3RleHRCZWZvcmVDb2RlQmxvY2t9JHt0ZXh0QWZ0ZXJDb2RlQmxvY2suc2xpY2UoMSl9YDtcbiAgICB9LFxuICAgIHBhdGhPckZpbGU6IGN0eC5zb3VyY2VQYXRoLFxuICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogcGFyYW1zLnJlc291cmNlTG9ja0NvbXBvbmVudFxuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFya2Rvd25JbmZvRnJvbU1hdGNoKHBhcmFtczogQ3JlYXRlTWFya2Rvd25JbmZvRnJvbU1hdGNoUGFyYW1zKTogQ29kZUJsb2NrTWFya2Rvd25JbmZvcm1hdGlvbiB7XG4gIGNvbnN0IHtcbiAgICBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLFxuICAgIGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50LFxuICAgIG1hdGNoLFxuICAgIG5vdGVDb250ZW50LFxuICAgIHBvdGVudGlhbENvZGVCbG9ja1RleHQsXG4gICAgc291cmNlTGluZXNDb3VudCxcbiAgICB0ZXh0TGluZU9mZnNldHNcbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBsaW5lUHJlZml4ID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ0xpbmVQcmVmaXgnKTtcbiAgY29uc3QgY29kZUJsb2NrU3RhcnREZWxpbWl0ZXIgPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnQ29kZUJsb2NrU3RhcnREZWxpbWl0ZXInKTtcbiAgY29uc3QgY29kZUJsb2NrRW5kRGVsaW1pdGVyID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ0NvZGVCbG9ja0VuZERlbGltaXRlcicpO1xuICBjb25zdCBjb2RlQmxvY2tBcmdzU3RyID0gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAnQ29kZUJsb2NrQXJncycpID8/ICcnO1xuICBjb25zdCBsYW5ndWFnZSA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdDb2RlQmxvY2tMYW5ndWFnZScpO1xuXG4gIGNvbnN0IHByZXZpb3VzVGV4dCA9IHBvdGVudGlhbENvZGVCbG9ja1RleHQuc2xpY2UoMCwgbWF0Y2guaW5kZXgpO1xuICBjb25zdCBwcmV2aW91c1RleHRMaW5lc0NvdW50ID0gcHJldmlvdXNUZXh0LnNwbGl0KCdcXG4nKS5sZW5ndGggLSAxO1xuXG4gIGNvbnN0IHN0YXJ0TGluZSA9IGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50ICsgcHJldmlvdXNUZXh0TGluZXNDb3VudDtcbiAgY29uc3QgZW5kTGluZSA9IHN0YXJ0TGluZSArIHNvdXJjZUxpbmVzQ291bnQgKyAxO1xuXG4gIHJldHVybiB7XG4gICAgYXJnczogY29kZUJsb2NrQXJnc1N0ci5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKSxcbiAgICBlbmREZWxpbWl0ZXI6IGNvZGVCbG9ja0VuZERlbGltaXRlcixcbiAgICBsYW5ndWFnZSxcbiAgICBsaW5lUHJlZml4LFxuICAgIG5vdGVDb250ZW50LFxuICAgIHBvc2l0aW9uSW5Ob3RlOiB7XG4gICAgICBlbmQ6IHtcbiAgICAgICAgY29sOiAodGV4dExpbmVPZmZzZXRzLmdldChlbmRMaW5lICsgMSkgPz8gMCkgLSAodGV4dExpbmVPZmZzZXRzLmdldChlbmRMaW5lKSA/PyAwKSAtIDEsXG4gICAgICAgIGxpbmU6IGVuZExpbmUsXG4gICAgICAgIG9mZnNldDogKHRleHRMaW5lT2Zmc2V0cy5nZXQoZW5kTGluZSArIDEpID8/IDApIC0gMVxuICAgICAgfSxcbiAgICAgIHN0YXJ0OiB7XG4gICAgICAgIGNvbDogMCxcbiAgICAgICAgbGluZTogc3RhcnRMaW5lLFxuICAgICAgICBvZmZzZXQ6IHRleHRMaW5lT2Zmc2V0cy5nZXQoc3RhcnRMaW5lKSA/PyAwXG4gICAgICB9XG4gICAgfSxcbiAgICByYXdBcmdzU3RyOiBjb2RlQmxvY2tBcmdzU3RyLFxuICAgIHNlY3Rpb25JbmZvOiB7XG4gICAgICBsaW5lRW5kOiBwcmV2aW91c1RleHRMaW5lc0NvdW50ICsgc291cmNlTGluZXNDb3VudCArIDEsXG4gICAgICBsaW5lU3RhcnQ6IHByZXZpb3VzVGV4dExpbmVzQ291bnQsXG4gICAgICB0ZXh0OiBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLnRleHRcbiAgICB9LFxuICAgIHN0YXJ0RGVsaW1pdGVyOiBjb2RlQmxvY2tTdGFydERlbGltaXRlclxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRMYW5ndWFnZUZyb21FbGVtZW50KGVsOiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XG4gIGNvbnN0IEJMT0NLX0xBTkdVQUdFX1BSRUZJWCA9ICdibG9jay1sYW5ndWFnZS0nO1xuICByZXR1cm4gQXJyYXkuZnJvbShlbC5jbGFzc0xpc3QpLmZpbmQoKGNscykgPT4gY2xzLnN0YXJ0c1dpdGgoQkxPQ0tfTEFOR1VBR0VfUFJFRklYKSk/LnNsaWNlKEJMT0NLX0xBTkdVQUdFX1BSRUZJWC5sZW5ndGgpID8/ICcnO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRUZXh0KHBhcmFtczogSW5zZXJ0VGV4dFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgY29udGVudCwgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4ID0gZmFsc2UsIHRleHQgfSA9IHBhcmFtcztcbiAgbGV0IHsgaW5zZXJ0TGluZUluZGV4IH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgbmV3TGluZXMgPSBsaW5lcy5zbGljZSgpO1xuICBjb25zdCB0ZXh0TGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcblxuICBpZiAoaW5zZXJ0TGluZUluZGV4IDwgMCkge1xuICAgIGluc2VydExpbmVJbmRleCA9IDA7XG4gIH1cbiAgaWYgKGluc2VydExpbmVJbmRleCA+IGxpbmVzLmxlbmd0aCkge1xuICAgIGluc2VydExpbmVJbmRleCA9IGxpbmVzLmxlbmd0aDtcbiAgfVxuXG4gIGNvbnN0IFBSRUZJWF9MSU5FX1JFR19FWFAgPSAvXiB7MCwzfSg/Oj4gezEsM30pKi9nO1xuICBjb25zdCBtYXRjaCA9IChsaW5lc1tpbnNlcnRMaW5lSW5kZXhdID8/ICcnKS5tYXRjaChQUkVGSVhfTElORV9SRUdfRVhQKTtcbiAgY29uc3QgbGluZVByZWZpeCA9IG1hdGNoPy5bMF0gPz8gJyc7XG4gIG5ld0xpbmVzLnNwbGljZShcbiAgICBpbnNlcnRMaW5lSW5kZXgsXG4gICAgMCxcbiAgICAuLi4oc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4XG4gICAgICA/IHRleHRMaW5lcy5tYXAoKGxpbmUpID0+XG4gICAgICAgIGluZGVudCh7XG4gICAgICAgICAgcHJlZml4OiBsaW5lUHJlZml4LFxuICAgICAgICAgIHRleHQ6IGxpbmVcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIDogdGV4dExpbmVzKVxuICApO1xuICByZXR1cm4gbmV3TGluZXMuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGlzU3VpdGFibGVDb2RlQmxvY2socGFyYW1zOiBJc1N1aXRhYmxlQ29kZUJsb2NrUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgaXNJbkNhbGxvdXQsIGxhbmd1YWdlLCBtYXRjaCwgc291cmNlTGYgfSA9IHBhcmFtcztcblxuICBjb25zdCBjb2RlQmxvY2tMYW5ndWFnZSA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdDb2RlQmxvY2tMYW5ndWFnZScpO1xuICBpZiAoY29kZUJsb2NrTGFuZ3VhZ2UgIT09IGxhbmd1YWdlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbGluZVByZWZpeCA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdMaW5lUHJlZml4Jyk7XG5cbiAgaWYgKGlzSW5DYWxsb3V0ICYmICFsaW5lUHJlZml4LmluY2x1ZGVzKCc+ICcpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY29kZUJsb2NrQ29udGVudCA9IGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaCwgJ0NvZGVCbG9ja0NvbnRlbnQnKSA/PyAnJztcbiAgY29uc3QgY2xlYW5Db2RlQmxvY2tDb250ZW50ID0gY29kZUJsb2NrQ29udGVudC5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKGxpbmVQcmVmaXgubGVuZ3RoKSkuam9pbignXFxuJyk7XG5cbiAgcmV0dXJuIGNsZWFuQ29kZUJsb2NrQ29udGVudCA9PT0gc291cmNlTGY7XG59XG5cbi8q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
@@ -10,6 +10,8 @@
10
10
  export declare enum ObsidianPluginRepoPaths {
11
11
  /** CommonJS file. */
12
12
  AnyCjs = "*.cjs",
13
+ /** Any integration-test TypeScript file. */
14
+ AnyIntegrationTestTs = "*.integration.test.ts",
13
15
  /** JavaScript file. */
14
16
  AnyJs = "*.js",
15
17
  /** ESM JavaScript file. */
@@ -23,6 +23,7 @@ if you want to view the source, please visit the github repository of this plugi
23
23
 
24
24
  var ObsidianPluginRepoPaths = /* @__PURE__ */ ((ObsidianPluginRepoPaths2) => {
25
25
  ObsidianPluginRepoPaths2["AnyCjs"] = "*.cjs";
26
+ ObsidianPluginRepoPaths2["AnyIntegrationTestTs"] = "*.integration.test.ts";
26
27
  ObsidianPluginRepoPaths2["AnyJs"] = "*.js";
27
28
  ObsidianPluginRepoPaths2["AnyMjs"] = "*.mjs";
28
29
  ObsidianPluginRepoPaths2["AnyPath"] = "**";
@@ -78,4 +79,4 @@ var ObsidianPluginRepoPaths = /* @__PURE__ */ ((ObsidianPluginRepoPaths2) => {
78
79
  export {
79
80
  ObsidianPluginRepoPaths
80
81
  };
81
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9vYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIGVudW1lcmF0aW9uIGZvciBjb21tb24gZmlsZSBhbmQgZm9sZGVyIHBhdGhzIHVzZWQgaW4gT2JzaWRpYW4gcGx1Z2luIGRldmVsb3BtZW50LlxuICovXG5cbi8qKlxuICogRW51bWVyYXRpb24gb2YgY29tbW9ubHkgdXNlZCBmaWxlIGFuZCBmb2xkZXIgcGF0aHMgaW4gT2JzaWRpYW4gcGx1Z2luIGRldmVsb3BtZW50LlxuICovXG5leHBvcnQgZW51bSBPYnNpZGlhblBsdWdpblJlcG9QYXRocyB7XG4gIC8qKiBDb21tb25KUyBmaWxlLiAqL1xuICBBbnlDanMgPSAnKi5janMnLFxuXG4gIC8qKiBKYXZhU2NyaXB0IGZpbGUuICovXG4gIEFueUpzID0gJyouanMnLFxuXG4gIC8qKiBFU00gSmF2YVNjcmlwdCBmaWxlLiAqL1xuICBBbnlNanMgPSAnKi5tanMnLFxuXG4gIC8qKiBBbnkgcGF0aCByZWN1cnNpdmVseS4gKi9cbiAgQW55UGF0aCA9ICcqKicsXG5cbiAgLyoqIEFueSB0ZXN0IFR5cGVTY3JpcHQgZmlsZS4gKi9cbiAgQW55VGVzdFRzID0gJyoudGVzdC50cycsXG5cbiAgLyoqIFR5cGVTY3JpcHQgZmlsZS4gKi9cbiAgQW55VHMgPSAnKi50cycsXG5cbiAgLyoqIFJlYWN0SlMgVHlwZVNjcmlwdCBmaWxlLiAqL1xuICBBbnlUc3ggPSAnKi50c3gnLFxuXG4gIC8qKiBDaGFuZ2Vsb2cgZmlsZS4gKi9cbiAgQ2hhbmdlbG9nTWQgPSAnQ0hBTkdFTE9HLm1kJyxcblxuICAvKiogQ29tbWl0bGludCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIENvbW1pdGxpbnRDb25maWdUcyA9ICdjb21taXRsaW50LmNvbmZpZy50cycsXG5cbiAgLyoqIEN1cnJlbnQgZm9sZGVyLiAqL1xuICBDdXJyZW50Rm9sZGVyID0gJy4nLFxuXG4gIC8qKiBEZW1vIHZhdWx0IGZvbGRlciBzaGlwcGVkIGluIGEgcGx1Z2luIHJlcG8gcm9vdC4gKi9cbiAgRGVtb1ZhdWx0ID0gJ2RlbW8tdmF1bHQnLFxuXG4gIC8qKiBEaXN0cmlidXRpb24gZm9sZGVyLiAqL1xuICBEaXN0ID0gJ2Rpc3QnLFxuXG4gIC8qKiBCdWlsZCBmb2xkZXIgd2l0aGluIHRoZSB7QGxpbmsgRGlzdH0gZm9sZGVyLiAqL1xuICBEaXN0QnVpbGQgPSAnZGlzdC9idWlsZCcsXG5cbiAgLyoqIERldmVsb3BtZW50IGZvbGRlciB3aXRoaW4gdGhlIHtAbGluayBEaXN0fSBmb2xkZXIuICovXG4gIERpc3REZXYgPSAnZGlzdC9kZXYnLFxuXG4gIC8qKiBPYnNpZGlhbiBjb25maWd1cmF0aW9uIGZvbGRlciB3aXRoaW4gYSB2YXVsdC4gKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFubWQvaGFyZGNvZGVkLWNvbmZpZy1wYXRoIC0tIFRoaXMgaXMgdGhlIGRlZmF1bHQgY29uZmlnIGZvbGRlciBuYW1lIGJha2VkIGludG8gYSBzaGlwcGVkIGRlbW8tdmF1bHQgc2tlbGV0b24sIG5vdCBhIGxvb2t1cCBhZ2FpbnN0IGEgbGl2ZSB2YXVsdC5cbiAgRG90T2JzaWRpYW4gPSAnLm9ic2lkaWFuJyxcblxuICAvKiogQ29tbW9uSlMgRVNMaW50IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgRXNsaW50Q29uZmlnQ2pzID0gJ2VzbGludC5jb25maWcuY2pzJyxcblxuICAvKiogQ29tbW9uSlMgVHlwZVNjcmlwdCBFU0xpbnQgY29uZmlndXJhdGlvbiBmaWxlLiAqL1xuICBFc2xpbnRDb25maWdDdHMgPSAnZXNsaW50LmNvbmZpZy5jdHMnLFxuXG4gIC8qKiBKYXZhU2NyaXB0IEVTTGludCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIEVzbGludENvbmZpZ0pzID0gJ2VzbGludC5jb25maWcuanMnLFxuXG4gIC8qKiBFU00gSmF2YVNjcmlwdCBFU0xpbnQgY29uZmlndXJhdGlvbiBmaWxlLiAqL1xuICBFc2xpbnRDb25maWdNanMgPSAnZXNsaW50LmNvbmZpZy5tanMnLFxuXG4gIC8qKiBFU00gVHlwZVNjcmlwdCBFU0xpbnQgY29uZmlndXJhdGlvbiBmaWxlLiAqL1xuICBFc2xpbnRDb25maWdNdHMgPSAnZXNsaW50LmNvbmZpZy5tdHMnLFxuXG4gIC8qKiBUeXBlU2NyaXB0IEVTTGludCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIEVzbGludENvbmZpZ1RzID0gJ2VzbGludC5jb25maWcudHMnLFxuXG4gIC8qKiBIb3QgcmVsb2FkIGZpbGUuICovXG4gIEhvdFJlbG9hZCA9ICcuaG90cmVsb2FkJyxcblxuICAvKiogTWFpbiBDU1MgZmlsZS4gKi9cbiAgTWFpbkNzcyA9ICdtYWluLmNzcycsXG5cbiAgLyoqIE1haW4gSmF2YVNjcmlwdCBmaWxlLiAqL1xuICBNYWluSnMgPSAnbWFpbi5qcycsXG5cbiAgLyoqIE1haW4gVHlwZVNjcmlwdCBmaWxlLiAqL1xuICBNYWluVHMgPSAnbWFpbi50cycsXG5cbiAgLyoqIE1hbmlmZXN0IGZpbGUgZm9yIGJldGEgcmVsZWFzZXMuICovXG4gIE1hbmlmZXN0QmV0YUpzb24gPSAnbWFuaWZlc3QtYmV0YS5qc29uJyxcblxuICAvKiogTWFuaWZlc3QgZmlsZS4gKi9cbiAgTWFuaWZlc3RKc29uID0gJ21hbmlmZXN0Lmpzb24nLFxuXG4gIC8qKiBDb21tb25KUyBNYXJrZG93bmxpbnQgQ0xJMiBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIE1hcmtkb3dubGludENsaTJDb25maWdDanMgPSAnLm1hcmtkb3dubGludC1jbGkyLmNqcycsXG5cbiAgLyoqIEpTT05DIE1hcmtkb3dubGludCBDTEkyIGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgTWFya2Rvd25saW50Q2xpMkNvbmZpZ0pzb25jID0gJy5tYXJrZG93bmxpbnQtY2xpMi5qc29uYycsXG5cbiAgLyoqIEVTTSBNYXJrZG93bmxpbnQgQ0xJMiBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIE1hcmtkb3dubGludENsaTJDb25maWdNanMgPSAnLm1hcmtkb3dubGludC1jbGkyLm1qcycsXG5cbiAgLyoqIFlBTUwgTWFya2Rvd25saW50IENMSTIgY29uZmlndXJhdGlvbiBmaWxlLiAqL1xuICBNYXJrZG93bmxpbnRDbGkyQ29uZmlnWWFtbCA9ICcubWFya2Rvd25saW50LWNsaTIueWFtbCcsXG5cbiAgLyoqIENvbW1vbkpTIE1hcmtkb3dubGludCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIE1hcmtkb3dubGludENvbmZpZ0NqcyA9ICcubWFya2Rvd25saW50LmNqcycsXG5cbiAgLyoqIEpTT04gTWFya2Rvd25saW50IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgTWFya2Rvd25saW50Q29uZmlnSnNvbiA9ICcubWFya2Rvd25saW50Lmpzb24nLFxuXG4gIC8qKiBKU09OQyBNYXJrZG93bmxpbnQgY29uZmlndXJhdGlvbiBmaWxlLiAqL1xuICBNYXJrZG93bmxpbnRDb25maWdKc29uYyA9ICcubWFya2Rvd25saW50Lmpzb25jJyxcblxuICAvKiogRVNNIE1hcmtkb3dubGludCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIE1hcmtkb3dubGludENvbmZpZ01qcyA9ICcubWFya2Rvd25saW50Lm1qcycsXG5cbiAgLyoqIFlBTUwgTWFya2Rvd25saW50IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgTWFya2Rvd25saW50Q29uZmlnWWFtbCA9ICcubWFya2Rvd25saW50LnlhbWwnLFxuXG4gIC8qKiBZQU1MIE1hcmtkb3dubGludCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIE1hcmtkb3dubGludENvbmZpZ1ltbCA9ICcubWFya2Rvd25saW50LnltbCcsXG5cbiAgLyoqIE1vY2tzIGZvbGRlci4gKi9cbiAgTW9ja3MgPSAnc3JjL3Rlc3QtaGVscGVycycsXG5cbiAgLyoqIE5vZGUgbW9kdWxlcyBmb2xkZXIuICovXG4gIE5vZGVNb2R1bGVzID0gJ25vZGVfbW9kdWxlcycsXG5cbiAgLyoqIE5QTSBzaHJpbmt3cmFwIGZpbGUuICovXG4gIE5wbVNocmlua3dyYXBKc29uID0gJ25wbS1zaHJpbmt3cmFwLmpzb24nLFxuXG4gIC8qKiBQYWNrYWdlIEpTT04gZmlsZS4gKi9cbiAgUGFja2FnZUpzb24gPSAncGFja2FnZS5qc29uJyxcblxuICAvKiogUGFja2FnZS1sb2NrIEpTT04gZmlsZS4gKi9cbiAgUGFja2FnZUxvY2tKc29uID0gJ3BhY2thZ2UtbG9jay5qc29uJyxcblxuICAvKiogUGx1Z2lucyBmb2xkZXIgd2l0aGluIGFuIE9ic2lkaWFuIGNvbmZpZ3VyYXRpb24gZm9sZGVyLiAqL1xuICBQbHVnaW5zID0gJ3BsdWdpbnMnLFxuXG4gIC8qKiBTY3JpcHRzIGZvbGRlci4gKi9cbiAgU2NyaXB0cyA9ICdzY3JpcHRzJyxcblxuICAvKiogU2NyaXB0IHV0aWxpdGllcyBmb2xkZXIgKGRldi1vbmx5IHRvb2xpbmcgdGhhdCBydW5zIGluIHRoZSBjb25zdW1lcidzIE5vZGUgZW52aXJvbm1lbnQsIG5vdCB0aGUgT2JzaWRpYW4gcnVudGltZSkuICovXG4gIFNjcmlwdFV0aWxzID0gJ3NyYy9zY3JpcHQtdXRpbHMnLFxuXG4gIC8qKiBTb3VyY2UgZm9sZGVyLiAqL1xuICBTcmMgPSAnc3JjJyxcblxuICAvKiogU3R5bGVzIENTUyBmaWxlLiAqL1xuICBTdHlsZXNDc3MgPSAnc3R5bGVzLmNzcycsXG5cbiAgLyoqIFRlc3RzIGZvbGRlci4gKi9cbiAgVGVzdHMgPSAnX190ZXN0c19fJyxcblxuICAvKiogVHlwZVNjcmlwdCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIFRzQ29uZmlnSnNvbiA9ICd0c2NvbmZpZy5qc29uJyxcblxuICAvKiogVmVyc2lvbnMgSlNPTiBmaWxlLiAqL1xuICBWZXJzaW9uc0pzb24gPSAndmVyc2lvbnMuanNvbicsXG5cbiAgLyoqIFZpdGVzdCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIFZpdGVzdENvbmZpZ1RzID0gJ3ZpdGVzdC5jb25maWcudHMnXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNPLElBQUssMEJBQUwsa0JBQUtBLDZCQUFMO0FBRUwsRUFBQUEseUJBQUEsWUFBUztBQUdULEVBQUFBLHlCQUFBLFdBQVE7QUFHUixFQUFBQSx5QkFBQSxZQUFTO0FBR1QsRUFBQUEseUJBQUEsYUFBVTtBQUdWLEVBQUFBLHlCQUFBLGVBQVk7QUFHWixFQUFBQSx5QkFBQSxXQUFRO0FBR1IsRUFBQUEseUJBQUEsWUFBUztBQUdULEVBQUFBLHlCQUFBLGlCQUFjO0FBR2QsRUFBQUEseUJBQUEsd0JBQXFCO0FBR3JCLEVBQUFBLHlCQUFBLG1CQUFnQjtBQUdoQixFQUFBQSx5QkFBQSxlQUFZO0FBR1osRUFBQUEseUJBQUEsVUFBTztBQUdQLEVBQUFBLHlCQUFBLGVBQVk7QUFHWixFQUFBQSx5QkFBQSxhQUFVO0FBSVYsRUFBQUEseUJBQUEsaUJBQWM7QUFHZCxFQUFBQSx5QkFBQSxxQkFBa0I7QUFHbEIsRUFBQUEseUJBQUEscUJBQWtCO0FBR2xCLEVBQUFBLHlCQUFBLG9CQUFpQjtBQUdqQixFQUFBQSx5QkFBQSxxQkFBa0I7QUFHbEIsRUFBQUEseUJBQUEscUJBQWtCO0FBR2xCLEVBQUFBLHlCQUFBLG9CQUFpQjtBQUdqQixFQUFBQSx5QkFBQSxlQUFZO0FBR1osRUFBQUEseUJBQUEsYUFBVTtBQUdWLEVBQUFBLHlCQUFBLFlBQVM7QUFHVCxFQUFBQSx5QkFBQSxZQUFTO0FBR1QsRUFBQUEseUJBQUEsc0JBQW1CO0FBR25CLEVBQUFBLHlCQUFBLGtCQUFlO0FBR2YsRUFBQUEseUJBQUEsK0JBQTRCO0FBRzVCLEVBQUFBLHlCQUFBLGlDQUE4QjtBQUc5QixFQUFBQSx5QkFBQSwrQkFBNEI7QUFHNUIsRUFBQUEseUJBQUEsZ0NBQTZCO0FBRzdCLEVBQUFBLHlCQUFBLDJCQUF3QjtBQUd4QixFQUFBQSx5QkFBQSw0QkFBeUI7QUFHekIsRUFBQUEseUJBQUEsNkJBQTBCO0FBRzFCLEVBQUFBLHlCQUFBLDJCQUF3QjtBQUd4QixFQUFBQSx5QkFBQSw0QkFBeUI7QUFHekIsRUFBQUEseUJBQUEsMkJBQXdCO0FBR3hCLEVBQUFBLHlCQUFBLFdBQVE7QUFHUixFQUFBQSx5QkFBQSxpQkFBYztBQUdkLEVBQUFBLHlCQUFBLHVCQUFvQjtBQUdwQixFQUFBQSx5QkFBQSxpQkFBYztBQUdkLEVBQUFBLHlCQUFBLHFCQUFrQjtBQUdsQixFQUFBQSx5QkFBQSxhQUFVO0FBR1YsRUFBQUEseUJBQUEsYUFBVTtBQUdWLEVBQUFBLHlCQUFBLGlCQUFjO0FBR2QsRUFBQUEseUJBQUEsU0FBTTtBQUdOLEVBQUFBLHlCQUFBLGVBQVk7QUFHWixFQUFBQSx5QkFBQSxXQUFRO0FBR1IsRUFBQUEseUJBQUEsa0JBQWU7QUFHZixFQUFBQSx5QkFBQSxrQkFBZTtBQUdmLEVBQUFBLHlCQUFBLG9CQUFpQjtBQXpKUCxTQUFBQTtBQUFBLEdBQUE7IiwKICAibmFtZXMiOiBbIk9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIl0KfQo=
82
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9vYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIGVudW1lcmF0aW9uIGZvciBjb21tb24gZmlsZSBhbmQgZm9sZGVyIHBhdGhzIHVzZWQgaW4gT2JzaWRpYW4gcGx1Z2luIGRldmVsb3BtZW50LlxuICovXG5cbi8qKlxuICogRW51bWVyYXRpb24gb2YgY29tbW9ubHkgdXNlZCBmaWxlIGFuZCBmb2xkZXIgcGF0aHMgaW4gT2JzaWRpYW4gcGx1Z2luIGRldmVsb3BtZW50LlxuICovXG5leHBvcnQgZW51bSBPYnNpZGlhblBsdWdpblJlcG9QYXRocyB7XG4gIC8qKiBDb21tb25KUyBmaWxlLiAqL1xuICBBbnlDanMgPSAnKi5janMnLFxuXG4gIC8qKiBBbnkgaW50ZWdyYXRpb24tdGVzdCBUeXBlU2NyaXB0IGZpbGUuICovXG4gIEFueUludGVncmF0aW9uVGVzdFRzID0gJyouaW50ZWdyYXRpb24udGVzdC50cycsXG5cbiAgLyoqIEphdmFTY3JpcHQgZmlsZS4gKi9cbiAgQW55SnMgPSAnKi5qcycsXG5cbiAgLyoqIEVTTSBKYXZhU2NyaXB0IGZpbGUuICovXG4gIEFueU1qcyA9ICcqLm1qcycsXG5cbiAgLyoqIEFueSBwYXRoIHJlY3Vyc2l2ZWx5LiAqL1xuICBBbnlQYXRoID0gJyoqJyxcblxuICAvKiogQW55IHRlc3QgVHlwZVNjcmlwdCBmaWxlLiAqL1xuICBBbnlUZXN0VHMgPSAnKi50ZXN0LnRzJyxcblxuICAvKiogVHlwZVNjcmlwdCBmaWxlLiAqL1xuICBBbnlUcyA9ICcqLnRzJyxcblxuICAvKiogUmVhY3RKUyBUeXBlU2NyaXB0IGZpbGUuICovXG4gIEFueVRzeCA9ICcqLnRzeCcsXG5cbiAgLyoqIENoYW5nZWxvZyBmaWxlLiAqL1xuICBDaGFuZ2Vsb2dNZCA9ICdDSEFOR0VMT0cubWQnLFxuXG4gIC8qKiBDb21taXRsaW50IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgQ29tbWl0bGludENvbmZpZ1RzID0gJ2NvbW1pdGxpbnQuY29uZmlnLnRzJyxcblxuICAvKiogQ3VycmVudCBmb2xkZXIuICovXG4gIEN1cnJlbnRGb2xkZXIgPSAnLicsXG5cbiAgLyoqIERlbW8gdmF1bHQgZm9sZGVyIHNoaXBwZWQgaW4gYSBwbHVnaW4gcmVwbyByb290LiAqL1xuICBEZW1vVmF1bHQgPSAnZGVtby12YXVsdCcsXG5cbiAgLyoqIERpc3RyaWJ1dGlvbiBmb2xkZXIuICovXG4gIERpc3QgPSAnZGlzdCcsXG5cbiAgLyoqIEJ1aWxkIGZvbGRlciB3aXRoaW4gdGhlIHtAbGluayBEaXN0fSBmb2xkZXIuICovXG4gIERpc3RCdWlsZCA9ICdkaXN0L2J1aWxkJyxcblxuICAvKiogRGV2ZWxvcG1lbnQgZm9sZGVyIHdpdGhpbiB0aGUge0BsaW5rIERpc3R9IGZvbGRlci4gKi9cbiAgRGlzdERldiA9ICdkaXN0L2RldicsXG5cbiAgLyoqIE9ic2lkaWFuIGNvbmZpZ3VyYXRpb24gZm9sZGVyIHdpdGhpbiBhIHZhdWx0LiAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9oYXJkY29kZWQtY29uZmlnLXBhdGggLS0gVGhpcyBpcyB0aGUgZGVmYXVsdCBjb25maWcgZm9sZGVyIG5hbWUgYmFrZWQgaW50byBhIHNoaXBwZWQgZGVtby12YXVsdCBza2VsZXRvbiwgbm90IGEgbG9va3VwIGFnYWluc3QgYSBsaXZlIHZhdWx0LlxuICBEb3RPYnNpZGlhbiA9ICcub2JzaWRpYW4nLFxuXG4gIC8qKiBDb21tb25KUyBFU0xpbnQgY29uZmlndXJhdGlvbiBmaWxlLiAqL1xuICBFc2xpbnRDb25maWdDanMgPSAnZXNsaW50LmNvbmZpZy5janMnLFxuXG4gIC8qKiBDb21tb25KUyBUeXBlU2NyaXB0IEVTTGludCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIEVzbGludENvbmZpZ0N0cyA9ICdlc2xpbnQuY29uZmlnLmN0cycsXG5cbiAgLyoqIEphdmFTY3JpcHQgRVNMaW50IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgRXNsaW50Q29uZmlnSnMgPSAnZXNsaW50LmNvbmZpZy5qcycsXG5cbiAgLyoqIEVTTSBKYXZhU2NyaXB0IEVTTGludCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIEVzbGludENvbmZpZ01qcyA9ICdlc2xpbnQuY29uZmlnLm1qcycsXG5cbiAgLyoqIEVTTSBUeXBlU2NyaXB0IEVTTGludCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIEVzbGludENvbmZpZ010cyA9ICdlc2xpbnQuY29uZmlnLm10cycsXG5cbiAgLyoqIFR5cGVTY3JpcHQgRVNMaW50IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgRXNsaW50Q29uZmlnVHMgPSAnZXNsaW50LmNvbmZpZy50cycsXG5cbiAgLyoqIEhvdCByZWxvYWQgZmlsZS4gKi9cbiAgSG90UmVsb2FkID0gJy5ob3RyZWxvYWQnLFxuXG4gIC8qKiBNYWluIENTUyBmaWxlLiAqL1xuICBNYWluQ3NzID0gJ21haW4uY3NzJyxcblxuICAvKiogTWFpbiBKYXZhU2NyaXB0IGZpbGUuICovXG4gIE1haW5KcyA9ICdtYWluLmpzJyxcblxuICAvKiogTWFpbiBUeXBlU2NyaXB0IGZpbGUuICovXG4gIE1haW5UcyA9ICdtYWluLnRzJyxcblxuICAvKiogTWFuaWZlc3QgZmlsZSBmb3IgYmV0YSByZWxlYXNlcy4gKi9cbiAgTWFuaWZlc3RCZXRhSnNvbiA9ICdtYW5pZmVzdC1iZXRhLmpzb24nLFxuXG4gIC8qKiBNYW5pZmVzdCBmaWxlLiAqL1xuICBNYW5pZmVzdEpzb24gPSAnbWFuaWZlc3QuanNvbicsXG5cbiAgLyoqIENvbW1vbkpTIE1hcmtkb3dubGludCBDTEkyIGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgTWFya2Rvd25saW50Q2xpMkNvbmZpZ0NqcyA9ICcubWFya2Rvd25saW50LWNsaTIuY2pzJyxcblxuICAvKiogSlNPTkMgTWFya2Rvd25saW50IENMSTIgY29uZmlndXJhdGlvbiBmaWxlLiAqL1xuICBNYXJrZG93bmxpbnRDbGkyQ29uZmlnSnNvbmMgPSAnLm1hcmtkb3dubGludC1jbGkyLmpzb25jJyxcblxuICAvKiogRVNNIE1hcmtkb3dubGludCBDTEkyIGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgTWFya2Rvd25saW50Q2xpMkNvbmZpZ01qcyA9ICcubWFya2Rvd25saW50LWNsaTIubWpzJyxcblxuICAvKiogWUFNTCBNYXJrZG93bmxpbnQgQ0xJMiBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIE1hcmtkb3dubGludENsaTJDb25maWdZYW1sID0gJy5tYXJrZG93bmxpbnQtY2xpMi55YW1sJyxcblxuICAvKiogQ29tbW9uSlMgTWFya2Rvd25saW50IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgTWFya2Rvd25saW50Q29uZmlnQ2pzID0gJy5tYXJrZG93bmxpbnQuY2pzJyxcblxuICAvKiogSlNPTiBNYXJrZG93bmxpbnQgY29uZmlndXJhdGlvbiBmaWxlLiAqL1xuICBNYXJrZG93bmxpbnRDb25maWdKc29uID0gJy5tYXJrZG93bmxpbnQuanNvbicsXG5cbiAgLyoqIEpTT05DIE1hcmtkb3dubGludCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIE1hcmtkb3dubGludENvbmZpZ0pzb25jID0gJy5tYXJrZG93bmxpbnQuanNvbmMnLFxuXG4gIC8qKiBFU00gTWFya2Rvd25saW50IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgTWFya2Rvd25saW50Q29uZmlnTWpzID0gJy5tYXJrZG93bmxpbnQubWpzJyxcblxuICAvKiogWUFNTCBNYXJrZG93bmxpbnQgY29uZmlndXJhdGlvbiBmaWxlLiAqL1xuICBNYXJrZG93bmxpbnRDb25maWdZYW1sID0gJy5tYXJrZG93bmxpbnQueWFtbCcsXG5cbiAgLyoqIFlBTUwgTWFya2Rvd25saW50IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgTWFya2Rvd25saW50Q29uZmlnWW1sID0gJy5tYXJrZG93bmxpbnQueW1sJyxcblxuICAvKiogTW9ja3MgZm9sZGVyLiAqL1xuICBNb2NrcyA9ICdzcmMvdGVzdC1oZWxwZXJzJyxcblxuICAvKiogTm9kZSBtb2R1bGVzIGZvbGRlci4gKi9cbiAgTm9kZU1vZHVsZXMgPSAnbm9kZV9tb2R1bGVzJyxcblxuICAvKiogTlBNIHNocmlua3dyYXAgZmlsZS4gKi9cbiAgTnBtU2hyaW5rd3JhcEpzb24gPSAnbnBtLXNocmlua3dyYXAuanNvbicsXG5cbiAgLyoqIFBhY2thZ2UgSlNPTiBmaWxlLiAqL1xuICBQYWNrYWdlSnNvbiA9ICdwYWNrYWdlLmpzb24nLFxuXG4gIC8qKiBQYWNrYWdlLWxvY2sgSlNPTiBmaWxlLiAqL1xuICBQYWNrYWdlTG9ja0pzb24gPSAncGFja2FnZS1sb2NrLmpzb24nLFxuXG4gIC8qKiBQbHVnaW5zIGZvbGRlciB3aXRoaW4gYW4gT2JzaWRpYW4gY29uZmlndXJhdGlvbiBmb2xkZXIuICovXG4gIFBsdWdpbnMgPSAncGx1Z2lucycsXG5cbiAgLyoqIFNjcmlwdHMgZm9sZGVyLiAqL1xuICBTY3JpcHRzID0gJ3NjcmlwdHMnLFxuXG4gIC8qKiBTY3JpcHQgdXRpbGl0aWVzIGZvbGRlciAoZGV2LW9ubHkgdG9vbGluZyB0aGF0IHJ1bnMgaW4gdGhlIGNvbnN1bWVyJ3MgTm9kZSBlbnZpcm9ubWVudCwgbm90IHRoZSBPYnNpZGlhbiBydW50aW1lKS4gKi9cbiAgU2NyaXB0VXRpbHMgPSAnc3JjL3NjcmlwdC11dGlscycsXG5cbiAgLyoqIFNvdXJjZSBmb2xkZXIuICovXG4gIFNyYyA9ICdzcmMnLFxuXG4gIC8qKiBTdHlsZXMgQ1NTIGZpbGUuICovXG4gIFN0eWxlc0NzcyA9ICdzdHlsZXMuY3NzJyxcblxuICAvKiogVGVzdHMgZm9sZGVyLiAqL1xuICBUZXN0cyA9ICdfX3Rlc3RzX18nLFxuXG4gIC8qKiBUeXBlU2NyaXB0IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgVHNDb25maWdKc29uID0gJ3RzY29uZmlnLmpzb24nLFxuXG4gIC8qKiBWZXJzaW9ucyBKU09OIGZpbGUuICovXG4gIFZlcnNpb25zSnNvbiA9ICd2ZXJzaW9ucy5qc29uJyxcblxuICAvKiogVml0ZXN0IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgVml0ZXN0Q29uZmlnVHMgPSAndml0ZXN0LmNvbmZpZy50cydcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU08sSUFBSywwQkFBTCxrQkFBS0EsNkJBQUw7QUFFTCxFQUFBQSx5QkFBQSxZQUFTO0FBR1QsRUFBQUEseUJBQUEsMEJBQXVCO0FBR3ZCLEVBQUFBLHlCQUFBLFdBQVE7QUFHUixFQUFBQSx5QkFBQSxZQUFTO0FBR1QsRUFBQUEseUJBQUEsYUFBVTtBQUdWLEVBQUFBLHlCQUFBLGVBQVk7QUFHWixFQUFBQSx5QkFBQSxXQUFRO0FBR1IsRUFBQUEseUJBQUEsWUFBUztBQUdULEVBQUFBLHlCQUFBLGlCQUFjO0FBR2QsRUFBQUEseUJBQUEsd0JBQXFCO0FBR3JCLEVBQUFBLHlCQUFBLG1CQUFnQjtBQUdoQixFQUFBQSx5QkFBQSxlQUFZO0FBR1osRUFBQUEseUJBQUEsVUFBTztBQUdQLEVBQUFBLHlCQUFBLGVBQVk7QUFHWixFQUFBQSx5QkFBQSxhQUFVO0FBSVYsRUFBQUEseUJBQUEsaUJBQWM7QUFHZCxFQUFBQSx5QkFBQSxxQkFBa0I7QUFHbEIsRUFBQUEseUJBQUEscUJBQWtCO0FBR2xCLEVBQUFBLHlCQUFBLG9CQUFpQjtBQUdqQixFQUFBQSx5QkFBQSxxQkFBa0I7QUFHbEIsRUFBQUEseUJBQUEscUJBQWtCO0FBR2xCLEVBQUFBLHlCQUFBLG9CQUFpQjtBQUdqQixFQUFBQSx5QkFBQSxlQUFZO0FBR1osRUFBQUEseUJBQUEsYUFBVTtBQUdWLEVBQUFBLHlCQUFBLFlBQVM7QUFHVCxFQUFBQSx5QkFBQSxZQUFTO0FBR1QsRUFBQUEseUJBQUEsc0JBQW1CO0FBR25CLEVBQUFBLHlCQUFBLGtCQUFlO0FBR2YsRUFBQUEseUJBQUEsK0JBQTRCO0FBRzVCLEVBQUFBLHlCQUFBLGlDQUE4QjtBQUc5QixFQUFBQSx5QkFBQSwrQkFBNEI7QUFHNUIsRUFBQUEseUJBQUEsZ0NBQTZCO0FBRzdCLEVBQUFBLHlCQUFBLDJCQUF3QjtBQUd4QixFQUFBQSx5QkFBQSw0QkFBeUI7QUFHekIsRUFBQUEseUJBQUEsNkJBQTBCO0FBRzFCLEVBQUFBLHlCQUFBLDJCQUF3QjtBQUd4QixFQUFBQSx5QkFBQSw0QkFBeUI7QUFHekIsRUFBQUEseUJBQUEsMkJBQXdCO0FBR3hCLEVBQUFBLHlCQUFBLFdBQVE7QUFHUixFQUFBQSx5QkFBQSxpQkFBYztBQUdkLEVBQUFBLHlCQUFBLHVCQUFvQjtBQUdwQixFQUFBQSx5QkFBQSxpQkFBYztBQUdkLEVBQUFBLHlCQUFBLHFCQUFrQjtBQUdsQixFQUFBQSx5QkFBQSxhQUFVO0FBR1YsRUFBQUEseUJBQUEsYUFBVTtBQUdWLEVBQUFBLHlCQUFBLGlCQUFjO0FBR2QsRUFBQUEseUJBQUEsU0FBTTtBQUdOLEVBQUFBLHlCQUFBLGVBQVk7QUFHWixFQUFBQSx5QkFBQSxXQUFRO0FBR1IsRUFBQUEseUJBQUEsa0JBQWU7QUFHZixFQUFBQSx5QkFBQSxrQkFBZTtBQUdmLEVBQUFBLHlCQUFBLG9CQUFpQjtBQTVKUCxTQUFBQTtBQUFBLEdBQUE7IiwKICAibmFtZXMiOiBbIk9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIl0KfQo=
@@ -28,6 +28,40 @@ export declare enum RegExpMergeFlagsConflictStrategy {
28
28
  * @returns The escaped string with special characters prefixed with a backslash.
29
29
  */
30
30
  export declare function escapeRegExp(str: string): string;
31
+ /**
32
+ * Reads a mandatory named capture group from a regex match.
33
+ *
34
+ * Use this for a named group that is ALWAYS present when the pattern matches — not wrapped in an optional
35
+ * `(?:…)?` / `(…)?`. Returns the captured string (which may be `''` for a zero-width match such as `\w*`),
36
+ * throwing if the group — or the match's `groups` object — is absent, so a pattern change that drops the
37
+ * group fails loudly instead of silently yielding a wrong value.
38
+ *
39
+ * Prefer this over `match.groups?.[name] ?? ''`: for a mandatory group that fallback is a never-taken (dead)
40
+ * branch that fails a 100%-branch coverage gate, whereas the throw here lives inside `ensureNonNullable`
41
+ * (already covered), leaving no inline branch at the call site. For a group that may legitimately be absent,
42
+ * use {@link getOptionalNamedGroup} and default its `null` with `?? …`.
43
+ *
44
+ * @param match - The match returned by `RegExp.exec`, `String.matchAll`, or `String.match`.
45
+ * @param groupName - The name of the capture group to read.
46
+ * @returns The captured string.
47
+ * @throws When the named group is absent.
48
+ */
49
+ export declare function getMandatoryNamedGroup(match: RegExpMatchArray, groupName: string): string;
50
+ /**
51
+ * Reads an optional named capture group from a regex match, distinguishing an absent group from a present
52
+ * empty one.
53
+ *
54
+ * Returns the captured string when the group participated in the match — which may be `''` for a zero-width
55
+ * match such as `\w*` — or `null` when the group, or the match's `groups` object, is absent (e.g. an optional
56
+ * `(?:…)?` group that did not match). Because `null` is returned only for a genuinely-absent group, a
57
+ * caller's `?? <default>` is a live branch rather than the dead one that `match.groups?.[name] ?? ''` leaves
58
+ * for a mandatory group. For a group that must always be present, use {@link getMandatoryNamedGroup}.
59
+ *
60
+ * @param match - The match returned by `RegExp.exec`, `String.matchAll`, or `String.match`.
61
+ * @param groupName - The name of the capture group to read.
62
+ * @returns The captured string, or `null` when the group is absent.
63
+ */
64
+ export declare function getOptionalNamedGroup(match: RegExpMatchArray, groupName: string): null | string;
31
65
  /**
32
66
  * Checks if a string is a valid regular expression.
33
67
  *
@@ -23,7 +23,8 @@ if you want to view the source, please visit the github repository of this plugi
23
23
 
24
24
  import {
25
25
  assert,
26
- assertNever
26
+ assertNever,
27
+ ensureNonNullable
27
28
  } from "./type-guards.mjs";
28
29
  var RegExpMergeFlagsConflictStrategy = /* @__PURE__ */ ((RegExpMergeFlagsConflictStrategy2) => {
29
30
  RegExpMergeFlagsConflictStrategy2["Intersect"] = "Intersect";
@@ -34,6 +35,12 @@ var RegExpMergeFlagsConflictStrategy = /* @__PURE__ */ ((RegExpMergeFlagsConflic
34
35
  function escapeRegExp(str) {
35
36
  return str.replaceAll(/[.*+?^${}()|[\]\\]/g, "\\$&");
36
37
  }
38
+ function getMandatoryNamedGroup(match, groupName) {
39
+ return ensureNonNullable(getOptionalNamedGroup(match, groupName));
40
+ }
41
+ function getOptionalNamedGroup(match, groupName) {
42
+ return match.groups?.[groupName] ?? null;
43
+ }
37
44
  function isValidRegExp(str) {
38
45
  try {
39
46
  new RegExp(str);
@@ -165,7 +172,9 @@ export {
165
172
  NEVER_MATCH_REG_EXP,
166
173
  RegExpMergeFlagsConflictStrategy,
167
174
  escapeRegExp,
175
+ getMandatoryNamedGroup,
176
+ getOptionalNamedGroup,
168
177
  isValidRegExp,
169
178
  oneOf
170
179
  };
171
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3JlZy1leHAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgcmVndWxhciBleHByZXNzaW9ucy5cbiAqL1xuXG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIGFzc2VydE5ldmVyXG59IGZyb20gJy4vdHlwZS1ndWFyZHMudHMnO1xuXG4vKipcbiAqIEEgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gbWVyZ2luZyBtdWx0aXBsZSByZWdleCBmbGFncyBpbnRvIG9uZSBhbHRlcm5hdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kge1xuICAvKipcbiAgICogS2VlcCBvbmx5IHRoZSBmbGFncyBwcmVzZW50IGluIGFsbCByZWdleGVzLlxuICAgKi9cbiAgSW50ZXJzZWN0ID0gJ0ludGVyc2VjdCcsXG4gIC8qKlxuICAgKiBUaHJvdyBhbiBlcnJvciBpZiB0aGUgcmVnZXhlcyBoYXZlIGNvbmZsaWN0aW5nIGZsYWdzLlxuICAgKi9cbiAgVGhyb3cgPSAnVGhyb3cnLFxuICAvKipcbiAgICogS2VlcCBvbmx5IHRoZSBmbGFncyBwcmVzZW50IGluIGFueSByZWdleC5cbiAgICovXG4gIFVuaW9uID0gJ1VuaW9uJ1xufVxuXG4vKipcbiAqIEVzY2FwZXMgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIGEgc3RyaW5nIHRvIHNhZmVseSB1c2UgaXQgd2l0aGluIGEgcmVndWxhciBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHN0cmluZyB3aXRoIHNwZWNpYWwgY2hhcmFjdGVycyBwcmVmaXhlZCB3aXRoIGEgYmFja3NsYXNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gTk9URTogV2UgY2FuJ3QgdXNlIGByZXBsYWNlQWxsKClgIGZyb20gYFN0cmluZy50c2AgaGVyZSBiZWNhdXNlIGl0IGludHJvZHVjZXMgYSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICByZXR1cm4gc3RyLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgc3RyaW5nIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24sIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFJlZ0V4cChzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIG5ldyBSZWdFeHAoc3RyKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0ZsYWcocmVnRXhwOiBSZWdFeHAsIGZsYWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVnRXhwLmZsYWdzLmluY2x1ZGVzKGZsYWcpO1xufVxuXG4vKipcbiAqIEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgYWx3YXlzIG1hdGNoZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBBTFdBWVNfTUFUQ0hfUkVHX0VYUCA9IC8oPzopLztcblxuLyoqXG4gKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG5ldmVyIG1hdGNoZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBORVZFUl9NQVRDSF9SRUdfRVhQID0gLy5eLztcblxuLyoqXG4gKiBNZXJnZXMgdGhlIGZsYWdzIG9mIG11bHRpcGxlIHJlZ2V4ZXMgaW50byBhIHNpbmdsZSBmbGFnIHN0cmluZywgYXBwbHlpbmcgYSBjb25mbGljdCBzdHJhdGVneS5cbiAqXG4gKiBUaGUgY29vcGVyYXRpbmcgcGVyLWZsYWcgaGVscGVycyBzaGFyZSB0aGUgc2FtZSByZWdleGVzLCBzdHJhdGVneSwgYW5kIGFjY3VtdWxhdGVkIGZsYWcgc2V0LCBzb1xuICogdGhleSBhcmUgZ3JvdXBlZCBoZXJlIGFzIG1ldGhvZHMgb3ZlciB0aG9zZSBmaWVsZHMgcmF0aGVyIHRoYW4gdGhyZWFkaW5nIHRoZSBzdGF0ZSB0aHJvdWdoXG4gKiBwb3NpdGlvbmFsIGFyZ3VtZW50cy5cbiAqL1xuY2xhc3MgUmVnRXhwRmxhZ01lcmdlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmluYWxGbGFncyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IG1lcmdlci5cbiAgICpcbiAgICogQHBhcmFtIHJlZ0V4cHMgLSBUaGUgcmVnZXhlcyB3aG9zZSBmbGFncyBhcmUgbWVyZ2VkLlxuICAgKiBAcGFyYW0gc3RyYXRlZ3kgLSBUaGUgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gZmxhZ3MgY29uZmxpY3QuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSByZWdFeHBzOiBSZWdFeHBbXSwgcHJpdmF0ZSByZWFkb25seSBzdHJhdGVneTogUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kpIHt9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBtZXJnZWQgZmxhZyBzdHJpbmcgZm9yIHRoZSBjb25maWd1cmVkIHJlZ2V4ZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBtZXJnZWQgZmxhZ3Mgam9pbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIGNvbXB1dGVGbGFncygpOiBzdHJpbmcge1xuICAgIHRoaXMuYWRkU2VtYW50aWNGbGFncygpO1xuICAgIHRoaXMuYWRkVW5pY29kZUZsYWdzKCk7XG4gICAgdGhpcy5hZGRNZXRhRmxhZ3MoKTtcbiAgICByZXR1cm4gWy4uLnRoaXMuZmluYWxGbGFnc10uam9pbignJyk7XG4gIH1cblxuICBwcml2YXRlIGFkZE1ldGFGbGFncygpOiB2b2lkIHtcbiAgICBjb25zdCBNRVRBX0ZMQUdTID0gWydnJywgJ2QnXTtcbiAgICBmb3IgKGNvbnN0IGZsYWcgb2YgTUVUQV9GTEFHUykge1xuICAgICAgaWYgKHRoaXMucmVnRXhwcy5zb21lKChyZWdFeHApID0+IGhhc0ZsYWcocmVnRXhwLCBmbGFnKSkpIHtcbiAgICAgICAgdGhpcy5maW5hbEZsYWdzLmFkZChmbGFnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFNlbWFudGljRmxhZ3MoKTogdm9pZCB7XG4gICAgY29uc3QgU0VNQU5USUNfRkxBR1MgPSBbJ2knLCAnbScsICdzJywgJ3knXTtcbiAgICBmb3IgKGNvbnN0IGZsYWcgb2YgU0VNQU5USUNfRkxBR1MpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFBpY2tGbGFnKGZsYWcpKSB7XG4gICAgICAgIHRoaXMuZmluYWxGbGFncy5hZGQoZmxhZyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRVbmljb2RlRmxhZ3MoKTogdm9pZCB7XG4gICAgY29uc3QgY291bnRVID0gdGhpcy5yZWdFeHBzLmZpbHRlcigocmVnRXhwKSA9PiBoYXNGbGFnKHJlZ0V4cCwgJ3UnKSkubGVuZ3RoO1xuICAgIGNvbnN0IGNvdW50ViA9IHRoaXMucmVnRXhwcy5maWx0ZXIoKHJlZ0V4cCkgPT4gaGFzRmxhZyhyZWdFeHAsICd2JykpLmxlbmd0aDtcblxuICAgIGxldCBzaG91bGRVc2VVRmxhZzogYm9vbGVhbjtcbiAgICBsZXQgc2hvdWxkVXNlVkZsYWc6IGJvb2xlYW47XG5cbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gdjggY291bnRzIHRoZSBpbXBsaWNpdCBkZWZhdWx0IGJyYW5jaCBhcyB1bmNvdmVyZWQgZXZlbiB3aGVuIGFsbCBlbnVtIGNhc2VzIGFyZSBoYW5kbGVkLiAqL1xuICAgIHN3aXRjaCAodGhpcy5zdHJhdGVneSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIGNhc2UgUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kuSW50ZXJzZWN0OlxuICAgICAgICBzaG91bGRVc2VVRmxhZyA9IGNvdW50VSA9PT0gdGhpcy5yZWdFeHBzLmxlbmd0aDtcbiAgICAgICAgc2hvdWxkVXNlVkZsYWcgPSBjb3VudFYgPT09IHRoaXMucmVnRXhwcy5sZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneS5UaHJvdzoge1xuICAgICAgICBjb25zdCBhbGxVID0gY291bnRVID09PSB0aGlzLnJlZ0V4cHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBub25lVSA9IGNvdW50VSA9PT0gMDtcbiAgICAgICAgY29uc3QgYWxsViA9IGNvdW50ViA9PT0gdGhpcy5yZWdFeHBzLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgbm9uZVYgPSBjb3VudFYgPT09IDA7XG5cbiAgICAgICAgaWYgKCEoYWxsVSB8fCBub25lVSkgfHwgIShhbGxWIHx8IG5vbmVWKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmxpY3RpbmcgXFwndVxcJy9cXCd2XFwnIGZsYWdzIGFjcm9zcyBwYXR0ZXJucy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNob3VsZFVzZVVGbGFnID0gYWxsVTtcbiAgICAgICAgc2hvdWxkVXNlVkZsYWcgPSBhbGxWO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kuVW5pb246XG4gICAgICAgIHNob3VsZFVzZVVGbGFnID0gY291bnRVID4gMDtcbiAgICAgICAgc2hvdWxkVXNlVkZsYWcgPSBjb3VudFYgPiAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBFeGhhdXN0aXZlIHN3aXRjaCBndWFyZC4gKi9cbiAgICAgICAgYXNzZXJ0TmV2ZXIodGhpcy5zdHJhdGVneSk7XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFVzZVVGbGFnICYmIHNob3VsZFVzZVZGbGFnKSB7XG4gICAgICBhc3NlcnQodGhpcy5zdHJhdGVneSAhPT0gUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kuVGhyb3csICdDYW5ub3QgY29tYmluZSBib3RoIFxcJ3VcXCcvXFwndlxcJyBmbGFncyBpbiBvbmUgUmVnRXhwLicpO1xuICAgICAgc2hvdWxkVXNlVUZsYWcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVXNlVUZsYWcpIHtcbiAgICAgIHRoaXMuZmluYWxGbGFncy5hZGQoJ3UnKTtcbiAgICB9XG4gICAgaWYgKHNob3VsZFVzZVZGbGFnKSB7XG4gICAgICB0aGlzLmZpbmFsRmxhZ3MuYWRkKCd2Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRQaWNrRmxhZyhmbGFnOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMucmVnRXhwcy5maWx0ZXIoKHJlZ0V4cCkgPT4gaGFzRmxhZyhyZWdFeHAsIGZsYWcpKS5sZW5ndGg7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIHY4IGNvdW50cyB0aGUgaW1wbGljaXQgZGVmYXVsdCBicmFuY2ggYXMgdW5jb3ZlcmVkIGV2ZW4gd2hlbiBhbGwgZW51bSBjYXNlcyBhcmUgaGFuZGxlZC4gKi9cbiAgICBzd2l0Y2ggKHRoaXMuc3RyYXRlZ3kpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICBjYXNlIFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5LkludGVyc2VjdDpcbiAgICAgICAgcmV0dXJuIGNvdW50ID09PSB0aGlzLnJlZ0V4cHMubGVuZ3RoO1xuICAgICAgY2FzZSBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneS5UaHJvdzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5LlVuaW9uOlxuICAgICAgICByZXR1cm4gY291bnQgPiAwO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEV4aGF1c3RpdmUgc3dpdGNoIGd1YXJkLiAqL1xuICAgICAgICBhc3NlcnROZXZlcih0aGlzLnN0cmF0ZWd5KTtcbiAgICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICB9XG5cbiAgICBjb25zdCBhbGxTYW1lID0gY291bnQgPT09IDAgfHwgY291bnQgPT09IHRoaXMucmVnRXhwcy5sZW5ndGg7XG4gICAgaWYgKCFhbGxTYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZsaWN0aW5nIGZsYWcgJyR7ZmxhZ30nIGFjcm9zcyBwYXR0ZXJucy5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50ID09PSB0aGlzLnJlZ0V4cHMubGVuZ3RoO1xuICB9XG59XG5cbi8qKlxuICogQ29tYmluZSBtdWx0aXBsZSByZWdleGVzIGludG8gb25lIGFsdGVybmF0aW9uLCBoYW5kbGluZyBmbGFncy5cbiAqXG4gKiBAcGFyYW0gcmVnRXhwcyAtIFRoZSByZWdleGVzIHRvIGNvbWJpbmUuXG4gKiBAcGFyYW0gc3RyYXRlZ3kgLSBUaGUgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gbWVyZ2luZyBmbGFncyAoZGVmYXVsdDogYFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5LlRocm93YCkuXG4gKiBAcmV0dXJucyBUaGUgY29tYmluZWQgcmVnZXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVPZihcbiAgcmVnRXhwczogUmVnRXhwW10sXG4gIHN0cmF0ZWd5OiBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneSA9IFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5LlRocm93XG4pOiBSZWdFeHAge1xuICBpZiAocmVnRXhwcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQUxXQVlTX01BVENIX1JFR19FWFA7XG4gIH1cblxuICBpZiAocmVnRXhwcy5sZW5ndGggPT09IDEgJiYgcmVnRXhwc1swXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHJlZ0V4cHNbMF07XG4gIH1cblxuICBjb25zdCBzb3VyY2UgPSByZWdFeHBzLm1hcCgocmVnRXhwKSA9PiBgKD86JHtyZWdFeHAuc291cmNlfSlgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IGZsYWdzID0gbmV3IFJlZ0V4cEZsYWdNZXJnZXIocmVnRXhwcywgc3RyYXRlZ3kpLmNvbXB1dGVGbGFncygpO1xuICByZXR1cm4gbmV3IFJlZ0V4cChzb3VyY2UsIGZsYWdzKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFLQSxJQUFLLG1DQUFMLGtCQUFLQSxzQ0FBTDtBQUlMLEVBQUFBLGtDQUFBLGVBQVk7QUFJWixFQUFBQSxrQ0FBQSxXQUFRO0FBSVIsRUFBQUEsa0NBQUEsV0FBUTtBQVpFLFNBQUFBO0FBQUEsR0FBQTtBQXFCTCxTQUFTLGFBQWEsS0FBcUI7QUFFaEQsU0FBTyxJQUFJLFdBQVcsdUJBQXVCLE1BQU07QUFDckQ7QUFRTyxTQUFTLGNBQWMsS0FBc0I7QUFDbEQsTUFBSTtBQUNGLFFBQUksT0FBTyxHQUFHO0FBQ2QsV0FBTztBQUFBLEVBQ1QsUUFBUTtBQUNOLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFFQSxTQUFTLFFBQVEsUUFBZ0IsTUFBdUI7QUFDdEQsU0FBTyxPQUFPLE1BQU0sU0FBUyxJQUFJO0FBQ25DO0FBS08sTUFBTSx1QkFBdUI7QUFLN0IsTUFBTSxzQkFBc0I7QUFTbkMsTUFBTSxpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNkLFlBQTZCLFNBQW9DLFVBQTRDO0FBQWhGO0FBQW9DO0FBQUEsRUFBNkM7QUFBQSxFQUFqRjtBQUFBLEVBQW9DO0FBQUEsRUFSdkQsYUFBYSxvQkFBSSxJQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBZXZDLGVBQXVCO0FBQzVCLFNBQUssaUJBQWlCO0FBQ3RCLFNBQUssZ0JBQWdCO0FBQ3JCLFNBQUssYUFBYTtBQUNsQixXQUFPLENBQUMsR0FBRyxLQUFLLFVBQVUsRUFBRSxLQUFLLEVBQUU7QUFBQSxFQUNyQztBQUFBLEVBRVEsZUFBcUI7QUFDM0IsVUFBTSxhQUFhLENBQUMsS0FBSyxHQUFHO0FBQzVCLGVBQVcsUUFBUSxZQUFZO0FBQzdCLFVBQUksS0FBSyxRQUFRLEtBQUssQ0FBQyxXQUFXLFFBQVEsUUFBUSxJQUFJLENBQUMsR0FBRztBQUN4RCxhQUFLLFdBQVcsSUFBSSxJQUFJO0FBQUEsTUFDMUI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBRVEsbUJBQXlCO0FBQy9CLFVBQU0saUJBQWlCLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRztBQUMxQyxlQUFXLFFBQVEsZ0JBQWdCO0FBQ2pDLFVBQUksS0FBSyxlQUFlLElBQUksR0FBRztBQUM3QixhQUFLLFdBQVcsSUFBSSxJQUFJO0FBQUEsTUFDMUI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBRVEsa0JBQXdCO0FBQzlCLFVBQU0sU0FBUyxLQUFLLFFBQVEsT0FBTyxDQUFDLFdBQVcsUUFBUSxRQUFRLEdBQUcsQ0FBQyxFQUFFO0FBQ3JFLFVBQU0sU0FBUyxLQUFLLFFBQVEsT0FBTyxDQUFDLFdBQVcsUUFBUSxRQUFRLEdBQUcsQ0FBQyxFQUFFO0FBRXJFLFFBQUk7QUFDSixRQUFJO0FBR0osWUFBUSxLQUFLLFVBQVU7QUFBQTtBQUFBLE1BRXJCLEtBQUs7QUFDSCx5QkFBaUIsV0FBVyxLQUFLLFFBQVE7QUFDekMseUJBQWlCLFdBQVcsS0FBSyxRQUFRO0FBQ3pDO0FBQUEsTUFDRixLQUFLLHFCQUF3QztBQUMzQyxjQUFNLE9BQU8sV0FBVyxLQUFLLFFBQVE7QUFDckMsY0FBTSxRQUFRLFdBQVc7QUFDekIsY0FBTSxPQUFPLFdBQVcsS0FBSyxRQUFRO0FBQ3JDLGNBQU0sUUFBUSxXQUFXO0FBRXpCLFlBQUksRUFBRSxRQUFRLFVBQVUsRUFBRSxRQUFRLFFBQVE7QUFDeEMsZ0JBQU0sSUFBSSxNQUFNLDRDQUFnRDtBQUFBLFFBQ2xFO0FBRUEseUJBQWlCO0FBQ2pCLHlCQUFpQjtBQUNqQjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLEtBQUs7QUFDSCx5QkFBaUIsU0FBUztBQUMxQix5QkFBaUIsU0FBUztBQUMxQjtBQUFBLE1BQ0Y7QUFFRSxvQkFBWSxLQUFLLFFBQVE7QUFBQSxJQUU3QjtBQUVBLFFBQUksa0JBQWtCLGdCQUFnQjtBQUNwQyxhQUFPLEtBQUssYUFBYSxxQkFBd0Msa0RBQXNEO0FBQ3ZILHVCQUFpQjtBQUFBLElBQ25CO0FBRUEsUUFBSSxnQkFBZ0I7QUFDbEIsV0FBSyxXQUFXLElBQUksR0FBRztBQUFBLElBQ3pCO0FBQ0EsUUFBSSxnQkFBZ0I7QUFDbEIsV0FBSyxXQUFXLElBQUksR0FBRztBQUFBLElBQ3pCO0FBQUEsRUFDRjtBQUFBLEVBRVEsZUFBZSxNQUF1QjtBQUM1QyxVQUFNLFFBQVEsS0FBSyxRQUFRLE9BQU8sQ0FBQyxXQUFXLFFBQVEsUUFBUSxJQUFJLENBQUMsRUFBRTtBQUVyRSxZQUFRLEtBQUssVUFBVTtBQUFBO0FBQUEsTUFFckIsS0FBSztBQUNILGVBQU8sVUFBVSxLQUFLLFFBQVE7QUFBQSxNQUNoQyxLQUFLO0FBQ0g7QUFBQSxNQUNGLEtBQUs7QUFDSCxlQUFPLFFBQVE7QUFBQSxNQUNqQjtBQUVFLG9CQUFZLEtBQUssUUFBUTtBQUFBLElBRTdCO0FBRUEsVUFBTSxVQUFVLFVBQVUsS0FBSyxVQUFVLEtBQUssUUFBUTtBQUN0RCxRQUFJLENBQUMsU0FBUztBQUNaLFlBQU0sSUFBSSxNQUFNLHFCQUFxQixJQUFJLG9CQUFvQjtBQUFBLElBQy9EO0FBQ0EsV0FBTyxVQUFVLEtBQUssUUFBUTtBQUFBLEVBQ2hDO0FBQ0Y7QUFTTyxTQUFTLE1BQ2QsU0FDQSxXQUE2QyxxQkFDckM7QUFDUixNQUFJLFFBQVEsV0FBVyxHQUFHO0FBQ3hCLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxRQUFRLFdBQVcsS0FBSyxRQUFRLENBQUMsTUFBTSxRQUFXO0FBQ3BELFdBQU8sUUFBUSxDQUFDO0FBQUEsRUFDbEI7QUFFQSxRQUFNLFNBQVMsUUFBUSxJQUFJLENBQUMsV0FBVyxNQUFNLE9BQU8sTUFBTSxHQUFHLEVBQUUsS0FBSyxHQUFHO0FBQ3ZFLFFBQU0sUUFBUSxJQUFJLGlCQUFpQixTQUFTLFFBQVEsRUFBRSxhQUFhO0FBQ25FLFNBQU8sSUFBSSxPQUFPLFFBQVEsS0FBSztBQUNqQzsiLAogICJuYW1lcyI6IFsiUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kiXQp9Cg==
180
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3JlZy1leHAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgcmVndWxhciBleHByZXNzaW9ucy5cbiAqL1xuXG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIGFzc2VydE5ldmVyLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcblxuLyoqXG4gKiBBIHN0cmF0ZWd5IHRvIHVzZSB3aGVuIG1lcmdpbmcgbXVsdGlwbGUgcmVnZXggZmxhZ3MgaW50byBvbmUgYWx0ZXJuYXRpb24uXG4gKi9cbmV4cG9ydCBlbnVtIFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5IHtcbiAgLyoqXG4gICAqIEtlZXAgb25seSB0aGUgZmxhZ3MgcHJlc2VudCBpbiBhbGwgcmVnZXhlcy5cbiAgICovXG4gIEludGVyc2VjdCA9ICdJbnRlcnNlY3QnLFxuICAvKipcbiAgICogVGhyb3cgYW4gZXJyb3IgaWYgdGhlIHJlZ2V4ZXMgaGF2ZSBjb25mbGljdGluZyBmbGFncy5cbiAgICovXG4gIFRocm93ID0gJ1Rocm93JyxcbiAgLyoqXG4gICAqIEtlZXAgb25seSB0aGUgZmxhZ3MgcHJlc2VudCBpbiBhbnkgcmVnZXguXG4gICAqL1xuICBVbmlvbiA9ICdVbmlvbidcbn1cblxuLyoqXG4gKiBFc2NhcGVzIHNwZWNpYWwgY2hhcmFjdGVycyBpbiBhIHN0cmluZyB0byBzYWZlbHkgdXNlIGl0IHdpdGhpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gc3RyIC0gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBzdHJpbmcgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMgcHJlZml4ZWQgd2l0aCBhIGJhY2tzbGFzaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE5PVEU6IFdlIGNhbid0IHVzZSBgcmVwbGFjZUFsbCgpYCBmcm9tIGBTdHJpbmcudHNgIGhlcmUgYmVjYXVzZSBpdCBpbnRyb2R1Y2VzIGEgY2lyY3VsYXIgZGVwZW5kZW5jeS5cbiAgcmV0dXJuIHN0ci5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgbWFuZGF0b3J5IG5hbWVkIGNhcHR1cmUgZ3JvdXAgZnJvbSBhIHJlZ2V4IG1hdGNoLlxuICpcbiAqIFVzZSB0aGlzIGZvciBhIG5hbWVkIGdyb3VwIHRoYXQgaXMgQUxXQVlTIHByZXNlbnQgd2hlbiB0aGUgcGF0dGVybiBtYXRjaGVzIFx1MjAxNCBub3Qgd3JhcHBlZCBpbiBhbiBvcHRpb25hbFxuICogYCg/Olx1MjAyNik/YCAvIGAoXHUyMDI2KT9gLiBSZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcgKHdoaWNoIG1heSBiZSBgJydgIGZvciBhIHplcm8td2lkdGggbWF0Y2ggc3VjaCBhcyBgXFx3KmApLFxuICogdGhyb3dpbmcgaWYgdGhlIGdyb3VwIFx1MjAxNCBvciB0aGUgbWF0Y2gncyBgZ3JvdXBzYCBvYmplY3QgXHUyMDE0IGlzIGFic2VudCwgc28gYSBwYXR0ZXJuIGNoYW5nZSB0aGF0IGRyb3BzIHRoZVxuICogZ3JvdXAgZmFpbHMgbG91ZGx5IGluc3RlYWQgb2Ygc2lsZW50bHkgeWllbGRpbmcgYSB3cm9uZyB2YWx1ZS5cbiAqXG4gKiBQcmVmZXIgdGhpcyBvdmVyIGBtYXRjaC5ncm91cHM/LltuYW1lXSA/PyAnJ2A6IGZvciBhIG1hbmRhdG9yeSBncm91cCB0aGF0IGZhbGxiYWNrIGlzIGEgbmV2ZXItdGFrZW4gKGRlYWQpXG4gKiBicmFuY2ggdGhhdCBmYWlscyBhIDEwMCUtYnJhbmNoIGNvdmVyYWdlIGdhdGUsIHdoZXJlYXMgdGhlIHRocm93IGhlcmUgbGl2ZXMgaW5zaWRlIGBlbnN1cmVOb25OdWxsYWJsZWBcbiAqIChhbHJlYWR5IGNvdmVyZWQpLCBsZWF2aW5nIG5vIGlubGluZSBicmFuY2ggYXQgdGhlIGNhbGwgc2l0ZS4gRm9yIGEgZ3JvdXAgdGhhdCBtYXkgbGVnaXRpbWF0ZWx5IGJlIGFic2VudCxcbiAqIHVzZSB7QGxpbmsgZ2V0T3B0aW9uYWxOYW1lZEdyb3VwfSBhbmQgZGVmYXVsdCBpdHMgYG51bGxgIHdpdGggYD8/IFx1MjAyNmAuXG4gKlxuICogQHBhcmFtIG1hdGNoIC0gVGhlIG1hdGNoIHJldHVybmVkIGJ5IGBSZWdFeHAuZXhlY2AsIGBTdHJpbmcubWF0Y2hBbGxgLCBvciBgU3RyaW5nLm1hdGNoYC5cbiAqIEBwYXJhbSBncm91cE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2FwdHVyZSBncm91cCB0byByZWFkLlxuICogQHJldHVybnMgVGhlIGNhcHR1cmVkIHN0cmluZy5cbiAqIEB0aHJvd3MgV2hlbiB0aGUgbmFtZWQgZ3JvdXAgaXMgYWJzZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaDogUmVnRXhwTWF0Y2hBcnJheSwgZ3JvdXBOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUoZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCBncm91cE5hbWUpKTtcbn1cblxuLyoqXG4gKiBSZWFkcyBhbiBvcHRpb25hbCBuYW1lZCBjYXB0dXJlIGdyb3VwIGZyb20gYSByZWdleCBtYXRjaCwgZGlzdGluZ3Vpc2hpbmcgYW4gYWJzZW50IGdyb3VwIGZyb20gYSBwcmVzZW50XG4gKiBlbXB0eSBvbmUuXG4gKlxuICogUmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nIHdoZW4gdGhlIGdyb3VwIHBhcnRpY2lwYXRlZCBpbiB0aGUgbWF0Y2ggXHUyMDE0IHdoaWNoIG1heSBiZSBgJydgIGZvciBhIHplcm8td2lkdGhcbiAqIG1hdGNoIHN1Y2ggYXMgYFxcdypgIFx1MjAxNCBvciBgbnVsbGAgd2hlbiB0aGUgZ3JvdXAsIG9yIHRoZSBtYXRjaCdzIGBncm91cHNgIG9iamVjdCwgaXMgYWJzZW50IChlLmcuIGFuIG9wdGlvbmFsXG4gKiBgKD86XHUyMDI2KT9gIGdyb3VwIHRoYXQgZGlkIG5vdCBtYXRjaCkuIEJlY2F1c2UgYG51bGxgIGlzIHJldHVybmVkIG9ubHkgZm9yIGEgZ2VudWluZWx5LWFic2VudCBncm91cCwgYVxuICogY2FsbGVyJ3MgYD8/IDxkZWZhdWx0PmAgaXMgYSBsaXZlIGJyYW5jaCByYXRoZXIgdGhhbiB0aGUgZGVhZCBvbmUgdGhhdCBgbWF0Y2guZ3JvdXBzPy5bbmFtZV0gPz8gJydgIGxlYXZlc1xuICogZm9yIGEgbWFuZGF0b3J5IGdyb3VwLiBGb3IgYSBncm91cCB0aGF0IG11c3QgYWx3YXlzIGJlIHByZXNlbnQsIHVzZSB7QGxpbmsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cH0uXG4gKlxuICogQHBhcmFtIG1hdGNoIC0gVGhlIG1hdGNoIHJldHVybmVkIGJ5IGBSZWdFeHAuZXhlY2AsIGBTdHJpbmcubWF0Y2hBbGxgLCBvciBgU3RyaW5nLm1hdGNoYC5cbiAqIEBwYXJhbSBncm91cE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2FwdHVyZSBncm91cCB0byByZWFkLlxuICogQHJldHVybnMgVGhlIGNhcHR1cmVkIHN0cmluZywgb3IgYG51bGxgIHdoZW4gdGhlIGdyb3VwIGlzIGFic2VudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaDogUmVnRXhwTWF0Y2hBcnJheSwgZ3JvdXBOYW1lOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgcmV0dXJuIG1hdGNoLmdyb3Vwcz8uW2dyb3VwTmFtZV0gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIHN0ciAtIFRoZSBzdHJpbmcgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUmVnRXhwKHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgbmV3IFJlZ0V4cChzdHIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzRmxhZyhyZWdFeHA6IFJlZ0V4cCwgZmxhZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZWdFeHAuZmxhZ3MuaW5jbHVkZXMoZmxhZyk7XG59XG5cbi8qKlxuICogQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBhbHdheXMgbWF0Y2hlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEFMV0FZU19NQVRDSF9SRUdfRVhQID0gLyg/OikvO1xuXG4vKipcbiAqIEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbmV2ZXIgbWF0Y2hlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IE5FVkVSX01BVENIX1JFR19FWFAgPSAvLl4vO1xuXG4vKipcbiAqIE1lcmdlcyB0aGUgZmxhZ3Mgb2YgbXVsdGlwbGUgcmVnZXhlcyBpbnRvIGEgc2luZ2xlIGZsYWcgc3RyaW5nLCBhcHBseWluZyBhIGNvbmZsaWN0IHN0cmF0ZWd5LlxuICpcbiAqIFRoZSBjb29wZXJhdGluZyBwZXItZmxhZyBoZWxwZXJzIHNoYXJlIHRoZSBzYW1lIHJlZ2V4ZXMsIHN0cmF0ZWd5LCBhbmQgYWNjdW11bGF0ZWQgZmxhZyBzZXQsIHNvXG4gKiB0aGV5IGFyZSBncm91cGVkIGhlcmUgYXMgbWV0aG9kcyBvdmVyIHRob3NlIGZpZWxkcyByYXRoZXIgdGhhbiB0aHJlYWRpbmcgdGhlIHN0YXRlIHRocm91Z2hcbiAqIHBvc2l0aW9uYWwgYXJndW1lbnRzLlxuICovXG5jbGFzcyBSZWdFeHBGbGFnTWVyZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmaW5hbEZsYWdzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgbWVyZ2VyLlxuICAgKlxuICAgKiBAcGFyYW0gcmVnRXhwcyAtIFRoZSByZWdleGVzIHdob3NlIGZsYWdzIGFyZSBtZXJnZWQuXG4gICAqIEBwYXJhbSBzdHJhdGVneSAtIFRoZSBzdHJhdGVneSB0byB1c2Ugd2hlbiBmbGFncyBjb25mbGljdC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJlZ0V4cHM6IFJlZ0V4cFtdLCBwcml2YXRlIHJlYWRvbmx5IHN0cmF0ZWd5OiBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneSkge31cblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIG1lcmdlZCBmbGFnIHN0cmluZyBmb3IgdGhlIGNvbmZpZ3VyZWQgcmVnZXhlcy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIG1lcmdlZCBmbGFncyBqb2luZWQgaW50byBhIHNpbmdsZSBzdHJpbmcuXG4gICAqL1xuICBwdWJsaWMgY29tcHV0ZUZsYWdzKCk6IHN0cmluZyB7XG4gICAgdGhpcy5hZGRTZW1hbnRpY0ZsYWdzKCk7XG4gICAgdGhpcy5hZGRVbmljb2RlRmxhZ3MoKTtcbiAgICB0aGlzLmFkZE1ldGFGbGFncygpO1xuICAgIHJldHVybiBbLi4udGhpcy5maW5hbEZsYWdzXS5qb2luKCcnKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTWV0YUZsYWdzKCk6IHZvaWQge1xuICAgIGNvbnN0IE1FVEFfRkxBR1MgPSBbJ2cnLCAnZCddO1xuICAgIGZvciAoY29uc3QgZmxhZyBvZiBNRVRBX0ZMQUdTKSB7XG4gICAgICBpZiAodGhpcy5yZWdFeHBzLnNvbWUoKHJlZ0V4cCkgPT4gaGFzRmxhZyhyZWdFeHAsIGZsYWcpKSkge1xuICAgICAgICB0aGlzLmZpbmFsRmxhZ3MuYWRkKGZsYWcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkU2VtYW50aWNGbGFncygpOiB2b2lkIHtcbiAgICBjb25zdCBTRU1BTlRJQ19GTEFHUyA9IFsnaScsICdtJywgJ3MnLCAneSddO1xuICAgIGZvciAoY29uc3QgZmxhZyBvZiBTRU1BTlRJQ19GTEFHUykge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkUGlja0ZsYWcoZmxhZykpIHtcbiAgICAgICAgdGhpcy5maW5hbEZsYWdzLmFkZChmbGFnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFVuaWNvZGVGbGFncygpOiB2b2lkIHtcbiAgICBjb25zdCBjb3VudFUgPSB0aGlzLnJlZ0V4cHMuZmlsdGVyKChyZWdFeHApID0+IGhhc0ZsYWcocmVnRXhwLCAndScpKS5sZW5ndGg7XG4gICAgY29uc3QgY291bnRWID0gdGhpcy5yZWdFeHBzLmZpbHRlcigocmVnRXhwKSA9PiBoYXNGbGFnKHJlZ0V4cCwgJ3YnKSkubGVuZ3RoO1xuXG4gICAgbGV0IHNob3VsZFVzZVVGbGFnOiBib29sZWFuO1xuICAgIGxldCBzaG91bGRVc2VWRmxhZzogYm9vbGVhbjtcblxuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSB2OCBjb3VudHMgdGhlIGltcGxpY2l0IGRlZmF1bHQgYnJhbmNoIGFzIHVuY292ZXJlZCBldmVuIHdoZW4gYWxsIGVudW0gY2FzZXMgYXJlIGhhbmRsZWQuICovXG4gICAgc3dpdGNoICh0aGlzLnN0cmF0ZWd5KSB7XG4gICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgY2FzZSBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneS5JbnRlcnNlY3Q6XG4gICAgICAgIHNob3VsZFVzZVVGbGFnID0gY291bnRVID09PSB0aGlzLnJlZ0V4cHMubGVuZ3RoO1xuICAgICAgICBzaG91bGRVc2VWRmxhZyA9IGNvdW50ViA9PT0gdGhpcy5yZWdFeHBzLmxlbmd0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5LlRocm93OiB7XG4gICAgICAgIGNvbnN0IGFsbFUgPSBjb3VudFUgPT09IHRoaXMucmVnRXhwcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG5vbmVVID0gY291bnRVID09PSAwO1xuICAgICAgICBjb25zdCBhbGxWID0gY291bnRWID09PSB0aGlzLnJlZ0V4cHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBub25lViA9IGNvdW50ViA9PT0gMDtcblxuICAgICAgICBpZiAoIShhbGxVIHx8IG5vbmVVKSB8fCAhKGFsbFYgfHwgbm9uZVYpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25mbGljdGluZyBcXCd1XFwnL1xcJ3ZcXCcgZmxhZ3MgYWNyb3NzIHBhdHRlcm5zLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2hvdWxkVXNlVUZsYWcgPSBhbGxVO1xuICAgICAgICBzaG91bGRVc2VWRmxhZyA9IGFsbFY7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneS5VbmlvbjpcbiAgICAgICAgc2hvdWxkVXNlVUZsYWcgPSBjb3VudFUgPiAwO1xuICAgICAgICBzaG91bGRVc2VWRmxhZyA9IGNvdW50ViA+IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEV4aGF1c3RpdmUgc3dpdGNoIGd1YXJkLiAqL1xuICAgICAgICBhc3NlcnROZXZlcih0aGlzLnN0cmF0ZWd5KTtcbiAgICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVXNlVUZsYWcgJiYgc2hvdWxkVXNlVkZsYWcpIHtcbiAgICAgIGFzc2VydCh0aGlzLnN0cmF0ZWd5ICE9PSBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneS5UaHJvdywgJ0Nhbm5vdCBjb21iaW5lIGJvdGggXFwndVxcJy9cXCd2XFwnIGZsYWdzIGluIG9uZSBSZWdFeHAuJyk7XG4gICAgICBzaG91bGRVc2VVRmxhZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRVc2VVRmxhZykge1xuICAgICAgdGhpcy5maW5hbEZsYWdzLmFkZCgndScpO1xuICAgIH1cbiAgICBpZiAoc2hvdWxkVXNlVkZsYWcpIHtcbiAgICAgIHRoaXMuZmluYWxGbGFncy5hZGQoJ3YnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFBpY2tGbGFnKGZsYWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5yZWdFeHBzLmZpbHRlcigocmVnRXhwKSA9PiBoYXNGbGFnKHJlZ0V4cCwgZmxhZykpLmxlbmd0aDtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gdjggY291bnRzIHRoZSBpbXBsaWNpdCBkZWZhdWx0IGJyYW5jaCBhcyB1bmNvdmVyZWQgZXZlbiB3aGVuIGFsbCBlbnVtIGNhc2VzIGFyZSBoYW5kbGVkLiAqL1xuICAgIHN3aXRjaCAodGhpcy5zdHJhdGVneSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIGNhc2UgUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kuSW50ZXJzZWN0OlxuICAgICAgICByZXR1cm4gY291bnQgPT09IHRoaXMucmVnRXhwcy5sZW5ndGg7XG4gICAgICBjYXNlIFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5LlRocm93OlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kuVW5pb246XG4gICAgICAgIHJldHVybiBjb3VudCA+IDA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gRXhoYXVzdGl2ZSBzd2l0Y2ggZ3VhcmQuICovXG4gICAgICAgIGFzc2VydE5ldmVyKHRoaXMuc3RyYXRlZ3kpO1xuICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFNhbWUgPSBjb3VudCA9PT0gMCB8fCBjb3VudCA9PT0gdGhpcy5yZWdFeHBzLmxlbmd0aDtcbiAgICBpZiAoIWFsbFNhbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29uZmxpY3RpbmcgZmxhZyAnJHtmbGFnfScgYWNyb3NzIHBhdHRlcm5zLmApO1xuICAgIH1cbiAgICByZXR1cm4gY291bnQgPT09IHRoaXMucmVnRXhwcy5sZW5ndGg7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21iaW5lIG11bHRpcGxlIHJlZ2V4ZXMgaW50byBvbmUgYWx0ZXJuYXRpb24sIGhhbmRsaW5nIGZsYWdzLlxuICpcbiAqIEBwYXJhbSByZWdFeHBzIC0gVGhlIHJlZ2V4ZXMgdG8gY29tYmluZS5cbiAqIEBwYXJhbSBzdHJhdGVneSAtIFRoZSBzdHJhdGVneSB0byB1c2Ugd2hlbiBtZXJnaW5nIGZsYWdzIChkZWZhdWx0OiBgUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kuVGhyb3dgKS5cbiAqIEByZXR1cm5zIFRoZSBjb21iaW5lZCByZWdleC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uZU9mKFxuICByZWdFeHBzOiBSZWdFeHBbXSxcbiAgc3RyYXRlZ3k6IFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5ID0gUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kuVGhyb3dcbik6IFJlZ0V4cCB7XG4gIGlmIChyZWdFeHBzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBBTFdBWVNfTUFUQ0hfUkVHX0VYUDtcbiAgfVxuXG4gIGlmIChyZWdFeHBzLmxlbmd0aCA9PT0gMSAmJiByZWdFeHBzWzBdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcmVnRXhwc1swXTtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZSA9IHJlZ0V4cHMubWFwKChyZWdFeHApID0+IGAoPzoke3JlZ0V4cC5zb3VyY2V9KWApLmpvaW4oJ3wnKTtcbiAgY29uc3QgZmxhZ3MgPSBuZXcgUmVnRXhwRmxhZ01lcmdlcihyZWdFeHBzLCBzdHJhdGVneSkuY29tcHV0ZUZsYWdzKCk7XG4gIHJldHVybiBuZXcgUmVnRXhwKHNvdXJjZSwgZmxhZ3MpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFLQSxJQUFLLG1DQUFMLGtCQUFLQSxzQ0FBTDtBQUlMLEVBQUFBLGtDQUFBLGVBQVk7QUFJWixFQUFBQSxrQ0FBQSxXQUFRO0FBSVIsRUFBQUEsa0NBQUEsV0FBUTtBQVpFLFNBQUFBO0FBQUEsR0FBQTtBQXFCTCxTQUFTLGFBQWEsS0FBcUI7QUFFaEQsU0FBTyxJQUFJLFdBQVcsdUJBQXVCLE1BQU07QUFDckQ7QUFvQk8sU0FBUyx1QkFBdUIsT0FBeUIsV0FBMkI7QUFDekYsU0FBTyxrQkFBa0Isc0JBQXNCLE9BQU8sU0FBUyxDQUFDO0FBQ2xFO0FBZ0JPLFNBQVMsc0JBQXNCLE9BQXlCLFdBQWtDO0FBQy9GLFNBQU8sTUFBTSxTQUFTLFNBQVMsS0FBSztBQUN0QztBQVFPLFNBQVMsY0FBYyxLQUFzQjtBQUNsRCxNQUFJO0FBQ0YsUUFBSSxPQUFPLEdBQUc7QUFDZCxXQUFPO0FBQUEsRUFDVCxRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUVBLFNBQVMsUUFBUSxRQUFnQixNQUF1QjtBQUN0RCxTQUFPLE9BQU8sTUFBTSxTQUFTLElBQUk7QUFDbkM7QUFLTyxNQUFNLHVCQUF1QjtBQUs3QixNQUFNLHNCQUFzQjtBQVNuQyxNQUFNLGlCQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU2QsWUFBNkIsU0FBb0MsVUFBNEM7QUFBaEY7QUFBb0M7QUFBQSxFQUE2QztBQUFBLEVBQWpGO0FBQUEsRUFBb0M7QUFBQSxFQVJ2RCxhQUFhLG9CQUFJLElBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFldkMsZUFBdUI7QUFDNUIsU0FBSyxpQkFBaUI7QUFDdEIsU0FBSyxnQkFBZ0I7QUFDckIsU0FBSyxhQUFhO0FBQ2xCLFdBQU8sQ0FBQyxHQUFHLEtBQUssVUFBVSxFQUFFLEtBQUssRUFBRTtBQUFBLEVBQ3JDO0FBQUEsRUFFUSxlQUFxQjtBQUMzQixVQUFNLGFBQWEsQ0FBQyxLQUFLLEdBQUc7QUFDNUIsZUFBVyxRQUFRLFlBQVk7QUFDN0IsVUFBSSxLQUFLLFFBQVEsS0FBSyxDQUFDLFdBQVcsUUFBUSxRQUFRLElBQUksQ0FBQyxHQUFHO0FBQ3hELGFBQUssV0FBVyxJQUFJLElBQUk7QUFBQSxNQUMxQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFUSxtQkFBeUI7QUFDL0IsVUFBTSxpQkFBaUIsQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQzFDLGVBQVcsUUFBUSxnQkFBZ0I7QUFDakMsVUFBSSxLQUFLLGVBQWUsSUFBSSxHQUFHO0FBQzdCLGFBQUssV0FBVyxJQUFJLElBQUk7QUFBQSxNQUMxQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFUSxrQkFBd0I7QUFDOUIsVUFBTSxTQUFTLEtBQUssUUFBUSxPQUFPLENBQUMsV0FBVyxRQUFRLFFBQVEsR0FBRyxDQUFDLEVBQUU7QUFDckUsVUFBTSxTQUFTLEtBQUssUUFBUSxPQUFPLENBQUMsV0FBVyxRQUFRLFFBQVEsR0FBRyxDQUFDLEVBQUU7QUFFckUsUUFBSTtBQUNKLFFBQUk7QUFHSixZQUFRLEtBQUssVUFBVTtBQUFBO0FBQUEsTUFFckIsS0FBSztBQUNILHlCQUFpQixXQUFXLEtBQUssUUFBUTtBQUN6Qyx5QkFBaUIsV0FBVyxLQUFLLFFBQVE7QUFDekM7QUFBQSxNQUNGLEtBQUsscUJBQXdDO0FBQzNDLGNBQU0sT0FBTyxXQUFXLEtBQUssUUFBUTtBQUNyQyxjQUFNLFFBQVEsV0FBVztBQUN6QixjQUFNLE9BQU8sV0FBVyxLQUFLLFFBQVE7QUFDckMsY0FBTSxRQUFRLFdBQVc7QUFFekIsWUFBSSxFQUFFLFFBQVEsVUFBVSxFQUFFLFFBQVEsUUFBUTtBQUN4QyxnQkFBTSxJQUFJLE1BQU0sNENBQWdEO0FBQUEsUUFDbEU7QUFFQSx5QkFBaUI7QUFDakIseUJBQWlCO0FBQ2pCO0FBQUEsTUFDRjtBQUFBLE1BQ0EsS0FBSztBQUNILHlCQUFpQixTQUFTO0FBQzFCLHlCQUFpQixTQUFTO0FBQzFCO0FBQUEsTUFDRjtBQUVFLG9CQUFZLEtBQUssUUFBUTtBQUFBLElBRTdCO0FBRUEsUUFBSSxrQkFBa0IsZ0JBQWdCO0FBQ3BDLGFBQU8sS0FBSyxhQUFhLHFCQUF3QyxrREFBc0Q7QUFDdkgsdUJBQWlCO0FBQUEsSUFDbkI7QUFFQSxRQUFJLGdCQUFnQjtBQUNsQixXQUFLLFdBQVcsSUFBSSxHQUFHO0FBQUEsSUFDekI7QUFDQSxRQUFJLGdCQUFnQjtBQUNsQixXQUFLLFdBQVcsSUFBSSxHQUFHO0FBQUEsSUFDekI7QUFBQSxFQUNGO0FBQUEsRUFFUSxlQUFlLE1BQXVCO0FBQzVDLFVBQU0sUUFBUSxLQUFLLFFBQVEsT0FBTyxDQUFDLFdBQVcsUUFBUSxRQUFRLElBQUksQ0FBQyxFQUFFO0FBRXJFLFlBQVEsS0FBSyxVQUFVO0FBQUE7QUFBQSxNQUVyQixLQUFLO0FBQ0gsZUFBTyxVQUFVLEtBQUssUUFBUTtBQUFBLE1BQ2hDLEtBQUs7QUFDSDtBQUFBLE1BQ0YsS0FBSztBQUNILGVBQU8sUUFBUTtBQUFBLE1BQ2pCO0FBRUUsb0JBQVksS0FBSyxRQUFRO0FBQUEsSUFFN0I7QUFFQSxVQUFNLFVBQVUsVUFBVSxLQUFLLFVBQVUsS0FBSyxRQUFRO0FBQ3RELFFBQUksQ0FBQyxTQUFTO0FBQ1osWUFBTSxJQUFJLE1BQU0scUJBQXFCLElBQUksb0JBQW9CO0FBQUEsSUFDL0Q7QUFDQSxXQUFPLFVBQVUsS0FBSyxRQUFRO0FBQUEsRUFDaEM7QUFDRjtBQVNPLFNBQVMsTUFDZCxTQUNBLFdBQTZDLHFCQUNyQztBQUNSLE1BQUksUUFBUSxXQUFXLEdBQUc7QUFDeEIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLFFBQVEsV0FBVyxLQUFLLFFBQVEsQ0FBQyxNQUFNLFFBQVc7QUFDcEQsV0FBTyxRQUFRLENBQUM7QUFBQSxFQUNsQjtBQUVBLFFBQU0sU0FBUyxRQUFRLElBQUksQ0FBQyxXQUFXLE1BQU0sT0FBTyxNQUFNLEdBQUcsRUFBRSxLQUFLLEdBQUc7QUFDdkUsUUFBTSxRQUFRLElBQUksaUJBQWlCLFNBQVMsUUFBUSxFQUFFLGFBQWE7QUFDbkUsU0FBTyxJQUFJLE9BQU8sUUFBUSxLQUFLO0FBQ2pDOyIsCiAgIm5hbWVzIjogWyJSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneSJdCn0K