@cqa-lib/cqa-ui 1.1.197 → 1.1.199

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.
@@ -269,7 +269,32 @@ export class StepBuilderLoopComponent {
269
269
  this.resetForm();
270
270
  this.cancelled.emit();
271
271
  }
272
+ isFormValid() {
273
+ if (this.selectedLoopType === 'while') {
274
+ return !!this.selectedWhileTemplate;
275
+ }
276
+ else {
277
+ // For 'for' loop type
278
+ const formValue = this.loopForm.value;
279
+ const selectOption = formValue.selectOption;
280
+ if (!selectOption) {
281
+ return false;
282
+ }
283
+ if (selectOption === 'dataProfile') {
284
+ // For data profile, need dataProfile, loopStart, and loopEnd
285
+ return !!(formValue.dataProfile && formValue.loopStart && formValue.loopEnd);
286
+ }
287
+ else if (selectOption === 'runTime') {
288
+ // For run time, need runTime value
289
+ return !!(formValue.runTime && formValue.runTime.trim() !== '');
290
+ }
291
+ return false;
292
+ }
293
+ }
272
294
  onCreateStep() {
295
+ if (!this.isFormValid()) {
296
+ return;
297
+ }
273
298
  const formValue = this.loopForm.value;
274
299
  if (this.selectedLoopType === 'while') {
275
300
  if (!this.selectedWhileTemplate) {
@@ -355,10 +380,10 @@ export class StepBuilderLoopComponent {
355
380
  }
356
381
  }
357
382
  StepBuilderLoopComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderLoopComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
358
- StepBuilderLoopComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderLoopComponent, selector: "cqa-step-builder-loop", inputs: { loopType: "loopType", selectOptions: "selectOptions", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", setWhileTemplateVariables: "setWhileTemplateVariables", whileTemplates: "whileTemplates", whileSearchPlaceholder: "whileSearchPlaceholder", whileSearchValue: "whileSearchValue" }, outputs: { createStep: "createStep", cancelled: "cancelled", loopTypeChange: "loopTypeChange", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Create Loop Test Step\n </h2>\n\n <!-- Loop Type Selection -->\n <div class=\"cqa-mb-4\">\n <cqa-segment-control\n [segments]=\"[\n { label: 'For', value: 'for' },\n { label: 'While', value: 'while' }\n ]\"\n [value]=\"selectedLoopType\"\n (valueChange)=\"onLoopTypeChange($event)\">\n </cqa-segment-control>\n </div>\n\n <!-- Form Fields -->\n <ng-container *ngIf=\"selectedLoopType === 'for'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Dropdown Fields Row -->\n <div class=\"cqa-flex cqa-gap-4 cqa-flex-wrap\">\n <!-- Select Option -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Select Option\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"selectOptionConfig\">\n </cqa-dynamic-select>\n </div>\n\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'dataProfile'\">\n <!-- Data Profile -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Data Profile\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"dataProfileConfig\"\n (searchChange)=\"onSearchDataProfiles($event.query)\"\n (loadMore)=\"onLoadMoreDataProfiles($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop Start -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop Start\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopStartConfig\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop End -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop End\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopEndConfig\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'runTime'\">\n <!-- Run Time Input Field -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Run Time\n </label>\n <cqa-custom-input\n [placeholder]=\"'Enter Run Time'\"\n [value]=\"loopForm.get('runTime')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"loopForm.get('runTime')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action [showHeader]=\"false\" [templates]=\"whileTemplates\" [setTemplateVariables]=\"setWhileTemplateVariables\" [searchPlaceholder]=\"whileSearchPlaceholder\" (templateChanged)=\"selectWhileTemplate($event)\" (createStep)=\"createWhileStep($event)\"></cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons -->\n <div *ngIf=\"selectedLoopType === 'for'\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-6 cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"outlined\"\n text=\"Cancel\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n text=\"Create Step\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>\n\n", components: [{ type: i1.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor"], outputs: ["valueChange"] }, { type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i4.StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: ["showHeader", "templates", "searchPlaceholder", "setTemplateVariables", "preventSelectTemplate"], outputs: ["templateChanged", "createStep", "cancelled"] }, { type: i5.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
383
+ StepBuilderLoopComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderLoopComponent, selector: "cqa-step-builder-loop", inputs: { loopType: "loopType", selectOptions: "selectOptions", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", setWhileTemplateVariables: "setWhileTemplateVariables", whileTemplates: "whileTemplates", whileSearchPlaceholder: "whileSearchPlaceholder", whileSearchValue: "whileSearchValue" }, outputs: { createStep: "createStep", cancelled: "cancelled", loopTypeChange: "loopTypeChange", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Create Loop Test Step\n </h2>\n\n <!-- Loop Type Selection -->\n <div class=\"cqa-mb-4\">\n <cqa-segment-control\n [segments]=\"[\n { label: 'For', value: 'for' },\n { label: 'While', value: 'while' }\n ]\"\n [value]=\"selectedLoopType\"\n (valueChange)=\"onLoopTypeChange($event)\">\n </cqa-segment-control>\n </div>\n\n <!-- Form Fields -->\n <ng-container *ngIf=\"selectedLoopType === 'for'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Dropdown Fields Row -->\n <div class=\"cqa-flex cqa-gap-4 cqa-flex-wrap\">\n <!-- Select Option -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Select Option\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"selectOptionConfig\">\n </cqa-dynamic-select>\n </div>\n\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'dataProfile'\">\n <!-- Data Profile -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Data Profile\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"dataProfileConfig\"\n (searchChange)=\"onSearchDataProfiles($event.query)\"\n (loadMore)=\"onLoadMoreDataProfiles($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop Start -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop Start\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopStartConfig\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop End -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop End\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopEndConfig\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'runTime'\">\n <!-- Run Time Input Field -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Run Time\n </label>\n <cqa-custom-input\n [placeholder]=\"'Enter Run Time'\"\n [value]=\"loopForm.get('runTime')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"loopForm.get('runTime')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action [showHeader]=\"false\" [templates]=\"whileTemplates\" [setTemplateVariables]=\"setWhileTemplateVariables\" [searchPlaceholder]=\"whileSearchPlaceholder\" (templateChanged)=\"selectWhileTemplate($event)\" (createStep)=\"createWhileStep($event)\"></cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons -->\n <div *ngIf=\"selectedLoopType === 'for'\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-6 cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"outlined\"\n text=\"Cancel\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n text=\"Create Step\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>\n\n", components: [{ type: i1.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor"], outputs: ["valueChange"] }, { type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i4.StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: ["showHeader", "templates", "searchPlaceholder", "setTemplateVariables", "preventSelectTemplate"], outputs: ["templateChanged", "createStep", "cancelled"] }, { type: i5.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
359
384
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderLoopComponent, decorators: [{
360
385
  type: Component,
361
- args: [{ selector: 'cqa-step-builder-loop', host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Create Loop Test Step\n </h2>\n\n <!-- Loop Type Selection -->\n <div class=\"cqa-mb-4\">\n <cqa-segment-control\n [segments]=\"[\n { label: 'For', value: 'for' },\n { label: 'While', value: 'while' }\n ]\"\n [value]=\"selectedLoopType\"\n (valueChange)=\"onLoopTypeChange($event)\">\n </cqa-segment-control>\n </div>\n\n <!-- Form Fields -->\n <ng-container *ngIf=\"selectedLoopType === 'for'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Dropdown Fields Row -->\n <div class=\"cqa-flex cqa-gap-4 cqa-flex-wrap\">\n <!-- Select Option -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Select Option\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"selectOptionConfig\">\n </cqa-dynamic-select>\n </div>\n\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'dataProfile'\">\n <!-- Data Profile -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Data Profile\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"dataProfileConfig\"\n (searchChange)=\"onSearchDataProfiles($event.query)\"\n (loadMore)=\"onLoadMoreDataProfiles($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop Start -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop Start\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopStartConfig\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop End -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop End\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopEndConfig\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'runTime'\">\n <!-- Run Time Input Field -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Run Time\n </label>\n <cqa-custom-input\n [placeholder]=\"'Enter Run Time'\"\n [value]=\"loopForm.get('runTime')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"loopForm.get('runTime')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action [showHeader]=\"false\" [templates]=\"whileTemplates\" [setTemplateVariables]=\"setWhileTemplateVariables\" [searchPlaceholder]=\"whileSearchPlaceholder\" (templateChanged)=\"selectWhileTemplate($event)\" (createStep)=\"createWhileStep($event)\"></cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons -->\n <div *ngIf=\"selectedLoopType === 'for'\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-6 cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"outlined\"\n text=\"Cancel\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n text=\"Create Step\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>\n\n", styles: [] }]
386
+ args: [{ selector: 'cqa-step-builder-loop', host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Create Loop Test Step\n </h2>\n\n <!-- Loop Type Selection -->\n <div class=\"cqa-mb-4\">\n <cqa-segment-control\n [segments]=\"[\n { label: 'For', value: 'for' },\n { label: 'While', value: 'while' }\n ]\"\n [value]=\"selectedLoopType\"\n (valueChange)=\"onLoopTypeChange($event)\">\n </cqa-segment-control>\n </div>\n\n <!-- Form Fields -->\n <ng-container *ngIf=\"selectedLoopType === 'for'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Dropdown Fields Row -->\n <div class=\"cqa-flex cqa-gap-4 cqa-flex-wrap\">\n <!-- Select Option -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Select Option\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"selectOptionConfig\">\n </cqa-dynamic-select>\n </div>\n\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'dataProfile'\">\n <!-- Data Profile -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Data Profile\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"dataProfileConfig\"\n (searchChange)=\"onSearchDataProfiles($event.query)\"\n (loadMore)=\"onLoadMoreDataProfiles($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop Start -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop Start\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopStartConfig\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop End -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop End\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopEndConfig\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'runTime'\">\n <!-- Run Time Input Field -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Run Time\n </label>\n <cqa-custom-input\n [placeholder]=\"'Enter Run Time'\"\n [value]=\"loopForm.get('runTime')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"loopForm.get('runTime')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action [showHeader]=\"false\" [templates]=\"whileTemplates\" [setTemplateVariables]=\"setWhileTemplateVariables\" [searchPlaceholder]=\"whileSearchPlaceholder\" (templateChanged)=\"selectWhileTemplate($event)\" (createStep)=\"createWhileStep($event)\"></cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons -->\n <div *ngIf=\"selectedLoopType === 'for'\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-6 cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"outlined\"\n text=\"Cancel\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n text=\"Create Step\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>\n\n", styles: [] }]
362
387
  }], ctorParameters: function () { return []; }, propDecorators: { loopType: [{
363
388
  type: Input
364
389
  }], selectOptions: [{
@@ -388,4 +413,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
388
413
  }], whileSearchValue: [{
389
414
  type: Input
390
415
  }] } });
391
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7QUFxQ3hELE1BQU0sT0FBTyx3QkFBd0I7SUF3RG5DO1FBdkRBLG1DQUFtQztRQUMxQixhQUFRLEdBQWEsS0FBSyxDQUFDO1FBRXBDLDZDQUE2QztRQUNwQyxrQkFBYSxHQUFVO1lBQzlCLEVBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFDO1lBQzdDLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFDO1NBQ3RDLENBQUM7UUFFRixnRkFBZ0Y7UUFDdkUsdUJBQWtCLEdBQXdCLEVBQUUsQ0FBQztRQUV0RCxnRUFBZ0U7UUFDdkQsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBRTlDLHNDQUFzQztRQUM3QiwwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFDaEQsbUdBQW1HO1FBQzFGLDhCQUF5QixHQUF1QyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQSxDQUFBLENBQUMsQ0FBQztRQUU1RixnQ0FBZ0M7UUFDdEIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFnQixDQUFDO1FBRXhELDBCQUEwQjtRQUNoQixj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QUFsQixNQUFNO2dCQUdHLGNBQWM7c0JBQXZCLE1BQU07Z0JBR0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUdHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRSxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBY3Rpb25UZW1wbGF0ZSB9IGZyb20gJy4uL3N0ZXAtYnVpbGRlci1hY3Rpb24vc3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQnO1xuXG5leHBvcnQgdHlwZSBMb29wVHlwZSA9ICdmb3InIHwgJ3doaWxlJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGRhdGEgcHJvZmlsZSBvcHRpb25cbiAqIEJhc2VkIG9uIFRlc3REYXRhIG1vZGVsIHN0cnVjdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFQcm9maWxlT3B0aW9uIHtcbiAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogQXJyYXkgb2YgZGF0YSBzZXRzIC0gbGVuZ3RoIGRldGVybWluZXMgYXZhaWxhYmxlIGxvb3AgaW5kaWNlcyAqL1xuICBkYXRhPzogYW55W107XG4gIC8qKiBPcHRpb25hbDogZGlyZWN0IGRhdGEgbGVuZ3RoIGlmIGRhdGEgYXJyYXkgaXMgbm90IHByb3ZpZGVkICovXG4gIGRhdGFMZW5ndGg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9vcEZvcm1EYXRhIHtcbiAgc2VsZWN0ZWRMb29wVHlwZTogTG9vcFR5cGU7XG4gIGxvb3BUeXBlOiBMb29wVHlwZTtcbiAgc2VsZWN0T3B0aW9uPzogc3RyaW5nO1xuICBkYXRhUHJvZmlsZT86IHN0cmluZyB8IG51bWJlcjtcbiAgbG9vcFN0YXJ0PzogbnVtYmVyIHwgc3RyaW5nO1xuICBsb29wRW5kPzogbnVtYmVyIHwgc3RyaW5nO1xuICBydW5UaW1lPzogc3RyaW5nO1xuICB3aGlsZVRlbXBsYXRlPzogYW55O1xuICBldmVudD86IGFueTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtYnVpbGRlci1sb29wJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXAtYnVpbGRlci1sb29wLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9XG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBCdWlsZGVyTG9vcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgLyoqIEN1cnJlbnRseSBzZWxlY3RlZCBsb29wIHR5cGUgKi9cbiAgQElucHV0KCkgbG9vcFR5cGU6IExvb3BUeXBlID0gJ2Zvcic7XG5cbiAgLyoqIE9wdGlvbnMgZm9yIHRoZSBzZWxlY3Qgb3B0aW9uIGRyb3Bkb3duICovXG4gIEBJbnB1dCgpIHNlbGVjdE9wdGlvbnM6IGFueVtdID0gW1xuICAgIHt2YWx1ZTogJ2RhdGFQcm9maWxlJywgbGFiZWw6ICdEYXRhIFByb2ZpbGUnfSxcbiAgICB7dmFsdWU6ICdydW5UaW1lJywgbGFiZWw6ICdSdW4gVGltZSd9XG4gIF07XG5cbiAgLyoqIE9wdGlvbnMgZm9yIHRoZSBkYXRhIHByb2ZpbGUgZHJvcGRvd24gLSBhY2NlcHRzIERhdGFQcm9maWxlT3B0aW9uIG9iamVjdHMgKi9cbiAgQElucHV0KCkgZGF0YVByb2ZpbGVPcHRpb25zOiBEYXRhUHJvZmlsZU9wdGlvbltdID0gW107XG5cbiAgLyoqIEluZGljYXRlcyBpZiBtb3JlIGRhdGEgcHJvZmlsZXMgYXJlIGF2YWlsYWJsZSBmb3IgbG9hZGluZyAqL1xuICBASW5wdXQoKSBoYXNNb3JlRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIExvYWRpbmcgc3RhdGUgZm9yIGRhdGEgcHJvZmlsZXMgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBGdW5jdGlvbiB0byBoYW5kbGUgdmFyaWFibGUgcHJvY2Vzc2luZyBvciBjdXN0b20gbG9naWMuIENhbiBiZSBwYXNzZWQgZnJvbSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBzZXRXaGlsZVRlbXBsYXRlVmFyaWFibGVzOiAodmFyaWFibGVzOiBBY3Rpb25UZW1wbGF0ZSkgPT4gYW55ID0gKCkgPT4geyByZXR1cm4gW119O1xuXG4gIC8qKiBFbWl0IHdoZW4gc3RlcCBpcyBjcmVhdGVkICovXG4gIEBPdXRwdXQoKSBjcmVhdGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxMb29wRm9ybURhdGE+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBjYW5jZWxsZWQgKi9cbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogRW1pdCB3aGVuIGxvb3AgdHlwZSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBsb29wVHlwZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TG9vcFR5cGU+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBtb3JlIGRhdGEgcHJvZmlsZXMgbmVlZCB0byBiZSBsb2FkZWQgKi9cbiAgQE91dHB1dCgpIGxvYWRNb3JlRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBkYXRhIHByb2ZpbGUgc2VhcmNoIHF1ZXJ5IGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIHNlYXJjaERhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBASW5wdXQoKSB3aGlsZVRlbXBsYXRlczogYW55W10gPSBbXTtcbiAgQElucHV0KCkgd2hpbGVTZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlYXJjaCBXaGlsZSc7XG4gIEBJbnB1dCgpIHdoaWxlU2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuICBzZWxlY3RlZFdoaWxlVGVtcGxhdGU6IGFueSA9IG51bGw7XG4gIHNlbGVjdGVkTG9vcFR5cGU6IExvb3BUeXBlID0gJ2Zvcic7XG4gIFxuICAvLyBTaW5nbGUgRm9ybUdyb3VwIGNvbnRhaW5pbmcgYWxsIGZvdXIgZmllbGRzXG4gIGxvb3BGb3JtOiBGb3JtR3JvdXA7XG5cbiAgLy8gQ29uZmlncyBmb3IgZHluYW1pYy1zZWxlY3QgY29tcG9uZW50c1xuICBzZWxlY3RPcHRpb25Db25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgZGF0YVByb2ZpbGVDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgbG9vcFN0YXJ0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGxvb3BFbmRDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuXG4gIC8vIEludGVybmFsIHN0YXRlIGZvciBtYW5hZ2luZyBsb29wIGluZGljZXNcbiAgcHJpdmF0ZSBzZWxlY3RlZERhdGFQcm9maWxlOiBEYXRhUHJvZmlsZU9wdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXJ0QXJyYXk6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgZW5kQXJyYXk6IG51bWJlcltdID0gW107XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBzaW5nbGUgRm9ybUdyb3VwIHdpdGggYWxsIGZpZWxkc1xuICAgIHRoaXMubG9vcEZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgIHNlbGVjdE9wdGlvbjogbmV3IEZvcm1Db250cm9sKG51bGwpLFxuICAgICAgZGF0YVByb2ZpbGU6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcbiAgICAgIGxvb3BTdGFydDogbmV3IEZvcm1Db250cm9sKG51bGwpLFxuICAgICAgbG9vcEVuZDogbmV3IEZvcm1Db250cm9sKG51bGwpLFxuICAgICAgcnVuVGltZTogbmV3IEZvcm1Db250cm9sKG51bGwpXG4gICAgfSk7XG5cbiAgICAvLyBJbml0aWFsaXplIGNvbmZpZ3NcbiAgICB0aGlzLnNlbGVjdE9wdGlvbkNvbmZpZyA9IHtcbiAgICAgIGtleTogJ3NlbGVjdE9wdGlvbicsXG4gICAgICBwbGFjZWhvbGRlcjogJ3NlbGVjdCBvcHRpb24nLFxuICAgICAgc2VsZWN0ZWRWYWx1ZTogJ2RhdGFQcm9maWxlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGhpcy5zZWxlY3RPcHRpb25zXG4gICAgfTtcbiAgICB0aGlzLmRhdGFQcm9maWxlQ29uZmlnID0ge1xuICAgICAga2V5OiAnZGF0YVByb2ZpbGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdkYXRhIHByb2ZpbGUnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZURhdGFQcm9maWxlcyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdEYXRhUHJvZmlsZXMsXG4gICAgICBvcHRpb25zOiBbXSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uRGF0YVByb2ZpbGVDaGFuZ2UodmFsdWUpO1xuICAgICAgfSxcbiAgICAgIG9uU2VhcmNoOiAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm9uU2VhcmNoRGF0YVByb2ZpbGVzKHF1ZXJ5KTtcbiAgICAgIH0sXG4gICAgICBvbkxvYWRNb3JlOiAocXVlcnk/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGFQcm9maWxlcy5lbWl0KHF1ZXJ5IHx8ICcnKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMubG9vcFN0YXJ0Q29uZmlnID0ge1xuICAgICAga2V5OiAnbG9vcFN0YXJ0JyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnbG9vcCBzdGFydCcsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25Mb29wU3RhcnRDaGFuZ2UodmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5sb29wRW5kQ29uZmlnID0ge1xuICAgICAga2V5OiAnbG9vcEVuZCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ2xvb3AgZW5kJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogW10sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gSGFuZGxlIGNoYW5nZSBpZiBuZWVkZWRcbiAgICAgIH1cbiAgICB9OyAgXG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPSB0aGlzLmxvb3BUeXBlO1xuICAgIHRoaXMudXBkYXRlQ29uZmlncygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKFwidGhpcy53aGlsZVRlbXBsYXRlc1wiLHRoaXMud2hpbGVUZW1wbGF0ZXMpO1xuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlQ29uZmlncygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZGF0YVByb2ZpbGVPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlQ29uZmlncygpO1xuICAgICAgLy8gSWYgYSBkYXRhIHByb2ZpbGUgaXMgYWxyZWFkeSBzZWxlY3RlZCwgdXBkYXRlIGxvb3AgaW5kaWNlc1xuICAgICAgY29uc3QgY3VycmVudFByb2ZpbGVJZCA9IHRoaXMubG9vcEZvcm0uZ2V0KCdkYXRhUHJvZmlsZScpPy52YWx1ZTtcbiAgICAgIGlmIChjdXJyZW50UHJvZmlsZUlkKSB7XG4gICAgICAgIHRoaXMub25EYXRhUHJvZmlsZUNoYW5nZShjdXJyZW50UHJvZmlsZUlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hhc01vcmVEYXRhUHJvZmlsZXMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdEYXRhUHJvZmlsZXMnXSkge1xuICAgICAgdGhpcy51cGRhdGVEYXRhUHJvZmlsZUNvbmZpZygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snbG9vcFR5cGUnXSkge1xuICAgICAgdGhpcy5zZWxlY3RlZExvb3BUeXBlID0gdGhpcy5sb29wVHlwZTtcbiAgICB9XG4gICAgLy8gTm90ZTogbG9vcFN0YXJ0T3B0aW9ucyBhbmQgbG9vcEVuZE9wdGlvbnMgYXJlIG5vdyBjYWxjdWxhdGVkIGR5bmFtaWNhbGx5XG4gICAgLy8gc28gdGhleSBkb24ndCBuZWVkIHRvIGJlIHVwZGF0ZWQgZnJvbSBpbnB1dHNcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29uZmlncygpOiB2b2lkIHtcbiAgICAvLyBDb252ZXJ0IERhdGFQcm9maWxlT3B0aW9uW10gdG8gU2VsZWN0T3B0aW9uW11cbiAgICB0aGlzLmRhdGFQcm9maWxlQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy5kYXRhUHJvZmlsZUNvbmZpZyxcbiAgICAgIG9wdGlvbnM6IHRoaXMuY29udmVydERhdGFQcm9maWxlT3B0aW9uc1RvU2VsZWN0T3B0aW9ucyh0aGlzLmRhdGFQcm9maWxlT3B0aW9ucyksXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVEYXRhUHJvZmlsZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRGF0YVByb2ZpbGVzLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25EYXRhUHJvZmlsZUNoYW5nZSh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMub25TZWFyY2hEYXRhUHJvZmlsZXMocXVlcnkpO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6IChxdWVyeT86IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQocXVlcnkgfHwgJycpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gTG9vcCBzdGFydCBhbmQgZW5kIG9wdGlvbnMgYXJlIHVwZGF0ZWQgd2hlbiBkYXRhIHByb2ZpbGUgaXMgc2VsZWN0ZWRcbiAgICB0aGlzLnVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERhdGFQcm9maWxlT3B0aW9uc1RvU2VsZWN0T3B0aW9ucyhvcHRpb25zOiBEYXRhUHJvZmlsZU9wdGlvbltdKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIHJldHVybiBvcHRpb25zLm1hcChvcHRpb24gPT4gKHtcbiAgICAgIGlkOiBvcHRpb24uaWQsXG4gICAgICB2YWx1ZTogb3B0aW9uLmlkLFxuICAgICAgbmFtZTogb3B0aW9uLm5hbWUsXG4gICAgICBsYWJlbDogb3B0aW9uLm5hbWVcbiAgICB9KSk7XG4gIH1cbiAgLyoqXG4gICAqIEhhbmRsZSBkYXRhIHByb2ZpbGUgc2VsZWN0aW9uIGFuZCB1cGRhdGUgbG9vcCBzdGFydC9lbmQgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBvbkRhdGFQcm9maWxlQ2hhbmdlKHByb2ZpbGVJZDogYW55KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChwcm9maWxlID0+IFxuICAgICAgcHJvZmlsZS5pZCA9PT0gcHJvZmlsZUlkIHx8IFN0cmluZyhwcm9maWxlLmlkKSA9PT0gU3RyaW5nKHByb2ZpbGVJZClcbiAgICApO1xuXG4gICAgaWYgKHNlbGVjdGVkUHJvZmlsZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGFQcm9maWxlID0gc2VsZWN0ZWRQcm9maWxlO1xuICAgICAgdGhpcy51cGRhdGVMb29wSW5kaWNlc0Zyb21Qcm9maWxlKHNlbGVjdGVkUHJvZmlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhUHJvZmlsZSA9IG51bGw7XG4gICAgICB0aGlzLnN0YXJ0QXJyYXkgPSBbXTtcbiAgICAgIHRoaXMuZW5kQXJyYXkgPSBbXTtcbiAgICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgbG9vcCBpbmRpY2VzIGJhc2VkIG9uIHNlbGVjdGVkIGRhdGEgcHJvZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVMb29wSW5kaWNlc0Zyb21Qcm9maWxlKHByb2ZpbGU6IERhdGFQcm9maWxlT3B0aW9uKTogdm9pZCB7XG4gICAgLy8gQ2FsY3VsYXRlIGRhdGEgbGVuZ3RoIGZyb20gZGF0YSBhcnJheSBvciB1c2UgcHJvdmlkZWQgZGF0YUxlbmd0aFxuICAgIGxldCBkYXRhU2V0TGVuZ3RoID0gMTtcbiAgICBpZiAocHJvZmlsZS5kYXRhICYmIEFycmF5LmlzQXJyYXkocHJvZmlsZS5kYXRhKSkge1xuICAgICAgZGF0YVNldExlbmd0aCA9IHByb2ZpbGUuZGF0YS5sZW5ndGg7XG4gICAgfSBlbHNlIGlmIChwcm9maWxlLmRhdGFMZW5ndGggJiYgcHJvZmlsZS5kYXRhTGVuZ3RoID4gMCkge1xuICAgICAgZGF0YVNldExlbmd0aCA9IHByb2ZpbGUuZGF0YUxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc3RhcnQgYXJyYXkgZnJvbSAxIHRvIGRhdGFTZXRMZW5ndGhcbiAgICB0aGlzLnN0YXJ0QXJyYXkgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBkYXRhU2V0TGVuZ3RoIH0sIChfLCBpKSA9PiBpICsgMSk7XG4gICAgLy8gSW5pdGlhbGl6ZSBlbmQgYXJyYXkgc2FtZSBhcyBzdGFydCBhcnJheVxuICAgIC8vIEVuZCBhcnJheSB3aWxsIGJlIHVwZGF0ZWQgd2hlbiBzdGFydCBpbmRleCBpcyBzZWxlY3RlZFxuICAgIHRoaXMuZW5kQXJyYXkgPSBbLi4udGhpcy5zdGFydEFycmF5XTtcblxuICAgIC8vIFNldCBkZWZhdWx0IHZhbHVlcyBpZiBmb3JtIGlzIGVtcHR5XG4gICAgY29uc3QgY3VycmVudFN0YXJ0ID0gdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BTdGFydCcpPy52YWx1ZTtcbiAgICBjb25zdCBjdXJyZW50RW5kID0gdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8udmFsdWU7XG4gICAgXG4gICAgaWYgKCFjdXJyZW50U3RhcnQgJiYgdGhpcy5zdGFydEFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wU3RhcnQnKT8uc2V0VmFsdWUodGhpcy5zdGFydEFycmF5WzBdKTtcbiAgICB9XG4gICAgaWYgKCFjdXJyZW50RW5kICYmIHRoaXMuZW5kQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8uc2V0VmFsdWUodGhpcy5lbmRBcnJheVt0aGlzLmVuZEFycmF5Lmxlbmd0aCAtIDFdKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbG9vcCBzdGFydCBjaGFuZ2UgYW5kIHVwZGF0ZSBlbmQgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBvbkxvb3BTdGFydENoYW5nZShzdGFydEluZGV4OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWREYXRhUHJvZmlsZSB8fCAhc3RhcnRJbmRleCkge1xuICAgICAgdGhpcy5lbmRBcnJheSA9IFsuLi50aGlzLnN0YXJ0QXJyYXldO1xuICAgICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRJZHggPSB0eXBlb2Ygc3RhcnRJbmRleCA9PT0gJ3N0cmluZycgPyBwYXJzZUludChzdGFydEluZGV4KSA6IHN0YXJ0SW5kZXg7XG4gICAgXG4gICAgaWYgKGlzTmFOKHN0YXJ0SWR4KSB8fCBzdGFydElkeCA8IDEpIHtcbiAgICAgIHRoaXMuZW5kQXJyYXkgPSBbLi4udGhpcy5zdGFydEFycmF5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRW5kIGFycmF5IHNob3VsZCBiZSBmcm9tIHN0YXJ0SW5kZXggdG8gZW5kIG9mIGRhdGFcbiAgICAgIC8vIEJhc2VkIG9uIHJlZmVyZW5jZTogZW5kQXJyYXkgPSBzdGFydEFycmF5LnNwbGljZShzdGFydEluZGV4IC0gMSwgc3RhcnRBcnJheS5sZW5ndGgpXG4gICAgICBjb25zdCBzdGFydEFycmF5Q29weSA9IFsuLi50aGlzLnN0YXJ0QXJyYXldO1xuICAgICAgdGhpcy5lbmRBcnJheSA9IHN0YXJ0QXJyYXlDb3B5LnNsaWNlKHN0YXJ0SWR4IC0gMSk7XG4gICAgfVxuXG4gICAgLy8gQXV0by11cGRhdGUgZW5kIGluZGV4IGlmIGN1cnJlbnQgZW5kIGlzIGludmFsaWRcbiAgICBjb25zdCBjdXJyZW50RW5kID0gdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8udmFsdWU7XG4gICAgY29uc3QgZW5kSWR4ID0gdHlwZW9mIGN1cnJlbnRFbmQgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQoY3VycmVudEVuZCkgOiBjdXJyZW50RW5kO1xuICAgIFxuICAgIGlmICghY3VycmVudEVuZCB8fCBpc05hTihlbmRJZHgpIHx8IGVuZElkeCA8IHN0YXJ0SWR4KSB7XG4gICAgICBpZiAodGhpcy5lbmRBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wRW5kJyk/LnNldFZhbHVlKHRoaXMuZW5kQXJyYXlbdGhpcy5lbmRBcnJheS5sZW5ndGggLSAxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGxvb3Agc3RhcnQgYW5kIGVuZCBjb25maWcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVMb29wSW5kZXhPcHRpb25zKCk6IHZvaWQge1xuICAgIC8vIENvbnZlcnQgc3RhcnRBcnJheSB0byBTZWxlY3RPcHRpb25zXG4gICAgY29uc3Qgc3RhcnRPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IHRoaXMuc3RhcnRBcnJheS5tYXAoaWR4ID0+ICh7XG4gICAgICBpZDogaWR4LFxuICAgICAgdmFsdWU6IGlkeCxcbiAgICAgIG5hbWU6IFN0cmluZyhpZHgpLFxuICAgICAgbGFiZWw6IFN0cmluZyhpZHgpXG4gICAgfSkpO1xuXG4gICAgLy8gQ29udmVydCBlbmRBcnJheSB0byBTZWxlY3RPcHRpb25zXG4gICAgY29uc3QgZW5kT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSB0aGlzLmVuZEFycmF5Lm1hcChpZHggPT4gKHtcbiAgICAgIGlkOiBpZHgsXG4gICAgICB2YWx1ZTogaWR4LFxuICAgICAgbmFtZTogU3RyaW5nKGlkeCksXG4gICAgICBsYWJlbDogU3RyaW5nKGlkeClcbiAgICB9KSk7XG5cbiAgICB0aGlzLmxvb3BTdGFydENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMubG9vcFN0YXJ0Q29uZmlnLFxuICAgICAgb3B0aW9uczogW3tpZDogLTEsIHZhbHVlOiAtMSwgbmFtZTogJ1N0YXJ0JywgbGFiZWw6ICdTdGFydCd9LCAuLi5zdGFydE9wdGlvbnNdLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25Mb29wU3RhcnRDaGFuZ2UodmFsdWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmxvb3BFbmRDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmxvb3BFbmRDb25maWcsXG4gICAgICBvcHRpb25zOiBbLi4uZW5kT3B0aW9ucyx7aWQ6IC0xLCB2YWx1ZTogLTEsIG5hbWU6ICdFbmQnLCBsYWJlbDogJ0VuZCd9XSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlIGlmIG5lZWRlZFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBvbkxvb3BUeXBlQ2hhbmdlKHR5cGU6IHN0cmluZyB8IExvb3BUeXBlKTogdm9pZCB7XG4gICAgY29uc3QgbG9vcFR5cGUgPSB0eXBlIGFzIExvb3BUeXBlO1xuICAgIHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9IGxvb3BUeXBlO1xuICAgIHRoaXMubG9vcFR5cGVDaGFuZ2UuZW1pdChsb29wVHlwZSk7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoKTtcbiAgfVxuXG4gIG9uQ3JlYXRlU3RlcCgpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmxvb3BGb3JtLnZhbHVlO1xuICAgIGlmKHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgaWYoIXRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc3RlcERhdGE6IExvb3BGb3JtRGF0YSA9IHtcbiAgICAgIHNlbGVjdGVkTG9vcFR5cGU6IHRoaXMuc2VsZWN0ZWRMb29wVHlwZSBhcyBMb29wVHlwZSxcbiAgICAgIGxvb3BUeXBlOiB0aGlzLnNlbGVjdGVkTG9vcFR5cGUsXG4gICAgICBzZWxlY3RPcHRpb246IGZvcm1WYWx1ZS5zZWxlY3RPcHRpb24gfHwgdW5kZWZpbmVkLFxuICAgICAgZGF0YVByb2ZpbGU6IGZvcm1WYWx1ZS5kYXRhUHJvZmlsZSB8fCB1bmRlZmluZWQsXG4gICAgICBsb29wU3RhcnQ6IGZvcm1WYWx1ZS5sb29wU3RhcnQgfHwgdW5kZWZpbmVkLFxuICAgICAgbG9vcEVuZDogZm9ybVZhbHVlLmxvb3BFbmQgfHwgdW5kZWZpbmVkLFxuICAgICAgcnVuVGltZTogZm9ybVZhbHVlLnJ1blRpbWUgfHwgdW5kZWZpbmVkLFxuICAgICAgd2hpbGVUZW1wbGF0ZTogdGhpcy5zZWxlY3RlZFdoaWxlVGVtcGxhdGUgfHwgdW5kZWZpbmVkXG4gICAgfTtcbiAgICBjb25zb2xlLmxvZygnc3RlcERhdGEnLCBzdGVwRGF0YSk7XG4gICAgdGhpcy5jcmVhdGVTdGVwLmVtaXQoc3RlcERhdGEpO1xuICB9XG5cbiAgY3JlYXRlV2hpbGVTdGVwKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnY3JlYXRlV2hpbGVTdGVwJywgZXZlbnQpO1xuICAgIGNvbnN0IHN0ZXBEYXRhOiBMb29wRm9ybURhdGEgPSB7XG4gICAgICBzZWxlY3RlZExvb3BUeXBlOiB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgYXMgTG9vcFR5cGUsXG4gICAgICBsb29wVHlwZTogdGhpcy5zZWxlY3RlZExvb3BUeXBlIGFzIExvb3BUeXBlLFxuICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgfTtcbiAgICBjb25zb2xlLmxvZygnc3RlcERhdGEnLCBzdGVwRGF0YSk7XG4gICAgdGhpcy5jcmVhdGVTdGVwLmVtaXQoc3RlcERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzZWFyY2ggZXZlbnQgZm9yIGRhdGEgcHJvZmlsZXNcbiAgICovXG4gIG9uU2VhcmNoRGF0YVByb2ZpbGVzKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaERhdGFQcm9maWxlcy5lbWl0KHF1ZXJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbG9hZE1vcmUgZXZlbnQgZm9yIGRhdGEgcHJvZmlsZXNcbiAgICovXG4gIG9uTG9hZE1vcmVEYXRhUHJvZmlsZXMoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChldmVudC5xdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGRhdGEgcHJvZmlsZSBjb25maWcgd2hlbiBsb2FkaW5nIHN0YXRlIG9yIGhhc01vcmUgY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVEYXRhUHJvZmlsZUNvbmZpZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhUHJvZmlsZUNvbmZpZykge1xuICAgICAgdGhpcy5kYXRhUHJvZmlsZUNvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5kYXRhUHJvZmlsZUNvbmZpZyxcbiAgICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlRGF0YVByb2ZpbGVzLFxuICAgICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRGF0YVByb2ZpbGVzXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9ICdmb3InO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRhUHJvZmlsZSA9IG51bGw7XG4gICAgdGhpcy5zdGFydEFycmF5ID0gW107XG4gICAgdGhpcy5lbmRBcnJheSA9IFtdO1xuICAgIHRoaXMubG9vcEZvcm0ucmVzZXQoe1xuICAgICAgc2VsZWN0T3B0aW9uOiBudWxsLFxuICAgICAgZGF0YVByb2ZpbGU6IG51bGwsXG4gICAgICBsb29wU3RhcnQ6IG51bGwsXG4gICAgICBsb29wRW5kOiBudWxsXG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gIH1cblxuICBvbldoaWxlU2VhcmNoQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlU2VhcmNoVmFsdWUgPSBldmVudDtcbiAgICB0aGlzLmZpbHRlcldoaWxlVGVtcGxhdGVzKGV2ZW50KTtcbiAgfVxuXG4gIG9uV2hpbGVTZWFyY2hTdWJtaXQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25XaGlsZVNlYXJjaENoYW5nZShldmVudCk7XG4gIH1cblxuICBvbldoaWxlU2VhcmNoQ2xlYXJlZCgpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlU2VhcmNoVmFsdWUgPSAnJztcbiAgICB0aGlzLmZpbHRlcldoaWxlVGVtcGxhdGVzKCcnKTtcbiAgfVxuXG4gIGZpbHRlcldoaWxlVGVtcGxhdGVzKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlVGVtcGxhdGVzID0gdGhpcy53aGlsZVRlbXBsYXRlcy5maWx0ZXIodGVtcGxhdGUgPT4gdGVtcGxhdGUuaHRtbEdyYW1tYXIudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKSB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpKTtcbiAgfVxuXG4gIHNlbGVjdFdoaWxlVGVtcGxhdGUodGVtcGxhdGU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlID0gdGVtcGxhdGU7XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1mdWxsIGNxYS1iZy13aGl0ZSBjcWEtcHgtNCBjcWEtcHktMlwiPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWJsYWNrLTEwMCBjcWEtbWItNFwiPlxuICAgIENyZWF0ZSBMb29wIFRlc3QgU3RlcFxuICA8L2gyPlxuXG4gIDwhLS0gTG9vcCBUeXBlIFNlbGVjdGlvbiAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1tYi00XCI+XG4gICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgIFtzZWdtZW50c109XCJbXG4gICAgICAgIHsgbGFiZWw6ICdGb3InLCB2YWx1ZTogJ2ZvcicgfSxcbiAgICAgICAgeyBsYWJlbDogJ1doaWxlJywgdmFsdWU6ICd3aGlsZScgfVxuICAgICAgXVwiXG4gICAgICBbdmFsdWVdPVwic2VsZWN0ZWRMb29wVHlwZVwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwib25Mb29wVHlwZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICA8L2Rpdj5cblxuICA8IS0tIEZvcm0gRmllbGRzIC0tPlxuICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InXCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00IGNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0b1wiPlxuICAgIDwhLS0gRHJvcGRvd24gRmllbGRzIFJvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC00IGNxYS1mbGV4LXdyYXBcIj5cbiAgICAgIDwhLS0gU2VsZWN0IE9wdGlvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMVwiIHN0eWxlPVwibWluLXdpZHRoOiBjYWxjKDI1JSAtIDEycHgpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEuNVwiPlxuICAgICAgICAgIFNlbGVjdCBPcHRpb25cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cInNlbGVjdE9wdGlvbkNvbmZpZ1wiPlxuICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9vcEZvcm0uZ2V0KCdzZWxlY3RPcHRpb24nKT8udmFsdWUgPT09ICdkYXRhUHJvZmlsZSdcIj5cbiAgICAgIDwhLS0gRGF0YSBQcm9maWxlIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgRGF0YSBQcm9maWxlXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICBbZm9ybV09XCJsb29wRm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJkYXRhUHJvZmlsZUNvbmZpZ1wiXG4gICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlYXJjaERhdGFQcm9maWxlcygkZXZlbnQucXVlcnkpXCJcbiAgICAgICAgICAobG9hZE1vcmUpPVwib25Mb2FkTW9yZURhdGFQcm9maWxlcygkZXZlbnQpXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTG9vcCBTdGFydCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMVwiIHN0eWxlPVwibWluLXdpZHRoOiBjYWxjKDI1JSAtIDEycHgpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEuNVwiPlxuICAgICAgICAgIExvb3AgU3RhcnRcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImxvb3BTdGFydENvbmZpZ1wiPlxuICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIExvb3AgRW5kIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgTG9vcCBFbmRcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImxvb3BFbmRDb25maWdcIj5cbiAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvb3BGb3JtLmdldCgnc2VsZWN0T3B0aW9uJyk/LnZhbHVlID09PSAncnVuVGltZSdcIj5cbiAgICAgICAgPCEtLSBSdW4gVGltZSBJbnB1dCBGaWVsZCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xLjVcIj5cbiAgICAgICAgICAgIFJ1biBUaW1lXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidFbnRlciBSdW4gVGltZSdcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImxvb3BGb3JtLmdldCgncnVuVGltZScpPy52YWx1ZVwiXG4gICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImxvb3BGb3JtLmdldCgncnVuVGltZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJ1wiPlxuICAgIDxjcWEtc3RlcC1idWlsZGVyLWFjdGlvbiBbc2hvd0hlYWRlcl09XCJmYWxzZVwiIFt0ZW1wbGF0ZXNdPVwid2hpbGVUZW1wbGF0ZXNcIiBbc2V0VGVtcGxhdGVWYXJpYWJsZXNdPVwic2V0V2hpbGVUZW1wbGF0ZVZhcmlhYmxlc1wiIFtzZWFyY2hQbGFjZWhvbGRlcl09XCJ3aGlsZVNlYXJjaFBsYWNlaG9sZGVyXCIgKHRlbXBsYXRlQ2hhbmdlZCk9XCJzZWxlY3RXaGlsZVRlbXBsYXRlKCRldmVudClcIiAoY3JlYXRlU3RlcCk9XCJjcmVhdGVXaGlsZVN0ZXAoJGV2ZW50KVwiPjwvY3FhLXN0ZXAtYnVpbGRlci1hY3Rpb24+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gIDxkaXYgKm5nSWY9XCJzZWxlY3RlZExvb3BUeXBlID09PSAnZm9yJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLXctZnVsbCBjcWEtZ2FwLTIgY3FhLW10LTYgY3FhLXB0LTQgY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZ3JheS0yMDBcIj5cbiAgICA8Y3FhLWJ1dHRvblxuICAgICAgY2xhc3M9XCJjcWEtdy0xLzJcIlxuICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgIHRleHQ9XCJDYW5jZWxcIlxuICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIj5cbiAgICA8L2NxYS1idXR0b24+XG4gICAgPGNxYS1idXR0b25cbiAgICAgIGNsYXNzPVwiY3FhLXctMS8yXCJcbiAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgdGV4dD1cIkNyZWF0ZSBTdGVwXCJcbiAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICAoY2xpY2tlZCk9XCJvbkNyZWF0ZVN0ZXAoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuIl19
416
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7QUFxQ3hELE1BQU0sT0FBTyx3QkFBd0I7SUF3RG5DO1FBdkRBLG1DQUFtQztRQUMxQixhQUFRLEdBQWEsS0FBSyxDQUFDO1FBRXBDLDZDQUE2QztRQUNwQyxrQkFBYSxHQUFVO1lBQzlCLEVBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFDO1lBQzdDLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFDO1NBQ3RDLENBQUM7UUFFRixnRkFBZ0Y7UUFDdkUsdUJBQWtCLEdBQXdCLEVBQUUsQ0FBQztRQUV0RCxnRUFBZ0U7UUFDdkQsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBRTlDLHNDQUFzQztRQUM3QiwwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFDaEQsbUdBQW1HO1FBQzFGLDhCQUF5QixHQUF1QyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQSxDQUFBLENBQUMsQ0FBQztRQUU1RixnQ0FBZ0M7UUFDdEIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFnQixDQUFDO1FBRXhELDBCQUEwQjtRQUNoQixj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QUNoQyxDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBYTtRQUNoQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyTSxDQUFDO0lBRUQsbUJBQW1CLENBQUMsUUFBYTtRQUMvQixJQUFJLENBQUMscUJBQXFCLEdBQUcsUUFBUSxDQUFDO0lBQ3hDLENBQUM7O3FIQTNhVSx3QkFBd0I7eUdBQXhCLHdCQUF3Qiw4cUJDdENyQyx1dElBK0dBOzJGRHpFYSx3QkFBd0I7a0JBTnBDLFNBQVM7K0JBQ0UsdUJBQXVCLFFBRzNCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRTswRUFJckIsUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQU1HLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFHRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBR0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUVHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFHSSxVQUFVO3NCQUFuQixNQUFNO2dCQUdHLFNBQVM7c0JBQWxCLE1BQU07Z0JBR0csY0FBYztzQkFBdkIsTUFBTTtnQkFHRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBR0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNFLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEFjdGlvblRlbXBsYXRlIH0gZnJvbSAnLi4vc3RlcC1idWlsZGVyLWFjdGlvbi9zdGVwLWJ1aWxkZXItYWN0aW9uLmNvbXBvbmVudCc7XG5cbmV4cG9ydCB0eXBlIExvb3BUeXBlID0gJ2ZvcicgfCAnd2hpbGUnO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgZGF0YSBwcm9maWxlIG9wdGlvblxuICogQmFzZWQgb24gVGVzdERhdGEgbW9kZWwgc3RydWN0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVByb2ZpbGVPcHRpb24ge1xuICBpZDogbnVtYmVyIHwgc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBBcnJheSBvZiBkYXRhIHNldHMgLSBsZW5ndGggZGV0ZXJtaW5lcyBhdmFpbGFibGUgbG9vcCBpbmRpY2VzICovXG4gIGRhdGE/OiBhbnlbXTtcbiAgLyoqIE9wdGlvbmFsOiBkaXJlY3QgZGF0YSBsZW5ndGggaWYgZGF0YSBhcnJheSBpcyBub3QgcHJvdmlkZWQgKi9cbiAgZGF0YUxlbmd0aD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb29wRm9ybURhdGEge1xuICBzZWxlY3RlZExvb3BUeXBlOiBMb29wVHlwZTtcbiAgbG9vcFR5cGU6IExvb3BUeXBlO1xuICBzZWxlY3RPcHRpb24/OiBzdHJpbmc7XG4gIGRhdGFQcm9maWxlPzogc3RyaW5nIHwgbnVtYmVyO1xuICBsb29wU3RhcnQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gIGxvb3BFbmQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gIHJ1blRpbWU/OiBzdHJpbmc7XG4gIHdoaWxlVGVtcGxhdGU/OiBhbnk7XG4gIGV2ZW50PzogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1idWlsZGVyLWxvb3AnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH1cbn0pXG5leHBvcnQgY2xhc3MgU3RlcEJ1aWxkZXJMb29wQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKiogQ3VycmVudGx5IHNlbGVjdGVkIGxvb3AgdHlwZSAqL1xuICBASW5wdXQoKSBsb29wVHlwZTogTG9vcFR5cGUgPSAnZm9yJztcblxuICAvKiogT3B0aW9ucyBmb3IgdGhlIHNlbGVjdCBvcHRpb24gZHJvcGRvd24gKi9cbiAgQElucHV0KCkgc2VsZWN0T3B0aW9uczogYW55W10gPSBbXG4gICAge3ZhbHVlOiAnZGF0YVByb2ZpbGUnLCBsYWJlbDogJ0RhdGEgUHJvZmlsZSd9LFxuICAgIHt2YWx1ZTogJ3J1blRpbWUnLCBsYWJlbDogJ1J1biBUaW1lJ31cbiAgXTtcblxuICAvKiogT3B0aW9ucyBmb3IgdGhlIGRhdGEgcHJvZmlsZSBkcm9wZG93biAtIGFjY2VwdHMgRGF0YVByb2ZpbGVPcHRpb24gb2JqZWN0cyAqL1xuICBASW5wdXQoKSBkYXRhUHJvZmlsZU9wdGlvbnM6IERhdGFQcm9maWxlT3B0aW9uW10gPSBbXTtcblxuICAvKiogSW5kaWNhdGVzIGlmIG1vcmUgZGF0YSBwcm9maWxlcyBhcmUgYXZhaWxhYmxlIGZvciBsb2FkaW5nICovXG4gIEBJbnB1dCgpIGhhc01vcmVEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogTG9hZGluZyBzdGF0ZSBmb3IgZGF0YSBwcm9maWxlcyAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEZ1bmN0aW9uIHRvIGhhbmRsZSB2YXJpYWJsZSBwcm9jZXNzaW5nIG9yIGN1c3RvbSBsb2dpYy4gQ2FuIGJlIHBhc3NlZCBmcm9tIHBhcmVudCBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIHNldFdoaWxlVGVtcGxhdGVWYXJpYWJsZXM6ICh2YXJpYWJsZXM6IEFjdGlvblRlbXBsYXRlKSA9PiBhbnkgPSAoKSA9PiB7IHJldHVybiBbXX07XG5cbiAgLyoqIEVtaXQgd2hlbiBzdGVwIGlzIGNyZWF0ZWQgKi9cbiAgQE91dHB1dCgpIGNyZWF0ZVN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPExvb3BGb3JtRGF0YT4oKTtcblxuICAvKiogRW1pdCB3aGVuIGNhbmNlbGxlZCAqL1xuICBAT3V0cHV0KCkgY2FuY2VsbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gbG9vcCB0eXBlIGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIGxvb3BUeXBlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxMb29wVHlwZT4oKTtcblxuICAvKiogRW1pdCB3aGVuIG1vcmUgZGF0YSBwcm9maWxlcyBuZWVkIHRvIGJlIGxvYWRlZCAqL1xuICBAT3V0cHV0KCkgbG9hZE1vcmVEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKiogRW1pdCB3aGVuIGRhdGEgcHJvZmlsZSBzZWFyY2ggcXVlcnkgY2hhbmdlcyAqL1xuICBAT3V0cHV0KCkgc2VhcmNoRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBJbnB1dCgpIHdoaWxlVGVtcGxhdGVzOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSB3aGlsZVNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoIFdoaWxlJztcbiAgQElucHV0KCkgd2hpbGVTZWFyY2hWYWx1ZTogc3RyaW5nID0gJyc7XG4gIHNlbGVjdGVkV2hpbGVUZW1wbGF0ZTogYW55ID0gbnVsbDtcbiAgc2VsZWN0ZWRMb29wVHlwZTogTG9vcFR5cGUgPSAnZm9yJztcbiAgXG4gIC8vIFNpbmdsZSBGb3JtR3JvdXAgY29udGFpbmluZyBhbGwgZm91ciBmaWVsZHNcbiAgbG9vcEZvcm06IEZvcm1Hcm91cDtcblxuICAvLyBDb25maWdzIGZvciBkeW5hbWljLXNlbGVjdCBjb21wb25lbnRzXG4gIHNlbGVjdE9wdGlvbkNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBkYXRhUHJvZmlsZUNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBsb29wU3RhcnRDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgbG9vcEVuZENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuXG5cbiAgLy8gSW50ZXJuYWwgc3RhdGUgZm9yIG1hbmFnaW5nIGxvb3AgaW5kaWNlc1xuICBwcml2YXRlIHNlbGVjdGVkRGF0YVByb2ZpbGU6IERhdGFQcm9maWxlT3B0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhcnRBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgcHJpdmF0ZSBlbmRBcnJheTogbnVtYmVyW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBJbml0aWFsaXplIHNpbmdsZSBGb3JtR3JvdXAgd2l0aCBhbGwgZmllbGRzXG4gICAgdGhpcy5sb29wRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgc2VsZWN0T3B0aW9uOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICBkYXRhUHJvZmlsZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxuICAgICAgbG9vcFN0YXJ0OiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICBsb29wRW5kOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICBydW5UaW1lOiBuZXcgRm9ybUNvbnRyb2wobnVsbClcbiAgICB9KTtcblxuICAgIC8vIEluaXRpYWxpemUgY29uZmlnc1xuICAgIHRoaXMuc2VsZWN0T3B0aW9uQ29uZmlnID0ge1xuICAgICAga2V5OiAnc2VsZWN0T3B0aW9uJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnc2VsZWN0IG9wdGlvbicsXG4gICAgICBzZWxlY3RlZFZhbHVlOiAnZGF0YVByb2ZpbGUnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiB0aGlzLnNlbGVjdE9wdGlvbnNcbiAgICB9O1xuICAgIHRoaXMuZGF0YVByb2ZpbGVDb25maWcgPSB7XG4gICAgICBrZXk6ICdkYXRhUHJvZmlsZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ2RhdGEgcHJvZmlsZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlRGF0YVByb2ZpbGVzLFxuICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ0RhdGFQcm9maWxlcyxcbiAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25EYXRhUHJvZmlsZUNoYW5nZSh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMub25TZWFyY2hEYXRhUHJvZmlsZXMocXVlcnkpO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6IChxdWVyeT86IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQocXVlcnkgfHwgJycpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5sb29wU3RhcnRDb25maWcgPSB7XG4gICAgICBrZXk6ICdsb29wU3RhcnQnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdsb29wIHN0YXJ0JyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogW10sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkxvb3BTdGFydENoYW5nZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmxvb3BFbmRDb25maWcgPSB7XG4gICAgICBrZXk6ICdsb29wRW5kJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnbG9vcCBlbmQnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBbXSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlIGlmIG5lZWRlZFxuICAgICAgfVxuICAgIH07ICBcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9IHRoaXMubG9vcFR5cGU7XG4gICAgdGhpcy51cGRhdGVDb25maWdzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coXCJ0aGlzLndoaWxlVGVtcGxhdGVzXCIsdGhpcy53aGlsZVRlbXBsYXRlcyk7XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdE9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVDb25maWdzKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydkYXRhUHJvZmlsZU9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVDb25maWdzKCk7XG4gICAgICAvLyBJZiBhIGRhdGEgcHJvZmlsZSBpcyBhbHJlYWR5IHNlbGVjdGVkLCB1cGRhdGUgbG9vcCBpbmRpY2VzXG4gICAgICBjb25zdCBjdXJyZW50UHJvZmlsZUlkID0gdGhpcy5sb29wRm9ybS5nZXQoJ2RhdGFQcm9maWxlJyk/LnZhbHVlO1xuICAgICAgaWYgKGN1cnJlbnRQcm9maWxlSWQpIHtcbiAgICAgICAgdGhpcy5vbkRhdGFQcm9maWxlQ2hhbmdlKGN1cnJlbnRQcm9maWxlSWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaGFzTW9yZURhdGFQcm9maWxlcyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ0RhdGFQcm9maWxlcyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZURhdGFQcm9maWxlQ29uZmlnKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydsb29wVHlwZSddKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPSB0aGlzLmxvb3BUeXBlO1xuICAgIH1cbiAgICAvLyBOb3RlOiBsb29wU3RhcnRPcHRpb25zIGFuZCBsb29wRW5kT3B0aW9ucyBhcmUgbm93IGNhbGN1bGF0ZWQgZHluYW1pY2FsbHlcbiAgICAvLyBzbyB0aGV5IGRvbid0IG5lZWQgdG8gYmUgdXBkYXRlZCBmcm9tIGlucHV0c1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb25maWdzKCk6IHZvaWQge1xuICAgIC8vIENvbnZlcnQgRGF0YVByb2ZpbGVPcHRpb25bXSB0byBTZWxlY3RPcHRpb25bXVxuICAgIHRoaXMuZGF0YVByb2ZpbGVDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmRhdGFQcm9maWxlQ29uZmlnLFxuICAgICAgb3B0aW9uczogdGhpcy5jb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zKSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZURhdGFQcm9maWxlcyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdEYXRhUHJvZmlsZXMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRhdGFQcm9maWxlQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSB8fCAnJyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICAvLyBMb29wIHN0YXJ0IGFuZCBlbmQgb3B0aW9ucyBhcmUgdXBkYXRlZCB3aGVuIGRhdGEgcHJvZmlsZSBpcyBzZWxlY3RlZFxuICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKG9wdGlvbnM6IERhdGFQcm9maWxlT3B0aW9uW10pOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgaWQ6IG9wdGlvbi5pZCxcbiAgICAgIHZhbHVlOiBvcHRpb24uaWQsXG4gICAgICBuYW1lOiBvcHRpb24ubmFtZSxcbiAgICAgIGxhYmVsOiBvcHRpb24ubmFtZVxuICAgIH0pKTtcbiAgfVxuICAvKipcbiAgICogSGFuZGxlIGRhdGEgcHJvZmlsZSBzZWxlY3Rpb24gYW5kIHVwZGF0ZSBsb29wIHN0YXJ0L2VuZCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIG9uRGF0YVByb2ZpbGVDaGFuZ2UocHJvZmlsZUlkOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5maW5kKHByb2ZpbGUgPT4gXG4gICAgICBwcm9maWxlLmlkID09PSBwcm9maWxlSWQgfHwgU3RyaW5nKHByb2ZpbGUuaWQpID09PSBTdHJpbmcocHJvZmlsZUlkKVxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWRQcm9maWxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVByb2ZpbGUgPSBzZWxlY3RlZFByb2ZpbGU7XG4gICAgICB0aGlzLnVwZGF0ZUxvb3BJbmRpY2VzRnJvbVByb2ZpbGUoc2VsZWN0ZWRQcm9maWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGFQcm9maWxlID0gbnVsbDtcbiAgICAgIHRoaXMuc3RhcnRBcnJheSA9IFtdO1xuICAgICAgdGhpcy5lbmRBcnJheSA9IFtdO1xuICAgICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBsb29wIGluZGljZXMgYmFzZWQgb24gc2VsZWN0ZWQgZGF0YSBwcm9maWxlXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUxvb3BJbmRpY2VzRnJvbVByb2ZpbGUocHJvZmlsZTogRGF0YVByb2ZpbGVPcHRpb24pOiB2b2lkIHtcbiAgICAvLyBDYWxjdWxhdGUgZGF0YSBsZW5ndGggZnJvbSBkYXRhIGFycmF5IG9yIHVzZSBwcm92aWRlZCBkYXRhTGVuZ3RoXG4gICAgbGV0IGRhdGFTZXRMZW5ndGggPSAxO1xuICAgIGlmIChwcm9maWxlLmRhdGEgJiYgQXJyYXkuaXNBcnJheShwcm9maWxlLmRhdGEpKSB7XG4gICAgICBkYXRhU2V0TGVuZ3RoID0gcHJvZmlsZS5kYXRhLmxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKHByb2ZpbGUuZGF0YUxlbmd0aCAmJiBwcm9maWxlLmRhdGFMZW5ndGggPiAwKSB7XG4gICAgICBkYXRhU2V0TGVuZ3RoID0gcHJvZmlsZS5kYXRhTGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBzdGFydCBhcnJheSBmcm9tIDEgdG8gZGF0YVNldExlbmd0aFxuICAgIHRoaXMuc3RhcnRBcnJheSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGRhdGFTZXRMZW5ndGggfSwgKF8sIGkpID0+IGkgKyAxKTtcbiAgICAvLyBJbml0aWFsaXplIGVuZCBhcnJheSBzYW1lIGFzIHN0YXJ0IGFycmF5XG4gICAgLy8gRW5kIGFycmF5IHdpbGwgYmUgdXBkYXRlZCB3aGVuIHN0YXJ0IGluZGV4IGlzIHNlbGVjdGVkXG4gICAgdGhpcy5lbmRBcnJheSA9IFsuLi50aGlzLnN0YXJ0QXJyYXldO1xuXG4gICAgLy8gU2V0IGRlZmF1bHQgdmFsdWVzIGlmIGZvcm0gaXMgZW1wdHlcbiAgICBjb25zdCBjdXJyZW50U3RhcnQgPSB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcFN0YXJ0Jyk/LnZhbHVlO1xuICAgIGNvbnN0IGN1cnJlbnRFbmQgPSB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy52YWx1ZTtcbiAgICBcbiAgICBpZiAoIWN1cnJlbnRTdGFydCAmJiB0aGlzLnN0YXJ0QXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BTdGFydCcpPy5zZXRWYWx1ZSh0aGlzLnN0YXJ0QXJyYXlbMF0pO1xuICAgIH1cbiAgICBpZiAoIWN1cnJlbnRFbmQgJiYgdGhpcy5lbmRBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy5zZXRWYWx1ZSh0aGlzLmVuZEFycmF5W3RoaXMuZW5kQXJyYXkubGVuZ3RoIC0gMV0pO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBsb29wIHN0YXJ0IGNoYW5nZSBhbmQgdXBkYXRlIGVuZCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIG9uTG9vcFN0YXJ0Q2hhbmdlKHN0YXJ0SW5kZXg6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZERhdGFQcm9maWxlIHx8ICFzdGFydEluZGV4KSB7XG4gICAgICB0aGlzLmVuZEFycmF5ID0gWy4uLnRoaXMuc3RhcnRBcnJheV07XG4gICAgICB0aGlzLnVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydElkeCA9IHR5cGVvZiBzdGFydEluZGV4ID09PSAnc3RyaW5nJyA/IHBhcnNlSW50KHN0YXJ0SW5kZXgpIDogc3RhcnRJbmRleDtcbiAgICBcbiAgICBpZiAoaXNOYU4oc3RhcnRJZHgpIHx8IHN0YXJ0SWR4IDwgMSkge1xuICAgICAgdGhpcy5lbmRBcnJheSA9IFsuLi50aGlzLnN0YXJ0QXJyYXldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFbmQgYXJyYXkgc2hvdWxkIGJlIGZyb20gc3RhcnRJbmRleCB0byBlbmQgb2YgZGF0YVxuICAgICAgLy8gQmFzZWQgb24gcmVmZXJlbmNlOiBlbmRBcnJheSA9IHN0YXJ0QXJyYXkuc3BsaWNlKHN0YXJ0SW5kZXggLSAxLCBzdGFydEFycmF5Lmxlbmd0aClcbiAgICAgIGNvbnN0IHN0YXJ0QXJyYXlDb3B5ID0gWy4uLnRoaXMuc3RhcnRBcnJheV07XG4gICAgICB0aGlzLmVuZEFycmF5ID0gc3RhcnRBcnJheUNvcHkuc2xpY2Uoc3RhcnRJZHggLSAxKTtcbiAgICB9XG5cbiAgICAvLyBBdXRvLXVwZGF0ZSBlbmQgaW5kZXggaWYgY3VycmVudCBlbmQgaXMgaW52YWxpZFxuICAgIGNvbnN0IGN1cnJlbnRFbmQgPSB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy52YWx1ZTtcbiAgICBjb25zdCBlbmRJZHggPSB0eXBlb2YgY3VycmVudEVuZCA9PT0gJ3N0cmluZycgPyBwYXJzZUludChjdXJyZW50RW5kKSA6IGN1cnJlbnRFbmQ7XG4gICAgXG4gICAgaWYgKCFjdXJyZW50RW5kIHx8IGlzTmFOKGVuZElkeCkgfHwgZW5kSWR4IDwgc3RhcnRJZHgpIHtcbiAgICAgIGlmICh0aGlzLmVuZEFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8uc2V0VmFsdWUodGhpcy5lbmRBcnJheVt0aGlzLmVuZEFycmF5Lmxlbmd0aCAtIDFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbG9vcCBzdGFydCBhbmQgZW5kIGNvbmZpZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTogdm9pZCB7XG4gICAgLy8gQ29udmVydCBzdGFydEFycmF5IHRvIFNlbGVjdE9wdGlvbnNcbiAgICBjb25zdCBzdGFydE9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gdGhpcy5zdGFydEFycmF5Lm1hcChpZHggPT4gKHtcbiAgICAgIGlkOiBpZHgsXG4gICAgICB2YWx1ZTogaWR4LFxuICAgICAgbmFtZTogU3RyaW5nKGlkeCksXG4gICAgICBsYWJlbDogU3RyaW5nKGlkeClcbiAgICB9KSk7XG5cbiAgICAvLyBDb252ZXJ0IGVuZEFycmF5IHRvIFNlbGVjdE9wdGlvbnNcbiAgICBjb25zdCBlbmRPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IHRoaXMuZW5kQXJyYXkubWFwKGlkeCA9PiAoe1xuICAgICAgaWQ6IGlkeCxcbiAgICAgIHZhbHVlOiBpZHgsXG4gICAgICBuYW1lOiBTdHJpbmcoaWR4KSxcbiAgICAgIGxhYmVsOiBTdHJpbmcoaWR4KVxuICAgIH0pKTtcblxuICAgIHRoaXMubG9vcFN0YXJ0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5sb29wU3RhcnRDb25maWcsXG4gICAgICBvcHRpb25zOiBbe2lkOiAtMSwgdmFsdWU6IC0xLCBuYW1lOiAnU3RhcnQnLCBsYWJlbDogJ1N0YXJ0J30sIC4uLnN0YXJ0T3B0aW9uc10sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkxvb3BTdGFydENoYW5nZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMubG9vcEVuZENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMubG9vcEVuZENvbmZpZyxcbiAgICAgIG9wdGlvbnM6IFsuLi5lbmRPcHRpb25zLHtpZDogLTEsIHZhbHVlOiAtMSwgbmFtZTogJ0VuZCcsIGxhYmVsOiAnRW5kJ31dLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2UgaWYgbmVlZGVkXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIG9uTG9vcFR5cGVDaGFuZ2UodHlwZTogc3RyaW5nIHwgTG9vcFR5cGUpOiB2b2lkIHtcbiAgICBjb25zdCBsb29wVHlwZSA9IHR5cGUgYXMgTG9vcFR5cGU7XG4gICAgdGhpcy5zZWxlY3RlZExvb3BUeXBlID0gbG9vcFR5cGU7XG4gICAgdGhpcy5sb29wVHlwZUNoYW5nZS5lbWl0KGxvb3BUeXBlKTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG5cbiAgaXNGb3JtVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgcmV0dXJuICEhdGhpcy5zZWxlY3RlZFdoaWxlVGVtcGxhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciAnZm9yJyBsb29wIHR5cGVcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMubG9vcEZvcm0udmFsdWU7XG4gICAgICBjb25zdCBzZWxlY3RPcHRpb24gPSBmb3JtVmFsdWUuc2VsZWN0T3B0aW9uO1xuICAgICAgXG4gICAgICBpZiAoIXNlbGVjdE9wdGlvbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChzZWxlY3RPcHRpb24gPT09ICdkYXRhUHJvZmlsZScpIHtcbiAgICAgICAgLy8gRm9yIGRhdGEgcHJvZmlsZSwgbmVlZCBkYXRhUHJvZmlsZSwgbG9vcFN0YXJ0LCBhbmQgbG9vcEVuZFxuICAgICAgICByZXR1cm4gISEoZm9ybVZhbHVlLmRhdGFQcm9maWxlICYmIGZvcm1WYWx1ZS5sb29wU3RhcnQgJiYgZm9ybVZhbHVlLmxvb3BFbmQpO1xuICAgICAgfSBlbHNlIGlmIChzZWxlY3RPcHRpb24gPT09ICdydW5UaW1lJykge1xuICAgICAgICAvLyBGb3IgcnVuIHRpbWUsIG5lZWQgcnVuVGltZSB2YWx1ZVxuICAgICAgICByZXR1cm4gISEoZm9ybVZhbHVlLnJ1blRpbWUgJiYgZm9ybVZhbHVlLnJ1blRpbWUudHJpbSgpICE9PSAnJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBvbkNyZWF0ZVN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5sb29wRm9ybS52YWx1ZTtcbiAgICBpZih0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIGlmKCF0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHN0ZXBEYXRhOiBMb29wRm9ybURhdGEgPSB7XG4gICAgICBzZWxlY3RlZExvb3BUeXBlOiB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgYXMgTG9vcFR5cGUsXG4gICAgICBsb29wVHlwZTogdGhpcy5zZWxlY3RlZExvb3BUeXBlLFxuICAgICAgc2VsZWN0T3B0aW9uOiBmb3JtVmFsdWUuc2VsZWN0T3B0aW9uIHx8IHVuZGVmaW5lZCxcbiAgICAgIGRhdGFQcm9maWxlOiBmb3JtVmFsdWUuZGF0YVByb2ZpbGUgfHwgdW5kZWZpbmVkLFxuICAgICAgbG9vcFN0YXJ0OiBmb3JtVmFsdWUubG9vcFN0YXJ0IHx8IHVuZGVmaW5lZCxcbiAgICAgIGxvb3BFbmQ6IGZvcm1WYWx1ZS5sb29wRW5kIHx8IHVuZGVmaW5lZCxcbiAgICAgIHJ1blRpbWU6IGZvcm1WYWx1ZS5ydW5UaW1lIHx8IHVuZGVmaW5lZCxcbiAgICAgIHdoaWxlVGVtcGxhdGU6IHRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlIHx8IHVuZGVmaW5lZFxuICAgIH07XG4gICAgY29uc29sZS5sb2coJ3N0ZXBEYXRhJywgc3RlcERhdGEpO1xuICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgfVxuXG4gIGNyZWF0ZVdoaWxlU3RlcChldmVudDogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ2NyZWF0ZVdoaWxlU3RlcCcsIGV2ZW50KTtcbiAgICBjb25zdCBzdGVwRGF0YTogTG9vcEZvcm1EYXRhID0ge1xuICAgICAgc2VsZWN0ZWRMb29wVHlwZTogdGhpcy5zZWxlY3RlZExvb3BUeXBlIGFzIExvb3BUeXBlLFxuICAgICAgbG9vcFR5cGU6IHRoaXMuc2VsZWN0ZWRMb29wVHlwZSBhcyBMb29wVHlwZSxcbiAgICAgIGV2ZW50OiBldmVudFxuICAgIH07XG4gICAgY29uc29sZS5sb2coJ3N0ZXBEYXRhJywgc3RlcERhdGEpO1xuICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VhcmNoIGV2ZW50IGZvciBkYXRhIHByb2ZpbGVzXG4gICAqL1xuICBvblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGxvYWRNb3JlIGV2ZW50IGZvciBkYXRhIHByb2ZpbGVzXG4gICAqL1xuICBvbkxvYWRNb3JlRGF0YVByb2ZpbGVzKGV2ZW50OiB7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoZXZlbnQucXVlcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBkYXRhIHByb2ZpbGUgY29uZmlnIHdoZW4gbG9hZGluZyBzdGF0ZSBvciBoYXNNb3JlIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlRGF0YVByb2ZpbGVDb25maWcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YVByb2ZpbGVDb25maWcpIHtcbiAgICAgIHRoaXMuZGF0YVByb2ZpbGVDb25maWcgPSB7XG4gICAgICAgIC4uLnRoaXMuZGF0YVByb2ZpbGVDb25maWcsXG4gICAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZURhdGFQcm9maWxlcyxcbiAgICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ0RhdGFQcm9maWxlc1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPSAnZm9yJztcbiAgICB0aGlzLnNlbGVjdGVkRGF0YVByb2ZpbGUgPSBudWxsO1xuICAgIHRoaXMuc3RhcnRBcnJheSA9IFtdO1xuICAgIHRoaXMuZW5kQXJyYXkgPSBbXTtcbiAgICB0aGlzLmxvb3BGb3JtLnJlc2V0KHtcbiAgICAgIHNlbGVjdE9wdGlvbjogbnVsbCxcbiAgICAgIGRhdGFQcm9maWxlOiBudWxsLFxuICAgICAgbG9vcFN0YXJ0OiBudWxsLFxuICAgICAgbG9vcEVuZDogbnVsbFxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICB9XG5cbiAgb25XaGlsZVNlYXJjaENoYW5nZShldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy53aGlsZVNlYXJjaFZhbHVlID0gZXZlbnQ7XG4gICAgdGhpcy5maWx0ZXJXaGlsZVRlbXBsYXRlcyhldmVudCk7XG4gIH1cblxuICBvbldoaWxlU2VhcmNoU3VibWl0KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uV2hpbGVTZWFyY2hDaGFuZ2UoZXZlbnQpO1xuICB9XG5cbiAgb25XaGlsZVNlYXJjaENsZWFyZWQoKTogdm9pZCB7XG4gICAgdGhpcy53aGlsZVNlYXJjaFZhbHVlID0gJyc7XG4gICAgdGhpcy5maWx0ZXJXaGlsZVRlbXBsYXRlcygnJyk7XG4gIH1cblxuICBmaWx0ZXJXaGlsZVRlbXBsYXRlcyhxdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53aGlsZVRlbXBsYXRlcyA9IHRoaXMud2hpbGVUZW1wbGF0ZXMuZmlsdGVyKHRlbXBsYXRlID0+IHRlbXBsYXRlLmh0bWxHcmFtbWFyLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkudG9Mb3dlckNhc2UoKSkgfHwgdGVtcGxhdGUubmF0dXJhbFRleHQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKSk7XG4gIH1cblxuICBzZWxlY3RXaGlsZVRlbXBsYXRlKHRlbXBsYXRlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWgtZnVsbCBjcWEtYmctd2hpdGUgY3FhLXB4LTQgY3FhLXB5LTJcIj5cbiAgPCEtLSBIZWFkZXIgLS0+XG4gIDxoMiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1ibGFjay0xMDAgY3FhLW1iLTRcIj5cbiAgICBDcmVhdGUgTG9vcCBUZXN0IFN0ZXBcbiAgPC9oMj5cblxuICA8IS0tIExvb3AgVHlwZSBTZWxlY3Rpb24gLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtbWItNFwiPlxuICAgIDxjcWEtc2VnbWVudC1jb250cm9sXG4gICAgICBbc2VnbWVudHNdPVwiW1xuICAgICAgICB7IGxhYmVsOiAnRm9yJywgdmFsdWU6ICdmb3InIH0sXG4gICAgICAgIHsgbGFiZWw6ICdXaGlsZScsIHZhbHVlOiAnd2hpbGUnIH1cbiAgICAgIF1cIlxuICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkTG9vcFR5cGVcIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uTG9vcFR5cGVDaGFuZ2UoJGV2ZW50KVwiPlxuICAgIDwvY3FhLXNlZ21lbnQtY29udHJvbD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBGb3JtIEZpZWxkcyAtLT5cbiAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZExvb3BUeXBlID09PSAnZm9yJ1wiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNCBjcWEtZmxleC0xIGNxYS1vdmVyZmxvdy15LWF1dG9cIj5cbiAgICA8IS0tIERyb3Bkb3duIEZpZWxkcyBSb3cgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAtNCBjcWEtZmxleC13cmFwXCI+XG4gICAgICA8IS0tIFNlbGVjdCBPcHRpb24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1mbGV4LTFcIiBzdHlsZT1cIm1pbi13aWR0aDogY2FsYygyNSUgLSAxMnB4KTtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xLjVcIj5cbiAgICAgICAgICBTZWxlY3QgT3B0aW9uXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICBbZm9ybV09XCJsb29wRm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJzZWxlY3RPcHRpb25Db25maWdcIj5cbiAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvb3BGb3JtLmdldCgnc2VsZWN0T3B0aW9uJyk/LnZhbHVlID09PSAnZGF0YVByb2ZpbGUnXCI+XG4gICAgICA8IS0tIERhdGEgUHJvZmlsZSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMVwiIHN0eWxlPVwibWluLXdpZHRoOiBjYWxjKDI1JSAtIDEycHgpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEuNVwiPlxuICAgICAgICAgIERhdGEgUHJvZmlsZVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgW2Zvcm1dPVwibG9vcEZvcm1cIlxuICAgICAgICAgIFtjb25maWddPVwiZGF0YVByb2ZpbGVDb25maWdcIlxuICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWFyY2hEYXRhUHJvZmlsZXMoJGV2ZW50LnF1ZXJ5KVwiXG4gICAgICAgICAgKGxvYWRNb3JlKT1cIm9uTG9hZE1vcmVEYXRhUHJvZmlsZXMoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIExvb3AgU3RhcnQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1mbGV4LTFcIiBzdHlsZT1cIm1pbi13aWR0aDogY2FsYygyNSUgLSAxMnB4KTtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xLjVcIj5cbiAgICAgICAgICBMb29wIFN0YXJ0XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICBbZm9ybV09XCJsb29wRm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJsb29wU3RhcnRDb25maWdcIj5cbiAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBMb29wIEVuZCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMVwiIHN0eWxlPVwibWluLXdpZHRoOiBjYWxjKDI1JSAtIDEycHgpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEuNVwiPlxuICAgICAgICAgIExvb3AgRW5kXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICBbZm9ybV09XCJsb29wRm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJsb29wRW5kQ29uZmlnXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb29wRm9ybS5nZXQoJ3NlbGVjdE9wdGlvbicpPy52YWx1ZSA9PT0gJ3J1blRpbWUnXCI+XG4gICAgICAgIDwhLS0gUnVuIFRpbWUgSW5wdXQgRmllbGQgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMVwiIHN0eWxlPVwibWluLXdpZHRoOiBjYWxjKDI1JSAtIDEycHgpO1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgICBSdW4gVGltZVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInRW50ZXIgUnVuIFRpbWUnXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJsb29wRm9ybS5nZXQoJ3J1blRpbWUnKT8udmFsdWVcIlxuICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJsb29wRm9ybS5nZXQoJ3J1blRpbWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICd3aGlsZSdcIj5cbiAgICA8Y3FhLXN0ZXAtYnVpbGRlci1hY3Rpb24gW3Nob3dIZWFkZXJdPVwiZmFsc2VcIiBbdGVtcGxhdGVzXT1cIndoaWxlVGVtcGxhdGVzXCIgW3NldFRlbXBsYXRlVmFyaWFibGVzXT1cInNldFdoaWxlVGVtcGxhdGVWYXJpYWJsZXNcIiBbc2VhcmNoUGxhY2Vob2xkZXJdPVwid2hpbGVTZWFyY2hQbGFjZWhvbGRlclwiICh0ZW1wbGF0ZUNoYW5nZWQpPVwic2VsZWN0V2hpbGVUZW1wbGF0ZSgkZXZlbnQpXCIgKGNyZWF0ZVN0ZXApPVwiY3JlYXRlV2hpbGVTdGVwKCRldmVudClcIj48L2NxYS1zdGVwLWJ1aWxkZXItYWN0aW9uPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIEFjdGlvbiBCdXR0b25zIC0tPlxuICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ2ZvcidcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWdhcC0yIGNxYS1tdC02IGNxYS1wdC00IGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgPGNxYS1idXR0b25cbiAgICAgIGNsYXNzPVwiY3FhLXctMS8yXCJcbiAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICB0ZXh0PVwiQ2FuY2VsXCJcbiAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICBjbGFzcz1cImNxYS13LTEvMlwiXG4gICAgICB2YXJpYW50PVwiZmlsbGVkXCJcbiAgICAgIHRleHQ9XCJDcmVhdGUgU3RlcFwiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFpc0Zvcm1WYWxpZCgpXCJcbiAgICAgIChjbGlja2VkKT1cIm9uQ3JlYXRlU3RlcCgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=