obsidian-dev-utils 88.1.2 → 88.3.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.
- package/CHANGELOG.md +18 -0
- package/dist/dev/main.js +37772 -0
- package/dist/dev/manifest.json +9 -0
- package/dist/lib/cjs/__merged.cjs +5 -1
- package/dist/lib/cjs/__merged.d.cts +2 -2
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/obsidian/attachment-path.cjs +44 -3
- package/dist/lib/cjs/obsidian/attachment-path.d.cts +40 -0
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +40 -5
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +7 -0
- package/dist/lib/cjs/obsidian/file-change.cjs +11 -2
- package/dist/lib/cjs/obsidian/index.cjs +4 -1
- package/dist/lib/cjs/obsidian/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/link-update-progress.cjs +124 -0
- package/dist/lib/cjs/obsidian/link-update-progress.d.cts +32 -0
- package/dist/lib/cjs/obsidian/link.cjs +12 -5
- package/dist/lib/cjs/obsidian/link.d.cts +6 -0
- package/dist/lib/cjs/obsidian/resource-lock.cjs +6 -1
- package/dist/lib/cjs/obsidian/resource-lock.d.cts +15 -0
- package/dist/lib/cjs/script-utils/version.cjs +11 -2
- package/dist/lib/cjs/script-utils/version.d.cts +14 -0
- package/dist/lib/esm/__merged.d.mts +2 -2
- package/dist/lib/esm/__merged.mjs +6 -2
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/obsidian/attachment-path.d.mts +40 -0
- package/dist/lib/esm/obsidian/attachment-path.mjs +46 -3
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +7 -0
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +41 -5
- package/dist/lib/esm/obsidian/file-change.mjs +11 -2
- package/dist/lib/esm/obsidian/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/index.mjs +3 -1
- package/dist/lib/esm/obsidian/link-update-progress.d.mts +32 -0
- package/dist/lib/esm/obsidian/link-update-progress.mjs +24 -0
- package/dist/lib/esm/obsidian/link.d.mts +6 -0
- package/dist/lib/esm/obsidian/link.mjs +12 -5
- package/dist/lib/esm/obsidian/resource-lock.d.mts +15 -0
- package/dist/lib/esm/obsidian/resource-lock.mjs +5 -1
- package/dist/lib/esm/script-utils/version.d.mts +14 -0
- package/dist/lib/esm/script-utils/version.mjs +10 -2
- package/obsidian/link-update-progress/package.json +6 -0
- package/package.json +7 -7
|
@@ -183,10 +183,12 @@ var import_object_utils = require('../../object-utils.cjs');
|
|
|
183
183
|
var import_obsidian_dev_utils_state = require('../../obsidian-dev-utils-state.cjs');
|
|
184
184
|
var import_path = require('../../path.cjs');
|
|
185
185
|
var import_attachment_path = require('../attachment-path.cjs');
|
|
186
|
+
var import_canvas = require('../canvas.cjs');
|
|
186
187
|
var import_file_system = require('../file-system.cjs');
|
|
187
188
|
var import_link = require('../link.cjs');
|
|
188
189
|
var import_metadata_cache = require('../metadata-cache.cjs');
|
|
189
190
|
var import_queue = require('../queue.cjs');
|
|
191
|
+
var import_resource_lock = require('../resource-lock.cjs');
|
|
190
192
|
var import_vault_delete = require('../vault-delete.cjs');
|
|
191
193
|
var import_vault = require('../vault.cjs');
|
|
192
194
|
var import_component_ex = require('./component-ex.cjs');
|
|
@@ -347,8 +349,12 @@ class FileManagerRunAsyncLinkUpdatePatchComponent extends import_monkey_around_c
|
|
|
347
349
|
}
|
|
348
350
|
async wrapLinkUpdatesHandler(linkUpdates, linkUpdatesHandler) {
|
|
349
351
|
let isRenameCalled = false;
|
|
350
|
-
|
|
352
|
+
let isForeignLockedRenameCalled = false;
|
|
353
|
+
const eventRef = this.app.vault.on("rename", (file, oldPath) => {
|
|
351
354
|
isRenameCalled = true;
|
|
355
|
+
if ((0, import_resource_lock.isResourceLockedForPathByAncestor)(this.app, file.path) || (0, import_resource_lock.isResourceLockedForPathByAncestor)(this.app, oldPath)) {
|
|
356
|
+
isForeignLockedRenameCalled = true;
|
|
357
|
+
}
|
|
352
358
|
});
|
|
353
359
|
try {
|
|
354
360
|
await linkUpdatesHandler(linkUpdates);
|
|
@@ -356,7 +362,7 @@ class FileManagerRunAsyncLinkUpdatePatchComponent extends import_monkey_around_c
|
|
|
356
362
|
this.app.vault.offref(eventRef);
|
|
357
363
|
}
|
|
358
364
|
const settings = this.settingsManager.getSettings();
|
|
359
|
-
if (!isRenameCalled || !settings.shouldHandleRenames) {
|
|
365
|
+
if (!isRenameCalled || !settings.shouldHandleRenames || isForeignLockedRenameCalled) {
|
|
360
366
|
return;
|
|
361
367
|
}
|
|
362
368
|
(0, import_array.filterInPlace)(
|
|
@@ -440,6 +446,7 @@ class RenameHandler {
|
|
|
440
446
|
handledRenames;
|
|
441
447
|
interruptedCombinedBacklinksMap;
|
|
442
448
|
interruptedRenamesMap;
|
|
449
|
+
linkUpdateProgressReporter;
|
|
443
450
|
newPath;
|
|
444
451
|
oldCache;
|
|
445
452
|
oldPath;
|
|
@@ -455,6 +462,7 @@ class RenameHandler {
|
|
|
455
462
|
this.handledRenames = params.handledRenames;
|
|
456
463
|
this.interruptedCombinedBacklinksMap = params.interruptedCombinedBacklinksMap ?? /* @__PURE__ */ new Map();
|
|
457
464
|
this.interruptedRenamesMap = params.interruptedRenamesMap;
|
|
465
|
+
this.linkUpdateProgressReporter = params.linkUpdateProgressReporter;
|
|
458
466
|
this.newPath = params.newPath;
|
|
459
467
|
this.oldCache = params.oldCache;
|
|
460
468
|
this.oldPath = params.oldPath;
|
|
@@ -532,9 +540,11 @@ class RenameHandler {
|
|
|
532
540
|
if (!settings.shouldHandleRenames) {
|
|
533
541
|
return;
|
|
534
542
|
}
|
|
535
|
-
|
|
543
|
+
const backlinkEntries = Array.from(combinedBacklinksMap.entries()).concat(
|
|
536
544
|
Array.from(this.interruptedCombinedBacklinksMap.entries())
|
|
537
|
-
)
|
|
545
|
+
);
|
|
546
|
+
let processedBacklinkFiles = 0;
|
|
547
|
+
for (const [newBacklinkPath, linkJsonToPathMap] of backlinkEntries) {
|
|
538
548
|
let linkIndex = 0;
|
|
539
549
|
await (0, import_link.editLinks)({
|
|
540
550
|
app: this.app,
|
|
@@ -562,6 +572,12 @@ class RenameHandler {
|
|
|
562
572
|
shouldFailOnMissingFile: false
|
|
563
573
|
});
|
|
564
574
|
this.abortSignal.throwIfAborted();
|
|
575
|
+
processedBacklinkFiles++;
|
|
576
|
+
this.linkUpdateProgressReporter?.({
|
|
577
|
+
currentPath: newBacklinkPath,
|
|
578
|
+
processed: processedBacklinkFiles,
|
|
579
|
+
total: backlinkEntries.length
|
|
580
|
+
});
|
|
565
581
|
}
|
|
566
582
|
if ((0, import_file_system.isNote)(this.newPath)) {
|
|
567
583
|
await (0, import_link.updateLinksInFile)((0, import_object_utils.normalizeOptionalProperties)({
|
|
@@ -616,6 +632,7 @@ class RenameHandler {
|
|
|
616
632
|
handledRenames: this.handledRenames,
|
|
617
633
|
interruptedCombinedBacklinksMap: interruptedRename.combinedBacklinksMap,
|
|
618
634
|
interruptedRenamesMap: this.interruptedRenamesMap,
|
|
635
|
+
linkUpdateProgressReporter: this.linkUpdateProgressReporter,
|
|
619
636
|
newPath: this.newPath,
|
|
620
637
|
oldCache: this.oldCache,
|
|
621
638
|
oldPath: interruptedRename.oldPath,
|
|
@@ -638,6 +655,7 @@ class RenameHandler {
|
|
|
638
655
|
app: this.app,
|
|
639
656
|
handledRenames: this.handledRenames,
|
|
640
657
|
interruptedRenamesMap: this.interruptedRenamesMap,
|
|
658
|
+
linkUpdateProgressReporter: this.linkUpdateProgressReporter,
|
|
641
659
|
newPath: tempPath,
|
|
642
660
|
oldCache: this.oldCache,
|
|
643
661
|
oldPath: this.oldPath,
|
|
@@ -722,6 +740,10 @@ class RenameMap {
|
|
|
722
740
|
if (!(0, import_file_system.isNote)(this.oldPath)) {
|
|
723
741
|
return;
|
|
724
742
|
}
|
|
743
|
+
if ((0, import_file_system.isCanvasFile)(this.oldPath)) {
|
|
744
|
+
const canvasReferences = await (0, import_canvas.getCanvasReferences)(this.app, this.newPath);
|
|
745
|
+
this.oldPathLinks.push(...canvasReferences);
|
|
746
|
+
}
|
|
725
747
|
const settings = this.settingsManager.getSettings();
|
|
726
748
|
const oldFile = (0, import_file_system.getFile)({ app: this.app, pathOrFile: this.oldPath, shouldIncludeNonExisting: true });
|
|
727
749
|
const oldAttachmentFolderPath = await this.getOldAttachmentFolderPath(oldFile);
|
|
@@ -874,6 +896,11 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
|
|
|
874
896
|
* The Obsidian app instance.
|
|
875
897
|
*/
|
|
876
898
|
app;
|
|
899
|
+
/**
|
|
900
|
+
* An optional reporter invoked once per backlink file whose links are updated during a rename/move,
|
|
901
|
+
* with the running count of processed files and the total. When `null`, no progress is reported.
|
|
902
|
+
*/
|
|
903
|
+
linkUpdateProgressReporter;
|
|
877
904
|
/**
|
|
878
905
|
* The plugin ID used to identify this handler among the registered rename/delete handlers.
|
|
879
906
|
*/
|
|
@@ -906,6 +933,7 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
|
|
|
906
933
|
super();
|
|
907
934
|
this.abortSignalComponent = params.abortSignalComponent;
|
|
908
935
|
this.app = params.app;
|
|
936
|
+
this.linkUpdateProgressReporter = params.linkUpdateProgressReporter ?? null;
|
|
909
937
|
this.resourceLockComponent = params.resourceLockComponent;
|
|
910
938
|
this.pluginId = params.pluginId;
|
|
911
939
|
this.pluginNoticeComponent = params.pluginNoticeComponent;
|
|
@@ -973,6 +1001,12 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
|
|
|
973
1001
|
this.handledRenames.delete(oldPath, newPath);
|
|
974
1002
|
return;
|
|
975
1003
|
}
|
|
1004
|
+
if ((0, import_resource_lock.isResourceLockedForPathByAncestor)(this.app, oldPath) || (0, import_resource_lock.isResourceLockedForPathByAncestor)(this.app, newPath)) {
|
|
1005
|
+
(0, import_debug.getLibDebugger)("RenameDeleteHandler:handleRename")(
|
|
1006
|
+
`Skipping rename handler of ${oldPath} -> ${newPath} as it occurs inside a foreign locked transaction.`
|
|
1007
|
+
);
|
|
1008
|
+
return;
|
|
1009
|
+
}
|
|
976
1010
|
const settings = this.settingsManager.getSettings();
|
|
977
1011
|
if (!settings.shouldHandleRenames && !settings.shouldRenameAttachmentFolder && !settings.shouldRenameAttachmentFiles) {
|
|
978
1012
|
return;
|
|
@@ -994,6 +1028,7 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
|
|
|
994
1028
|
app: this.app,
|
|
995
1029
|
handledRenames: this.handledRenames,
|
|
996
1030
|
interruptedRenamesMap: this.interruptedRenamesMap,
|
|
1031
|
+
linkUpdateProgressReporter: this.linkUpdateProgressReporter,
|
|
997
1032
|
newPath,
|
|
998
1033
|
oldCache,
|
|
999
1034
|
oldPath,
|
|
@@ -1022,4 +1057,4 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
|
|
|
1022
1057
|
EmptyFolderBehavior,
|
|
1023
1058
|
RenameDeleteHandlerComponent
|
|
1024
1059
|
});
|
|
1025
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIEZpbGVNYW5hZ2VyLFxuICBSZWZlcmVuY2UsXG4gIFRBYnN0cmFjdEZpbGUsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIEludGVybmFsUGx1Z2luTmFtZVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnaTE4bmV4dCc7XG5pbXBvcnQgeyBWYXVsdCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBVcGRhdGVMaW5rUGFyYW1zLFxuICBVcGRhdGVMaW5rc0luRmlsZVBhcmFtc1xufSBmcm9tICcuLi9saW5rLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VMb2NrQ29tcG9uZW50IH0gZnJvbSAnLi4vcmVzb3VyY2UtbG9jay50cyc7XG5pbXBvcnQgdHlwZSB7IEFib3J0U2lnbmFsQ29tcG9uZW50IH0gZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IGZpbHRlckluUGxhY2UgfSBmcm9tICcuLi8uLi9hcnJheS50cyc7XG5pbXBvcnQgeyBnZXRMaWJEZWJ1Z2dlciB9IGZyb20gJy4uLy4uL2RlYnVnLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyxcbiAgdG9Kc29uXG59IGZyb20gJy4uLy4uL29iamVjdC11dGlscy50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuLi8uLi9vYnNpZGlhbi1kZXYtdXRpbHMtc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlXG59IGZyb20gJy4uLy4uL3BhdGgudHMnO1xuaW1wb3J0IHtcbiAgQXR0YWNobWVudFBhdGhDb250ZXh0LFxuICBnZXRBdHRhY2htZW50RmlsZVBhdGgsXG4gIGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoLFxuICBoYXNPd25BdHRhY2htZW50Rm9sZGVyXG59IGZyb20gJy4uL2F0dGFjaG1lbnQtcGF0aC50cyc7XG5pbXBvcnQge1xuICBDQU5WQVNfRklMRV9FWFRFTlNJT04sXG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgaXNGaWxlLFxuICBpc01hcmtkb3duRmlsZSxcbiAgaXNOb3RlXG59IGZyb20gJy4uL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGVkaXRMaW5rcyxcbiAgZXh0cmFjdExpbmtGaWxlLFxuICB1cGRhdGVMaW5rLFxuICB1cGRhdGVMaW5rc0luRmlsZVxufSBmcm9tICcuLi9saW5rLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRMaW5rcyxcbiAgcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUsXG4gIHJlZ2lzdGVyRmlsZXNcbn0gZnJvbSAnLi4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHsgYWRkVG9RdWV1ZSB9IGZyb20gJy4uL3F1ZXVlLnRzJztcbmltcG9ydCB7IGRlbGV0ZUlmTm90VXNlZCB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQge1xuICBjbGVhbnVwRW1wdHlGb2xkZXJzLFxuICBFbXB0eUZvbGRlckJlaGF2aW9yLFxuICBnZXRTYWZlUmVuYW1lUGF0aCxcbiAgcmVuYW1lU2FmZSxcbiAgdHJhc2hTYWZlXG59IGZyb20gJy4uL3ZhdWx0LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHtcbiAgaGFzUGF0Y2hUb2tlbixcbiAgTW9ua2V5QXJvdW5kQ29tcG9uZW50XG59IGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuXG5leHBvcnQgeyBFbXB0eUZvbGRlckJlaGF2aW9yIH07XG5cbi8qKlxuICogU2V0dGluZ3MgZm9yIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3Igb2YgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlciB3aGVuIGRlbGV0aW5nIGVtcHR5IGZvbGRlcnMuXG4gICAqL1xuICBlbXB0eUZvbGRlckJlaGF2aW9yOiBFbXB0eUZvbGRlckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYXRoIGlzIGEgbm90ZS5cbiAgICovXG4gIGlzTm90ZShwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGlnbm9yZSB0aGUgcGF0aC5cbiAgICovXG4gIGlzUGF0aElnbm9yZWQocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkZWxldGUgY29uZmxpY3RpbmcgYXR0YWNobWVudHMuXG4gICAqL1xuICBzaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhhbmRsZSBkZWxldGlvbnMuXG4gICAqL1xuICBzaG91bGRIYW5kbGVEZWxldGlvbnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIHJlbmFtZXMuXG4gICAqL1xuICBzaG91bGRIYW5kbGVSZW5hbWVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZpbGVzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZm9sZGVyIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXNlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgSGFuZGxlZFJlbmFtZUtleSB7XG4gIG5ld1BhdGg6IHN0cmluZztcbiAgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJydXB0ZWRSZW5hbWUge1xuICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIG9sZFBhdGg6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJlbmFtZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzOiBIYW5kbGVkUmVuYW1lcztcbiAgcmVhZG9ubHkgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcD86IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+O1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZU1hcENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lTWFwSW5pdEJhY2tsaW5rc01hcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29tYmluZWQgYmFja2xpbmtzIG1hcCwga2V5ZWQgYnkgbmV3IGJhY2tsaW5rIHBhdGgsIGFjY3VtdWxhdGluZyBsaW5rLUpTT04gdG8gc291cmNlLXBhdGggbWFwcGluZ3MuXG4gICAqL1xuICByZWFkb25seSBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHdob3NlIGJhY2tsaW5rcyBhcmUgYmVpbmcgcmVjb3JkZWQuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBiYWNrbGlua3MgbWFwIGZvciBhIHNpbmdsZSBmaWxlLCBrZXllZCBieSBiYWNrbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgc2luZ2xlQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG59XG5cbmNvbnN0IFBBVENIX1RPS0VOID0gU3ltYm9sLmZvcigncmVuYW1lRGVsZXRlSGFuZGxlcicpO1xuXG5pbnRlcmZhY2UgRGVsZXRlSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgZmlsZU1hbmFnZXI6IEZpbGVNYW5hZ2VyO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIE1ldGFkYXRhRGVsZXRlZEhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHJlYWRvbmx5IHByZXZDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsQ29tcG9uZW50OiBBYm9ydFNpZ25hbENvbXBvbmVudDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHNldHRpbmdzQnVpbGRlcih0aGlzOiB2b2lkKTogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xufVxuXG5jbGFzcyBTZXR0aW5nc01hbmFnZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA6IE1hcDxzdHJpbmcsICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPj47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoJ3JlbmFtZURlbGV0ZUhhbmRsZXJzTWFwJywgbmV3IE1hcDxzdHJpbmcsICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPj4oKSkudmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2V0dGluZ3MoKTogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+IHtcbiAgICBjb25zdCBzZXR0aW5nc0J1aWxkZXJzID0gQXJyYXkuZnJvbSh0aGlzLnJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLnZhbHVlcygpKS5yZXZlcnNlKCk7XG5cbiAgICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+ID0ge307XG4gICAgc2V0dGluZ3MuaXNOb3RlID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gaXNOb3RlKHBhdGgpO1xuICAgIHNldHRpbmdzLmlzUGF0aElnbm9yZWQgPSAoKTogYm9vbGVhbiA9PiBmYWxzZTtcblxuICAgIGZvciAoY29uc3Qgc2V0dGluZ3NCdWlsZGVyIG9mIHNldHRpbmdzQnVpbGRlcnMpIHtcbiAgICAgIGNvbnN0IG5ld1NldHRpbmdzID0gc2V0dGluZ3NCdWlsZGVyKCk7XG4gICAgICBzZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzID8/IGZhbHNlO1xuICAgICAgaWYgKG5ld1NldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IpIHtcbiAgICAgICAgc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/Pz0gbmV3U2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvcjtcbiAgICAgIH1cbiAgICAgIHNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zID8/IGZhbHNlO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyA/PyBmYWxzZTtcbiAgICAgIHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzID8/IGZhbHNlO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciA/PyBmYWxzZTtcbiAgICAgIHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzID8/IGZhbHNlO1xuICAgICAgY29uc3QgaXNQYXRoSWdub3JlZCA9IHNldHRpbmdzLmlzUGF0aElnbm9yZWQ7XG4gICAgICBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gaXNQYXRoSWdub3JlZChwYXRoKSB8fCAobmV3U2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHBhdGgpID8/IGZhbHNlKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRJc05vdGUgPSBzZXR0aW5ncy5pc05vdGU7XG4gICAgICBzZXR0aW5ncy5pc05vdGUgPSAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBjdXJyZW50SXNOb3RlKHBhdGgpICYmIChuZXdTZXR0aW5ncy5pc05vdGU/LihwYXRoKSA/PyB0cnVlKTtcbiAgICB9XG5cbiAgICBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID8/PSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXA7XG4gICAgcmV0dXJuIHNldHRpbmdzO1xuICB9XG5cbiAgcHVibGljIGlzTm90ZUV4KHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncygpO1xuICAgIHJldHVybiBzZXR0aW5ncy5pc05vdGU/LihwYXRoKSA/PyBmYWxzZTtcbiAgfVxufVxuXG5jbGFzcyBEZWxldGVIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IERlbGV0ZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmZpbGUgPSBwYXJhbXMuZmlsZTtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwID0gcGFyYW1zLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlRGVsZXRlJykoYEhhbmRsZSBEZWxldGUgJHt0aGlzLmZpbGUucGF0aH1gKTtcbiAgICBpZiAoIWlzTm90ZSh0aGlzLmZpbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlRGVsZXRlJykoXG4gICAgICAgIGBTa2lwcGluZyBkZWxldGUgaGFuZGxlciBvZiAke3RoaXMuZmlsZS5wYXRofSBhcyB0aGUgZmlsZSBzdGlsbCBleGlzdHMgb24gZGlzayAoaW5kZXgtb25seSByZW1vdmFsLCBub3QgYSByZWFsIGRlbGV0aW9uKS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4odGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZGlybmFtZSh0aGlzLmZpbGUucGF0aCldKTtcblxuICAgIGlmIChzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5nZXQodGhpcy5maWxlLnBhdGgpO1xuICAgICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5kZWxldGUodGhpcy5maWxlLnBhdGgpO1xuICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgIGNvbnN0IGxpbmtzID0gZ2V0TGlua3MoeyBjYWNoZSB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICAgICAgICBjb25zdCBhdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7IGFwcDogdGhpcy5hcHAsIGxpbmssIHNvdXJjZVBhdGhPckZpbGU6IHRoaXMuZmlsZS5wYXRoIH0pO1xuICAgICAgICAgIGlmICghYXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci5pc05vdGVFeChhdHRhY2htZW50RmlsZS5wYXRoKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFyZW50Rm9sZGVyUGF0aHMuYWRkKGF0dGFjaG1lbnRGaWxlLnBhcmVudD8ucGF0aCA/PyAnJyk7XG4gICAgICAgICAgYXdhaXQgZGVsZXRlSWZOb3RVc2VkKHtcbiAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICBkZWxldGVkTm90ZVBhdGg6IHRoaXMuZmlsZS5wYXRoLFxuICAgICAgICAgICAgcGF0aE9yRmlsZTogYXR0YWNobWVudEZpbGUsXG4gICAgICAgICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcmVudEZvbGRlclBhdGhzLmRlbGV0ZSgnJyk7XG4gICAgYXdhaXQgY2xlYW51cEVtcHR5Rm9sZGVycyh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZW1wdHlGb2xkZXJCZWhhdmlvcjogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICBmb2xkZXJQYXRoczogQXJyYXkuZnJvbShwYXJlbnRGb2xkZXJQYXRocylcbiAgICB9KTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5EZWxldGVOb3RlLFxuICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMuZmlsZS5wYXRoXG4gICAgfSk7XG4gICAgY29uc3QgYXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZvbGRlcjogYXR0YWNobWVudEZvbGRlclBhdGggfSk7XG5cbiAgICBpZiAoIWF0dGFjaG1lbnRGb2xkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhYXdhaXQgaGFzT3duQXR0YWNobWVudEZvbGRlcih7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5EZWxldGVOb3RlLFxuICAgICAgICBwYXRoOiB0aGlzLmZpbGUucGF0aFxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBhd2FpdCBkZWxldGVJZk5vdFVzZWQoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGRlbGV0ZWROb3RlUGF0aDogdGhpcy5maWxlLnBhdGgsXG4gICAgICBwYXRoT3JGaWxlOiBhdHRhY2htZW50Rm9sZGVyLFxuICAgICAgc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzOiBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yICE9PSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXBcbiAgICB9KTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIH1cbn1cblxuY2xhc3MgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU1hbmFnZXI6IEZpbGVNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuZmlsZU1hbmFnZXIgPSBwYXJhbXMuZmlsZU1hbmFnZXI7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgbWV0aG9kTmFtZTogJ3J1bkFzeW5jTGlua1VwZGF0ZScsXG4gICAgICBvYmo6IHRoaXMuZmlsZU1hbmFnZXIsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7XG4gICAgICAgIGZhbGxiYWNrLFxuICAgICAgICBvcmlnaW5hbEFyZ3M6IFtsaW5rVXBkYXRlc0hhbmRsZXJdLFxuICAgICAgICBvcmlnaW5hbE1ldGhvZCxcbiAgICAgICAgb3JpZ2luYWxNZXRob2RCb3VuZFxuICAgICAgfSkgPT4ge1xuICAgICAgICBpZiAoaGFzUGF0Y2hUb2tlbihvcmlnaW5hbE1ldGhvZCwgUEFUQ0hfVE9LRU4pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdIYW5kbGVyOiBMaW5rVXBkYXRlc0hhbmRsZXIgPSAobGlua1VwZGF0ZXMpID0+IHRoaXMud3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcywgbGlua1VwZGF0ZXNIYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kQm91bmQobmV3SGFuZGxlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyYXBMaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXM6IExpbmtVcGRhdGVbXSwgbGlua1VwZGF0ZXNIYW5kbGVyOiBMaW5rVXBkYXRlc0hhbmRsZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaXNSZW5hbWVDYWxsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBldmVudFJlZiA9IHRoaXMuYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoKSA9PiB7XG4gICAgICBpc1JlbmFtZUNhbGxlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYXBwLnZhdWx0Lm9mZnJlZihldmVudFJlZik7XG4gICAgfVxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBJdCBtaWdodCBjaGFuZ2VkIGluIGByZW5hbWVgIGV2ZW50IGhhbmRsZXIuIEVTTGludCBtaXN0YWtlbmx5IGRvZXMgbm90IHJlY29nbml6ZSBpdC5cbiAgICBpZiAoIWlzUmVuYW1lQ2FsbGVkIHx8ICFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsdGVySW5QbGFjZShcbiAgICAgIGxpbmtVcGRhdGVzLFxuICAgICAgKGxpbmtVcGRhdGUpID0+IHtcbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aCkpIHtcbiAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpydW5Bc3luY0xpbmtVcGRhdGUnKShcbiAgICAgICAgICAgIGBSb2xsIGJhY2sgdG8gZGVmYXVsdCBsaW5rIHVwZGF0ZSBvZiBzb3VyY2UgZmlsZSAke2xpbmtVcGRhdGUuc291cmNlRmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5wYXRoKSkge1xuICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnJ1bkFzeW5jTGlua1VwZGF0ZScpKFxuICAgICAgICAgICAgYFJvbGwgYmFjayB0byBkZWZhdWx0IGxpbmsgdXBkYXRlIG9mIHJlc29sdmVkIGZpbGUgJHtsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcHAucGx1Z2lucy5nZXRQbHVnaW4oJ2JhY2tsaW5rLWNhY2hlJykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlua1VwZGF0ZS5zb3VyY2VGaWxlLmV4dGVuc2lvbiA9PT0gQ0FOVkFTX0ZJTEVfRVhURU5TSU9OKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUuZXh0ZW5zaW9uID09PSBDQU5WQVNfRklMRV9FWFRFTlNJT04pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmNsYXNzIEhhbmRsZWRSZW5hbWVzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXAgPSBuZXcgTWFwPHN0cmluZywgSGFuZGxlZFJlbmFtZUtleT4oKTtcblxuICBwdWJsaWMgYWRkKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCksIHsgbmV3UGF0aCwgb2xkUGF0aCB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5kZWxldGUodGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSk7XG4gIH1cblxuICBwdWJsaWMgaGFzKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmhhcyh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpKTtcbiAgfVxuXG4gIHB1YmxpYyBrZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SGFuZGxlZFJlbmFtZUtleT4ge1xuICAgIHJldHVybiB0aGlzLm1hcC52YWx1ZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUga2V5VG9TdHJpbmcob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YDtcbiAgfVxufVxuXG5jbGFzcyBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJldkNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogTWV0YWRhdGFEZWxldGVkSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IHBhcmFtcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcDtcbiAgICB0aGlzLmZpbGUgPSBwYXJhbXMuZmlsZTtcbiAgICB0aGlzLnByZXZDYWNoZSA9IHBhcmFtcy5wcmV2Q2FjaGU7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4odGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVNZXRhZGF0YURlbGV0ZWQnKShgU2tpcHBpbmcgbWV0YWRhdGEgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXJrZG93bkZpbGUodGhpcy5maWxlKSAmJiB0aGlzLnByZXZDYWNoZSkge1xuICAgICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5zZXQodGhpcy5maWxlLnBhdGgsIHRoaXMucHJldkNhY2hlKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgUmVuYW1lSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzOiBIYW5kbGVkUmVuYW1lcztcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQgPSBwYXJhbXMucmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMgPSBwYXJhbXMuaGFuZGxlZFJlbmFtZXM7XG4gICAgdGhpcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwID0gcGFyYW1zLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAgPz8gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG4gICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwO1xuICAgIHRoaXMubmV3UGF0aCA9IHBhcmFtcy5uZXdQYXRoO1xuICAgIHRoaXMub2xkQ2FjaGUgPSBwYXJhbXMub2xkQ2FjaGU7XG4gICAgdGhpcy5vbGRQYXRoID0gcGFyYW1zLm9sZFBhdGg7XG4gICAgdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwID0gcGFyYW1zLm9sZFBhdGhCYWNrbGlua3NNYXA7XG4gICAgdGhpcy5vbGRQYXRoTGlua3MgPSB0aGlzLm9sZENhY2hlID8gZ2V0TGlua3MoeyBjYWNoZTogdGhpcy5vbGRDYWNoZSB9KSA6IFtdO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm9sZFBhdGggPT09IHRoaXMubmV3UGF0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgYXdhaXQgdGhpcy5jb250aW51ZUludGVycnVwdGVkUmVuYW1lcygpO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2hMaW5rcygpO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVDYXNlQ29sbGlzaW9uKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBjb25zdCBwbHVnaW5Ob3RpY2VDb21wb25lbnQgPSB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAgIGNvbnN0IHJlbmFtZWRGaWxlUGF0aHMgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoJ3JlbmFtZWRGaWxlUGF0aHMnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG4gICAgY29uc3QgcmVuYW1lZExpbmtzID0gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZW5hbWVkTGlua1BhdGhzJywgbmV3IFNldDxzdHJpbmc+KCkpLnZhbHVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbmFtZU1hcCA9IG5ldyBSZW5hbWVNYXAoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHJlbmFtZU1hcC5maWxsKCk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgICAgY29uc3QgY29tYmluZWRCYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcblxuICAgICAgLy8gQmFja2xpbmtzIGFyZSBvbmx5IGNvbnN1bWVkIGJ5IHRoZSBsaW5rLXJld3JpdGUgc3RlcHMgYmVsb3csIHdoaWNoIGFyZSBnYXRlZCBvblxuICAgICAgLy8gYHNob3VsZEhhbmRsZVJlbmFtZXNgLiBTa2lwIGdhdGhlcmluZyB0aGVtIChhIGJhY2tsaW5rIGZldGNoIHBlciBhdHRhY2htZW50KSBvbiBhIG1vdmUtb25seSByZW5hbWUuXG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgICByZW5hbWVNYXAuaW5pdE9yaWdpbmFsTGlua3NNYXAoY29tYmluZWRCYWNrbGlua3NNYXApO1xuICAgICAgICByZW5hbWVNYXAuaW5pdEJhY2tsaW5rc01hcCh7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgcGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgYXR0YWNobWVudE9sZFBhdGggb2YgcmVuYW1lTWFwLmtleXMoKSkge1xuICAgICAgICAgIGlmIChhdHRhY2htZW50T2xkUGF0aCA9PT0gdGhpcy5vbGRQYXRoKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3NNYXAgPSAoYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBhdHRhY2htZW50T2xkUGF0aCB9KSkuZGF0YTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgcmVuYW1lTWFwLmluaXRCYWNrbGlua3NNYXAoe1xuICAgICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgICBwYXRoOiBhdHRhY2htZW50T2xkUGF0aCxcbiAgICAgICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3NNYXBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGhdIG9mIHJlbmFtZU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKG9sZEF0dGFjaG1lbnRQYXRoICE9PSB0aGlzLm9sZFBhdGgpIHtcbiAgICAgICAgICBjb25zdCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoID0gYXdhaXQgdGhpcy5yZW5hbWVIYW5kbGVkKG9sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIHJlbmFtZU1hcC5zZXQob2xkQXR0YWNobWVudFBhdGgsIGZpeGVkTmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudFBhdGgpKSB7XG4gICAgICAgICAgcGFyZW50Rm9sZGVyUGF0aHMuYWRkKGRpcm5hbWUob2xkQXR0YWNobWVudFBhdGgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBjbGVhbnVwRW1wdHlGb2xkZXJzKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZW1wdHlGb2xkZXJCZWhhdmlvcjogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICAgIGZvbGRlclBhdGhzOiBBcnJheS5mcm9tKHBhcmVudEZvbGRlclBhdGhzKVxuICAgICAgfSk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIC8qXG4gICAgICAgKiBUaGUgYXR0YWNobWVudCBtb3ZlIGFib3ZlIHJ1bnMgcmVnYXJkbGVzcyBvZiBgc2hvdWxkSGFuZGxlUmVuYW1lc2AgKHRoYXQgaXMgdGhlIHBvaW50IG9mIGRlY291cGxpbmdcbiAgICAgICAqIFwiTW92ZSBhdHRhY2htZW50cyB3aXRoIG5vdGVcIiBmcm9tIFwiVXBkYXRlIGxpbmtzXCIpLiBUaGUgcmVtYWluaW5nIHN0ZXBzIG9ubHkgcmV3cml0ZSBsaW5rcywgc28gc2tpcFxuICAgICAgICogdGhlbSB3aGVuIGxpbmsgdXBkYXRlcyBhcmUgZGlzYWJsZWQ7IHRoZSBgZmluYWxseWAgYmxvY2sgYmVsb3cgc3RpbGwgcnVucy5cbiAgICAgICAqL1xuICAgICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZm9yIChcbiAgICAgICAgY29uc3QgW25ld0JhY2tsaW5rUGF0aCwgbGlua0pzb25Ub1BhdGhNYXBdIG9mIEFycmF5LmZyb20oY29tYmluZWRCYWNrbGlua3NNYXAuZW50cmllcygpKS5jb25jYXQoXG4gICAgICAgICAgQXJyYXkuZnJvbSh0aGlzLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAuZW50cmllcygpKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbGV0IGxpbmtJbmRleCA9IDA7XG4gICAgICAgIGF3YWl0IGVkaXRMaW5rcyh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4ge1xuICAgICAgICAgICAgbGlua0luZGV4Kys7XG4gICAgICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50UGF0aCA9IGxpbmtKc29uVG9QYXRoTWFwLmdldCh0b0pzb24obGluaykpO1xuICAgICAgICAgICAgaWYgKCFvbGRBdHRhY2htZW50UGF0aCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRQYXRoID0gcmVuYW1lTWFwLmdldChvbGRBdHRhY2htZW50UGF0aCkgPz8gb2xkQXR0YWNobWVudFBhdGg7XG5cbiAgICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuYWRkKG5ld0JhY2tsaW5rUGF0aCk7XG4gICAgICAgICAgICByZW5hbWVkTGlua3MuYWRkKGAke25ld0JhY2tsaW5rUGF0aH0vLyR7U3RyaW5nKGxpbmtJbmRleCl9YCk7XG5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rUGFyYW1zPih7XG4gICAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICAgIGxpbmssXG4gICAgICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IG5ld0JhY2tsaW5rUGF0aCxcbiAgICAgICAgICAgICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogbmV3QXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgICAgIG9sZFRhcmdldFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhdGhPckZpbGU6IG5ld0JhY2tsaW5rUGF0aCxcbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTm90ZSh0aGlzLm5ld1BhdGgpKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZUxpbmtzSW5GaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rc0luRmlsZVBhcmFtcz4oe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2UsXG4gICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWdldEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGggfSkpIHtcbiAgICAgICAgbGV0IGludGVycnVwdGVkUmVuYW1lcyA9IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLmdldCh0aGlzLm5ld1BhdGgpO1xuICAgICAgICBpZiAoIWludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lcyA9IFtdO1xuICAgICAgICAgIHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLnNldCh0aGlzLm5ld1BhdGgsIGludGVycnVwdGVkUmVuYW1lcyk7XG4gICAgICAgIH1cbiAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzLnB1c2goe1xuICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3Qgb3JwaGFuS2V5cyA9IEFycmF5LmZyb20odGhpcy5oYW5kbGVkUmVuYW1lcy5rZXlzKCkpO1xuICAgICAgYWRkVG9RdWV1ZSh7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBvcGVyYXRpb25GbjogKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3Qgb3JwaGFuS2V5IG9mIG9ycGhhbktleXMpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuZGVsZXRlKG9ycGhhbktleS5vbGRQYXRoLCBvcnBoYW5LZXkubmV3UGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlbmFtZWRMaW5rcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLnVwZGF0ZWRMaW5rcywgeyBmaWxlc0NvdW50OiByZW5hbWVkRmlsZVBhdGhzLnNpemUsIGxpbmtzQ291bnQ6IHJlbmFtZWRMaW5rcy5zaXplIH0pKTtcbiAgICAgICAgICByZW5hbWVkRmlsZVBhdGhzLmNsZWFyKCk7XG4gICAgICAgICAgcmVuYW1lZExpbmtzLmNsZWFyKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZU9ycGhhbmVkUmVuYW1lcylcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29udGludWVJbnRlcnJ1cHRlZFJlbmFtZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMub2xkUGF0aCk7XG4gICAgaWYgKGludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZGVsZXRlKHRoaXMub2xkUGF0aCk7XG4gICAgICBmb3IgKGNvbnN0IGludGVycnVwdGVkUmVuYW1lIG9mIGludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgICBhd2FpdCBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgICAgICBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwOiBpbnRlcnJ1cHRlZFJlbmFtZS5jb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICAgIG5ld1BhdGg6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgICAgICBvbGRQYXRoOiBpbnRlcnJ1cHRlZFJlbmFtZS5vbGRQYXRoLFxuICAgICAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXA6IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUNhc2VDb2xsaXNpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFnZXREYXRhQWRhcHRlckV4KHRoaXMuYXBwKS5pbnNlbnNpdGl2ZSB8fCB0aGlzLm9sZFBhdGgudG9Mb3dlckNhc2UoKSAhPT0gdGhpcy5uZXdQYXRoLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wUGF0aCA9IGpvaW4oZGlybmFtZSh0aGlzLm5ld1BhdGgpLCBgX190ZW1wX18ke2Jhc2VuYW1lKHRoaXMubmV3UGF0aCl9YCk7XG4gICAgYXdhaXQgdGhpcy5yZW5hbWVIYW5kbGVkKHRoaXMubmV3UGF0aCwgdGVtcFBhdGgpO1xuXG4gICAgYXdhaXQgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgbmV3UGF0aDogdGVtcFBhdGgsXG4gICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXA6IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCxcbiAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pLmhhbmRsZSgpO1xuXG4gICAgYXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZShnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGVtcFBhdGggfSksIHRoaXMubmV3UGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hMaW5rcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjYWNoZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUodGhpcy5vbGRQYXRoKSA/PyB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKHRoaXMubmV3UGF0aCk7XG4gICAgY29uc3Qgb2xkUGF0aExpbmtzUmVmcmVzaGVkID0gY2FjaGUgPyBnZXRMaW5rcyh7IGNhY2hlIH0pIDogW107XG4gICAgY29uc3QgZmFrZU9sZEZpbGUgPSBnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gICAgbGV0IG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQ6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgICB7XG4gICAgICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyh0aGlzLmFwcCwgW2Zha2VPbGRGaWxlXSk7XG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkID0gKGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogZmFrZU9sZEZpbGUgfSkpLmRhdGE7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBsaW5rIG9mIG9sZFBhdGhMaW5rc1JlZnJlc2hlZCkge1xuICAgICAgaWYgKHRoaXMub2xkUGF0aExpbmtzLmluY2x1ZGVzKGxpbmspKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5vbGRQYXRoTGlua3MucHVzaChsaW5rKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIHJlZnJlc2hlZExpbmtzXSBvZiBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkLmVudHJpZXMoKSkge1xuICAgICAgbGV0IG9sZExpbmtzID0gdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLmdldChiYWNrbGlua1BhdGgpO1xuICAgICAgaWYgKCFvbGRMaW5rcykge1xuICAgICAgICBvbGRMaW5rcyA9IFtdO1xuICAgICAgICB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAuc2V0KGJhY2tsaW5rUGF0aCwgb2xkTGlua3MpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgcmVmcmVzaGVkTGlua3MpIHtcbiAgICAgICAgaWYgKG9sZExpbmtzLmluY2x1ZGVzKGxpbmspKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgb2xkTGlua3MucHVzaChsaW5rKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbmFtZUhhbmRsZWQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIG5ld1BhdGggPSBnZXRTYWZlUmVuYW1lUGF0aCh7IGFwcDogdGhpcy5hcHAsIG5ld1BhdGgsIG9sZFBhdGhPckFic3RyYWN0RmlsZTogb2xkUGF0aCB9KTtcbiAgICBpZiAob2xkUGF0aCA9PT0gbmV3UGF0aCkge1xuICAgICAgcmV0dXJuIG5ld1BhdGg7XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuYWRkKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgIG5ld1BhdGggPSBhd2FpdCByZW5hbWVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgbmV3UGF0aCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBvbGRQYXRoIH0pO1xuICAgIHJldHVybiBuZXdQYXRoO1xuICB9XG59XG5cbmNsYXNzIFJlbmFtZU1hcCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGhMaW5rczogUmVmZXJlbmNlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lTWFwQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5vbGRDYWNoZSA9IHBhcmFtcy5vbGRDYWNoZTtcbiAgICB0aGlzLm9sZFBhdGggPSBwYXJhbXMub2xkUGF0aDtcbiAgICB0aGlzLm5ld1BhdGggPSBwYXJhbXMubmV3UGF0aDtcbiAgICB0aGlzLm9sZFBhdGhMaW5rcyA9IHRoaXMub2xkQ2FjaGUgPyBnZXRMaW5rcyh7IGNhY2hlOiB0aGlzLm9sZENhY2hlIH0pIDogW107XG4gIH1cblxuICBwdWJsaWMgZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIHN0cmluZ10+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZW50cmllcygpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIHRoaXMubWFwLnNldCh0aGlzLm9sZFBhdGgsIHRoaXMubmV3UGF0aCk7XG5cbiAgICBpZiAoIWlzTm90ZSh0aGlzLm9sZFBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgY29uc3Qgb2xkRmlsZSA9IGdldEZpbGUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IHRoaXMuZ2V0T2xkQXR0YWNobWVudEZvbGRlclBhdGgob2xkRmlsZSk7XG5cbiAgICBjb25zdCBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCA9IHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXJcbiAgICAgID8gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMubmV3UGF0aFxuICAgICAgfSlcbiAgICAgIDogb2xkQXR0YWNobWVudEZvbGRlclBhdGg7XG5cbiAgICBjb25zdCBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPSBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gJy8nO1xuXG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZvbGRlcjogb2xkQXR0YWNobWVudEZvbGRlclBhdGggfSk7XG5cbiAgICBpZiAoIW9sZEF0dGFjaG1lbnRGb2xkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZXM6IFRGaWxlW10gPSBbXTtcblxuICAgIGlmIChcbiAgICAgIGF3YWl0IGhhc093bkF0dGFjaG1lbnRGb2xkZXIoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgICAgcGF0aDogdGhpcy5vbGRQYXRoXG4gICAgICB9KVxuICAgICkge1xuICAgICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKG9sZEF0dGFjaG1lbnRGb2xkZXIsIChvbGRBdHRhY2htZW50RmlsZSkgPT4ge1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIGlmIChpc0ZpbGUob2xkQXR0YWNobWVudEZpbGUpKSB7XG4gICAgICAgICAgb2xkQXR0YWNobWVudEZpbGVzLnB1c2gob2xkQXR0YWNobWVudEZpbGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBvbGRQYXRoTGluayBvZiB0aGlzLm9sZFBhdGhMaW5rcykge1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHsgYXBwOiB0aGlzLmFwcCwgbGluazogb2xkUGF0aExpbmssIHNvdXJjZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCB9KTtcbiAgICAgICAgaWYgKCFvbGRBdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCB8fCBvbGRBdHRhY2htZW50RmlsZS5wYXRoLnN0YXJ0c1dpdGgob2xkQXR0YWNobWVudEZvbGRlclBhdGgpKSB7XG4gICAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogb2xkQXR0YWNobWVudEZpbGUgfSk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0PHN0cmluZz4ob2xkQXR0YWNobWVudEJhY2tsaW5rcy5rZXlzKCkpO1xuICAgICAgICAgIGtleXMuZGVsZXRlKHRoaXMub2xkUGF0aCk7XG4gICAgICAgICAga2V5cy5kZWxldGUodGhpcy5uZXdQYXRoKTtcbiAgICAgICAgICBpZiAoa2V5cy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICBvbGRBdHRhY2htZW50RmlsZXMucHVzaChvbGRBdHRhY2htZW50RmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvbGRBdHRhY2htZW50RmlsZSBvZiBvbGRBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci5pc05vdGVFeChvbGRBdHRhY2htZW50RmlsZS5wYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IG5ld0F0dGFjaG1lbnRGaWxlUGF0aDogc3RyaW5nO1xuICAgICAgaWYgKHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50RmlsZVBhdGgoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgICBvbGRBdHRhY2htZW50UGF0aE9yRmlsZTogb2xkQXR0YWNobWVudEZpbGUsXG4gICAgICAgICAgb2xkTm90ZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2s6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCA/IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGggOiByZWxhdGl2ZShvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCwgb2xkQXR0YWNobWVudEZpbGUucGF0aCk7XG4gICAgICAgIGNvbnN0IG5ld0ZvbGRlciA9IGpvaW4obmV3QXR0YWNobWVudEZvbGRlclBhdGgsIGRpcm5hbWUocmVsYXRpdmVQYXRoKSk7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IGpvaW4obmV3Rm9sZGVyLCBvbGRBdHRhY2htZW50RmlsZS5uYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZEF0dGFjaG1lbnRGaWxlLnBhdGggPT09IG5ld0F0dGFjaG1lbnRGaWxlUGF0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzKSB7XG4gICAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRGaWxlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRGaWxlUGF0aCB9KTtcbiAgICAgICAgaWYgKG5ld0F0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZmlsbFJlbmFtZU1hcCcpKGBSZW1vdmluZyBjb25mbGljdGluZyBhdHRhY2htZW50ICR7bmV3QXR0YWNobWVudEZpbGUucGF0aH0uYCk7XG4gICAgICAgICAgYXdhaXQgdHJhc2hTYWZlKHRoaXMuYXBwLCBuZXdBdHRhY2htZW50RmlsZSk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkaXIgPSBkaXJuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4dCA9IGV4dG5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBiYXNlbmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgsIGV4dCk7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IHRoaXMuYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihkaXIsIGJhc2VOYW1lKSwgZXh0LnNsaWNlKDEpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWFwLnNldChvbGRBdHRhY2htZW50RmlsZS5wYXRoLCBuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQob2xkUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KG9sZFBhdGgpO1xuICB9XG5cbiAgcHVibGljIGluaXRCYWNrbGlua3NNYXAocGFyYW1zOiBSZW5hbWVNYXBJbml0QmFja2xpbmtzTWFwUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICBwYXRoLFxuICAgICAgc2luZ2xlQmFja2xpbmtzTWFwXG4gICAgfSA9IHBhcmFtcztcbiAgICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIGxpbmtzXSBvZiBzaW5nbGVCYWNrbGlua3NNYXAuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBuZXdCYWNrbGlua1BhdGggPSB0aGlzLm1hcC5nZXQoYmFja2xpbmtQYXRoKSA/PyBiYWNrbGlua1BhdGg7XG4gICAgICBjb25zdCBsaW5rSnNvblRvUGF0aE1hcCA9IGNvbWJpbmVkQmFja2xpbmtzTWFwLmdldChuZXdCYWNrbGlua1BhdGgpID8/IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgICBjb21iaW5lZEJhY2tsaW5rc01hcC5zZXQobmV3QmFja2xpbmtQYXRoLCBsaW5rSnNvblRvUGF0aE1hcCk7XG4gICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICAgICAgbGlua0pzb25Ub1BhdGhNYXAuc2V0KHRvSnNvbihsaW5rKSwgcGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGluaXRPcmlnaW5hbExpbmtzTWFwKGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+Pik6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgb2xkUGF0aExpbmsgb2YgdGhpcy5vbGRQYXRoTGlua3MpIHtcbiAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHsgYXBwOiB0aGlzLmFwcCwgbGluazogb2xkUGF0aExpbmssIHNvdXJjZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCB9KTtcbiAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgUmVmZXJlbmNlW10+KCk7XG4gICAgICBiYWNrbGlua3NNYXAuc2V0KHRoaXMubmV3UGF0aCwgW29sZFBhdGhMaW5rXSk7XG4gICAgICB0aGlzLmluaXRCYWNrbGlua3NNYXAoe1xuICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgcGF0aDogb2xkQXR0YWNobWVudEZpbGUucGF0aCxcbiAgICAgICAgc2luZ2xlQmFja2xpbmtzTWFwOiBiYWNrbGlua3NNYXBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBrZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmtleXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5zZXQob2xkUGF0aCwgbmV3UGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKG9sZEZpbGU6IFRGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyh0aGlzLmFwcCwgW29sZEZpbGVdKTtcbiAgICB1c2luZyBfY2FjaGVSZWdpc3RyYXRpb24gPSB0aGlzLm9sZENhY2hlICYmIG9sZEZpbGUuZGVsZXRlZFxuICAgICAgPyByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZSh7IGFwcDogdGhpcy5hcHAsIGNhY2hlOiB0aGlzLm9sZENhY2hlLCBwYXRoT3JGaWxlOiBvbGRGaWxlIH0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHRoYXQgaGFuZGxlcyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKiBJdCBsaXN0ZW5zIHRvIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBhbmQgdXBkYXRlcyBsaW5rcyBhY2NvcmRpbmdseS5cbiAqIEl0IGFsc28gaGFuZGxlcyBlZGdlIGNhc2VzIHN1Y2ggYXMgY2FzZS1vbmx5IHJlbmFtZXMgYW5kIGNvbGxpc2lvbnMgd2l0aCBleGlzdGluZyBmaWxlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIGNvbXBvbmVudCB3aG9zZSBzaWduYWwgY2FuY2VscyBpbi1mbGlnaHQgcmVuYW1lIG9wZXJhdGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWJvcnRTaWduYWxDb21wb25lbnQ6IEFib3J0U2lnbmFsQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBJRCB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgaGFuZGxlciBhbW9uZyB0aGUgcmVnaXN0ZXJlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXJzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbm90aWNlIGNvbXBvbmVudCB1c2VkIHRvIHJlcG9ydCB1cGRhdGVkIGxpbmtzIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAvKipcbiAgICogVGhlIHJlc291cmNlIGxvY2sgY29tcG9uZW50IHVzZWQgdG8gZ3VhcmQgbGluayB1cGRhdGVzLCBvciBgbnVsbGAgaWYgbm9uZSBpcyB1c2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcblxuICAvKipcbiAgICogQnVpbGRzIHRoaXMgcGx1Z2luJ3MgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xuXG4gIC8qKlxuICAgKiBUaGUgbWFuYWdlciB0aGF0IGFnZ3JlZ2F0ZXMgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzIGFjcm9zcyByZWdpc3RlcmVkIHBsdWdpbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzID0gbmV3IEhhbmRsZWRSZW5hbWVzKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsQ29tcG9uZW50ID0gcGFyYW1zLmFib3J0U2lnbmFsQ29tcG9uZW50O1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCA9IHBhcmFtcy5yZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc0J1aWxkZXIgPSBwYXJhbXMuc2V0dGluZ3NCdWlsZGVyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gbmV3IFNldHRpbmdzTWFuYWdlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBjb21wb25lbnRcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5yZW5hbWVEZWxldGVIYW5kbGVyc01hcDtcblxuICAgIHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLnNldCh0aGlzLnBsdWdpbklkLCB0aGlzLnNldHRpbmdzQnVpbGRlcik7XG4gICAgdGhpcy5sb2dSZWdpc3RlcmVkSGFuZGxlcnMoKTtcblxuICAgIHRoaXMucmVnaXN0ZXIoKCkgPT4ge1xuICAgICAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuZGVsZXRlKHRoaXMucGx1Z2luSWQpO1xuICAgICAgdGhpcy5sb2dSZWdpc3RlcmVkSGFuZGxlcnMoKTtcbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignZGVsZXRlJywgdGhpcy5oYW5kbGVEZWxldGUuYmluZCh0aGlzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgdGhpcy5oYW5kbGVSZW5hbWUuYmluZCh0aGlzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLm9uKCdkZWxldGVkJywgdGhpcy5oYW5kbGVNZXRhZGF0YURlbGV0ZWQuYmluZCh0aGlzKSkpO1xuXG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50KHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZmlsZU1hbmFnZXI6IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURlbGV0ZShmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3VsZEludm9rZUhhbmRsZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhZGRUb1F1ZXVlKHtcbiAgICAgIG9wZXJhdGlvbkZuOiAoYWJvcnRTaWduYWwpID0+XG4gICAgICAgIG5ldyBEZWxldGVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLFxuICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZURlbGV0ZSwgeyBmaWxlUGF0aDogZmlsZS5wYXRoIH0pXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1ldGFkYXRhRGVsZXRlZChmaWxlOiBUQWJzdHJhY3RGaWxlLCBwcmV2Q2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRJbnZva2VIYW5kbGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV3IE1ldGFkYXRhRGVsZXRlZEhhbmRsZXIoe1xuICAgICAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAsXG4gICAgICBmaWxlLFxuICAgICAgcHJldkNhY2hlLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pLmhhbmRsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZW5hbWUoZmlsZTogVEFic3RyYWN0RmlsZSwgb2xkUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3VsZEludm9rZUhhbmRsZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaXNGaWxlKGZpbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3UGF0aCA9IGZpbGUucGF0aDtcblxuICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKGBIYW5kbGUgUmVuYW1lICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofWApO1xuICAgIGlmICh0aGlzLmhhbmRsZWRSZW5hbWVzLmhhcyhvbGRQYXRoLCBuZXdQYXRoKSkge1xuICAgICAgdGhpcy5oYW5kbGVkUmVuYW1lcy5kZWxldGUob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihvbGRQYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mIG9sZCBwYXRoICR7b2xkUGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgbmV3IHBhdGggJHtuZXdQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShvbGRQYXRoKSA/PyB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG5ld1BhdGgpO1xuICAgIGNvbnN0IG9sZFBhdGhCYWNrbGlua3NNYXAgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKHRoaXMuYXBwLCBvbGRQYXRoKS5kYXRhO1xuICAgIGFkZFRvUXVldWUoe1xuICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWxDb21wb25lbnQuYWJvcnRTaWduYWwsXG4gICAgICBvcGVyYXRpb25GbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICAgIG5ld1BhdGgsXG4gICAgICAgICAgb2xkQ2FjaGUsXG4gICAgICAgICAgb2xkUGF0aCxcbiAgICAgICAgICBvbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpLFxuICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlUmVuYW1lLCB7IG5ld1BhdGgsIG9sZFBhdGggfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6bG9nUmVnaXN0ZXJlZEhhbmRsZXJzJykoXG4gICAgICBgUGx1Z2lucyB3aXRoIHJlZ2lzdGVyZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyczogJHtKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLmtleXMoKSkpfWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRJbnZva2VIYW5kbGVyKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG4gICAgY29uc3QgbWFpblBsdWdpbklkID0gQXJyYXkuZnJvbShyZW5hbWVEZWxldGVIYW5kbGVyc01hcC5rZXlzKCkpWzBdO1xuICAgIHJldHVybiBtYWluUGx1Z2luSWQgPT09IHRoaXMucGx1Z2luSWQ7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBb0JBLDZCQUdPO0FBQ1AscUJBQWtCO0FBQ2xCLHNCQUFzQjtBQVV0QixtQkFBOEI7QUFDOUIsbUJBQStCO0FBQy9CLDBCQUdPO0FBQ1Asc0NBQXlDO0FBQ3pDLGtCQU1PO0FBQ1AsNkJBS087QUFDUCx5QkFRTztBQUNQLGtCQUtPO0FBQ1AsNEJBTU87QUFDUCxtQkFBMkI7QUFDM0IsMEJBQWdDO0FBQ2hDLG1CQU1PO0FBQ1AsMEJBQTRCO0FBQzVCLHFDQUdPO0FB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O0FBQ2xELFFBQUksQ0FBQyxTQUFTLHVCQUF1QixDQUFDLFNBQVMsZ0NBQWdDLENBQUMsU0FBUyw2QkFBNkI7QUFDcEg7QUFBQSxJQUNGO0FBRUEsUUFBSSxTQUFTLGdCQUFnQixPQUFPLEdBQUc7QUFDckMsdUNBQWUsa0NBQWtDLEVBQUUsdUNBQXVDLE9BQU8sMEJBQTBCO0FBQzNIO0FBQUEsSUFDRjtBQUVBLFFBQUksU0FBUyxnQkFBZ0IsT0FBTyxHQUFHO0FBQ3JDLHVDQUFlLGtDQUFrQyxFQUFFLHVDQUF1QyxPQUFPLDBCQUEwQjtBQUMzSDtBQUFBLElBQ0Y7QUFFQSxVQUFNLFdBQVcsS0FBSyxJQUFJLGNBQWMsU0FBUyxPQUFPLEtBQUssS0FBSyxJQUFJLGNBQWMsU0FBUyxPQUFPO0FBQ3BHLFVBQU0sMEJBQXNCLGlEQUEwQixLQUFLLEtBQUssT0FBTyxFQUFFO0FBQ3pFLGlDQUFXO0FBQUEsTUFDVCxhQUFhLEtBQUsscUJBQXFCO0FBQUEsTUFDdkMsYUFBYSxDQUFDLGdCQUNaLElBQUksY0FBYztBQUFBLFFBQ2hCO0FBQUEsUUFDQSxLQUFLLEtBQUs7QUFBQSxRQUNWLGdCQUFnQixLQUFLO0FBQUEsUUFDckIsdUJBQXVCLEtBQUs7QUFBQSxRQUM1QjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0EsdUJBQXVCLEtBQUs7QUFBQSxRQUM1Qix1QkFBdUIsS0FBSztBQUFBLFFBQzVCLGlCQUFpQixLQUFLO0FBQUEsTUFDeEIsQ0FBQyxFQUFFLE9BQU87QUFBQSxNQUNaLG1CQUFlLGtCQUFFLENBQUMsTUFBTSxFQUFFLGlCQUFpQixvQkFBb0IsY0FBYyxFQUFFLFNBQVMsUUFBUSxDQUFDO0FBQUEsSUFDbkcsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUVRLHdCQUE4QjtBQUNwQyxVQUFNLDBCQUEwQixLQUFLLGdCQUFnQjtBQUNyRCxxQ0FBZSwyQ0FBMkM7QUFBQSxNQUN4RCxtREFBbUQsS0FBSyxVQUFVLE1BQU0sS0FBSyx3QkFBd0IsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUFBLElBQy9HO0FBQUEsRUFDRjtBQUFBLEVBRVEsc0JBQStCO0FBQ3JDLFVBQU0sMEJBQTBCLEtBQUssZ0JBQWdCO0FBQ3JELFVBQU0sZUFBZSxNQUFNLEtBQUssd0JBQXdCLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDakUsV0FBTyxpQkFBaUIsS0FBSztBQUFBLEVBQy9CO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
1060
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIEZpbGVNYW5hZ2VyLFxuICBSZWZlcmVuY2UsXG4gIFRBYnN0cmFjdEZpbGUsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIEludGVybmFsUGx1Z2luTmFtZVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnaTE4bmV4dCc7XG5pbXBvcnQgeyBWYXVsdCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB9IGZyb20gJy4uL2xpbmstdXBkYXRlLXByb2dyZXNzLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgVXBkYXRlTGlua1BhcmFtcyxcbiAgVXBkYXRlTGlua3NJbkZpbGVQYXJhbXNcbn0gZnJvbSAnLi4vbGluay50cyc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlTG9ja0NvbXBvbmVudCB9IGZyb20gJy4uL3Jlc291cmNlLWxvY2sudHMnO1xuaW1wb3J0IHR5cGUgeyBBYm9ydFNpZ25hbENvbXBvbmVudCB9IGZyb20gJy4vYWJvcnQtc2lnbmFsLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbk5vdGljZUNvbXBvbmVudCB9IGZyb20gJy4vcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuXG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSAnLi4vLi4vYXJyYXkudHMnO1xuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi8uLi9kZWJ1Zy50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi8uLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi8uLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRQYXRoQ29udGV4dCxcbiAgZ2V0QXR0YWNobWVudEZpbGVQYXRoLFxuICBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCxcbiAgaGFzT3duQXR0YWNobWVudEZvbGRlclxufSBmcm9tICcuLi9hdHRhY2htZW50LXBhdGgudHMnO1xuaW1wb3J0IHsgZ2V0Q2FudmFzUmVmZXJlbmNlcyB9IGZyb20gJy4uL2NhbnZhcy50cyc7XG5pbXBvcnQge1xuICBDQU5WQVNfRklMRV9FWFRFTlNJT04sXG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgZWRpdExpbmtzLFxuICBleHRyYWN0TGlua0ZpbGUsXG4gIHVwZGF0ZUxpbmssXG4gIHVwZGF0ZUxpbmtzSW5GaWxlXG59IGZyb20gJy4uL2xpbmsudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aCxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUsXG4gIGdldExpbmtzLFxuICByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZSxcbiAgcmVnaXN0ZXJGaWxlc1xufSBmcm9tICcuLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBhZGRUb1F1ZXVlIH0gZnJvbSAnLi4vcXVldWUudHMnO1xuaW1wb3J0IHsgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yIH0gZnJvbSAnLi4vcmVzb3VyY2UtbG9jay50cyc7XG5pbXBvcnQgeyBkZWxldGVJZk5vdFVzZWQgfSBmcm9tICcuLi92YXVsdC1kZWxldGUudHMnO1xuaW1wb3J0IHtcbiAgY2xlYW51cEVtcHR5Rm9sZGVycyxcbiAgRW1wdHlGb2xkZXJCZWhhdmlvcixcbiAgZ2V0U2FmZVJlbmFtZVBhdGgsXG4gIHJlbmFtZVNhZmUsXG4gIHRyYXNoU2FmZVxufSBmcm9tICcuLi92YXVsdC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7XG4gIGhhc1BhdGNoVG9rZW4sXG4gIE1vbmtleUFyb3VuZENvbXBvbmVudFxufSBmcm9tICcuL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcblxuZXhwb3J0IHsgRW1wdHlGb2xkZXJCZWhhdmlvciB9O1xuXG4vKipcbiAqIFNldHRpbmdzIGZvciB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG9mIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIgd2hlbiBkZWxldGluZyBlbXB0eSBmb2xkZXJzLlxuICAgKi9cbiAgZW1wdHlGb2xkZXJCZWhhdmlvcjogRW1wdHlGb2xkZXJCZWhhdmlvcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGF0aCBpcyBhIG5vdGUuXG4gICAqL1xuICBpc05vdGUocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgdGhlIHBhdGguXG4gICAqL1xuICBpc1BhdGhJZ25vcmVkKHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGVsZXRlIGNvbmZsaWN0aW5nIGF0dGFjaG1lbnRzLlxuICAgKi9cbiAgc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50czogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgZGVsZXRpb25zLlxuICAgKi9cbiAgc2hvdWxkSGFuZGxlRGVsZXRpb25zOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhhbmRsZSByZW5hbWVzLlxuICAgKi9cbiAgc2hvdWxkSGFuZGxlUmVuYW1lczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmaWxlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZvbGRlciB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlczogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEhhbmRsZWRSZW5hbWVLZXkge1xuICBuZXdQYXRoOiBzdHJpbmc7XG4gIG9sZFBhdGg6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEludGVycnVwdGVkUmVuYW1lIHtcbiAgY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICBvbGRQYXRoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSZW5hbWVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBoYW5kbGVkUmVuYW1lczogSGFuZGxlZFJlbmFtZXM7XG4gIHJlYWRvbmx5IGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA/OiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiBNYXA8c3RyaW5nLCBJbnRlcnJ1cHRlZFJlbmFtZVtdPjtcbiAgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIHwgbnVsbDtcbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBSZW5hbWVNYXBDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZU1hcEluaXRCYWNrbGlua3NNYXBQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbWJpbmVkIGJhY2tsaW5rcyBtYXAsIGtleWVkIGJ5IG5ldyBiYWNrbGluayBwYXRoLCBhY2N1bXVsYXRpbmcgbGluay1KU09OIHRvIHNvdXJjZS1wYXRoIG1hcHBpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB3aG9zZSBiYWNrbGlua3MgYXJlIGJlaW5nIHJlY29yZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYmFja2xpbmtzIG1hcCBmb3IgYSBzaW5nbGUgZmlsZSwga2V5ZWQgYnkgYmFja2xpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IHNpbmdsZUJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xufVxuXG5jb25zdCBQQVRDSF9UT0tFTiA9IFN5bWJvbC5mb3IoJ3JlbmFtZURlbGV0ZUhhbmRsZXInKTtcblxuaW50ZXJmYWNlIERlbGV0ZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwcmV2Q2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbENvbXBvbmVudDogQWJvcnRTaWduYWxDb21wb25lbnQ7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcj86IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICBzZXR0aW5nc0J1aWxkZXIodGhpczogdm9pZCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPjtcbn1cblxuY2xhc3MgU2V0dGluZ3NNYW5hZ2VyIHtcbiAgcHVibGljIHJlYWRvbmx5IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwOiBNYXA8c3RyaW5nLCAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZW5hbWVEZWxldGVIYW5kbGVyc01hcCcsIG5ldyBNYXA8c3RyaW5nLCAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4+KCkpLnZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldFNldHRpbmdzKCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiB7XG4gICAgY29uc3Qgc2V0dGluZ3NCdWlsZGVycyA9IEFycmF5LmZyb20odGhpcy5yZW5hbWVEZWxldGVIYW5kbGVyc01hcC52YWx1ZXMoKSkucmV2ZXJzZSgpO1xuXG4gICAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiA9IHt9O1xuICAgIHNldHRpbmdzLmlzTm90ZSA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGlzTm90ZShwYXRoKTtcbiAgICBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkID0gKCk6IGJvb2xlYW4gPT4gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IHNldHRpbmdzQnVpbGRlciBvZiBzZXR0aW5nc0J1aWxkZXJzKSB7XG4gICAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHNldHRpbmdzQnVpbGRlcigpO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cyA/PyBmYWxzZTtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yKSB7XG4gICAgICAgIHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz89IG5ld1NldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3I7XG4gICAgICB9XG4gICAgICBzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMgfHw9IG5ld1NldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucyA/PyBmYWxzZTtcbiAgICAgIHNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgPz8gZmFsc2U7XG4gICAgICBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcyA/PyBmYWxzZTtcbiAgICAgIHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXIgfHw9IG5ld1NldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXIgPz8gZmFsc2U7XG4gICAgICBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlcyA/PyBmYWxzZTtcbiAgICAgIGNvbnN0IGlzUGF0aElnbm9yZWQgPSBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkO1xuICAgICAgc2V0dGluZ3MuaXNQYXRoSWdub3JlZCA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGlzUGF0aElnbm9yZWQocGF0aCkgfHwgKG5ld1NldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihwYXRoKSA/PyBmYWxzZSk7XG4gICAgICBjb25zdCBjdXJyZW50SXNOb3RlID0gc2V0dGluZ3MuaXNOb3RlO1xuICAgICAgc2V0dGluZ3MuaXNOb3RlID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gY3VycmVudElzTm90ZShwYXRoKSAmJiAobmV3U2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gdHJ1ZSk7XG4gICAgfVxuXG4gICAgc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/Pz0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwO1xuICAgIHJldHVybiBzZXR0aW5ncztcbiAgfVxuXG4gIHB1YmxpYyBpc05vdGVFeChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG4gIH1cbn1cblxuY2xhc3MgRGVsZXRlSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBEZWxldGVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5maWxlID0gcGFyYW1zLmZpbGU7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IHBhcmFtcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBIYW5kbGUgRGVsZXRlICR7dGhpcy5maWxlLnBhdGh9YCk7XG4gICAgaWYgKCFpc05vdGUodGhpcy5maWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyh0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKFxuICAgICAgICBgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIGZpbGUgc3RpbGwgZXhpc3RzIG9uIGRpc2sgKGluZGV4LW9ubHkgcmVtb3ZhbCwgbm90IGEgcmVhbCBkZWxldGlvbikuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlRGVsZXRlJykoYFNraXBwaW5nIGRlbGV0ZSBoYW5kbGVyIG9mICR7dGhpcy5maWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50Rm9sZGVyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oW2Rpcm5hbWUodGhpcy5maWxlLnBhdGgpXSk7XG5cbiAgICBpZiAoc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZ2V0KHRoaXMuZmlsZS5wYXRoKTtcbiAgICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZGVsZXRlKHRoaXMuZmlsZS5wYXRoKTtcbiAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICBjb25zdCBsaW5rcyA9IGdldExpbmtzKHsgY2FjaGUgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBsaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLmZpbGUucGF0aCB9KTtcbiAgICAgICAgICBpZiAoIWF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgoYXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChhdHRhY2htZW50RmlsZS5wYXJlbnQ/LnBhdGggPz8gJycpO1xuICAgICAgICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgICAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgICAgc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzOiBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yICE9PSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJlbnRGb2xkZXJQYXRocy5kZWxldGUoJycpO1xuICAgIGF3YWl0IGNsZWFudXBFbXB0eUZvbGRlcnMoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGVtcHR5Rm9sZGVyQmVoYXZpb3I6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwLFxuICAgICAgZm9sZGVyUGF0aHM6IEFycmF5LmZyb20ocGFyZW50Rm9sZGVyUGF0aHMpXG4gICAgfSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuRGVsZXRlTm90ZSxcbiAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLmZpbGUucGF0aFxuICAgIH0pO1xuICAgIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGb2xkZXI6IGF0dGFjaG1lbnRGb2xkZXJQYXRoIH0pO1xuXG4gICAgaWYgKCFhdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIWF3YWl0IGhhc093bkF0dGFjaG1lbnRGb2xkZXIoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuRGVsZXRlTm90ZSxcbiAgICAgICAgcGF0aDogdGhpcy5maWxlLnBhdGhcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgYXdhaXQgZGVsZXRlSWZOb3RVc2VkKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBkZWxldGVkTm90ZVBhdGg6IHRoaXMuZmlsZS5wYXRoLFxuICAgICAgcGF0aE9yRmlsZTogYXR0YWNobWVudEZvbGRlcixcbiAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwXG4gICAgfSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICB9XG59XG5cbmNsYXNzIEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnQgZXh0ZW5kcyBNb25rZXlBcm91bmRDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmZpbGVNYW5hZ2VyID0gcGFyYW1zLmZpbGVNYW5hZ2VyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAgIG1ldGhvZE5hbWU6ICdydW5Bc3luY0xpbmtVcGRhdGUnLFxuICAgICAgb2JqOiB0aGlzLmZpbGVNYW5hZ2VyLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoe1xuICAgICAgICBmYWxsYmFjayxcbiAgICAgICAgb3JpZ2luYWxBcmdzOiBbbGlua1VwZGF0ZXNIYW5kbGVyXSxcbiAgICAgICAgb3JpZ2luYWxNZXRob2QsXG4gICAgICAgIG9yaWdpbmFsTWV0aG9kQm91bmRcbiAgICAgIH0pID0+IHtcbiAgICAgICAgaWYgKGhhc1BhdGNoVG9rZW4ob3JpZ2luYWxNZXRob2QsIFBBVENIX1RPS0VOKSkge1xuICAgICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyID0gKGxpbmtVcGRhdGVzKSA9PiB0aGlzLndyYXBMaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXMsIGxpbmtVcGRhdGVzSGFuZGxlcik7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZEJvdW5kKG5ld0hhbmRsZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cmFwTGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzOiBMaW5rVXBkYXRlW10sIGxpbmtVcGRhdGVzSGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGlzUmVuYW1lQ2FsbGVkID0gZmFsc2U7XG4gICAgbGV0IGlzRm9yZWlnbkxvY2tlZFJlbmFtZUNhbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGV2ZW50UmVmID0gdGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIChmaWxlLCBvbGRQYXRoKSA9PiB7XG4gICAgICBpc1JlbmFtZUNhbGxlZCA9IHRydWU7XG4gICAgICAvKlxuICAgICAgICogQSByZW5hbWUgcGVyZm9ybWVkIGluc2lkZSBhIGZvcmVpZ24gcGx1Z2luJ3MgaW4tZmxpZ2h0IGxvY2tlZCB0cmFuc2FjdGlvbiAod2hpY2ggbG9ja3MgdGhlXG4gICAgICAgKiBhZmZlY3RlZCBmb2xkZXIgc3VidHJlZSwgZS5nLiBBZHZhbmNlZCBOb3RlIENvbXBvc2VyJ3MgZm9sZGVyIG1lcmdlKSBpcyBvd25lZCBieSB0aGF0XG4gICAgICAgKiB0cmFuc2FjdGlvbiwgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGl0cyBvd24gbGluayBjb25zaXN0ZW5jeS4gVGhpcyBoYW5kbGVyIGRlbGliZXJhdGVseSBkb2VzXG4gICAgICAgKiBOT1QgcmV3cml0ZSBsaW5rcyBmb3IgaXQsIHNvIHN1cHByZXNzaW5nIE9ic2lkaWFuJ3MgbmF0aXZlIGxpbmsgdXBkYXRlIGJlbG93IHdvdWxkIGxlYXZlIHRoZVxuICAgICAgICogbGlua3MgZGFuZ2xpbmcuIExldCB0aGUgbmF0aXZlIHVwZGF0ZSBwcm9jZWVkIHVudG91Y2hlZC4gU2VlXG4gICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tYWR2YW5jZWQtbm90ZS1jb21wb3Nlci9pc3N1ZXMvMTQ2LlxuICAgICAgICovXG4gICAgICBpZiAoaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBmaWxlLnBhdGgpIHx8IGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgb2xkUGF0aCkpIHtcbiAgICAgICAgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5hcHAudmF1bHQub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICB9XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IG1pZ2h0IGNoYW5nZWQgaW4gYHJlbmFtZWAgZXZlbnQgaGFuZGxlci4gRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICAgIGlmICghaXNSZW5hbWVDYWxsZWQgfHwgIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgfHwgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsdGVySW5QbGFjZShcbiAgICAgIGxpbmtVcGRhdGVzLFxuICAgICAgKGxpbmtVcGRhdGUpID0+IHtcbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aCkpIHtcbiAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpydW5Bc3luY0xpbmtVcGRhdGUnKShcbiAgICAgICAgICAgIGBSb2xsIGJhY2sgdG8gZGVmYXVsdCBsaW5rIHVwZGF0ZSBvZiBzb3VyY2UgZmlsZSAke2xpbmtVcGRhdGUuc291cmNlRmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5wYXRoKSkge1xuICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnJ1bkFzeW5jTGlua1VwZGF0ZScpKFxuICAgICAgICAgICAgYFJvbGwgYmFjayB0byBkZWZhdWx0IGxpbmsgdXBkYXRlIG9mIHJlc29sdmVkIGZpbGUgJHtsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcHAucGx1Z2lucy5nZXRQbHVnaW4oJ2JhY2tsaW5rLWNhY2hlJykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlua1VwZGF0ZS5zb3VyY2VGaWxlLmV4dGVuc2lvbiA9PT0gQ0FOVkFTX0ZJTEVfRVhURU5TSU9OKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUuZXh0ZW5zaW9uID09PSBDQU5WQVNfRklMRV9FWFRFTlNJT04pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmNsYXNzIEhhbmRsZWRSZW5hbWVzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXAgPSBuZXcgTWFwPHN0cmluZywgSGFuZGxlZFJlbmFtZUtleT4oKTtcblxuICBwdWJsaWMgYWRkKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCksIHsgbmV3UGF0aCwgb2xkUGF0aCB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5kZWxldGUodGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSk7XG4gIH1cblxuICBwdWJsaWMgaGFzKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmhhcyh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpKTtcbiAgfVxuXG4gIHB1YmxpYyBrZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SGFuZGxlZFJlbmFtZUtleT4ge1xuICAgIHJldHVybiB0aGlzLm1hcC52YWx1ZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUga2V5VG9TdHJpbmcob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YDtcbiAgfVxufVxuXG5jbGFzcyBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJldkNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogTWV0YWRhdGFEZWxldGVkSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IHBhcmFtcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcDtcbiAgICB0aGlzLmZpbGUgPSBwYXJhbXMuZmlsZTtcbiAgICB0aGlzLnByZXZDYWNoZSA9IHBhcmFtcy5wcmV2Q2FjaGU7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4odGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVNZXRhZGF0YURlbGV0ZWQnKShgU2tpcHBpbmcgbWV0YWRhdGEgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXJrZG93bkZpbGUodGhpcy5maWxlKSAmJiB0aGlzLnByZXZDYWNoZSkge1xuICAgICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5zZXQodGhpcy5maWxlLnBhdGgsIHRoaXMucHJldkNhY2hlKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgUmVuYW1lSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzOiBIYW5kbGVkUmVuYW1lcztcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCA9IHBhcmFtcy5yZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gICAgdGhpcy5oYW5kbGVkUmVuYW1lcyA9IHBhcmFtcy5oYW5kbGVkUmVuYW1lcztcbiAgICB0aGlzLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCA/PyBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCA9IHBhcmFtcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXA7XG4gICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA9IHBhcmFtcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcbiAgICB0aGlzLm5ld1BhdGggPSBwYXJhbXMubmV3UGF0aDtcbiAgICB0aGlzLm9sZENhY2hlID0gcGFyYW1zLm9sZENhY2hlO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCA9IHBhcmFtcy5vbGRQYXRoQmFja2xpbmtzTWFwO1xuICAgIHRoaXMub2xkUGF0aExpbmtzID0gdGhpcy5vbGRDYWNoZSA/IGdldExpbmtzKHsgY2FjaGU6IHRoaXMub2xkQ2FjaGUgfSkgOiBbXTtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5vbGRQYXRoID09PSB0aGlzLm5ld1BhdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGF3YWl0IHRoaXMuY29udGludWVJbnRlcnJ1cHRlZFJlbmFtZXMoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoTGlua3MoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgaWYgKGF3YWl0IHRoaXMuaGFuZGxlQ2FzZUNvbGxpc2lvbigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgY29uc3QgcGx1Z2luTm90aWNlQ29tcG9uZW50ID0gdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgICBjb25zdCByZW5hbWVkRmlsZVBhdGhzID0gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZW5hbWVkRmlsZVBhdGhzJywgbmV3IFNldDxzdHJpbmc+KCkpLnZhbHVlO1xuICAgIGNvbnN0IHJlbmFtZWRMaW5rcyA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSgncmVuYW1lZExpbmtQYXRocycsIG5ldyBTZXQ8c3RyaW5nPigpKS52YWx1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZW5hbWVNYXAgPSBuZXcgUmVuYW1lTWFwKHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIG5ld1BhdGg6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSk7XG4gICAgICBhd2FpdCByZW5hbWVNYXAuZmlsbCgpO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICAgIGNvbnN0IGNvbWJpbmVkQmFja2xpbmtzTWFwID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbiAgICAgIC8vIEJhY2tsaW5rcyBhcmUgb25seSBjb25zdW1lZCBieSB0aGUgbGluay1yZXdyaXRlIHN0ZXBzIGJlbG93LCB3aGljaCBhcmUgZ2F0ZWQgb25cbiAgICAgIC8vIGBzaG91bGRIYW5kbGVSZW5hbWVzYC4gU2tpcCBnYXRoZXJpbmcgdGhlbSAoYSBiYWNrbGluayBmZXRjaCBwZXIgYXR0YWNobWVudCkgb24gYSBtb3ZlLW9ubHkgcmVuYW1lLlxuICAgICAgaWYgKHNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICAgICAgcmVuYW1lTWFwLmluaXRPcmlnaW5hbExpbmtzTWFwKGNvbWJpbmVkQmFja2xpbmtzTWFwKTtcbiAgICAgICAgcmVuYW1lTWFwLmluaXRCYWNrbGlua3NNYXAoe1xuICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgICBzaW5nbGVCYWNrbGlua3NNYXA6IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcFxuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoIG9mIHJlbmFtZU1hcC5rZXlzKCkpIHtcbiAgICAgICAgICBpZiAoYXR0YWNobWVudE9sZFBhdGggPT09IHRoaXMub2xkUGF0aCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwID0gKGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogYXR0YWNobWVudE9sZFBhdGggfSkpLmRhdGE7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIHJlbmFtZU1hcC5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgICAgcGF0aDogYXR0YWNobWVudE9sZFBhdGgsXG4gICAgICAgICAgICBzaW5nbGVCYWNrbGlua3NNYXA6IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50Rm9sZGVyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgZm9yIChjb25zdCBbb2xkQXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoXSBvZiByZW5hbWVNYXAuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChvbGRBdHRhY2htZW50UGF0aCAhPT0gdGhpcy5vbGRQYXRoKSB7XG4gICAgICAgICAgY29uc3QgZml4ZWROZXdBdHRhY2htZW50UGF0aCA9IGF3YWl0IHRoaXMucmVuYW1lSGFuZGxlZChvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICByZW5hbWVNYXAuc2V0KG9sZEF0dGFjaG1lbnRQYXRoLCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KG9sZEF0dGFjaG1lbnRQYXRoKSkge1xuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChkaXJuYW1lKG9sZEF0dGFjaG1lbnRQYXRoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgY2xlYW51cEVtcHR5Rm9sZGVycyh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGVtcHR5Rm9sZGVyQmVoYXZpb3I6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwLFxuICAgICAgICBmb2xkZXJQYXRoczogQXJyYXkuZnJvbShwYXJlbnRGb2xkZXJQYXRocylcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICAvKlxuICAgICAgICogVGhlIGF0dGFjaG1lbnQgbW92ZSBhYm92ZSBydW5zIHJlZ2FyZGxlc3Mgb2YgYHNob3VsZEhhbmRsZVJlbmFtZXNgICh0aGF0IGlzIHRoZSBwb2ludCBvZiBkZWNvdXBsaW5nXG4gICAgICAgKiBcIk1vdmUgYXR0YWNobWVudHMgd2l0aCBub3RlXCIgZnJvbSBcIlVwZGF0ZSBsaW5rc1wiKS4gVGhlIHJlbWFpbmluZyBzdGVwcyBvbmx5IHJld3JpdGUgbGlua3MsIHNvIHNraXBcbiAgICAgICAqIHRoZW0gd2hlbiBsaW5rIHVwZGF0ZXMgYXJlIGRpc2FibGVkOyB0aGUgYGZpbmFsbHlgIGJsb2NrIGJlbG93IHN0aWxsIHJ1bnMuXG4gICAgICAgKi9cbiAgICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhY2tsaW5rRW50cmllcyA9IEFycmF5LmZyb20oY29tYmluZWRCYWNrbGlua3NNYXAuZW50cmllcygpKS5jb25jYXQoXG4gICAgICAgIEFycmF5LmZyb20odGhpcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwLmVudHJpZXMoKSlcbiAgICAgICk7XG4gICAgICBsZXQgcHJvY2Vzc2VkQmFja2xpbmtGaWxlcyA9IDA7XG4gICAgICBmb3IgKGNvbnN0IFtuZXdCYWNrbGlua1BhdGgsIGxpbmtKc29uVG9QYXRoTWFwXSBvZiBiYWNrbGlua0VudHJpZXMpIHtcbiAgICAgICAgbGV0IGxpbmtJbmRleCA9IDA7XG4gICAgICAgIGF3YWl0IGVkaXRMaW5rcyh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4ge1xuICAgICAgICAgICAgbGlua0luZGV4Kys7XG4gICAgICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50UGF0aCA9IGxpbmtKc29uVG9QYXRoTWFwLmdldCh0b0pzb24obGluaykpO1xuICAgICAgICAgICAgaWYgKCFvbGRBdHRhY2htZW50UGF0aCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRQYXRoID0gcmVuYW1lTWFwLmdldChvbGRBdHRhY2htZW50UGF0aCkgPz8gb2xkQXR0YWNobWVudFBhdGg7XG5cbiAgICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuYWRkKG5ld0JhY2tsaW5rUGF0aCk7XG4gICAgICAgICAgICByZW5hbWVkTGlua3MuYWRkKGAke25ld0JhY2tsaW5rUGF0aH0vLyR7U3RyaW5nKGxpbmtJbmRleCl9YCk7XG5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rUGFyYW1zPih7XG4gICAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICAgIGxpbmssXG4gICAgICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IG5ld0JhY2tsaW5rUGF0aCxcbiAgICAgICAgICAgICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogbmV3QXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgICAgIG9sZFRhcmdldFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhdGhPckZpbGU6IG5ld0JhY2tsaW5rUGF0aCxcbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgcHJvY2Vzc2VkQmFja2xpbmtGaWxlcysrO1xuICAgICAgICB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPy4oe1xuICAgICAgICAgIGN1cnJlbnRQYXRoOiBuZXdCYWNrbGlua1BhdGgsXG4gICAgICAgICAgcHJvY2Vzc2VkOiBwcm9jZXNzZWRCYWNrbGlua0ZpbGVzLFxuICAgICAgICAgIHRvdGFsOiBiYWNrbGlua0VudHJpZXMubGVuZ3RoXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNOb3RlKHRoaXMubmV3UGF0aCkpIHtcbiAgICAgICAgYXdhaXQgdXBkYXRlTGlua3NJbkZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zPih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZSxcbiAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2V0RmlsZU9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCB9KSkge1xuICAgICAgICBsZXQgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMubmV3UGF0aCk7XG4gICAgICAgIGlmICghaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzID0gW107XG4gICAgICAgICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuc2V0KHRoaXMubmV3UGF0aCwgaW50ZXJydXB0ZWRSZW5hbWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMucHVzaCh7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zdCBvcnBoYW5LZXlzID0gQXJyYXkuZnJvbSh0aGlzLmhhbmRsZWRSZW5hbWVzLmtleXMoKSk7XG4gICAgICBhZGRUb1F1ZXVlKHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIG9wZXJhdGlvbkZuOiAoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBvcnBoYW5LZXkgb2Ygb3JwaGFuS2V5cykge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVkUmVuYW1lcy5kZWxldGUob3JwaGFuS2V5Lm9sZFBhdGgsIG9ycGhhbktleS5uZXdQYXRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVuYW1lZExpbmtzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIudXBkYXRlZExpbmtzLCB7IGZpbGVzQ291bnQ6IHJlbmFtZWRGaWxlUGF0aHMuc2l6ZSwgbGlua3NDb3VudDogcmVuYW1lZExpbmtzLnNpemUgfSkpO1xuICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuY2xlYXIoKTtcbiAgICAgICAgICByZW5hbWVkTGlua3MuY2xlYXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlT3JwaGFuZWRSZW5hbWVzKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb250aW51ZUludGVycnVwdGVkUmVuYW1lcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5nZXQodGhpcy5vbGRQYXRoKTtcbiAgICBpZiAoaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgIGZvciAoY29uc3QgaW50ZXJydXB0ZWRSZW5hbWUgb2YgaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgICAgIGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IGludGVycnVwdGVkUmVuYW1lLmNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgICAgIG9sZFBhdGg6IGludGVycnVwdGVkUmVuYW1lLm9sZFBhdGgsXG4gICAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ2FzZUNvbGxpc2lvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWdldERhdGFBZGFwdGVyRXgodGhpcy5hcHApLmluc2Vuc2l0aXZlIHx8IHRoaXMub2xkUGF0aC50b0xvd2VyQ2FzZSgpICE9PSB0aGlzLm5ld1BhdGgudG9Mb3dlckNhc2UoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBQYXRoID0gam9pbihkaXJuYW1lKHRoaXMubmV3UGF0aCksIGBfX3RlbXBfXyR7YmFzZW5hbWUodGhpcy5uZXdQYXRoKX1gKTtcbiAgICBhd2FpdCB0aGlzLnJlbmFtZUhhbmRsZWQodGhpcy5uZXdQYXRoLCB0ZW1wUGF0aCk7XG5cbiAgICBhd2FpdCBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICAgIG5ld1BhdGg6IHRlbXBQYXRoLFxuICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICB9KS5oYW5kbGUoKTtcblxuICAgIGF3YWl0IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGUoZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRlbXBQYXRoIH0pLCB0aGlzLm5ld1BhdGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoTGlua3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKHRoaXMub2xkUGF0aCkgPz8gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZSh0aGlzLm5ld1BhdGgpO1xuICAgIGNvbnN0IG9sZFBhdGhMaW5rc1JlZnJlc2hlZCA9IGNhY2hlID8gZ2V0TGlua3MoeyBjYWNoZSB9KSA6IFtdO1xuICAgIGNvbnN0IGZha2VPbGRGaWxlID0gZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICAgIGxldCBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gICAge1xuICAgICAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXModGhpcy5hcHAsIFtmYWtlT2xkRmlsZV0pO1xuICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZCA9IChhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IGZha2VPbGRGaWxlIH0pKS5kYXRhO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbGluayBvZiBvbGRQYXRoTGlua3NSZWZyZXNoZWQpIHtcbiAgICAgIGlmICh0aGlzLm9sZFBhdGhMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub2xkUGF0aExpbmtzLnB1c2gobGluayk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCByZWZyZXNoZWRMaW5rc10gb2Ygb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZC5lbnRyaWVzKCkpIHtcbiAgICAgIGxldCBvbGRMaW5rcyA9IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcC5nZXQoYmFja2xpbmtQYXRoKTtcbiAgICAgIGlmICghb2xkTGlua3MpIHtcbiAgICAgICAgb2xkTGlua3MgPSBbXTtcbiAgICAgICAgdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLnNldChiYWNrbGlua1BhdGgsIG9sZExpbmtzKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBsaW5rIG9mIHJlZnJlc2hlZExpbmtzKSB7XG4gICAgICAgIGlmIChvbGRMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG9sZExpbmtzLnB1c2gobGluayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW5hbWVIYW5kbGVkKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBuZXdQYXRoID0gZ2V0U2FmZVJlbmFtZVBhdGgoeyBhcHA6IHRoaXMuYXBwLCBuZXdQYXRoLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IG9sZFBhdGggfSk7XG4gICAgaWYgKG9sZFBhdGggPT09IG5ld1BhdGgpIHtcbiAgICAgIHJldHVybiBuZXdQYXRoO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmFkZChvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICBuZXdQYXRoID0gYXdhaXQgcmVuYW1lU2FmZSh7IGFwcDogdGhpcy5hcHAsIG5ld1BhdGgsIG9sZFBhdGhPckFic3RyYWN0RmlsZTogb2xkUGF0aCB9KTtcbiAgICByZXR1cm4gbmV3UGF0aDtcbiAgfVxufVxuXG5jbGFzcyBSZW5hbWVNYXAge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZU1hcENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICAgIHRoaXMub2xkQ2FjaGUgPSBwYXJhbXMub2xkQ2FjaGU7XG4gICAgdGhpcy5vbGRQYXRoID0gcGFyYW1zLm9sZFBhdGg7XG4gICAgdGhpcy5uZXdQYXRoID0gcGFyYW1zLm5ld1BhdGg7XG4gICAgdGhpcy5vbGRQYXRoTGlua3MgPSB0aGlzLm9sZENhY2hlID8gZ2V0TGlua3MoeyBjYWNoZTogdGhpcy5vbGRDYWNoZSB9KSA6IFtdO1xuICB9XG5cbiAgcHVibGljIGVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBzdHJpbmddPiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmVudHJpZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBmaWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICB0aGlzLm1hcC5zZXQodGhpcy5vbGRQYXRoLCB0aGlzLm5ld1BhdGgpO1xuXG4gICAgaWYgKCFpc05vdGUodGhpcy5vbGRQYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ic2lkaWFuIGRvZXMgbm90IGluZGV4IGEgY2FudmFzIGZpbGUgaW50byB0aGUgbWV0YWRhdGEgY2FjaGUuXG4gICAgLy8gVGhlIGNhY2hlLWRlcml2ZWQgYG9sZFBhdGhMaW5rc2AgaXMgZW1wdHkgZm9yIGEgY2FudmFzLCBoaWRpbmcgaXRzIGVtYmVkZGVkIGF0dGFjaG1lbnRzLlxuICAgIC8vIFJlYWRpbmcgdGhlIGNhbnZhcyByZWZlcmVuY2VzIGRpcmVjdGx5IG1vdmVzIHRoZW0gd2l0aCB0aGUgY2FudmFzIChtaXJyb3Jpbmcgbm90ZSBiZWhhdmlvcikuXG4gICAgLy8gVGhlIGZpbGUgYWxyZWFkeSBsaXZlcyBhdCB0aGUgbmV3IHBhdGggYWZ0ZXIgdGhlIHJlbmFtZSwgc28gcmVhZCB0aGUgcmVmZXJlbmNlcyBmcm9tIHRoZXJlLlxuICAgIGlmIChpc0NhbnZhc0ZpbGUodGhpcy5vbGRQYXRoKSkge1xuICAgICAgY29uc3QgY2FudmFzUmVmZXJlbmNlcyA9IGF3YWl0IGdldENhbnZhc1JlZmVyZW5jZXModGhpcy5hcHAsIHRoaXMubmV3UGF0aCk7XG4gICAgICB0aGlzLm9sZFBhdGhMaW5rcy5wdXNoKC4uLmNhbnZhc1JlZmVyZW5jZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGNvbnN0IG9sZEZpbGUgPSBnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCB0aGlzLmdldE9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKG9sZEZpbGUpO1xuXG4gICAgY29uc3QgbmV3QXR0YWNobWVudEZvbGRlclBhdGggPSBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyXG4gICAgICA/IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGhcbiAgICAgIH0pXG4gICAgICA6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoO1xuXG4gICAgY29uc3QgaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID0gb2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09ICcvJztcblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGb2xkZXI6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoIH0pO1xuXG4gICAgaWYgKCFvbGRBdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGVzOiBURmlsZVtdID0gW107XG5cbiAgICBpZiAoXG4gICAgICBhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMub2xkUGF0aFxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIFZhdWx0LnJlY3Vyc2VDaGlsZHJlbihvbGRBdHRhY2htZW50Rm9sZGVyLCAob2xkQXR0YWNobWVudEZpbGUpID0+IHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBpZiAoaXNGaWxlKG9sZEF0dGFjaG1lbnRGaWxlKSkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qgb2xkUGF0aExpbmsgb2YgdGhpcy5vbGRQYXRoTGlua3MpIHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7IGFwcDogdGhpcy5hcHAsIGxpbms6IG9sZFBhdGhMaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGggfSk7XG4gICAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgfHwgb2xkQXR0YWNobWVudEZpbGUucGF0aC5zdGFydHNXaXRoKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlIH0pO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KG9sZEF0dGFjaG1lbnRCYWNrbGlua3Mua2V5cygpKTtcbiAgICAgICAgICBrZXlzLmRlbGV0ZSh0aGlzLm9sZFBhdGgpO1xuICAgICAgICAgIGtleXMuZGVsZXRlKHRoaXMubmV3UGF0aCk7XG4gICAgICAgICAgaWYgKGtleXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgb2xkQXR0YWNobWVudEZpbGVzLnB1c2gob2xkQXR0YWNobWVudEZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgb2Ygb2xkQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdBdHRhY2htZW50RmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZpbGVQYXRoKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgIG9sZE5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPyBvbGRBdHRhY2htZW50RmlsZS5wYXRoIDogcmVsYXRpdmUob2xkQXR0YWNobWVudEZvbGRlclBhdGgsIG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpO1xuICAgICAgICBjb25zdCBuZXdGb2xkZXIgPSBqb2luKG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoLCBkaXJuYW1lKHJlbGF0aXZlUGF0aCkpO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSBqb2luKG5ld0ZvbGRlciwgb2xkQXR0YWNobWVudEZpbGUubmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoID09PSBuZXdBdHRhY2htZW50RmlsZVBhdGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cykge1xuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50RmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBuZXdBdHRhY2htZW50RmlsZVBhdGggfSk7XG4gICAgICAgIGlmIChuZXdBdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmZpbGxSZW5hbWVNYXAnKShgUmVtb3ZpbmcgY29uZmxpY3RpbmcgYXR0YWNobWVudCAke25ld0F0dGFjaG1lbnRGaWxlLnBhdGh9LmApO1xuICAgICAgICAgIGF3YWl0IHRyYXNoU2FmZSh0aGlzLmFwcCwgbmV3QXR0YWNobWVudEZpbGUpO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGlyID0gZGlybmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBleHQgPSBleHRuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGJhc2VOYW1lID0gYmFzZW5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoLCBleHQpO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSB0aGlzLmFwcC52YXVsdC5nZXRBdmFpbGFibGVQYXRoKGpvaW4oZGlyLCBiYXNlTmFtZSksIGV4dC5zbGljZSgxKSk7XG4gICAgICB9XG4gICAgICB0aGlzLm1hcC5zZXQob2xkQXR0YWNobWVudEZpbGUucGF0aCwgbmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0KG9sZFBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChvbGRQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0QmFja2xpbmtzTWFwKHBhcmFtczogUmVuYW1lTWFwSW5pdEJhY2tsaW5rc01hcFBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgcGF0aCxcbiAgICAgIHNpbmdsZUJhY2tsaW5rc01hcFxuICAgIH0gPSBwYXJhbXM7XG4gICAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCBsaW5rc10gb2Ygc2luZ2xlQmFja2xpbmtzTWFwLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgbmV3QmFja2xpbmtQYXRoID0gdGhpcy5tYXAuZ2V0KGJhY2tsaW5rUGF0aCkgPz8gYmFja2xpbmtQYXRoO1xuICAgICAgY29uc3QgbGlua0pzb25Ub1BhdGhNYXAgPSBjb21iaW5lZEJhY2tsaW5rc01hcC5nZXQobmV3QmFja2xpbmtQYXRoKSA/PyBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAuc2V0KG5ld0JhY2tsaW5rUGF0aCwgbGlua0pzb25Ub1BhdGhNYXApO1xuICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICAgIGxpbmtKc29uVG9QYXRoTWFwLnNldCh0b0pzb24obGluayksIHBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbml0T3JpZ2luYWxMaW5rc01hcChjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG9sZFBhdGhMaW5rIG9mIHRoaXMub2xkUGF0aExpbmtzKSB7XG4gICAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7IGFwcDogdGhpcy5hcHAsIGxpbms6IG9sZFBhdGhMaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGggfSk7XG4gICAgICBpZiAoIW9sZEF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFja2xpbmtzTWFwID0gbmV3IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPigpO1xuICAgICAgYmFja2xpbmtzTWFwLnNldCh0aGlzLm5ld1BhdGgsIFtvbGRQYXRoTGlua10pO1xuICAgICAgdGhpcy5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgIHBhdGg6IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsXG4gICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogYmFja2xpbmtzTWFwXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5rZXlzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KG9sZFBhdGgsIG5ld1BhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRPbGRBdHRhY2htZW50Rm9sZGVyUGF0aChvbGRGaWxlOiBURmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXModGhpcy5hcHAsIFtvbGRGaWxlXSk7XG4gICAgdXNpbmcgX2NhY2hlUmVnaXN0cmF0aW9uID0gdGhpcy5vbGRDYWNoZSAmJiBvbGRGaWxlLmRlbGV0ZWRcbiAgICAgID8gcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBjYWNoZTogdGhpcy5vbGRDYWNoZSwgcGF0aE9yRmlsZTogb2xkRmlsZSB9KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGhcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXBvbmVudCB0aGF0IGhhbmRsZXMgcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGluIE9ic2lkaWFuLlxuICogSXQgbGlzdGVucyB0byByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgYW5kIHVwZGF0ZXMgbGlua3MgYWNjb3JkaW5nbHkuXG4gKiBJdCBhbHNvIGhhbmRsZXMgZWRnZSBjYXNlcyBzdWNoIGFzIGNhc2Utb25seSByZW5hbWVzIGFuZCBjb2xsaXNpb25zIHdpdGggZXhpc3RpbmcgZmlsZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCBjb21wb25lbnQgd2hvc2Ugc2lnbmFsIGNhbmNlbHMgaW4tZmxpZ2h0IHJlbmFtZSBvcGVyYXRpb25zLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFib3J0U2lnbmFsQ29tcG9uZW50OiBBYm9ydFNpZ25hbENvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcHA6IEFwcDtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHJlcG9ydGVyIGludm9rZWQgb25jZSBwZXIgYmFja2xpbmsgZmlsZSB3aG9zZSBsaW5rcyBhcmUgdXBkYXRlZCBkdXJpbmcgYSByZW5hbWUvbW92ZSxcbiAgICogd2l0aCB0aGUgcnVubmluZyBjb3VudCBvZiBwcm9jZXNzZWQgZmlsZXMgYW5kIHRoZSB0b3RhbC4gV2hlbiBgbnVsbGAsIG5vIHByb2dyZXNzIGlzIHJlcG9ydGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIElEIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBoYW5kbGVyIGFtb25nIHRoZSByZWdpc3RlcmVkIHJlbmFtZS9kZWxldGUgaGFuZGxlcnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBub3RpY2UgY29tcG9uZW50IHVzZWQgdG8gcmVwb3J0IHVwZGF0ZWQgbGlua3MgdG8gdGhlIHVzZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgbG9jayBjb21wb25lbnQgdXNlZCB0byBndWFyZCBsaW5rIHVwZGF0ZXMsIG9yIGBudWxsYCBpZiBub25lIGlzIHVzZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhpcyBwbHVnaW4ncyByZW5hbWUvZGVsZXRlIGhhbmRsZXIgc2V0dGluZ3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz47XG5cbiAgLyoqXG4gICAqIFRoZSBtYW5hZ2VyIHRoYXQgYWdncmVnYXRlcyByZW5hbWUvZGVsZXRlIGhhbmRsZXIgc2V0dGluZ3MgYWNyb3NzIHJlZ2lzdGVyZWQgcGx1Z2lucy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXMgPSBuZXcgSGFuZGxlZFJlbmFtZXMoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBJbnRlcnJ1cHRlZFJlbmFtZVtdPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWJvcnRTaWduYWxDb21wb25lbnQgPSBwYXJhbXMuYWJvcnRTaWduYWxDb21wb25lbnQ7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgPSBwYXJhbXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgPz8gbnVsbDtcbiAgICB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCA9IHBhcmFtcy5yZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc0J1aWxkZXIgPSBwYXJhbXMuc2V0dGluZ3NCdWlsZGVyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gbmV3IFNldHRpbmdzTWFuYWdlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBjb21wb25lbnRcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5yZW5hbWVEZWxldGVIYW5kbGVyc01hcDtcblxuICAgIHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLnNldCh0aGlzLnBsdWdpbklkLCB0aGlzLnNldHRpbmdzQnVpbGRlcik7XG4gICAgdGhpcy5sb2dSZWdpc3RlcmVkSGFuZGxlcnMoKTtcblxuICAgIHRoaXMucmVnaXN0ZXIoKCkgPT4ge1xuICAgICAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuZGVsZXRlKHRoaXMucGx1Z2luSWQpO1xuICAgICAgdGhpcy5sb2dSZWdpc3RlcmVkSGFuZGxlcnMoKTtcbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignZGVsZXRlJywgdGhpcy5oYW5kbGVEZWxldGUuYmluZCh0aGlzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgdGhpcy5oYW5kbGVSZW5hbWUuYmluZCh0aGlzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLm9uKCdkZWxldGVkJywgdGhpcy5oYW5kbGVNZXRhZGF0YURlbGV0ZWQuYmluZCh0aGlzKSkpO1xuXG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50KHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZmlsZU1hbmFnZXI6IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURlbGV0ZShmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3VsZEludm9rZUhhbmRsZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhZGRUb1F1ZXVlKHtcbiAgICAgIG9wZXJhdGlvbkZuOiAoYWJvcnRTaWduYWwpID0+XG4gICAgICAgIG5ldyBEZWxldGVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLFxuICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZURlbGV0ZSwgeyBmaWxlUGF0aDogZmlsZS5wYXRoIH0pXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1ldGFkYXRhRGVsZXRlZChmaWxlOiBUQWJzdHJhY3RGaWxlLCBwcmV2Q2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRJbnZva2VIYW5kbGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV3IE1ldGFkYXRhRGVsZXRlZEhhbmRsZXIoe1xuICAgICAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAsXG4gICAgICBmaWxlLFxuICAgICAgcHJldkNhY2hlLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pLmhhbmRsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZW5hbWUoZmlsZTogVEFic3RyYWN0RmlsZSwgb2xkUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3VsZEludm9rZUhhbmRsZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaXNGaWxlKGZpbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3UGF0aCA9IGZpbGUucGF0aDtcblxuICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKGBIYW5kbGUgUmVuYW1lICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofWApO1xuICAgIGlmICh0aGlzLmhhbmRsZWRSZW5hbWVzLmhhcyhvbGRQYXRoLCBuZXdQYXRoKSkge1xuICAgICAgdGhpcy5oYW5kbGVkUmVuYW1lcy5kZWxldGUob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBBIHJlbmFtZSBvY2N1cnJpbmcgaW5zaWRlIGEgZm9yZWlnbiBwbHVnaW4ncyBpbi1mbGlnaHQgbG9ja2VkIHRyYW5zYWN0aW9uICh3aGljaCBsb2NrcyB0aGVcbiAgICAgKiBhZmZlY3RlZCBmb2xkZXIgc3VidHJlZSwgZS5nLiBBZHZhbmNlZCBOb3RlIENvbXBvc2VyJ3MgZm9sZGVyIG1lcmdlKSBpcyBvcmNoZXN0cmF0ZWQgYnkgdGhhdFxuICAgICAqIHRyYW5zYWN0aW9uJ3Mgb3duZXIsIHdoaWNoIHRha2VzIHJlc3BvbnNpYmlsaXR5IGZvciBpdHMgb3duIGxpbmsgY29uc2lzdGVuY3kuIFJlYWN0aW5nIHRvIGl0XG4gICAgICogaGVyZSB3b3VsZCAoYSkgcGVydHVyYiBPYnNpZGlhbidzIG5hdGl2ZSBwb3N0LXJlbmFtZSBsaW5rIHVwZGF0ZSBhbmQgbGVhdmUgbGlua3MgZGFuZ2xpbmcsIGFuZFxuICAgICAqIChiKSBjb2xsaWRlIHdpdGggdGhlIGZvcmVpZ24gdHJhbnNhY3Rpb24gXHUyMDE0IGFuIGFzeW5jIGFib3J0IGZyb20gdGhpcyBoYW5kbGVyIGFib3J0cyBhblxuICAgICAqIGFscmVhZHktY29tbWl0dGVkIHRyYW5zYWN0aW9uLCB0aHJvd2luZyBcIkNhbm5vdCByb2xsIGJhY2sgYSBjb21taXR0ZWQgdHJhbnNhY3Rpb25cIi4gVGhpc1xuICAgICAqIGhhbmRsZXIncyBvd24gYXR0YWNobWVudCBtb3ZlcyBhcmUgYWxyZWFkeSBleGNsdWRlZCBhYm92ZSB2aWEgYGhhbmRsZWRSZW5hbWVzYCwgc28gYSBsb2NrIHN0aWxsXG4gICAgICogaGVsZCBoZXJlIGFsd2F5cyBiZWxvbmdzIHRvIGEgZm9yZWlnbiBvcGVyYXRpb247IHN0YXkgb3V0IG9mIGl0cyB3YXkuIFNlZVxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1hZHZhbmNlZC1ub3RlLWNvbXBvc2VyL2lzc3Vlcy8xNDYuXG4gICAgICovXG4gICAgaWYgKGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgb2xkUGF0aCkgfHwgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBuZXdQYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoXG4gICAgICAgIGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH0gYXMgaXQgb2NjdXJzIGluc2lkZSBhIGZvcmVpZ24gbG9ja2VkIHRyYW5zYWN0aW9uLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihvbGRQYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mIG9sZCBwYXRoICR7b2xkUGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgbmV3IHBhdGggJHtuZXdQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShvbGRQYXRoKSA/PyB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG5ld1BhdGgpO1xuICAgIGNvbnN0IG9sZFBhdGhCYWNrbGlua3NNYXAgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKHRoaXMuYXBwLCBvbGRQYXRoKS5kYXRhO1xuICAgIGFkZFRvUXVldWUoe1xuICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWxDb21wb25lbnQuYWJvcnRTaWduYWwsXG4gICAgICBvcGVyYXRpb25GbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgICAgICAgIG5ld1BhdGgsXG4gICAgICAgICAgb2xkQ2FjaGUsXG4gICAgICAgICAgb2xkUGF0aCxcbiAgICAgICAgICBvbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpLFxuICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlUmVuYW1lLCB7IG5ld1BhdGgsIG9sZFBhdGggfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6bG9nUmVnaXN0ZXJlZEhhbmRsZXJzJykoXG4gICAgICBgUGx1Z2lucyB3aXRoIHJlZ2lzdGVyZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyczogJHtKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLmtleXMoKSkpfWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRJbnZva2VIYW5kbGVyKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG4gICAgY29uc3QgbWFpblBsdWdpbklkID0gQXJyYXkuZnJvbShyZW5hbWVEZWxldGVIYW5kbGVyc01hcC5rZXlzKCkpWzBdO1xuICAgIHJldHVybiBtYWluUGx1Z2luSWQgPT09IHRoaXMucGx1Z2luSWQ7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAog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
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Contains utility functions for handling rename and delete events in Obsidian.
|
|
6
6
|
*/
|
|
7
7
|
import type { App } from 'obsidian' with { 'resolution-mode': 'import' };
|
|
8
|
+
import type { LinkUpdateProgressReporter } from '../link-update-progress.cjs';
|
|
8
9
|
import type { ResourceLockComponent } from '../resource-lock.cjs';
|
|
9
10
|
import type { AbortSignalComponent } from './abort-signal-component.cjs';
|
|
10
11
|
import type { PluginNoticeComponent } from './plugin-notice-component.cjs';
|
|
@@ -55,6 +56,7 @@ export interface RenameDeleteHandlerSettings {
|
|
|
55
56
|
interface RenameDeleteHandlerComponentConstructorParams {
|
|
56
57
|
readonly abortSignalComponent: AbortSignalComponent;
|
|
57
58
|
readonly app: App;
|
|
59
|
+
readonly linkUpdateProgressReporter?: LinkUpdateProgressReporter;
|
|
58
60
|
readonly pluginId: string;
|
|
59
61
|
readonly pluginNoticeComponent: PluginNoticeComponent;
|
|
60
62
|
readonly resourceLockComponent: null | ResourceLockComponent;
|
|
@@ -80,6 +82,11 @@ export declare class RenameDeleteHandlerComponent extends ComponentEx {
|
|
|
80
82
|
* The Obsidian app instance.
|
|
81
83
|
*/
|
|
82
84
|
protected readonly app: App;
|
|
85
|
+
/**
|
|
86
|
+
* An optional reporter invoked once per backlink file whose links are updated during a rename/move,
|
|
87
|
+
* with the running count of processed files and the total. When `null`, no progress is reported.
|
|
88
|
+
*/
|
|
89
|
+
protected readonly linkUpdateProgressReporter: LinkUpdateProgressReporter | null;
|
|
83
90
|
/**
|
|
84
91
|
* The plugin ID used to identify this handler among the registered rename/delete handlers.
|
|
85
92
|
*/
|