obsidian-dev-utils 97.0.0 → 98.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +1 -1
  3. package/dist/integration-test-plugin/main.js +624 -483
  4. package/dist/lib/cjs/__merged.cjs +14 -9
  5. package/dist/lib/cjs/__merged.d.cts +2 -1
  6. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  7. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +38 -38
  8. package/dist/lib/cjs/obsidian/demo-vault-naming.cjs +167 -0
  9. package/dist/lib/cjs/obsidian/demo-vault-naming.d.cts +54 -0
  10. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +11 -5
  11. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +10 -8
  12. package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +9 -9
  13. package/dist/lib/cjs/obsidian/desktop-trusted-input.d.cts +23 -4
  14. package/dist/lib/cjs/obsidian/index.cjs +10 -1
  15. package/dist/lib/cjs/obsidian/index.d.cts +3 -0
  16. package/dist/lib/cjs/obsidian/mobile-trusted-input.cjs +195 -0
  17. package/dist/lib/cjs/obsidian/mobile-trusted-input.d.cts +93 -0
  18. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +2 -1
  19. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +4 -0
  20. package/dist/lib/cjs/obsidian/resource-lock.cjs +122 -122
  21. package/dist/lib/cjs/obsidian/trusted-input.cjs +206 -0
  22. package/dist/lib/cjs/obsidian/trusted-input.d.cts +126 -0
  23. package/dist/lib/cjs/script-utils/build.cjs +30 -6
  24. package/dist/lib/cjs/script-utils/build.d.cts +5 -0
  25. package/dist/lib/cjs/script-utils/demo-vault.cjs +26 -6
  26. package/dist/lib/cjs/script-utils/demo-vault.d.cts +12 -8
  27. package/dist/lib/cjs/script-utils/exec.cjs +1 -1
  28. package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -2
  29. package/dist/lib/cjs/script-utils/index.cjs +4 -1
  30. package/dist/lib/cjs/script-utils/index.d.cts +1 -0
  31. package/dist/lib/cjs/script-utils/linters/cspell.cjs +3 -3
  32. package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +39 -1
  33. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +16 -1
  34. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +5 -0
  35. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.cjs +254 -0
  36. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.d.cts +54 -0
  37. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.cjs +217 -0
  38. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.d.cts +141 -0
  39. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.cjs +214 -0
  40. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.d.cts +32 -0
  41. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.cjs +215 -0
  42. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.d.cts +30 -0
  43. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.cjs +318 -0
  44. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.d.cts +45 -0
  45. package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +9 -1
  46. package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -2
  47. package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +4 -4
  48. package/dist/lib/cjs/script-utils/npm-run.cjs +4 -3
  49. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +10 -1
  50. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +37 -1
  51. package/dist/lib/cjs/script-utils/package-manager.cjs +287 -0
  52. package/dist/lib/cjs/script-utils/package-manager.d.cts +77 -0
  53. package/dist/lib/cjs/script-utils/version.cjs +21 -9
  54. package/dist/lib/esm/__merged.d.mts +2 -1
  55. package/dist/lib/esm/__merged.mjs +16 -10
  56. package/dist/lib/esm/generated-during-build.mjs +1 -1
  57. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +38 -38
  58. package/dist/lib/esm/obsidian/demo-vault-naming.d.mts +54 -0
  59. package/dist/lib/esm/obsidian/demo-vault-naming.mjs +61 -0
  60. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +10 -8
  61. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +14 -5
  62. package/dist/lib/esm/obsidian/desktop-trusted-input.d.mts +23 -4
  63. package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +9 -9
  64. package/dist/lib/esm/obsidian/index.d.mts +3 -0
  65. package/dist/lib/esm/obsidian/index.mjs +7 -1
  66. package/dist/lib/esm/obsidian/mobile-trusted-input.d.mts +93 -0
  67. package/dist/lib/esm/obsidian/mobile-trusted-input.mjs +84 -0
  68. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +4 -0
  69. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +2 -1
  70. package/dist/lib/esm/obsidian/resource-lock.mjs +122 -122
  71. package/dist/lib/esm/obsidian/trusted-input.d.mts +126 -0
  72. package/dist/lib/esm/obsidian/trusted-input.mjs +85 -0
  73. package/dist/lib/esm/script-utils/build.d.mts +5 -0
  74. package/dist/lib/esm/script-utils/build.mjs +30 -6
  75. package/dist/lib/esm/script-utils/demo-vault.d.mts +12 -8
  76. package/dist/lib/esm/script-utils/demo-vault.mjs +29 -6
  77. package/dist/lib/esm/script-utils/exec.mjs +1 -1
  78. package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -2
  79. package/dist/lib/esm/script-utils/index.d.mts +1 -0
  80. package/dist/lib/esm/script-utils/index.mjs +3 -1
  81. package/dist/lib/esm/script-utils/linters/cspell.mjs +3 -3
  82. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +39 -1
  83. package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +5 -0
  84. package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +11 -1
  85. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.d.mts +54 -0
  86. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.mjs +148 -0
  87. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.d.mts +141 -0
  88. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.mjs +92 -0
  89. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.d.mts +32 -0
  90. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.mjs +111 -0
  91. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.d.mts +30 -0
  92. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.mjs +112 -0
  93. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.d.mts +45 -0
  94. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.mjs +217 -0
  95. package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +9 -1
  96. package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -2
  97. package/dist/lib/esm/script-utils/linters/markdownlint.mjs +4 -4
  98. package/dist/lib/esm/script-utils/npm-run.mjs +4 -3
  99. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +37 -1
  100. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +10 -1
  101. package/dist/lib/esm/script-utils/package-manager.d.mts +77 -0
  102. package/dist/lib/esm/script-utils/package-manager.mjs +173 -0
  103. package/dist/lib/esm/script-utils/version.mjs +21 -9
  104. package/obsidian/demo-vault-naming/package.json +6 -0
  105. package/obsidian/mobile-trusted-input/package.json +6 -0
  106. package/obsidian/trusted-input/package.json +6 -0
  107. package/package.json +19 -17
  108. package/script-utils/linters/eslint-rules/manifest-description/package.json +6 -0
  109. package/script-utils/linters/eslint-rules/manifest-helpers/package.json +6 -0
  110. package/script-utils/linters/eslint-rules/manifest-id/package.json +6 -0
  111. package/script-utils/linters/eslint-rules/manifest-name/package.json +6 -0
  112. package/script-utils/linters/eslint-rules/manifest-schema/package.json +6 -0
  113. package/script-utils/package-manager/package.json +6 -0
@@ -214,43 +214,6 @@ var import_component_ex = require('./component-ex.cjs');
214
214
  var import_monkey_around_component = require('./monkey-around-component.cjs');
215
215
  var import_vault2 = require('../vault.cjs');
216
216
  const PATCH_TOKEN = /* @__PURE__ */ Symbol.for("renameDeleteHandler");
217
- class SettingsManager {
218
- renameDeleteHandlersMap;
219
- constructor() {
220
- this.renameDeleteHandlersMap = (0, import_obsidian_dev_utils_state.getObsidianDevUtilsState)("renameDeleteHandlersMap", /* @__PURE__ */ new Map()).value;
221
- }
222
- getSettings() {
223
- const settingsBuilders = [...this.renameDeleteHandlersMap.values()].reverse();
224
- const settings = {};
225
- settings.isNote = (path) => (0, import_file_system.isNote)(path);
226
- settings.isPathIgnored = () => false;
227
- for (const settingsBuilder of settingsBuilders) {
228
- const newSettings = settingsBuilder();
229
- settings.shouldDeleteConflictingAttachments ||= newSettings.shouldDeleteConflictingAttachments ?? false;
230
- if (newSettings.emptyFolderBehavior) {
231
- settings.emptyFolderBehavior ??= newSettings.emptyFolderBehavior;
232
- }
233
- settings.shouldHandleDeletions ||= newSettings.shouldHandleDeletions ?? false;
234
- settings.shouldHandleRenames ||= newSettings.shouldHandleRenames ?? false;
235
- settings.shouldRenameAttachmentFiles ||= newSettings.shouldRenameAttachmentFiles ?? false;
236
- settings.shouldRenameAttachmentFolder ||= newSettings.shouldRenameAttachmentFolder ?? false;
237
- settings.shouldUpdateFileNameAliases ||= newSettings.shouldUpdateFileNameAliases ?? false;
238
- if (newSettings.getRescuePath) {
239
- settings.getRescuePath ??= newSettings.getRescuePath;
240
- }
241
- const isPathIgnored = settings.isPathIgnored;
242
- settings.isPathIgnored = (path) => isPathIgnored(path) || (newSettings.isPathIgnored?.(path) ?? false);
243
- const currentIsNote = settings.isNote;
244
- settings.isNote = (path) => currentIsNote(path) && (newSettings.isNote?.(path) ?? true);
245
- }
246
- settings.emptyFolderBehavior ??= import_vault.EmptyFolderBehavior.Keep;
247
- return settings;
248
- }
249
- isNoteEx(path) {
250
- const settings = this.getSettings();
251
- return settings.isNote?.(path) ?? false;
252
- }
253
- }
254
217
  class DeleteHandler {
255
218
  abortSignal;
256
219
  app;
@@ -1104,6 +1067,43 @@ class RenameMap {
1104
1067
  }
1105
1068
  }
1106
1069
  }
1070
+ class SettingsManager {
1071
+ renameDeleteHandlersMap;
1072
+ constructor() {
1073
+ this.renameDeleteHandlersMap = (0, import_obsidian_dev_utils_state.getObsidianDevUtilsState)("renameDeleteHandlersMap", /* @__PURE__ */ new Map()).value;
1074
+ }
1075
+ getSettings() {
1076
+ const settingsBuilders = [...this.renameDeleteHandlersMap.values()].reverse();
1077
+ const settings = {};
1078
+ settings.isNote = (path) => (0, import_file_system.isNote)(path);
1079
+ settings.isPathIgnored = () => false;
1080
+ for (const settingsBuilder of settingsBuilders) {
1081
+ const newSettings = settingsBuilder();
1082
+ settings.shouldDeleteConflictingAttachments ||= newSettings.shouldDeleteConflictingAttachments ?? false;
1083
+ if (newSettings.emptyFolderBehavior) {
1084
+ settings.emptyFolderBehavior ??= newSettings.emptyFolderBehavior;
1085
+ }
1086
+ settings.shouldHandleDeletions ||= newSettings.shouldHandleDeletions ?? false;
1087
+ settings.shouldHandleRenames ||= newSettings.shouldHandleRenames ?? false;
1088
+ settings.shouldRenameAttachmentFiles ||= newSettings.shouldRenameAttachmentFiles ?? false;
1089
+ settings.shouldRenameAttachmentFolder ||= newSettings.shouldRenameAttachmentFolder ?? false;
1090
+ settings.shouldUpdateFileNameAliases ||= newSettings.shouldUpdateFileNameAliases ?? false;
1091
+ if (newSettings.getRescuePath) {
1092
+ settings.getRescuePath ??= newSettings.getRescuePath;
1093
+ }
1094
+ const isPathIgnored = settings.isPathIgnored;
1095
+ settings.isPathIgnored = (path) => isPathIgnored(path) || (newSettings.isPathIgnored?.(path) ?? false);
1096
+ const currentIsNote = settings.isNote;
1097
+ settings.isNote = (path) => currentIsNote(path) && (newSettings.isNote?.(path) ?? true);
1098
+ }
1099
+ settings.emptyFolderBehavior ??= import_vault.EmptyFolderBehavior.Keep;
1100
+ return settings;
1101
+ }
1102
+ isNoteEx(path) {
1103
+ const settings = this.getSettings();
1104
+ return settings.isNote?.(path) ?? false;
1105
+ }
1106
+ }
1107
1107
  class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
1108
1108
  /**
1109
1109
  * The abort signal component whose signal cancels in-flight rename operations.
@@ -1341,4 +1341,4 @@ function getLinkIdentityKey(link) {
1341
1341
  EmptyFolderBehavior,
1342
1342
  RenameDeleteHandlerComponent
1343
1343
  });
1344
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGUsXG4gIFRGb2xkZXJcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gRGVlcGx5IGNvdXBsZWQgdG8gT2JzaWRpYW4gcnVudGltZTsgcmVxdWlyZXMgcnVubmluZyB2YXVsdCBmb3IgbWVhbmluZ2Z1bCB0ZXN0aW5nLiAqL1xuaW1wb3J0IHtcbiAgZ2V0RGF0YUFkYXB0ZXJFeCxcbiAgSW50ZXJuYWxQbHVnaW5OYW1lXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7IHQgfSBmcm9tICdpMThuZXh0JztcbmltcG9ydCB7XG4gIEZpbGVNYW5hZ2VyLFxuICBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfSBmcm9tICcuLi9saW5rLXVwZGF0ZS1wcm9ncmVzcy50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIFVwZGF0ZUxpbmtQYXJhbXMsXG4gIFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zXG59IGZyb20gJy4uL2xpbmsudHMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZUxvY2tDb21wb25lbnQgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQgdHlwZSB7IEFib3J0U2lnbmFsQ29tcG9uZW50IH0gZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IGZpbHRlckluUGxhY2UgfSBmcm9tICcuLi8uLi9hcnJheS50cyc7XG5pbXBvcnQgeyBnZXRMaWJEZWJ1Z2dlciB9IGZyb20gJy4uLy4uL2RlYnVnLnRzJztcbmltcG9ydCB7IHByaW50RXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvci50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi8uLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi8uLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRQYXRoQ29udGV4dCxcbiAgZ2V0QXR0YWNobWVudEZpbGVQYXRoLFxuICBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCxcbiAgaGFzT3duQXR0YWNobWVudEZvbGRlclxufSBmcm9tICcuLi9hdHRhY2htZW50LXBhdGgudHMnO1xuaW1wb3J0IHsgZ2V0Q2FudmFzUmVmZXJlbmNlcyB9IGZyb20gJy4uL2NhbnZhcy50cyc7XG5pbXBvcnQgeyB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzIH0gZnJvbSAnLi4vZmlsZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7XG4gIENBTlZBU19GSUxFX0VYVEVOU0lPTixcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzRmlsZSxcbiAgaXNGb2xkZXIsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgZWRpdExpbmtzLFxuICBleHRyYWN0TGlua0ZpbGUsXG4gIHVwZGF0ZUxpbmssXG4gIHVwZGF0ZUxpbmtzSW5GaWxlXG59IGZyb20gJy4uL2xpbmsudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aCxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUsXG4gIGdldExpbmtzLFxuICByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZSxcbiAgcmVnaXN0ZXJGaWxlc1xufSBmcm9tICcuLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBhZGRUb1F1ZXVlIH0gZnJvbSAnLi4vcXVldWUudHMnO1xuaW1wb3J0IHsgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yIH0gZnJvbSAnLi4vcmVzb3VyY2UtbG9jay50cyc7XG5pbXBvcnQgeyBkZWxldGVJZk5vdFVzZWQgfSBmcm9tICcuLi92YXVsdC1kZWxldGUudHMnO1xuaW1wb3J0IHtcbiAgY2xlYW51cEVtcHR5Rm9sZGVycyxcbiAgRW1wdHlGb2xkZXJCZWhhdmlvcixcbiAgZ2V0U2FmZVJlbmFtZVBhdGgsXG4gIGlzQ2hpbGRPclNlbGYsXG4gIHJlbmFtZVNhZmUsXG4gIHRyYXNoU2FmZVxufSBmcm9tICcuLi92YXVsdC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7XG4gIGhhc1BhdGNoVG9rZW4sXG4gIE1vbmtleUFyb3VuZENvbXBvbmVudFxufSBmcm9tICcuL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzLmdldFJlc2N1ZVBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFJlc2N1ZVBhdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIGF0dGFjaG1lbnQgdGhhdCBpcyBhYm91dCB0byBiZSBzdHJhbmRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGF0dGFjaG1lbnRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRocyBvZiB0aGUgbm90ZXMgdGhhdCBzdGlsbCByZWZlcmVuY2UgdGhlIGF0dGFjaG1lbnQgb25jZSB0aGUgZGVsZXRpb24gaXMgZG9uZS4gTmV2ZXIgZW1wdHkuXG4gICAqL1xuICByZWFkb25seSBzdXJ2aXZpbmdOb3RlUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNldHRpbmdzIGZvciB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG9mIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIgd2hlbiBkZWxldGluZyBlbXB0eSBmb2xkZXJzLlxuICAgKi9cbiAgZW1wdHlGb2xkZXJCZWhhdmlvcjogRW1wdHlGb2xkZXJCZWhhdmlvcjtcblxuICAvKipcbiAgICogV2hlcmUgdG8gbW92ZSBhbiBhdHRhY2htZW50IHRoYXQgYSBkZWxldGlvbiB3b3VsZCBvdGhlcndpc2Ugc3RyYW5kIFx1MjAxNCBvbmUgdGhhdCBzdXJ2aXZlcyBiZWNhdXNlIGFub3RoZXJcbiAgICogbm90ZSBzdGlsbCByZWZlcmVuY2VzIGl0LCBidXQgaXMgbGVmdCBzaXR0aW5nIGluIGEgZm9sZGVyIHdob3NlIG93bmluZyBub3RlIGlzIGdvbmUuXG4gICAqXG4gICAqIERlY2lkaW5nIHRoZSBkZXN0aW5hdGlvbiBpcyB0aGUgcGx1Z2luJ3MgYXR0YWNobWVudC1wYXRoIHBvbGljeSwgd2hpY2ggaXMgd2h5IHRoZSBoYW5kbGVyIGFza3MgcmF0aGVyXG4gICAqIHRoYW4gZ3Vlc3Nlcy4gUmV0dXJuaW5nIGBudWxsYCBcdTIwMTQgb3Igbm90IGltcGxlbWVudGluZyB0aGlzIGF0IGFsbCBcdTIwMTQga2VlcHMgdGhlIGF0dGFjaG1lbnQgd2hlcmUgaXQgaXMsXG4gICAqIHdoaWNoIGlzIHRoZSBiZWhhdmlvciBldmVyeSBjb25zdW1lciBoYWQgYmVmb3JlIHRoaXMgbWVtYmVyIGV4aXN0ZWQuXG4gICAqL1xuICBnZXRSZXNjdWVQYXRoPyhwYXJhbXM6IEdldFJlc2N1ZVBhdGhQYXJhbXMpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYXRoIGlzIGEgbm90ZS5cbiAgICovXG4gIGlzTm90ZShwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGlnbm9yZSB0aGUgcGF0aC5cbiAgICovXG4gIGlzUGF0aElnbm9yZWQocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkZWxldGUgY29uZmxpY3RpbmcgYXR0YWNobWVudHMuXG4gICAqL1xuICBzaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhhbmRsZSBkZWxldGlvbnMuXG4gICAqL1xuICBzaG91bGRIYW5kbGVEZWxldGlvbnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIHJlbmFtZXMuXG4gICAqL1xuICBzaG91bGRIYW5kbGVSZW5hbWVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZpbGVzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZm9sZGVyIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXNlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgSGFuZGxlZFJlbmFtZUtleSB7XG4gIG5ld1BhdGg6IHN0cmluZztcbiAgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJydXB0ZWRSZW5hbWUge1xuICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIG9sZFBhdGg6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJlbmFtZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzOiBIYW5kbGVkUmVuYW1lcztcbiAgcmVhZG9ubHkgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcD86IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+O1xuICByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZU1hcENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lTWFwSW5pdEJhY2tsaW5rc01hcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29tYmluZWQgYmFja2xpbmtzIG1hcCwga2V5ZWQgYnkgbmV3IGJhY2tsaW5rIHBhdGgsIGFjY3VtdWxhdGluZyBsaW5rLUpTT04gdG8gc291cmNlLXBhdGggbWFwcGluZ3MuXG4gICAqL1xuICByZWFkb25seSBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHdob3NlIGJhY2tsaW5rcyBhcmUgYmVpbmcgcmVjb3JkZWQuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBiYWNrbGlua3MgbWFwIGZvciBhIHNpbmdsZSBmaWxlLCBrZXllZCBieSBiYWNrbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgc2luZ2xlQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG59XG5cbmNvbnN0IFBBVENIX1RPS0VOID0gU3ltYm9sLmZvcigncmVuYW1lRGVsZXRlSGFuZGxlcicpO1xuXG5pbnRlcmZhY2UgRGVsZXRlSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRGVsZXRlUHJvdGVjdGlvblBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuICBzaG91bGRJbnZva2VIYW5kbGVyKHRoaXM6IHZvaWQpOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudFBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcmVzY3VlUGFyYW1zOiBSZXNjdWVTdGlsbFVzZWRGaWxlUGFyYW1zO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBmaWxlTWFuYWdlcjogRmlsZU1hbmFnZXI7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgTWV0YWRhdGFEZWxldGVkSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcmVhZG9ubHkgcHJldmlvdXNDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsQ29tcG9uZW50OiBBYm9ydFNpZ25hbENvbXBvbmVudDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPzogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHNldHRpbmdzQnVpbGRlcih0aGlzOiB2b2lkKTogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xufVxuXG5jbGFzcyBTZXR0aW5nc01hbmFnZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA6IE1hcDxzdHJpbmcsICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPj47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoJ3JlbmFtZURlbGV0ZUhhbmRsZXJzTWFwJywgbmV3IE1hcDxzdHJpbmcsICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPj4oKSkudmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2V0dGluZ3MoKTogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+IHtcbiAgICBjb25zdCBzZXR0aW5nc0J1aWxkZXJzID0gWy4uLnRoaXMucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAudmFsdWVzKCldLnJldmVyc2UoKTtcblxuICAgIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4gPSB7fTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1pbW1lZGlhdGUtbXV0YXRpb24gLS0gRm9sZGluZyB0aGVzZSBpbnRvIHRoZSBvYmplY3QgbGl0ZXJhbCBrZWVwcyB0aGVtIG9wdGlvbmFsIHVuZGVyIGBQYXJ0aWFsPD5gLCBsb3NpbmcgdGhlIG5hcnJvd2luZyB0aGF0IG1ha2VzIHRoZW0gY2FsbGFibGUgYmVsb3cgd2l0aG91dCBhIG51bGxpc2ggY2hlY2suXG4gICAgc2V0dGluZ3MuaXNOb3RlID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gaXNOb3RlKHBhdGgpO1xuICAgIHNldHRpbmdzLmlzUGF0aElnbm9yZWQgPSAoKTogYm9vbGVhbiA9PiBmYWxzZTtcblxuICAgIGZvciAoY29uc3Qgc2V0dGluZ3NCdWlsZGVyIG9mIHNldHRpbmdzQnVpbGRlcnMpIHtcbiAgICAgIGNvbnN0IG5ld1NldHRpbmdzID0gc2V0dGluZ3NCdWlsZGVyKCk7XG4gICAgICBzZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzID8/IGZhbHNlO1xuICAgICAgaWYgKG5ld1NldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IpIHtcbiAgICAgICAgc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/Pz0gbmV3U2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvcjtcbiAgICAgIH1cbiAgICAgIHNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zID8/IGZhbHNlO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyA/PyBmYWxzZTtcbiAgICAgIHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzID8/IGZhbHNlO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciA/PyBmYWxzZTtcbiAgICAgIHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzID8/IGZhbHNlO1xuICAgICAgaWYgKG5ld1NldHRpbmdzLmdldFJlc2N1ZVBhdGgpIHtcbiAgICAgICAgLypcbiAgICAgICAgICogRmlyc3QgcGx1Z2luIHRvIGFuc3dlciBvd25zIHRoZSBkZXN0aW5hdGlvbiwgbWlycm9yaW5nIGBlbXB0eUZvbGRlckJlaGF2aW9yYC4gTGVmdCBgdW5kZWZpbmVkYFxuICAgICAgICAgKiB3aGVuIG5vYm9keSBpbXBsZW1lbnRzIGl0LCBzbyB0aGUgcmVzY3VlIG5ldmVyIHJ1bnMgZm9yIGNvbnN1bWVycyB0aGF0IGRpZCBub3Qgb3B0IGluLlxuICAgICAgICAgKi9cbiAgICAgICAgc2V0dGluZ3MuZ2V0UmVzY3VlUGF0aCA/Pz0gbmV3U2V0dGluZ3MuZ2V0UmVzY3VlUGF0aDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzUGF0aElnbm9yZWQgPSBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkO1xuICAgICAgc2V0dGluZ3MuaXNQYXRoSWdub3JlZCA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGlzUGF0aElnbm9yZWQocGF0aCkgfHwgKG5ld1NldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihwYXRoKSA/PyBmYWxzZSk7XG4gICAgICBjb25zdCBjdXJyZW50SXNOb3RlID0gc2V0dGluZ3MuaXNOb3RlO1xuICAgICAgc2V0dGluZ3MuaXNOb3RlID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gY3VycmVudElzTm90ZShwYXRoKSAmJiAobmV3U2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gdHJ1ZSk7XG4gICAgfVxuXG4gICAgc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/Pz0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwO1xuICAgIHJldHVybiBzZXR0aW5ncztcbiAgfVxuXG4gIHB1YmxpYyBpc05vdGVFeChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG4gIH1cbn1cblxuY2xhc3MgRGVsZXRlSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBEZWxldGVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5maWxlID0gcGFyYW1zLmZpbGU7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBwYXJhbXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgSGFuZGxlIERlbGV0ZSAke3RoaXMuZmlsZS5wYXRofWApO1xuICAgIGlmICghaXNOb3RlKHRoaXMuZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHModGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShcbiAgICAgICAgYFNraXBwaW5nIGRlbGV0ZSBoYW5kbGVyIG9mICR7dGhpcy5maWxlLnBhdGh9IGFzIHRoZSBmaWxlIHN0aWxsIGV4aXN0cyBvbiBkaXNrIChpbmRleC1vbmx5IHJlbW92YWwsIG5vdCBhIHJlYWwgZGVsZXRpb24pLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/Lih0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBTa2lwcGluZyBkZWxldGUgaGFuZGxlciBvZiAke3RoaXMuZmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KFtkaXJuYW1lKHRoaXMuZmlsZS5wYXRoKV0pO1xuXG4gICAgaWYgKHNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmdldCh0aGlzLmZpbGUucGF0aCk7XG4gICAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmRlbGV0ZSh0aGlzLmZpbGUucGF0aCk7XG4gICAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgY29uc3QgbGlua3MgPSBnZXRMaW5rcyh7IGNhY2hlIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHsgYXBwOiB0aGlzLmFwcCwgbGluaywgc291cmNlUGF0aE9yRmlsZTogdGhpcy5maWxlLnBhdGggfSk7XG4gICAgICAgICAgaWYgKCFhdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KGF0dGFjaG1lbnRGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJlbnRGb2xkZXJQYXRocy5hZGQoYXR0YWNobWVudEZpbGUucGFyZW50Py5wYXRoID8/ICcnKTtcbiAgICAgICAgICBhd2FpdCBkZWxldGVJZk5vdFVzZWQoe1xuICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgIGRlbGV0ZWROb3RlUGF0aDogdGhpcy5maWxlLnBhdGgsXG4gICAgICAgICAgICBwYXRoT3JGaWxlOiBhdHRhY2htZW50RmlsZSxcbiAgICAgICAgICAgIHJlc2N1ZVN0aWxsVXNlZEZpbGU6IHRoaXMucmVzY3VlU3RpbGxVc2VkRmlsZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzOiBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yICE9PSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJlbnRGb2xkZXJQYXRocy5kZWxldGUoJycpO1xuICAgIGF3YWl0IGNsZWFudXBFbXB0eUZvbGRlcnMoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGVtcHR5Rm9sZGVyQmVoYXZpb3I6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwLFxuICAgICAgZm9sZGVyUGF0aHM6IFsuLi5wYXJlbnRGb2xkZXJQYXRoc11cbiAgICB9KTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5EZWxldGVOb3RlLFxuICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMuZmlsZS5wYXRoXG4gICAgfSk7XG4gICAgY29uc3QgYXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZvbGRlcjogYXR0YWNobWVudEZvbGRlclBhdGggfSk7XG5cbiAgICBpZiAoIWF0dGFjaG1lbnRGb2xkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhYXdhaXQgaGFzT3duQXR0YWNobWVudEZvbGRlcih7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5EZWxldGVOb3RlLFxuICAgICAgICBwYXRoOiB0aGlzLmZpbGUucGF0aFxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBhd2FpdCBkZWxldGVJZk5vdFVzZWQoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGRlbGV0ZWROb3RlUGF0aDogdGhpcy5maWxlLnBhdGgsXG4gICAgICBwYXRoT3JGaWxlOiBhdHRhY2htZW50Rm9sZGVyLFxuICAgICAgcmVzY3VlU3RpbGxVc2VkRmlsZTogdGhpcy5yZXNjdWVTdGlsbFVzZWRGaWxlLmJpbmQodGhpcyksXG4gICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcFxuICAgIH0pO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzY3VlU3RpbGxVc2VkRmlsZShyZXNjdWVQYXJhbXM6IFJlc2N1ZVN0aWxsVXNlZEZpbGVQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgIHJlc2N1ZVBhcmFtcyxcbiAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEtlZXBzIGEgZm9sZGVyIGRlbGV0aW9uIGZyb20gZGVzdHJveWluZyBhbiBhdHRhY2htZW50IGEgbm90ZSBvdXRzaWRlIHRoYXQgZm9sZGVyIHN0aWxsIHJlZmVyZW5jZXMuXG4gKlxuICogRGVsZXRpbmcgYSBOT1RFIGlzIGFscmVhZHkgc2FmZToge0BsaW5rIGRlbGV0ZUlmTm90VXNlZH0gZGlzY291bnRzIHRoZSBkZWxldGVkIG5vdGUncyBvd24gYmFja2xpbmtzLCBzZWVzXG4gKiBhbm90aGVyIG5vdGUgc3RpbGwgcmVmZXJlbmNpbmcgdGhlIGF0dGFjaG1lbnQsIGFuZCBrZWVwcyBpdC4gRGVsZXRpbmcgYSBGT0xERVIgd2FzIG5vdCwgYmVjYXVzZVxuICoge0BsaW5rIFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnR9IG9ubHkgbGlzdGVucyAoYHZhdWx0Lm9uKCdkZWxldGUnKWApIGFuZCBieSB0aGUgdGltZSBhIGZvbGRlciBkZWxldGlvblxuICogaXMgcmVwb3J0ZWQgaXRzIGNoaWxkcmVuIGFyZSBhbHJlYWR5IGdvbmUuIE5vdGhpbmcgcmVhY3RpdmUgY2FuIGhlbHAsIHNvIHRoaXMgY29tcG9uZW50IGludGVyY2VwdHMgdGhlXG4gKiBkZWxldGlvbiBwcmltaXRpdmVzIGluc3RlYWQ6IGBGaWxlTWFuYWdlci50cmFzaEZpbGVgICh3aGF0IHRoZSBmaWxlLWV4cGxvcmVyIERlbGV0ZSBmbG93IHJlYWNoZXMgdGhyb3VnaFxuICogYHByb21wdEZvckRlbGV0aW9uYCkgcGx1cyB0aGUgcmF3IGBWYXVsdC5kZWxldGVgIC8gYFZhdWx0LnRyYXNoYCBhIHBsdWdpbiBtYXkgY2FsbCBkaXJlY3RseS5cbiAqXG4gKiBBIGZvbGRlciBkZWxldGlvbiBpcyBzY2FubmVkIGZpcnN0LiBXaGVuIG5vdGhpbmcgaW5zaWRlIGl0IGlzIHN0aWxsIHJlZmVyZW5jZWQgZnJvbSBvdXRzaWRlIFx1MjAxNCB0aGVcbiAqIG92ZXJ3aGVsbWluZyBtYWpvcml0eSBvZiBkZWxldGlvbnMgXHUyMDE0IHRoZSBvcmlnaW5hbCBydW5zIHVudG91Y2hlZCwgc28gdGhlIG5hdGl2ZSBiZWhhdmlvciBpcyBwcmVzZXJ2ZWRcbiAqIGV4YWN0bHkuIE9ubHkgd2hlbiBzb21ldGhpbmcgd291bGQgYmUgbG9zdCBkb2VzIHRoaXMgdGFrZSBvdmVyLCByZXBsYXlpbmcgdGhlIGRlbGV0aW9uIHRocm91Z2hcbiAqIHtAbGluayBkZWxldGVJZk5vdFVzZWR9OiBldmVyeXRoaW5nIGVsc2UgaW4gdGhlIGZvbGRlciBnb2VzLCB0aGUgc3RpbGwtcmVmZXJlbmNlZCBhdHRhY2htZW50cyBhbmQgdGhlXG4gKiBmb2xkZXJzIGhvbGRpbmcgdGhlbSBzdGF5LCBhbmQgdGhlIGBhdHRhY2htZW50SXNTdGlsbFVzZWRgIG5vdGljZSBmaXJlcywgbWlycm9yaW5nIHRoZSBub3RlIGNhc2UuXG4gKlxuICogRmlsZXMgYXJlIG5ldmVyIGludGVyY2VwdGVkIFx1MjAxNCBkZWxldGluZyBhIGZpbGUgaXMgdGhlIHVzZXIgbmFtaW5nIHRoYXQgZmlsZSBleHBsaWNpdGx5LlxuICovXG5jbGFzcyBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnQgZXh0ZW5kcyBNb25rZXlBcm91bmRDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSb290cyBvZiB0aGUgZm9sZGVyIGRlbGV0aW9ucyBjdXJyZW50bHkgYmVpbmcgcmVwbGF5ZWQuIFRoZSByZXBsYXkgZGVsZXRlcyB0aHJvdWdoIHRoZSBVTlBBVENIRURcbiAgICogb3JpZ2luYWwsIHNvIGl0IGNhbm5vdCByZS1lbnRlciB0aGlzIGNvbXBvbmVudCBkaXJlY3RseSBcdTIwMTQgYnV0IGBGaWxlTWFuYWdlci50cmFzaEZpbGVgIGl0c2VsZiBjYWxscyBkb3duXG4gICAqIGludG8gYFZhdWx0LnRyYXNoYCAvIGBWYXVsdC5kZWxldGVgLCB3aGljaCBhcmUgcGF0Y2hlZCB0b28sIGFuZCByZS1zY2FubmluZyBhIHN1YnRyZWUgYWxyZWFkeSBiZWluZ1xuICAgKiB3YWxrZWQgaXMgcHVyZSB3YXN0ZS4gU2NvcGVkIGJ5IHBhdGggcmF0aGVyIHRoYW4gYnkgYSBmbGFnIHNvIHRoYXQgYW4gdW5yZWxhdGVkIGZvbGRlciBkZWxldGlvblxuICAgKiBpbnRlcmxlYXZpbmcgb24gYW4gYGF3YWl0YCBpcyBzdGlsbCBwcm90ZWN0ZWQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcGxheWVkRm9sZGVyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZEludm9rZUhhbmRsZXI6ICgpID0+IGJvb2xlYW47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVsZXRlUHJvdGVjdGlvblBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICAgIHRoaXMuc2hvdWxkSW52b2tlSGFuZGxlciA9IHBhcmFtcy5zaG91bGRJbnZva2VIYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8RmlsZU1hbmFnZXIsICd0cmFzaEZpbGUnPih7XG4gICAgICAkb2JqZWN0OiBGaWxlTWFuYWdlci5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2hGaWxlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0sIG9yaWdpbmFsTWV0aG9kQm91bmQgfSkgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGlvbihmaWxlLCBmYWxsYmFjaywgYXN5bmMgKGFic3RyYWN0RmlsZSkgPT4ge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsTWV0aG9kQm91bmQoYWJzdHJhY3RGaWxlKTtcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdkZWxldGUnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnZGVsZXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgZm9yY2VdLCBvcmlnaW5hbE1ldGhvZEJvdW5kIH0pID0+XG4gICAgICAgIHRoaXMuaGFuZGxlRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGFzeW5jIChhYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbE1ldGhvZEJvdW5kKGFic3RyYWN0RmlsZSwgZm9yY2UpO1xuICAgICAgICB9KVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3RyYXNoJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgc3lzdGVtXSwgb3JpZ2luYWxNZXRob2RCb3VuZCB9KSA9PlxuICAgICAgICB0aGlzLmhhbmRsZURlbGV0aW9uKGZpbGUsIGZhbGxiYWNrLCBhc3luYyAoYWJzdHJhY3RGaWxlKSA9PiB7XG4gICAgICAgICAgYXdhaXQgb3JpZ2luYWxNZXRob2RCb3VuZChhYnN0cmFjdEZpbGUsIHN5c3RlbSk7XG4gICAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdHMgdGhlIHBhdGhzIG9mIGV2ZXJ5IG5vdGUgaW5zaWRlIHRoZSBmb2xkZXIuIFRoZXkgYXJlIHRoZSBsaW5rIHNvdXJjZXMgdGhhdCBkaXNhcHBlYXIgYWxvbmcgd2l0aFxuICAgKiB0aGUgZm9sZGVyLCBzbyB0aGVpciBiYWNrbGlua3MgbXVzdCBub3Qga2VlcCBhbiBhdHRhY2htZW50IGFsaXZlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgYWdncmVnYXRlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXIgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIFRoZSBwYXRocyBvZiB0aGUgbm90ZXMgaW5zaWRlIHRoZSBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGNvbGxlY3REZWxldGVkTm90ZVBhdGhzKGZvbGRlcjogVEZvbGRlciwgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPik6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBkZWxldGVkTm90ZVBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKGZvbGRlciwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKGNoaWxkKSAmJiAoc2V0dGluZ3MuaXNOb3RlPy4oY2hpbGQucGF0aCkgPz8gZmFsc2UpKSB7XG4gICAgICAgIGRlbGV0ZWROb3RlUGF0aHMuYWRkKGNoaWxkLnBhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkZWxldGVkTm90ZVBhdGhzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBhdHRhY2htZW50cyBpbnNpZGUgdGhlIGZvbGRlciB0aGF0IGEgbm90ZSBvdXRzaWRlIGl0IHN0aWxsIHJlZmVyZW5jZXMsIGFuZCB3b3VsZCB0aGVyZWZvcmUgYmVcbiAgICogZGVzdHJveWVkIGJ5IGRlbGV0aW5nIHRoZSBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBmb2xkZXIgLSBUaGUgZm9sZGVyIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSBkZWxldGVkTm90ZVBhdGhzIC0gVGhlIHBhdGhzIG9mIHRoZSBub3RlcyB0aGF0IGRpc2FwcGVhciBhbG9uZyB3aXRoIHRoZSBmb2xkZXIuXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBhZ2dyZWdhdGVkIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHBhdGhzIG9mIHRoZSBhdHRhY2htZW50cyB0aGF0IG11c3Qgc3Vydml2ZSB0aGUgZGVsZXRpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmRTdGlsbFVzZWRBdHRhY2htZW50UGF0aHMoXG4gICAgZm9sZGVyOiBURm9sZGVyLFxuICAgIGRlbGV0ZWROb3RlUGF0aHM6IFNldDxzdHJpbmc+LFxuICAgIHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz5cbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGNhbmRpZGF0ZUZpbGVzOiBURmlsZVtdID0gW107XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKGZvbGRlciwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKGNoaWxkKSAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKGNoaWxkLnBhdGgpID8/IGZhbHNlKSkge1xuICAgICAgICBjYW5kaWRhdGVGaWxlcy5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlRmlsZSBvZiBjYW5kaWRhdGVGaWxlcykge1xuICAgICAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBjYW5kaWRhdGVGaWxlIH0pO1xuICAgICAgZm9yIChjb25zdCBkZWxldGVkTm90ZVBhdGggb2YgZGVsZXRlZE5vdGVQYXRocykge1xuICAgICAgICBiYWNrbGlua3MuY2xlYXIoZGVsZXRlZE5vdGVQYXRoKTtcbiAgICAgIH1cbiAgICAgIGlmIChiYWNrbGlua3MuY291bnQoKSAhPT0gMCkge1xuICAgICAgICBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMucHVzaChjYW5kaWRhdGVGaWxlLnBhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHM7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVsZXRpb24gbmVlZHMgcHJvdGVjdGluZyBhbmQsIGlmIHNvLCByZXBsYWNlcyBpdCB3aXRoIGEgcHJvdGVjdGVkIHJlcGxheS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gZmFsbGJhY2sgLSBJbnZva2VzIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QgdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0gZGVsZXRlQWJzdHJhY3RGaWxlIC0gRGVsZXRlcyBhIHNpbmdsZSBhYnN0cmFjdCBmaWxlIHRocm91Z2ggdGhlIGludGVyY2VwdGVkIG1ldGhvZCdzIHVucGF0Y2hlZCBvcmlnaW5hbC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkZWxldGlvbiBpcyBkb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVEZWxldGlvbihcbiAgICBmaWxlOiBUQWJzdHJhY3RGaWxlLFxuICAgIGZhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGRlbGV0ZUFic3RyYWN0RmlsZTogKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSkgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkQ29uc2lkZXJGb2xkZXIoZmlsZSkpIHtcbiAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlcGxheUZvbGRlckRlbGV0aW9uKGZpbGUsIGZhbGxiYWNrLCBkZWxldGVBYnN0cmFjdEZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIGZvbGRlciB3aGlsZSBrZWVwaW5nIHdoYXRldmVyIGluc2lkZSBpdCBpcyBzdGlsbCByZWZlcmVuY2VkIGZyb20gb3V0c2lkZS5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgYmVpbmcgZGVsZXRlZC5cbiAgICogQHBhcmFtIGZhbGxiYWNrIC0gSW52b2tlcyB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kIHVuY2hhbmdlZC5cbiAgICogQHBhcmFtIGRlbGV0ZUFic3RyYWN0RmlsZSAtIERlbGV0ZXMgYSBzaW5nbGUgYWJzdHJhY3QgZmlsZSB0aHJvdWdoIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QncyB1bnBhdGNoZWQgb3JpZ2luYWwuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVsZXRpb24gaXMgZG9uZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVwbGF5Rm9sZGVyRGVsZXRpb24oXG4gICAgZm9sZGVyOiBURm9sZGVyLFxuICAgIGZhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGRlbGV0ZUFic3RyYWN0RmlsZTogKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSkgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgY29uc3QgZGVsZXRlZE5vdGVQYXRocyA9IHRoaXMuY29sbGVjdERlbGV0ZWROb3RlUGF0aHMoZm9sZGVyLCBzZXR0aW5ncyk7XG4gICAgY29uc3Qgc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzID0gYXdhaXQgdGhpcy5maW5kU3RpbGxVc2VkQXR0YWNobWVudFBhdGhzKGZvbGRlciwgZGVsZXRlZE5vdGVQYXRocywgc2V0dGluZ3MpO1xuXG4gICAgaWYgKHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRlbGV0ZVByb3RlY3Rpb24nKShgTm90aGluZyB0byBwcm90ZWN0IGluICR7Zm9sZGVyLnBhdGh9OyBkZWxldGluZyBpdCBhcyB1c3VhbC5gKTtcbiAgICAgIGF3YWl0IGZhbGxiYWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGVsZXRlUHJvdGVjdGlvbicpKFxuICAgICAgYFByb3RlY3RpbmcgJHtzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMubGVuZ3RoLnRvU3RyaW5nKCl9IHN0aWxsLXJlZmVyZW5jZWQgYXR0YWNobWVudChzKSBmcm9tIHRoZSBkZWxldGlvbiBvZiAke2ZvbGRlci5wYXRofTogJHt0b0pzb24oc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzKX1gXG4gICAgKTtcblxuICAgIHRoaXMucmVwbGF5ZWRGb2xkZXJQYXRocy5hZGQoZm9sZGVyLnBhdGgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkZWxldGVJZk5vdFVzZWQoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBkZWxldGVBYnN0cmFjdEZpbGUsXG4gICAgICAgIGRlbGV0ZWROb3RlUGF0aHM6IFsuLi5kZWxldGVkTm90ZVBhdGhzXSxcbiAgICAgICAgcGF0aE9yRmlsZTogZm9sZGVyLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICByZXNjdWVTdGlsbFVzZWRGaWxlOiB0aGlzLnJlc2N1ZVN0aWxsVXNlZEZpbGUuYmluZCh0aGlzKSxcbiAgICAgICAgLypcbiAgICAgICAgICogVGhlIHVzZXIgbmFtZWQgVEhJUyBmb2xkZXIsIHNvIGl0IGdvZXMgZXZlbiB1bmRlciBgRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwYCBcdTIwMTQgdGhhdCBzZXR0aW5nXG4gICAgICAgICAqIGdvdmVybnMgZm9sZGVycyBlbXB0aWVkIGluY2lkZW50YWxseSwgbm90IHRoZSBvbmUgZXhwbGljaXRseSBkZWxldGVkLiBgZGVsZXRlSWZOb3RVc2VkYCBzdGlsbFxuICAgICAgICAgKiByZWZ1c2VzIHRvIHJlbW92ZSBhbnkgZm9sZGVyIHdob3NlIGNoaWxkIGhhZCB0byBiZSBrZXB0LCB3aGljaCBpcyB0aGUgcHJvdGVjdGlvbiB3YW50ZWQgaGVyZS5cbiAgICAgICAgICovXG4gICAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogdHJ1ZSxcbiAgICAgICAgLypcbiAgICAgICAgICogQSBub3RlIHRoYXQgb3RoZXJzIGxpbmsgdG8gaXMgZGVsZXRlZCBhcyBub3JtYWw7IE9ic2lkaWFuIGxlYXZlcyB0aGUgZGFuZ2xpbmcgbGluay4gUHJvdGVjdGluZ1xuICAgICAgICAgKiBub3RlcyB0b28gd291bGQgbWFrZSBkZWxldGluZyBhIGZvbGRlciBvZiBsaW5rZWQtdG8gbm90ZXMgaW1wb3NzaWJsZS5cbiAgICAgICAgICovXG4gICAgICAgIHNob3VsZFByb3RlY3RJZlN0aWxsVXNlZDogKGNhbmRpZGF0ZUZpbGUpID0+ICEoc2V0dGluZ3MuaXNOb3RlPy4oY2FuZGlkYXRlRmlsZS5wYXRoKSA/PyBmYWxzZSlcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMuZGVsZXRlKGZvbGRlci5wYXRoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2N1ZVN0aWxsVXNlZEZpbGUocmVzY3VlUGFyYW1zOiBSZXNjdWVTdGlsbFVzZWRGaWxlUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICByZXNjdWVQYXJhbXMsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBkZWxldGlvbiBpcyBhIGZvbGRlciBkZWxldGlvbiB0aGlzIGhhbmRsZXIgaXMgcmVzcG9uc2libGUgZm9yIHByb3RlY3RpbmcuXG4gICAqXG4gICAqIEV2ZXJ5IGNoZWNrIGhlcmUgaXMgc3luY2hyb25vdXMgYW5kIGNoZWFwLCBzbyBhIGZpbGUgZGVsZXRpb24gXHUyMDE0IHRoZSBvdmVyd2hlbG1pbmcgbWFqb3JpdHkgXHUyMDE0IGNvc3RzIG9uZVxuICAgKiB7QGxpbmsgaXNGb2xkZXJ9IGNhbGwgYW5kIHJlYWNoZXMgdGhlIG9yaWdpbmFsIHVudG91Y2hlZC5cbiAgICpcbiAgICogQHBhcmFtIGZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSBiZWluZyBkZWxldGVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZGVsZXRpb24gc2hvdWxkIGJlIHNjYW5uZWQgYmVmb3JlIGl0IHJ1bnMuXG4gICAqL1xuICBwcml2YXRlIHNob3VsZENvbnNpZGVyRm9sZGVyKGZpbGU6IFRBYnN0cmFjdEZpbGUpOiBmaWxlIGlzIFRGb2xkZXIge1xuICAgIGlmICghaXNGb2xkZXIoZmlsZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2hvdWxkSW52b2tlSGFuZGxlcigpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihmaWxlLnBhdGgpID8/IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZXBsYXllZEZvbGRlclBhdGggb2YgdGhpcy5yZXBsYXllZEZvbGRlclBhdGhzKSB7XG4gICAgICBpZiAoaXNDaGlsZE9yU2VsZih7IGFwcDogdGhpcy5hcHAsIGNoaWxkUGF0aE9yRmlsZTogZmlsZS5wYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiByZXBsYXllZEZvbGRlclBhdGggfSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmNsYXNzIEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnQgZXh0ZW5kcyBNb25rZXlBcm91bmRDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmZpbGVNYW5hZ2VyID0gcGFyYW1zLmZpbGVNYW5hZ2VyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAgICRvYmplY3Q6IHRoaXMuZmlsZU1hbmFnZXIsXG4gICAgICBtZXRob2ROYW1lOiAncnVuQXN5bmNMaW5rVXBkYXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHtcbiAgICAgICAgZmFsbGJhY2ssXG4gICAgICAgIG9yaWdpbmFsQXJndW1lbnRzOiBbbGlua1VwZGF0ZXNIYW5kbGVyXSxcbiAgICAgICAgb3JpZ2luYWxNZXRob2QsXG4gICAgICAgIG9yaWdpbmFsTWV0aG9kQm91bmRcbiAgICAgIH0pID0+IHtcbiAgICAgICAgaWYgKGhhc1BhdGNoVG9rZW4ob3JpZ2luYWxNZXRob2QsIFBBVENIX1RPS0VOKSkge1xuICAgICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyID0gKGxpbmtVcGRhdGVzKSA9PiB0aGlzLndyYXBMaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXMsIGxpbmtVcGRhdGVzSGFuZGxlcik7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZEJvdW5kKG5ld0hhbmRsZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cmFwTGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzOiBMaW5rVXBkYXRlW10sIGxpbmtVcGRhdGVzSGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGlzUmVuYW1lQ2FsbGVkID0gZmFsc2U7XG4gICAgbGV0IGlzRm9yZWlnbkxvY2tlZFJlbmFtZUNhbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGV2ZW50UmVmID0gdGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIChmaWxlLCBvbGRQYXRoKSA9PiB7XG4gICAgICBpc1JlbmFtZUNhbGxlZCA9IHRydWU7XG4gICAgICAvKlxuICAgICAgICogQSByZW5hbWUgcGVyZm9ybWVkIGluc2lkZSBhIGZvcmVpZ24gcGx1Z2luJ3MgaW4tZmxpZ2h0IGxvY2tlZCB0cmFuc2FjdGlvbiAod2hpY2ggbG9ja3MgdGhlXG4gICAgICAgKiBhZmZlY3RlZCBmb2xkZXIgc3VidHJlZSwgZS5nLiBBZHZhbmNlZCBOb3RlIENvbXBvc2VyJ3MgZm9sZGVyIG1lcmdlKSBpcyBvd25lZCBieSB0aGF0XG4gICAgICAgKiB0cmFuc2FjdGlvbiwgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGl0cyBvd24gbGluayBjb25zaXN0ZW5jeS4gVGhpcyBoYW5kbGVyIGRlbGliZXJhdGVseSBkb2VzXG4gICAgICAgKiBOT1QgcmV3cml0ZSBsaW5rcyBmb3IgaXQsIHNvIHN1cHByZXNzaW5nIE9ic2lkaWFuJ3MgbmF0aXZlIGxpbmsgdXBkYXRlIGJlbG93IHdvdWxkIGxlYXZlIHRoZVxuICAgICAgICogbGlua3MgZGFuZ2xpbmcuIExldCB0aGUgbmF0aXZlIHVwZGF0ZSBwcm9jZWVkIHVudG91Y2hlZC4gU2VlXG4gICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tYWR2YW5jZWQtbm90ZS1jb21wb3Nlci9pc3N1ZXMvMTQ2LlxuICAgICAgICovXG4gICAgICBpZiAoaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBmaWxlLnBhdGgpIHx8IGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgb2xkUGF0aCkpIHtcbiAgICAgICAgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5hcHAudmF1bHQub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICB9XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IG1pZ2h0IGNoYW5nZWQgaW4gYHJlbmFtZWAgZXZlbnQgaGFuZGxlci4gRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICAgIGlmICghaXNSZW5hbWVDYWxsZWQgfHwgIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgfHwgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsdGVySW5QbGFjZShcbiAgICAgIGxpbmtVcGRhdGVzLFxuICAgICAgKGxpbmtVcGRhdGUpID0+IHtcbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aCkpIHtcbiAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpydW5Bc3luY0xpbmtVcGRhdGUnKShcbiAgICAgICAgICAgIGBSb2xsIGJhY2sgdG8gZGVmYXVsdCBsaW5rIHVwZGF0ZSBvZiBzb3VyY2UgZmlsZSAke2xpbmtVcGRhdGUuc291cmNlRmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5wYXRoKSkge1xuICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnJ1bkFzeW5jTGlua1VwZGF0ZScpKFxuICAgICAgICAgICAgYFJvbGwgYmFjayB0byBkZWZhdWx0IGxpbmsgdXBkYXRlIG9mIHJlc29sdmVkIGZpbGUgJHtsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcHAucGx1Z2lucy5nZXRQbHVnaW4oJ2JhY2tsaW5rLWNhY2hlJykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlua1VwZGF0ZS5zb3VyY2VGaWxlLmV4dGVuc2lvbiA9PT0gQ0FOVkFTX0ZJTEVfRVhURU5TSU9OKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUuZXh0ZW5zaW9uID09PSBDQU5WQVNfRklMRV9FWFRFTlNJT04pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmNsYXNzIEhhbmRsZWRSZW5hbWVzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXAgPSBuZXcgTWFwPHN0cmluZywgSGFuZGxlZFJlbmFtZUtleT4oKTtcblxuICBwdWJsaWMgYWRkKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCksIHsgbmV3UGF0aCwgb2xkUGF0aCB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5kZWxldGUodGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSk7XG4gIH1cblxuICBwdWJsaWMgaGFzKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmhhcyh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpKTtcbiAgfVxuXG4gIHB1YmxpYyBrZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SGFuZGxlZFJlbmFtZUtleT4ge1xuICAgIHJldHVybiB0aGlzLm1hcC52YWx1ZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUga2V5VG9TdHJpbmcob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YDtcbiAgfVxufVxuXG5jbGFzcyBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJldmlvdXNDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IE1ldGFkYXRhRGVsZXRlZEhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBwYXJhbXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA7XG4gICAgdGhpcy5maWxlID0gcGFyYW1zLmZpbGU7XG4gICAgdGhpcy5wcmV2aW91c0NhY2hlID0gcGFyYW1zLnByZXZpb3VzQ2FjaGU7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4odGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVNZXRhZGF0YURlbGV0ZWQnKShgU2tpcHBpbmcgbWV0YWRhdGEgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXJrZG93bkZpbGUodGhpcy5maWxlKSAmJiB0aGlzLnByZXZpb3VzQ2FjaGUpIHtcbiAgICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuc2V0KHRoaXMuZmlsZS5wYXRoLCB0aGlzLnByZXZpb3VzQ2FjaGUpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBSZW5hbWVIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXM6IEhhbmRsZWRSZW5hbWVzO1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcDogTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCA9IHBhcmFtcy5yZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gICAgdGhpcy5oYW5kbGVkUmVuYW1lcyA9IHBhcmFtcy5oYW5kbGVkUmVuYW1lcztcbiAgICB0aGlzLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCA/PyBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCA9IHBhcmFtcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXA7XG4gICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA9IHBhcmFtcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcbiAgICB0aGlzLm5ld1BhdGggPSBwYXJhbXMubmV3UGF0aDtcbiAgICB0aGlzLm9sZENhY2hlID0gcGFyYW1zLm9sZENhY2hlO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCA9IHBhcmFtcy5vbGRQYXRoQmFja2xpbmtzTWFwO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm9sZFBhdGggPT09IHRoaXMubmV3UGF0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAvKlxuICAgICAqIFRoZSByZW5hbWUgdGhhdCB0cmlnZ2VyZWQgdGhpcyBoYW5kbGVyIGlzIHZlcnkgbGlrZWx5IHN0aWxsIGluc2lkZSBPYnNpZGlhbidzIG93blxuICAgICAqIGBGaWxlTWFuYWdlci5ydW5Bc3luY0xpbmtVcGRhdGVgIGN5Y2xlLCB3aGljaCBpcyBhYm91dCB0byBkZWNpZGUgXHUyMDE0IHN5bmNocm9ub3VzbHkgXHUyMDE0IHdoaWNoIGxpbmtzIHRvXG4gICAgICogcmV3cml0ZSwgYnkgcmUtcmVzb2x2aW5nIGVhY2ggb25lLiBFdmVyeXRoaW5nIGJlbG93IHRlbXBvcmFyaWx5IHJlZ2lzdGVycyBhIHBoYW50b20gZmlsZSBhdCB0aGVcbiAgICAgKiBvbGQgcGF0aCAoYHJlZ2lzdGVyRmlsZXNgLCBkaXJlY3RseSBoZXJlIGFuZCBpbnNpZGUgYFJlbmFtZU1hcGApIGFuZCBob2xkcyBpdCBhY3Jvc3MgYW4gYGF3YWl0YDtcbiAgICAgKiBzZWVuIG1pZC1kZWNpc2lvbiwgdGhhdCBwaGFudG9tIG1ha2VzIHRoZSBvbGQgcGF0aCBzdGlsbCByZXNvbHZlLCBzbyBPYnNpZGlhbiBjb25jbHVkZXMgbm90aGluZ1xuICAgICAqIGNoYW5nZWQgYW5kIHJld3JpdGVzIG5vdGhpbmcuIFN0YW5kaW5nIGludmFyaWFudDogbmV2ZXIgdG91Y2ggdGhlIHZhdWx0IGluZGV4IHdoaWxlIE9ic2lkaWFuIGlzXG4gICAgICogbWlkLWRlY2lzaW9uLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWN1c3RvbS1hdHRhY2htZW50LWxvY2F0aW9uL2lzc3Vlcy80Ny5cbiAgICAgKi9cbiAgICBhd2FpdCB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzKHRoaXMuYXBwKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBhd2FpdCB0aGlzLmNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgLy8gVGhlIHJlZnJlc2hlZCBiYWNrbGlua3MgZmVlZCBgb2xkUGF0aEJhY2tsaW5rc01hcGAsIHdoaWNoIG9ubHkgdGhlIGxpbmstcmV3cml0ZSBzdGVwcyBiZWxvdyByZWFkLCBhbmQgdGhvc2UgYXJlIGdhdGVkIG9uIHRoZSBzYW1lIGZsYWcuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCkuc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoTGlua3MoKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVDYXNlQ29sbGlzaW9uKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBjb25zdCBwbHVnaW5Ob3RpY2VDb21wb25lbnQgPSB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAgIGNvbnN0IHJlbmFtZWRGaWxlUGF0aHMgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoJ3JlbmFtZWRGaWxlUGF0aHMnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG4gICAgY29uc3QgcmVuYW1lZExpbmtzID0gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZW5hbWVkTGlua1BhdGhzJywgbmV3IFNldDxzdHJpbmc+KCkpLnZhbHVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbmFtZU1hcCA9IG5ldyBSZW5hbWVNYXAoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHJlbmFtZU1hcC5maWxsKCk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgICAgY29uc3QgY29tYmluZWRCYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcblxuICAgICAgLy8gQmFja2xpbmtzIGFyZSBvbmx5IGNvbnN1bWVkIGJ5IHRoZSBsaW5rLXJld3JpdGUgc3RlcHMgYmVsb3csIHdoaWNoIGFyZSBnYXRlZCBvblxuICAgICAgLy8gYHNob3VsZEhhbmRsZVJlbmFtZXNgLiBTa2lwIGdhdGhlcmluZyB0aGVtIChhIGJhY2tsaW5rIGZldGNoIHBlciBhdHRhY2htZW50KSBvbiBhIG1vdmUtb25seSByZW5hbWUuXG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgICByZW5hbWVNYXAuaW5pdE9yaWdpbmFsTGlua3NNYXAoY29tYmluZWRCYWNrbGlua3NNYXApO1xuICAgICAgICByZW5hbWVNYXAuaW5pdEJhY2tsaW5rc01hcCh7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgcGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgYXR0YWNobWVudE9sZFBhdGggb2YgcmVuYW1lTWFwLmtleXMoKSkge1xuICAgICAgICAgIGlmIChhdHRhY2htZW50T2xkUGF0aCA9PT0gdGhpcy5vbGRQYXRoKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRPbGRQYXRoIH0pO1xuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwID0gYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3MuZGF0YTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgcmVuYW1lTWFwLmluaXRCYWNrbGlua3NNYXAoe1xuICAgICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgICBwYXRoOiBhdHRhY2htZW50T2xkUGF0aCxcbiAgICAgICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3NNYXBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGhdIG9mIHJlbmFtZU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKG9sZEF0dGFjaG1lbnRQYXRoICE9PSB0aGlzLm9sZFBhdGgpIHtcbiAgICAgICAgICBjb25zdCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoID0gYXdhaXQgdGhpcy5yZW5hbWVIYW5kbGVkKG9sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIHJlbmFtZU1hcC5zZXQob2xkQXR0YWNobWVudFBhdGgsIGZpeGVkTmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudFBhdGgpKSB7XG4gICAgICAgICAgcGFyZW50Rm9sZGVyUGF0aHMuYWRkKGRpcm5hbWUob2xkQXR0YWNobWVudFBhdGgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBjbGVhbnVwRW1wdHlGb2xkZXJzKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZW1wdHlGb2xkZXJCZWhhdmlvcjogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICAgIGZvbGRlclBhdGhzOiBbLi4ucGFyZW50Rm9sZGVyUGF0aHNdXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgLypcbiAgICAgICAqIFRoZSBhdHRhY2htZW50IG1vdmUgYWJvdmUgcnVucyByZWdhcmRsZXNzIG9mIGBzaG91bGRIYW5kbGVSZW5hbWVzYCAodGhhdCBpcyB0aGUgcG9pbnQgb2YgZGVjb3VwbGluZ1xuICAgICAgICogXCJNb3ZlIGF0dGFjaG1lbnRzIHdpdGggbm90ZVwiIGZyb20gXCJVcGRhdGUgbGlua3NcIikuIFRoZSByZW1haW5pbmcgc3RlcHMgb25seSByZXdyaXRlIGxpbmtzLCBzbyBza2lwXG4gICAgICAgKiB0aGVtIHdoZW4gbGluayB1cGRhdGVzIGFyZSBkaXNhYmxlZDsgdGhlIGBmaW5hbGx5YCBibG9jayBiZWxvdyBzdGlsbCBydW5zLlxuICAgICAgICovXG4gICAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYWNrbGlua0VudHJpZXMgPSBbLi4uY29tYmluZWRCYWNrbGlua3NNYXAsIC4uLnRoaXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcF07XG4gICAgICBsZXQgcHJvY2Vzc2VkQmFja2xpbmtGaWxlcyA9IDA7XG4gICAgICBmb3IgKGNvbnN0IFtuZXdCYWNrbGlua1BhdGgsIGxpbmtLZXlUb1BhdGhNYXBdIG9mIGJhY2tsaW5rRW50cmllcykge1xuICAgICAgICBsZXQgbGlua0luZGV4ID0gMDtcbiAgICAgICAgYXdhaXQgZWRpdExpbmtzKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGxpbmtDb252ZXJ0ZXI6IChsaW5rKSA9PiB7XG4gICAgICAgICAgICBsaW5rSW5kZXgrKztcbiAgICAgICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRQYXRoID0gbGlua0tleVRvUGF0aE1hcC5nZXQoZ2V0TGlua0lkZW50aXR5S2V5KGxpbmspKTtcbiAgICAgICAgICAgIGlmICghb2xkQXR0YWNobWVudFBhdGgpIHtcbiAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICogQSBsaW5rIHRoYXQgaXMgbm90IGluIHRoZSBzbmFwc2hvdCB3YXMgZWl0aGVyIG5ldmVyIG91cnMgdG8gcmV3cml0ZSwgb3Igd2FzIGFscmVhZHlcbiAgICAgICAgICAgICAgICogcmV3cml0dGVuIGJ5IHNvbWVvbmUgZWxzZSAobGVhdmluZyBpdCBjb3JyZWN0KS4gRWl0aGVyIHdheSB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIC1cbiAgICAgICAgICAgICAgICogYnV0IGxvZyBpdCwgYmVjYXVzZSBhIHNpbGVudCBza2lwIGhlcmUgaXMgZXhhY3RseSBob3dcbiAgICAgICAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWN1c3RvbS1hdHRhY2htZW50LWxvY2F0aW9uL2lzc3Vlcy82MCBzdGF5ZWRcbiAgICAgICAgICAgICAgICogaW52aXNpYmxlOiBldmVyeSBza2lwcGVkIGxpbmsgbGVmdCBhIGJyb2tlbiBlbWJlZCBhbmQgcmVwb3J0ZWQgbm90aGluZy5cbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnVwZGF0ZUJhY2tsaW5rcycpKFxuICAgICAgICAgICAgICAgIGBObyBzbmFwc2hvdCBlbnRyeSBmb3IgbGluayAke3RvSnNvbihsaW5rKX0gaW4gJHtuZXdCYWNrbGlua1BhdGh9OyBsZWF2aW5nIGl0IHVuY2hhbmdlZC5gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbmV3QXR0YWNobWVudFBhdGggPSByZW5hbWVNYXAuZ2V0KG9sZEF0dGFjaG1lbnRQYXRoKSA/PyBvbGRBdHRhY2htZW50UGF0aDtcblxuICAgICAgICAgICAgcmVuYW1lZEZpbGVQYXRocy5hZGQobmV3QmFja2xpbmtQYXRoKTtcbiAgICAgICAgICAgIHJlbmFtZWRMaW5rcy5hZGQoYCR7bmV3QmFja2xpbmtQYXRofS8vJHtTdHJpbmcobGlua0luZGV4KX1gKTtcblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtQYXJhbXM+KHtcbiAgICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgICAgbGluayxcbiAgICAgICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogbmV3QmFja2xpbmtQYXRoLFxuICAgICAgICAgICAgICBuZXdUYXJnZXRQYXRoT3JGaWxlOiBuZXdBdHRhY2htZW50UGF0aCxcbiAgICAgICAgICAgICAgb2xkVGFyZ2V0UGF0aE9yRmlsZTogb2xkQXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlc1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcGF0aE9yRmlsZTogbmV3QmFja2xpbmtQYXRoLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBwcm9jZXNzZWRCYWNrbGlua0ZpbGVzKys7XG4gICAgICAgIHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/Lih7XG4gICAgICAgICAgY3VycmVudFBhdGg6IG5ld0JhY2tsaW5rUGF0aCxcbiAgICAgICAgICBwcm9jZXNzZWQ6IHByb2Nlc3NlZEJhY2tsaW5rRmlsZXMsXG4gICAgICAgICAgdG90YWw6IGJhY2tsaW5rRW50cmllcy5sZW5ndGhcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc05vdGUodGhpcy5uZXdQYXRoKSkge1xuICAgICAgICBhd2FpdCB1cGRhdGVMaW5rc0luRmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua3NJbkZpbGVQYXJhbXM+KHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlc1xuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFnZXRGaWxlT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoIH0pKSB7XG4gICAgICAgIGxldCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5nZXQodGhpcy5uZXdQYXRoKTtcbiAgICAgICAgaWYgKCFpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5zZXQodGhpcy5uZXdQYXRoLCBpbnRlcnJ1cHRlZFJlbmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIGludGVycnVwdGVkUmVuYW1lcy5wdXNoKHtcbiAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNvbnN0IG9ycGhhbktleXMgPSBbLi4udGhpcy5oYW5kbGVkUmVuYW1lcy5rZXlzKCldO1xuICAgICAgYWRkVG9RdWV1ZSh7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBvcGVyYXRpb25GdW5jdGlvbjogKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3Qgb3JwaGFuS2V5IG9mIG9ycGhhbktleXMpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuZGVsZXRlKG9ycGhhbktleS5vbGRQYXRoLCBvcnBoYW5LZXkubmV3UGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlbmFtZWRMaW5rcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLnVwZGF0ZWRMaW5rcywgeyBmaWxlc0NvdW50OiByZW5hbWVkRmlsZVBhdGhzLnNpemUsIGxpbmtzQ291bnQ6IHJlbmFtZWRMaW5rcy5zaXplIH0pKTtcbiAgICAgICAgICByZW5hbWVkRmlsZVBhdGhzLmNsZWFyKCk7XG4gICAgICAgICAgcmVuYW1lZExpbmtzLmNsZWFyKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZU9ycGhhbmVkUmVuYW1lcylcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29udGludWVJbnRlcnJ1cHRlZFJlbmFtZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMub2xkUGF0aCk7XG4gICAgaWYgKGludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZGVsZXRlKHRoaXMub2xkUGF0aCk7XG4gICAgICBmb3IgKGNvbnN0IGludGVycnVwdGVkUmVuYW1lIG9mIGludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgICBhd2FpdCBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgICAgICBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwOiBpbnRlcnJ1cHRlZFJlbmFtZS5jb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgICAgICAgIG5ld1BhdGg6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgICAgICBvbGRQYXRoOiBpbnRlcnJ1cHRlZFJlbmFtZS5vbGRQYXRoLFxuICAgICAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXA6IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUNhc2VDb2xsaXNpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFnZXREYXRhQWRhcHRlckV4KHRoaXMuYXBwKS5pbnNlbnNpdGl2ZSB8fCB0aGlzLm9sZFBhdGgudG9Mb3dlckNhc2UoKSAhPT0gdGhpcy5uZXdQYXRoLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wb3JhcnlQYXRoID0gam9pbihkaXJuYW1lKHRoaXMubmV3UGF0aCksIGBfX3RlbXBfXyR7YmFzZW5hbWUodGhpcy5uZXdQYXRoKX1gKTtcbiAgICBhd2FpdCB0aGlzLnJlbmFtZUhhbmRsZWQodGhpcy5uZXdQYXRoLCB0ZW1wb3JhcnlQYXRoKTtcblxuICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgICAgbmV3UGF0aDogdGVtcG9yYXJ5UGF0aCxcbiAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSkuaGFuZGxlKCk7XG5cbiAgICBhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKGdldEZpbGUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0ZW1wb3JhcnlQYXRoIH0pLCB0aGlzLm5ld1BhdGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoTGlua3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmFrZU9sZEZpbGUgPSBnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gICAgbGV0IG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQ6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgICB7XG4gICAgICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyh0aGlzLmFwcCwgW2Zha2VPbGRGaWxlXSk7XG4gICAgICBjb25zdCBmYWtlT2xkRmlsZUJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogZmFrZU9sZEZpbGUgfSk7XG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkID0gZmFrZU9sZEZpbGVCYWNrbGlua3MuZGF0YTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIHJlZnJlc2hlZExpbmtzXSBvZiBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkKSB7XG4gICAgICBsZXQgb2xkTGlua3MgPSB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAuZ2V0KGJhY2tsaW5rUGF0aCk7XG4gICAgICBpZiAoIW9sZExpbmtzKSB7XG4gICAgICAgIG9sZExpbmtzID0gW107XG4gICAgICAgIHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcC5zZXQoYmFja2xpbmtQYXRoLCBvbGRMaW5rcyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgbGluayBvZiByZWZyZXNoZWRMaW5rcykge1xuICAgICAgICBpZiAob2xkTGlua3MuaW5jbHVkZXMobGluaykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBvbGRMaW5rcy5wdXNoKGxpbmspO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVuYW1lSGFuZGxlZChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbmV3UGF0aCA9IGdldFNhZmVSZW5hbWVQYXRoKHsgYXBwOiB0aGlzLmFwcCwgbmV3UGF0aCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBvbGRQYXRoIH0pO1xuICAgIGlmIChvbGRQYXRoID09PSBuZXdQYXRoKSB7XG4gICAgICByZXR1cm4gbmV3UGF0aDtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVkUmVuYW1lcy5hZGQob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgbmV3UGF0aCA9IGF3YWl0IHJlbmFtZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBuZXdQYXRoLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IG9sZFBhdGggfSk7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cbn1cblxuY2xhc3MgUmVuYW1lTWFwIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVNYXBDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgICB0aGlzLm9sZENhY2hlID0gcGFyYW1zLm9sZENhY2hlO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMubmV3UGF0aCA9IHBhcmFtcy5uZXdQYXRoO1xuICAgIHRoaXMub2xkUGF0aExpbmtzID0gdGhpcy5vbGRDYWNoZSA/IGdldExpbmtzKHsgY2FjaGU6IHRoaXMub2xkQ2FjaGUgfSkgOiBbXTtcbiAgfVxuXG4gIHB1YmxpYyBlbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgc3RyaW5nXT4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5lbnRyaWVzKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZmlsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgdGhpcy5tYXAuc2V0KHRoaXMub2xkUGF0aCwgdGhpcy5uZXdQYXRoKTtcblxuICAgIGlmICghaXNOb3RlKHRoaXMub2xkUGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPYnNpZGlhbiBkb2VzIG5vdCBpbmRleCBhIGNhbnZhcyBmaWxlIGludG8gdGhlIG1ldGFkYXRhIGNhY2hlLlxuICAgIC8vIFRoZSBjYWNoZS1kZXJpdmVkIGBvbGRQYXRoTGlua3NgIGlzIGVtcHR5IGZvciBhIGNhbnZhcywgaGlkaW5nIGl0cyBlbWJlZGRlZCBhdHRhY2htZW50cy5cbiAgICAvLyBSZWFkaW5nIHRoZSBjYW52YXMgcmVmZXJlbmNlcyBkaXJlY3RseSBtb3ZlcyB0aGVtIHdpdGggdGhlIGNhbnZhcyAobWlycm9yaW5nIG5vdGUgYmVoYXZpb3IpLlxuICAgIC8vIFRoZSBmaWxlIGFscmVhZHkgbGl2ZXMgYXQgdGhlIG5ldyBwYXRoIGFmdGVyIHRoZSByZW5hbWUsIHNvIHJlYWQgdGhlIHJlZmVyZW5jZXMgZnJvbSB0aGVyZS5cbiAgICBpZiAoaXNDYW52YXNGaWxlKHRoaXMub2xkUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNhbnZhc1JlZmVyZW5jZXMgPSBhd2FpdCBnZXRDYW52YXNSZWZlcmVuY2VzKHRoaXMuYXBwLCB0aGlzLm5ld1BhdGgpO1xuICAgICAgdGhpcy5vbGRQYXRoTGlua3MucHVzaCguLi5jYW52YXNSZWZlcmVuY2VzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBjb25zdCBvbGRGaWxlID0gZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgdGhpcy5nZXRPbGRBdHRhY2htZW50Rm9sZGVyUGF0aChvbGRGaWxlKTtcblxuICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoID0gc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlclxuICAgICAgPyBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoXG4gICAgICB9KVxuICAgICAgOiBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aDtcblxuICAgIGNvbnN0IGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCA9IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSAnLyc7XG5cbiAgICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRm9sZGVyOiBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCB9KTtcblxuICAgIGlmICghb2xkQXR0YWNobWVudEZvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gbmV3QXR0YWNobWVudEZvbGRlclBhdGggJiYgIXNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlczogVEZpbGVbXSA9IFtdO1xuXG4gICAgaWYgKFxuICAgICAgYXdhaXQgaGFzT3duQXR0YWNobWVudEZvbGRlcih7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICBwYXRoOiB0aGlzLm9sZFBhdGhcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4ob2xkQXR0YWNobWVudEZvbGRlciwgKG9sZEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgaWYgKGlzRmlsZShvbGRBdHRhY2htZW50RmlsZSkpIHtcbiAgICAgICAgICBvbGRBdHRhY2htZW50RmlsZXMucHVzaChvbGRBdHRhY2htZW50RmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IG9sZFBhdGhMaW5rIG9mIHRoaXMub2xkUGF0aExpbmtzKSB7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBsaW5rOiBvbGRQYXRoTGluaywgc291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoIH0pO1xuICAgICAgICBpZiAoIW9sZEF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290IHx8IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGguc3RhcnRzV2l0aChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50QmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50RmlsZSB9KTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgY29uc3Qga2V5cyA9IG5ldyBTZXQ8c3RyaW5nPihvbGRBdHRhY2htZW50QmFja2xpbmtzLmtleXMoKSk7XG4gICAgICAgICAga2V5cy5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgICAgICBrZXlzLmRlbGV0ZSh0aGlzLm5ld1BhdGgpO1xuICAgICAgICAgIGlmIChrZXlzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlIG9mIG9sZEF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV3QXR0YWNobWVudEZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGaWxlUGF0aCh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50RmlsZSxcbiAgICAgICAgICBvbGROb3RlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHNob3VsZFNraXBEdXBsaWNhdGVDaGVjazogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID8gb2xkQXR0YWNobWVudEZpbGUucGF0aCA6IHJlbGF0aXZlKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoLCBvbGRBdHRhY2htZW50RmlsZS5wYXRoKTtcbiAgICAgICAgY29uc3QgbmV3Rm9sZGVyID0gam9pbihuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCwgZGlybmFtZShyZWxhdGl2ZVBhdGgpKTtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gam9pbihuZXdGb2xkZXIsIG9sZEF0dGFjaG1lbnRGaWxlLm5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkQXR0YWNobWVudEZpbGUucGF0aCA9PT0gbmV3QXR0YWNobWVudEZpbGVQYXRoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMpIHtcbiAgICAgICAgY29uc3QgbmV3QXR0YWNobWVudEZpbGUgPSBnZXRGaWxlT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogbmV3QXR0YWNobWVudEZpbGVQYXRoIH0pO1xuICAgICAgICBpZiAobmV3QXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpmaWxsUmVuYW1lTWFwJykoYFJlbW92aW5nIGNvbmZsaWN0aW5nIGF0dGFjaG1lbnQgJHtuZXdBdHRhY2htZW50RmlsZS5wYXRofS5gKTtcbiAgICAgICAgICBhd2FpdCB0cmFzaFNhZmUodGhpcy5hcHAsIG5ld0F0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdG9yeSA9IGRpcm5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0bmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBiYXNlTmFtZSA9IGJhc2VuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCwgZXh0ZW5zaW9uKTtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gdGhpcy5hcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aChqb2luKGRpcmVjdG9yeSwgYmFzZU5hbWUpLCBleHRlbnNpb24uc2xpY2UoMSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXAuc2V0KG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldChvbGRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1hcC5nZXQob2xkUGF0aCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdEJhY2tsaW5rc01hcChwYXJhbXM6IFJlbmFtZU1hcEluaXRCYWNrbGlua3NNYXBQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB7XG4gICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgIHBhdGgsXG4gICAgICBzaW5nbGVCYWNrbGlua3NNYXBcbiAgICB9ID0gcGFyYW1zO1xuICAgIGZvciAoY29uc3QgW2JhY2tsaW5rUGF0aCwgbGlua3NdIG9mIHNpbmdsZUJhY2tsaW5rc01hcCkge1xuICAgICAgY29uc3QgbmV3QmFja2xpbmtQYXRoID0gdGhpcy5tYXAuZ2V0KGJhY2tsaW5rUGF0aCkgPz8gYmFja2xpbmtQYXRoO1xuICAgICAgY29uc3QgbGlua0tleVRvUGF0aE1hcCA9IGNvbWJpbmVkQmFja2xpbmtzTWFwLmdldChuZXdCYWNrbGlua1BhdGgpID8/IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgICBjb21iaW5lZEJhY2tsaW5rc01hcC5zZXQobmV3QmFja2xpbmtQYXRoLCBsaW5rS2V5VG9QYXRoTWFwKTtcbiAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICBsaW5rS2V5VG9QYXRoTWFwLnNldChnZXRMaW5rSWRlbnRpdHlLZXkobGluayksIHBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbml0T3JpZ2luYWxMaW5rc01hcChjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG9sZFBhdGhMaW5rIG9mIHRoaXMub2xkUGF0aExpbmtzKSB7XG4gICAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7IGFwcDogdGhpcy5hcHAsIGxpbms6IG9sZFBhdGhMaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGggfSk7XG4gICAgICBpZiAoIW9sZEF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFja2xpbmtzTWFwID0gbmV3IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPihbW3RoaXMubmV3UGF0aCwgW29sZFBhdGhMaW5rXV1dKTtcbiAgICAgIHRoaXMuaW5pdEJhY2tsaW5rc01hcCh7XG4gICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICBwYXRoOiBvbGRBdHRhY2htZW50RmlsZS5wYXRoLFxuICAgICAgICBzaW5nbGVCYWNrbGlua3NNYXA6IGJhY2tsaW5rc01hcFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAua2V5cygpO1xuICB9XG5cbiAgcHVibGljIHNldChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLnNldChvbGRQYXRoLCBuZXdQYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0T2xkQXR0YWNobWVudEZvbGRlclBhdGgob2xkRmlsZTogVEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHVzaW5nIF9yZWdpc3RyYXRpb24gPSByZWdpc3RlckZpbGVzKHRoaXMuYXBwLCBbb2xkRmlsZV0pO1xuICAgIHVzaW5nIF9jYWNoZVJlZ2lzdHJhdGlvbiA9IHRoaXMub2xkQ2FjaGUgJiYgb2xkRmlsZS5kZWxldGVkXG4gICAgICA/IHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKHsgYXBwOiB0aGlzLmFwcCwgY2FjaGU6IHRoaXMub2xkQ2FjaGUsIHBhdGhPckZpbGU6IG9sZEZpbGUgfSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCBoYW5kbGVzIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBpbiBPYnNpZGlhbi5cbiAqIEl0IGxpc3RlbnMgdG8gcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGFuZCB1cGRhdGVzIGxpbmtzIGFjY29yZGluZ2x5LlxuICogSXQgYWxzbyBoYW5kbGVzIGVkZ2UgY2FzZXMgc3VjaCBhcyBjYXNlLW9ubHkgcmVuYW1lcyBhbmQgY29sbGlzaW9ucyB3aXRoIGV4aXN0aW5nIGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgY29tcG9uZW50IHdob3NlIHNpZ25hbCBjYW5jZWxzIGluLWZsaWdodCByZW5hbWUgb3BlcmF0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhYm9ydFNpZ25hbENvbXBvbmVudDogQWJvcnRTaWduYWxDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCByZXBvcnRlciBpbnZva2VkIG9uY2UgcGVyIGJhY2tsaW5rIGZpbGUgd2hvc2UgbGlua3MgYXJlIHVwZGF0ZWQgZHVyaW5nIGEgcmVuYW1lL21vdmUsXG4gICAqIHdpdGggdGhlIHJ1bm5pbmcgY291bnQgb2YgcHJvY2Vzc2VkIGZpbGVzIGFuZCB0aGUgdG90YWwuIFdoZW4gYG51bGxgLCBubyBwcm9ncmVzcyBpcyByZXBvcnRlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBJRCB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgaGFuZGxlciBhbW9uZyB0aGUgcmVnaXN0ZXJlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXJzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbm90aWNlIGNvbXBvbmVudCB1c2VkIHRvIHJlcG9ydCB1cGRhdGVkIGxpbmtzIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAvKipcbiAgICogVGhlIHJlc291cmNlIGxvY2sgY29tcG9uZW50IHVzZWQgdG8gZ3VhcmQgbGluayB1cGRhdGVzLCBvciBgbnVsbGAgaWYgbm9uZSBpcyB1c2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcblxuICAvKipcbiAgICogQnVpbGRzIHRoaXMgcGx1Z2luJ3MgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xuXG4gIC8qKlxuICAgKiBUaGUgbWFuYWdlciB0aGF0IGFnZ3JlZ2F0ZXMgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzIGFjcm9zcyByZWdpc3RlcmVkIHBsdWdpbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzID0gbmV3IEhhbmRsZWRSZW5hbWVzKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsQ29tcG9uZW50ID0gcGFyYW1zLmFib3J0U2lnbmFsQ29tcG9uZW50O1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID0gcGFyYW1zLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID8/IG51bGw7XG4gICAgdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQgPSBwYXJhbXMucmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICAgIHRoaXMucGx1Z2luSWQgPSBwYXJhbXMucGx1Z2luSWQ7XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMuc2V0dGluZ3NCdWlsZGVyID0gcGFyYW1zLnNldHRpbmdzQnVpbGRlcjtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IG5ldyBTZXR0aW5nc01hbmFnZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgY29tcG9uZW50XG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG5cbiAgICByZW5hbWVEZWxldGVIYW5kbGVyc01hcC5zZXQodGhpcy5wbHVnaW5JZCwgdGhpcy5zZXR0aW5nc0J1aWxkZXIpO1xuICAgIHRoaXMubG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLmRlbGV0ZSh0aGlzLnBsdWdpbklkKTtcbiAgICAgIHRoaXMubG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIHRoaXMuaGFuZGxlRGVsZXRlLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIHRoaXMuaGFuZGxlUmVuYW1lLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIHRoaXMuaGFuZGxlTWV0YWRhdGFEZWxldGVkLmJpbmQodGhpcykpKTtcblxuICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGZpbGVNYW5hZ2VyOiB0aGlzLmFwcC5maWxlTWFuYWdlcixcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnQoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLFxuICAgICAgICBzaG91bGRJbnZva2VIYW5kbGVyOiB0aGlzLnNob3VsZEludm9rZUhhbmRsZXIuYmluZCh0aGlzKVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEZWxldGUoZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRJbnZva2VIYW5kbGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWRkVG9RdWV1ZSh7XG4gICAgICBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgRGVsZXRlSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCxcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZURlbGV0ZSwgeyBmaWxlUGF0aDogZmlsZS5wYXRoIH0pXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1ldGFkYXRhRGVsZXRlZChmaWxlOiBUQWJzdHJhY3RGaWxlLCBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkSW52b2tlSGFuZGxlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG5ldyBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyKHtcbiAgICAgIGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLFxuICAgICAgZmlsZSxcbiAgICAgIHByZXZpb3VzQ2FjaGUsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSkuaGFuZGxlKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlbmFtZShmaWxlOiBUQWJzdHJhY3RGaWxlLCBvbGRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkSW52b2tlSGFuZGxlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpc0ZpbGUoZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdQYXRoID0gZmlsZS5wYXRoO1xuXG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYEhhbmRsZSBSZW5hbWUgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YCk7XG4gICAgaWYgKHRoaXMuaGFuZGxlZFJlbmFtZXMuaGFzKG9sZFBhdGgsIG5ld1BhdGgpKSB7XG4gICAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmRlbGV0ZShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgcmVuYW1lIG9jY3VycmluZyBpbnNpZGUgYSBmb3JlaWduIHBsdWdpbidzIGluLWZsaWdodCBsb2NrZWQgdHJhbnNhY3Rpb24gKHdoaWNoIGxvY2tzIHRoZVxuICAgICAqIGFmZmVjdGVkIGZvbGRlciBzdWJ0cmVlLCBlLmcuIEFkdmFuY2VkIE5vdGUgQ29tcG9zZXIncyBmb2xkZXIgbWVyZ2UpIGlzIG9yY2hlc3RyYXRlZCBieSB0aGF0XG4gICAgICogdHJhbnNhY3Rpb24ncyBvd25lciwgd2hpY2ggdGFrZXMgcmVzcG9uc2liaWxpdHkgZm9yIGl0cyBvd24gbGluayBjb25zaXN0ZW5jeS4gUmVhY3RpbmcgdG8gaXRcbiAgICAgKiBoZXJlIHdvdWxkIChhKSBwZXJ0dXJiIE9ic2lkaWFuJ3MgbmF0aXZlIHBvc3QtcmVuYW1lIGxpbmsgdXBkYXRlIGFuZCBsZWF2ZSBsaW5rcyBkYW5nbGluZywgYW5kXG4gICAgICogKGIpIGNvbGxpZGUgd2l0aCB0aGUgZm9yZWlnbiB0cmFuc2FjdGlvbiBcdTIwMTQgYW4gYXN5bmMgYWJvcnQgZnJvbSB0aGlzIGhhbmRsZXIgYWJvcnRzIGFuXG4gICAgICogYWxyZWFkeS1jb21taXR0ZWQgdHJhbnNhY3Rpb24sIHRocm93aW5nIFwiQ2Fubm90IHJvbGwgYmFjayBhIGNvbW1pdHRlZCB0cmFuc2FjdGlvblwiLiBUaGlzXG4gICAgICogaGFuZGxlcidzIG93biBhdHRhY2htZW50IG1vdmVzIGFyZSBhbHJlYWR5IGV4Y2x1ZGVkIGFib3ZlIHZpYSBgaGFuZGxlZFJlbmFtZXNgLCBzbyBhIGxvY2sgc3RpbGxcbiAgICAgKiBoZWxkIGhlcmUgYWx3YXlzIGJlbG9uZ3MgdG8gYSBmb3JlaWduIG9wZXJhdGlvbjsgc3RheSBvdXQgb2YgaXRzIHdheS4gU2VlXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWFkdmFuY2VkLW5vdGUtY29tcG9zZXIvaXNzdWVzLzE0Ni5cbiAgICAgKi9cbiAgICBpZiAoaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBvbGRQYXRoKSB8fCBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShcbiAgICAgICAgYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofSBhcyBpdCBvY2N1cnMgaW5zaWRlIGEgZm9yZWlnbiBsb2NrZWQgdHJhbnNhY3Rpb24uYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05vT3BSZW5hbWUoc2V0dGluZ3MsIG9sZFBhdGgsIG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShcbiAgICAgICAgYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofSBhcyBpdCBpcyBub3QgYSBub3RlIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIHdpdGggbGluayB1cGRhdGVzIGRpc2FibGVkLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihvbGRQYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mIG9sZCBwYXRoICR7b2xkUGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgbmV3IHBhdGggJHtuZXdQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShvbGRQYXRoKSA/PyB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG5ld1BhdGgpO1xuICAgIGNvbnN0IG9sZFBhdGhCYWNrbGlua3NNYXAgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKHRoaXMuYXBwLCBvbGRQYXRoKS5kYXRhO1xuICAgIGFkZFRvUXVldWUoe1xuICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWxDb21wb25lbnQuYWJvcnRTaWduYWwsXG4gICAgICBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgICAgICAgIG5ld1BhdGgsXG4gICAgICAgICAgb2xkQ2FjaGUsXG4gICAgICAgICAgb2xkUGF0aCxcbiAgICAgICAgICBvbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpLFxuICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlUmVuYW1lLCB7IG5ld1BhdGgsIG9sZFBhdGggfSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaXRoIGxpbmsgcmV3cml0aW5nIG9mZiwgdGhlIGhhbmRsZXIncyBvbmx5IHJlbWFpbmluZyBqb2JzIGFyZSBtb3ZpbmcgYSBOT1RFJ3MgYXR0YWNobWVudHMgYW5kIHBydW5pbmdcbiAgICogdGhlIGZvbGRlciBhIG1vdmVkIGZpbGUgdmFjYXRlZC4gQSBub24tbm90ZSByZW5hbWUgbmVlZHMgbmVpdGhlciB3aGVuIGVtcHR5IGZvbGRlcnMgYXJlIGtlcHQsIHNvIHRoZXJlXG4gICAqIGlzIG5vdGhpbmcgdG8gcXVldWUuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBhZ2dyZWdhdGVkIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICogQHBhcmFtIG9sZFBhdGggLSBUaGUgcGF0aCB0aGUgZmlsZSB3YXMgcmVuYW1lZCBmcm9tLlxuICAgKiBAcGFyYW0gbmV3UGF0aCAtIFRoZSBwYXRoIHRoZSBmaWxlIHdhcyByZW5hbWVkIHRvLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgaGFuZGxlciB3b3VsZCBkbyBubyB3b3JrIGZvciB0aGlzIHJlbmFtZS5cbiAgICovXG4gIHByaXZhdGUgaXNOb09wUmVuYW1lKHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4sIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzXG4gICAgICAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKG9sZFBhdGgpID8/IGZhbHNlKVxuICAgICAgJiYgIShzZXR0aW5ncy5pc05vdGU/LihuZXdQYXRoKSA/PyBmYWxzZSlcbiAgICAgICYmIChzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID8/IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcCkgPT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcDtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6bG9nUmVnaXN0ZXJlZEhhbmRsZXJzJykoXG4gICAgICBgUGx1Z2lucyB3aXRoIHJlZ2lzdGVyZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyczogJHtKU09OLnN0cmluZ2lmeShbLi4ucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAua2V5cygpXSl9YFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZEludm9rZUhhbmRsZXIoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5yZW5hbWVEZWxldGVIYW5kbGVyc01hcDtcbiAgICBjb25zdCBtYWluUGx1Z2luSWQgPSBbLi4ucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAua2V5cygpXVswXTtcbiAgICByZXR1cm4gbWFpblBsdWdpbklkID09PSB0aGlzLnBsdWdpbklkO1xuICB9XG59XG5cbi8qKlxuICogTW92ZXMgYW4gYXR0YWNobWVudCBhIGRlbGV0aW9uIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQgdG8gd2hlcmV2ZXIgdGhlIGNvbnN1bWluZyBwbHVnaW4gc2F5cyBpdCBiZWxvbmdzLlxuICpcbiAqIFNoYXJlZCBieSBib3RoIGRlbGV0ZSBwYXRocyBcdTIwMTQgdGhlIG5vdGUgZGVsZXRlIGluIHtAbGluayBEZWxldGVIYW5kbGVyfSBhbmQgdGhlIGZvbGRlciBkZWxldGUgcmVwbGF5ZWQgYnlcbiAqIHtAbGluayBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnR9IFx1MjAxNCBiZWNhdXNlIGJvdGggcmVhY2ggdGhlIHNhbWUgcG9pbnQ6IHtAbGluayBkZWxldGVJZk5vdFVzZWR9IGhhc1xuICogZGVjaWRlZCB0aGUgYXR0YWNobWVudCBtdXN0IHN1cnZpdmUsIGFuZCB3aXRob3V0IHRoaXMgaXQgd291bGQgc3Vydml2ZSBpbiBhIGZvbGRlciBub3RoaW5nIG93bnMgYW55IG1vcmUuXG4gKlxuICogQSBjb25zdW1lciB0aGF0IGRvZXMgbm90IGltcGxlbWVudCB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzLmdldFJlc2N1ZVBhdGh9LCBvciB0aGF0IGFuc3dlcnNcbiAqIGBudWxsYCwgZ2V0cyBleGFjdGx5IHRoZSBiZWhhdmlvciBpdCBoYWQgYmVmb3JlIHRoaXMgZXhpc3RlZDogdGhlIGF0dGFjaG1lbnQgc3RheXMgcHV0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB3aGV0aGVyIHRoZSBhdHRhY2htZW50IHdhcyBtb3ZlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudChwYXJhbXM6IERpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnRQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gIGlmICghc2V0dGluZ3MuZ2V0UmVzY3VlUGF0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGF0dGFjaG1lbnRQYXRoID0gcGFyYW1zLnJlc2N1ZVBhcmFtcy5maWxlLnBhdGg7XG4gIGNvbnN0IHJlc2N1ZVBhdGggPSBhd2FpdCBzZXR0aW5ncy5nZXRSZXNjdWVQYXRoKHtcbiAgICBhdHRhY2htZW50UGF0aCxcbiAgICBzdXJ2aXZpbmdOb3RlUGF0aHM6IHBhcmFtcy5yZXNjdWVQYXJhbXMuc3Vydml2aW5nTm90ZVBhdGhzXG4gIH0pO1xuXG4gIGlmIChyZXNjdWVQYXRoID09PSBudWxsKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudCcpKGBObyByZXNjdWUgcGF0aCBmb3IgJHthdHRhY2htZW50UGF0aH07IGtlZXBpbmcgaXQgd2hlcmUgaXQgaXMuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvKlxuICAgICAqIGByZW5hbWVTYWZlYCBjcmVhdGVzIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIsIHJlc29sdmVzIGEgY29sbGlzaW9uIHZpYSBgZ2V0U2FmZVJlbmFtZVBhdGhgLCBhbmQgbW92ZXNcbiAgICAgKiB0aHJvdWdoIGBhcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZWAsIHNvIHRoZSBzdXJ2aXZpbmcgbm90ZXMnIGxpbmtzIGZvbGxvdyB0aGUgYXR0YWNobWVudC5cbiAgICAgKi9cbiAgICBjb25zdCBuZXdBdHRhY2htZW50UGF0aCA9IGF3YWl0IHJlbmFtZVNhZmUoe1xuICAgICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgICAgbmV3UGF0aDogcmVzY3VlUGF0aCxcbiAgICAgIG9sZFBhdGhPckFic3RyYWN0RmlsZTogcGFyYW1zLnJlc2N1ZVBhcmFtcy5maWxlXG4gICAgfSk7XG5cbiAgICBpZiAobmV3QXR0YWNobWVudFBhdGggPT09IGF0dGFjaG1lbnRQYXRoKSB7XG4gICAgICAvKlxuICAgICAgICogVGhlIGF0dGFjaG1lbnQgaXMgYWxyZWFkeSB3aGVyZSBpdCBiZWxvbmdzLiBUaGlzIGlzIHRoZSBub3JtYWwgc2Vjb25kIGxvb2sgYXQgYSBmaWxlIHRoZSBmb2xkZXJcbiAgICAgICAqIGRlbGV0ZSBqdXN0IHJlc2N1ZWQ6IHRoZSBvd25pbmcgbm90ZSdzIG93biBkZWxldGlvbiBpcyByZXBvcnRlZCBhZnRlcndhcmRzIGFuZCB3YWxrcyBpdHMgbGlua3NcbiAgICAgICAqIGFnYWluLiBOb3RoaW5nIG1vdmVkLCBzbyBub3RoaW5nIGlzIGNsYWltZWQgXHUyMDE0IHRoZSBjYWxsZXIga2VlcHMgaXQgaW4gcGxhY2UsIHdoaWNoIGlzIHRoZSB0cnV0aC5cbiAgICAgICAqL1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudCcpKGAke2F0dGFjaG1lbnRQYXRofSBhbHJlYWR5IHNpdHMgYXQgaXRzIHJlc2N1ZSBwYXRoOyBub3RoaW5nIHRvIG1vdmUuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBUaGUgbW92ZSBmaXJlcyBgdmF1bHQub24oJ3JlbmFtZScpYCwgc28gdGhpcyBoYW5kbGVyJ3Mgb3duIGBSZW5hbWVIYW5kbGVyYCBwaWNrcyBpdCB1cCBsaWtlIGFueSBvdGhlclxuICAgICAqIGF0dGFjaG1lbnQgbW92ZS4gSXQgaXMgZGVsaWJlcmF0ZWx5IE5PVCByZWdpc3RlcmVkIGluIGBoYW5kbGVkUmVuYW1lc2A6XG4gICAgICogYEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRgIGFscmVhZHkgZGlzY2FyZHMgT2JzaWRpYW4ncyBuYXRpdmUgbGluayB1cGRhdGUgd2hpbGVcbiAgICAgKiBgc2hvdWxkSGFuZGxlUmVuYW1lc2AgaXMgb24sIHNvIHN1cHByZXNzaW5nIHRoZSBoYW5kbGVyIGFzIHdlbGwgd291bGQgbGVhdmUgZGFuZ2xpbmcgZXhhY3RseSB0aGUgbGlua3NcbiAgICAgKiB0aGlzIHJlc2N1ZSBleGlzdHMgdG8gcHJlc2VydmUuIExldCB0aGUgcmV3cml0ZSBzZXR0bGUgYmVmb3JlIHRoZSBkZWxldGUgd2FsayBjYXJyaWVzIG9uLlxuICAgICAqL1xuICAgIGF3YWl0IHdhaXRGb3JQZW5kaW5nTGlua1VwZGF0ZXMocGFyYW1zLmFwcCk7XG5cbiAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50JykoYFJlc2N1ZWQgJHthdHRhY2htZW50UGF0aH0gdG8gJHtuZXdBdHRhY2htZW50UGF0aH0uYCk7XG4gICAgcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5ub3RpY2VzLmF0dGFjaG1lbnRSZXNjdWVkLCB7IGF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aCB9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLypcbiAgICAgKiBBIHJlc2N1ZSB0aGF0IGhhbGYgaGFwcGVuZWQgbXVzdCBub3QgcmVhZCBhcyBzdWNjZXNzIFx1MjAxNCByZXBvcnRpbmcgYGZhbHNlYCBmYWxscyBiYWNrIHRvIGtlZXBpbmcgdGhlXG4gICAgICogYXR0YWNobWVudCBpbiBwbGFjZSB3aXRoIHRoZSBgYXR0YWNobWVudElzU3RpbGxVc2VkYCBub3RpY2UsIHdoaWNoIGlzIHN0aWxsIHNhZmUuXG4gICAgICovXG4gICAgcHJpbnRFcnJvcihuZXcgRXJyb3IoYEZhaWxlZCB0byByZXNjdWUgJHthdHRhY2htZW50UGF0aH0gdG8gJHtyZXNjdWVQYXRofWAsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGtleSB1bmRlciB3aGljaCBhIGxpbmsgaXMgcmVtZW1iZXJlZCB3aGlsZSBhIHJlbmFtZSBpcyBpbiBmbGlnaHQuXG4gKlxuICogVGhlIHJld3JpdGUgaGFzIHRvIG1hdGNoIGxpbmtzIGNhcHR1cmVkIEJFRk9SRSB0aGUgYXR0YWNobWVudHMgbW92ZWQgYWdhaW5zdCB0aGUgbGlua3MgdGhlIG1ldGFkYXRhIGNhY2hlXG4gKiByZXBvcnRzIEFGVEVSIHRoZXkgbW92ZWQsIGFuZCB0aGUgb25seSB0aGluZyB0aGF0IHJlbGlhYmx5IHN1cnZpdmVzIHRoYXQgZ2FwIGlzIHRoZSBsaW5rJ3MgVEVYVC5cbiAqIERlbGliZXJhdGVseSBleGNsdWRlcyBgcG9zaXRpb25gOiBrZXlpbmcgb24gdGhlIHdob2xlIHtAbGluayBSZWZlcmVuY2V9IG1lYW50IHRoYXQgYXMgc29vbiBhcyBhbnl0aGluZ1xuICogZWRpdGVkIHRoZSBmaWxlIGluIGJldHdlZW4gXHUyMDE0IGEgY28taW5zdGFsbGVkIHBsdWdpbiByZXdyaXRpbmcgaXRzIG93biBsaW5rcywgbW9zdCBvZnRlbiBcdTIwMTQgZXZlcnkgbGluayBiZWxvd1xuICogdGhlIGVkaXQgc2hpZnRlZCBpdHMgb2Zmc2V0cywgbWlzc2VkIGl0cyBrZXksIGFuZCB3YXMgc2tpcHBlZCBpbiBzaWxlbmNlLCBsZWF2aW5nIHRoZSBub3RlIHdpdGggc29tZSBlbWJlZHNcbiAqIHJld3JpdHRlbiBhbmQgdGhlIHJlc3QgYnJva2VuLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1jdXN0b20tYXR0YWNobWVudC1sb2NhdGlvbi9pc3N1ZXMvNjAuXG4gKlxuICogVHdvIGxpbmtzIHdpdGggaWRlbnRpY2FsIHRleHQgaW4gb25lIGZpbGUgbmVjZXNzYXJpbHkgcmVzb2x2ZSB0byB0aGUgc2FtZSB0YXJnZXQsIHNvIGNvbGxhcHNpbmcgdGhlbSBvbnRvXG4gKiBvbmUga2V5IGxvc2VzIG5vdGhpbmcuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBUaGUgbGluayB0byBidWlsZCB0aGUga2V5IGZvci5cbiAqIEByZXR1cm5zIFRoZSBrZXkgaWRlbnRpZnlpbmcgdGhlIGxpbmsgYnkgaXRzIHRleHQgYWxvbmUuXG4gKi9cbmZ1bmN0aW9uIGdldExpbmtJZGVudGl0eUtleShsaW5rOiBSZWZlcmVuY2UpOiBzdHJpbmcge1xuICByZXR1cm4gdG9Kc29uKHtcbiAgICBsaW5rOiBsaW5rLmxpbmssXG4gICAgb3JpZ2luYWw6IGxpbmsub3JpZ2luYWxcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbmV4cG9ydCB7IEVtcHR5Rm9sZGVyQmVoYXZpb3IgfSBmcm9tICcuLi92YXVsdC50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBb0JBLDZCQUdPO0FBQ1AscUJBQWtCO0FBQ2xCLHNCQUdPO0FBWVAsbUJBQThCO0FBQzlCLG1CQUErQjtBQUMvQixtQkFBMkI7QUFDM0IsMEJBR087QUFDUCxzQ0FBeUM7QUFDekMsa0JBTU87QUFDUCw2QkFLTztBQUNQLG9CQUFvQztBQUNwQywwQkFBMEM7QUFDMUMseUJBVU87QUFDUCxrQkFLTztBQUNQLDRCQU1PO0FBQ1AsbUJBQTJCO0FBQzNCLDJCQUFrRDtBQUNsRCwwQkFBZ0M7QUFDaEMsbUJBT087QUFDUCwwQkFBNEI7QUFDNUIscUNBR087QUEya0RQLElBQUFBLGdCQUFvQztBQTE4Q3BDLE1BQU0sY0FBYyx1QkFBTyxJQUFJLHFCQUFxQjtBQWdEcEQsTUFBTSxnQkFBZ0I7QUFBQSxFQUNKO0FBQUEsRUFFVCxjQUFjO0FBQ25CLFNBQUssOEJBQTBCLDBEQUF5QiwyQkFBMkIsb0JBQUks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ckQscUNBQWUsMkNBQTJDO0FBQUEsTUFDeEQsbURBQW1ELEtBQUssVUFBVSxDQUFDLEdBQUcsd0JBQXdCLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFBQSxJQUN4RztBQUFBLEVBQ0Y7QUFBQSxFQUVRLHNCQUErQjtBQUNyQyxVQUFNLDBCQUEwQixLQUFLLGdCQUFnQjtBQUNyRCxVQUFNLGVBQWUsQ0FBQyxHQUFHLHdCQUF3QixLQUFLLENBQUMsRUFBRSxDQUFDO0FBQzFELFdBQU8saUJBQWlCLEtBQUs7QUFBQSxFQUMvQjtBQUNGO0FBZUEsZUFBZSw2QkFBNkIsUUFBOEQ7QUFDeEcsUUFBTSxXQUFXLE9BQU8sZ0JBQWdCLFlBQVk7QUFDcEQsTUFBSSxDQUFDLFNBQVMsZUFBZTtBQUMzQixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0saUJBQWlCLE9BQU8sYUFBYSxLQUFLO0FBQ2hELFFBQU0sYUFBYSxNQUFNLFNBQVMsY0FBYztBQUFBLElBQzlDO0FBQUEsSUFDQSxvQkFBb0IsT0FBTyxhQUFhO0FBQUEsRUFDMUMsQ0FBQztBQUVELE1BQUksZUFBZSxNQUFNO0FBQ3ZCLHFDQUFlLGtEQUFrRCxFQUFFLHNCQUFzQixjQUFjLDJCQUEyQjtBQUNsSSxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUk7QUFLRixVQUFNLG9CQUFvQixVQUFNLHlCQUFXO0FBQUEsTUFDekMsS0FBSyxPQUFPO0FBQUEsTUFDWixTQUFTO0FBQUEsTUFDVCx1QkFBdUIsT0FBTyxhQUFhO0FBQUEsSUFDN0MsQ0FBQztBQUVELFFBQUksc0JBQXNCLGdCQUFnQjtBQU14Qyx1Q0FBZSxrREFBa0QsRUFBRSxHQUFHLGNBQWMsb0RBQW9EO0FBQ3hJLGFBQU87QUFBQSxJQUNUO0FBU0EsY0FBTSwrQ0FBMEIsT0FBTyxHQUFHO0FBRTFDLHFDQUFlLGtEQUFrRCxFQUFFLFdBQVcsY0FBYyxPQUFPLGlCQUFpQixHQUFHO0FBQ3ZILFdBQU8sc0JBQXNCLGVBQVcsa0JBQUUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLFFBQVEsbUJBQW1CLEVBQUUsZ0JBQWdCLGtCQUFrQixDQUFDLENBQUM7QUFDckksV0FBTztBQUFBLEVBQ1QsU0FBUyxPQUFPO0FBS2QsaUNBQVcsSUFBSSxNQUFNLG9CQUFvQixjQUFjLE9BQU8sVUFBVSxJQUFJLEVBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUM3RixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBbUJBLFNBQVMsbUJBQW1CLE1BQXlCO0FBQ25ELGFBQU8sNEJBQU87QUFBQSxJQUNaLE1BQU0sS0FBSztBQUFBLElBQ1gsVUFBVSxLQUFLO0FBQUEsRUFDakIsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfdmF1bHQiXQp9Cg==
1344
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGUsXG4gIFRGb2xkZXJcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gRGVlcGx5IGNvdXBsZWQgdG8gT2JzaWRpYW4gcnVudGltZTsgcmVxdWlyZXMgcnVubmluZyB2YXVsdCBmb3IgbWVhbmluZ2Z1bCB0ZXN0aW5nLiAqL1xuaW1wb3J0IHtcbiAgZ2V0RGF0YUFkYXB0ZXJFeCxcbiAgSW50ZXJuYWxQbHVnaW5OYW1lXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7IHQgfSBmcm9tICdpMThuZXh0JztcbmltcG9ydCB7XG4gIEZpbGVNYW5hZ2VyLFxuICBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfSBmcm9tICcuLi9saW5rLXVwZGF0ZS1wcm9ncmVzcy50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIFVwZGF0ZUxpbmtQYXJhbXMsXG4gIFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zXG59IGZyb20gJy4uL2xpbmsudHMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZUxvY2tDb21wb25lbnQgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQgdHlwZSB7IEFib3J0U2lnbmFsQ29tcG9uZW50IH0gZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IGZpbHRlckluUGxhY2UgfSBmcm9tICcuLi8uLi9hcnJheS50cyc7XG5pbXBvcnQgeyBnZXRMaWJEZWJ1Z2dlciB9IGZyb20gJy4uLy4uL2RlYnVnLnRzJztcbmltcG9ydCB7IHByaW50RXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvci50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi8uLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi8uLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRQYXRoQ29udGV4dCxcbiAgZ2V0QXR0YWNobWVudEZpbGVQYXRoLFxuICBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCxcbiAgaGFzT3duQXR0YWNobWVudEZvbGRlclxufSBmcm9tICcuLi9hdHRhY2htZW50LXBhdGgudHMnO1xuaW1wb3J0IHsgZ2V0Q2FudmFzUmVmZXJlbmNlcyB9IGZyb20gJy4uL2NhbnZhcy50cyc7XG5pbXBvcnQgeyB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzIH0gZnJvbSAnLi4vZmlsZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7XG4gIENBTlZBU19GSUxFX0VYVEVOU0lPTixcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzRmlsZSxcbiAgaXNGb2xkZXIsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgZWRpdExpbmtzLFxuICBleHRyYWN0TGlua0ZpbGUsXG4gIHVwZGF0ZUxpbmssXG4gIHVwZGF0ZUxpbmtzSW5GaWxlXG59IGZyb20gJy4uL2xpbmsudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aCxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUsXG4gIGdldExpbmtzLFxuICByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZSxcbiAgcmVnaXN0ZXJGaWxlc1xufSBmcm9tICcuLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBhZGRUb1F1ZXVlIH0gZnJvbSAnLi4vcXVldWUudHMnO1xuaW1wb3J0IHsgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yIH0gZnJvbSAnLi4vcmVzb3VyY2UtbG9jay50cyc7XG5pbXBvcnQgeyBkZWxldGVJZk5vdFVzZWQgfSBmcm9tICcuLi92YXVsdC1kZWxldGUudHMnO1xuaW1wb3J0IHtcbiAgY2xlYW51cEVtcHR5Rm9sZGVycyxcbiAgRW1wdHlGb2xkZXJCZWhhdmlvcixcbiAgZ2V0U2FmZVJlbmFtZVBhdGgsXG4gIGlzQ2hpbGRPclNlbGYsXG4gIHJlbmFtZVNhZmUsXG4gIHRyYXNoU2FmZVxufSBmcm9tICcuLi92YXVsdC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7XG4gIGhhc1BhdGNoVG9rZW4sXG4gIE1vbmtleUFyb3VuZENvbXBvbmVudFxufSBmcm9tICcuL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzLmdldFJlc2N1ZVBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFJlc2N1ZVBhdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIGF0dGFjaG1lbnQgdGhhdCBpcyBhYm91dCB0byBiZSBzdHJhbmRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGF0dGFjaG1lbnRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRocyBvZiB0aGUgbm90ZXMgdGhhdCBzdGlsbCByZWZlcmVuY2UgdGhlIGF0dGFjaG1lbnQgb25jZSB0aGUgZGVsZXRpb24gaXMgZG9uZS4gTmV2ZXIgZW1wdHkuXG4gICAqL1xuICByZWFkb25seSBzdXJ2aXZpbmdOb3RlUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNldHRpbmdzIGZvciB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG9mIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIgd2hlbiBkZWxldGluZyBlbXB0eSBmb2xkZXJzLlxuICAgKi9cbiAgZW1wdHlGb2xkZXJCZWhhdmlvcjogRW1wdHlGb2xkZXJCZWhhdmlvcjtcblxuICAvKipcbiAgICogV2hlcmUgdG8gbW92ZSBhbiBhdHRhY2htZW50IHRoYXQgYSBkZWxldGlvbiB3b3VsZCBvdGhlcndpc2Ugc3RyYW5kIFx1MjAxNCBvbmUgdGhhdCBzdXJ2aXZlcyBiZWNhdXNlIGFub3RoZXJcbiAgICogbm90ZSBzdGlsbCByZWZlcmVuY2VzIGl0LCBidXQgaXMgbGVmdCBzaXR0aW5nIGluIGEgZm9sZGVyIHdob3NlIG93bmluZyBub3RlIGlzIGdvbmUuXG4gICAqXG4gICAqIERlY2lkaW5nIHRoZSBkZXN0aW5hdGlvbiBpcyB0aGUgcGx1Z2luJ3MgYXR0YWNobWVudC1wYXRoIHBvbGljeSwgd2hpY2ggaXMgd2h5IHRoZSBoYW5kbGVyIGFza3MgcmF0aGVyXG4gICAqIHRoYW4gZ3Vlc3Nlcy4gUmV0dXJuaW5nIGBudWxsYCBcdTIwMTQgb3Igbm90IGltcGxlbWVudGluZyB0aGlzIGF0IGFsbCBcdTIwMTQga2VlcHMgdGhlIGF0dGFjaG1lbnQgd2hlcmUgaXQgaXMsXG4gICAqIHdoaWNoIGlzIHRoZSBiZWhhdmlvciBldmVyeSBjb25zdW1lciBoYWQgYmVmb3JlIHRoaXMgbWVtYmVyIGV4aXN0ZWQuXG4gICAqL1xuICBnZXRSZXNjdWVQYXRoPyhwYXJhbXM6IEdldFJlc2N1ZVBhdGhQYXJhbXMpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYXRoIGlzIGEgbm90ZS5cbiAgICovXG4gIGlzTm90ZShwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGlnbm9yZSB0aGUgcGF0aC5cbiAgICovXG4gIGlzUGF0aElnbm9yZWQocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkZWxldGUgY29uZmxpY3RpbmcgYXR0YWNobWVudHMuXG4gICAqL1xuICBzaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhhbmRsZSBkZWxldGlvbnMuXG4gICAqL1xuICBzaG91bGRIYW5kbGVEZWxldGlvbnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIHJlbmFtZXMuXG4gICAqL1xuICBzaG91bGRIYW5kbGVSZW5hbWVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZpbGVzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZm9sZGVyIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXNlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgSGFuZGxlZFJlbmFtZUtleSB7XG4gIG5ld1BhdGg6IHN0cmluZztcbiAgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJydXB0ZWRSZW5hbWUge1xuICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIG9sZFBhdGg6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJlbmFtZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzOiBIYW5kbGVkUmVuYW1lcztcbiAgcmVhZG9ubHkgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcD86IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+O1xuICByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZU1hcENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lTWFwSW5pdEJhY2tsaW5rc01hcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29tYmluZWQgYmFja2xpbmtzIG1hcCwga2V5ZWQgYnkgbmV3IGJhY2tsaW5rIHBhdGgsIGFjY3VtdWxhdGluZyBsaW5rLUpTT04gdG8gc291cmNlLXBhdGggbWFwcGluZ3MuXG4gICAqL1xuICByZWFkb25seSBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHdob3NlIGJhY2tsaW5rcyBhcmUgYmVpbmcgcmVjb3JkZWQuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBiYWNrbGlua3MgbWFwIGZvciBhIHNpbmdsZSBmaWxlLCBrZXllZCBieSBiYWNrbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgc2luZ2xlQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG59XG5cbmNvbnN0IFBBVENIX1RPS0VOID0gU3ltYm9sLmZvcigncmVuYW1lRGVsZXRlSGFuZGxlcicpO1xuXG5pbnRlcmZhY2UgRGVsZXRlSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRGVsZXRlUHJvdGVjdGlvblBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuICBzaG91bGRJbnZva2VIYW5kbGVyKHRoaXM6IHZvaWQpOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudFBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcmVzY3VlUGFyYW1zOiBSZXNjdWVTdGlsbFVzZWRGaWxlUGFyYW1zO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBmaWxlTWFuYWdlcjogRmlsZU1hbmFnZXI7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgTWV0YWRhdGFEZWxldGVkSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcmVhZG9ubHkgcHJldmlvdXNDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsQ29tcG9uZW50OiBBYm9ydFNpZ25hbENvbXBvbmVudDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPzogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHNldHRpbmdzQnVpbGRlcih0aGlzOiB2b2lkKTogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xufVxuXG5jbGFzcyBEZWxldGVIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IERlbGV0ZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmZpbGUgPSBwYXJhbXMuZmlsZTtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IHBhcmFtcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBIYW5kbGUgRGVsZXRlICR7dGhpcy5maWxlLnBhdGh9YCk7XG4gICAgaWYgKCFpc05vdGUodGhpcy5maWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyh0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKFxuICAgICAgICBgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIGZpbGUgc3RpbGwgZXhpc3RzIG9uIGRpc2sgKGluZGV4LW9ubHkgcmVtb3ZhbCwgbm90IGEgcmVhbCBkZWxldGlvbikuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlRGVsZXRlJykoYFNraXBwaW5nIGRlbGV0ZSBoYW5kbGVyIG9mICR7dGhpcy5maWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50Rm9sZGVyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oW2Rpcm5hbWUodGhpcy5maWxlLnBhdGgpXSk7XG5cbiAgICBpZiAoc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZ2V0KHRoaXMuZmlsZS5wYXRoKTtcbiAgICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZGVsZXRlKHRoaXMuZmlsZS5wYXRoKTtcbiAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICBjb25zdCBsaW5rcyA9IGdldExpbmtzKHsgY2FjaGUgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBsaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLmZpbGUucGF0aCB9KTtcbiAgICAgICAgICBpZiAoIWF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgoYXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChhdHRhY2htZW50RmlsZS5wYXJlbnQ/LnBhdGggPz8gJycpO1xuICAgICAgICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgICAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgICAgcmVzY3VlU3RpbGxVc2VkRmlsZTogdGhpcy5yZXNjdWVTdGlsbFVzZWRGaWxlLmJpbmQodGhpcyksXG4gICAgICAgICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcmVudEZvbGRlclBhdGhzLmRlbGV0ZSgnJyk7XG4gICAgYXdhaXQgY2xlYW51cEVtcHR5Rm9sZGVycyh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZW1wdHlGb2xkZXJCZWhhdmlvcjogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICBmb2xkZXJQYXRoczogWy4uLnBhcmVudEZvbGRlclBhdGhzXVxuICAgIH0pO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5maWxlLnBhdGhcbiAgICB9KTtcbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRm9sZGVyOiBhdHRhY2htZW50Rm9sZGVyUGF0aCB9KTtcblxuICAgIGlmICghYXR0YWNobWVudEZvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICFhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMuZmlsZS5wYXRoXG4gICAgICB9KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGb2xkZXIsXG4gICAgICByZXNjdWVTdGlsbFVzZWRGaWxlOiB0aGlzLnJlc2N1ZVN0aWxsVXNlZEZpbGUuYmluZCh0aGlzKSxcbiAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwXG4gICAgfSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNjdWVTdGlsbFVzZWRGaWxlKHJlc2N1ZVBhcmFtczogUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzY3VlUGFyYW1zLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogS2VlcHMgYSBmb2xkZXIgZGVsZXRpb24gZnJvbSBkZXN0cm95aW5nIGFuIGF0dGFjaG1lbnQgYSBub3RlIG91dHNpZGUgdGhhdCBmb2xkZXIgc3RpbGwgcmVmZXJlbmNlcy5cbiAqXG4gKiBEZWxldGluZyBhIE5PVEUgaXMgYWxyZWFkeSBzYWZlOiB7QGxpbmsgZGVsZXRlSWZOb3RVc2VkfSBkaXNjb3VudHMgdGhlIGRlbGV0ZWQgbm90ZSdzIG93biBiYWNrbGlua3MsIHNlZXNcbiAqIGFub3RoZXIgbm90ZSBzdGlsbCByZWZlcmVuY2luZyB0aGUgYXR0YWNobWVudCwgYW5kIGtlZXBzIGl0LiBEZWxldGluZyBhIEZPTERFUiB3YXMgbm90LCBiZWNhdXNlXG4gKiB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudH0gb25seSBsaXN0ZW5zIChgdmF1bHQub24oJ2RlbGV0ZScpYCkgYW5kIGJ5IHRoZSB0aW1lIGEgZm9sZGVyIGRlbGV0aW9uXG4gKiBpcyByZXBvcnRlZCBpdHMgY2hpbGRyZW4gYXJlIGFscmVhZHkgZ29uZS4gTm90aGluZyByZWFjdGl2ZSBjYW4gaGVscCwgc28gdGhpcyBjb21wb25lbnQgaW50ZXJjZXB0cyB0aGVcbiAqIGRlbGV0aW9uIHByaW1pdGl2ZXMgaW5zdGVhZDogYEZpbGVNYW5hZ2VyLnRyYXNoRmlsZWAgKHdoYXQgdGhlIGZpbGUtZXhwbG9yZXIgRGVsZXRlIGZsb3cgcmVhY2hlcyB0aHJvdWdoXG4gKiBgcHJvbXB0Rm9yRGVsZXRpb25gKSBwbHVzIHRoZSByYXcgYFZhdWx0LmRlbGV0ZWAgLyBgVmF1bHQudHJhc2hgIGEgcGx1Z2luIG1heSBjYWxsIGRpcmVjdGx5LlxuICpcbiAqIEEgZm9sZGVyIGRlbGV0aW9uIGlzIHNjYW5uZWQgZmlyc3QuIFdoZW4gbm90aGluZyBpbnNpZGUgaXQgaXMgc3RpbGwgcmVmZXJlbmNlZCBmcm9tIG91dHNpZGUgXHUyMDE0IHRoZVxuICogb3ZlcndoZWxtaW5nIG1ham9yaXR5IG9mIGRlbGV0aW9ucyBcdTIwMTQgdGhlIG9yaWdpbmFsIHJ1bnMgdW50b3VjaGVkLCBzbyB0aGUgbmF0aXZlIGJlaGF2aW9yIGlzIHByZXNlcnZlZFxuICogZXhhY3RseS4gT25seSB3aGVuIHNvbWV0aGluZyB3b3VsZCBiZSBsb3N0IGRvZXMgdGhpcyB0YWtlIG92ZXIsIHJlcGxheWluZyB0aGUgZGVsZXRpb24gdGhyb3VnaFxuICoge0BsaW5rIGRlbGV0ZUlmTm90VXNlZH06IGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgZm9sZGVyIGdvZXMsIHRoZSBzdGlsbC1yZWZlcmVuY2VkIGF0dGFjaG1lbnRzIGFuZCB0aGVcbiAqIGZvbGRlcnMgaG9sZGluZyB0aGVtIHN0YXksIGFuZCB0aGUgYGF0dGFjaG1lbnRJc1N0aWxsVXNlZGAgbm90aWNlIGZpcmVzLCBtaXJyb3JpbmcgdGhlIG5vdGUgY2FzZS5cbiAqXG4gKiBGaWxlcyBhcmUgbmV2ZXIgaW50ZXJjZXB0ZWQgXHUyMDE0IGRlbGV0aW5nIGEgZmlsZSBpcyB0aGUgdXNlciBuYW1pbmcgdGhhdCBmaWxlIGV4cGxpY2l0bHkuXG4gKi9cbmNsYXNzIERlbGV0ZVByb3RlY3Rpb25QYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJvb3RzIG9mIHRoZSBmb2xkZXIgZGVsZXRpb25zIGN1cnJlbnRseSBiZWluZyByZXBsYXllZC4gVGhlIHJlcGxheSBkZWxldGVzIHRocm91Z2ggdGhlIFVOUEFUQ0hFRFxuICAgKiBvcmlnaW5hbCwgc28gaXQgY2Fubm90IHJlLWVudGVyIHRoaXMgY29tcG9uZW50IGRpcmVjdGx5IFx1MjAxNCBidXQgYEZpbGVNYW5hZ2VyLnRyYXNoRmlsZWAgaXRzZWxmIGNhbGxzIGRvd25cbiAgICogaW50byBgVmF1bHQudHJhc2hgIC8gYFZhdWx0LmRlbGV0ZWAsIHdoaWNoIGFyZSBwYXRjaGVkIHRvbywgYW5kIHJlLXNjYW5uaW5nIGEgc3VidHJlZSBhbHJlYWR5IGJlaW5nXG4gICAqIHdhbGtlZCBpcyBwdXJlIHdhc3RlLiBTY29wZWQgYnkgcGF0aCByYXRoZXIgdGhhbiBieSBhIGZsYWcgc28gdGhhdCBhbiB1bnJlbGF0ZWQgZm9sZGVyIGRlbGV0aW9uXG4gICAqIGludGVybGVhdmluZyBvbiBhbiBgYXdhaXRgIGlzIHN0aWxsIHByb3RlY3RlZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwbGF5ZWRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkSW52b2tlSGFuZGxlcjogKCkgPT4gYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5zaG91bGRJbnZva2VIYW5kbGVyID0gcGFyYW1zLnNob3VsZEludm9rZUhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxGaWxlTWFuYWdlciwgJ3RyYXNoRmlsZSc+KHtcbiAgICAgICRvYmplY3Q6IEZpbGVNYW5hZ2VyLnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICd0cmFzaEZpbGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSwgb3JpZ2luYWxNZXRob2RCb3VuZCB9KSA9PlxuICAgICAgICB0aGlzLmhhbmRsZURlbGV0aW9uKGZpbGUsIGZhbGxiYWNrLCBhc3luYyAoYWJzdHJhY3RGaWxlKSA9PiB7XG4gICAgICAgICAgYXdhaXQgb3JpZ2luYWxNZXRob2RCb3VuZChhYnN0cmFjdEZpbGUpO1xuICAgICAgICB9KVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2RlbGV0ZSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdkZWxldGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlLCBmb3JjZV0sIG9yaWdpbmFsTWV0aG9kQm91bmQgfSkgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGlvbihmaWxlLCBmYWxsYmFjaywgYXN5bmMgKGFic3RyYWN0RmlsZSkgPT4ge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsTWV0aG9kQm91bmQoYWJzdHJhY3RGaWxlLCBmb3JjZSk7XG4gICAgICAgIH0pXG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAndHJhc2gnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2gnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlLCBzeXN0ZW1dLCBvcmlnaW5hbE1ldGhvZEJvdW5kIH0pID0+XG4gICAgICAgIHRoaXMuaGFuZGxlRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGFzeW5jIChhYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbE1ldGhvZEJvdW5kKGFic3RyYWN0RmlsZSwgc3lzdGVtKTtcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0cyB0aGUgcGF0aHMgb2YgZXZlcnkgbm90ZSBpbnNpZGUgdGhlIGZvbGRlci4gVGhleSBhcmUgdGhlIGxpbmsgc291cmNlcyB0aGF0IGRpc2FwcGVhciBhbG9uZyB3aXRoXG4gICAqIHRoZSBmb2xkZXIsIHNvIHRoZWlyIGJhY2tsaW5rcyBtdXN0IG5vdCBrZWVwIGFuIGF0dGFjaG1lbnQgYWxpdmUuXG4gICAqXG4gICAqIEBwYXJhbSBmb2xkZXIgLSBUaGUgZm9sZGVyIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBhZ2dyZWdhdGVkIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHBhdGhzIG9mIHRoZSBub3RlcyBpbnNpZGUgdGhlIGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgY29sbGVjdERlbGV0ZWROb3RlUGF0aHMoZm9sZGVyOiBURm9sZGVyLCBzZXR0aW5nczogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+KTogU2V0PHN0cmluZz4ge1xuICAgIGNvbnN0IGRlbGV0ZWROb3RlUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4oZm9sZGVyLCAoY2hpbGQpID0+IHtcbiAgICAgIGlmIChpc0ZpbGUoY2hpbGQpICYmIChzZXR0aW5ncy5pc05vdGU/LihjaGlsZC5wYXRoKSA/PyBmYWxzZSkpIHtcbiAgICAgICAgZGVsZXRlZE5vdGVQYXRocy5hZGQoY2hpbGQucGF0aCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRlbGV0ZWROb3RlUGF0aHM7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGF0dGFjaG1lbnRzIGluc2lkZSB0aGUgZm9sZGVyIHRoYXQgYSBub3RlIG91dHNpZGUgaXQgc3RpbGwgcmVmZXJlbmNlcywgYW5kIHdvdWxkIHRoZXJlZm9yZSBiZVxuICAgKiBkZXN0cm95ZWQgYnkgZGVsZXRpbmcgdGhlIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgYmVpbmcgZGVsZXRlZC5cbiAgICogQHBhcmFtIGRlbGV0ZWROb3RlUGF0aHMgLSBUaGUgcGF0aHMgb2YgdGhlIG5vdGVzIHRoYXQgZGlzYXBwZWFyIGFsb25nIHdpdGggdGhlIGZvbGRlci5cbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIGFnZ3JlZ2F0ZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBUaGUgcGF0aHMgb2YgdGhlIGF0dGFjaG1lbnRzIHRoYXQgbXVzdCBzdXJ2aXZlIHRoZSBkZWxldGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZFN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocyhcbiAgICBmb2xkZXI6IFRGb2xkZXIsXG4gICAgZGVsZXRlZE5vdGVQYXRoczogU2V0PHN0cmluZz4sXG4gICAgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPlxuICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgY2FuZGlkYXRlRmlsZXM6IFRGaWxlW10gPSBbXTtcbiAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4oZm9sZGVyLCAoY2hpbGQpID0+IHtcbiAgICAgIGlmIChpc0ZpbGUoY2hpbGQpICYmICEoc2V0dGluZ3MuaXNOb3RlPy4oY2hpbGQucGF0aCkgPz8gZmFsc2UpKSB7XG4gICAgICAgIGNhbmRpZGF0ZUZpbGVzLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGVGaWxlIG9mIGNhbmRpZGF0ZUZpbGVzKSB7XG4gICAgICBjb25zdCBiYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IGNhbmRpZGF0ZUZpbGUgfSk7XG4gICAgICBmb3IgKGNvbnN0IGRlbGV0ZWROb3RlUGF0aCBvZiBkZWxldGVkTm90ZVBhdGhzKSB7XG4gICAgICAgIGJhY2tsaW5rcy5jbGVhcihkZWxldGVkTm90ZVBhdGgpO1xuICAgICAgfVxuICAgICAgaWYgKGJhY2tsaW5rcy5jb3VudCgpICE9PSAwKSB7XG4gICAgICAgIHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocy5wdXNoKGNhbmRpZGF0ZUZpbGUucGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYSBkZWxldGlvbiBuZWVkcyBwcm90ZWN0aW5nIGFuZCwgaWYgc28sIHJlcGxhY2VzIGl0IHdpdGggYSBwcm90ZWN0ZWQgcmVwbGF5LlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSBmYWxsYmFjayAtIEludm9rZXMgdGhlIGludGVyY2VwdGVkIG1ldGhvZCB1bmNoYW5nZWQuXG4gICAqIEBwYXJhbSBkZWxldGVBYnN0cmFjdEZpbGUgLSBEZWxldGVzIGEgc2luZ2xlIGFic3RyYWN0IGZpbGUgdGhyb3VnaCB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kJ3MgdW5wYXRjaGVkIG9yaWdpbmFsLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRlbGV0aW9uIGlzIGRvbmUuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZURlbGV0aW9uKFxuICAgIGZpbGU6IFRBYnN0cmFjdEZpbGUsXG4gICAgZmFsbGJhY2s6ICgpID0+IFByb21pc2U8dm9pZD4sXG4gICAgZGVsZXRlQWJzdHJhY3RGaWxlOiAoYWJzdHJhY3RGaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiBQcm9taXNlPHZvaWQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5zaG91bGRDb25zaWRlckZvbGRlcihmaWxlKSkge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVwbGF5Rm9sZGVyRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGRlbGV0ZUFic3RyYWN0RmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgZm9sZGVyIHdoaWxlIGtlZXBpbmcgd2hhdGV2ZXIgaW5zaWRlIGl0IGlzIHN0aWxsIHJlZmVyZW5jZWQgZnJvbSBvdXRzaWRlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gZmFsbGJhY2sgLSBJbnZva2VzIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QgdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0gZGVsZXRlQWJzdHJhY3RGaWxlIC0gRGVsZXRlcyBhIHNpbmdsZSBhYnN0cmFjdCBmaWxlIHRocm91Z2ggdGhlIGludGVyY2VwdGVkIG1ldGhvZCdzIHVucGF0Y2hlZCBvcmlnaW5hbC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkZWxldGlvbiBpcyBkb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXBsYXlGb2xkZXJEZWxldGlvbihcbiAgICBmb2xkZXI6IFRGb2xkZXIsXG4gICAgZmFsbGJhY2s6ICgpID0+IFByb21pc2U8dm9pZD4sXG4gICAgZGVsZXRlQWJzdHJhY3RGaWxlOiAoYWJzdHJhY3RGaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiBQcm9taXNlPHZvaWQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgICBjb25zdCBkZWxldGVkTm90ZVBhdGhzID0gdGhpcy5jb2xsZWN0RGVsZXRlZE5vdGVQYXRocyhmb2xkZXIsIHNldHRpbmdzKTtcbiAgICBjb25zdCBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMgPSBhd2FpdCB0aGlzLmZpbmRTdGlsbFVzZWRBdHRhY2htZW50UGF0aHMoZm9sZGVyLCBkZWxldGVkTm90ZVBhdGhzLCBzZXR0aW5ncyk7XG5cbiAgICBpZiAoc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGVsZXRlUHJvdGVjdGlvbicpKGBOb3RoaW5nIHRvIHByb3RlY3QgaW4gJHtmb2xkZXIucGF0aH07IGRlbGV0aW5nIGl0IGFzIHVzdWFsLmApO1xuICAgICAgYXdhaXQgZmFsbGJhY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkZWxldGVQcm90ZWN0aW9uJykoXG4gICAgICBgUHJvdGVjdGluZyAke3N0aWxsVXNlZEF0dGFjaG1lbnRQYXRocy5sZW5ndGgudG9TdHJpbmcoKX0gc3RpbGwtcmVmZXJlbmNlZCBhdHRhY2htZW50KHMpIGZyb20gdGhlIGRlbGV0aW9uIG9mICR7Zm9sZGVyLnBhdGh9OiAke3RvSnNvbihzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMpfWBcbiAgICApO1xuXG4gICAgdGhpcy5yZXBsYXllZEZvbGRlclBhdGhzLmFkZChmb2xkZXIucGF0aCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGRlbGV0ZUFic3RyYWN0RmlsZSxcbiAgICAgICAgZGVsZXRlZE5vdGVQYXRoczogWy4uLmRlbGV0ZWROb3RlUGF0aHNdLFxuICAgICAgICBwYXRoT3JGaWxlOiBmb2xkZXIsXG4gICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgIHJlc2N1ZVN0aWxsVXNlZEZpbGU6IHRoaXMucmVzY3VlU3RpbGxVc2VkRmlsZS5iaW5kKHRoaXMpLFxuICAgICAgICAvKlxuICAgICAgICAgKiBUaGUgdXNlciBuYW1lZCBUSElTIGZvbGRlciwgc28gaXQgZ29lcyBldmVuIHVuZGVyIGBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXBgIFx1MjAxNCB0aGF0IHNldHRpbmdcbiAgICAgICAgICogZ292ZXJucyBmb2xkZXJzIGVtcHRpZWQgaW5jaWRlbnRhbGx5LCBub3QgdGhlIG9uZSBleHBsaWNpdGx5IGRlbGV0ZWQuIGBkZWxldGVJZk5vdFVzZWRgIHN0aWxsXG4gICAgICAgICAqIHJlZnVzZXMgdG8gcmVtb3ZlIGFueSBmb2xkZXIgd2hvc2UgY2hpbGQgaGFkIHRvIGJlIGtlcHQsIHdoaWNoIGlzIHRoZSBwcm90ZWN0aW9uIHdhbnRlZCBoZXJlLlxuICAgICAgICAgKi9cbiAgICAgICAgc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzOiB0cnVlLFxuICAgICAgICAvKlxuICAgICAgICAgKiBBIG5vdGUgdGhhdCBvdGhlcnMgbGluayB0byBpcyBkZWxldGVkIGFzIG5vcm1hbDsgT2JzaWRpYW4gbGVhdmVzIHRoZSBkYW5nbGluZyBsaW5rLiBQcm90ZWN0aW5nXG4gICAgICAgICAqIG5vdGVzIHRvbyB3b3VsZCBtYWtlIGRlbGV0aW5nIGEgZm9sZGVyIG9mIGxpbmtlZC10byBub3RlcyBpbXBvc3NpYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgc2hvdWxkUHJvdGVjdElmU3RpbGxVc2VkOiAoY2FuZGlkYXRlRmlsZSkgPT4gIShzZXR0aW5ncy5pc05vdGU/LihjYW5kaWRhdGVGaWxlLnBhdGgpID8/IGZhbHNlKVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucmVwbGF5ZWRGb2xkZXJQYXRocy5kZWxldGUoZm9sZGVyLnBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzY3VlU3RpbGxVc2VkRmlsZShyZXNjdWVQYXJhbXM6IFJlc2N1ZVN0aWxsVXNlZEZpbGVQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgIHJlc2N1ZVBhcmFtcyxcbiAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIGRlbGV0aW9uIGlzIGEgZm9sZGVyIGRlbGV0aW9uIHRoaXMgaGFuZGxlciBpcyByZXNwb25zaWJsZSBmb3IgcHJvdGVjdGluZy5cbiAgICpcbiAgICogRXZlcnkgY2hlY2sgaGVyZSBpcyBzeW5jaHJvbm91cyBhbmQgY2hlYXAsIHNvIGEgZmlsZSBkZWxldGlvbiBcdTIwMTQgdGhlIG92ZXJ3aGVsbWluZyBtYWpvcml0eSBcdTIwMTQgY29zdHMgb25lXG4gICAqIHtAbGluayBpc0ZvbGRlcn0gY2FsbCBhbmQgcmVhY2hlcyB0aGUgb3JpZ2luYWwgdW50b3VjaGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBkZWxldGlvbiBzaG91bGQgYmUgc2Nhbm5lZCBiZWZvcmUgaXQgcnVucy5cbiAgICovXG4gIHByaXZhdGUgc2hvdWxkQ29uc2lkZXJGb2xkZXIoZmlsZTogVEFic3RyYWN0RmlsZSk6IGZpbGUgaXMgVEZvbGRlciB7XG4gICAgaWYgKCFpc0ZvbGRlcihmaWxlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zaG91bGRJbnZva2VIYW5kbGVyKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGZpbGUucGF0aCkgPz8gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlcGxheWVkRm9sZGVyUGF0aCBvZiB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMpIHtcbiAgICAgIGlmIChpc0NoaWxkT3JTZWxmKHsgYXBwOiB0aGlzLmFwcCwgY2hpbGRQYXRoT3JGaWxlOiBmaWxlLnBhdGgsIHBhcmVudFBhdGhPckZpbGU6IHJlcGxheWVkRm9sZGVyUGF0aCB9KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuY2xhc3MgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU1hbmFnZXI6IEZpbGVNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuZmlsZU1hbmFnZXIgPSBwYXJhbXMuZmlsZU1hbmFnZXI7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogdGhpcy5maWxlTWFuYWdlcixcbiAgICAgIG1ldGhvZE5hbWU6ICdydW5Bc3luY0xpbmtVcGRhdGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoe1xuICAgICAgICBmYWxsYmFjayxcbiAgICAgICAgb3JpZ2luYWxBcmd1bWVudHM6IFtsaW5rVXBkYXRlc0hhbmRsZXJdLFxuICAgICAgICBvcmlnaW5hbE1ldGhvZCxcbiAgICAgICAgb3JpZ2luYWxNZXRob2RCb3VuZFxuICAgICAgfSkgPT4ge1xuICAgICAgICBpZiAoaGFzUGF0Y2hUb2tlbihvcmlnaW5hbE1ldGhvZCwgUEFUQ0hfVE9LRU4pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdIYW5kbGVyOiBMaW5rVXBkYXRlc0hhbmRsZXIgPSAobGlua1VwZGF0ZXMpID0+IHRoaXMud3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcywgbGlua1VwZGF0ZXNIYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kQm91bmQobmV3SGFuZGxlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyYXBMaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXM6IExpbmtVcGRhdGVbXSwgbGlua1VwZGF0ZXNIYW5kbGVyOiBMaW5rVXBkYXRlc0hhbmRsZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaXNSZW5hbWVDYWxsZWQgPSBmYWxzZTtcbiAgICBsZXQgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkID0gZmFsc2U7XG4gICAgY29uc3QgZXZlbnRSZWYgPSB0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgKGZpbGUsIG9sZFBhdGgpID0+IHtcbiAgICAgIGlzUmVuYW1lQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIC8qXG4gICAgICAgKiBBIHJlbmFtZSBwZXJmb3JtZWQgaW5zaWRlIGEgZm9yZWlnbiBwbHVnaW4ncyBpbi1mbGlnaHQgbG9ja2VkIHRyYW5zYWN0aW9uICh3aGljaCBsb2NrcyB0aGVcbiAgICAgICAqIGFmZmVjdGVkIGZvbGRlciBzdWJ0cmVlLCBlLmcuIEFkdmFuY2VkIE5vdGUgQ29tcG9zZXIncyBmb2xkZXIgbWVyZ2UpIGlzIG93bmVkIGJ5IHRoYXRcbiAgICAgICAqIHRyYW5zYWN0aW9uLCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgaXRzIG93biBsaW5rIGNvbnNpc3RlbmN5LiBUaGlzIGhhbmRsZXIgZGVsaWJlcmF0ZWx5IGRvZXNcbiAgICAgICAqIE5PVCByZXdyaXRlIGxpbmtzIGZvciBpdCwgc28gc3VwcHJlc3NpbmcgT2JzaWRpYW4ncyBuYXRpdmUgbGluayB1cGRhdGUgYmVsb3cgd291bGQgbGVhdmUgdGhlXG4gICAgICAgKiBsaW5rcyBkYW5nbGluZy4gTGV0IHRoZSBuYXRpdmUgdXBkYXRlIHByb2NlZWQgdW50b3VjaGVkLiBTZWVcbiAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1hZHZhbmNlZC1ub3RlLWNvbXBvc2VyL2lzc3Vlcy8xNDYuXG4gICAgICAgKi9cbiAgICAgIGlmIChpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIGZpbGUucGF0aCkgfHwgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBvbGRQYXRoKSkge1xuICAgICAgICBpc0ZvcmVpZ25Mb2NrZWRSZW5hbWVDYWxsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBsaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmFwcC52YXVsdC5vZmZyZWYoZXZlbnRSZWYpO1xuICAgIH1cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gSXQgbWlnaHQgY2hhbmdlZCBpbiBgcmVuYW1lYCBldmVudCBoYW5kbGVyLiBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gICAgaWYgKCFpc1JlbmFtZUNhbGxlZCB8fCAhc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyB8fCBpc0ZvcmVpZ25Mb2NrZWRSZW5hbWVDYWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmaWx0ZXJJblBsYWNlKFxuICAgICAgbGlua1VwZGF0ZXMsXG4gICAgICAobGlua1VwZGF0ZSkgPT4ge1xuICAgICAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGxpbmtVcGRhdGUuc291cmNlRmlsZS5wYXRoKSkge1xuICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnJ1bkFzeW5jTGlua1VwZGF0ZScpKFxuICAgICAgICAgICAgYFJvbGwgYmFjayB0byBkZWZhdWx0IGxpbmsgdXBkYXRlIG9mIHNvdXJjZSBmaWxlICR7bGlua1VwZGF0ZS5zb3VyY2VGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGxpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6cnVuQXN5bmNMaW5rVXBkYXRlJykoXG4gICAgICAgICAgICBgUm9sbCBiYWNrIHRvIGRlZmF1bHQgbGluayB1cGRhdGUgb2YgcmVzb2x2ZWQgZmlsZSAke2xpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYXBwLmludGVybmFsUGx1Z2lucy5nZXRFbmFibGVkUGx1Z2luQnlJZChJbnRlcm5hbFBsdWdpbk5hbWUuQ2FudmFzKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFwcC5wbHVnaW5zLmdldFBsdWdpbignYmFja2xpbmstY2FjaGUnKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5rVXBkYXRlLnNvdXJjZUZpbGUuZXh0ZW5zaW9uID09PSBDQU5WQVNfRklMRV9FWFRFTlNJT04pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5leHRlbnNpb24gPT09IENBTlZBU19GSUxFX0VYVEVOU0lPTikge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuY2xhc3MgSGFuZGxlZFJlbmFtZXMge1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBIYW5kbGVkUmVuYW1lS2V5PigpO1xuXG4gIHB1YmxpYyBhZGQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5zZXQodGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSwgeyBuZXdQYXRoLCBvbGRQYXRoIH0pO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZShvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLmRlbGV0ZSh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXMob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzKHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCkpO1xuICB9XG5cbiAgcHVibGljIGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxIYW5kbGVkUmVuYW1lS2V5PiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLnZhbHVlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBrZXlUb1N0cmluZyhvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gO1xuICB9XG59XG5cbmNsYXNzIE1ldGFkYXRhRGVsZXRlZEhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogTWV0YWRhdGFEZWxldGVkSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IHBhcmFtcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcDtcbiAgICB0aGlzLmZpbGUgPSBwYXJhbXMuZmlsZTtcbiAgICB0aGlzLnByZXZpb3VzQ2FjaGUgPSBwYXJhbXMucHJldmlvdXNDYWNoZTtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlKCk6IHZvaWQge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/Lih0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZU1ldGFkYXRhRGVsZXRlZCcpKGBTa2lwcGluZyBtZXRhZGF0YSBkZWxldGUgaGFuZGxlciBvZiAke3RoaXMuZmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc01hcmtkb3duRmlsZSh0aGlzLmZpbGUpICYmIHRoaXMucHJldmlvdXNDYWNoZSkge1xuICAgICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5zZXQodGhpcy5maWxlLnBhdGgsIHRoaXMucHJldmlvdXNDYWNoZSk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFJlbmFtZUhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVkUmVuYW1lczogSGFuZGxlZFJlbmFtZXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiBNYXA8c3RyaW5nLCBJbnRlcnJ1cHRlZFJlbmFtZVtdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50ID0gcGFyYW1zLnJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgICB0aGlzLmhhbmRsZWRSZW5hbWVzID0gcGFyYW1zLmhhbmRsZWRSZW5hbWVzO1xuICAgIHRoaXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCA9IHBhcmFtcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwID8/IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuICAgIHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwID0gcGFyYW1zLmludGVycnVwdGVkUmVuYW1lc01hcDtcbiAgICB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID0gcGFyYW1zLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyO1xuICAgIHRoaXMubmV3UGF0aCA9IHBhcmFtcy5uZXdQYXRoO1xuICAgIHRoaXMub2xkQ2FjaGUgPSBwYXJhbXMub2xkQ2FjaGU7XG4gICAgdGhpcy5vbGRQYXRoID0gcGFyYW1zLm9sZFBhdGg7XG4gICAgdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwID0gcGFyYW1zLm9sZFBhdGhCYWNrbGlua3NNYXA7XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMub2xkUGF0aCA9PT0gdGhpcy5uZXdQYXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIC8qXG4gICAgICogVGhlIHJlbmFtZSB0aGF0IHRyaWdnZXJlZCB0aGlzIGhhbmRsZXIgaXMgdmVyeSBsaWtlbHkgc3RpbGwgaW5zaWRlIE9ic2lkaWFuJ3Mgb3duXG4gICAgICogYEZpbGVNYW5hZ2VyLnJ1bkFzeW5jTGlua1VwZGF0ZWAgY3ljbGUsIHdoaWNoIGlzIGFib3V0IHRvIGRlY2lkZSBcdTIwMTQgc3luY2hyb25vdXNseSBcdTIwMTQgd2hpY2ggbGlua3MgdG9cbiAgICAgKiByZXdyaXRlLCBieSByZS1yZXNvbHZpbmcgZWFjaCBvbmUuIEV2ZXJ5dGhpbmcgYmVsb3cgdGVtcG9yYXJpbHkgcmVnaXN0ZXJzIGEgcGhhbnRvbSBmaWxlIGF0IHRoZVxuICAgICAqIG9sZCBwYXRoIChgcmVnaXN0ZXJGaWxlc2AsIGRpcmVjdGx5IGhlcmUgYW5kIGluc2lkZSBgUmVuYW1lTWFwYCkgYW5kIGhvbGRzIGl0IGFjcm9zcyBhbiBgYXdhaXRgO1xuICAgICAqIHNlZW4gbWlkLWRlY2lzaW9uLCB0aGF0IHBoYW50b20gbWFrZXMgdGhlIG9sZCBwYXRoIHN0aWxsIHJlc29sdmUsIHNvIE9ic2lkaWFuIGNvbmNsdWRlcyBub3RoaW5nXG4gICAgICogY2hhbmdlZCBhbmQgcmV3cml0ZXMgbm90aGluZy4gU3RhbmRpbmcgaW52YXJpYW50OiBuZXZlciB0b3VjaCB0aGUgdmF1bHQgaW5kZXggd2hpbGUgT2JzaWRpYW4gaXNcbiAgICAgKiBtaWQtZGVjaXNpb24uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tY3VzdG9tLWF0dGFjaG1lbnQtbG9jYXRpb24vaXNzdWVzLzQ3LlxuICAgICAqL1xuICAgIGF3YWl0IHdhaXRGb3JQZW5kaW5nTGlua1VwZGF0ZXModGhpcy5hcHApO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGF3YWl0IHRoaXMuY29udGludWVJbnRlcnJ1cHRlZFJlbmFtZXMoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAvLyBUaGUgcmVmcmVzaGVkIGJhY2tsaW5rcyBmZWVkIGBvbGRQYXRoQmFja2xpbmtzTWFwYCwgd2hpY2ggb25seSB0aGUgbGluay1yZXdyaXRlIHN0ZXBzIGJlbG93IHJlYWQsIGFuZCB0aG9zZSBhcmUgZ2F0ZWQgb24gdGhlIHNhbWUgZmxhZy5cbiAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKS5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2hMaW5rcygpO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIH1cblxuICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZUNhc2VDb2xsaXNpb24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGNvbnN0IHBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuXG4gICAgY29uc3QgcmVuYW1lZEZpbGVQYXRocyA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSgncmVuYW1lZEZpbGVQYXRocycsIG5ldyBTZXQ8c3RyaW5nPigpKS52YWx1ZTtcbiAgICBjb25zdCByZW5hbWVkTGlua3MgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoJ3JlbmFtZWRMaW5rUGF0aHMnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVuYW1lTWFwID0gbmV3IFJlbmFtZU1hcCh7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBuZXdQYXRoOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgcmVuYW1lTWFwLmZpbGwoKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgICBjb25zdCBjb21iaW5lZEJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG4gICAgICAvLyBCYWNrbGlua3MgYXJlIG9ubHkgY29uc3VtZWQgYnkgdGhlIGxpbmstcmV3cml0ZSBzdGVwcyBiZWxvdywgd2hpY2ggYXJlIGdhdGVkIG9uXG4gICAgICAvLyBgc2hvdWxkSGFuZGxlUmVuYW1lc2AuIFNraXAgZ2F0aGVyaW5nIHRoZW0gKGEgYmFja2xpbmsgZmV0Y2ggcGVyIGF0dGFjaG1lbnQpIG9uIGEgbW92ZS1vbmx5IHJlbmFtZS5cbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICAgIHJlbmFtZU1hcC5pbml0T3JpZ2luYWxMaW5rc01hcChjb21iaW5lZEJhY2tsaW5rc01hcCk7XG4gICAgICAgIHJlbmFtZU1hcC5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBwYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgc2luZ2xlQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBhdHRhY2htZW50T2xkUGF0aCBvZiByZW5hbWVNYXAua2V5cygpKSB7XG4gICAgICAgICAgaWYgKGF0dGFjaG1lbnRPbGRQYXRoID09PSB0aGlzLm9sZFBhdGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogYXR0YWNobWVudE9sZFBhdGggfSk7XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3NNYXAgPSBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rcy5kYXRhO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICByZW5hbWVNYXAuaW5pdEJhY2tsaW5rc01hcCh7XG4gICAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICAgIHBhdGg6IGF0dGFjaG1lbnRPbGRQYXRoLFxuICAgICAgICAgICAgc2luZ2xlQmFja2xpbmtzTWFwOiBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudEZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgW29sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aF0gb2YgcmVuYW1lTWFwLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAob2xkQXR0YWNobWVudFBhdGggIT09IHRoaXMub2xkUGF0aCkge1xuICAgICAgICAgIGNvbnN0IGZpeGVkTmV3QXR0YWNobWVudFBhdGggPSBhd2FpdCB0aGlzLnJlbmFtZUhhbmRsZWQob2xkQXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoKTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgcmVuYW1lTWFwLnNldChvbGRBdHRhY2htZW50UGF0aCwgZml4ZWROZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzTWFuYWdlci5pc05vdGVFeChvbGRBdHRhY2htZW50UGF0aCkpIHtcbiAgICAgICAgICBwYXJlbnRGb2xkZXJQYXRocy5hZGQoZGlybmFtZShvbGRBdHRhY2htZW50UGF0aCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGNsZWFudXBFbXB0eUZvbGRlcnMoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBlbXB0eUZvbGRlckJlaGF2aW9yOiBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID8/IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcCxcbiAgICAgICAgZm9sZGVyUGF0aHM6IFsuLi5wYXJlbnRGb2xkZXJQYXRoc11cbiAgICAgIH0pO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICAvKlxuICAgICAgICogVGhlIGF0dGFjaG1lbnQgbW92ZSBhYm92ZSBydW5zIHJlZ2FyZGxlc3Mgb2YgYHNob3VsZEhhbmRsZVJlbmFtZXNgICh0aGF0IGlzIHRoZSBwb2ludCBvZiBkZWNvdXBsaW5nXG4gICAgICAgKiBcIk1vdmUgYXR0YWNobWVudHMgd2l0aCBub3RlXCIgZnJvbSBcIlVwZGF0ZSBsaW5rc1wiKS4gVGhlIHJlbWFpbmluZyBzdGVwcyBvbmx5IHJld3JpdGUgbGlua3MsIHNvIHNraXBcbiAgICAgICAqIHRoZW0gd2hlbiBsaW5rIHVwZGF0ZXMgYXJlIGRpc2FibGVkOyB0aGUgYGZpbmFsbHlgIGJsb2NrIGJlbG93IHN0aWxsIHJ1bnMuXG4gICAgICAgKi9cbiAgICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhY2tsaW5rRW50cmllcyA9IFsuLi5jb21iaW5lZEJhY2tsaW5rc01hcCwgLi4udGhpcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwXTtcbiAgICAgIGxldCBwcm9jZXNzZWRCYWNrbGlua0ZpbGVzID0gMDtcbiAgICAgIGZvciAoY29uc3QgW25ld0JhY2tsaW5rUGF0aCwgbGlua0tleVRvUGF0aE1hcF0gb2YgYmFja2xpbmtFbnRyaWVzKSB7XG4gICAgICAgIGxldCBsaW5rSW5kZXggPSAwO1xuICAgICAgICBhd2FpdCBlZGl0TGlua3Moe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgICAgICAgIGxpbmtJbmRleCsrO1xuICAgICAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudFBhdGggPSBsaW5rS2V5VG9QYXRoTWFwLmdldChnZXRMaW5rSWRlbnRpdHlLZXkobGluaykpO1xuICAgICAgICAgICAgaWYgKCFvbGRBdHRhY2htZW50UGF0aCkge1xuICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgKiBBIGxpbmsgdGhhdCBpcyBub3QgaW4gdGhlIHNuYXBzaG90IHdhcyBlaXRoZXIgbmV2ZXIgb3VycyB0byByZXdyaXRlLCBvciB3YXMgYWxyZWFkeVxuICAgICAgICAgICAgICAgKiByZXdyaXR0ZW4gYnkgc29tZW9uZSBlbHNlIChsZWF2aW5nIGl0IGNvcnJlY3QpLiBFaXRoZXIgd2F5IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gLVxuICAgICAgICAgICAgICAgKiBidXQgbG9nIGl0LCBiZWNhdXNlIGEgc2lsZW50IHNraXAgaGVyZSBpcyBleGFjdGx5IGhvd1xuICAgICAgICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tY3VzdG9tLWF0dGFjaG1lbnQtbG9jYXRpb24vaXNzdWVzLzYwIHN0YXllZFxuICAgICAgICAgICAgICAgKiBpbnZpc2libGU6IGV2ZXJ5IHNraXBwZWQgbGluayBsZWZ0IGEgYnJva2VuIGVtYmVkIGFuZCByZXBvcnRlZCBub3RoaW5nLlxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6dXBkYXRlQmFja2xpbmtzJykoXG4gICAgICAgICAgICAgICAgYE5vIHNuYXBzaG90IGVudHJ5IGZvciBsaW5rICR7dG9Kc29uKGxpbmspfSBpbiAke25ld0JhY2tsaW5rUGF0aH07IGxlYXZpbmcgaXQgdW5jaGFuZ2VkLmBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50UGF0aCA9IHJlbmFtZU1hcC5nZXQob2xkQXR0YWNobWVudFBhdGgpID8/IG9sZEF0dGFjaG1lbnRQYXRoO1xuXG4gICAgICAgICAgICByZW5hbWVkRmlsZVBhdGhzLmFkZChuZXdCYWNrbGlua1BhdGgpO1xuICAgICAgICAgICAgcmVuYW1lZExpbmtzLmFkZChgJHtuZXdCYWNrbGlua1BhdGh9Ly8ke1N0cmluZyhsaW5rSW5kZXgpfWApO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua1BhcmFtcz4oe1xuICAgICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgICBsaW5rLFxuICAgICAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBuZXdCYWNrbGlua1BhdGgsXG4gICAgICAgICAgICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgICAgICBvbGRUYXJnZXRQYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50UGF0aCxcbiAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBwYXRoT3JGaWxlOiBuZXdCYWNrbGlua1BhdGgsXG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIHByb2Nlc3NlZEJhY2tsaW5rRmlsZXMrKztcbiAgICAgICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcj8uKHtcbiAgICAgICAgICBjdXJyZW50UGF0aDogbmV3QmFja2xpbmtQYXRoLFxuICAgICAgICAgIHByb2Nlc3NlZDogcHJvY2Vzc2VkQmFja2xpbmtGaWxlcyxcbiAgICAgICAgICB0b3RhbDogYmFja2xpbmtFbnRyaWVzLmxlbmd0aFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTm90ZSh0aGlzLm5ld1BhdGgpKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZUxpbmtzSW5GaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rc0luRmlsZVBhcmFtcz4oe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2UsXG4gICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWdldEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGggfSkpIHtcbiAgICAgICAgbGV0IGludGVycnVwdGVkUmVuYW1lcyA9IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLmdldCh0aGlzLm5ld1BhdGgpO1xuICAgICAgICBpZiAoIWludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lcyA9IFtdO1xuICAgICAgICAgIHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLnNldCh0aGlzLm5ld1BhdGgsIGludGVycnVwdGVkUmVuYW1lcyk7XG4gICAgICAgIH1cbiAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzLnB1c2goe1xuICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3Qgb3JwaGFuS2V5cyA9IFsuLi50aGlzLmhhbmRsZWRSZW5hbWVzLmtleXMoKV07XG4gICAgICBhZGRUb1F1ZXVlKHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBvcnBoYW5LZXkgb2Ygb3JwaGFuS2V5cykge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVkUmVuYW1lcy5kZWxldGUob3JwaGFuS2V5Lm9sZFBhdGgsIG9ycGhhbktleS5uZXdQYXRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVuYW1lZExpbmtzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIudXBkYXRlZExpbmtzLCB7IGZpbGVzQ291bnQ6IHJlbmFtZWRGaWxlUGF0aHMuc2l6ZSwgbGlua3NDb3VudDogcmVuYW1lZExpbmtzLnNpemUgfSkpO1xuICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuY2xlYXIoKTtcbiAgICAgICAgICByZW5hbWVkTGlua3MuY2xlYXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlT3JwaGFuZWRSZW5hbWVzKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb250aW51ZUludGVycnVwdGVkUmVuYW1lcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5nZXQodGhpcy5vbGRQYXRoKTtcbiAgICBpZiAoaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgIGZvciAoY29uc3QgaW50ZXJydXB0ZWRSZW5hbWUgb2YgaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgICAgIGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IGludGVycnVwdGVkUmVuYW1lLmNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgICAgIG9sZFBhdGg6IGludGVycnVwdGVkUmVuYW1lLm9sZFBhdGgsXG4gICAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ2FzZUNvbGxpc2lvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWdldERhdGFBZGFwdGVyRXgodGhpcy5hcHApLmluc2Vuc2l0aXZlIHx8IHRoaXMub2xkUGF0aC50b0xvd2VyQ2FzZSgpICE9PSB0aGlzLm5ld1BhdGgudG9Mb3dlckNhc2UoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBvcmFyeVBhdGggPSBqb2luKGRpcm5hbWUodGhpcy5uZXdQYXRoKSwgYF9fdGVtcF9fJHtiYXNlbmFtZSh0aGlzLm5ld1BhdGgpfWApO1xuICAgIGF3YWl0IHRoaXMucmVuYW1lSGFuZGxlZCh0aGlzLm5ld1BhdGgsIHRlbXBvcmFyeVBhdGgpO1xuXG4gICAgYXdhaXQgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgICBuZXdQYXRoOiB0ZW1wb3JhcnlQYXRoLFxuICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICB9KS5oYW5kbGUoKTtcblxuICAgIGF3YWl0IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGUoZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRlbXBvcmFyeVBhdGggfSksIHRoaXMubmV3UGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hMaW5rcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmYWtlT2xkRmlsZSA9IGdldEZpbGUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgICBsZXQgb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICAgIHtcbiAgICAgIHVzaW5nIF9yZWdpc3RyYXRpb24gPSByZWdpc3RlckZpbGVzKHRoaXMuYXBwLCBbZmFrZU9sZEZpbGVdKTtcbiAgICAgIGNvbnN0IGZha2VPbGRGaWxlQmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBmYWtlT2xkRmlsZSB9KTtcbiAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQgPSBmYWtlT2xkRmlsZUJhY2tsaW5rcy5kYXRhO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2JhY2tsaW5rUGF0aCwgcmVmcmVzaGVkTGlua3NdIG9mIG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQpIHtcbiAgICAgIGxldCBvbGRMaW5rcyA9IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcC5nZXQoYmFja2xpbmtQYXRoKTtcbiAgICAgIGlmICghb2xkTGlua3MpIHtcbiAgICAgICAgb2xkTGlua3MgPSBbXTtcbiAgICAgICAgdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLnNldChiYWNrbGlua1BhdGgsIG9sZExpbmtzKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBsaW5rIG9mIHJlZnJlc2hlZExpbmtzKSB7XG4gICAgICAgIGlmIChvbGRMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG9sZExpbmtzLnB1c2gobGluayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW5hbWVIYW5kbGVkKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBuZXdQYXRoID0gZ2V0U2FmZVJlbmFtZVBhdGgoeyBhcHA6IHRoaXMuYXBwLCBuZXdQYXRoLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IG9sZFBhdGggfSk7XG4gICAgaWYgKG9sZFBhdGggPT09IG5ld1BhdGgpIHtcbiAgICAgIHJldHVybiBuZXdQYXRoO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmFkZChvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICBuZXdQYXRoID0gYXdhaXQgcmVuYW1lU2FmZSh7IGFwcDogdGhpcy5hcHAsIG5ld1BhdGgsIG9sZFBhdGhPckFic3RyYWN0RmlsZTogb2xkUGF0aCB9KTtcbiAgICByZXR1cm4gbmV3UGF0aDtcbiAgfVxufVxuXG5jbGFzcyBSZW5hbWVNYXAge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZU1hcENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICAgIHRoaXMub2xkQ2FjaGUgPSBwYXJhbXMub2xkQ2FjaGU7XG4gICAgdGhpcy5vbGRQYXRoID0gcGFyYW1zLm9sZFBhdGg7XG4gICAgdGhpcy5uZXdQYXRoID0gcGFyYW1zLm5ld1BhdGg7XG4gICAgdGhpcy5vbGRQYXRoTGlua3MgPSB0aGlzLm9sZENhY2hlID8gZ2V0TGlua3MoeyBjYWNoZTogdGhpcy5vbGRDYWNoZSB9KSA6IFtdO1xuICB9XG5cbiAgcHVibGljIGVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBzdHJpbmddPiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmVudHJpZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBmaWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICB0aGlzLm1hcC5zZXQodGhpcy5vbGRQYXRoLCB0aGlzLm5ld1BhdGgpO1xuXG4gICAgaWYgKCFpc05vdGUodGhpcy5vbGRQYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ic2lkaWFuIGRvZXMgbm90IGluZGV4IGEgY2FudmFzIGZpbGUgaW50byB0aGUgbWV0YWRhdGEgY2FjaGUuXG4gICAgLy8gVGhlIGNhY2hlLWRlcml2ZWQgYG9sZFBhdGhMaW5rc2AgaXMgZW1wdHkgZm9yIGEgY2FudmFzLCBoaWRpbmcgaXRzIGVtYmVkZGVkIGF0dGFjaG1lbnRzLlxuICAgIC8vIFJlYWRpbmcgdGhlIGNhbnZhcyByZWZlcmVuY2VzIGRpcmVjdGx5IG1vdmVzIHRoZW0gd2l0aCB0aGUgY2FudmFzIChtaXJyb3Jpbmcgbm90ZSBiZWhhdmlvcikuXG4gICAgLy8gVGhlIGZpbGUgYWxyZWFkeSBsaXZlcyBhdCB0aGUgbmV3IHBhdGggYWZ0ZXIgdGhlIHJlbmFtZSwgc28gcmVhZCB0aGUgcmVmZXJlbmNlcyBmcm9tIHRoZXJlLlxuICAgIGlmIChpc0NhbnZhc0ZpbGUodGhpcy5vbGRQYXRoKSkge1xuICAgICAgY29uc3QgY2FudmFzUmVmZXJlbmNlcyA9IGF3YWl0IGdldENhbnZhc1JlZmVyZW5jZXModGhpcy5hcHAsIHRoaXMubmV3UGF0aCk7XG4gICAgICB0aGlzLm9sZFBhdGhMaW5rcy5wdXNoKC4uLmNhbnZhc1JlZmVyZW5jZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGNvbnN0IG9sZEZpbGUgPSBnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCB0aGlzLmdldE9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKG9sZEZpbGUpO1xuXG4gICAgY29uc3QgbmV3QXR0YWNobWVudEZvbGRlclBhdGggPSBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyXG4gICAgICA/IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGhcbiAgICAgIH0pXG4gICAgICA6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoO1xuXG4gICAgY29uc3QgaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID0gb2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09ICcvJztcblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGb2xkZXI6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoIH0pO1xuXG4gICAgaWYgKCFvbGRBdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGVzOiBURmlsZVtdID0gW107XG5cbiAgICBpZiAoXG4gICAgICBhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMub2xkUGF0aFxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIFZhdWx0LnJlY3Vyc2VDaGlsZHJlbihvbGRBdHRhY2htZW50Rm9sZGVyLCAob2xkQXR0YWNobWVudEZpbGUpID0+IHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBpZiAoaXNGaWxlKG9sZEF0dGFjaG1lbnRGaWxlKSkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qgb2xkUGF0aExpbmsgb2YgdGhpcy5vbGRQYXRoTGlua3MpIHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7IGFwcDogdGhpcy5hcHAsIGxpbms6IG9sZFBhdGhMaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGggfSk7XG4gICAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgfHwgb2xkQXR0YWNobWVudEZpbGUucGF0aC5zdGFydHNXaXRoKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlIH0pO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KG9sZEF0dGFjaG1lbnRCYWNrbGlua3Mua2V5cygpKTtcbiAgICAgICAgICBrZXlzLmRlbGV0ZSh0aGlzLm9sZFBhdGgpO1xuICAgICAgICAgIGtleXMuZGVsZXRlKHRoaXMubmV3UGF0aCk7XG4gICAgICAgICAgaWYgKGtleXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgb2xkQXR0YWNobWVudEZpbGVzLnB1c2gob2xkQXR0YWNobWVudEZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgb2Ygb2xkQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdBdHRhY2htZW50RmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZpbGVQYXRoKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgIG9sZE5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPyBvbGRBdHRhY2htZW50RmlsZS5wYXRoIDogcmVsYXRpdmUob2xkQXR0YWNobWVudEZvbGRlclBhdGgsIG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpO1xuICAgICAgICBjb25zdCBuZXdGb2xkZXIgPSBqb2luKG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoLCBkaXJuYW1lKHJlbGF0aXZlUGF0aCkpO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSBqb2luKG5ld0ZvbGRlciwgb2xkQXR0YWNobWVudEZpbGUubmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoID09PSBuZXdBdHRhY2htZW50RmlsZVBhdGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cykge1xuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50RmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBuZXdBdHRhY2htZW50RmlsZVBhdGggfSk7XG4gICAgICAgIGlmIChuZXdBdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmZpbGxSZW5hbWVNYXAnKShgUmVtb3ZpbmcgY29uZmxpY3RpbmcgYXR0YWNobWVudCAke25ld0F0dGFjaG1lbnRGaWxlLnBhdGh9LmApO1xuICAgICAgICAgIGF3YWl0IHRyYXNoU2FmZSh0aGlzLmFwcCwgbmV3QXR0YWNobWVudEZpbGUpO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGlyZWN0b3J5ID0gZGlybmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGJhc2VOYW1lID0gYmFzZW5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoLCBleHRlbnNpb24pO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSB0aGlzLmFwcC52YXVsdC5nZXRBdmFpbGFibGVQYXRoKGpvaW4oZGlyZWN0b3J5LCBiYXNlTmFtZSksIGV4dGVuc2lvbi5zbGljZSgxKSk7XG4gICAgICB9XG4gICAgICB0aGlzLm1hcC5zZXQob2xkQXR0YWNobWVudEZpbGUucGF0aCwgbmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0KG9sZFBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChvbGRQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0QmFja2xpbmtzTWFwKHBhcmFtczogUmVuYW1lTWFwSW5pdEJhY2tsaW5rc01hcFBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgcGF0aCxcbiAgICAgIHNpbmdsZUJhY2tsaW5rc01hcFxuICAgIH0gPSBwYXJhbXM7XG4gICAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCBsaW5rc10gb2Ygc2luZ2xlQmFja2xpbmtzTWFwKSB7XG4gICAgICBjb25zdCBuZXdCYWNrbGlua1BhdGggPSB0aGlzLm1hcC5nZXQoYmFja2xpbmtQYXRoKSA/PyBiYWNrbGlua1BhdGg7XG4gICAgICBjb25zdCBsaW5rS2V5VG9QYXRoTWFwID0gY29tYmluZWRCYWNrbGlua3NNYXAuZ2V0KG5ld0JhY2tsaW5rUGF0aCkgPz8gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLnNldChuZXdCYWNrbGlua1BhdGgsIGxpbmtLZXlUb1BhdGhNYXApO1xuICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICAgIGxpbmtLZXlUb1BhdGhNYXAuc2V0KGdldExpbmtJZGVudGl0eUtleShsaW5rKSwgcGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGluaXRPcmlnaW5hbExpbmtzTWFwKGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+Pik6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgb2xkUGF0aExpbmsgb2YgdGhpcy5vbGRQYXRoTGlua3MpIHtcbiAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHsgYXBwOiB0aGlzLmFwcCwgbGluazogb2xkUGF0aExpbmssIHNvdXJjZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCB9KTtcbiAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgUmVmZXJlbmNlW10+KFtbdGhpcy5uZXdQYXRoLCBbb2xkUGF0aExpbmtdXV0pO1xuICAgICAgdGhpcy5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgIHBhdGg6IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsXG4gICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogYmFja2xpbmtzTWFwXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5rZXlzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KG9sZFBhdGgsIG5ld1BhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRPbGRBdHRhY2htZW50Rm9sZGVyUGF0aChvbGRGaWxlOiBURmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXModGhpcy5hcHAsIFtvbGRGaWxlXSk7XG4gICAgdXNpbmcgX2NhY2hlUmVnaXN0cmF0aW9uID0gdGhpcy5vbGRDYWNoZSAmJiBvbGRGaWxlLmRlbGV0ZWRcbiAgICAgID8gcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBjYWNoZTogdGhpcy5vbGRDYWNoZSwgcGF0aE9yRmlsZTogb2xkRmlsZSB9KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGhcbiAgICB9KTtcbiAgfVxufVxuXG5jbGFzcyBTZXR0aW5nc01hbmFnZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA6IE1hcDxzdHJpbmcsICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPj47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoJ3JlbmFtZURlbGV0ZUhhbmRsZXJzTWFwJywgbmV3IE1hcDxzdHJpbmcsICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPj4oKSkudmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2V0dGluZ3MoKTogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+IHtcbiAgICBjb25zdCBzZXR0aW5nc0J1aWxkZXJzID0gWy4uLnRoaXMucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAudmFsdWVzKCldLnJldmVyc2UoKTtcblxuICAgIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4gPSB7fTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1pbW1lZGlhdGUtbXV0YXRpb24gLS0gRm9sZGluZyB0aGVzZSBpbnRvIHRoZSBvYmplY3QgbGl0ZXJhbCBrZWVwcyB0aGVtIG9wdGlvbmFsIHVuZGVyIGBQYXJ0aWFsPD5gLCBsb3NpbmcgdGhlIG5hcnJvd2luZyB0aGF0IG1ha2VzIHRoZW0gY2FsbGFibGUgYmVsb3cgd2l0aG91dCBhIG51bGxpc2ggY2hlY2suXG4gICAgc2V0dGluZ3MuaXNOb3RlID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gaXNOb3RlKHBhdGgpO1xuICAgIHNldHRpbmdzLmlzUGF0aElnbm9yZWQgPSAoKTogYm9vbGVhbiA9PiBmYWxzZTtcblxuICAgIGZvciAoY29uc3Qgc2V0dGluZ3NCdWlsZGVyIG9mIHNldHRpbmdzQnVpbGRlcnMpIHtcbiAgICAgIGNvbnN0IG5ld1NldHRpbmdzID0gc2V0dGluZ3NCdWlsZGVyKCk7XG4gICAgICBzZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzID8/IGZhbHNlO1xuICAgICAgaWYgKG5ld1NldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IpIHtcbiAgICAgICAgc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/Pz0gbmV3U2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvcjtcbiAgICAgIH1cbiAgICAgIHNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zID8/IGZhbHNlO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyA/PyBmYWxzZTtcbiAgICAgIHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzID8/IGZhbHNlO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciA/PyBmYWxzZTtcbiAgICAgIHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzID8/IGZhbHNlO1xuICAgICAgaWYgKG5ld1NldHRpbmdzLmdldFJlc2N1ZVBhdGgpIHtcbiAgICAgICAgLypcbiAgICAgICAgICogRmlyc3QgcGx1Z2luIHRvIGFuc3dlciBvd25zIHRoZSBkZXN0aW5hdGlvbiwgbWlycm9yaW5nIGBlbXB0eUZvbGRlckJlaGF2aW9yYC4gTGVmdCBgdW5kZWZpbmVkYFxuICAgICAgICAgKiB3aGVuIG5vYm9keSBpbXBsZW1lbnRzIGl0LCBzbyB0aGUgcmVzY3VlIG5ldmVyIHJ1bnMgZm9yIGNvbnN1bWVycyB0aGF0IGRpZCBub3Qgb3B0IGluLlxuICAgICAgICAgKi9cbiAgICAgICAgc2V0dGluZ3MuZ2V0UmVzY3VlUGF0aCA/Pz0gbmV3U2V0dGluZ3MuZ2V0UmVzY3VlUGF0aDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzUGF0aElnbm9yZWQgPSBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkO1xuICAgICAgc2V0dGluZ3MuaXNQYXRoSWdub3JlZCA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGlzUGF0aElnbm9yZWQocGF0aCkgfHwgKG5ld1NldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihwYXRoKSA/PyBmYWxzZSk7XG4gICAgICBjb25zdCBjdXJyZW50SXNOb3RlID0gc2V0dGluZ3MuaXNOb3RlO1xuICAgICAgc2V0dGluZ3MuaXNOb3RlID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gY3VycmVudElzTm90ZShwYXRoKSAmJiAobmV3U2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gdHJ1ZSk7XG4gICAgfVxuXG4gICAgc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/Pz0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwO1xuICAgIHJldHVybiBzZXR0aW5ncztcbiAgfVxuXG4gIHB1YmxpYyBpc05vdGVFeChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCBoYW5kbGVzIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBpbiBPYnNpZGlhbi5cbiAqIEl0IGxpc3RlbnMgdG8gcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGFuZCB1cGRhdGVzIGxpbmtzIGFjY29yZGluZ2x5LlxuICogSXQgYWxzbyBoYW5kbGVzIGVkZ2UgY2FzZXMgc3VjaCBhcyBjYXNlLW9ubHkgcmVuYW1lcyBhbmQgY29sbGlzaW9ucyB3aXRoIGV4aXN0aW5nIGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgY29tcG9uZW50IHdob3NlIHNpZ25hbCBjYW5jZWxzIGluLWZsaWdodCByZW5hbWUgb3BlcmF0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhYm9ydFNpZ25hbENvbXBvbmVudDogQWJvcnRTaWduYWxDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCByZXBvcnRlciBpbnZva2VkIG9uY2UgcGVyIGJhY2tsaW5rIGZpbGUgd2hvc2UgbGlua3MgYXJlIHVwZGF0ZWQgZHVyaW5nIGEgcmVuYW1lL21vdmUsXG4gICAqIHdpdGggdGhlIHJ1bm5pbmcgY291bnQgb2YgcHJvY2Vzc2VkIGZpbGVzIGFuZCB0aGUgdG90YWwuIFdoZW4gYG51bGxgLCBubyBwcm9ncmVzcyBpcyByZXBvcnRlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBJRCB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgaGFuZGxlciBhbW9uZyB0aGUgcmVnaXN0ZXJlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXJzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbm90aWNlIGNvbXBvbmVudCB1c2VkIHRvIHJlcG9ydCB1cGRhdGVkIGxpbmtzIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAvKipcbiAgICogVGhlIHJlc291cmNlIGxvY2sgY29tcG9uZW50IHVzZWQgdG8gZ3VhcmQgbGluayB1cGRhdGVzLCBvciBgbnVsbGAgaWYgbm9uZSBpcyB1c2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcblxuICAvKipcbiAgICogQnVpbGRzIHRoaXMgcGx1Z2luJ3MgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xuXG4gIC8qKlxuICAgKiBUaGUgbWFuYWdlciB0aGF0IGFnZ3JlZ2F0ZXMgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzIGFjcm9zcyByZWdpc3RlcmVkIHBsdWdpbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzID0gbmV3IEhhbmRsZWRSZW5hbWVzKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsQ29tcG9uZW50ID0gcGFyYW1zLmFib3J0U2lnbmFsQ29tcG9uZW50O1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID0gcGFyYW1zLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID8/IG51bGw7XG4gICAgdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQgPSBwYXJhbXMucmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICAgIHRoaXMucGx1Z2luSWQgPSBwYXJhbXMucGx1Z2luSWQ7XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMuc2V0dGluZ3NCdWlsZGVyID0gcGFyYW1zLnNldHRpbmdzQnVpbGRlcjtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IG5ldyBTZXR0aW5nc01hbmFnZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgY29tcG9uZW50XG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG5cbiAgICByZW5hbWVEZWxldGVIYW5kbGVyc01hcC5zZXQodGhpcy5wbHVnaW5JZCwgdGhpcy5zZXR0aW5nc0J1aWxkZXIpO1xuICAgIHRoaXMubG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLmRlbGV0ZSh0aGlzLnBsdWdpbklkKTtcbiAgICAgIHRoaXMubG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIHRoaXMuaGFuZGxlRGVsZXRlLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIHRoaXMuaGFuZGxlUmVuYW1lLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIHRoaXMuaGFuZGxlTWV0YWRhdGFEZWxldGVkLmJpbmQodGhpcykpKTtcblxuICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGZpbGVNYW5hZ2VyOiB0aGlzLmFwcC5maWxlTWFuYWdlcixcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnQoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLFxuICAgICAgICBzaG91bGRJbnZva2VIYW5kbGVyOiB0aGlzLnNob3VsZEludm9rZUhhbmRsZXIuYmluZCh0aGlzKVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEZWxldGUoZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRJbnZva2VIYW5kbGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWRkVG9RdWV1ZSh7XG4gICAgICBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgRGVsZXRlSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCxcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZURlbGV0ZSwgeyBmaWxlUGF0aDogZmlsZS5wYXRoIH0pXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1ldGFkYXRhRGVsZXRlZChmaWxlOiBUQWJzdHJhY3RGaWxlLCBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkSW52b2tlSGFuZGxlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG5ldyBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyKHtcbiAgICAgIGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLFxuICAgICAgZmlsZSxcbiAgICAgIHByZXZpb3VzQ2FjaGUsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSkuaGFuZGxlKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlbmFtZShmaWxlOiBUQWJzdHJhY3RGaWxlLCBvbGRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkSW52b2tlSGFuZGxlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpc0ZpbGUoZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdQYXRoID0gZmlsZS5wYXRoO1xuXG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYEhhbmRsZSBSZW5hbWUgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YCk7XG4gICAgaWYgKHRoaXMuaGFuZGxlZFJlbmFtZXMuaGFzKG9sZFBhdGgsIG5ld1BhdGgpKSB7XG4gICAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmRlbGV0ZShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgcmVuYW1lIG9jY3VycmluZyBpbnNpZGUgYSBmb3JlaWduIHBsdWdpbidzIGluLWZsaWdodCBsb2NrZWQgdHJhbnNhY3Rpb24gKHdoaWNoIGxvY2tzIHRoZVxuICAgICAqIGFmZmVjdGVkIGZvbGRlciBzdWJ0cmVlLCBlLmcuIEFkdmFuY2VkIE5vdGUgQ29tcG9zZXIncyBmb2xkZXIgbWVyZ2UpIGlzIG9yY2hlc3RyYXRlZCBieSB0aGF0XG4gICAgICogdHJhbnNhY3Rpb24ncyBvd25lciwgd2hpY2ggdGFrZXMgcmVzcG9uc2liaWxpdHkgZm9yIGl0cyBvd24gbGluayBjb25zaXN0ZW5jeS4gUmVhY3RpbmcgdG8gaXRcbiAgICAgKiBoZXJlIHdvdWxkIChhKSBwZXJ0dXJiIE9ic2lkaWFuJ3MgbmF0aXZlIHBvc3QtcmVuYW1lIGxpbmsgdXBkYXRlIGFuZCBsZWF2ZSBsaW5rcyBkYW5nbGluZywgYW5kXG4gICAgICogKGIpIGNvbGxpZGUgd2l0aCB0aGUgZm9yZWlnbiB0cmFuc2FjdGlvbiBcdTIwMTQgYW4gYXN5bmMgYWJvcnQgZnJvbSB0aGlzIGhhbmRsZXIgYWJvcnRzIGFuXG4gICAgICogYWxyZWFkeS1jb21taXR0ZWQgdHJhbnNhY3Rpb24sIHRocm93aW5nIFwiQ2Fubm90IHJvbGwgYmFjayBhIGNvbW1pdHRlZCB0cmFuc2FjdGlvblwiLiBUaGlzXG4gICAgICogaGFuZGxlcidzIG93biBhdHRhY2htZW50IG1vdmVzIGFyZSBhbHJlYWR5IGV4Y2x1ZGVkIGFib3ZlIHZpYSBgaGFuZGxlZFJlbmFtZXNgLCBzbyBhIGxvY2sgc3RpbGxcbiAgICAgKiBoZWxkIGhlcmUgYWx3YXlzIGJlbG9uZ3MgdG8gYSBmb3JlaWduIG9wZXJhdGlvbjsgc3RheSBvdXQgb2YgaXRzIHdheS4gU2VlXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWFkdmFuY2VkLW5vdGUtY29tcG9zZXIvaXNzdWVzLzE0Ni5cbiAgICAgKi9cbiAgICBpZiAoaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBvbGRQYXRoKSB8fCBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShcbiAgICAgICAgYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofSBhcyBpdCBvY2N1cnMgaW5zaWRlIGEgZm9yZWlnbiBsb2NrZWQgdHJhbnNhY3Rpb24uYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05vT3BSZW5hbWUoc2V0dGluZ3MsIG9sZFBhdGgsIG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShcbiAgICAgICAgYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofSBhcyBpdCBpcyBub3QgYSBub3RlIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIHdpdGggbGluayB1cGRhdGVzIGRpc2FibGVkLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihvbGRQYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mIG9sZCBwYXRoICR7b2xkUGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgbmV3IHBhdGggJHtuZXdQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShvbGRQYXRoKSA/PyB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG5ld1BhdGgpO1xuICAgIGNvbnN0IG9sZFBhdGhCYWNrbGlua3NNYXAgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKHRoaXMuYXBwLCBvbGRQYXRoKS5kYXRhO1xuICAgIGFkZFRvUXVldWUoe1xuICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWxDb21wb25lbnQuYWJvcnRTaWduYWwsXG4gICAgICBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgICAgICAgIG5ld1BhdGgsXG4gICAgICAgICAgb2xkQ2FjaGUsXG4gICAgICAgICAgb2xkUGF0aCxcbiAgICAgICAgICBvbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpLFxuICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlUmVuYW1lLCB7IG5ld1BhdGgsIG9sZFBhdGggfSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaXRoIGxpbmsgcmV3cml0aW5nIG9mZiwgdGhlIGhhbmRsZXIncyBvbmx5IHJlbWFpbmluZyBqb2JzIGFyZSBtb3ZpbmcgYSBOT1RFJ3MgYXR0YWNobWVudHMgYW5kIHBydW5pbmdcbiAgICogdGhlIGZvbGRlciBhIG1vdmVkIGZpbGUgdmFjYXRlZC4gQSBub24tbm90ZSByZW5hbWUgbmVlZHMgbmVpdGhlciB3aGVuIGVtcHR5IGZvbGRlcnMgYXJlIGtlcHQsIHNvIHRoZXJlXG4gICAqIGlzIG5vdGhpbmcgdG8gcXVldWUuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBhZ2dyZWdhdGVkIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICogQHBhcmFtIG9sZFBhdGggLSBUaGUgcGF0aCB0aGUgZmlsZSB3YXMgcmVuYW1lZCBmcm9tLlxuICAgKiBAcGFyYW0gbmV3UGF0aCAtIFRoZSBwYXRoIHRoZSBmaWxlIHdhcyByZW5hbWVkIHRvLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgaGFuZGxlciB3b3VsZCBkbyBubyB3b3JrIGZvciB0aGlzIHJlbmFtZS5cbiAgICovXG4gIHByaXZhdGUgaXNOb09wUmVuYW1lKHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4sIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzXG4gICAgICAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKG9sZFBhdGgpID8/IGZhbHNlKVxuICAgICAgJiYgIShzZXR0aW5ncy5pc05vdGU/LihuZXdQYXRoKSA/PyBmYWxzZSlcbiAgICAgICYmIChzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID8/IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcCkgPT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcDtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6bG9nUmVnaXN0ZXJlZEhhbmRsZXJzJykoXG4gICAgICBgUGx1Z2lucyB3aXRoIHJlZ2lzdGVyZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyczogJHtKU09OLnN0cmluZ2lmeShbLi4ucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAua2V5cygpXSl9YFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZEludm9rZUhhbmRsZXIoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5yZW5hbWVEZWxldGVIYW5kbGVyc01hcDtcbiAgICBjb25zdCBtYWluUGx1Z2luSWQgPSBbLi4ucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAua2V5cygpXVswXTtcbiAgICByZXR1cm4gbWFpblBsdWdpbklkID09PSB0aGlzLnBsdWdpbklkO1xuICB9XG59XG5cbi8qKlxuICogTW92ZXMgYW4gYXR0YWNobWVudCBhIGRlbGV0aW9uIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQgdG8gd2hlcmV2ZXIgdGhlIGNvbnN1bWluZyBwbHVnaW4gc2F5cyBpdCBiZWxvbmdzLlxuICpcbiAqIFNoYXJlZCBieSBib3RoIGRlbGV0ZSBwYXRocyBcdTIwMTQgdGhlIG5vdGUgZGVsZXRlIGluIHtAbGluayBEZWxldGVIYW5kbGVyfSBhbmQgdGhlIGZvbGRlciBkZWxldGUgcmVwbGF5ZWQgYnlcbiAqIHtAbGluayBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnR9IFx1MjAxNCBiZWNhdXNlIGJvdGggcmVhY2ggdGhlIHNhbWUgcG9pbnQ6IHtAbGluayBkZWxldGVJZk5vdFVzZWR9IGhhc1xuICogZGVjaWRlZCB0aGUgYXR0YWNobWVudCBtdXN0IHN1cnZpdmUsIGFuZCB3aXRob3V0IHRoaXMgaXQgd291bGQgc3Vydml2ZSBpbiBhIGZvbGRlciBub3RoaW5nIG93bnMgYW55IG1vcmUuXG4gKlxuICogQSBjb25zdW1lciB0aGF0IGRvZXMgbm90IGltcGxlbWVudCB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzLmdldFJlc2N1ZVBhdGh9LCBvciB0aGF0IGFuc3dlcnNcbiAqIGBudWxsYCwgZ2V0cyBleGFjdGx5IHRoZSBiZWhhdmlvciBpdCBoYWQgYmVmb3JlIHRoaXMgZXhpc3RlZDogdGhlIGF0dGFjaG1lbnQgc3RheXMgcHV0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB3aGV0aGVyIHRoZSBhdHRhY2htZW50IHdhcyBtb3ZlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudChwYXJhbXM6IERpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnRQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gIGlmICghc2V0dGluZ3MuZ2V0UmVzY3VlUGF0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGF0dGFjaG1lbnRQYXRoID0gcGFyYW1zLnJlc2N1ZVBhcmFtcy5maWxlLnBhdGg7XG4gIGNvbnN0IHJlc2N1ZVBhdGggPSBhd2FpdCBzZXR0aW5ncy5nZXRSZXNjdWVQYXRoKHtcbiAgICBhdHRhY2htZW50UGF0aCxcbiAgICBzdXJ2aXZpbmdOb3RlUGF0aHM6IHBhcmFtcy5yZXNjdWVQYXJhbXMuc3Vydml2aW5nTm90ZVBhdGhzXG4gIH0pO1xuXG4gIGlmIChyZXNjdWVQYXRoID09PSBudWxsKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudCcpKGBObyByZXNjdWUgcGF0aCBmb3IgJHthdHRhY2htZW50UGF0aH07IGtlZXBpbmcgaXQgd2hlcmUgaXQgaXMuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvKlxuICAgICAqIGByZW5hbWVTYWZlYCBjcmVhdGVzIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIsIHJlc29sdmVzIGEgY29sbGlzaW9uIHZpYSBgZ2V0U2FmZVJlbmFtZVBhdGhgLCBhbmQgbW92ZXNcbiAgICAgKiB0aHJvdWdoIGBhcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZWAsIHNvIHRoZSBzdXJ2aXZpbmcgbm90ZXMnIGxpbmtzIGZvbGxvdyB0aGUgYXR0YWNobWVudC5cbiAgICAgKi9cbiAgICBjb25zdCBuZXdBdHRhY2htZW50UGF0aCA9IGF3YWl0IHJlbmFtZVNhZmUoe1xuICAgICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgICAgbmV3UGF0aDogcmVzY3VlUGF0aCxcbiAgICAgIG9sZFBhdGhPckFic3RyYWN0RmlsZTogcGFyYW1zLnJlc2N1ZVBhcmFtcy5maWxlXG4gICAgfSk7XG5cbiAgICBpZiAobmV3QXR0YWNobWVudFBhdGggPT09IGF0dGFjaG1lbnRQYXRoKSB7XG4gICAgICAvKlxuICAgICAgICogVGhlIGF0dGFjaG1lbnQgaXMgYWxyZWFkeSB3aGVyZSBpdCBiZWxvbmdzLiBUaGlzIGlzIHRoZSBub3JtYWwgc2Vjb25kIGxvb2sgYXQgYSBmaWxlIHRoZSBmb2xkZXJcbiAgICAgICAqIGRlbGV0ZSBqdXN0IHJlc2N1ZWQ6IHRoZSBvd25pbmcgbm90ZSdzIG93biBkZWxldGlvbiBpcyByZXBvcnRlZCBhZnRlcndhcmRzIGFuZCB3YWxrcyBpdHMgbGlua3NcbiAgICAgICAqIGFnYWluLiBOb3RoaW5nIG1vdmVkLCBzbyBub3RoaW5nIGlzIGNsYWltZWQgXHUyMDE0IHRoZSBjYWxsZXIga2VlcHMgaXQgaW4gcGxhY2UsIHdoaWNoIGlzIHRoZSB0cnV0aC5cbiAgICAgICAqL1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudCcpKGAke2F0dGFjaG1lbnRQYXRofSBhbHJlYWR5IHNpdHMgYXQgaXRzIHJlc2N1ZSBwYXRoOyBub3RoaW5nIHRvIG1vdmUuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBUaGUgbW92ZSBmaXJlcyBgdmF1bHQub24oJ3JlbmFtZScpYCwgc28gdGhpcyBoYW5kbGVyJ3Mgb3duIGBSZW5hbWVIYW5kbGVyYCBwaWNrcyBpdCB1cCBsaWtlIGFueSBvdGhlclxuICAgICAqIGF0dGFjaG1lbnQgbW92ZS4gSXQgaXMgZGVsaWJlcmF0ZWx5IE5PVCByZWdpc3RlcmVkIGluIGBoYW5kbGVkUmVuYW1lc2A6XG4gICAgICogYEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRgIGFscmVhZHkgZGlzY2FyZHMgT2JzaWRpYW4ncyBuYXRpdmUgbGluayB1cGRhdGUgd2hpbGVcbiAgICAgKiBgc2hvdWxkSGFuZGxlUmVuYW1lc2AgaXMgb24sIHNvIHN1cHByZXNzaW5nIHRoZSBoYW5kbGVyIGFzIHdlbGwgd291bGQgbGVhdmUgZGFuZ2xpbmcgZXhhY3RseSB0aGUgbGlua3NcbiAgICAgKiB0aGlzIHJlc2N1ZSBleGlzdHMgdG8gcHJlc2VydmUuIExldCB0aGUgcmV3cml0ZSBzZXR0bGUgYmVmb3JlIHRoZSBkZWxldGUgd2FsayBjYXJyaWVzIG9uLlxuICAgICAqL1xuICAgIGF3YWl0IHdhaXRGb3JQZW5kaW5nTGlua1VwZGF0ZXMocGFyYW1zLmFwcCk7XG5cbiAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50JykoYFJlc2N1ZWQgJHthdHRhY2htZW50UGF0aH0gdG8gJHtuZXdBdHRhY2htZW50UGF0aH0uYCk7XG4gICAgcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5ub3RpY2VzLmF0dGFjaG1lbnRSZXNjdWVkLCB7IGF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aCB9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLypcbiAgICAgKiBBIHJlc2N1ZSB0aGF0IGhhbGYgaGFwcGVuZWQgbXVzdCBub3QgcmVhZCBhcyBzdWNjZXNzIFx1MjAxNCByZXBvcnRpbmcgYGZhbHNlYCBmYWxscyBiYWNrIHRvIGtlZXBpbmcgdGhlXG4gICAgICogYXR0YWNobWVudCBpbiBwbGFjZSB3aXRoIHRoZSBgYXR0YWNobWVudElzU3RpbGxVc2VkYCBub3RpY2UsIHdoaWNoIGlzIHN0aWxsIHNhZmUuXG4gICAgICovXG4gICAgcHJpbnRFcnJvcihuZXcgRXJyb3IoYEZhaWxlZCB0byByZXNjdWUgJHthdHRhY2htZW50UGF0aH0gdG8gJHtyZXNjdWVQYXRofWAsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGtleSB1bmRlciB3aGljaCBhIGxpbmsgaXMgcmVtZW1iZXJlZCB3aGlsZSBhIHJlbmFtZSBpcyBpbiBmbGlnaHQuXG4gKlxuICogVGhlIHJld3JpdGUgaGFzIHRvIG1hdGNoIGxpbmtzIGNhcHR1cmVkIEJFRk9SRSB0aGUgYXR0YWNobWVudHMgbW92ZWQgYWdhaW5zdCB0aGUgbGlua3MgdGhlIG1ldGFkYXRhIGNhY2hlXG4gKiByZXBvcnRzIEFGVEVSIHRoZXkgbW92ZWQsIGFuZCB0aGUgb25seSB0aGluZyB0aGF0IHJlbGlhYmx5IHN1cnZpdmVzIHRoYXQgZ2FwIGlzIHRoZSBsaW5rJ3MgVEVYVC5cbiAqIERlbGliZXJhdGVseSBleGNsdWRlcyBgcG9zaXRpb25gOiBrZXlpbmcgb24gdGhlIHdob2xlIHtAbGluayBSZWZlcmVuY2V9IG1lYW50IHRoYXQgYXMgc29vbiBhcyBhbnl0aGluZ1xuICogZWRpdGVkIHRoZSBmaWxlIGluIGJldHdlZW4gXHUyMDE0IGEgY28taW5zdGFsbGVkIHBsdWdpbiByZXdyaXRpbmcgaXRzIG93biBsaW5rcywgbW9zdCBvZnRlbiBcdTIwMTQgZXZlcnkgbGluayBiZWxvd1xuICogdGhlIGVkaXQgc2hpZnRlZCBpdHMgb2Zmc2V0cywgbWlzc2VkIGl0cyBrZXksIGFuZCB3YXMgc2tpcHBlZCBpbiBzaWxlbmNlLCBsZWF2aW5nIHRoZSBub3RlIHdpdGggc29tZSBlbWJlZHNcbiAqIHJld3JpdHRlbiBhbmQgdGhlIHJlc3QgYnJva2VuLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1jdXN0b20tYXR0YWNobWVudC1sb2NhdGlvbi9pc3N1ZXMvNjAuXG4gKlxuICogVHdvIGxpbmtzIHdpdGggaWRlbnRpY2FsIHRleHQgaW4gb25lIGZpbGUgbmVjZXNzYXJpbHkgcmVzb2x2ZSB0byB0aGUgc2FtZSB0YXJnZXQsIHNvIGNvbGxhcHNpbmcgdGhlbSBvbnRvXG4gKiBvbmUga2V5IGxvc2VzIG5vdGhpbmcuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBUaGUgbGluayB0byBidWlsZCB0aGUga2V5IGZvci5cbiAqIEByZXR1cm5zIFRoZSBrZXkgaWRlbnRpZnlpbmcgdGhlIGxpbmsgYnkgaXRzIHRleHQgYWxvbmUuXG4gKi9cbmZ1bmN0aW9uIGdldExpbmtJZGVudGl0eUtleShsaW5rOiBSZWZlcmVuY2UpOiBzdHJpbmcge1xuICByZXR1cm4gdG9Kc29uKHtcbiAgICBsaW5rOiBsaW5rLmxpbmssXG4gICAgb3JpZ2luYWw6IGxpbmsub3JpZ2luYWxcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbmV4cG9ydCB7IEVtcHR5Rm9sZGVyQmVoYXZpb3IgfSBmcm9tICcuLi92YXVsdC50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBb0JBLDZCQUdPO0FBQ1AscUJBQWtCO0FBQ2xCLHNCQUdPO0FBWVAsbUJBQThCO0FBQzlCLG1CQUErQjtBQUMvQixtQkFBMkI7QUFDM0IsMEJBR087QUFDUCxzQ0FBeUM7QUFDekMsa0JBTU87QUFDUCw2QkFLTztBQUNQLG9CQUFvQztBQUNwQywwQkFBMEM7QUFDMUMseUJBVU87QUFDUCxrQkFLTztBQUNQLDRCQU1PO0FBQ1AsbUJBQTJCO0FBQzNCLDJCQUFrRDtBQUNsRCwwQkFBZ0M7QUFDaEMsbUJBT087QUFDUCwwQkFBNEI7QUFDNUIscUNBR087QUEya0RQLElBQUFBLGdCQUFvQztBQTE4Q3BDLE1BQU0sY0FBYyx1QkFBTyxJQUFJLHFCQUFxQjtBQWdEcEQsTUFBTSxjQUFjO0FBQUEsRUFDRDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEs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ckQscUNBQWUsMkNBQTJDO0FBQUEsTUFDeEQsbURBQW1ELEtBQUssVUFBVSxDQUFDLEdBQUcsd0JBQXdCLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFBQSxJQUN4RztBQUFBLEVBQ0Y7QUFBQSxFQUVRLHNCQUErQjtBQUNyQyxVQUFNLDBCQUEwQixLQUFLLGdCQUFnQjtBQUNyRCxVQUFNLGVBQWUsQ0FBQyxHQUFHLHdCQUF3QixLQUFLLENBQUMsRUFBRSxDQUFDO0FBQzFELFdBQU8saUJBQWlCLEtBQUs7QUFBQSxFQUMvQjtBQUNGO0FBZUEsZUFBZSw2QkFBNkIsUUFBOEQ7QUFDeEcsUUFBTSxXQUFXLE9BQU8sZ0JBQWdCLFlBQVk7QUFDcEQsTUFBSSxDQUFDLFNBQVMsZUFBZTtBQUMzQixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0saUJBQWlCLE9BQU8sYUFBYSxLQUFLO0FBQ2hELFFBQU0sYUFBYSxNQUFNLFNBQVMsY0FBYztBQUFBLElBQzlDO0FBQUEsSUFDQSxvQkFBb0IsT0FBTyxhQUFhO0FBQUEsRUFDMUMsQ0FBQztBQUVELE1BQUksZUFBZSxNQUFNO0FBQ3ZCLHFDQUFlLGtEQUFrRCxFQUFFLHNCQUFzQixjQUFjLDJCQUEyQjtBQUNsSSxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUk7QUFLRixVQUFNLG9CQUFvQixVQUFNLHlCQUFXO0FBQUEsTUFDekMsS0FBSyxPQUFPO0FBQUEsTUFDWixTQUFTO0FBQUEsTUFDVCx1QkFBdUIsT0FBTyxhQUFhO0FBQUEsSUFDN0MsQ0FBQztBQUVELFFBQUksc0JBQXNCLGdCQUFnQjtBQU14Qyx1Q0FBZSxrREFBa0QsRUFBRSxHQUFHLGNBQWMsb0RBQW9EO0FBQ3hJLGFBQU87QUFBQSxJQUNUO0FBU0EsY0FBTSwrQ0FBMEIsT0FBTyxHQUFHO0FBRTFDLHFDQUFlLGtEQUFrRCxFQUFFLFdBQVcsY0FBYyxPQUFPLGlCQUFpQixHQUFHO0FBQ3ZILFdBQU8sc0JBQXNCLGVBQVcsa0JBQUUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLFFBQVEsbUJBQW1CLEVBQUUsZ0JBQWdCLGtCQUFrQixDQUFDLENBQUM7QUFDckksV0FBTztBQUFBLEVBQ1QsU0FBUyxPQUFPO0FBS2QsaUNBQVcsSUFBSSxNQUFNLG9CQUFvQixjQUFjLE9BQU8sVUFBVSxJQUFJLEVBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUM3RixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBbUJBLFNBQVMsbUJBQW1CLE1BQXlCO0FBQ25ELGFBQU8sNEJBQU87QUFBQSxJQUNaLE1BQU0sS0FBSztBQUFBLElBQ1gsVUFBVSxLQUFLO0FBQUEsRUFDakIsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfdmF1bHQiXQp9Cg==