verben-workflow-ui 0.5.72 → 0.5.74

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.
@@ -344,6 +344,48 @@ export class WorkflowDesignerComponent {
344
344
  this.showSwimlaneDialog = false;
345
345
  this.editingSwimlaneIndex = null;
346
346
  }
347
+ onSwimlaneDialogDeleted() {
348
+ if (this.editingSwimlaneIndex === null) {
349
+ return;
350
+ }
351
+ const index = this.editingSwimlaneIndex;
352
+ const swimlane = this.state.swimlanes[index];
353
+ // Guard: stages must be moved out first (also enforced in state.deleteSwimlane).
354
+ if (swimlane?.nodes?.length) {
355
+ this.utilService.showError('Move all stages out of this swimlane before deleting it.');
356
+ return;
357
+ }
358
+ // A loaded lane keeps its backend Code in swimlaneRecord (keyed by id/Code).
359
+ const backendRecord = swimlane?.id
360
+ ? this.state.swimlaneRecord[swimlane.id]
361
+ : undefined;
362
+ if (backendRecord?.Code) {
363
+ // Path A: backend-persisted lane — delete on the server first.
364
+ this.dataService
365
+ .deleteSwimLanes([backendRecord.Code])
366
+ .then(() => {
367
+ this.finishSwimlaneDelete(index);
368
+ })
369
+ .catch((error) => {
370
+ console.error('Error deleting swimlane:', error);
371
+ this.utilService.showError('Failed to delete swimlane');
372
+ });
373
+ }
374
+ else {
375
+ // Path B: never-saved lane — remove from state directly, no API call.
376
+ this.finishSwimlaneDelete(index);
377
+ }
378
+ }
379
+ finishSwimlaneDelete(index) {
380
+ const deleted = this.state.deleteSwimlane(index);
381
+ if (!deleted) {
382
+ this.utilService.showError('Move all stages out of this swimlane before deleting it.');
383
+ return;
384
+ }
385
+ this.showSwimlaneDialog = false;
386
+ this.editingSwimlaneIndex = null;
387
+ this.canvasRef?.updateCanvasSize();
388
+ }
347
389
  onSubflowSelected() {
348
390
  // Reset the selected tool after placing a subflow node
349
391
  this.selectedTool = null;
@@ -352,15 +394,15 @@ export class WorkflowDesignerComponent {
352
394
  this.showActorTagsDialog = true;
353
395
  }
354
396
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WorkflowDesignerComponent, deps: [{ token: i1.WorkflowDesignerState }, { token: i2.WorkflowDataService }, { token: i3.UtilService }], target: i0.ɵɵFactoryTarget.Component });
355
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WorkflowDesignerComponent, selector: "lib-workflow-designer", inputs: { workflowCode: "workflowCode" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvasRef"], descendants: true }], ngImport: i0, template: "<div class=\"workflow-designer\">\n <div class=\"workflow-header\">\n <h1>{{ state.workflow?.Name }}</h1>\n </div>\n\n <!-- Toolbar Component -->\n <lib-designer-toolbar [selectedTool]=\"selectedTool\" [isSaving]=\"isSaving\"\n [workflowCode]=\"state.workflow?.Code || null\" (toolSelected)=\"onToolSelected($event)\"\n (saveWorkflow)=\"saveWorkflow()\" (openActorTags)=\"openActorTagsDialog()\">\n </lib-designer-toolbar>\n\n <!-- Show loading indicator if needed -->\n <div *ngIf=\"isLoading\" class=\"loading-overlay\">\n <div class=\"loading-spinner\"></div>\n <div class=\"loading-text\">Loading workflow...</div>\n </div>\n\n <!-- Canvas Component -->\n <lib-designer-canvas [selectedTool]=\"selectedTool\" (clickedPosition)=\"handleCanvasPositionClick($event)\"\n (subflowSelected)=\"onSubflowSelected()\" #canvasRef>\n </lib-designer-canvas>\n\n <lib-swimlane-dialog [visible]=\"showSwimlaneDialog\" [swimlaneData]=\"editingSwimlane()\"\n (created)=\"onSwimlaneDialogFilled($event)\" (closed)=\"showSwimlaneDialog = false\"></lib-swimlane-dialog>\n\n <lib-actor-tags-dialog [visible]=\"showActorTagsDialog\" [workflowCode]=\"state.workflow?.Code || null\"\n (closed)=\"showActorTagsDialog = false\"></lib-actor-tags-dialog>\n</div>\n", styles: [".workflow-designer{display:flex;flex-direction:column;height:100vh;background-color:#f8fafc}.workflow-header{padding:1rem;background-color:#fff;border-bottom:1px solid #e2e8f0;text-align:center}.workflow-header h1{font-size:1.25rem;font-weight:600;color:#334155;margin:0}.loading-overlay{position:absolute;inset:0;background-color:#ffffffb3;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:1000}.loading-spinner{border:4px solid #f3f3f3;border-top:4px solid #d8b4fe;border-radius:50%;width:40px;height:40px;animation:spin 1s linear infinite}.loading-text{margin-top:1rem;font-size:1rem;color:#7e22ce}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.DesignerToolbarComponent, selector: "lib-designer-toolbar", inputs: ["selectedTool", "isSaving", "workflowCode"], outputs: ["openActorTags", "toolSelected", "saveWorkflow"] }, { kind: "component", type: i6.DesignerCanvasComponent, selector: "lib-designer-canvas", inputs: ["selectedTool"], outputs: ["clickedPosition", "subflowSelected", "stagePropertiesUpdated", "actionPropertiesUpdated"] }, { kind: "component", type: i7.SwimlaneDialogComponent, selector: "lib-swimlane-dialog", inputs: ["visible", "swimlaneData"], outputs: ["closed", "created"] }, { kind: "component", type: i8.ActorTagsDialogComponent, selector: "lib-actor-tags-dialog", inputs: ["visible", "workflowCode"], outputs: ["closed"] }] });
397
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WorkflowDesignerComponent, selector: "lib-workflow-designer", inputs: { workflowCode: "workflowCode" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvasRef"], descendants: true }], ngImport: i0, template: "<div class=\"workflow-designer\">\n <div class=\"workflow-header\">\n <h1>{{ state.workflow?.Name }}</h1>\n </div>\n\n <!-- Toolbar Component -->\n <lib-designer-toolbar [selectedTool]=\"selectedTool\" [isSaving]=\"isSaving\"\n [workflowCode]=\"state.workflow?.Code || null\" (toolSelected)=\"onToolSelected($event)\"\n (saveWorkflow)=\"saveWorkflow()\" (openActorTags)=\"openActorTagsDialog()\">\n </lib-designer-toolbar>\n\n <!-- Show loading indicator if needed -->\n <div *ngIf=\"isLoading\" class=\"loading-overlay\">\n <div class=\"loading-spinner\"></div>\n <div class=\"loading-text\">Loading workflow...</div>\n </div>\n\n <!-- Canvas Component -->\n <lib-designer-canvas [selectedTool]=\"selectedTool\" (clickedPosition)=\"handleCanvasPositionClick($event)\"\n (subflowSelected)=\"onSubflowSelected()\" #canvasRef>\n </lib-designer-canvas>\n\n <lib-swimlane-dialog [visible]=\"showSwimlaneDialog\" [swimlaneData]=\"editingSwimlane()\"\n [isEditing]=\"editingSwimlaneIndex !== null\" (created)=\"onSwimlaneDialogFilled($event)\"\n (deleted)=\"onSwimlaneDialogDeleted()\" (closed)=\"showSwimlaneDialog = false\"></lib-swimlane-dialog>\n\n <lib-actor-tags-dialog [visible]=\"showActorTagsDialog\" [workflowCode]=\"state.workflow?.Code || null\"\n (closed)=\"showActorTagsDialog = false\"></lib-actor-tags-dialog>\n</div>\n", styles: [".workflow-designer{display:flex;flex-direction:column;height:100vh;background-color:#f8fafc}.workflow-header{padding:1rem;background-color:#fff;border-bottom:1px solid #e2e8f0;text-align:center}.workflow-header h1{font-size:1.25rem;font-weight:600;color:#334155;margin:0}.loading-overlay{position:absolute;inset:0;background-color:#ffffffb3;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:1000}.loading-spinner{border:4px solid #f3f3f3;border-top:4px solid #d8b4fe;border-radius:50%;width:40px;height:40px;animation:spin 1s linear infinite}.loading-text{margin-top:1rem;font-size:1rem;color:#7e22ce}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.DesignerToolbarComponent, selector: "lib-designer-toolbar", inputs: ["selectedTool", "isSaving", "workflowCode"], outputs: ["openActorTags", "toolSelected", "saveWorkflow"] }, { kind: "component", type: i6.DesignerCanvasComponent, selector: "lib-designer-canvas", inputs: ["selectedTool"], outputs: ["clickedPosition", "subflowSelected", "stagePropertiesUpdated", "actionPropertiesUpdated"] }, { kind: "component", type: i7.SwimlaneDialogComponent, selector: "lib-swimlane-dialog", inputs: ["visible", "isEditing", "swimlaneData"], outputs: ["closed", "created", "deleted"] }, { kind: "component", type: i8.ActorTagsDialogComponent, selector: "lib-actor-tags-dialog", inputs: ["visible", "workflowCode"], outputs: ["closed"] }] });
356
398
  }
357
399
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WorkflowDesignerComponent, decorators: [{
358
400
  type: Component,
359
- args: [{ selector: 'lib-workflow-designer', template: "<div class=\"workflow-designer\">\n <div class=\"workflow-header\">\n <h1>{{ state.workflow?.Name }}</h1>\n </div>\n\n <!-- Toolbar Component -->\n <lib-designer-toolbar [selectedTool]=\"selectedTool\" [isSaving]=\"isSaving\"\n [workflowCode]=\"state.workflow?.Code || null\" (toolSelected)=\"onToolSelected($event)\"\n (saveWorkflow)=\"saveWorkflow()\" (openActorTags)=\"openActorTagsDialog()\">\n </lib-designer-toolbar>\n\n <!-- Show loading indicator if needed -->\n <div *ngIf=\"isLoading\" class=\"loading-overlay\">\n <div class=\"loading-spinner\"></div>\n <div class=\"loading-text\">Loading workflow...</div>\n </div>\n\n <!-- Canvas Component -->\n <lib-designer-canvas [selectedTool]=\"selectedTool\" (clickedPosition)=\"handleCanvasPositionClick($event)\"\n (subflowSelected)=\"onSubflowSelected()\" #canvasRef>\n </lib-designer-canvas>\n\n <lib-swimlane-dialog [visible]=\"showSwimlaneDialog\" [swimlaneData]=\"editingSwimlane()\"\n (created)=\"onSwimlaneDialogFilled($event)\" (closed)=\"showSwimlaneDialog = false\"></lib-swimlane-dialog>\n\n <lib-actor-tags-dialog [visible]=\"showActorTagsDialog\" [workflowCode]=\"state.workflow?.Code || null\"\n (closed)=\"showActorTagsDialog = false\"></lib-actor-tags-dialog>\n</div>\n", styles: [".workflow-designer{display:flex;flex-direction:column;height:100vh;background-color:#f8fafc}.workflow-header{padding:1rem;background-color:#fff;border-bottom:1px solid #e2e8f0;text-align:center}.workflow-header h1{font-size:1.25rem;font-weight:600;color:#334155;margin:0}.loading-overlay{position:absolute;inset:0;background-color:#ffffffb3;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:1000}.loading-spinner{border:4px solid #f3f3f3;border-top:4px solid #d8b4fe;border-radius:50%;width:40px;height:40px;animation:spin 1s linear infinite}.loading-text{margin-top:1rem;font-size:1rem;color:#7e22ce}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
401
+ args: [{ selector: 'lib-workflow-designer', template: "<div class=\"workflow-designer\">\n <div class=\"workflow-header\">\n <h1>{{ state.workflow?.Name }}</h1>\n </div>\n\n <!-- Toolbar Component -->\n <lib-designer-toolbar [selectedTool]=\"selectedTool\" [isSaving]=\"isSaving\"\n [workflowCode]=\"state.workflow?.Code || null\" (toolSelected)=\"onToolSelected($event)\"\n (saveWorkflow)=\"saveWorkflow()\" (openActorTags)=\"openActorTagsDialog()\">\n </lib-designer-toolbar>\n\n <!-- Show loading indicator if needed -->\n <div *ngIf=\"isLoading\" class=\"loading-overlay\">\n <div class=\"loading-spinner\"></div>\n <div class=\"loading-text\">Loading workflow...</div>\n </div>\n\n <!-- Canvas Component -->\n <lib-designer-canvas [selectedTool]=\"selectedTool\" (clickedPosition)=\"handleCanvasPositionClick($event)\"\n (subflowSelected)=\"onSubflowSelected()\" #canvasRef>\n </lib-designer-canvas>\n\n <lib-swimlane-dialog [visible]=\"showSwimlaneDialog\" [swimlaneData]=\"editingSwimlane()\"\n [isEditing]=\"editingSwimlaneIndex !== null\" (created)=\"onSwimlaneDialogFilled($event)\"\n (deleted)=\"onSwimlaneDialogDeleted()\" (closed)=\"showSwimlaneDialog = false\"></lib-swimlane-dialog>\n\n <lib-actor-tags-dialog [visible]=\"showActorTagsDialog\" [workflowCode]=\"state.workflow?.Code || null\"\n (closed)=\"showActorTagsDialog = false\"></lib-actor-tags-dialog>\n</div>\n", styles: [".workflow-designer{display:flex;flex-direction:column;height:100vh;background-color:#f8fafc}.workflow-header{padding:1rem;background-color:#fff;border-bottom:1px solid #e2e8f0;text-align:center}.workflow-header h1{font-size:1.25rem;font-weight:600;color:#334155;margin:0}.loading-overlay{position:absolute;inset:0;background-color:#ffffffb3;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:1000}.loading-spinner{border:4px solid #f3f3f3;border-top:4px solid #d8b4fe;border-radius:50%;width:40px;height:40px;animation:spin 1s linear infinite}.loading-text{margin-top:1rem;font-size:1rem;color:#7e22ce}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
360
402
  }], ctorParameters: () => [{ type: i1.WorkflowDesignerState }, { type: i2.WorkflowDataService }, { type: i3.UtilService }], propDecorators: { canvasRef: [{
361
403
  type: ViewChild,
362
404
  args: ['canvasRef']
363
405
  }], workflowCode: [{
364
406
  type: Input
365
407
  }] } });
366
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctZGVzaWduZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvY29tcG9uZW50cy93b3JrZmxvdy1kZXNpZ25lci93b3JrZmxvdy1kZXNpZ25lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9jb21wb25lbnRzL3dvcmtmbG93LWRlc2lnbmVyL3dvcmtmbG93LWRlc2lnbmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBaUIsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7OztBQVlqRixNQUFNLE9BQU8seUJBQXlCO0lBaUIzQjtJQUNDO0lBQ0E7SUFsQmMsU0FBUyxDQUEyQjtJQUNuRCxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUU1QywwQkFBMEI7SUFDMUIsWUFBWSxHQUFhLElBQUksQ0FBQztJQUM5QixrQkFBa0IsR0FBWSxLQUFLLENBQUM7SUFDcEMsbUJBQW1CLEdBQVksS0FBSyxDQUFDO0lBRXJDLG9CQUFvQixHQUFrQixJQUFJLENBQUM7SUFDM0MsZUFBZSxHQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVmLFNBQVMsR0FBWSxLQUFLLENBQUM7SUFDM0IsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUUxQixZQUNTLEtBQTRCLEVBQzNCLFdBQWdDLEVBQ2hDLFdBQXdCO1FBRnpCLFVBQUssR0FBTCxLQUFLLENBQXVCO1FBQzNCLGdCQUFXLEdBQVgsV0FBVyxDQUFxQjtRQUNoQyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtJQUM5QixDQUFD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QUMsb0JBQW9CLENBQzFCLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN2QywyQkFBMkI7WUFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FDVCxzQ0FBc0MsRUFDdEMsSUFBSSxDQUFDLG9CQUFvQixDQUMxQixDQUFDO1lBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsRUFDekIsS0FBSyxDQUFDLElBQUksRUFDVixLQUFLLENBQUMsSUFBSSxDQUNYLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLHNCQUFzQjtZQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBSUQsaUJBQWlCO1FBQ2YsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztJQUNsQyxDQUFDO3dHQTFiVSx5QkFBeUI7NEZBQXpCLHlCQUF5QiwrTUNuQnRDLGd3Q0E0QkE7OzRGRFRhLHlCQUF5QjtrQkFMckMsU0FBUzsrQkFDRSx1QkFBdUI7c0pBS1QsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNiLFlBQVk7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBzaWduYWwsXG4gIFZpZXdDaGlsZCxcbiAgV3JpdGFibGVTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRXJyb3JSZXNwb25zZSwgVGFnLCBXb3JrZmxvdyB9IGZyb20gJ3ZlcmJlbi13b3JrZmxvdy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBVdGlsU2VydmljZSB9IGZyb20gJ3ZlcmJlbi13b3JrZmxvdy11aS9zcmMvbGliL3NlcnZpY2VzJztcbmltcG9ydCB7IERlc2lnbmVyQ2FudmFzQ29tcG9uZW50IH0gZnJvbSAnLi9kZXNpZ25lci1jYW52YXMvZGVzaWduZXItY2FudmFzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXb3JrZmxvd0RhdGFTZXJ2aWNlIH0gZnJvbSAnLi93b3JrZmxvdy1kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgV29ya2Zsb3dEZXNpZ25lclN0YXRlIH0gZnJvbSAnLi93b3JrZmxvdy1kZXNpZ25lci5zdGF0ZSc7XG5pbXBvcnQgeyBOb2RlLCBUb29sVHlwZSB9IGZyb20gJy4vd29ya2Zsb3ctZGVzaWduZXIudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItd29ya2Zsb3ctZGVzaWduZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vd29ya2Zsb3ctZGVzaWduZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vd29ya2Zsb3ctZGVzaWduZXIuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFdvcmtmbG93RGVzaWduZXJDb21wb25lbnQge1xuICBAVmlld0NoaWxkKCdjYW52YXNSZWYnKSBjYW52YXNSZWYhOiBEZXNpZ25lckNhbnZhc0NvbXBvbmVudDtcbiAgQElucHV0KCkgd29ya2Zsb3dDb2RlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvLyBDdXJyZW50bHkgc2VsZWN0ZWQgdG9vbFxuICBzZWxlY3RlZFRvb2w6IFRvb2xUeXBlID0gbnVsbDtcbiAgc2hvd1N3aW1sYW5lRGlhbG9nOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dBY3RvclRhZ3NEaWFsb2c6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBlZGl0aW5nU3dpbWxhbmVJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIGVkaXRpbmdTd2ltbGFuZTogV3JpdGFibGVTaWduYWw8eyBuYW1lOiBzdHJpbmc7IHRhZ3M6IFRhZ1tdIH0gfCBudWxsPiA9XG4gICAgc2lnbmFsKG51bGwpO1xuXG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1NhdmluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzdGF0ZTogV29ya2Zsb3dEZXNpZ25lclN0YXRlLFxuICAgIHByaXZhdGUgZGF0YVNlcnZpY2U6IFdvcmtmbG93RGF0YVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1dGlsU2VydmljZTogVXRpbFNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBMb2FkIHdvcmtmbG93IGRhdGEgaWYgY29kZSBpcyBwcm92aWRlZFxuICAgIGlmICh0aGlzLndvcmtmbG93Q29kZSkge1xuICAgICAgdGhpcy5sb2FkV29ya2Zsb3codGhpcy53b3JrZmxvd0NvZGUpO1xuICAgIH1cbiAgfVxuXG4gIHNhdmVXb3JrZmxvdygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1NhdmluZykgcmV0dXJuO1xuXG4gICAgdGhpcy5pc1NhdmluZyA9IHRydWU7XG5cbiAgICAvLyBUcmFuc2Zvcm0gdGhlIFVJIG1vZGVsIHRvIHRoZSBBUEkgbW9kZWxcbiAgICBjb25zdCB3b3JrZmxvd01vZGVsID0gdGhpcy5zdGF0ZS50cmFuc2Zvcm1Ub1dvcmtmbG93TW9kZWwoKTtcblxuICAgIGlmICh3b3JrZmxvd01vZGVsKSB7XG4gICAgICAvLyBTYXZlIHRvIHRoZSBiYWNrZW5kXG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlXG4gICAgICAgIC5zYXZlV29ya2Zsb3dzKFt3b3JrZmxvd01vZGVsXSlcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93RXJyb3IocmVzcG9uc2UuRXJyb3JNc2cpO1xuICAgICAgICAgICAgdGhpcy5pc1NhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnV29ya2Zsb3cgc2F2ZWQgc3VjY2Vzc2Z1bGx5OicsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ1dvcmtmbG93IHNhdmVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgLy8gSWYgdGhlIEFQSSByZXR1cm5zIGFuIHVwZGF0ZWQgd29ya2Zsb3csIHdlIG1pZ2h0IHdhbnQgdG8gcmVsb2FkIGl0XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkV29ya2Zsb3cgPSByZXNwb25zZVswXTtcbiAgICAgICAgICAgIGlmICh1cGRhdGVkV29ya2Zsb3cpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5zZXRXb3JrZmxvd0lkKHVwZGF0ZWRXb3JrZmxvdy5Db2RlKTtcbiAgICAgICAgICAgICAgdGhpcy5wYXJzZVdvcmtmbG93RGF0YSh1cGRhdGVkV29ya2Zsb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pc1NhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNhdmluZyB3b3JrZmxvdzonLCBlcnJvcik7XG4gICAgICAgICAgdGhpcy5pc1NhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIC8vIEhhbmRsZSBlcnJvciAtIHNob3cgYSBub3RpZmljYXRpb24sIGV0Yy5cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbG9hZFdvcmtmbG93KGNvZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmRhdGFTZXJ2aWNlXG4gICAgICAuZ2V0V29ya2Zsb3dXaXRoUGFyYW0oY29kZSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuUmVzdWx0KSB7XG4gICAgICAgICAgLy8gU3RvcmUgdGhlIHdvcmtmbG93IElEXG4gICAgICAgICAgY29uc3Qgd2YgPSByZXNwb25zZS5SZXN1bHRbMF07XG4gICAgICAgICAgdGhpcy5zdGF0ZS5zZXRXb3JrZmxvd0lkKHdmLkNvZGUpO1xuICAgICAgICAgIHRoaXMucGFyc2VXb3JrZmxvd0RhdGEod2YpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHdvcmtmbG93OicsIGVycm9yKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gTWV0aG9kIHRvIHBhcnNlIHdvcmtmbG93IGRhdGEgZnJvbSBBUEkgYW5kIHBvcHVsYXRlIHRoZSBkZXNpZ25lclxuICBwYXJzZVdvcmtmbG93RGF0YSh3b3JrZmxvdzogV29ya2Zsb3cpOiB2b2lkIHtcbiAgICAvLyBTdG9yZSB0aGUgY29tcGxldGUgd29ya2Zsb3dcbiAgICB0aGlzLnN0YXRlLndvcmtmbG93ID0gd29ya2Zsb3c7XG5cbiAgICAvLyBDbGVhciBleGlzdGluZyBzdGF0ZVxuICAgIHRoaXMuc3RhdGUuc3dpbWxhbmVzID0gW107XG4gICAgdGhpcy5zdGF0ZS5jb25uZWN0aW9ucyA9IFtdO1xuICAgIHRoaXMuc3RhdGUuc3dpbWxhbmVSZWNvcmQgPSB7fTtcbiAgICB0aGlzLnN0YXRlLnN0YWdlUmVjb3JkID0ge307XG4gICAgdGhpcy5zdGF0ZS5hY3Rpb25SZWNvcmQgPSB7fTtcblxuICAgIC8vIFNldCB3b3JrZmxvdyBmb3JtIGlmIGV4aXN0c1xuICAgIGlmICh3b3JrZmxvdy5Gb3JtKSB7XG4gICAgICB0aGlzLnN0YXRlLnNldFdvcmtmbG93Rm9ybShcbiAgICAgICAgd29ya2Zsb3cuRm9ybSxcbiAgICAgICAgd29ya2Zsb3cuRm9ybU5hbWUgfHwgJ1dvcmtmbG93IEZvcm0nXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFN0b3JlIHRoZSB3b3JrZmxvdyBJRFxuICAgIHRoaXMuc3RhdGUuc2V0V29ya2Zsb3dJZCh3b3JrZmxvdy5Db2RlKTtcblxuICAgIC8vIFByb2Nlc3Mgc3dpbWxhbmVzIGZpcnN0XG4gICAgaWYgKHdvcmtmbG93LkxhbmVzICYmIHdvcmtmbG93LkxhbmVzLmxlbmd0aCkge1xuICAgICAgd29ya2Zsb3cuTGFuZXMuc29ydCgoYSwgYikgPT4gYS5Qb3NpdGlvbiAtIGIuUG9zaXRpb24pLmZvckVhY2goKGxhbmUpID0+IHtcbiAgICAgICAgLy8gU3RvcmUgb3JpZ2luYWwgbGFuZSBpbiByZWNvcmRcbiAgICAgICAgdGhpcy5zdGF0ZS5zd2ltbGFuZVJlY29yZFtsYW5lLkNvZGVdID0gbGFuZTtcblxuICAgICAgICAvLyBBZGQgc3dpbWxhbmUgdG8gVUkgbW9kZWwgd2l0aCB0aGUgb3JpZ2luYWwgSURcbiAgICAgICAgY29uc3Qgc3dpbWxhbmUgPSB7XG4gICAgICAgICAgb3JkZXI6IGxhbmUuUG9zaXRpb24sXG4gICAgICAgICAgbGFiZWw6IGxhbmUuTmFtZSB8fCBgTGFuZSAke2xhbmUuUG9zaXRpb259YCxcbiAgICAgICAgICB0YWdzOiBsYW5lLlRhZ3MgfHwgW10sXG4gICAgICAgICAgbm9kZXM6IFtdLFxuICAgICAgICAgIGlkOiBsYW5lLkNvZGUsIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBJRFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc3RhdGUuc3dpbWxhbmVzLnB1c2goc3dpbWxhbmUpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIGxvYWRlZCBvYmplY3RcbiAgICAgICAgdGhpcy5zdGF0ZS5yZWdpc3RlckxvYWRlZE9iamVjdChsYW5lLklkLCBsYW5lLkNvZGUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBzdGFnZXNcbiAgICBpZiAod29ya2Zsb3cuU3RhZ2VzICYmIHdvcmtmbG93LlN0YWdlcy5sZW5ndGgpIHtcbiAgICAgIHdvcmtmbG93LlN0YWdlcy5mb3JFYWNoKChzdGFnZSkgPT4ge1xuICAgICAgICAvLyBTdG9yZSBvcmlnaW5hbCBzdGFnZSBpbiByZWNvcmRcbiAgICAgICAgdGhpcy5zdGF0ZS5zdGFnZVJlY29yZFtzdGFnZS5Db2RlXSA9IHN0YWdlO1xuXG4gICAgICAgIC8vIEZpbmQgc3dpbWxhbmUgaW5kZXggYnkgU3dpbUxhbmUgSURcbiAgICAgICAgY29uc3Qgc3dpbWxhbmVJbmRleCA9IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmZpbmRJbmRleChcbiAgICAgICAgICAobGFuZSkgPT4gbGFuZS5pZCA9PT0gc3RhZ2UuU3dpbUxhbmVcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoc3dpbWxhbmVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBjb25zdCB4ID0gc3RhZ2UuQ29vcmRpbmF0ZXM/LlggfHwgMTAwO1xuICAgICAgICAgIGNvbnN0IHkgPSBzdGFnZS5Db29yZGluYXRlcz8uWSB8fCA1MDtcblxuICAgICAgICAgIC8vIENyZWF0ZSBub2RlIHdpdGggb3JpZ2luYWwgSURcbiAgICAgICAgICBjb25zdCBub2RlOiBOb2RlID0ge1xuICAgICAgICAgICAgaWQ6IHN0YWdlLkNvZGUsIC8vIFVzZSBvcmlnaW5hbCBJRFxuICAgICAgICAgICAgdHlwZTogc3RhZ2UuSXNTdWJQcm9jZXNzID8gJ3N1YmZsb3cnIDogKCdzdGFnZScgYXMgY29uc3QpLFxuICAgICAgICAgICAgeDogeCxcbiAgICAgICAgICAgIHk6IHksXG4gICAgICAgICAgICB3aWR0aDogMTY5LFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDAsXG4gICAgICAgICAgICBpc1N0YXJ0Tm9kZTogc3RhZ2UuSXNFbnRyeVBvaW50LFxuICAgICAgICAgICAgc3RhZ2VEYXRhOiB7XG4gICAgICAgICAgICAgIE5hbWU6IHN0YWdlLk5hbWUsXG4gICAgICAgICAgICAgIERlc2NyaXB0aW9uOiBzdGFnZS5EZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgRHVyYXRpb246IHN0YWdlLkR1cmF0aW9uLFxuICAgICAgICAgICAgICBQYXNzT25SdWxlOiBzdGFnZS5QYXNzT25SdWxlLFxuICAgICAgICAgICAgICBBY3RvclJ1bGU6IHN0YWdlLkFjdG9yUnVsZSxcbiAgICAgICAgICAgICAgTWluTm9PZkFjdG9yOiBzdGFnZS5NaW5Ob09mQWN0b3IsXG4gICAgICAgICAgICAgIFRhZ3M6IHN0YWdlLlRhZ3MgfHwgW10sXG4gICAgICAgICAgICAgIElzUGFyYWxsZWw6IHN0YWdlLklzUGFyYWxsZWwsXG4gICAgICAgICAgICAgIElzRW50cnlQb2ludDogc3RhZ2UuSXNFbnRyeVBvaW50LFxuICAgICAgICAgICAgICBJc0V4aXRQb2ludDogc3RhZ2UuSXNFeGl0UG9pbnQsXG4gICAgICAgICAgICAgIElzU3ViUHJvY2Vzczogc3RhZ2UuSXNTdWJQcm9jZXNzLFxuICAgICAgICAgICAgICBBc3NpZ25tZW50VHlwZTogc3RhZ2UuQXNzaWdubWVudFR5cGUsXG4gICAgICAgICAgICAgIElkOiBzdGFnZS5JZCwgLy8gS2VlcCBvcmlnaW5hbCBJRFxuICAgICAgICAgICAgICBDb2RlOiBzdGFnZS5Db2RlLFxuICAgICAgICAgICAgICBGb3JtOiBzdGFnZS5Gb3JtLFxuICAgICAgICAgICAgICBmb3JtSWQ6IHN0YWdlLkZvcm0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29ubmVjdGlvblBvaW50czogW10sIC8vIEluaXRpYWxpemUgd2l0aCBlbXB0eSBhcnJheVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBHZW5lcmF0ZSBjb25uZWN0aW9uIHBvaW50c1xuICAgICAgICAgIG5vZGUuY29ubmVjdGlvblBvaW50cyA9IHRoaXMuc3RhdGUuZ2VuZXJhdGVDb25uZWN0aW9uUG9pbnRzKG5vZGUpO1xuXG4gICAgICAgICAgLy8gQWRkIG5vZGUgdG8gc3dpbWxhbmVcbiAgICAgICAgICB0aGlzLnN0YXRlLnN3aW1sYW5lc1tzd2ltbGFuZUluZGV4XS5ub2RlcyA9XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnN3aW1sYW5lc1tzd2ltbGFuZUluZGV4XS5ub2RlcyB8fCBbXTtcbiAgICAgICAgICB0aGlzLnN0YXRlLnN3aW1sYW5lc1tzd2ltbGFuZUluZGV4XS5ub2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN0YXJ0IG5vZGUsIHVwZGF0ZSBzdGF0ZVxuICAgICAgICAgIGlmIChzdGFnZS5Jc0VudHJ5UG9pbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuc3RhcnROb2RlSWQgPSBzdGFnZS5Db2RlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlZ2lzdGVyIGxvYWRlZCBzdGFnZVxuICAgICAgICAgIHRoaXMuc3RhdGUucmVnaXN0ZXJMb2FkZWRPYmplY3Qoc3RhZ2UuSWQsIHN0YWdlLkNvZGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGNvbm5lY3Rpb25zL2FjdGlvbnNcbiAgICBpZiAod29ya2Zsb3cuQWN0aW9ucyAmJiB3b3JrZmxvdy5BY3Rpb25zLmxlbmd0aCkge1xuICAgICAgd29ya2Zsb3cuQWN0aW9ucy5mb3JFYWNoKChhY3Rpb24pID0+IHtcbiAgICAgICAgLy8gU3RvcmUgb3JpZ2luYWwgYWN0aW9uIGluIHJlY29yZFxuICAgICAgICB0aGlzLnN0YXRlLmFjdGlvblJlY29yZFthY3Rpb24uQ29kZV0gPSBhY3Rpb247XG5cbiAgICAgICAgLy8gRmluZCBzb3VyY2UgYW5kIHRhcmdldCBub2Rlc1xuICAgICAgICBjb25zdCBzb3VyY2VOb2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKGFjdGlvbi5Gcm9tU3RhZ2UpO1xuICAgICAgICBjb25zdCB0YXJnZXROb2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKGFjdGlvbi5Ub1N0YWdlKTtcblxuICAgICAgICBjb25zb2xlLmxvZyhzb3VyY2VOb2RlSW5mbywgdGFyZ2V0Tm9kZUluZm8pO1xuXG4gICAgICAgIGlmIChzb3VyY2VOb2RlSW5mbyAmJiB0YXJnZXROb2RlSW5mbykge1xuICAgICAgICAgIC8vIEZpbmQgc3VpdGFibGUgY29ubmVjdGlvbiBwb2ludHNcbiAgICAgICAgICAvLyBjb25zdCBzb3VyY2VOb2RlID0gc291cmNlTm9kZUluZm8ubm9kZTtcbiAgICAgICAgICAvLyBjb25zdCB0YXJnZXROb2RlID0gdGFyZ2V0Tm9kZUluZm8ubm9kZTtcblxuICAgICAgICAgIC8vIGNvbnN0IHNvdXJjZVBvaW50ID0gc291cmNlTm9kZS5jb25uZWN0aW9uUG9pbnRzPy5maW5kKFxuICAgICAgICAgIC8vICAgKHApID0+IHAudHlwZSA9PT0gJ3JpZ2h0JyB8fCBwLnR5cGUgPT09ICdib3R0b20nXG4gICAgICAgICAgLy8gKTtcblxuICAgICAgICAgIC8vIGNvbnN0IHRhcmdldFBvaW50ID0gdGFyZ2V0Tm9kZS5jb25uZWN0aW9uUG9pbnRzPy5maW5kKFxuICAgICAgICAgIC8vICAgKHApID0+IHAudHlwZSA9PT0gJ2xlZnQnIHx8IHAudHlwZSA9PT0gJ3RvcCdcbiAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgY29uc3Qgc291cmNlTm9kZSA9IHNvdXJjZU5vZGVJbmZvLm5vZGU7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Tm9kZSA9IHRhcmdldE5vZGVJbmZvLm5vZGU7XG5cbiAgICAgICAgICBsZXQgc291cmNlUG9pbnRJZCwgdGFyZ2V0UG9pbnRJZDtcblxuICAgICAgICAgIGNvbnNvbGUubG9nKGFjdGlvbi5Tb3VyY2VQb2ludFR5cGUsIGFjdGlvbi5UYXJnZXRQb2ludFR5cGUpO1xuXG4gICAgICAgICAgaWYgKGFjdGlvbi5Tb3VyY2VQb2ludFR5cGUpIHtcbiAgICAgICAgICAgIC8vIEZpbmQgYSBwb2ludCB3aXRoIG1hdGNoaW5nIHR5cGVcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVBvaW50ID0gc291cmNlTm9kZS5jb25uZWN0aW9uUG9pbnRzPy5maW5kKFxuICAgICAgICAgICAgICAocCkgPT4gcC50eXBlID09PSBhY3Rpb24uU291cmNlUG9pbnRUeXBlPy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc291cmNlUG9pbnRJZCA9IHNvdXJjZVBvaW50Py5pZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2sgdG8gZmluZGluZyBhIHN1aXRhYmxlIHBvaW50XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VQb2ludCA9IHNvdXJjZU5vZGUuY29ubmVjdGlvblBvaW50cz8uZmluZChcbiAgICAgICAgICAgICAgKHApID0+IHAudHlwZSA9PT0gJ3JpZ2h0JyB8fCBwLnR5cGUgPT09ICdib3R0b20nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc291cmNlUG9pbnRJZCA9IHNvdXJjZVBvaW50Py5pZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYWN0aW9uLlRhcmdldFBvaW50VHlwZSkge1xuICAgICAgICAgICAgLy8gRmluZCBhIHBvaW50IHdpdGggbWF0Y2hpbmcgdHlwZVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0UG9pbnQgPSB0YXJnZXROb2RlLmNvbm5lY3Rpb25Qb2ludHM/LmZpbmQoXG4gICAgICAgICAgICAgIChwKSA9PiBwLnR5cGUgPT09IGFjdGlvbi5UYXJnZXRQb2ludFR5cGU/LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0YXJnZXRQb2ludElkID0gdGFyZ2V0UG9pbnQ/LmlkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjayB0byBmaW5kaW5nIGEgc3VpdGFibGUgcG9pbnRcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFBvaW50ID0gdGFyZ2V0Tm9kZS5jb25uZWN0aW9uUG9pbnRzPy5maW5kKFxuICAgICAgICAgICAgICAocCkgPT4gcC50eXBlID09PSAnbGVmdCcgfHwgcC50eXBlID09PSAndG9wJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRhcmdldFBvaW50SWQgPSB0YXJnZXRQb2ludD8uaWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc29sZS5sb2coJ1NvdXJjZSBwb2ludDonLCBzb3VyY2VQb2ludElkKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnVGFyZ2V0IHBvaW50OicsIHRhcmdldFBvaW50SWQpO1xuXG4gICAgICAgICAgaWYgKHNvdXJjZVBvaW50SWQgJiYgdGFyZ2V0UG9pbnRJZCkge1xuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHtcbiAgICAgICAgICAgICAgaWQ6IGFjdGlvbi5Db2RlLCAvLyBVc2Ugb3JpZ2luYWwgSURcbiAgICAgICAgICAgICAgc291cmNlTm9kZUlkOiBhY3Rpb24uRnJvbVN0YWdlLFxuICAgICAgICAgICAgICB0YXJnZXROb2RlSWQ6IGFjdGlvbi5Ub1N0YWdlLFxuICAgICAgICAgICAgICBzb3VyY2VQb2ludElkOiBzb3VyY2VQb2ludElkLFxuICAgICAgICAgICAgICB0YXJnZXRQb2ludElkOiB0YXJnZXRQb2ludElkLFxuICAgICAgICAgICAgICBzb3VyY2VTd2ltbGFuZUluZGV4OiBzb3VyY2VOb2RlSW5mby5zd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgICB0YXJnZXRTd2ltbGFuZUluZGV4OiB0YXJnZXROb2RlSW5mby5zd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgICBjb25kaXRpb246IGFjdGlvbi5QYXNzT25SdWxlIHx8ICcnLFxuICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uLk5hbWUgfHwgJycsXG4gICAgICAgICAgICAgIGFjdGlvbjogYWN0aW9uLk9wZXJhdGlvbkFjdGlvbiB8fCBudWxsLFxuICAgICAgICAgICAgICB0YXJnZXRTdGF0dXM6IGFjdGlvbi5UYXJnZXRTdGF0dXMgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5jb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pO1xuXG4gICAgICAgICAgICAvLyBSZWdpc3RlciBsb2FkZWQgYWN0aW9uXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnJlZ2lzdGVyTG9hZGVkT2JqZWN0KGFjdGlvbi5JZCwgYWN0aW9uLkNvZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBmaW5kIHN3aW1sYW5lIGluZGV4IGJ5IExhbmUgSURcbiAgZmluZFN3aW1sYW5lSW5kZXhCeUxhbmVJZChsYW5lSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgLy8gRmlyc3QgY2hlY2sgb3VyIG1hcHBpbmdcbiAgICBpZiAodGhpcy5zdGF0ZS5sYW5lSWRUb0luZGV4TWFwLmhhcyhsYW5lSWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZS5sYW5lSWRUb0luZGV4TWFwLmdldChsYW5lSWQpITtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byB0aGUgb3JpZ2luYWwgbG9naWMgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgIGNvbnN0IHBhcnRzID0gbGFuZUlkLnNwbGl0KCctJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQocGFydHNbMV0pO1xuICAgICAgaWYgKCFpc05hTihpbmRleCkgJiYgaW5kZXggPCB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIEhhbmRsZSB0b29sIHNlbGVjdGlvbiBmcm9tIHRvb2xiYXJcbiAgb25Ub29sU2VsZWN0ZWQodG9vbDogVG9vbFR5cGUpOiB2b2lkIHtcbiAgICAvLyBUb2dnbGUgc2VsZWN0aW9uIGlmIHRoZSBzYW1lIHRvb2wgaXMgY2xpY2tlZCBhZ2FpblxuICAgIHRoaXMuc2VsZWN0ZWRUb29sID0gdGhpcy5zZWxlY3RlZFRvb2wgPT09IHRvb2wgPyBudWxsIDogdG9vbDtcbiAgICBjb25zb2xlLmxvZygnU2VsZWN0ZWQgdG9vbDonLCB0aGlzLnNlbGVjdGVkVG9vbCk7XG4gIH1cblxuICBvcGVuU3dpbWxhbmVEaWFsb2coKSB7XG4gICAgY29uc29sZS5sb2coJ1NNTCBJTkRFWCcsIHRoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXgpO1xuICAgIGlmICh0aGlzLmVkaXRpbmdTd2ltbGFuZUluZGV4ICE9PSBudWxsKSB7XG4gICAgICBjb25zb2xlLmxvZygnU01MJywgdGhpcy5zdGF0ZS5zd2ltbGFuZXNbdGhpcy5lZGl0aW5nU3dpbWxhbmVJbmRleF0pO1xuICAgICAgdGhpcy5lZGl0aW5nU3dpbWxhbmUuc2V0KHtcbiAgICAgICAgbmFtZTogdGhpcy5zdGF0ZS5zd2ltbGFuZXNbdGhpcy5lZGl0aW5nU3dpbWxhbmVJbmRleF0ubGFiZWwsXG4gICAgICAgIHRhZ3M6IHRoaXMuc3RhdGUuc3dpbWxhbmVzW3RoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXhdLnRhZ3MsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUubG9nKCdTTUxfRURUJywgdGhpcy5lZGl0aW5nU3dpbWxhbmUoKSk7XG4gICAgfVxuICAgIHRoaXMuc2hvd1N3aW1sYW5lRGlhbG9nID0gdHJ1ZTtcbiAgfVxuXG5cblxuICBoYW5kbGVDYW52YXNQb3NpdGlvbkNsaWNrKGV2ZW50OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pIHtcbiAgICBjb25zb2xlLmxvZyhldmVudCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFuIGVkaXQgc3dpbWxhbmUgZXZlbnRcbiAgICBpZiAoXG4gICAgICBldmVudC54ID09PSAtMSAmJlxuICAgICAgZXZlbnQueSA+PSAwICYmXG4gICAgICBldmVudC55IDwgdGhpcy5zdGF0ZS5zd2ltbGFuZXMubGVuZ3RoXG4gICAgKSB7XG4gICAgICBjb25zb2xlLmxvZygnRWRpdGluZyBzd2ltbGFuZScsIGV2ZW50LnkpO1xuICAgICAgdGhpcy5lZGl0aW5nU3dpbWxhbmVJbmRleCA9IGV2ZW50Lnk7XG4gICAgICB0aGlzLm9wZW5Td2ltbGFuZURpYWxvZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE5vcm1hbCBjYW52YXMgY2xpY2sgaGFuZGxpbmdcbiAgICBjb25zdCBzd2ltbGFuZUluZGV4ID0gTWF0aC5mbG9vcihldmVudC55IC8gMjYzKTtcblxuICAgIHN3aXRjaCAodGhpcy5zZWxlY3RlZFRvb2wpIHtcbiAgICAgIGNhc2UgJ3N3aW1sYW5lJzpcbiAgICAgICAgY29uc29sZS5sb2coJ09wZW5pbmcgc3dpbWxhbmUgZGlhbG9nIGZvciBuZXcgc3dpbWxhbmUnKTtcbiAgICAgICAgdGhpcy5lZGl0aW5nU3dpbWxhbmVJbmRleCA9IG51bGw7IC8vIFNldCB0byBudWxsIHRvIGluZGljYXRlIGNyZWF0aW5nIGEgbmV3IHN3aW1sYW5lXG4gICAgICAgIHRoaXMub3BlblN3aW1sYW5lRGlhbG9nKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUb29sID0gbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdGFnZSc6XG4gICAgICAgIGlmIChzd2ltbGFuZUluZGV4ID49IDAgJiYgc3dpbWxhbmVJbmRleCA8IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYEFkZGluZyAke3RoaXMuc2VsZWN0ZWRUb29sfSB0byBzd2ltbGFuZSAke3N3aW1sYW5lSW5kZXh9YFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgdGhlIHN0YWdlIGRpcmVjdGx5IHdpdGggZGVmYXVsdCBwcm9wZXJ0aWVzXG4gICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhdGUuYWRkTm9kZShcbiAgICAgICAgICAgIHN3aW1sYW5lSW5kZXgsXG4gICAgICAgICAgICAnc3RhZ2UnLFxuICAgICAgICAgICAgZXZlbnQueCxcbiAgICAgICAgICAgIGV2ZW50LnksXG4gICAgICAgICAgICB7IE5hbWU6ICdOZXcgU3RhZ2UnIH0gLy8gQWRkIGRlZmF1bHQgcHJvcGVydGllc1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHNlbGVjdGVkIHRvb2wgYWZ0ZXIgcGxhY2luZyBhIG5vZGVcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUb29sID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkZWNpc2lvbic6XG4gICAgICBjYXNlICdmb3JtJzpcbiAgICAgICAgaWYgKHN3aW1sYW5lSW5kZXggPj0gMCAmJiBzd2ltbGFuZUluZGV4IDwgdGhpcy5zdGF0ZS5zd2ltbGFuZXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgQWRkaW5nICR7dGhpcy5zZWxlY3RlZFRvb2x9IHRvIHN3aW1sYW5lICR7c3dpbWxhbmVJbmRleH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGF0ZS5hZGROb2RlKFxuICAgICAgICAgICAgc3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUb29sLFxuICAgICAgICAgICAgZXZlbnQueCxcbiAgICAgICAgICAgIGV2ZW50LnlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAvLyBSZXNldCB0aGUgc2VsZWN0ZWQgdG9vbCBhZnRlciBwbGFjaW5nIGEgbm9kZVxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRvb2wgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N1YmZsb3cnOlxuICAgICAgICBpZiAoc3dpbWxhbmVJbmRleCA+PSAwICYmIHN3aW1sYW5lSW5kZXggPCB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBBZGRpbmcgJHt0aGlzLnNlbGVjdGVkVG9vbH0gdG8gc3dpbWxhbmUgJHtzd2ltbGFuZUluZGV4fWBcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIFNob3cgc3ViZmxvdyB3b3JrZmxvdyBzZWxlY3Rpb24gcG9wdXBcbiAgICAgICAgICB0aGlzLmNhbnZhc1JlZi5zaG93U3ViZmxvd1NlbGVjdGlvblBvcHVwKFxuICAgICAgICAgICAgZXZlbnQueCxcbiAgICAgICAgICAgIGV2ZW50LnksXG4gICAgICAgICAgICBzd2ltbGFuZUluZGV4XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG9uU3dpbWxhbmVEaWFsb2dGaWxsZWQoZXZlbnQ6IHsgdGFnczogVGFnW107IG5hbWU6IHN0cmluZyB9KSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICAnU3dpbWxhbmUgZGlhbG9nIGZpbGxlZDonLFxuICAgICAgZXZlbnQsXG4gICAgICAnRWRpdGluZyBpbmRleDonLFxuICAgICAgdGhpcy5lZGl0aW5nU3dpbWxhbmVJbmRleFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5lZGl0aW5nU3dpbWxhbmVJbmRleCAhPT0gbnVsbCkge1xuICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIHN3aW1sYW5lXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ1VwZGF0aW5nIGV4aXN0aW5nIHN3aW1sYW5lIGF0IGluZGV4OicsXG4gICAgICAgIHRoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXhcbiAgICAgICk7XG4gICAgICB0aGlzLnN0YXRlLnVwZGF0ZVN3aW1sYW5lKFxuICAgICAgICB0aGlzLmVkaXRpbmdTd2ltbGFuZUluZGV4LFxuICAgICAgICBldmVudC5uYW1lLFxuICAgICAgICBldmVudC50YWdzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgbmV3IHN3aW1sYW5lXG4gICAgICBjb25zb2xlLmxvZygnQ3JlYXRpbmcgbmV3IHN3aW1sYW5lJyk7XG4gICAgICB0aGlzLnN0YXRlLmFkZFN3aW1sYW5lKGV2ZW50Lm5hbWUsIGV2ZW50LnRhZ3MpO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd1N3aW1sYW5lRGlhbG9nID0gZmFsc2U7XG4gICAgdGhpcy5lZGl0aW5nU3dpbWxhbmVJbmRleCA9IG51bGw7XG4gIH1cblxuXG5cbiAgb25TdWJmbG93U2VsZWN0ZWQoKSB7XG4gICAgLy8gUmVzZXQgdGhlIHNlbGVjdGVkIHRvb2wgYWZ0ZXIgcGxhY2luZyBhIHN1YmZsb3cgbm9kZVxuICAgIHRoaXMuc2VsZWN0ZWRUb29sID0gbnVsbDtcbiAgfVxuXG4gIG9wZW5BY3RvclRhZ3NEaWFsb2coKSB7XG4gICAgdGhpcy5zaG93QWN0b3JUYWdzRGlhbG9nID0gdHJ1ZTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIndvcmtmbG93LWRlc2lnbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJ3b3JrZmxvdy1oZWFkZXJcIj5cbiAgICA8aDE+e3sgc3RhdGUud29ya2Zsb3c/Lk5hbWUgfX08L2gxPlxuICA8L2Rpdj5cblxuICA8IS0tIFRvb2xiYXIgQ29tcG9uZW50IC0tPlxuICA8bGliLWRlc2lnbmVyLXRvb2xiYXIgW3NlbGVjdGVkVG9vbF09XCJzZWxlY3RlZFRvb2xcIiBbaXNTYXZpbmddPVwiaXNTYXZpbmdcIlxuICAgIFt3b3JrZmxvd0NvZGVdPVwic3RhdGUud29ya2Zsb3c/LkNvZGUgfHwgbnVsbFwiICh0b29sU2VsZWN0ZWQpPVwib25Ub29sU2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgKHNhdmVXb3JrZmxvdyk9XCJzYXZlV29ya2Zsb3coKVwiIChvcGVuQWN0b3JUYWdzKT1cIm9wZW5BY3RvclRhZ3NEaWFsb2coKVwiPlxuICA8L2xpYi1kZXNpZ25lci10b29sYmFyPlxuXG4gIDwhLS0gU2hvdyBsb2FkaW5nIGluZGljYXRvciBpZiBuZWVkZWQgLS0+XG4gIDxkaXYgKm5nSWY9XCJpc0xvYWRpbmdcIiBjbGFzcz1cImxvYWRpbmctb3ZlcmxheVwiPlxuICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy10ZXh0XCI+TG9hZGluZyB3b3JrZmxvdy4uLjwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIENhbnZhcyBDb21wb25lbnQgLS0+XG4gIDxsaWItZGVzaWduZXItY2FudmFzIFtzZWxlY3RlZFRvb2xdPVwic2VsZWN0ZWRUb29sXCIgKGNsaWNrZWRQb3NpdGlvbik9XCJoYW5kbGVDYW52YXNQb3NpdGlvbkNsaWNrKCRldmVudClcIlxuICAgIChzdWJmbG93U2VsZWN0ZWQpPVwib25TdWJmbG93U2VsZWN0ZWQoKVwiICNjYW52YXNSZWY+XG4gIDwvbGliLWRlc2lnbmVyLWNhbnZhcz5cblxuICA8bGliLXN3aW1sYW5lLWRpYWxvZyBbdmlzaWJsZV09XCJzaG93U3dpbWxhbmVEaWFsb2dcIiBbc3dpbWxhbmVEYXRhXT1cImVkaXRpbmdTd2ltbGFuZSgpXCJcbiAgICAoY3JlYXRlZCk9XCJvblN3aW1sYW5lRGlhbG9nRmlsbGVkKCRldmVudClcIiAoY2xvc2VkKT1cInNob3dTd2ltbGFuZURpYWxvZyA9IGZhbHNlXCI+PC9saWItc3dpbWxhbmUtZGlhbG9nPlxuXG4gIDxsaWItYWN0b3ItdGFncy1kaWFsb2cgW3Zpc2libGVdPVwic2hvd0FjdG9yVGFnc0RpYWxvZ1wiIFt3b3JrZmxvd0NvZGVdPVwic3RhdGUud29ya2Zsb3c/LkNvZGUgfHwgbnVsbFwiXG4gICAgKGNsb3NlZCk9XCJzaG93QWN0b3JUYWdzRGlhbG9nID0gZmFsc2VcIj48L2xpYi1hY3Rvci10YWdzLWRpYWxvZz5cbjwvZGl2PlxuIl19
408
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctZGVzaWduZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvY29tcG9uZW50cy93b3JrZmxvdy1kZXNpZ25lci93b3JrZmxvdy1kZXNpZ25lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9jb21wb25lbnRzL3dvcmtmbG93LWRlc2lnbmVyL3dvcmtmbG93LWRlc2lnbmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBaUIsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7OztBQVlqRixNQUFNLE9BQU8seUJBQXlCO0lBaUIzQjtJQUNDO0lBQ0E7SUFsQmMsU0FBUyxDQUEyQjtJQUNuRCxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUU1QywwQkFBMEI7SUFDMUIsWUFBWSxHQUFhLElBQUksQ0FBQztJQUM5QixrQkFBa0IsR0FBWSxLQUFLLENBQUM7SUFDcEMsbUJBQW1CLEdBQVksS0FBSyxDQUFDO0lBRXJDLG9CQUFvQixHQUFrQixJQUFJLENBQUM7SUFDM0MsZUFBZSxHQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVmLFNBQVMsR0FBWSxLQUFLLENBQUM7SUFDM0IsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUUxQixZQUNTLEtBQTRCLEVBQzNCLFdBQWdDLEVBQ2hDLFdBQXdCO1FBRnpCLFVBQUssR0FBTCxLQUFLLENBQXVCO1FBQzNCLGdCQUFXLEdBQVgsV0FBVyxDQUFxQjtRQUNoQyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtJQUM5QixDQUFD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LElBQUksQ0FBQztJQUMzQixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7SUFDbEMsQ0FBQzt3R0E5ZVUseUJBQXlCOzRGQUF6Qix5QkFBeUIsK01DbkJ0QywyMUNBNkJBOzs0RkRWYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0UsdUJBQXVCO3NKQUtULFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDYixZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgc2lnbmFsLFxuICBWaWV3Q2hpbGQsXG4gIFdyaXRhYmxlU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEVycm9yUmVzcG9uc2UsIFRhZywgV29ya2Zsb3cgfSBmcm9tICd2ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgVXRpbFNlcnZpY2UgfSBmcm9tICd2ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBEZXNpZ25lckNhbnZhc0NvbXBvbmVudCB9IGZyb20gJy4vZGVzaWduZXItY2FudmFzL2Rlc2lnbmVyLWNhbnZhcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgV29ya2Zsb3dEYXRhU2VydmljZSB9IGZyb20gJy4vd29ya2Zsb3ctZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IFdvcmtmbG93RGVzaWduZXJTdGF0ZSB9IGZyb20gJy4vd29ya2Zsb3ctZGVzaWduZXIuc3RhdGUnO1xuaW1wb3J0IHsgTm9kZSwgVG9vbFR5cGUgfSBmcm9tICcuL3dvcmtmbG93LWRlc2lnbmVyLnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXdvcmtmbG93LWRlc2lnbmVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dvcmtmbG93LWRlc2lnbmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3dvcmtmbG93LWRlc2lnbmVyLmNvbXBvbmVudC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0Rlc2lnbmVyQ29tcG9uZW50IHtcbiAgQFZpZXdDaGlsZCgnY2FudmFzUmVmJykgY2FudmFzUmVmITogRGVzaWduZXJDYW52YXNDb21wb25lbnQ7XG4gIEBJbnB1dCgpIHdvcmtmbG93Q29kZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gQ3VycmVudGx5IHNlbGVjdGVkIHRvb2xcbiAgc2VsZWN0ZWRUb29sOiBUb29sVHlwZSA9IG51bGw7XG4gIHNob3dTd2ltbGFuZURpYWxvZzogYm9vbGVhbiA9IGZhbHNlO1xuICBzaG93QWN0b3JUYWdzRGlhbG9nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZWRpdGluZ1N3aW1sYW5lSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBlZGl0aW5nU3dpbWxhbmU6IFdyaXRhYmxlU2lnbmFsPHsgbmFtZTogc3RyaW5nOyB0YWdzOiBUYWdbXSB9IHwgbnVsbD4gPVxuICAgIHNpZ25hbChudWxsKTtcblxuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc3RhdGU6IFdvcmtmbG93RGVzaWduZXJTdGF0ZSxcbiAgICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBXb3JrZmxvd0RhdGFTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXRpbFNlcnZpY2U6IFV0aWxTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gTG9hZCB3b3JrZmxvdyBkYXRhIGlmIGNvZGUgaXMgcHJvdmlkZWRcbiAgICBpZiAodGhpcy53b3JrZmxvd0NvZGUpIHtcbiAgICAgIHRoaXMubG9hZFdvcmtmbG93KHRoaXMud29ya2Zsb3dDb2RlKTtcbiAgICB9XG4gIH1cblxuICBzYXZlV29ya2Zsb3coKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTYXZpbmcpIHJldHVybjtcblxuICAgIHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xuXG4gICAgLy8gVHJhbnNmb3JtIHRoZSBVSSBtb2RlbCB0byB0aGUgQVBJIG1vZGVsXG4gICAgY29uc3Qgd29ya2Zsb3dNb2RlbCA9IHRoaXMuc3RhdGUudHJhbnNmb3JtVG9Xb3JrZmxvd01vZGVsKCk7XG5cbiAgICBpZiAod29ya2Zsb3dNb2RlbCkge1xuICAgICAgLy8gU2F2ZSB0byB0aGUgYmFja2VuZFxuICAgICAgdGhpcy5kYXRhU2VydmljZVxuICAgICAgICAuc2F2ZVdvcmtmbG93cyhbd29ya2Zsb3dNb2RlbF0pXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0Vycm9yKHJlc3BvbnNlLkVycm9yTXNnKTtcbiAgICAgICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ1dvcmtmbG93IHNhdmVkIHN1Y2Nlc3NmdWxseTonLCByZXNwb25zZSk7XG4gICAgICAgICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dTdWNjZXNzKCdXb3JrZmxvdyBzYXZlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgIC8vIElmIHRoZSBBUEkgcmV0dXJucyBhbiB1cGRhdGVkIHdvcmtmbG93LCB3ZSBtaWdodCB3YW50IHRvIHJlbG9hZCBpdFxuICAgICAgICAgICAgY29uc3QgdXBkYXRlZFdvcmtmbG93ID0gcmVzcG9uc2VbMF07XG4gICAgICAgICAgICBpZiAodXBkYXRlZFdvcmtmbG93KSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RhdGUuc2V0V29ya2Zsb3dJZCh1cGRhdGVkV29ya2Zsb3cuQ29kZSk7XG4gICAgICAgICAgICAgIHRoaXMucGFyc2VXb3JrZmxvd0RhdGEodXBkYXRlZFdvcmtmbG93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzYXZpbmcgd29ya2Zsb3c6JywgZXJyb3IpO1xuICAgICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICAvLyBIYW5kbGUgZXJyb3IgLSBzaG93IGEgbm90aWZpY2F0aW9uLCBldGMuXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGxvYWRXb3JrZmxvdyhjb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5kYXRhU2VydmljZVxuICAgICAgLmdldFdvcmtmbG93V2l0aFBhcmFtKGNvZGUpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLlJlc3VsdCkge1xuICAgICAgICAgIC8vIFN0b3JlIHRoZSB3b3JrZmxvdyBJRFxuICAgICAgICAgIGNvbnN0IHdmID0gcmVzcG9uc2UuUmVzdWx0WzBdO1xuICAgICAgICAgIHRoaXMuc3RhdGUuc2V0V29ya2Zsb3dJZCh3Zi5Db2RlKTtcbiAgICAgICAgICB0aGlzLnBhcnNlV29ya2Zsb3dEYXRhKHdmKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyB3b3JrZmxvdzonLCBlcnJvcik7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIE1ldGhvZCB0byBwYXJzZSB3b3JrZmxvdyBkYXRhIGZyb20gQVBJIGFuZCBwb3B1bGF0ZSB0aGUgZGVzaWduZXJcbiAgcGFyc2VXb3JrZmxvd0RhdGEod29ya2Zsb3c6IFdvcmtmbG93KTogdm9pZCB7XG4gICAgLy8gU3RvcmUgdGhlIGNvbXBsZXRlIHdvcmtmbG93XG4gICAgdGhpcy5zdGF0ZS53b3JrZmxvdyA9IHdvcmtmbG93O1xuXG4gICAgLy8gQ2xlYXIgZXhpc3Rpbmcgc3RhdGVcbiAgICB0aGlzLnN0YXRlLnN3aW1sYW5lcyA9IFtdO1xuICAgIHRoaXMuc3RhdGUuY29ubmVjdGlvbnMgPSBbXTtcbiAgICB0aGlzLnN0YXRlLnN3aW1sYW5lUmVjb3JkID0ge307XG4gICAgdGhpcy5zdGF0ZS5zdGFnZVJlY29yZCA9IHt9O1xuICAgIHRoaXMuc3RhdGUuYWN0aW9uUmVjb3JkID0ge307XG5cbiAgICAvLyBTZXQgd29ya2Zsb3cgZm9ybSBpZiBleGlzdHNcbiAgICBpZiAod29ya2Zsb3cuRm9ybSkge1xuICAgICAgdGhpcy5zdGF0ZS5zZXRXb3JrZmxvd0Zvcm0oXG4gICAgICAgIHdvcmtmbG93LkZvcm0sXG4gICAgICAgIHdvcmtmbG93LkZvcm1OYW1lIHx8ICdXb3JrZmxvdyBGb3JtJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTdG9yZSB0aGUgd29ya2Zsb3cgSURcbiAgICB0aGlzLnN0YXRlLnNldFdvcmtmbG93SWQod29ya2Zsb3cuQ29kZSk7XG5cbiAgICAvLyBQcm9jZXNzIHN3aW1sYW5lcyBmaXJzdFxuICAgIGlmICh3b3JrZmxvdy5MYW5lcyAmJiB3b3JrZmxvdy5MYW5lcy5sZW5ndGgpIHtcbiAgICAgIHdvcmtmbG93LkxhbmVzLnNvcnQoKGEsIGIpID0+IGEuUG9zaXRpb24gLSBiLlBvc2l0aW9uKS5mb3JFYWNoKChsYW5lKSA9PiB7XG4gICAgICAgIC8vIFN0b3JlIG9yaWdpbmFsIGxhbmUgaW4gcmVjb3JkXG4gICAgICAgIHRoaXMuc3RhdGUuc3dpbWxhbmVSZWNvcmRbbGFuZS5Db2RlXSA9IGxhbmU7XG5cbiAgICAgICAgLy8gQWRkIHN3aW1sYW5lIHRvIFVJIG1vZGVsIHdpdGggdGhlIG9yaWdpbmFsIElEXG4gICAgICAgIGNvbnN0IHN3aW1sYW5lID0ge1xuICAgICAgICAgIG9yZGVyOiBsYW5lLlBvc2l0aW9uLFxuICAgICAgICAgIGxhYmVsOiBsYW5lLk5hbWUgfHwgYExhbmUgJHtsYW5lLlBvc2l0aW9ufWAsXG4gICAgICAgICAgdGFnczogbGFuZS5UYWdzIHx8IFtdLFxuICAgICAgICAgIG5vZGVzOiBbXSxcbiAgICAgICAgICBpZDogbGFuZS5Db2RlLCAvLyBTdG9yZSB0aGUgb3JpZ2luYWwgSURcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnN0YXRlLnN3aW1sYW5lcy5wdXNoKHN3aW1sYW5lKTtcblxuICAgICAgICAvLyBSZWdpc3RlciBsb2FkZWQgb2JqZWN0XG4gICAgICAgIHRoaXMuc3RhdGUucmVnaXN0ZXJMb2FkZWRPYmplY3QobGFuZS5JZCwgbGFuZS5Db2RlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3Mgc3RhZ2VzXG4gICAgaWYgKHdvcmtmbG93LlN0YWdlcyAmJiB3b3JrZmxvdy5TdGFnZXMubGVuZ3RoKSB7XG4gICAgICB3b3JrZmxvdy5TdGFnZXMuZm9yRWFjaCgoc3RhZ2UpID0+IHtcbiAgICAgICAgLy8gU3RvcmUgb3JpZ2luYWwgc3RhZ2UgaW4gcmVjb3JkXG4gICAgICAgIHRoaXMuc3RhdGUuc3RhZ2VSZWNvcmRbc3RhZ2UuQ29kZV0gPSBzdGFnZTtcblxuICAgICAgICAvLyBGaW5kIHN3aW1sYW5lIGluZGV4IGJ5IFN3aW1MYW5lIElEXG4gICAgICAgIGNvbnN0IHN3aW1sYW5lSW5kZXggPSB0aGlzLnN0YXRlLnN3aW1sYW5lcy5maW5kSW5kZXgoXG4gICAgICAgICAgKGxhbmUpID0+IGxhbmUuaWQgPT09IHN0YWdlLlN3aW1MYW5lXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHN3aW1sYW5lSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgY29uc3QgeCA9IHN0YWdlLkNvb3JkaW5hdGVzPy5YIHx8IDEwMDtcbiAgICAgICAgICBjb25zdCB5ID0gc3RhZ2UuQ29vcmRpbmF0ZXM/LlkgfHwgNTA7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgbm9kZSB3aXRoIG9yaWdpbmFsIElEXG4gICAgICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IHtcbiAgICAgICAgICAgIGlkOiBzdGFnZS5Db2RlLCAvLyBVc2Ugb3JpZ2luYWwgSURcbiAgICAgICAgICAgIHR5cGU6IHN0YWdlLklzU3ViUHJvY2VzcyA/ICdzdWJmbG93JyA6ICgnc3RhZ2UnIGFzIGNvbnN0KSxcbiAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICB5OiB5LFxuICAgICAgICAgICAgd2lkdGg6IDE2OSxcbiAgICAgICAgICAgIGhlaWdodDogMTAwLFxuICAgICAgICAgICAgaXNTdGFydE5vZGU6IHN0YWdlLklzRW50cnlQb2ludCxcbiAgICAgICAgICAgIHN0YWdlRGF0YToge1xuICAgICAgICAgICAgICBOYW1lOiBzdGFnZS5OYW1lLFxuICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogc3RhZ2UuRGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIER1cmF0aW9uOiBzdGFnZS5EdXJhdGlvbixcbiAgICAgICAgICAgICAgUGFzc09uUnVsZTogc3RhZ2UuUGFzc09uUnVsZSxcbiAgICAgICAgICAgICAgQWN0b3JSdWxlOiBzdGFnZS5BY3RvclJ1bGUsXG4gICAgICAgICAgICAgIE1pbk5vT2ZBY3Rvcjogc3RhZ2UuTWluTm9PZkFjdG9yLFxuICAgICAgICAgICAgICBUYWdzOiBzdGFnZS5UYWdzIHx8IFtdLFxuICAgICAgICAgICAgICBJc1BhcmFsbGVsOiBzdGFnZS5Jc1BhcmFsbGVsLFxuICAgICAgICAgICAgICBJc0VudHJ5UG9pbnQ6IHN0YWdlLklzRW50cnlQb2ludCxcbiAgICAgICAgICAgICAgSXNFeGl0UG9pbnQ6IHN0YWdlLklzRXhpdFBvaW50LFxuICAgICAgICAgICAgICBJc1N1YlByb2Nlc3M6IHN0YWdlLklzU3ViUHJvY2VzcyxcbiAgICAgICAgICAgICAgQXNzaWdubWVudFR5cGU6IHN0YWdlLkFzc2lnbm1lbnRUeXBlLFxuICAgICAgICAgICAgICBJZDogc3RhZ2UuSWQsIC8vIEtlZXAgb3JpZ2luYWwgSURcbiAgICAgICAgICAgICAgQ29kZTogc3RhZ2UuQ29kZSxcbiAgICAgICAgICAgICAgRm9ybTogc3RhZ2UuRm9ybSxcbiAgICAgICAgICAgICAgZm9ybUlkOiBzdGFnZS5Gb3JtLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbm5lY3Rpb25Qb2ludHM6IFtdLCAvLyBJbml0aWFsaXplIHdpdGggZW1wdHkgYXJyYXlcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gR2VuZXJhdGUgY29ubmVjdGlvbiBwb2ludHNcbiAgICAgICAgICBub2RlLmNvbm5lY3Rpb25Qb2ludHMgPSB0aGlzLnN0YXRlLmdlbmVyYXRlQ29ubmVjdGlvblBvaW50cyhub2RlKTtcblxuICAgICAgICAgIC8vIEFkZCBub2RlIHRvIHN3aW1sYW5lXG4gICAgICAgICAgdGhpcy5zdGF0ZS5zd2ltbGFuZXNbc3dpbWxhbmVJbmRleF0ubm9kZXMgPVxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5zd2ltbGFuZXNbc3dpbWxhbmVJbmRleF0ubm9kZXMgfHwgW107XG4gICAgICAgICAgdGhpcy5zdGF0ZS5zd2ltbGFuZXNbc3dpbWxhbmVJbmRleF0ubm9kZXMucHVzaChub2RlKTtcblxuICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdGFydCBub2RlLCB1cGRhdGUgc3RhdGVcbiAgICAgICAgICBpZiAoc3RhZ2UuSXNFbnRyeVBvaW50KSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnN0YXJ0Tm9kZUlkID0gc3RhZ2UuQ29kZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZWdpc3RlciBsb2FkZWQgc3RhZ2VcbiAgICAgICAgICB0aGlzLnN0YXRlLnJlZ2lzdGVyTG9hZGVkT2JqZWN0KHN0YWdlLklkLCBzdGFnZS5Db2RlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBjb25uZWN0aW9ucy9hY3Rpb25zXG4gICAgaWYgKHdvcmtmbG93LkFjdGlvbnMgJiYgd29ya2Zsb3cuQWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHdvcmtmbG93LkFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uKSA9PiB7XG4gICAgICAgIC8vIFN0b3JlIG9yaWdpbmFsIGFjdGlvbiBpbiByZWNvcmRcbiAgICAgICAgdGhpcy5zdGF0ZS5hY3Rpb25SZWNvcmRbYWN0aW9uLkNvZGVdID0gYWN0aW9uO1xuXG4gICAgICAgIC8vIEZpbmQgc291cmNlIGFuZCB0YXJnZXQgbm9kZXNcbiAgICAgICAgY29uc3Qgc291cmNlTm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChhY3Rpb24uRnJvbVN0YWdlKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0Tm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChhY3Rpb24uVG9TdGFnZSk7XG5cbiAgICAgICAgY29uc29sZS5sb2coc291cmNlTm9kZUluZm8sIHRhcmdldE5vZGVJbmZvKTtcblxuICAgICAgICBpZiAoc291cmNlTm9kZUluZm8gJiYgdGFyZ2V0Tm9kZUluZm8pIHtcbiAgICAgICAgICAvLyBGaW5kIHN1aXRhYmxlIGNvbm5lY3Rpb24gcG9pbnRzXG4gICAgICAgICAgLy8gY29uc3Qgc291cmNlTm9kZSA9IHNvdXJjZU5vZGVJbmZvLm5vZGU7XG4gICAgICAgICAgLy8gY29uc3QgdGFyZ2V0Tm9kZSA9IHRhcmdldE5vZGVJbmZvLm5vZGU7XG5cbiAgICAgICAgICAvLyBjb25zdCBzb3VyY2VQb2ludCA9IHNvdXJjZU5vZGUuY29ubmVjdGlvblBvaW50cz8uZmluZChcbiAgICAgICAgICAvLyAgIChwKSA9PiBwLnR5cGUgPT09ICdyaWdodCcgfHwgcC50eXBlID09PSAnYm90dG9tJ1xuICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAvLyBjb25zdCB0YXJnZXRQb2ludCA9IHRhcmdldE5vZGUuY29ubmVjdGlvblBvaW50cz8uZmluZChcbiAgICAgICAgICAvLyAgIChwKSA9PiBwLnR5cGUgPT09ICdsZWZ0JyB8fCBwLnR5cGUgPT09ICd0b3AnXG4gICAgICAgICAgLy8gKTtcblxuICAgICAgICAgIGNvbnN0IHNvdXJjZU5vZGUgPSBzb3VyY2VOb2RlSW5mby5ub2RlO1xuICAgICAgICAgIGNvbnN0IHRhcmdldE5vZGUgPSB0YXJnZXROb2RlSW5mby5ub2RlO1xuXG4gICAgICAgICAgbGV0IHNvdXJjZVBvaW50SWQsIHRhcmdldFBvaW50SWQ7XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhhY3Rpb24uU291cmNlUG9pbnRUeXBlLCBhY3Rpb24uVGFyZ2V0UG9pbnRUeXBlKTtcblxuICAgICAgICAgIGlmIChhY3Rpb24uU291cmNlUG9pbnRUeXBlKSB7XG4gICAgICAgICAgICAvLyBGaW5kIGEgcG9pbnQgd2l0aCBtYXRjaGluZyB0eXBlXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VQb2ludCA9IHNvdXJjZU5vZGUuY29ubmVjdGlvblBvaW50cz8uZmluZChcbiAgICAgICAgICAgICAgKHApID0+IHAudHlwZSA9PT0gYWN0aW9uLlNvdXJjZVBvaW50VHlwZT8udG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHNvdXJjZVBvaW50SWQgPSBzb3VyY2VQb2ludD8uaWQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGZpbmRpbmcgYSBzdWl0YWJsZSBwb2ludFxuICAgICAgICAgICAgY29uc3Qgc291cmNlUG9pbnQgPSBzb3VyY2VOb2RlLmNvbm5lY3Rpb25Qb2ludHM/LmZpbmQoXG4gICAgICAgICAgICAgIChwKSA9PiBwLnR5cGUgPT09ICdyaWdodCcgfHwgcC50eXBlID09PSAnYm90dG9tJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHNvdXJjZVBvaW50SWQgPSBzb3VyY2VQb2ludD8uaWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFjdGlvbi5UYXJnZXRQb2ludFR5cGUpIHtcbiAgICAgICAgICAgIC8vIEZpbmQgYSBwb2ludCB3aXRoIG1hdGNoaW5nIHR5cGVcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFBvaW50ID0gdGFyZ2V0Tm9kZS5jb25uZWN0aW9uUG9pbnRzPy5maW5kKFxuICAgICAgICAgICAgICAocCkgPT4gcC50eXBlID09PSBhY3Rpb24uVGFyZ2V0UG9pbnRUeXBlPy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGFyZ2V0UG9pbnRJZCA9IHRhcmdldFBvaW50Py5pZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2sgdG8gZmluZGluZyBhIHN1aXRhYmxlIHBvaW50XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRQb2ludCA9IHRhcmdldE5vZGUuY29ubmVjdGlvblBvaW50cz8uZmluZChcbiAgICAgICAgICAgICAgKHApID0+IHAudHlwZSA9PT0gJ2xlZnQnIHx8IHAudHlwZSA9PT0gJ3RvcCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0YXJnZXRQb2ludElkID0gdGFyZ2V0UG9pbnQ/LmlkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUubG9nKCdTb3VyY2UgcG9pbnQ6Jywgc291cmNlUG9pbnRJZCk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RhcmdldCBwb2ludDonLCB0YXJnZXRQb2ludElkKTtcblxuICAgICAgICAgIGlmIChzb3VyY2VQb2ludElkICYmIHRhcmdldFBvaW50SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgICAgICAgIGlkOiBhY3Rpb24uQ29kZSwgLy8gVXNlIG9yaWdpbmFsIElEXG4gICAgICAgICAgICAgIHNvdXJjZU5vZGVJZDogYWN0aW9uLkZyb21TdGFnZSxcbiAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUlkOiBhY3Rpb24uVG9TdGFnZSxcbiAgICAgICAgICAgICAgc291cmNlUG9pbnRJZDogc291cmNlUG9pbnRJZCxcbiAgICAgICAgICAgICAgdGFyZ2V0UG9pbnRJZDogdGFyZ2V0UG9pbnRJZCxcbiAgICAgICAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleDogc291cmNlTm9kZUluZm8uc3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgICAgdGFyZ2V0U3dpbWxhbmVJbmRleDogdGFyZ2V0Tm9kZUluZm8uc3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgICAgY29uZGl0aW9uOiBhY3Rpb24uUGFzc09uUnVsZSB8fCAnJyxcbiAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbi5OYW1lIHx8ICcnLFxuICAgICAgICAgICAgICBhY3Rpb246IGFjdGlvbi5PcGVyYXRpb25BY3Rpb24gfHwgbnVsbCxcbiAgICAgICAgICAgICAgdGFyZ2V0U3RhdHVzOiBhY3Rpb24uVGFyZ2V0U3RhdHVzIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuc3RhdGUuY29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uKTtcblxuICAgICAgICAgICAgLy8gUmVnaXN0ZXIgbG9hZGVkIGFjdGlvblxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5yZWdpc3RlckxvYWRlZE9iamVjdChhY3Rpb24uSWQsIGFjdGlvbi5Db2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZmluZCBzd2ltbGFuZSBpbmRleCBieSBMYW5lIElEXG4gIGZpbmRTd2ltbGFuZUluZGV4QnlMYW5lSWQobGFuZUlkOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIC8vIEZpcnN0IGNoZWNrIG91ciBtYXBwaW5nXG4gICAgaWYgKHRoaXMuc3RhdGUubGFuZUlkVG9JbmRleE1hcC5oYXMobGFuZUlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUubGFuZUlkVG9JbmRleE1hcC5nZXQobGFuZUlkKSE7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gdGhlIG9yaWdpbmFsIGxvZ2ljIChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcbiAgICBjb25zdCBwYXJ0cyA9IGxhbmVJZC5zcGxpdCgnLScpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHBhcnRzWzFdKTtcbiAgICAgIGlmICghaXNOYU4oaW5kZXgpICYmIGluZGV4IDwgdGhpcy5zdGF0ZS5zd2ltbGFuZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvLyBIYW5kbGUgdG9vbCBzZWxlY3Rpb24gZnJvbSB0b29sYmFyXG4gIG9uVG9vbFNlbGVjdGVkKHRvb2w6IFRvb2xUeXBlKTogdm9pZCB7XG4gICAgLy8gVG9nZ2xlIHNlbGVjdGlvbiBpZiB0aGUgc2FtZSB0b29sIGlzIGNsaWNrZWQgYWdhaW5cbiAgICB0aGlzLnNlbGVjdGVkVG9vbCA9IHRoaXMuc2VsZWN0ZWRUb29sID09PSB0b29sID8gbnVsbCA6IHRvb2w7XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIHRvb2w6JywgdGhpcy5zZWxlY3RlZFRvb2wpO1xuICB9XG5cbiAgb3BlblN3aW1sYW5lRGlhbG9nKCkge1xuICAgIGNvbnNvbGUubG9nKCdTTUwgSU5ERVgnLCB0aGlzLmVkaXRpbmdTd2ltbGFuZUluZGV4KTtcbiAgICBpZiAodGhpcy5lZGl0aW5nU3dpbWxhbmVJbmRleCAhPT0gbnVsbCkge1xuICAgICAgY29uc29sZS5sb2coJ1NNTCcsIHRoaXMuc3RhdGUuc3dpbWxhbmVzW3RoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXhdKTtcbiAgICAgIHRoaXMuZWRpdGluZ1N3aW1sYW5lLnNldCh7XG4gICAgICAgIG5hbWU6IHRoaXMuc3RhdGUuc3dpbWxhbmVzW3RoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXhdLmxhYmVsLFxuICAgICAgICB0YWdzOiB0aGlzLnN0YXRlLnN3aW1sYW5lc1t0aGlzLmVkaXRpbmdTd2ltbGFuZUluZGV4XS50YWdzLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmxvZygnU01MX0VEVCcsIHRoaXMuZWRpdGluZ1N3aW1sYW5lKCkpO1xuICAgIH1cbiAgICB0aGlzLnNob3dTd2ltbGFuZURpYWxvZyA9IHRydWU7XG4gIH1cblxuXG5cbiAgaGFuZGxlQ2FudmFzUG9zaXRpb25DbGljayhldmVudDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KSB7XG4gICAgY29uc29sZS5sb2coZXZlbnQpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhbiBlZGl0IHN3aW1sYW5lIGV2ZW50XG4gICAgaWYgKFxuICAgICAgZXZlbnQueCA9PT0gLTEgJiZcbiAgICAgIGV2ZW50LnkgPj0gMCAmJlxuICAgICAgZXZlbnQueSA8IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aFxuICAgICkge1xuICAgICAgY29uc29sZS5sb2coJ0VkaXRpbmcgc3dpbWxhbmUnLCBldmVudC55KTtcbiAgICAgIHRoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXggPSBldmVudC55O1xuICAgICAgdGhpcy5vcGVuU3dpbWxhbmVEaWFsb2coKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWwgY2FudmFzIGNsaWNrIGhhbmRsaW5nXG4gICAgY29uc3Qgc3dpbWxhbmVJbmRleCA9IE1hdGguZmxvb3IoZXZlbnQueSAvIDI2Myk7XG5cbiAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0ZWRUb29sKSB7XG4gICAgICBjYXNlICdzd2ltbGFuZSc6XG4gICAgICAgIGNvbnNvbGUubG9nKCdPcGVuaW5nIHN3aW1sYW5lIGRpYWxvZyBmb3IgbmV3IHN3aW1sYW5lJyk7XG4gICAgICAgIHRoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXggPSBudWxsOyAvLyBTZXQgdG8gbnVsbCB0byBpbmRpY2F0ZSBjcmVhdGluZyBhIG5ldyBzd2ltbGFuZVxuICAgICAgICB0aGlzLm9wZW5Td2ltbGFuZURpYWxvZygpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVG9vbCA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RhZ2UnOlxuICAgICAgICBpZiAoc3dpbWxhbmVJbmRleCA+PSAwICYmIHN3aW1sYW5lSW5kZXggPCB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBBZGRpbmcgJHt0aGlzLnNlbGVjdGVkVG9vbH0gdG8gc3dpbWxhbmUgJHtzd2ltbGFuZUluZGV4fWBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSBzdGFnZSBkaXJlY3RseSB3aXRoIGRlZmF1bHQgcHJvcGVydGllc1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXRlLmFkZE5vZGUoXG4gICAgICAgICAgICBzd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgJ3N0YWdlJyxcbiAgICAgICAgICAgIGV2ZW50LngsXG4gICAgICAgICAgICBldmVudC55LFxuICAgICAgICAgICAgeyBOYW1lOiAnTmV3IFN0YWdlJyB9IC8vIEFkZCBkZWZhdWx0IHByb3BlcnRpZXNcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBzZWxlY3RlZCB0b29sIGFmdGVyIHBsYWNpbmcgYSBub2RlXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVG9vbCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGVjaXNpb24nOlxuICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgIGlmIChzd2ltbGFuZUluZGV4ID49IDAgJiYgc3dpbWxhbmVJbmRleCA8IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYEFkZGluZyAke3RoaXMuc2VsZWN0ZWRUb29sfSB0byBzd2ltbGFuZSAke3N3aW1sYW5lSW5kZXh9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhdGUuYWRkTm9kZShcbiAgICAgICAgICAgIHN3aW1sYW5lSW5kZXgsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVG9vbCxcbiAgICAgICAgICAgIGV2ZW50LngsXG4gICAgICAgICAgICBldmVudC55XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHNlbGVjdGVkIHRvb2wgYWZ0ZXIgcGxhY2luZyBhIG5vZGVcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUb29sID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdWJmbG93JzpcbiAgICAgICAgaWYgKHN3aW1sYW5lSW5kZXggPj0gMCAmJiBzd2ltbGFuZUluZGV4IDwgdGhpcy5zdGF0ZS5zd2ltbGFuZXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgQWRkaW5nICR7dGhpcy5zZWxlY3RlZFRvb2x9IHRvIHN3aW1sYW5lICR7c3dpbWxhbmVJbmRleH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBTaG93IHN1YmZsb3cgd29ya2Zsb3cgc2VsZWN0aW9uIHBvcHVwXG4gICAgICAgICAgdGhpcy5jYW52YXNSZWYuc2hvd1N1YmZsb3dTZWxlY3Rpb25Qb3B1cChcbiAgICAgICAgICAgIGV2ZW50LngsXG4gICAgICAgICAgICBldmVudC55LFxuICAgICAgICAgICAgc3dpbWxhbmVJbmRleFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBvblN3aW1sYW5lRGlhbG9nRmlsbGVkKGV2ZW50OiB7IHRhZ3M6IFRhZ1tdOyBuYW1lOiBzdHJpbmcgfSkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgJ1N3aW1sYW5lIGRpYWxvZyBmaWxsZWQ6JyxcbiAgICAgIGV2ZW50LFxuICAgICAgJ0VkaXRpbmcgaW5kZXg6JyxcbiAgICAgIHRoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXhcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXggIT09IG51bGwpIHtcbiAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBzd2ltbGFuZVxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICdVcGRhdGluZyBleGlzdGluZyBzd2ltbGFuZSBhdCBpbmRleDonLFxuICAgICAgICB0aGlzLmVkaXRpbmdTd2ltbGFuZUluZGV4XG4gICAgICApO1xuICAgICAgdGhpcy5zdGF0ZS51cGRhdGVTd2ltbGFuZShcbiAgICAgICAgdGhpcy5lZGl0aW5nU3dpbWxhbmVJbmRleCxcbiAgICAgICAgZXZlbnQubmFtZSxcbiAgICAgICAgZXZlbnQudGFnc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIG5ldyBzd2ltbGFuZVxuICAgICAgY29uc29sZS5sb2coJ0NyZWF0aW5nIG5ldyBzd2ltbGFuZScpO1xuICAgICAgdGhpcy5zdGF0ZS5hZGRTd2ltbGFuZShldmVudC5uYW1lLCBldmVudC50YWdzKTtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dTd2ltbGFuZURpYWxvZyA9IGZhbHNlO1xuICAgIHRoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXggPSBudWxsO1xuICB9XG5cblxuXG4gIG9uU3dpbWxhbmVEaWFsb2dEZWxldGVkKCkge1xuICAgIGlmICh0aGlzLmVkaXRpbmdTd2ltbGFuZUluZGV4ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmVkaXRpbmdTd2ltbGFuZUluZGV4O1xuICAgIGNvbnN0IHN3aW1sYW5lID0gdGhpcy5zdGF0ZS5zd2ltbGFuZXNbaW5kZXhdO1xuXG4gICAgLy8gR3VhcmQ6IHN0YWdlcyBtdXN0IGJlIG1vdmVkIG91dCBmaXJzdCAoYWxzbyBlbmZvcmNlZCBpbiBzdGF0ZS5kZWxldGVTd2ltbGFuZSkuXG4gICAgaWYgKHN3aW1sYW5lPy5ub2Rlcz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dFcnJvcihcbiAgICAgICAgJ01vdmUgYWxsIHN0YWdlcyBvdXQgb2YgdGhpcyBzd2ltbGFuZSBiZWZvcmUgZGVsZXRpbmcgaXQuJ1xuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBIGxvYWRlZCBsYW5lIGtlZXBzIGl0cyBiYWNrZW5kIENvZGUgaW4gc3dpbWxhbmVSZWNvcmQgKGtleWVkIGJ5IGlkL0NvZGUpLlxuICAgIGNvbnN0IGJhY2tlbmRSZWNvcmQgPSBzd2ltbGFuZT8uaWRcbiAgICAgID8gdGhpcy5zdGF0ZS5zd2ltbGFuZVJlY29yZFtzd2ltbGFuZS5pZF1cbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGJhY2tlbmRSZWNvcmQ/LkNvZGUpIHtcbiAgICAgIC8vIFBhdGggQTogYmFja2VuZC1wZXJzaXN0ZWQgbGFuZSDigJQgZGVsZXRlIG9uIHRoZSBzZXJ2ZXIgZmlyc3QuXG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlXG4gICAgICAgIC5kZWxldGVTd2ltTGFuZXMoW2JhY2tlbmRSZWNvcmQuQ29kZV0pXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmZpbmlzaFN3aW1sYW5lRGVsZXRlKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGRlbGV0aW5nIHN3aW1sYW5lOicsIGVycm9yKTtcbiAgICAgICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dFcnJvcignRmFpbGVkIHRvIGRlbGV0ZSBzd2ltbGFuZScpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUGF0aCBCOiBuZXZlci1zYXZlZCBsYW5lIOKAlCByZW1vdmUgZnJvbSBzdGF0ZSBkaXJlY3RseSwgbm8gQVBJIGNhbGwuXG4gICAgICB0aGlzLmZpbmlzaFN3aW1sYW5lRGVsZXRlKGluZGV4KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbmlzaFN3aW1sYW5lRGVsZXRlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy5zdGF0ZS5kZWxldGVTd2ltbGFuZShpbmRleCk7XG4gICAgaWYgKCFkZWxldGVkKSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dFcnJvcihcbiAgICAgICAgJ01vdmUgYWxsIHN0YWdlcyBvdXQgb2YgdGhpcyBzd2ltbGFuZSBiZWZvcmUgZGVsZXRpbmcgaXQuJ1xuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dTd2ltbGFuZURpYWxvZyA9IGZhbHNlO1xuICAgIHRoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXggPSBudWxsO1xuICAgIHRoaXMuY2FudmFzUmVmPy51cGRhdGVDYW52YXNTaXplKCk7XG4gIH1cblxuICBvblN1YmZsb3dTZWxlY3RlZCgpIHtcbiAgICAvLyBSZXNldCB0aGUgc2VsZWN0ZWQgdG9vbCBhZnRlciBwbGFjaW5nIGEgc3ViZmxvdyBub2RlXG4gICAgdGhpcy5zZWxlY3RlZFRvb2wgPSBudWxsO1xuICB9XG5cbiAgb3BlbkFjdG9yVGFnc0RpYWxvZygpIHtcbiAgICB0aGlzLnNob3dBY3RvclRhZ3NEaWFsb2cgPSB0cnVlO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwid29ya2Zsb3ctZGVzaWduZXJcIj5cbiAgPGRpdiBjbGFzcz1cIndvcmtmbG93LWhlYWRlclwiPlxuICAgIDxoMT57eyBzdGF0ZS53b3JrZmxvdz8uTmFtZSB9fTwvaDE+XG4gIDwvZGl2PlxuXG4gIDwhLS0gVG9vbGJhciBDb21wb25lbnQgLS0+XG4gIDxsaWItZGVzaWduZXItdG9vbGJhciBbc2VsZWN0ZWRUb29sXT1cInNlbGVjdGVkVG9vbFwiIFtpc1NhdmluZ109XCJpc1NhdmluZ1wiXG4gICAgW3dvcmtmbG93Q29kZV09XCJzdGF0ZS53b3JrZmxvdz8uQ29kZSB8fCBudWxsXCIgKHRvb2xTZWxlY3RlZCk9XCJvblRvb2xTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAoc2F2ZVdvcmtmbG93KT1cInNhdmVXb3JrZmxvdygpXCIgKG9wZW5BY3RvclRhZ3MpPVwib3BlbkFjdG9yVGFnc0RpYWxvZygpXCI+XG4gIDwvbGliLWRlc2lnbmVyLXRvb2xiYXI+XG5cbiAgPCEtLSBTaG93IGxvYWRpbmcgaW5kaWNhdG9yIGlmIG5lZWRlZCAtLT5cbiAgPGRpdiAqbmdJZj1cImlzTG9hZGluZ1wiIGNsYXNzPVwibG9hZGluZy1vdmVybGF5XCI+XG4gICAgPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXRleHRcIj5Mb2FkaW5nIHdvcmtmbG93Li4uPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQ2FudmFzIENvbXBvbmVudCAtLT5cbiAgPGxpYi1kZXNpZ25lci1jYW52YXMgW3NlbGVjdGVkVG9vbF09XCJzZWxlY3RlZFRvb2xcIiAoY2xpY2tlZFBvc2l0aW9uKT1cImhhbmRsZUNhbnZhc1Bvc2l0aW9uQ2xpY2soJGV2ZW50KVwiXG4gICAgKHN1YmZsb3dTZWxlY3RlZCk9XCJvblN1YmZsb3dTZWxlY3RlZCgpXCIgI2NhbnZhc1JlZj5cbiAgPC9saWItZGVzaWduZXItY2FudmFzPlxuXG4gIDxsaWItc3dpbWxhbmUtZGlhbG9nIFt2aXNpYmxlXT1cInNob3dTd2ltbGFuZURpYWxvZ1wiIFtzd2ltbGFuZURhdGFdPVwiZWRpdGluZ1N3aW1sYW5lKClcIlxuICAgIFtpc0VkaXRpbmddPVwiZWRpdGluZ1N3aW1sYW5lSW5kZXggIT09IG51bGxcIiAoY3JlYXRlZCk9XCJvblN3aW1sYW5lRGlhbG9nRmlsbGVkKCRldmVudClcIlxuICAgIChkZWxldGVkKT1cIm9uU3dpbWxhbmVEaWFsb2dEZWxldGVkKClcIiAoY2xvc2VkKT1cInNob3dTd2ltbGFuZURpYWxvZyA9IGZhbHNlXCI+PC9saWItc3dpbWxhbmUtZGlhbG9nPlxuXG4gIDxsaWItYWN0b3ItdGFncy1kaWFsb2cgW3Zpc2libGVdPVwic2hvd0FjdG9yVGFnc0RpYWxvZ1wiIFt3b3JrZmxvd0NvZGVdPVwic3RhdGUud29ya2Zsb3c/LkNvZGUgfHwgbnVsbFwiXG4gICAgKGNsb3NlZCk9XCJzaG93QWN0b3JUYWdzRGlhbG9nID0gZmFsc2VcIj48L2xpYi1hY3Rvci10YWdzLWRpYWxvZz5cbjwvZGl2PlxuIl19