@cqa-lib/cqa-ui 1.1.402 → 1.1.405
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +9 -3
- package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +8 -3
- package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +8 -3
- package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +259 -33
- package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +14 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +315 -58
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +293 -38
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +5 -1
- package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +3 -1
- package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +3 -1
- package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +10 -1
- package/package.json +1 -1
|
@@ -61,6 +61,7 @@ export class StepBuilderLoopComponent {
|
|
|
61
61
|
this.environmentOptions = [];
|
|
62
62
|
this.hasMoreEnvironments = false;
|
|
63
63
|
this.isLoadingEnvironments = false;
|
|
64
|
+
this.isInsideForLoopStep = false;
|
|
64
65
|
/** When true, header and button show edit/update wording (same as action step builder in debug). */
|
|
65
66
|
this.isDebug = false;
|
|
66
67
|
this.loadMoreElements = new EventEmitter();
|
|
@@ -648,10 +649,10 @@ export class StepBuilderLoopComponent {
|
|
|
648
649
|
}
|
|
649
650
|
}
|
|
650
651
|
StepBuilderLoopComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderLoopComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
651
|
-
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", isCreatingStep: "isCreatingStep", setWhileTemplateVariables: "setWhileTemplateVariables", setAdvancedSettingsVariables: "setAdvancedSettingsVariables", computeHtmlGrammarFn: "computeHtmlGrammarFn", whileTemplates: "whileTemplates", whileSearchPlaceholder: "whileSearchPlaceholder", whileSearchValue: "whileSearchValue", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", isDebug: "isDebug", testStep: "testStep" }, outputs: { createStep: "createStep", cancelled: "cancelled", loopTypeChange: "loopTypeChange", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", cancelElementForm: "cancelElementForm", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", redirectToParameter: "redirectToParameter", redirectToEnvironment: "redirectToEnvironment" }, 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 for-loop-builder\">\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-4\">\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-m-0\">\n {{ isEditMode ? 'Edit loop step' : 'Create Loop Test Step' }}\n </h2>\n <cqa-button\n *ngIf=\"isEditMode && selectedLoopType === 'while' && !whileIsChangingTemplate\"\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"swap_horiz\"\n text=\"Change Template\"\n (clicked)=\"onWhileChangeTemplate()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isEditMode && selectedLoopType === 'while' && whileIsChangingTemplate\"\n variant=\"text\"\n btnSize=\"sm\"\n text=\"Cancel\"\n (clicked)=\"onWhileCancelChangeTemplate()\">\n </cqa-button>\n </div>\n\n <!-- Loop Type Selection: in edit mode show only the current type (For or While); in create mode show both -->\n <div class=\"cqa-mb-4 cqa-w-full\">\n <div *ngIf=\"isEditMode\" class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-px-3 cqa-text-[#111827]\">{{ selectedLoopType === 'while' ? 'While' : 'For' }}</span>\n </div>\n <div *ngIf=\"!isEditMode\" class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'for' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'for' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('for')\">\n For\n </button>\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'while' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'while' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('while')\">\n While\n </button>\n </div>\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\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div> \n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action\n [showHeader]=\"false\"\n [computeHtmlGrammarFn]=\"computeHtmlGrammarFn\"\n [changeTemplateSignal]=\"whileChangeTemplateSignal\"\n [cancelChangeTemplateSignal]=\"whileCancelChangeTemplateSignal\"\n [templates]=\"whileTemplates\"\n [setTemplateVariables]=\"setWhileTemplateVariables\"\n [setAdvancedSettingsVariables]=\"setAdvancedSettingsVariables\"\n [editMode]=\"isEditMode\"\n [isDebug]=\"isDebug\"\n [initialTemplate]=\"selectedWhileTemplate\"\n [initialDescription]=\"selectedWhileDescription\"\n [initialMetadata]=\"selectedWhileMetadata\"\n [searchPlaceholder]=\"whileSearchPlaceholder\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n (templateChanged)=\"selectWhileTemplate($event)\"\n (cancelled)=\"onCancel()\"\n (createStep)=\"createWhileStep($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (redirectToParameter)=\"redirectToParameter.emit()\"\n (redirectToEnvironment)=\"redirectToEnvironment.emit()\"\n (cancelElementForm)=\"cancelElementForm.emit()\">\n </cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons: Apply only when isDebug + existing step (isEditMode), else Create Step -->\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 *ngIf=\"!isCreatingStep\"\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n [text]=\"isEditMode ? 'Update Step' : 'Create Step'\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>\n\n", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.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: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: ["advancedVariables", "advancedVariableForm"], outputs: ["variableBooleanChange", "variableValueChange"] }, { type: i7.StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: ["showHeader", "changeTemplateSignal", "cancelChangeTemplateSignal", "templates", "initialTemplate", "initialDescription", "initialMetadata", "isDebug", "editMode", "searchPlaceholder", "setTemplateVariables", "setAdvancedSettingsVariables", "computeHtmlGrammarFn", "preventSelectTemplate", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "parameterOptions", "hasMoreParameters", "isLoadingParameters", "uploadOptions", "hasMoreUploads", "isLoadingUploads", "environmentOptions", "hasMoreEnvironments", "isLoadingEnvironments", "defaultTestDataProfileId", "defaultTestDataStartIndex", "isCreatingStep"], outputs: ["templateChanged", "loadMoreElements", "searchElements", "searchElementsByScreenName", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "searchParameters", "loadMoreParameters", "searchUploads", "loadMoreUploads", "searchEnvironments", "loadMoreEnvironments", "createStep", "cancelled", "redirectToParameter", "redirectToEnvironment"] }, { type: i8.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
652
|
+
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", isCreatingStep: "isCreatingStep", setWhileTemplateVariables: "setWhileTemplateVariables", setAdvancedSettingsVariables: "setAdvancedSettingsVariables", computeHtmlGrammarFn: "computeHtmlGrammarFn", whileTemplates: "whileTemplates", whileSearchPlaceholder: "whileSearchPlaceholder", whileSearchValue: "whileSearchValue", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", defaultTestDataEndIndex: "defaultTestDataEndIndex", isInsideForLoopStep: "isInsideForLoopStep", isDebug: "isDebug", testStep: "testStep" }, outputs: { createStep: "createStep", cancelled: "cancelled", loopTypeChange: "loopTypeChange", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", cancelElementForm: "cancelElementForm", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", redirectToParameter: "redirectToParameter", redirectToEnvironment: "redirectToEnvironment" }, 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 for-loop-builder\">\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-4\">\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-m-0\">\n {{ isEditMode ? 'Edit loop step' : 'Create Loop Test Step' }}\n </h2>\n <cqa-button\n *ngIf=\"isEditMode && selectedLoopType === 'while' && !whileIsChangingTemplate\"\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"swap_horiz\"\n text=\"Change Template\"\n (clicked)=\"onWhileChangeTemplate()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isEditMode && selectedLoopType === 'while' && whileIsChangingTemplate\"\n variant=\"text\"\n btnSize=\"sm\"\n text=\"Cancel\"\n (clicked)=\"onWhileCancelChangeTemplate()\">\n </cqa-button>\n </div>\n\n <!-- Loop Type Selection: in edit mode show only the current type (For or While); in create mode show both -->\n <div class=\"cqa-mb-4 cqa-w-full\">\n <div *ngIf=\"isEditMode\" class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-px-3 cqa-text-[#111827]\">{{ selectedLoopType === 'while' ? 'While' : 'For' }}</span>\n </div>\n <div *ngIf=\"!isEditMode\" class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'for' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'for' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('for')\">\n For\n </button>\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'while' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'while' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('while')\">\n While\n </button>\n </div>\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\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div> \n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action\n [showHeader]=\"false\"\n [computeHtmlGrammarFn]=\"computeHtmlGrammarFn\"\n [changeTemplateSignal]=\"whileChangeTemplateSignal\"\n [cancelChangeTemplateSignal]=\"whileCancelChangeTemplateSignal\"\n [templates]=\"whileTemplates\"\n [setTemplateVariables]=\"setWhileTemplateVariables\"\n [setAdvancedSettingsVariables]=\"setAdvancedSettingsVariables\"\n [editMode]=\"isEditMode\"\n [isDebug]=\"isDebug\"\n [initialTemplate]=\"selectedWhileTemplate\"\n [initialDescription]=\"selectedWhileDescription\"\n [initialMetadata]=\"selectedWhileMetadata\"\n [searchPlaceholder]=\"whileSearchPlaceholder\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [defaultTestDataEndIndex]=\"defaultTestDataEndIndex\"\n [isInsideForLoopStep]=\"isInsideForLoopStep\"\n (templateChanged)=\"selectWhileTemplate($event)\"\n (cancelled)=\"onCancel()\"\n (createStep)=\"createWhileStep($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (redirectToParameter)=\"redirectToParameter.emit()\"\n (redirectToEnvironment)=\"redirectToEnvironment.emit()\"\n (cancelElementForm)=\"cancelElementForm.emit()\">\n </cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons: Apply only when isDebug + existing step (isEditMode), else Create Step -->\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 *ngIf=\"!isCreatingStep\"\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n [text]=\"isEditMode ? 'Update Step' : 'Create Step'\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>\n\n", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.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: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: ["advancedVariables", "advancedVariableForm"], outputs: ["variableBooleanChange", "variableValueChange"] }, { type: i7.StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: ["showHeader", "changeTemplateSignal", "cancelChangeTemplateSignal", "templates", "initialTemplate", "initialDescription", "initialMetadata", "isDebug", "editMode", "searchPlaceholder", "setTemplateVariables", "setAdvancedSettingsVariables", "computeHtmlGrammarFn", "preventSelectTemplate", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "parameterOptions", "hasMoreParameters", "isLoadingParameters", "uploadOptions", "hasMoreUploads", "isLoadingUploads", "environmentOptions", "hasMoreEnvironments", "isLoadingEnvironments", "defaultTestDataProfileId", "defaultTestDataStartIndex", "defaultTestDataEndIndex", "isInsideForLoopStep", "isCreatingStep"], outputs: ["templateChanged", "loadMoreElements", "searchElements", "searchElementsByScreenName", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "searchParameters", "loadMoreParameters", "searchUploads", "loadMoreUploads", "searchEnvironments", "loadMoreEnvironments", "createStep", "cancelled", "redirectToParameter", "redirectToEnvironment"] }, { type: i8.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
652
653
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderLoopComponent, decorators: [{
|
|
653
654
|
type: Component,
|
|
654
|
-
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 for-loop-builder\">\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-4\">\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-m-0\">\n {{ isEditMode ? 'Edit loop step' : 'Create Loop Test Step' }}\n </h2>\n <cqa-button\n *ngIf=\"isEditMode && selectedLoopType === 'while' && !whileIsChangingTemplate\"\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"swap_horiz\"\n text=\"Change Template\"\n (clicked)=\"onWhileChangeTemplate()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isEditMode && selectedLoopType === 'while' && whileIsChangingTemplate\"\n variant=\"text\"\n btnSize=\"sm\"\n text=\"Cancel\"\n (clicked)=\"onWhileCancelChangeTemplate()\">\n </cqa-button>\n </div>\n\n <!-- Loop Type Selection: in edit mode show only the current type (For or While); in create mode show both -->\n <div class=\"cqa-mb-4 cqa-w-full\">\n <div *ngIf=\"isEditMode\" class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-px-3 cqa-text-[#111827]\">{{ selectedLoopType === 'while' ? 'While' : 'For' }}</span>\n </div>\n <div *ngIf=\"!isEditMode\" class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'for' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'for' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('for')\">\n For\n </button>\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'while' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'while' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('while')\">\n While\n </button>\n </div>\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\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div> \n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action\n [showHeader]=\"false\"\n [computeHtmlGrammarFn]=\"computeHtmlGrammarFn\"\n [changeTemplateSignal]=\"whileChangeTemplateSignal\"\n [cancelChangeTemplateSignal]=\"whileCancelChangeTemplateSignal\"\n [templates]=\"whileTemplates\"\n [setTemplateVariables]=\"setWhileTemplateVariables\"\n [setAdvancedSettingsVariables]=\"setAdvancedSettingsVariables\"\n [editMode]=\"isEditMode\"\n [isDebug]=\"isDebug\"\n [initialTemplate]=\"selectedWhileTemplate\"\n [initialDescription]=\"selectedWhileDescription\"\n [initialMetadata]=\"selectedWhileMetadata\"\n [searchPlaceholder]=\"whileSearchPlaceholder\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n (templateChanged)=\"selectWhileTemplate($event)\"\n (cancelled)=\"onCancel()\"\n (createStep)=\"createWhileStep($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (redirectToParameter)=\"redirectToParameter.emit()\"\n (redirectToEnvironment)=\"redirectToEnvironment.emit()\"\n (cancelElementForm)=\"cancelElementForm.emit()\">\n </cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons: Apply only when isDebug + existing step (isEditMode), else Create Step -->\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 *ngIf=\"!isCreatingStep\"\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n [text]=\"isEditMode ? 'Update Step' : 'Create Step'\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>\n\n", styles: [] }]
|
|
655
|
+
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 for-loop-builder\">\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-4\">\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-m-0\">\n {{ isEditMode ? 'Edit loop step' : 'Create Loop Test Step' }}\n </h2>\n <cqa-button\n *ngIf=\"isEditMode && selectedLoopType === 'while' && !whileIsChangingTemplate\"\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"swap_horiz\"\n text=\"Change Template\"\n (clicked)=\"onWhileChangeTemplate()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isEditMode && selectedLoopType === 'while' && whileIsChangingTemplate\"\n variant=\"text\"\n btnSize=\"sm\"\n text=\"Cancel\"\n (clicked)=\"onWhileCancelChangeTemplate()\">\n </cqa-button>\n </div>\n\n <!-- Loop Type Selection: in edit mode show only the current type (For or While); in create mode show both -->\n <div class=\"cqa-mb-4 cqa-w-full\">\n <div *ngIf=\"isEditMode\" class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-px-3 cqa-text-[#111827]\">{{ selectedLoopType === 'while' ? 'While' : 'For' }}</span>\n </div>\n <div *ngIf=\"!isEditMode\" class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'for' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'for' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('for')\">\n For\n </button>\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'while' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'while' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('while')\">\n While\n </button>\n </div>\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\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div> \n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action\n [showHeader]=\"false\"\n [computeHtmlGrammarFn]=\"computeHtmlGrammarFn\"\n [changeTemplateSignal]=\"whileChangeTemplateSignal\"\n [cancelChangeTemplateSignal]=\"whileCancelChangeTemplateSignal\"\n [templates]=\"whileTemplates\"\n [setTemplateVariables]=\"setWhileTemplateVariables\"\n [setAdvancedSettingsVariables]=\"setAdvancedSettingsVariables\"\n [editMode]=\"isEditMode\"\n [isDebug]=\"isDebug\"\n [initialTemplate]=\"selectedWhileTemplate\"\n [initialDescription]=\"selectedWhileDescription\"\n [initialMetadata]=\"selectedWhileMetadata\"\n [searchPlaceholder]=\"whileSearchPlaceholder\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [defaultTestDataEndIndex]=\"defaultTestDataEndIndex\"\n [isInsideForLoopStep]=\"isInsideForLoopStep\"\n (templateChanged)=\"selectWhileTemplate($event)\"\n (cancelled)=\"onCancel()\"\n (createStep)=\"createWhileStep($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (redirectToParameter)=\"redirectToParameter.emit()\"\n (redirectToEnvironment)=\"redirectToEnvironment.emit()\"\n (cancelElementForm)=\"cancelElementForm.emit()\">\n </cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons: Apply only when isDebug + existing step (isEditMode), else Create Step -->\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 *ngIf=\"!isCreatingStep\"\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n [text]=\"isEditMode ? 'Update Step' : 'Create Step'\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>\n\n", styles: [] }]
|
|
655
656
|
}], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { loopType: [{
|
|
656
657
|
type: Input
|
|
657
658
|
}], selectOptions: [{
|
|
@@ -714,6 +715,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
714
715
|
type: Input
|
|
715
716
|
}], defaultTestDataStartIndex: [{
|
|
716
717
|
type: Input
|
|
718
|
+
}], defaultTestDataEndIndex: [{
|
|
719
|
+
type: Input
|
|
720
|
+
}], isInsideForLoopStep: [{
|
|
721
|
+
type: Input
|
|
717
722
|
}], isDebug: [{
|
|
718
723
|
type: Input
|
|
719
724
|
}], testStep: [{
|
|
@@ -747,4 +752,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
747
752
|
}], redirectToEnvironment: [{
|
|
748
753
|
type: Output
|
|
749
754
|
}] } });
|
|
750
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBZ0RoRixNQUFNLE9BQU8sd0JBQXdCO0lBb0luQyxZQUFvQixFQUFlO1FBQWYsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQW5JbkMsbUNBQW1DO1FBQzFCLGFBQVEsR0FBYSxLQUFLLENBQUM7UUFFcEMsNkNBQTZDO1FBQ3BDLGtCQUFhLEdBQVU7WUFDOUIsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUM7WUFDN0MsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUM7U0FDdEMsQ0FBQztRQUVGLGdGQUFnRjtRQUN2RSx1QkFBa0IsR0FBd0IsRUFBRSxDQUFDO1FBRXRELGdFQUFnRTtRQUN2RCx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFFOUMsc0NBQXNDO1FBQzdCLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUNoRCxrR0FBa0c7UUFDekYsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDekMsbUdBQW1HO1FBQzFGLDhCQUF5QixHQUF1QyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUs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IElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBY3Rpb25UZW1wbGF0ZSB9IGZyb20gJy4uL3N0ZXAtYnVpbGRlci1hY3Rpb24vc3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQnO1xuXG4vLyBJbXBvcnQgRWxlbWVudCB0eXBlIC0gdXNpbmcgYW55IGZvciBub3cgc2luY2UgRWxlbWVudCBpcyBmcm9tIHRzLXBvcnRhbC11aVxuLy8gSW4gYSByZWFsIHNjZW5hcmlvLCB5b3UgbWlnaHQgd2FudCB0byBjcmVhdGUgYSBzaGFyZWQgaW50ZXJmYWNlIG9yIGltcG9ydCBmcm9tIGEgc2hhcmVkIHBhY2thZ2VcbmludGVyZmFjZSBFbGVtZW50IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgbG9jYXRvclZhbHVlPzogc3RyaW5nO1xuICBvdGhlckxvY2F0b3I/OiBzdHJpbmdbXTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgdHlwZSBMb29wVHlwZSA9ICdmb3InIHwgJ3doaWxlJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGRhdGEgcHJvZmlsZSBvcHRpb25cbiAqIEJhc2VkIG9uIFRlc3REYXRhIG1vZGVsIHN0cnVjdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFQcm9maWxlT3B0aW9uIHtcbiAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogQXJyYXkgb2YgZGF0YSBzZXRzIC0gbGVuZ3RoIGRldGVybWluZXMgYXZhaWxhYmxlIGxvb3AgaW5kaWNlcyAqL1xuICBkYXRhPzogYW55W107XG4gIC8qKiBPcHRpb25hbDogZGlyZWN0IGRhdGEgbGVuZ3RoIGlmIGRhdGEgYXJyYXkgaXMgbm90IHByb3ZpZGVkICovXG4gIGRhdGFMZW5ndGg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9vcEZvcm1EYXRhIHtcbiAgc2VsZWN0ZWRMb29wVHlwZTogTG9vcFR5cGU7XG4gIGxvb3BUeXBlOiBMb29wVHlwZTtcbiAgc2VsZWN0T3B0aW9uPzogc3RyaW5nO1xuICBkYXRhUHJvZmlsZT86IHN0cmluZyB8IG51bWJlcjtcbiAgbG9vcFN0YXJ0PzogbnVtYmVyIHwgc3RyaW5nO1xuICBsb29wRW5kPzogbnVtYmVyIHwgc3RyaW5nO1xuICBydW5UaW1lPzogc3RyaW5nO1xuICB3aGlsZVRlbXBsYXRlPzogYW55O1xuICBldmVudD86IGFueTtcbiAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcz86IGFueVtdO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1idWlsZGVyLWxvb3AnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH1cbn0pXG5leHBvcnQgY2xhc3MgU3RlcEJ1aWxkZXJMb29wQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKiogQ3VycmVudGx5IHNlbGVjdGVkIGxvb3AgdHlwZSAqL1xuICBASW5wdXQoKSBsb29wVHlwZTogTG9vcFR5cGUgPSAnZm9yJztcblxuICAvKiogT3B0aW9ucyBmb3IgdGhlIHNlbGVjdCBvcHRpb24gZHJvcGRvd24gKi9cbiAgQElucHV0KCkgc2VsZWN0T3B0aW9uczogYW55W10gPSBbXG4gICAge3ZhbHVlOiAnZGF0YVByb2ZpbGUnLCBsYWJlbDogJ0RhdGEgUHJvZmlsZSd9LFxuICAgIHt2YWx1ZTogJ3J1blRpbWUnLCBsYWJlbDogJ1J1biBUaW1lJ31cbiAgXTtcblxuICAvKiogT3B0aW9ucyBmb3IgdGhlIGRhdGEgcHJvZmlsZSBkcm9wZG93biAtIGFjY2VwdHMgRGF0YVByb2ZpbGVPcHRpb24gb2JqZWN0cyAqL1xuICBASW5wdXQoKSBkYXRhUHJvZmlsZU9wdGlvbnM6IERhdGFQcm9maWxlT3B0aW9uW10gPSBbXTtcblxuICAvKiogSW5kaWNhdGVzIGlmIG1vcmUgZGF0YSBwcm9maWxlcyBhcmUgYXZhaWxhYmxlIGZvciBsb2FkaW5nICovXG4gIEBJbnB1dCgpIGhhc01vcmVEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogTG9hZGluZyBzdGF0ZSBmb3IgZGF0YSBwcm9maWxlcyAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGNyZWF0aW5nIHRoZSBzdGVwIChBUEkgaW4gcHJvZ3Jlc3MpOyBzaG93IGxvYWRlciBvbiBDcmVhdGUgU3RlcCBidXR0b24gKi9cbiAgQElucHV0KCkgaXNDcmVhdGluZ1N0ZXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEZ1bmN0aW9uIHRvIGhhbmRsZSB2YXJpYWJsZSBwcm9jZXNzaW5nIG9yIGN1c3RvbSBsb2dpYy4gQ2FuIGJlIHBhc3NlZCBmcm9tIHBhcmVudCBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIHNldFdoaWxlVGVtcGxhdGVWYXJpYWJsZXM6ICh2YXJpYWJsZXM6IEFjdGlvblRlbXBsYXRlKSA9PiBhbnkgPSAoKSA9PiB7IHJldHVybiBbXX07XG4gIC8qKiBGdW5jdGlvbiB0byBoYW5kbGUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzLiBDYW4gYmUgcGFzc2VkIGZyb20gcGFyZW50IGNvbXBvbmVudC4gKi9cbiAgQElucHV0KCkgc2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogKHRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSwgdGVzdFN0ZXA/OiBhbnkpID0+IGFueVtdID0gKCkgPT4geyByZXR1cm4gW119O1xuXG4gIC8qKiBDZW50cmFsaXNlZCBIVE1MIGdyYW1tYXIgY29tcHV0YXRpb24gZnVuY3Rpb24uIFBhc3MgU3RlcEJ1aWxkZXJTZXJ2aWNlLmNvbXB1dGVIdG1sR3JhbW1hciBmcm9tIHRoZSBob3N0IGFwcC4gKi9cbiAgQElucHV0KCkgY29tcHV0ZUh0bWxHcmFtbWFyRm4/OiAodGVtcGxhdGU6IGFueSwgdmFyaWFibGVzOiBhbnlbXSkgPT4gc3RyaW5nO1xuXG4gIC8qKiBFbWl0IHdoZW4gc3RlcCBpcyBjcmVhdGVkICovXG4gIEBPdXRwdXQoKSBjcmVhdGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxMb29wRm9ybURhdGE+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBjYW5jZWxsZWQgKi9cbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogRW1pdCB3aGVuIGxvb3AgdHlwZSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBsb29wVHlwZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TG9vcFR5cGU+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBtb3JlIGRhdGEgcHJvZmlsZXMgbmVlZCB0byBiZSBsb2FkZWQgKi9cbiAgQE91dHB1dCgpIGxvYWRNb3JlRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBkYXRhIHByb2ZpbGUgc2VhcmNoIHF1ZXJ5IGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIHNlYXJjaERhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBASW5wdXQoKSB3aGlsZVRlbXBsYXRlczogYW55W10gPSBbXTtcbiAgQElucHV0KCkgd2hpbGVTZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlYXJjaCBXaGlsZSc7XG4gIEBJbnB1dCgpIHdoaWxlU2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuICBcbiAgLy8gRWxlbWVudCBmZXRjaGluZyBwcm9wZXJ0aWVzXG4gIEBJbnB1dCgpIGVsZW1lbnRPcHRpb25zOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBoYXNNb3JlRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNMb2FkaW5nRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8vIFNjcmVlbiBuYW1lIGZldGNoaW5nIHByb3BlcnRpZXNcbiAgQElucHV0KCkgc2NyZWVuTmFtZU9wdGlvbnM6IHsgaWQ/OiBudW1iZXI7IG5hbWU6IHN0cmluZyB9W10gPSBbXTtcbiAgQElucHV0KCkgaGFzTW9yZVNjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTG9hZGluZ1NjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvLyBQYXJhbWV0ZXIgZmV0Y2hpbmcgcHJvcGVydGllc1xuICBASW5wdXQoKSBwYXJhbWV0ZXJPcHRpb25zOiBhbnlbXSA9IFtdOyAvLyBUZXN0RGF0YVtdIC0gcmF3IHRlc3QgZGF0YSBwcm9maWxlc1xuICBASW5wdXQoKSBoYXNNb3JlUGFyYW1ldGVyczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0xvYWRpbmdQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvLyBFbnZpcm9ubWVudCBmZXRjaGluZyBwcm9wZXJ0aWVzXG4gIEBJbnB1dCgpIGVudmlyb25tZW50T3B0aW9uczogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGVudmlyb25tZW50OiBzdHJpbmcgfVtdID0gW107XG4gIEBJbnB1dCgpIGhhc01vcmVFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNMb2FkaW5nRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvLyBEZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIHByb3BlcnRpZXNcbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkPzogbnVtYmVyO1xuICBASW5wdXQoKSBkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4PzogbnVtYmVyO1xuXG4gIC8qKiBXaGVuIHRydWUsIGhlYWRlciBhbmQgYnV0dG9uIHNob3cgZWRpdC91cGRhdGUgd29yZGluZyAoc2FtZSBhcyBhY3Rpb24gc3RlcCBidWlsZGVyIGluIGRlYnVnKS4gKi9cbiAgQElucHV0KCkgaXNEZWJ1ZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRXhpc3Rpbmcgc3RlcCB3aGVuIGVkaXRpbmc7IHVzZWQgd2l0aCBpc0RlYnVnIHRvIGRldGVybWluZSBlZGl0IG1vZGUuICovXG4gIEBJbnB1dCgpIHRlc3RTdGVwPzogYW55O1xuXG4gIGdldCBpc0VkaXRNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuaXNEZWJ1ZyAmJiAhISh0aGlzLnRlc3RTdGVwPy5pZCA/PyB0aGlzLnRlc3RTdGVwPy5zdGVwX2lkKTtcbiAgfVxuICBcbiAgQE91dHB1dCgpIGxvYWRNb3JlRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hFbGVtZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc2NyZWVuTmFtZUlkOiBudW1iZXI7IHNlYXJjaFRlcm0/OiBzdHJpbmcgfT4oKTsgLy8gRW1pdCB3aGVuIHNjcmVlbiBuYW1lIGlzIHNlbGVjdGVkIHRvIGZldGNoIGVsZW1lbnRzIGZpbHRlcmVkIGJ5IHNjcmVlbiBuYW1lXG4gIEBPdXRwdXQoKSBjcmVhdGVFbGVtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hTY3JlZW5OYW1lID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZVNjcmVlbk5hbWVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgY2FuY2VsRWxlbWVudEZvcm0gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hQYXJhbWV0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZVBhcmFtZXRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hFbnZpcm9ubWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGxvYWRNb3JlRW52aXJvbm1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVkaXJlY3RUb1BhcmFtZXRlciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlZGlyZWN0VG9FbnZpcm9ubWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgXG4gIHNlbGVjdGVkV2hpbGVUZW1wbGF0ZTogYW55ID0gbnVsbDtcbiAgc2VsZWN0ZWRXaGlsZURlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcbiAgc2VsZWN0ZWRXaGlsZU1ldGFkYXRhOiBzdHJpbmcgPSAnJztcbiAgc2VsZWN0ZWRMb29wVHlwZTogTG9vcFR5cGUgPSAnZm9yJztcbiAgd2hpbGVDaGFuZ2VUZW1wbGF0ZVNpZ25hbDogbnVtYmVyID0gMDtcbiAgd2hpbGVDYW5jZWxDaGFuZ2VUZW1wbGF0ZVNpZ25hbDogbnVtYmVyID0gMDtcbiAgd2hpbGVJc0NoYW5naW5nVGVtcGxhdGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBvbldoaWxlQ2hhbmdlVGVtcGxhdGUoKTogdm9pZCB7XG4gICAgdGhpcy53aGlsZUlzQ2hhbmdpbmdUZW1wbGF0ZSA9IHRydWU7XG4gICAgdGhpcy53aGlsZUNoYW5nZVRlbXBsYXRlU2lnbmFsKys7XG4gIH1cblxuICBvbldoaWxlQ2FuY2VsQ2hhbmdlVGVtcGxhdGUoKTogdm9pZCB7XG4gICAgdGhpcy53aGlsZUlzQ2hhbmdpbmdUZW1wbGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMud2hpbGVDYW5jZWxDaGFuZ2VUZW1wbGF0ZVNpZ25hbCsrO1xuICB9XG4gIFxuICAvLyBTaW5nbGUgRm9ybUdyb3VwIGNvbnRhaW5pbmcgYWxsIGZvdXIgZmllbGRzXG4gIGxvb3BGb3JtOiBGb3JtR3JvdXA7XG5cbiAgLy8gQWR2YW5jZWQgc2V0dGluZ3Mgc3RhdGUgKHNhbWUgcGF0dGVybiBhcyBhY3Rpb24gc3RlcCBidWlsZGVyKVxuICBhZHZhbmNlZEV4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogYW55W10gPSBbXTtcbiAgYWR2YW5jZWRWYXJpYWJsZXNGb3JtOiBGb3JtQXJyYXk7XG5cbiAgLy8gQ29uZmlncyBmb3IgZHluYW1pYy1zZWxlY3QgY29tcG9uZW50c1xuICBzZWxlY3RPcHRpb25Db25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgZGF0YVByb2ZpbGVDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgbG9vcFN0YXJ0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGxvb3BFbmRDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuXG4gIC8vIEludGVybmFsIHN0YXRlIGZvciBtYW5hZ2luZyBsb29wIGluZGljZXNcbiAgcHJpdmF0ZSBzZWxlY3RlZERhdGFQcm9maWxlOiBEYXRhUHJvZmlsZU9wdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXJ0QXJyYXk6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgZW5kQXJyYXk6IG51bWJlcltdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICAvLyBJbml0aWFsaXplIHNpbmdsZSBGb3JtR3JvdXAgd2l0aCBhbGwgZmllbGRzXG4gICAgdGhpcy5sb29wRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgc2VsZWN0T3B0aW9uOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICBkYXRhUHJvZmlsZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxuICAgICAgbG9vcFN0YXJ0OiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICBsb29wRW5kOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICBydW5UaW1lOiBuZXcgRm9ybUNvbnRyb2wobnVsbClcbiAgICB9KTtcblxuICAgIC8vIEluaXRpYWxpemUgYWR2YW5jZWQgdmFyaWFibGVzIGZvcm1cbiAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuYXJyYXkoW10pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBjb25maWdzXG4gICAgdGhpcy5zZWxlY3RPcHRpb25Db25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RPcHRpb24nLFxuICAgICAgcGxhY2Vob2xkZXI6ICdzZWxlY3Qgb3B0aW9uJyxcbiAgICAgIHNlbGVjdGVkVmFsdWU6ICdkYXRhUHJvZmlsZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuc2VsZWN0T3B0aW9uc1xuICAgIH07XG4gICAgdGhpcy5kYXRhUHJvZmlsZUNvbmZpZyA9IHtcbiAgICAgIGtleTogJ2RhdGFQcm9maWxlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnZGF0YSBwcm9maWxlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVEYXRhUHJvZmlsZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRGF0YVByb2ZpbGVzLFxuICAgICAgb3B0aW9uczogW10sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRhdGFQcm9maWxlQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSB8fCAnJyk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmxvb3BTdGFydENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2xvb3BTdGFydCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ2xvb3Agc3RhcnQnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBbXSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uTG9vcFN0YXJ0Q2hhbmdlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMubG9vcEVuZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2xvb3BFbmQnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdsb29wIGVuZCcsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2UgaWYgbmVlZGVkXG4gICAgICB9XG4gICAgfTsgIFxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZExvb3BUeXBlID0gdGhpcy5sb29wVHlwZTtcbiAgICB0aGlzLnVwZGF0ZUNvbmZpZ3MoKTtcblxuICAgIC8vIEluaXRpYWxpemUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzIGZvciBsb29wIHN0ZXBzIChzYW1lIHR5cGUgYXMgb3RoZXIgc3RlcHMpXG4gICAgdGhpcy5pbml0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcygpO1xuXG4gICAgaWYgKHRoaXMuaXNFZGl0TW9kZSAmJiB0aGlzLnRlc3RTdGVwKSB7XG4gICAgICB0aGlzLnBhdGNoRm9ybUZyb21UZXN0U3RlcCgpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnBhdGNoRm9ybUZyb21UZXN0U3RlcCgpLCAwKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdE9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVDb25maWdzKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydkYXRhUHJvZmlsZU9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVDb25maWdzKCk7XG4gICAgICAvLyBJZiBhIGRhdGEgcHJvZmlsZSBpcyBhbHJlYWR5IHNlbGVjdGVkIGluIHRoZSBmb3JtLCB1cGRhdGUgbG9vcCBpbmRpY2VzIChkbyBub3QgcmUtcGF0Y2ggZnJvbSB0ZXN0U3RlcCBoZXJlLFxuICAgICAgLy8gYXMgdGhhdCB3b3VsZCBvdmVyd3JpdGUgdXNlcidzIGluLXByb2dyZXNzIGNoYW5nZSBmcm9tIFJ1biBUaW1lIHRvIERhdGEgUHJvZmlsZSB3aGVuIHRoZSBkcm9wZG93biBvcGVucylcbiAgICAgIGNvbnN0IGN1cnJlbnRQcm9maWxlSWQgPSB0aGlzLmxvb3BGb3JtLmdldCgnZGF0YVByb2ZpbGUnKT8udmFsdWU7XG4gICAgICBpZiAoY3VycmVudFByb2ZpbGVJZCkge1xuICAgICAgICB0aGlzLm9uRGF0YVByb2ZpbGVDaGFuZ2UoY3VycmVudFByb2ZpbGVJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydoYXNNb3JlRGF0YVByb2ZpbGVzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRGF0YVByb2ZpbGVzJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YVByb2ZpbGVDb25maWcoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2xvb3BUeXBlJ10pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9IHRoaXMubG9vcFR5cGU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0ZXN0U3RlcCddIHx8IGNoYW5nZXNbJ2lzRGVidWcnXSkge1xuICAgICAgaWYgKHRoaXMuaXNFZGl0TW9kZSAmJiB0aGlzLnRlc3RTdGVwKSB7XG4gICAgICAgIHRoaXMucGF0Y2hGb3JtRnJvbVRlc3RTdGVwKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd3aGlsZVRlbXBsYXRlcyddICYmIHRoaXMuaXNFZGl0TW9kZSAmJiB0aGlzLnRlc3RTdGVwICYmICF0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZSkge1xuICAgICAgdGhpcy5wYXRjaEZvcm1Gcm9tVGVzdFN0ZXAoKTtcbiAgICB9XG4gICAgLy8gTm90ZTogbG9vcFN0YXJ0T3B0aW9ucyBhbmQgbG9vcEVuZE9wdGlvbnMgYXJlIG5vdyBjYWxjdWxhdGVkIGR5bmFtaWNhbGx5XG4gICAgLy8gc28gdGhleSBkb24ndCBuZWVkIHRvIGJlIHVwZGF0ZWQgZnJvbSBpbnB1dHNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGxvb3Agc3RlcCB2YWx1ZXMgZnJvbSBzdGVwIChzYW1lIGZhbGxiYWNrcyBhcyB0ZXN0LWNhc2UtZGV0YWlsczogZGF0YU1hcEpzb24sIGRhdGFNYXBCZWFuLmZvcl9sb29wKS5cbiAgICovXG4gIHByaXZhdGUgZ2V0TG9vcFN0ZXBWYWx1ZShzdGVwOiBhbnksIGtleTogJ2Zvckxvb3BUZXN0RGF0YUlkJyB8ICdmb3JMb29wU3RhcnRJbmRleCcgfCAnZm9yTG9vcEVuZEluZGV4Jyk6IGFueSB7XG4gICAgY29uc3QgZGF0YU1hcCA9IHN0ZXA/LmRhdGFNYXBKc29uID8/IHN0ZXA/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcDtcbiAgICBjb25zdCBtYXBLZXkgPSBrZXkgPT09ICdmb3JMb29wVGVzdERhdGFJZCcgPyAndGVzdERhdGFJZCcgOiBrZXkgPT09ICdmb3JMb29wU3RhcnRJbmRleCcgPyAnc3RhcnRJbmRleCcgOiAnZW5kSW5kZXgnO1xuICAgIHJldHVybiBzdGVwPy5ba2V5XSA/PyBzdGVwPy5kYXRhTWFwSnNvbj8uW2tleV0gPz8gZGF0YU1hcD8uW21hcEtleV0gPz8gZGF0YU1hcD8uW2tleV07XG4gIH1cblxuICAvKipcbiAgICogUHJlLWZpbGwgdGhlIGZvcm0gZnJvbSBhbiBleGlzdGluZyBzdGVwIChlZGl0IG1vZGUpLiBEZWJ1ZyBvbmx5IOKAlCBvbmx5IHJ1bnMgd2hlbiBpc0RlYnVnIGlzIHRydWUuXG4gICAqIFVzZXMgc2FtZSBmYWxsYmFja3MgYXMgdGVzdC1jYXNlLWRldGFpbHMgKGRhdGFNYXBKc29uLCBkYXRhTWFwQmVhbi5mb3JfbG9vcCkgYW5kIGV4cGxpY2l0bHlcbiAgICogc2V0VmFsdWUgb24gY29udHJvbHMgc28gZHJvcGRvd25zIGJpbmQgKHBhdGNoVmFsdWUgY2FuIGJlIGlnbm9yZWQgYnkgZHluYW1pYy1zZWxlY3QgaW4gc29tZSB0aW1pbmcgY2FzZXMpLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXRjaEZvcm1Gcm9tVGVzdFN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRGVidWcgfHwgIXRoaXMudGVzdFN0ZXApIHJldHVybjtcbiAgICBjb25zdCBzdGVwID0gdGhpcy50ZXN0U3RlcCBhcyBhbnk7XG4gICAgY29uc3QgaXNXaGlsZSA9IHN0ZXAudGVzdFN0ZXBUeXBlID09PSAnV0hJTEVfTE9PUCcgfHwgc3RlcC50eXBlID09PSAnV0hJTEVfTE9PUCc7XG4gICAgdGhpcy5zZWxlY3RlZExvb3BUeXBlID0gaXNXaGlsZSA/ICd3aGlsZScgOiAnZm9yJztcblxuICAgIGlmICh0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InKSB7XG4gICAgICBjb25zdCBpc1J1blRpbWUgPSAhIXN0ZXAuaXNSdW5UaW1lO1xuICAgICAgY29uc3Qgc2VsZWN0T3B0aW9uID0gaXNSdW5UaW1lID8gJ3J1blRpbWUnIDogJ2RhdGFQcm9maWxlJztcbiAgICAgIGNvbnN0IHByb2ZpbGVJZCA9IGlzUnVuVGltZSA/IG51bGwgOiAodGhpcy5nZXRMb29wU3RlcFZhbHVlKHN0ZXAsICdmb3JMb29wVGVzdERhdGFJZCcpID8/IG51bGwpO1xuICAgICAgY29uc3Qgc3RhcnRWYWwgPSBpc1J1blRpbWUgPyBudWxsIDogKHRoaXMuZ2V0TG9vcFN0ZXBWYWx1ZShzdGVwLCAnZm9yTG9vcFN0YXJ0SW5kZXgnKSA/PyBudWxsKTtcbiAgICAgIGNvbnN0IGVuZFZhbCA9IGlzUnVuVGltZSA/IG51bGwgOiAodGhpcy5nZXRMb29wU3RlcFZhbHVlKHN0ZXAsICdmb3JMb29wRW5kSW5kZXgnKSA/PyBudWxsKTtcbiAgICAgIGNvbnN0IHJ1blRpbWVWYWwgPSBpc1J1blRpbWUgPyAoc3RlcC50ZXN0RGF0YVZhbCA/PyBzdGVwLnRlc3REYXRhID8/ICcnKSA6IG51bGw7XG5cbiAgICAgIHRoaXMubG9vcEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIHNlbGVjdE9wdGlvbixcbiAgICAgICAgZGF0YVByb2ZpbGU6IHByb2ZpbGVJZCxcbiAgICAgICAgbG9vcFN0YXJ0OiBzdGFydFZhbCxcbiAgICAgICAgbG9vcEVuZDogZW5kVmFsLFxuICAgICAgICBydW5UaW1lOiBydW5UaW1lVmFsXG4gICAgICB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICAgIGlmICghaXNSdW5UaW1lICYmIHByb2ZpbGVJZCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMub25EYXRhUHJvZmlsZUNoYW5nZShwcm9maWxlSWQpO1xuICAgICAgICBjb25zdCBzdGFydCA9IHN0YXJ0VmFsID8/IHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wU3RhcnQnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IGVuZCA9IGVuZFZhbCA/PyB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy52YWx1ZTtcbiAgICAgICAgdGhpcy5sb29wRm9ybS5wYXRjaFZhbHVlKHsgbG9vcFN0YXJ0OiBzdGFydCwgbG9vcEVuZDogZW5kIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb29wRm9ybS5nZXQoJ3NlbGVjdE9wdGlvbicpPy5zZXRWYWx1ZShzZWxlY3RPcHRpb24sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGlmIChwcm9maWxlSWQgIT0gbnVsbCkgdGhpcy5sb29wRm9ybS5nZXQoJ2RhdGFQcm9maWxlJyk/LnNldFZhbHVlKHByb2ZpbGVJZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgaWYgKHN0YXJ0VmFsICE9IG51bGwpIHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wU3RhcnQnKT8uc2V0VmFsdWUoc3RhcnRWYWwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGlmIChlbmRWYWwgIT0gbnVsbCkgdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8uc2V0VmFsdWUoZW5kVmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICBpZiAocnVuVGltZVZhbCAhPSBudWxsICYmIHJ1blRpbWVWYWwgIT09ICcnKSB0aGlzLmxvb3BGb3JtLmdldCgncnVuVGltZScpPy5zZXRWYWx1ZShydW5UaW1lVmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIC8vIFByZS1maWxsIHRoZSB3aGlsZSBjb25kaXRpb24gdGVtcGxhdGUgZnJvbSB0aGUgY29uZGl0aW9uIGNoaWxkXG4gICAgICBjb25zdCBjb25kQ2hpbGQgPSBzdGVwLmNoaWxkcmVuPy5maW5kKChjOiBhbnkpID0+IGMuY29uZGl0aW9uVHlwZSA9PT0gJ0xPT1BfV0hJTEUnKTtcbiAgICAgIGlmIChjb25kQ2hpbGQpIHtcbiAgICAgICAgaWYgKGNvbmRDaGlsZC50ZW1wbGF0ZSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlID0gY29uZENoaWxkLnRlbXBsYXRlO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbmRDaGlsZC5uYXR1cmFsVGV4dEFjdGlvbklkICYmIHRoaXMud2hpbGVUZW1wbGF0ZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IG5sSWQgPSBOdW1iZXIoY29uZENoaWxkLm5hdHVyYWxUZXh0QWN0aW9uSWQpO1xuICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSB0aGlzLndoaWxlVGVtcGxhdGVzLmZpbmQoKHQ6IGFueSkgPT4gTnVtYmVyKHQuaWQpID09PSBubElkKTtcbiAgICAgICAgICBpZiAobWF0Y2hlZCkgdGhpcy5zZWxlY3RlZFdoaWxlVGVtcGxhdGUgPSBtYXRjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25kQ2hpbGQuZGVzY3JpcHRpb24pIHRoaXMuc2VsZWN0ZWRXaGlsZURlc2NyaXB0aW9uID0gY29uZENoaWxkLmRlc2NyaXB0aW9uO1xuICAgICAgICBpZiAoY29uZENoaWxkLm1ldGFkYXRhKSB0aGlzLnNlbGVjdGVkV2hpbGVNZXRhZGF0YSA9IGNvbmRDaGlsZC5tZXRhZGF0YTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRTa2lwID0gISEoc3RlcC5zaG91bGRTa2lwID8/IHN0ZXAuZXZlbnQ/LnNob3VsZFNraXApO1xuICAgIGNvbnN0IHNraXBWYXIgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gJ3Nob3VsZFNraXAnKTtcbiAgICBpZiAoc2tpcFZhcikge1xuICAgICAgc2tpcFZhci52YWx1ZSA9IHNob3VsZFNraXA7XG4gICAgICB0aGlzLmJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzIGZvciBsb29wIHN0ZXBzLlxuICAgKiBGb3IgbG9vcHMsIHdlIGN1cnJlbnRseSBzdXBwb3J0IHRoZSBzYW1lIGdlbmVyaWMgYWR2YW5jZWQgZmxhZzogc2hvdWxkU2tpcC5cbiAgICovXG4gIHByaXZhdGUgaW5pdEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMoKTogdm9pZCB7XG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnc2hvdWxkU2tpcCcsXG4gICAgICAgIGxhYmVsOiAnU2tpcCB0aGlzIHN0ZXAgZHVyaW5nIGV4ZWN1dGlvbi4nLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgICAgfVxuICAgIF07XG5cbiAgICB0aGlzLmJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgcmVhY3RpdmUgZm9ybSBmb3IgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzIChtaXJyb3JzIGFjdGlvbiBzdGVwIGJlaGF2aW9yKS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgZm9ybSBhcnJheVxuICAgIHdoaWxlICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIC8vIEFkZCBmb3JtIGdyb3VwcyBmb3IgZWFjaCBhZHZhbmNlZCB2YXJpYWJsZVxuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIGxldCBkZWZhdWx0VmFsdWU6IGFueTtcbiAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlLnZhbHVlKSA/IHZhcmlhYmxlLnZhbHVlIDogW107XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoXG4gICAgICAgICAgdmFsdWVBcnJheS5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IHZhbHVlQXJyYXkubWFwKChpdGVtOiBzdHJpbmcpID0+IHRoaXMuZmIuY29udHJvbChpdGVtKSlcbiAgICAgICAgICAgIDogW3RoaXMuZmIuY29udHJvbCgnJyldXG4gICAgICAgICk7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGZvcm1BcnJheTtcbiAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YXJpYWJsZS52YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnZhbHVlID09PSB0cnVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAndHJ1ZScgfHwgdmFyaWFibGUudmFsdWUgPT09IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSB8fCAnJztcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiB2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnID8gZGVmYXVsdFZhbHVlIDogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICAgIHR5cGU6IFt2YXJpYWJsZS50eXBlIHx8ICdzdHJpbmcnXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCAnJ11cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb25maWdzKCk6IHZvaWQge1xuICAgIC8vIENvbnZlcnQgRGF0YVByb2ZpbGVPcHRpb25bXSB0byBTZWxlY3RPcHRpb25bXVxuICAgIHRoaXMuZGF0YVByb2ZpbGVDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmRhdGFQcm9maWxlQ29uZmlnLFxuICAgICAgb3B0aW9uczogdGhpcy5jb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zKSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZURhdGFQcm9maWxlcyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdEYXRhUHJvZmlsZXMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRhdGFQcm9maWxlQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSB8fCAnJyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICAvLyBMb29wIHN0YXJ0IGFuZCBlbmQgb3B0aW9ucyBhcmUgdXBkYXRlZCB3aGVuIGRhdGEgcHJvZmlsZSBpcyBzZWxlY3RlZFxuICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKG9wdGlvbnM6IERhdGFQcm9maWxlT3B0aW9uW10pOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgaWQ6IG9wdGlvbi5pZCxcbiAgICAgIHZhbHVlOiBvcHRpb24uaWQsXG4gICAgICBuYW1lOiBvcHRpb24ubmFtZSxcbiAgICAgIGxhYmVsOiBvcHRpb24ubmFtZVxuICAgIH0pKTtcbiAgfVxuICAvKipcbiAgICogSGFuZGxlIGRhdGEgcHJvZmlsZSBzZWxlY3Rpb24gYW5kIHVwZGF0ZSBsb29wIHN0YXJ0L2VuZCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIG9uRGF0YVByb2ZpbGVDaGFuZ2UocHJvZmlsZUlkOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5maW5kKHByb2ZpbGUgPT4gXG4gICAgICBwcm9maWxlLmlkID09PSBwcm9maWxlSWQgfHwgU3RyaW5nKHByb2ZpbGUuaWQpID09PSBTdHJpbmcocHJvZmlsZUlkKVxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWRQcm9maWxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVByb2ZpbGUgPSBzZWxlY3RlZFByb2ZpbGU7XG4gICAgICB0aGlzLnVwZGF0ZUxvb3BJbmRpY2VzRnJvbVByb2ZpbGUoc2VsZWN0ZWRQcm9maWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGFQcm9maWxlID0gbnVsbDtcbiAgICAgIHRoaXMuc3RhcnRBcnJheSA9IFtdO1xuICAgICAgdGhpcy5lbmRBcnJheSA9IFtdO1xuICAgICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBsb29wIGluZGljZXMgYmFzZWQgb24gc2VsZWN0ZWQgZGF0YSBwcm9maWxlXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUxvb3BJbmRpY2VzRnJvbVByb2ZpbGUocHJvZmlsZTogRGF0YVByb2ZpbGVPcHRpb24pOiB2b2lkIHtcbiAgICAvLyBDYWxjdWxhdGUgZGF0YSBsZW5ndGggZnJvbSBkYXRhIGFycmF5IG9yIHVzZSBwcm92aWRlZCBkYXRhTGVuZ3RoXG4gICAgbGV0IGRhdGFTZXRMZW5ndGggPSAxO1xuICAgIGlmIChwcm9maWxlLmRhdGEgJiYgQXJyYXkuaXNBcnJheShwcm9maWxlLmRhdGEpKSB7XG4gICAgICBkYXRhU2V0TGVuZ3RoID0gcHJvZmlsZS5kYXRhLmxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKHByb2ZpbGUuZGF0YUxlbmd0aCAmJiBwcm9maWxlLmRhdGFMZW5ndGggPiAwKSB7XG4gICAgICBkYXRhU2V0TGVuZ3RoID0gcHJvZmlsZS5kYXRhTGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBzdGFydCBhcnJheSBmcm9tIDEgdG8gZGF0YVNldExlbmd0aFxuICAgIHRoaXMuc3RhcnRBcnJheSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGRhdGFTZXRMZW5ndGggfSwgKF8sIGkpID0+IGkgKyAxKTtcbiAgICAvLyBJbml0aWFsaXplIGVuZCBhcnJheSBzYW1lIGFzIHN0YXJ0IGFycmF5XG4gICAgLy8gRW5kIGFycmF5IHdpbGwgYmUgdXBkYXRlZCB3aGVuIHN0YXJ0IGluZGV4IGlzIHNlbGVjdGVkXG4gICAgdGhpcy5lbmRBcnJheSA9IFsuLi50aGlzLnN0YXJ0QXJyYXldO1xuXG4gICAgLy8gU2V0IGRlZmF1bHQgdmFsdWVzIGlmIGZvcm0gaXMgZW1wdHlcbiAgICBjb25zdCBjdXJyZW50U3RhcnQgPSB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcFN0YXJ0Jyk/LnZhbHVlO1xuICAgIGNvbnN0IGN1cnJlbnRFbmQgPSB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy52YWx1ZTtcbiAgICBcbiAgICBpZiAoIWN1cnJlbnRTdGFydCAmJiB0aGlzLnN0YXJ0QXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BTdGFydCcpPy5zZXRWYWx1ZSh0aGlzLnN0YXJ0QXJyYXlbMF0pO1xuICAgIH1cbiAgICBpZiAoIWN1cnJlbnRFbmQgJiYgdGhpcy5lbmRBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy5zZXRWYWx1ZSh0aGlzLmVuZEFycmF5W3RoaXMuZW5kQXJyYXkubGVuZ3RoIC0gMV0pO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBsb29wIHN0YXJ0IGNoYW5nZSBhbmQgdXBkYXRlIGVuZCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIG9uTG9vcFN0YXJ0Q2hhbmdlKHN0YXJ0SW5kZXg6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZERhdGFQcm9maWxlIHx8ICFzdGFydEluZGV4KSB7XG4gICAgICB0aGlzLmVuZEFycmF5ID0gWy4uLnRoaXMuc3RhcnRBcnJheV07XG4gICAgICB0aGlzLnVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydElkeCA9IHR5cGVvZiBzdGFydEluZGV4ID09PSAnc3RyaW5nJyA/IHBhcnNlSW50KHN0YXJ0SW5kZXgpIDogc3RhcnRJbmRleDtcbiAgICBcbiAgICBpZiAoaXNOYU4oc3RhcnRJZHgpIHx8IHN0YXJ0SWR4IDwgMSkge1xuICAgICAgdGhpcy5lbmRBcnJheSA9IFsuLi50aGlzLnN0YXJ0QXJyYXldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFbmQgYXJyYXkgc2hvdWxkIGJlIGZyb20gc3RhcnRJbmRleCB0byBlbmQgb2YgZGF0YVxuICAgICAgLy8gQmFzZWQgb24gcmVmZXJlbmNlOiBlbmRBcnJheSA9IHN0YXJ0QXJyYXkuc3BsaWNlKHN0YXJ0SW5kZXggLSAxLCBzdGFydEFycmF5Lmxlbmd0aClcbiAgICAgIGNvbnN0IHN0YXJ0QXJyYXlDb3B5ID0gWy4uLnRoaXMuc3RhcnRBcnJheV07XG4gICAgICB0aGlzLmVuZEFycmF5ID0gc3RhcnRBcnJheUNvcHkuc2xpY2Uoc3RhcnRJZHggLSAxKTtcbiAgICB9XG5cbiAgICAvLyBBdXRvLXVwZGF0ZSBlbmQgaW5kZXggaWYgY3VycmVudCBlbmQgaXMgaW52YWxpZFxuICAgIGNvbnN0IGN1cnJlbnRFbmQgPSB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy52YWx1ZTtcbiAgICBjb25zdCBlbmRJZHggPSB0eXBlb2YgY3VycmVudEVuZCA9PT0gJ3N0cmluZycgPyBwYXJzZUludChjdXJyZW50RW5kKSA6IGN1cnJlbnRFbmQ7XG4gICAgXG4gICAgaWYgKCFjdXJyZW50RW5kIHx8IGlzTmFOKGVuZElkeCkgfHwgZW5kSWR4IDwgc3RhcnRJZHgpIHtcbiAgICAgIGlmICh0aGlzLmVuZEFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8uc2V0VmFsdWUodGhpcy5lbmRBcnJheVt0aGlzLmVuZEFycmF5Lmxlbmd0aCAtIDFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGlzcGxheSBuYW1lIGZvciBhIDEtYmFzZWQgcm93IGluZGV4IGZyb20gdGhlIHNlbGVjdGVkIHByb2ZpbGUncyBkYXRhIGFycmF5IChkYXRhW2luZGV4LTFdLm5hbWUpLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgbm8gbmFtZS4gTWF0Y2hlcyBsb29wLXN0ZXAgZWRpdCBtb2RlIGJlaGF2aW9yLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXREYXRhUm93TmFtZUZvck9uZUJhc2VkSW5kZXgob25lQmFzZWRJbmRleDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgcHJvZmlsZSA9IHRoaXMuc2VsZWN0ZWREYXRhUHJvZmlsZTtcbiAgICBpZiAoIXByb2ZpbGU/LmRhdGEgfHwgIUFycmF5LmlzQXJyYXkocHJvZmlsZS5kYXRhKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaWR4ID0gb25lQmFzZWRJbmRleCAtIDE7XG4gICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHByb2ZpbGUuZGF0YS5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJvdyA9IHByb2ZpbGUuZGF0YVtpZHhdO1xuICAgIHJldHVybiByb3cgJiYgKHJvdy5uYW1lICE9IG51bGwgPyBTdHJpbmcocm93Lm5hbWUpIDogbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgbGFiZWwgZm9yIGEgbG9vcCBpbmRleCBvcHRpb246IFwic2V0TmFtZSAobilcIiB3aGVuIHJvdyBoYXMgbmFtZSwgZWxzZSBcIlN0ZXAgKG4pXCIuXG4gICAqIE1hdGNoZXMgbG9vcC1zdGVwIGVkaXQgbW9kZSBkcm9wZG93biBkaXNwbGF5LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRMb29wSW5kZXhPcHRpb25MYWJlbChpZHg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3Qgcm93TmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KGlkeCk7XG4gICAgcmV0dXJuIHJvd05hbWUgPyBgJHtyb3dOYW1lfSAoJHtpZHh9KWAgOiBgU3RlcCAoJHtpZHh9KWA7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGxvb3Agc3RhcnQgYW5kIGVuZCBjb25maWcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVMb29wSW5kZXhPcHRpb25zKCk6IHZvaWQge1xuICAgIC8vIENvbnZlcnQgc3RhcnRBcnJheSB0byBTZWxlY3RPcHRpb25zIHdpdGggXCJTdGVwIChuKVwiIG9yIFwic2V0TmFtZSAobilcIiBsYWJlbHNcbiAgICBjb25zdCBzdGFydE9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gdGhpcy5zdGFydEFycmF5Lm1hcChpZHggPT4ge1xuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldExvb3BJbmRleE9wdGlvbkxhYmVsKGlkeCk7XG4gICAgICByZXR1cm4geyBpZDogaWR4LCB2YWx1ZTogaWR4LCBuYW1lOiBsYWJlbCwgbGFiZWwgfTtcbiAgICB9KTtcblxuICAgIC8vIENvbnZlcnQgZW5kQXJyYXkgdG8gU2VsZWN0T3B0aW9ucyB3aXRoIHNhbWUgbGFiZWwgZm9ybWF0XG4gICAgY29uc3QgZW5kT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSB0aGlzLmVuZEFycmF5Lm1hcChpZHggPT4ge1xuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldExvb3BJbmRleE9wdGlvbkxhYmVsKGlkeCk7XG4gICAgICByZXR1cm4geyBpZDogaWR4LCB2YWx1ZTogaWR4LCBuYW1lOiBsYWJlbCwgbGFiZWwgfTtcbiAgICB9KTtcblxuICAgIHRoaXMubG9vcFN0YXJ0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5sb29wU3RhcnRDb25maWcsXG4gICAgICBvcHRpb25zOiBbe2lkOiAtMSwgdmFsdWU6IC0xLCBuYW1lOiAnU3RhcnQnLCBsYWJlbDogJ1N0YXJ0J30sIC4uLnN0YXJ0T3B0aW9uc10sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkxvb3BTdGFydENoYW5nZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMubG9vcEVuZENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMubG9vcEVuZENvbmZpZyxcbiAgICAgIG9wdGlvbnM6IFsuLi5lbmRPcHRpb25zLHtpZDogLTEsIHZhbHVlOiAtMSwgbmFtZTogJ0VuZCcsIGxhYmVsOiAnRW5kJ31dLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2UgaWYgbmVlZGVkXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIG9uTG9vcFR5cGVDaGFuZ2UodHlwZTogc3RyaW5nIHwgTG9vcFR5cGUpOiB2b2lkIHtcbiAgICBjb25zdCBsb29wVHlwZSA9IHR5cGUgYXMgTG9vcFR5cGU7XG4gICAgdGhpcy5zZWxlY3RlZExvb3BUeXBlID0gbG9vcFR5cGU7XG4gICAgdGhpcy5sb29wVHlwZUNoYW5nZS5lbWl0KGxvb3BUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgdmlzaWJpbGl0eSBvZiB0aGUgQWR2YW5jZWQgc2V0dGluZ3Mgc2VjdGlvbi5cbiAgICovXG4gIHRvZ2dsZUFkdmFuY2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9ICF0aGlzLmFkdmFuY2VkRXhwYW5kZWQ7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGFkdmFuY2VkIGJvb2xlYW4gdmFyaWFibGUgY2hhbmdlIChlLmcuIHNob3VsZFNraXApLlxuICAgKi9cbiAgb25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGFkdmFuY2VkIG5vbi1ib29sZWFuIHZhbHVlIGNoYW5nZXMgKGtlcHQgZ2VuZXJpYyBmb3IgZnV0dXJlIHVzZSwgZS5nLiBzdHJfbGlzdCkuXG4gICAqL1xuICBvbkFkdmFuY2VkVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgICAgaWYgKHZhcmlhYmxlPy50eXBlICE9PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIGZvcm1Hcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZExvb3BUeXBlID09PSAnd2hpbGUnKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yICdmb3InIGxvb3AgdHlwZVxuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5sb29wRm9ybS52YWx1ZTtcbiAgICAgIGNvbnN0IHNlbGVjdE9wdGlvbiA9IGZvcm1WYWx1ZS5zZWxlY3RPcHRpb247XG4gICAgICBcbiAgICAgIGlmICghc2VsZWN0T3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHNlbGVjdE9wdGlvbiA9PT0gJ2RhdGFQcm9maWxlJykge1xuICAgICAgICAvLyBGb3IgZGF0YSBwcm9maWxlLCBuZWVkIGRhdGFQcm9maWxlLCBsb29wU3RhcnQsIGFuZCBsb29wRW5kXG4gICAgICAgIHJldHVybiAhIShmb3JtVmFsdWUuZGF0YVByb2ZpbGUgJiYgZm9ybVZhbHVlLmxvb3BTdGFydCAmJiBmb3JtVmFsdWUubG9vcEVuZCk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdE9wdGlvbiA9PT0gJ3J1blRpbWUnKSB7XG4gICAgICAgIC8vIEZvciBydW4gdGltZSwgbmVlZCBydW5UaW1lIHZhbHVlXG4gICAgICAgIHJldHVybiAhIShmb3JtVmFsdWUucnVuVGltZSAmJiBmb3JtVmFsdWUucnVuVGltZS50cmltKCkgIT09ICcnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9uQ3JlYXRlU3RlcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNGb3JtVmFsaWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFN5bmMgYWR2YW5jZWQgdmFyaWFibGVzIGZyb20gZm9ybSB0byBhcnJheSAoc2FtZSBwYXR0ZXJuIGFzIGFjdGlvbiBzdGVwKVxuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgICBpZiAoZm9ybUdyb3VwKSB7XG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGZvcm1Hcm91cC5nZXQoJ3ZhbHVlJyk/LnZhbHVlO1xuICAgICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3N0cl9saXN0JyAmJiBmb3JtVmFsdWUgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1WYWx1ZS5jb250cm9sc1xuICAgICAgICAgICAgLm1hcChjb250cm9sID0+IGNvbnRyb2wudmFsdWUpXG4gICAgICAgICAgICAuZmlsdGVyKCh2YWw6IHN0cmluZykgPT4gdmFsICYmIHZhbC50cmltKCkgIT09ICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5sb29wRm9ybS52YWx1ZTtcbiAgICBpZih0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIGlmKCF0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHN0ZXBEYXRhOiBMb29wRm9ybURhdGEgPSB7XG4gICAgICBzZWxlY3RlZExvb3BUeXBlOiB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgYXMgTG9vcFR5cGUsXG4gICAgICBsb29wVHlwZTogdGhpcy5zZWxlY3RlZExvb3BUeXBlLFxuICAgICAgc2VsZWN0T3B0aW9uOiBmb3JtVmFsdWUuc2VsZWN0T3B0aW9uIHx8IHVuZGVmaW5lZCxcbiAgICAgIGRhdGFQcm9maWxlOiBmb3JtVmFsdWUuZGF0YVByb2ZpbGUgfHwgdW5kZWZpbmVkLFxuICAgICAgbG9vcFN0YXJ0OiBmb3JtVmFsdWUubG9vcFN0YXJ0IHx8IHVuZGVmaW5lZCxcbiAgICAgIGxvb3BFbmQ6IGZvcm1WYWx1ZS5sb29wRW5kIHx8IHVuZGVmaW5lZCxcbiAgICAgIHJ1blRpbWU6IGZvcm1WYWx1ZS5ydW5UaW1lIHx8IHVuZGVmaW5lZCxcbiAgICAgIHdoaWxlVGVtcGxhdGU6IHRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlIHx8IHVuZGVmaW5lZCxcbiAgICAgIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlc1xuICAgIH07XG4gICAgY29uc29sZS5sb2coJ3N0ZXBEYXRhJywgc3RlcERhdGEpO1xuICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgfVxuXG4gIGNyZWF0ZVdoaWxlU3RlcChldmVudDogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ2NyZWF0ZVdoaWxlU3RlcCcsIGV2ZW50KTtcbiAgICBjb25zdCBzdGVwRGF0YTogTG9vcEZvcm1EYXRhID0ge1xuICAgICAgc2VsZWN0ZWRMb29wVHlwZTogdGhpcy5zZWxlY3RlZExvb3BUeXBlIGFzIExvb3BUeXBlLFxuICAgICAgbG9vcFR5cGU6IHRoaXMuc2VsZWN0ZWRMb29wVHlwZSBhcyBMb29wVHlwZSxcbiAgICAgIGV2ZW50OiBldmVudFxuICAgIH07XG4gICAgY29uc29sZS5sb2coJ3N0ZXBEYXRhJywgc3RlcERhdGEpO1xuICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VhcmNoIGV2ZW50IGZvciBkYXRhIHByb2ZpbGVzXG4gICAqL1xuICBvblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGxvYWRNb3JlIGV2ZW50IGZvciBkYXRhIHByb2ZpbGVzXG4gICAqL1xuICBvbkxvYWRNb3JlRGF0YVByb2ZpbGVzKGV2ZW50OiB7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoZXZlbnQucXVlcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBkYXRhIHByb2ZpbGUgY29uZmlnIHdoZW4gbG9hZGluZyBzdGF0ZSBvciBoYXNNb3JlIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlRGF0YVByb2ZpbGVDb25maWcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YVByb2ZpbGVDb25maWcpIHtcbiAgICAgIHRoaXMuZGF0YVByb2ZpbGVDb25maWcgPSB7XG4gICAgICAgIC4uLnRoaXMuZGF0YVByb2ZpbGVDb25maWcsXG4gICAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZURhdGFQcm9maWxlcyxcbiAgICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ0RhdGFQcm9maWxlc1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPSAnZm9yJztcbiAgICB0aGlzLnNlbGVjdGVkRGF0YVByb2ZpbGUgPSBudWxsO1xuICAgIHRoaXMuc3RhcnRBcnJheSA9IFtdO1xuICAgIHRoaXMuZW5kQXJyYXkgPSBbXTtcbiAgICB0aGlzLmxvb3BGb3JtLnJlc2V0KHtcbiAgICAgIHNlbGVjdE9wdGlvbjogbnVsbCxcbiAgICAgIGRhdGFQcm9maWxlOiBudWxsLFxuICAgICAgbG9vcFN0YXJ0OiBudWxsLFxuICAgICAgbG9vcEVuZDogbnVsbFxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICB9XG5cbiAgb25XaGlsZVNlYXJjaENoYW5nZShldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy53aGlsZVNlYXJjaFZhbHVlID0gZXZlbnQ7XG4gICAgdGhpcy5maWx0ZXJXaGlsZVRlbXBsYXRlcyhldmVudCk7XG4gIH1cblxuICBvbldoaWxlU2VhcmNoU3VibWl0KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uV2hpbGVTZWFyY2hDaGFuZ2UoZXZlbnQpO1xuICB9XG5cbiAgb25XaGlsZVNlYXJjaENsZWFyZWQoKTogdm9pZCB7XG4gICAgdGhpcy53aGlsZVNlYXJjaFZhbHVlID0gJyc7XG4gICAgdGhpcy5maWx0ZXJXaGlsZVRlbXBsYXRlcygnJyk7XG4gIH1cblxuICBmaWx0ZXJXaGlsZVRlbXBsYXRlcyhxdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53aGlsZVRlbXBsYXRlcyA9IHRoaXMud2hpbGVUZW1wbGF0ZXMuZmlsdGVyKHRlbXBsYXRlID0+IHRlbXBsYXRlLmh0bWxHcmFtbWFyLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkudG9Mb3dlckNhc2UoKSkgfHwgdGVtcGxhdGUubmF0dXJhbFRleHQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKSk7XG4gIH1cblxuICBzZWxlY3RXaGlsZVRlbXBsYXRlKHRlbXBsYXRlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIHRoaXMud2hpbGVJc0NoYW5naW5nVGVtcGxhdGUgPSBmYWxzZTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLWJnLXdoaXRlIGNxYS1weC00IGNxYS1weS0yIGZvci1sb29wLWJ1aWxkZXJcIj5cbiAgPCEtLSBIZWFkZXIgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1iLTRcIj5cbiAgICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtYmxhY2stMTAwIGNxYS1tLTBcIj5cbiAgICAgIHt7IGlzRWRpdE1vZGUgPyAnRWRpdCBsb29wIHN0ZXAnIDogJ0NyZWF0ZSBMb29wIFRlc3QgU3RlcCcgfX1cbiAgICA8L2gyPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICAqbmdJZj1cImlzRWRpdE1vZGUgJiYgc2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJyAmJiAhd2hpbGVJc0NoYW5naW5nVGVtcGxhdGVcIlxuICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgIGJ0blNpemU9XCJzbVwiXG4gICAgICBpY29uPVwic3dhcF9ob3JpelwiXG4gICAgICB0ZXh0PVwiQ2hhbmdlIFRlbXBsYXRlXCJcbiAgICAgIChjbGlja2VkKT1cIm9uV2hpbGVDaGFuZ2VUZW1wbGF0ZSgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICAqbmdJZj1cImlzRWRpdE1vZGUgJiYgc2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJyAmJiB3aGlsZUlzQ2hhbmdpbmdUZW1wbGF0ZVwiXG4gICAgICB2YXJpYW50PVwidGV4dFwiXG4gICAgICBidG5TaXplPVwic21cIlxuICAgICAgdGV4dD1cIkNhbmNlbFwiXG4gICAgICAoY2xpY2tlZCk9XCJvbldoaWxlQ2FuY2VsQ2hhbmdlVGVtcGxhdGUoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMb29wIFR5cGUgU2VsZWN0aW9uOiBpbiBlZGl0IG1vZGUgc2hvdyBvbmx5IHRoZSBjdXJyZW50IHR5cGUgKEZvciBvciBXaGlsZSk7IGluIGNyZWF0ZSBtb2RlIHNob3cgYm90aCAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1tYi00IGNxYS13LWZ1bGxcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNFZGl0TW9kZVwiIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtZ2FwLTBcIiBzdHlsZT1cImhlaWdodDogMzBweDsgYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjtcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtcHgtMyBjcWEtdGV4dC1bIzExMTgyN11cIj57eyBzZWxlY3RlZExvb3BUeXBlID09PSAnd2hpbGUnID8gJ1doaWxlJyA6ICdGb3InIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhaXNFZGl0TW9kZVwiIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtZ2FwLTBcIiBzdHlsZT1cImhlaWdodDogMzBweDsgYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjtcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXctMS8yIGNxYS10ZXh0LVsxMnB4XSBjcWEtcm91bmRlZC1tZCBjcWEtZm9udC1tZWRpdW0gY3FhLXRyYW5zaXRpb24tYWxsIGNxYS1kdXJhdGlvbi0yMDAgY3FhLWVhc2UtaW4tb3V0IGNxYS1taW4tdy1bODBweF0gY3FhLXRleHQtY2VudGVyIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InID8gJyMzRjQzRUUnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgIFtzdHlsZS5jb2xvcl09XCJzZWxlY3RlZExvb3BUeXBlID09PSAnZm9yJyA/ICcjRkZGRkZGJyA6ICcjNkI3MjgwJ1wiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItcmFkaXVzXT1cIic4cHgnXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCInMjJweCdcIlxuICAgICAgICAoY2xpY2spPVwib25Mb29wVHlwZUNoYW5nZSgnZm9yJylcIj5cbiAgICAgICAgRm9yXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXctMS8yIGNxYS10ZXh0LVsxMnB4XSBjcWEtcm91bmRlZC1tZCBjcWEtZm9udC1tZWRpdW0gY3FhLXRyYW5zaXRpb24tYWxsIGNxYS1kdXJhdGlvbi0yMDAgY3FhLWVhc2UtaW4tb3V0IGNxYS1taW4tdy1bODBweF0gY3FhLXRleHQtY2VudGVyIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICd3aGlsZScgPyAnIzNGNDNFRScgOiAndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgW3N0eWxlLmNvbG9yXT1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICd3aGlsZScgPyAnI0ZGRkZGRicgOiAnIzZCNzI4MCdcIlxuICAgICAgICBbc3R5bGUuYm9yZGVyLXJhZGl1c109XCInOHB4J1wiXG4gICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiJzIycHgnXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uTG9vcFR5cGVDaGFuZ2UoJ3doaWxlJylcIj5cbiAgICAgICAgV2hpbGVcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEZvcm0gRmllbGRzIC0tPlxuICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InXCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00IGNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0b1wiPlxuICAgIDwhLS0gRHJvcGRvd24gRmllbGRzIFJvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC00IGNxYS1mbGV4LXdyYXBcIj5cbiAgICAgIDwhLS0gU2VsZWN0IE9wdGlvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMVwiIHN0eWxlPVwibWluLXdpZHRoOiBjYWxjKDI1JSAtIDEycHgpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEuNVwiPlxuICAgICAgICAgIFNlbGVjdCBPcHRpb25cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cInNlbGVjdE9wdGlvbkNvbmZpZ1wiPlxuICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9vcEZvcm0uZ2V0KCdzZWxlY3RPcHRpb24nKT8udmFsdWUgPT09ICdkYXRhUHJvZmlsZSdcIj5cbiAgICAgIDwhLS0gRGF0YSBQcm9maWxlIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgRGF0YSBQcm9maWxlXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICBbZm9ybV09XCJsb29wRm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJkYXRhUHJvZmlsZUNvbmZpZ1wiXG4gICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlYXJjaERhdGFQcm9maWxlcygkZXZlbnQucXVlcnkpXCJcbiAgICAgICAgICAobG9hZE1vcmUpPVwib25Mb2FkTW9yZURhdGFQcm9maWxlcygkZXZlbnQpXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTG9vcCBTdGFydCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMVwiIHN0eWxlPVwibWluLXdpZHRoOiBjYWxjKDI1JSAtIDEycHgpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEuNVwiPlxuICAgICAgICAgIExvb3AgU3RhcnRcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImxvb3BTdGFydENvbmZpZ1wiPlxuICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIExvb3AgRW5kIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgTG9vcCBFbmRcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImxvb3BFbmRDb25maWdcIj5cbiAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvb3BGb3JtLmdldCgnc2VsZWN0T3B0aW9uJyk/LnZhbHVlID09PSAncnVuVGltZSdcIj5cbiAgICAgICAgPCEtLSBSdW4gVGltZSBJbnB1dCBGaWVsZCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xLjVcIj5cbiAgICAgICAgICAgIFJ1biBUaW1lXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidFbnRlciBSdW4gVGltZSdcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImxvb3BGb3JtLmdldCgncnVuVGltZScpPy52YWx1ZVwiXG4gICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImxvb3BGb3JtLmdldCgncnVuVGltZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtdy1mdWxsXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuICBjcWEtZ2FwLTIgY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1wLTAgY3FhLW1iLTEuNVwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVBZHZhbmNlZCgpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdXCI+QWR2YW5jZWQ8L3NwYW4+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LWJhc2VcIiBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiYWR2YW5jZWRFeHBhbmRlZFwiPlxuICAgICAgICAgIGV4cGFuZF9tb3JlXG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXYgKm5nSWY9XCJhZHZhbmNlZEV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtbXQtMlwiPlxuICAgICAgICA8Y3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtIFxuICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlc109XCJhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzXCJcbiAgICAgICAgICBbYWR2YW5jZWRWYXJpYWJsZUZvcm1dPVwiYWR2YW5jZWRWYXJpYWJsZXNGb3JtXCJcbiAgICAgICAgICAodmFyaWFibGVCb29sZWFuQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICh2YXJpYWJsZVZhbHVlQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgIDwvY3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+IFxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJ1wiPlxuICAgIDxjcWEtc3RlcC1idWlsZGVyLWFjdGlvblxuICAgICAgW3Nob3dIZWFkZXJdPVwiZmFsc2VcIlxuICAgICAgW2NvbXB1dGVIdG1sR3JhbW1hckZuXT1cImNvbXB1dGVIdG1sR3JhbW1hckZuXCJcbiAgICAgIFtjaGFuZ2VUZW1wbGF0ZVNpZ25hbF09XCJ3aGlsZUNoYW5nZVRlbXBsYXRlU2lnbmFsXCJcbiAgICAgIFtjYW5jZWxDaGFuZ2VUZW1wbGF0ZVNpZ25hbF09XCJ3aGlsZUNhbmNlbENoYW5nZVRlbXBsYXRlU2lnbmFsXCJcbiAgICAgIFt0ZW1wbGF0ZXNdPVwid2hpbGVUZW1wbGF0ZXNcIlxuICAgICAgW3NldFRlbXBsYXRlVmFyaWFibGVzXT1cInNldFdoaWxlVGVtcGxhdGVWYXJpYWJsZXNcIlxuICAgICAgW3NldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXNdPVwic2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlc1wiXG4gICAgICBbZWRpdE1vZGVdPVwiaXNFZGl0TW9kZVwiXG4gICAgICBbaXNEZWJ1Z109XCJpc0RlYnVnXCJcbiAgICAgIFtpbml0aWFsVGVtcGxhdGVdPVwic2VsZWN0ZWRXaGlsZVRlbXBsYXRlXCJcbiAgICAgIFtpbml0aWFsRGVzY3JpcHRpb25dPVwic2VsZWN0ZWRXaGlsZURlc2NyaXB0aW9uXCJcbiAgICAgIFtpbml0aWFsTWV0YWRhdGFdPVwic2VsZWN0ZWRXaGlsZU1ldGFkYXRhXCJcbiAgICAgIFtzZWFyY2hQbGFjZWhvbGRlcl09XCJ3aGlsZVNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgIFtlbGVtZW50T3B0aW9uc109XCJlbGVtZW50T3B0aW9uc1wiXG4gICAgICBbaGFzTW9yZUVsZW1lbnRzXT1cImhhc01vcmVFbGVtZW50c1wiXG4gICAgICBbaXNMb2FkaW5nRWxlbWVudHNdPVwiaXNMb2FkaW5nRWxlbWVudHNcIlxuICAgICAgW3NjcmVlbk5hbWVPcHRpb25zXT1cInNjcmVlbk5hbWVPcHRpb25zXCJcbiAgICAgIFtoYXNNb3JlU2NyZWVuTmFtZXNdPVwiaGFzTW9yZVNjcmVlbk5hbWVzXCJcbiAgICAgIFtpc0xvYWRpbmdTY3JlZW5OYW1lc109XCJpc0xvYWRpbmdTY3JlZW5OYW1lc1wiXG4gICAgICBbcGFyYW1ldGVyT3B0aW9uc109XCJwYXJhbWV0ZXJPcHRpb25zXCJcbiAgICAgIFtoYXNNb3JlUGFyYW1ldGVyc109XCJoYXNNb3JlUGFyYW1ldGVyc1wiXG4gICAgICBbaXNMb2FkaW5nUGFyYW1ldGVyc109XCJpc0xvYWRpbmdQYXJhbWV0ZXJzXCJcbiAgICAgIFtlbnZpcm9ubWVudE9wdGlvbnNdPVwiZW52aXJvbm1lbnRPcHRpb25zXCJcbiAgICAgIFtoYXNNb3JlRW52aXJvbm1lbnRzXT1cImhhc01vcmVFbnZpcm9ubWVudHNcIlxuICAgICAgW2lzTG9hZGluZ0Vudmlyb25tZW50c109XCJpc0xvYWRpbmdFbnZpcm9ubWVudHNcIlxuICAgICAgW2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZF09XCJkZWZhdWx0VGVzdERhdGFQcm9maWxlSWRcIlxuICAgICAgW2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXhdPVwiZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleFwiXG4gICAgICAodGVtcGxhdGVDaGFuZ2VkKT1cInNlbGVjdFdoaWxlVGVtcGxhdGUoJGV2ZW50KVwiXG4gICAgICAoY2FuY2VsbGVkKT1cIm9uQ2FuY2VsKClcIlxuICAgICAgKGNyZWF0ZVN0ZXApPVwiY3JlYXRlV2hpbGVTdGVwKCRldmVudClcIlxuICAgICAgKGxvYWRNb3JlRWxlbWVudHMpPVwibG9hZE1vcmVFbGVtZW50cy5lbWl0KClcIlxuICAgICAgKHNlYXJjaEVsZW1lbnRzKT1cInNlYXJjaEVsZW1lbnRzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAoc2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUpPVwic2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChjcmVhdGVFbGVtZW50KT1cImNyZWF0ZUVsZW1lbnQuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChzZWFyY2hTY3JlZW5OYW1lKT1cInNlYXJjaFNjcmVlbk5hbWUuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChsb2FkTW9yZVNjcmVlbk5hbWVzKT1cImxvYWRNb3JlU2NyZWVuTmFtZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCk9XCJjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdC5lbWl0KCRldmVudClcIlxuICAgICAgKHNlYXJjaFBhcmFtZXRlcnMpPVwic2VhcmNoUGFyYW1ldGVycy5lbWl0KCRldmVudClcIlxuICAgICAgKGxvYWRNb3JlUGFyYW1ldGVycyk9XCJsb2FkTW9yZVBhcmFtZXRlcnMuZW1pdCgpXCJcbiAgICAgIChzZWFyY2hFbnZpcm9ubWVudHMpPVwic2VhcmNoRW52aXJvbm1lbnRzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAobG9hZE1vcmVFbnZpcm9ubWVudHMpPVwibG9hZE1vcmVFbnZpcm9ubWVudHMuZW1pdCgpXCJcbiAgICAgIChyZWRpcmVjdFRvUGFyYW1ldGVyKT1cInJlZGlyZWN0VG9QYXJhbWV0ZXIuZW1pdCgpXCJcbiAgICAgIChyZWRpcmVjdFRvRW52aXJvbm1lbnQpPVwicmVkaXJlY3RUb0Vudmlyb25tZW50LmVtaXQoKVwiXG4gICAgICAoY2FuY2VsRWxlbWVudEZvcm0pPVwiY2FuY2VsRWxlbWVudEZvcm0uZW1pdCgpXCI+XG4gICAgPC9jcWEtc3RlcC1idWlsZGVyLWFjdGlvbj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBBY3Rpb24gQnV0dG9uczogQXBwbHkgb25seSB3aGVuIGlzRGVidWcgKyBleGlzdGluZyBzdGVwIChpc0VkaXRNb2RlKSwgZWxzZSBDcmVhdGUgU3RlcCAtLT5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1nYXAtMiBjcWEtbXQtNiBjcWEtcHQtNCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICBjbGFzcz1cImNxYS13LTEvMlwiXG4gICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgdGV4dD1cIkNhbmNlbFwiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8Y3FhLWJ1dHRvbiAqbmdJZj1cIiFpc0NyZWF0aW5nU3RlcFwiXG4gICAgICBjbGFzcz1cImNxYS13LTEvMlwiXG4gICAgICB2YXJpYW50PVwiZmlsbGVkXCJcbiAgICAgIFt0ZXh0XT1cImlzRWRpdE1vZGUgPyAnVXBkYXRlIFN0ZXAnIDogJ0NyZWF0ZSBTdGVwJ1wiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFpc0Zvcm1WYWxpZCgpXCJcbiAgICAgIChjbGlja2VkKT1cIm9uQ3JlYXRlU3RlcCgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxkaXYgKm5nSWY9XCJpc0NyZWF0aW5nU3RlcFwiIGNsYXNzPVwiY3FhLXctMS8yIGNxYS1mbGV4LTEgY3FhLW1pbi1oLVszOHB4XSBjcWEtcm91bmRlZC1bOHB4XVwiPlxuICAgICAgPGNxYS1iYWRnZSBsYWJlbD1cIkNyZWF0aW5n4oCmXCIgaWNvbj1cImF1dG9yZW5ld1wiIFtpc0xvYWRpbmddPVwidHJ1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFtjZW50ZXJDb250ZW50XT1cInRydWVcIlxuICAgICAgICBbaW5saW5lU3R5bGVzXT1cIidtaW4taGVpZ2h0OiAzOHB4OyBoZWlnaHQ6IDM4cHg7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOydcIlxuICAgICAgICB2YXJpYW50PVwiaW5mb1wiIHNpemU9XCJtZWRpdW1cIj48L2NxYS1iYWRnZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuIl19
|
|
755
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBZ0RoRixNQUFNLE9BQU8sd0JBQXdCO0lBc0luQyxZQUFvQixFQUFlO1FBQWYsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQXJJbkMsbUNBQW1DO1FBQzFCLGFBQVEsR0FBYSxLQUFLLENBQUM7UUFFcEMsNkNBQTZDO1FBQ3BDLGtCQUFhLEdBQVU7WUFDOUIsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUM7WUFDN0MsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUM7U0FDdEMsQ0FBQztRQUVGLGdGQUFnRjtRQUN2RSx1QkFBa0IsR0FBd0IsRUFBRSxDQUFDO1FBRXRELGdFQUFnRTtRQUN2RCx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFFOUMsc0NBQXNDO1FBQzdCLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUNoRCxrR0FBa0c7UUFDekYsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDekMsbUdBQW1HO1FBQzFGLDhCQUF5QixHQUF1QyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUs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QjtzQkFBNUIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBY3Rpb25UZW1wbGF0ZSB9IGZyb20gJy4uL3N0ZXAtYnVpbGRlci1hY3Rpb24vc3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQnO1xuXG4vLyBJbXBvcnQgRWxlbWVudCB0eXBlIC0gdXNpbmcgYW55IGZvciBub3cgc2luY2UgRWxlbWVudCBpcyBmcm9tIHRzLXBvcnRhbC11aVxuLy8gSW4gYSByZWFsIHNjZW5hcmlvLCB5b3UgbWlnaHQgd2FudCB0byBjcmVhdGUgYSBzaGFyZWQgaW50ZXJmYWNlIG9yIGltcG9ydCBmcm9tIGEgc2hhcmVkIHBhY2thZ2VcbmludGVyZmFjZSBFbGVtZW50IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgbG9jYXRvclZhbHVlPzogc3RyaW5nO1xuICBvdGhlckxvY2F0b3I/OiBzdHJpbmdbXTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgdHlwZSBMb29wVHlwZSA9ICdmb3InIHwgJ3doaWxlJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGRhdGEgcHJvZmlsZSBvcHRpb25cbiAqIEJhc2VkIG9uIFRlc3REYXRhIG1vZGVsIHN0cnVjdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFQcm9maWxlT3B0aW9uIHtcbiAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogQXJyYXkgb2YgZGF0YSBzZXRzIC0gbGVuZ3RoIGRldGVybWluZXMgYXZhaWxhYmxlIGxvb3AgaW5kaWNlcyAqL1xuICBkYXRhPzogYW55W107XG4gIC8qKiBPcHRpb25hbDogZGlyZWN0IGRhdGEgbGVuZ3RoIGlmIGRhdGEgYXJyYXkgaXMgbm90IHByb3ZpZGVkICovXG4gIGRhdGFMZW5ndGg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9vcEZvcm1EYXRhIHtcbiAgc2VsZWN0ZWRMb29wVHlwZTogTG9vcFR5cGU7XG4gIGxvb3BUeXBlOiBMb29wVHlwZTtcbiAgc2VsZWN0T3B0aW9uPzogc3RyaW5nO1xuICBkYXRhUHJvZmlsZT86IHN0cmluZyB8IG51bWJlcjtcbiAgbG9vcFN0YXJ0PzogbnVtYmVyIHwgc3RyaW5nO1xuICBsb29wRW5kPzogbnVtYmVyIHwgc3RyaW5nO1xuICBydW5UaW1lPzogc3RyaW5nO1xuICB3aGlsZVRlbXBsYXRlPzogYW55O1xuICBldmVudD86IGFueTtcbiAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcz86IGFueVtdO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1idWlsZGVyLWxvb3AnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH1cbn0pXG5leHBvcnQgY2xhc3MgU3RlcEJ1aWxkZXJMb29wQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKiogQ3VycmVudGx5IHNlbGVjdGVkIGxvb3AgdHlwZSAqL1xuICBASW5wdXQoKSBsb29wVHlwZTogTG9vcFR5cGUgPSAnZm9yJztcblxuICAvKiogT3B0aW9ucyBmb3IgdGhlIHNlbGVjdCBvcHRpb24gZHJvcGRvd24gKi9cbiAgQElucHV0KCkgc2VsZWN0T3B0aW9uczogYW55W10gPSBbXG4gICAge3ZhbHVlOiAnZGF0YVByb2ZpbGUnLCBsYWJlbDogJ0RhdGEgUHJvZmlsZSd9LFxuICAgIHt2YWx1ZTogJ3J1blRpbWUnLCBsYWJlbDogJ1J1biBUaW1lJ31cbiAgXTtcblxuICAvKiogT3B0aW9ucyBmb3IgdGhlIGRhdGEgcHJvZmlsZSBkcm9wZG93biAtIGFjY2VwdHMgRGF0YVByb2ZpbGVPcHRpb24gb2JqZWN0cyAqL1xuICBASW5wdXQoKSBkYXRhUHJvZmlsZU9wdGlvbnM6IERhdGFQcm9maWxlT3B0aW9uW10gPSBbXTtcblxuICAvKiogSW5kaWNhdGVzIGlmIG1vcmUgZGF0YSBwcm9maWxlcyBhcmUgYXZhaWxhYmxlIGZvciBsb2FkaW5nICovXG4gIEBJbnB1dCgpIGhhc01vcmVEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogTG9hZGluZyBzdGF0ZSBmb3IgZGF0YSBwcm9maWxlcyAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGNyZWF0aW5nIHRoZSBzdGVwIChBUEkgaW4gcHJvZ3Jlc3MpOyBzaG93IGxvYWRlciBvbiBDcmVhdGUgU3RlcCBidXR0b24gKi9cbiAgQElucHV0KCkgaXNDcmVhdGluZ1N0ZXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEZ1bmN0aW9uIHRvIGhhbmRsZSB2YXJpYWJsZSBwcm9jZXNzaW5nIG9yIGN1c3RvbSBsb2dpYy4gQ2FuIGJlIHBhc3NlZCBmcm9tIHBhcmVudCBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIHNldFdoaWxlVGVtcGxhdGVWYXJpYWJsZXM6ICh2YXJpYWJsZXM6IEFjdGlvblRlbXBsYXRlKSA9PiBhbnkgPSAoKSA9PiB7IHJldHVybiBbXX07XG4gIC8qKiBGdW5jdGlvbiB0byBoYW5kbGUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzLiBDYW4gYmUgcGFzc2VkIGZyb20gcGFyZW50IGNvbXBvbmVudC4gKi9cbiAgQElucHV0KCkgc2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogKHRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSwgdGVzdFN0ZXA/OiBhbnkpID0+IGFueVtdID0gKCkgPT4geyByZXR1cm4gW119O1xuXG4gIC8qKiBDZW50cmFsaXNlZCBIVE1MIGdyYW1tYXIgY29tcHV0YXRpb24gZnVuY3Rpb24uIFBhc3MgU3RlcEJ1aWxkZXJTZXJ2aWNlLmNvbXB1dGVIdG1sR3JhbW1hciBmcm9tIHRoZSBob3N0IGFwcC4gKi9cbiAgQElucHV0KCkgY29tcHV0ZUh0bWxHcmFtbWFyRm4/OiAodGVtcGxhdGU6IGFueSwgdmFyaWFibGVzOiBhbnlbXSkgPT4gc3RyaW5nO1xuXG4gIC8qKiBFbWl0IHdoZW4gc3RlcCBpcyBjcmVhdGVkICovXG4gIEBPdXRwdXQoKSBjcmVhdGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxMb29wRm9ybURhdGE+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBjYW5jZWxsZWQgKi9cbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogRW1pdCB3aGVuIGxvb3AgdHlwZSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBsb29wVHlwZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TG9vcFR5cGU+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBtb3JlIGRhdGEgcHJvZmlsZXMgbmVlZCB0byBiZSBsb2FkZWQgKi9cbiAgQE91dHB1dCgpIGxvYWRNb3JlRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBkYXRhIHByb2ZpbGUgc2VhcmNoIHF1ZXJ5IGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIHNlYXJjaERhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBASW5wdXQoKSB3aGlsZVRlbXBsYXRlczogYW55W10gPSBbXTtcbiAgQElucHV0KCkgd2hpbGVTZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlYXJjaCBXaGlsZSc7XG4gIEBJbnB1dCgpIHdoaWxlU2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuICBcbiAgLy8gRWxlbWVudCBmZXRjaGluZyBwcm9wZXJ0aWVzXG4gIEBJbnB1dCgpIGVsZW1lbnRPcHRpb25zOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBoYXNNb3JlRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNMb2FkaW5nRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8vIFNjcmVlbiBuYW1lIGZldGNoaW5nIHByb3BlcnRpZXNcbiAgQElucHV0KCkgc2NyZWVuTmFtZU9wdGlvbnM6IHsgaWQ/OiBudW1iZXI7IG5hbWU6IHN0cmluZyB9W10gPSBbXTtcbiAgQElucHV0KCkgaGFzTW9yZVNjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTG9hZGluZ1NjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvLyBQYXJhbWV0ZXIgZmV0Y2hpbmcgcHJvcGVydGllc1xuICBASW5wdXQoKSBwYXJhbWV0ZXJPcHRpb25zOiBhbnlbXSA9IFtdOyAvLyBUZXN0RGF0YVtdIC0gcmF3IHRlc3QgZGF0YSBwcm9maWxlc1xuICBASW5wdXQoKSBoYXNNb3JlUGFyYW1ldGVyczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0xvYWRpbmdQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvLyBFbnZpcm9ubWVudCBmZXRjaGluZyBwcm9wZXJ0aWVzXG4gIEBJbnB1dCgpIGVudmlyb25tZW50T3B0aW9uczogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGVudmlyb25tZW50OiBzdHJpbmcgfVtdID0gW107XG4gIEBJbnB1dCgpIGhhc01vcmVFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNMb2FkaW5nRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvLyBEZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIHByb3BlcnRpZXNcbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkPzogbnVtYmVyO1xuICBASW5wdXQoKSBkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4PzogbnVtYmVyO1xuICBASW5wdXQoKSBkZWZhdWx0VGVzdERhdGFFbmRJbmRleD86IG51bWJlcjtcbiAgQElucHV0KCkgaXNJbnNpZGVGb3JMb29wU3RlcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBXaGVuIHRydWUsIGhlYWRlciBhbmQgYnV0dG9uIHNob3cgZWRpdC91cGRhdGUgd29yZGluZyAoc2FtZSBhcyBhY3Rpb24gc3RlcCBidWlsZGVyIGluIGRlYnVnKS4gKi9cbiAgQElucHV0KCkgaXNEZWJ1ZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRXhpc3Rpbmcgc3RlcCB3aGVuIGVkaXRpbmc7IHVzZWQgd2l0aCBpc0RlYnVnIHRvIGRldGVybWluZSBlZGl0IG1vZGUuICovXG4gIEBJbnB1dCgpIHRlc3RTdGVwPzogYW55O1xuXG4gIGdldCBpc0VkaXRNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuaXNEZWJ1ZyAmJiAhISh0aGlzLnRlc3RTdGVwPy5pZCA/PyB0aGlzLnRlc3RTdGVwPy5zdGVwX2lkKTtcbiAgfVxuICBcbiAgQE91dHB1dCgpIGxvYWRNb3JlRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hFbGVtZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc2NyZWVuTmFtZUlkOiBudW1iZXI7IHNlYXJjaFRlcm0/OiBzdHJpbmcgfT4oKTsgLy8gRW1pdCB3aGVuIHNjcmVlbiBuYW1lIGlzIHNlbGVjdGVkIHRvIGZldGNoIGVsZW1lbnRzIGZpbHRlcmVkIGJ5IHNjcmVlbiBuYW1lXG4gIEBPdXRwdXQoKSBjcmVhdGVFbGVtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hTY3JlZW5OYW1lID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZVNjcmVlbk5hbWVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgY2FuY2VsRWxlbWVudEZvcm0gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hQYXJhbWV0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZVBhcmFtZXRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hFbnZpcm9ubWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGxvYWRNb3JlRW52aXJvbm1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVkaXJlY3RUb1BhcmFtZXRlciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlZGlyZWN0VG9FbnZpcm9ubWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgXG4gIHNlbGVjdGVkV2hpbGVUZW1wbGF0ZTogYW55ID0gbnVsbDtcbiAgc2VsZWN0ZWRXaGlsZURlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcbiAgc2VsZWN0ZWRXaGlsZU1ldGFkYXRhOiBzdHJpbmcgPSAnJztcbiAgc2VsZWN0ZWRMb29wVHlwZTogTG9vcFR5cGUgPSAnZm9yJztcbiAgd2hpbGVDaGFuZ2VUZW1wbGF0ZVNpZ25hbDogbnVtYmVyID0gMDtcbiAgd2hpbGVDYW5jZWxDaGFuZ2VUZW1wbGF0ZVNpZ25hbDogbnVtYmVyID0gMDtcbiAgd2hpbGVJc0NoYW5naW5nVGVtcGxhdGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBvbldoaWxlQ2hhbmdlVGVtcGxhdGUoKTogdm9pZCB7XG4gICAgdGhpcy53aGlsZUlzQ2hhbmdpbmdUZW1wbGF0ZSA9IHRydWU7XG4gICAgdGhpcy53aGlsZUNoYW5nZVRlbXBsYXRlU2lnbmFsKys7XG4gIH1cblxuICBvbldoaWxlQ2FuY2VsQ2hhbmdlVGVtcGxhdGUoKTogdm9pZCB7XG4gICAgdGhpcy53aGlsZUlzQ2hhbmdpbmdUZW1wbGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMud2hpbGVDYW5jZWxDaGFuZ2VUZW1wbGF0ZVNpZ25hbCsrO1xuICB9XG4gIFxuICAvLyBTaW5nbGUgRm9ybUdyb3VwIGNvbnRhaW5pbmcgYWxsIGZvdXIgZmllbGRzXG4gIGxvb3BGb3JtOiBGb3JtR3JvdXA7XG5cbiAgLy8gQWR2YW5jZWQgc2V0dGluZ3Mgc3RhdGUgKHNhbWUgcGF0dGVybiBhcyBhY3Rpb24gc3RlcCBidWlsZGVyKVxuICBhZHZhbmNlZEV4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogYW55W10gPSBbXTtcbiAgYWR2YW5jZWRWYXJpYWJsZXNGb3JtOiBGb3JtQXJyYXk7XG5cbiAgLy8gQ29uZmlncyBmb3IgZHluYW1pYy1zZWxlY3QgY29tcG9uZW50c1xuICBzZWxlY3RPcHRpb25Db25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgZGF0YVByb2ZpbGVDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgbG9vcFN0YXJ0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGxvb3BFbmRDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuXG4gIC8vIEludGVybmFsIHN0YXRlIGZvciBtYW5hZ2luZyBsb29wIGluZGljZXNcbiAgcHJpdmF0ZSBzZWxlY3RlZERhdGFQcm9maWxlOiBEYXRhUHJvZmlsZU9wdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXJ0QXJyYXk6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgZW5kQXJyYXk6IG51bWJlcltdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICAvLyBJbml0aWFsaXplIHNpbmdsZSBGb3JtR3JvdXAgd2l0aCBhbGwgZmllbGRzXG4gICAgdGhpcy5sb29wRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgc2VsZWN0T3B0aW9uOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICBkYXRhUHJvZmlsZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxuICAgICAgbG9vcFN0YXJ0OiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICBsb29wRW5kOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICBydW5UaW1lOiBuZXcgRm9ybUNvbnRyb2wobnVsbClcbiAgICB9KTtcblxuICAgIC8vIEluaXRpYWxpemUgYWR2YW5jZWQgdmFyaWFibGVzIGZvcm1cbiAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuYXJyYXkoW10pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBjb25maWdzXG4gICAgdGhpcy5zZWxlY3RPcHRpb25Db25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RPcHRpb24nLFxuICAgICAgcGxhY2Vob2xkZXI6ICdzZWxlY3Qgb3B0aW9uJyxcbiAgICAgIHNlbGVjdGVkVmFsdWU6ICdkYXRhUHJvZmlsZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuc2VsZWN0T3B0aW9uc1xuICAgIH07XG4gICAgdGhpcy5kYXRhUHJvZmlsZUNvbmZpZyA9IHtcbiAgICAgIGtleTogJ2RhdGFQcm9maWxlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnZGF0YSBwcm9maWxlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVEYXRhUHJvZmlsZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRGF0YVByb2ZpbGVzLFxuICAgICAgb3B0aW9uczogW10sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRhdGFQcm9maWxlQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSB8fCAnJyk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmxvb3BTdGFydENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2xvb3BTdGFydCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ2xvb3Agc3RhcnQnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBbXSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uTG9vcFN0YXJ0Q2hhbmdlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMubG9vcEVuZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2xvb3BFbmQnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdsb29wIGVuZCcsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2UgaWYgbmVlZGVkXG4gICAgICB9XG4gICAgfTsgIFxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZExvb3BUeXBlID0gdGhpcy5sb29wVHlwZTtcbiAgICB0aGlzLnVwZGF0ZUNvbmZpZ3MoKTtcblxuICAgIC8vIEluaXRpYWxpemUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzIGZvciBsb29wIHN0ZXBzIChzYW1lIHR5cGUgYXMgb3RoZXIgc3RlcHMpXG4gICAgdGhpcy5pbml0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcygpO1xuXG4gICAgaWYgKHRoaXMuaXNFZGl0TW9kZSAmJiB0aGlzLnRlc3RTdGVwKSB7XG4gICAgICB0aGlzLnBhdGNoRm9ybUZyb21UZXN0U3RlcCgpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnBhdGNoRm9ybUZyb21UZXN0U3RlcCgpLCAwKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdE9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVDb25maWdzKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydkYXRhUHJvZmlsZU9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVDb25maWdzKCk7XG4gICAgICAvLyBJZiBhIGRhdGEgcHJvZmlsZSBpcyBhbHJlYWR5IHNlbGVjdGVkIGluIHRoZSBmb3JtLCB1cGRhdGUgbG9vcCBpbmRpY2VzIChkbyBub3QgcmUtcGF0Y2ggZnJvbSB0ZXN0U3RlcCBoZXJlLFxuICAgICAgLy8gYXMgdGhhdCB3b3VsZCBvdmVyd3JpdGUgdXNlcidzIGluLXByb2dyZXNzIGNoYW5nZSBmcm9tIFJ1biBUaW1lIHRvIERhdGEgUHJvZmlsZSB3aGVuIHRoZSBkcm9wZG93biBvcGVucylcbiAgICAgIGNvbnN0IGN1cnJlbnRQcm9maWxlSWQgPSB0aGlzLmxvb3BGb3JtLmdldCgnZGF0YVByb2ZpbGUnKT8udmFsdWU7XG4gICAgICBpZiAoY3VycmVudFByb2ZpbGVJZCkge1xuICAgICAgICB0aGlzLm9uRGF0YVByb2ZpbGVDaGFuZ2UoY3VycmVudFByb2ZpbGVJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydoYXNNb3JlRGF0YVByb2ZpbGVzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRGF0YVByb2ZpbGVzJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YVByb2ZpbGVDb25maWcoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2xvb3BUeXBlJ10pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9IHRoaXMubG9vcFR5cGU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0ZXN0U3RlcCddIHx8IGNoYW5nZXNbJ2lzRGVidWcnXSkge1xuICAgICAgaWYgKHRoaXMuaXNFZGl0TW9kZSAmJiB0aGlzLnRlc3RTdGVwKSB7XG4gICAgICAgIHRoaXMucGF0Y2hGb3JtRnJvbVRlc3RTdGVwKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd3aGlsZVRlbXBsYXRlcyddICYmIHRoaXMuaXNFZGl0TW9kZSAmJiB0aGlzLnRlc3RTdGVwICYmICF0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZSkge1xuICAgICAgdGhpcy5wYXRjaEZvcm1Gcm9tVGVzdFN0ZXAoKTtcbiAgICB9XG4gICAgLy8gTm90ZTogbG9vcFN0YXJ0T3B0aW9ucyBhbmQgbG9vcEVuZE9wdGlvbnMgYXJlIG5vdyBjYWxjdWxhdGVkIGR5bmFtaWNhbGx5XG4gICAgLy8gc28gdGhleSBkb24ndCBuZWVkIHRvIGJlIHVwZGF0ZWQgZnJvbSBpbnB1dHNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGxvb3Agc3RlcCB2YWx1ZXMgZnJvbSBzdGVwIChzYW1lIGZhbGxiYWNrcyBhcyB0ZXN0LWNhc2UtZGV0YWlsczogZGF0YU1hcEpzb24sIGRhdGFNYXBCZWFuLmZvcl9sb29wKS5cbiAgICovXG4gIHByaXZhdGUgZ2V0TG9vcFN0ZXBWYWx1ZShzdGVwOiBhbnksIGtleTogJ2Zvckxvb3BUZXN0RGF0YUlkJyB8ICdmb3JMb29wU3RhcnRJbmRleCcgfCAnZm9yTG9vcEVuZEluZGV4Jyk6IGFueSB7XG4gICAgY29uc3QgZGF0YU1hcCA9IHN0ZXA/LmRhdGFNYXBKc29uID8/IHN0ZXA/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcDtcbiAgICBjb25zdCBtYXBLZXkgPSBrZXkgPT09ICdmb3JMb29wVGVzdERhdGFJZCcgPyAndGVzdERhdGFJZCcgOiBrZXkgPT09ICdmb3JMb29wU3RhcnRJbmRleCcgPyAnc3RhcnRJbmRleCcgOiAnZW5kSW5kZXgnO1xuICAgIHJldHVybiBzdGVwPy5ba2V5XSA/PyBzdGVwPy5kYXRhTWFwSnNvbj8uW2tleV0gPz8gZGF0YU1hcD8uW21hcEtleV0gPz8gZGF0YU1hcD8uW2tleV07XG4gIH1cblxuICAvKipcbiAgICogUHJlLWZpbGwgdGhlIGZvcm0gZnJvbSBhbiBleGlzdGluZyBzdGVwIChlZGl0IG1vZGUpLiBEZWJ1ZyBvbmx5IOKAlCBvbmx5IHJ1bnMgd2hlbiBpc0RlYnVnIGlzIHRydWUuXG4gICAqIFVzZXMgc2FtZSBmYWxsYmFja3MgYXMgdGVzdC1jYXNlLWRldGFpbHMgKGRhdGFNYXBKc29uLCBkYXRhTWFwQmVhbi5mb3JfbG9vcCkgYW5kIGV4cGxpY2l0bHlcbiAgICogc2V0VmFsdWUgb24gY29udHJvbHMgc28gZHJvcGRvd25zIGJpbmQgKHBhdGNoVmFsdWUgY2FuIGJlIGlnbm9yZWQgYnkgZHluYW1pYy1zZWxlY3QgaW4gc29tZSB0aW1pbmcgY2FzZXMpLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXRjaEZvcm1Gcm9tVGVzdFN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRGVidWcgfHwgIXRoaXMudGVzdFN0ZXApIHJldHVybjtcbiAgICBjb25zdCBzdGVwID0gdGhpcy50ZXN0U3RlcCBhcyBhbnk7XG4gICAgY29uc3QgaXNXaGlsZSA9IHN0ZXAudGVzdFN0ZXBUeXBlID09PSAnV0hJTEVfTE9PUCcgfHwgc3RlcC50eXBlID09PSAnV0hJTEVfTE9PUCc7XG4gICAgdGhpcy5zZWxlY3RlZExvb3BUeXBlID0gaXNXaGlsZSA/ICd3aGlsZScgOiAnZm9yJztcblxuICAgIGlmICh0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InKSB7XG4gICAgICBjb25zdCBpc1J1blRpbWUgPSAhIXN0ZXAuaXNSdW5UaW1lO1xuICAgICAgY29uc3Qgc2VsZWN0T3B0aW9uID0gaXNSdW5UaW1lID8gJ3J1blRpbWUnIDogJ2RhdGFQcm9maWxlJztcbiAgICAgIGNvbnN0IHByb2ZpbGVJZCA9IGlzUnVuVGltZSA/IG51bGwgOiAodGhpcy5nZXRMb29wU3RlcFZhbHVlKHN0ZXAsICdmb3JMb29wVGVzdERhdGFJZCcpID8/IG51bGwpO1xuICAgICAgY29uc3Qgc3RhcnRWYWwgPSBpc1J1blRpbWUgPyBudWxsIDogKHRoaXMuZ2V0TG9vcFN0ZXBWYWx1ZShzdGVwLCAnZm9yTG9vcFN0YXJ0SW5kZXgnKSA/PyBudWxsKTtcbiAgICAgIGNvbnN0IGVuZFZhbCA9IGlzUnVuVGltZSA/IG51bGwgOiAodGhpcy5nZXRMb29wU3RlcFZhbHVlKHN0ZXAsICdmb3JMb29wRW5kSW5kZXgnKSA/PyBudWxsKTtcbiAgICAgIGNvbnN0IHJ1blRpbWVWYWwgPSBpc1J1blRpbWUgPyAoc3RlcC50ZXN0RGF0YVZhbCA/PyBzdGVwLnRlc3REYXRhID8/ICcnKSA6IG51bGw7XG5cbiAgICAgIHRoaXMubG9vcEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIHNlbGVjdE9wdGlvbixcbiAgICAgICAgZGF0YVByb2ZpbGU6IHByb2ZpbGVJZCxcbiAgICAgICAgbG9vcFN0YXJ0OiBzdGFydFZhbCxcbiAgICAgICAgbG9vcEVuZDogZW5kVmFsLFxuICAgICAgICBydW5UaW1lOiBydW5UaW1lVmFsXG4gICAgICB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICAgIGlmICghaXNSdW5UaW1lICYmIHByb2ZpbGVJZCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMub25EYXRhUHJvZmlsZUNoYW5nZShwcm9maWxlSWQpO1xuICAgICAgICBjb25zdCBzdGFydCA9IHN0YXJ0VmFsID8/IHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wU3RhcnQnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IGVuZCA9IGVuZFZhbCA/PyB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy52YWx1ZTtcbiAgICAgICAgdGhpcy5sb29wRm9ybS5wYXRjaFZhbHVlKHsgbG9vcFN0YXJ0OiBzdGFydCwgbG9vcEVuZDogZW5kIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb29wRm9ybS5nZXQoJ3NlbGVjdE9wdGlvbicpPy5zZXRWYWx1ZShzZWxlY3RPcHRpb24sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGlmIChwcm9maWxlSWQgIT0gbnVsbCkgdGhpcy5sb29wRm9ybS5nZXQoJ2RhdGFQcm9maWxlJyk/LnNldFZhbHVlKHByb2ZpbGVJZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgaWYgKHN0YXJ0VmFsICE9IG51bGwpIHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wU3RhcnQnKT8uc2V0VmFsdWUoc3RhcnRWYWwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGlmIChlbmRWYWwgIT0gbnVsbCkgdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8uc2V0VmFsdWUoZW5kVmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICBpZiAocnVuVGltZVZhbCAhPSBudWxsICYmIHJ1blRpbWVWYWwgIT09ICcnKSB0aGlzLmxvb3BGb3JtLmdldCgncnVuVGltZScpPy5zZXRWYWx1ZShydW5UaW1lVmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIC8vIFByZS1maWxsIHRoZSB3aGlsZSBjb25kaXRpb24gdGVtcGxhdGUgZnJvbSB0aGUgY29uZGl0aW9uIGNoaWxkXG4gICAgICBjb25zdCBjb25kQ2hpbGQgPSBzdGVwLmNoaWxkcmVuPy5maW5kKChjOiBhbnkpID0+IGMuY29uZGl0aW9uVHlwZSA9PT0gJ0xPT1BfV0hJTEUnKTtcbiAgICAgIGlmIChjb25kQ2hpbGQpIHtcbiAgICAgICAgaWYgKGNvbmRDaGlsZC50ZW1wbGF0ZSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlID0gY29uZENoaWxkLnRlbXBsYXRlO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbmRDaGlsZC5uYXR1cmFsVGV4dEFjdGlvbklkICYmIHRoaXMud2hpbGVUZW1wbGF0ZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IG5sSWQgPSBOdW1iZXIoY29uZENoaWxkLm5hdHVyYWxUZXh0QWN0aW9uSWQpO1xuICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSB0aGlzLndoaWxlVGVtcGxhdGVzLmZpbmQoKHQ6IGFueSkgPT4gTnVtYmVyKHQuaWQpID09PSBubElkKTtcbiAgICAgICAgICBpZiAobWF0Y2hlZCkgdGhpcy5zZWxlY3RlZFdoaWxlVGVtcGxhdGUgPSBtYXRjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25kQ2hpbGQuZGVzY3JpcHRpb24pIHRoaXMuc2VsZWN0ZWRXaGlsZURlc2NyaXB0aW9uID0gY29uZENoaWxkLmRlc2NyaXB0aW9uO1xuICAgICAgICBpZiAoY29uZENoaWxkLm1ldGFkYXRhKSB0aGlzLnNlbGVjdGVkV2hpbGVNZXRhZGF0YSA9IGNvbmRDaGlsZC5tZXRhZGF0YTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRTa2lwID0gISEoc3RlcC5zaG91bGRTa2lwID8/IHN0ZXAuZXZlbnQ/LnNob3VsZFNraXApO1xuICAgIGNvbnN0IHNraXBWYXIgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gJ3Nob3VsZFNraXAnKTtcbiAgICBpZiAoc2tpcFZhcikge1xuICAgICAgc2tpcFZhci52YWx1ZSA9IHNob3VsZFNraXA7XG4gICAgICB0aGlzLmJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzIGZvciBsb29wIHN0ZXBzLlxuICAgKiBGb3IgbG9vcHMsIHdlIGN1cnJlbnRseSBzdXBwb3J0IHRoZSBzYW1lIGdlbmVyaWMgYWR2YW5jZWQgZmxhZzogc2hvdWxkU2tpcC5cbiAgICovXG4gIHByaXZhdGUgaW5pdEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMoKTogdm9pZCB7XG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnc2hvdWxkU2tpcCcsXG4gICAgICAgIGxhYmVsOiAnU2tpcCB0aGlzIHN0ZXAgZHVyaW5nIGV4ZWN1dGlvbi4nLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgICAgfVxuICAgIF07XG5cbiAgICB0aGlzLmJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgcmVhY3RpdmUgZm9ybSBmb3IgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzIChtaXJyb3JzIGFjdGlvbiBzdGVwIGJlaGF2aW9yKS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgZm9ybSBhcnJheVxuICAgIHdoaWxlICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIC8vIEFkZCBmb3JtIGdyb3VwcyBmb3IgZWFjaCBhZHZhbmNlZCB2YXJpYWJsZVxuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIGxldCBkZWZhdWx0VmFsdWU6IGFueTtcbiAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlLnZhbHVlKSA/IHZhcmlhYmxlLnZhbHVlIDogW107XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoXG4gICAgICAgICAgdmFsdWVBcnJheS5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IHZhbHVlQXJyYXkubWFwKChpdGVtOiBzdHJpbmcpID0+IHRoaXMuZmIuY29udHJvbChpdGVtKSlcbiAgICAgICAgICAgIDogW3RoaXMuZmIuY29udHJvbCgnJyldXG4gICAgICAgICk7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGZvcm1BcnJheTtcbiAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YXJpYWJsZS52YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnZhbHVlID09PSB0cnVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAndHJ1ZScgfHwgdmFyaWFibGUudmFsdWUgPT09IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSB8fCAnJztcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiB2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnID8gZGVmYXVsdFZhbHVlIDogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICAgIHR5cGU6IFt2YXJpYWJsZS50eXBlIHx8ICdzdHJpbmcnXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCAnJ11cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb25maWdzKCk6IHZvaWQge1xuICAgIC8vIENvbnZlcnQgRGF0YVByb2ZpbGVPcHRpb25bXSB0byBTZWxlY3RPcHRpb25bXVxuICAgIHRoaXMuZGF0YVByb2ZpbGVDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmRhdGFQcm9maWxlQ29uZmlnLFxuICAgICAgb3B0aW9uczogdGhpcy5jb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zKSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZURhdGFQcm9maWxlcyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdEYXRhUHJvZmlsZXMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRhdGFQcm9maWxlQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSB8fCAnJyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICAvLyBMb29wIHN0YXJ0IGFuZCBlbmQgb3B0aW9ucyBhcmUgdXBkYXRlZCB3aGVuIGRhdGEgcHJvZmlsZSBpcyBzZWxlY3RlZFxuICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKG9wdGlvbnM6IERhdGFQcm9maWxlT3B0aW9uW10pOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgaWQ6IG9wdGlvbi5pZCxcbiAgICAgIHZhbHVlOiBvcHRpb24uaWQsXG4gICAgICBuYW1lOiBvcHRpb24ubmFtZSxcbiAgICAgIGxhYmVsOiBvcHRpb24ubmFtZVxuICAgIH0pKTtcbiAgfVxuICAvKipcbiAgICogSGFuZGxlIGRhdGEgcHJvZmlsZSBzZWxlY3Rpb24gYW5kIHVwZGF0ZSBsb29wIHN0YXJ0L2VuZCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIG9uRGF0YVByb2ZpbGVDaGFuZ2UocHJvZmlsZUlkOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5maW5kKHByb2ZpbGUgPT4gXG4gICAgICBwcm9maWxlLmlkID09PSBwcm9maWxlSWQgfHwgU3RyaW5nKHByb2ZpbGUuaWQpID09PSBTdHJpbmcocHJvZmlsZUlkKVxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWRQcm9maWxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVByb2ZpbGUgPSBzZWxlY3RlZFByb2ZpbGU7XG4gICAgICB0aGlzLnVwZGF0ZUxvb3BJbmRpY2VzRnJvbVByb2ZpbGUoc2VsZWN0ZWRQcm9maWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGFQcm9maWxlID0gbnVsbDtcbiAgICAgIHRoaXMuc3RhcnRBcnJheSA9IFtdO1xuICAgICAgdGhpcy5lbmRBcnJheSA9IFtdO1xuICAgICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBsb29wIGluZGljZXMgYmFzZWQgb24gc2VsZWN0ZWQgZGF0YSBwcm9maWxlXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUxvb3BJbmRpY2VzRnJvbVByb2ZpbGUocHJvZmlsZTogRGF0YVByb2ZpbGVPcHRpb24pOiB2b2lkIHtcbiAgICAvLyBDYWxjdWxhdGUgZGF0YSBsZW5ndGggZnJvbSBkYXRhIGFycmF5IG9yIHVzZSBwcm92aWRlZCBkYXRhTGVuZ3RoXG4gICAgbGV0IGRhdGFTZXRMZW5ndGggPSAxO1xuICAgIGlmIChwcm9maWxlLmRhdGEgJiYgQXJyYXkuaXNBcnJheShwcm9maWxlLmRhdGEpKSB7XG4gICAgICBkYXRhU2V0TGVuZ3RoID0gcHJvZmlsZS5kYXRhLmxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKHByb2ZpbGUuZGF0YUxlbmd0aCAmJiBwcm9maWxlLmRhdGFMZW5ndGggPiAwKSB7XG4gICAgICBkYXRhU2V0TGVuZ3RoID0gcHJvZmlsZS5kYXRhTGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBzdGFydCBhcnJheSBmcm9tIDEgdG8gZGF0YVNldExlbmd0aFxuICAgIHRoaXMuc3RhcnRBcnJheSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGRhdGFTZXRMZW5ndGggfSwgKF8sIGkpID0+IGkgKyAxKTtcbiAgICAvLyBJbml0aWFsaXplIGVuZCBhcnJheSBzYW1lIGFzIHN0YXJ0IGFycmF5XG4gICAgLy8gRW5kIGFycmF5IHdpbGwgYmUgdXBkYXRlZCB3aGVuIHN0YXJ0IGluZGV4IGlzIHNlbGVjdGVkXG4gICAgdGhpcy5lbmRBcnJheSA9IFsuLi50aGlzLnN0YXJ0QXJyYXldO1xuXG4gICAgLy8gU2V0IGRlZmF1bHQgdmFsdWVzIGlmIGZvcm0gaXMgZW1wdHlcbiAgICBjb25zdCBjdXJyZW50U3RhcnQgPSB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcFN0YXJ0Jyk/LnZhbHVlO1xuICAgIGNvbnN0IGN1cnJlbnRFbmQgPSB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy52YWx1ZTtcbiAgICBcbiAgICBpZiAoIWN1cnJlbnRTdGFydCAmJiB0aGlzLnN0YXJ0QXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BTdGFydCcpPy5zZXRWYWx1ZSh0aGlzLnN0YXJ0QXJyYXlbMF0pO1xuICAgIH1cbiAgICBpZiAoIWN1cnJlbnRFbmQgJiYgdGhpcy5lbmRBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy5zZXRWYWx1ZSh0aGlzLmVuZEFycmF5W3RoaXMuZW5kQXJyYXkubGVuZ3RoIC0gMV0pO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBsb29wIHN0YXJ0IGNoYW5nZSBhbmQgdXBkYXRlIGVuZCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIG9uTG9vcFN0YXJ0Q2hhbmdlKHN0YXJ0SW5kZXg6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZERhdGFQcm9maWxlIHx8ICFzdGFydEluZGV4KSB7XG4gICAgICB0aGlzLmVuZEFycmF5ID0gWy4uLnRoaXMuc3RhcnRBcnJheV07XG4gICAgICB0aGlzLnVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydElkeCA9IHR5cGVvZiBzdGFydEluZGV4ID09PSAnc3RyaW5nJyA/IHBhcnNlSW50KHN0YXJ0SW5kZXgpIDogc3RhcnRJbmRleDtcbiAgICBcbiAgICBpZiAoaXNOYU4oc3RhcnRJZHgpIHx8IHN0YXJ0SWR4IDwgMSkge1xuICAgICAgdGhpcy5lbmRBcnJheSA9IFsuLi50aGlzLnN0YXJ0QXJyYXldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFbmQgYXJyYXkgc2hvdWxkIGJlIGZyb20gc3RhcnRJbmRleCB0byBlbmQgb2YgZGF0YVxuICAgICAgLy8gQmFzZWQgb24gcmVmZXJlbmNlOiBlbmRBcnJheSA9IHN0YXJ0QXJyYXkuc3BsaWNlKHN0YXJ0SW5kZXggLSAxLCBzdGFydEFycmF5Lmxlbmd0aClcbiAgICAgIGNvbnN0IHN0YXJ0QXJyYXlDb3B5ID0gWy4uLnRoaXMuc3RhcnRBcnJheV07XG4gICAgICB0aGlzLmVuZEFycmF5ID0gc3RhcnRBcnJheUNvcHkuc2xpY2Uoc3RhcnRJZHggLSAxKTtcbiAgICB9XG5cbiAgICAvLyBBdXRvLXVwZGF0ZSBlbmQgaW5kZXggaWYgY3VycmVudCBlbmQgaXMgaW52YWxpZFxuICAgIGNvbnN0IGN1cnJlbnRFbmQgPSB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy52YWx1ZTtcbiAgICBjb25zdCBlbmRJZHggPSB0eXBlb2YgY3VycmVudEVuZCA9PT0gJ3N0cmluZycgPyBwYXJzZUludChjdXJyZW50RW5kKSA6IGN1cnJlbnRFbmQ7XG4gICAgXG4gICAgaWYgKCFjdXJyZW50RW5kIHx8IGlzTmFOKGVuZElkeCkgfHwgZW5kSWR4IDwgc3RhcnRJZHgpIHtcbiAgICAgIGlmICh0aGlzLmVuZEFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8uc2V0VmFsdWUodGhpcy5lbmRBcnJheVt0aGlzLmVuZEFycmF5Lmxlbmd0aCAtIDFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGlzcGxheSBuYW1lIGZvciBhIDEtYmFzZWQgcm93IGluZGV4IGZyb20gdGhlIHNlbGVjdGVkIHByb2ZpbGUncyBkYXRhIGFycmF5IChkYXRhW2luZGV4LTFdLm5hbWUpLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgbm8gbmFtZS4gTWF0Y2hlcyBsb29wLXN0ZXAgZWRpdCBtb2RlIGJlaGF2aW9yLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXREYXRhUm93TmFtZUZvck9uZUJhc2VkSW5kZXgob25lQmFzZWRJbmRleDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgcHJvZmlsZSA9IHRoaXMuc2VsZWN0ZWREYXRhUHJvZmlsZTtcbiAgICBpZiAoIXByb2ZpbGU/LmRhdGEgfHwgIUFycmF5LmlzQXJyYXkocHJvZmlsZS5kYXRhKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaWR4ID0gb25lQmFzZWRJbmRleCAtIDE7XG4gICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHByb2ZpbGUuZGF0YS5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJvdyA9IHByb2ZpbGUuZGF0YVtpZHhdO1xuICAgIHJldHVybiByb3cgJiYgKHJvdy5uYW1lICE9IG51bGwgPyBTdHJpbmcocm93Lm5hbWUpIDogbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgbGFiZWwgZm9yIGEgbG9vcCBpbmRleCBvcHRpb246IFwic2V0TmFtZSAobilcIiB3aGVuIHJvdyBoYXMgbmFtZSwgZWxzZSBcIlN0ZXAgKG4pXCIuXG4gICAqIE1hdGNoZXMgbG9vcC1zdGVwIGVkaXQgbW9kZSBkcm9wZG93biBkaXNwbGF5LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRMb29wSW5kZXhPcHRpb25MYWJlbChpZHg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3Qgcm93TmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KGlkeCk7XG4gICAgcmV0dXJuIHJvd05hbWUgPyBgJHtyb3dOYW1lfSAoJHtpZHh9KWAgOiBgU3RlcCAoJHtpZHh9KWA7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGxvb3Agc3RhcnQgYW5kIGVuZCBjb25maWcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVMb29wSW5kZXhPcHRpb25zKCk6IHZvaWQge1xuICAgIC8vIENvbnZlcnQgc3RhcnRBcnJheSB0byBTZWxlY3RPcHRpb25zIHdpdGggXCJTdGVwIChuKVwiIG9yIFwic2V0TmFtZSAobilcIiBsYWJlbHNcbiAgICBjb25zdCBzdGFydE9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gdGhpcy5zdGFydEFycmF5Lm1hcChpZHggPT4ge1xuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldExvb3BJbmRleE9wdGlvbkxhYmVsKGlkeCk7XG4gICAgICByZXR1cm4geyBpZDogaWR4LCB2YWx1ZTogaWR4LCBuYW1lOiBsYWJlbCwgbGFiZWwgfTtcbiAgICB9KTtcblxuICAgIC8vIENvbnZlcnQgZW5kQXJyYXkgdG8gU2VsZWN0T3B0aW9ucyB3aXRoIHNhbWUgbGFiZWwgZm9ybWF0XG4gICAgY29uc3QgZW5kT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSB0aGlzLmVuZEFycmF5Lm1hcChpZHggPT4ge1xuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldExvb3BJbmRleE9wdGlvbkxhYmVsKGlkeCk7XG4gICAgICByZXR1cm4geyBpZDogaWR4LCB2YWx1ZTogaWR4LCBuYW1lOiBsYWJlbCwgbGFiZWwgfTtcbiAgICB9KTtcblxuICAgIHRoaXMubG9vcFN0YXJ0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5sb29wU3RhcnRDb25maWcsXG4gICAgICBvcHRpb25zOiBbe2lkOiAtMSwgdmFsdWU6IC0xLCBuYW1lOiAnU3RhcnQnLCBsYWJlbDogJ1N0YXJ0J30sIC4uLnN0YXJ0T3B0aW9uc10sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkxvb3BTdGFydENoYW5nZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMubG9vcEVuZENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMubG9vcEVuZENvbmZpZyxcbiAgICAgIG9wdGlvbnM6IFsuLi5lbmRPcHRpb25zLHtpZDogLTEsIHZhbHVlOiAtMSwgbmFtZTogJ0VuZCcsIGxhYmVsOiAnRW5kJ31dLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2UgaWYgbmVlZGVkXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIG9uTG9vcFR5cGVDaGFuZ2UodHlwZTogc3RyaW5nIHwgTG9vcFR5cGUpOiB2b2lkIHtcbiAgICBjb25zdCBsb29wVHlwZSA9IHR5cGUgYXMgTG9vcFR5cGU7XG4gICAgdGhpcy5zZWxlY3RlZExvb3BUeXBlID0gbG9vcFR5cGU7XG4gICAgdGhpcy5sb29wVHlwZUNoYW5nZS5lbWl0KGxvb3BUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgdmlzaWJpbGl0eSBvZiB0aGUgQWR2YW5jZWQgc2V0dGluZ3Mgc2VjdGlvbi5cbiAgICovXG4gIHRvZ2dsZUFkdmFuY2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9ICF0aGlzLmFkdmFuY2VkRXhwYW5kZWQ7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGFkdmFuY2VkIGJvb2xlYW4gdmFyaWFibGUgY2hhbmdlIChlLmcuIHNob3VsZFNraXApLlxuICAgKi9cbiAgb25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGFkdmFuY2VkIG5vbi1ib29sZWFuIHZhbHVlIGNoYW5nZXMgKGtlcHQgZ2VuZXJpYyBmb3IgZnV0dXJlIHVzZSwgZS5nLiBzdHJfbGlzdCkuXG4gICAqL1xuICBvbkFkdmFuY2VkVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgICAgaWYgKHZhcmlhYmxlPy50eXBlICE9PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIGZvcm1Hcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZExvb3BUeXBlID09PSAnd2hpbGUnKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yICdmb3InIGxvb3AgdHlwZVxuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5sb29wRm9ybS52YWx1ZTtcbiAgICAgIGNvbnN0IHNlbGVjdE9wdGlvbiA9IGZvcm1WYWx1ZS5zZWxlY3RPcHRpb247XG4gICAgICBcbiAgICAgIGlmICghc2VsZWN0T3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHNlbGVjdE9wdGlvbiA9PT0gJ2RhdGFQcm9maWxlJykge1xuICAgICAgICAvLyBGb3IgZGF0YSBwcm9maWxlLCBuZWVkIGRhdGFQcm9maWxlLCBsb29wU3RhcnQsIGFuZCBsb29wRW5kXG4gICAgICAgIHJldHVybiAhIShmb3JtVmFsdWUuZGF0YVByb2ZpbGUgJiYgZm9ybVZhbHVlLmxvb3BTdGFydCAmJiBmb3JtVmFsdWUubG9vcEVuZCk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdE9wdGlvbiA9PT0gJ3J1blRpbWUnKSB7XG4gICAgICAgIC8vIEZvciBydW4gdGltZSwgbmVlZCBydW5UaW1lIHZhbHVlXG4gICAgICAgIHJldHVybiAhIShmb3JtVmFsdWUucnVuVGltZSAmJiBmb3JtVmFsdWUucnVuVGltZS50cmltKCkgIT09ICcnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9uQ3JlYXRlU3RlcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNGb3JtVmFsaWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFN5bmMgYWR2YW5jZWQgdmFyaWFibGVzIGZyb20gZm9ybSB0byBhcnJheSAoc2FtZSBwYXR0ZXJuIGFzIGFjdGlvbiBzdGVwKVxuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgICBpZiAoZm9ybUdyb3VwKSB7XG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGZvcm1Hcm91cC5nZXQoJ3ZhbHVlJyk/LnZhbHVlO1xuICAgICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3N0cl9saXN0JyAmJiBmb3JtVmFsdWUgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1WYWx1ZS5jb250cm9sc1xuICAgICAgICAgICAgLm1hcChjb250cm9sID0+IGNvbnRyb2wudmFsdWUpXG4gICAgICAgICAgICAuZmlsdGVyKCh2YWw6IHN0cmluZykgPT4gdmFsICYmIHZhbC50cmltKCkgIT09ICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5sb29wRm9ybS52YWx1ZTtcbiAgICBpZih0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIGlmKCF0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHN0ZXBEYXRhOiBMb29wRm9ybURhdGEgPSB7XG4gICAgICBzZWxlY3RlZExvb3BUeXBlOiB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgYXMgTG9vcFR5cGUsXG4gICAgICBsb29wVHlwZTogdGhpcy5zZWxlY3RlZExvb3BUeXBlLFxuICAgICAgc2VsZWN0T3B0aW9uOiBmb3JtVmFsdWUuc2VsZWN0T3B0aW9uIHx8IHVuZGVmaW5lZCxcbiAgICAgIGRhdGFQcm9maWxlOiBmb3JtVmFsdWUuZGF0YVByb2ZpbGUgfHwgdW5kZWZpbmVkLFxuICAgICAgbG9vcFN0YXJ0OiBmb3JtVmFsdWUubG9vcFN0YXJ0IHx8IHVuZGVmaW5lZCxcbiAgICAgIGxvb3BFbmQ6IGZvcm1WYWx1ZS5sb29wRW5kIHx8IHVuZGVmaW5lZCxcbiAgICAgIHJ1blRpbWU6IGZvcm1WYWx1ZS5ydW5UaW1lIHx8IHVuZGVmaW5lZCxcbiAgICAgIHdoaWxlVGVtcGxhdGU6IHRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlIHx8IHVuZGVmaW5lZCxcbiAgICAgIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlc1xuICAgIH07XG4gICAgY29uc29sZS5sb2coJ3N0ZXBEYXRhJywgc3RlcERhdGEpO1xuICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgfVxuXG4gIGNyZWF0ZVdoaWxlU3RlcChldmVudDogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ2NyZWF0ZVdoaWxlU3RlcCcsIGV2ZW50KTtcbiAgICBjb25zdCBzdGVwRGF0YTogTG9vcEZvcm1EYXRhID0ge1xuICAgICAgc2VsZWN0ZWRMb29wVHlwZTogdGhpcy5zZWxlY3RlZExvb3BUeXBlIGFzIExvb3BUeXBlLFxuICAgICAgbG9vcFR5cGU6IHRoaXMuc2VsZWN0ZWRMb29wVHlwZSBhcyBMb29wVHlwZSxcbiAgICAgIGV2ZW50OiBldmVudFxuICAgIH07XG4gICAgY29uc29sZS5sb2coJ3N0ZXBEYXRhJywgc3RlcERhdGEpO1xuICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VhcmNoIGV2ZW50IGZvciBkYXRhIHByb2ZpbGVzXG4gICAqL1xuICBvblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGxvYWRNb3JlIGV2ZW50IGZvciBkYXRhIHByb2ZpbGVzXG4gICAqL1xuICBvbkxvYWRNb3JlRGF0YVByb2ZpbGVzKGV2ZW50OiB7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoZXZlbnQucXVlcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBkYXRhIHByb2ZpbGUgY29uZmlnIHdoZW4gbG9hZGluZyBzdGF0ZSBvciBoYXNNb3JlIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlRGF0YVByb2ZpbGVDb25maWcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YVByb2ZpbGVDb25maWcpIHtcbiAgICAgIHRoaXMuZGF0YVByb2ZpbGVDb25maWcgPSB7XG4gICAgICAgIC4uLnRoaXMuZGF0YVByb2ZpbGVDb25maWcsXG4gICAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZURhdGFQcm9maWxlcyxcbiAgICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ0RhdGFQcm9maWxlc1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPSAnZm9yJztcbiAgICB0aGlzLnNlbGVjdGVkRGF0YVByb2ZpbGUgPSBudWxsO1xuICAgIHRoaXMuc3RhcnRBcnJheSA9IFtdO1xuICAgIHRoaXMuZW5kQXJyYXkgPSBbXTtcbiAgICB0aGlzLmxvb3BGb3JtLnJlc2V0KHtcbiAgICAgIHNlbGVjdE9wdGlvbjogbnVsbCxcbiAgICAgIGRhdGFQcm9maWxlOiBudWxsLFxuICAgICAgbG9vcFN0YXJ0OiBudWxsLFxuICAgICAgbG9vcEVuZDogbnVsbFxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICB9XG5cbiAgb25XaGlsZVNlYXJjaENoYW5nZShldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy53aGlsZVNlYXJjaFZhbHVlID0gZXZlbnQ7XG4gICAgdGhpcy5maWx0ZXJXaGlsZVRlbXBsYXRlcyhldmVudCk7XG4gIH1cblxuICBvbldoaWxlU2VhcmNoU3VibWl0KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uV2hpbGVTZWFyY2hDaGFuZ2UoZXZlbnQpO1xuICB9XG5cbiAgb25XaGlsZVNlYXJjaENsZWFyZWQoKTogdm9pZCB7XG4gICAgdGhpcy53aGlsZVNlYXJjaFZhbHVlID0gJyc7XG4gICAgdGhpcy5maWx0ZXJXaGlsZVRlbXBsYXRlcygnJyk7XG4gIH1cblxuICBmaWx0ZXJXaGlsZVRlbXBsYXRlcyhxdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53aGlsZVRlbXBsYXRlcyA9IHRoaXMud2hpbGVUZW1wbGF0ZXMuZmlsdGVyKHRlbXBsYXRlID0+IHRlbXBsYXRlLmh0bWxHcmFtbWFyLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkudG9Mb3dlckNhc2UoKSkgfHwgdGVtcGxhdGUubmF0dXJhbFRleHQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKSk7XG4gIH1cblxuICBzZWxlY3RXaGlsZVRlbXBsYXRlKHRlbXBsYXRlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIHRoaXMud2hpbGVJc0NoYW5naW5nVGVtcGxhdGUgPSBmYWxzZTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLWJnLXdoaXRlIGNxYS1weC00IGNxYS1weS0yIGZvci1sb29wLWJ1aWxkZXJcIj5cbiAgPCEtLSBIZWFkZXIgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1iLTRcIj5cbiAgICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtYmxhY2stMTAwIGNxYS1tLTBcIj5cbiAgICAgIHt7IGlzRWRpdE1vZGUgPyAnRWRpdCBsb29wIHN0ZXAnIDogJ0NyZWF0ZSBMb29wIFRlc3QgU3RlcCcgfX1cbiAgICA8L2gyPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICAqbmdJZj1cImlzRWRpdE1vZGUgJiYgc2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJyAmJiAhd2hpbGVJc0NoYW5naW5nVGVtcGxhdGVcIlxuICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgIGJ0blNpemU9XCJzbVwiXG4gICAgICBpY29uPVwic3dhcF9ob3JpelwiXG4gICAgICB0ZXh0PVwiQ2hhbmdlIFRlbXBsYXRlXCJcbiAgICAgIChjbGlja2VkKT1cIm9uV2hpbGVDaGFuZ2VUZW1wbGF0ZSgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICAqbmdJZj1cImlzRWRpdE1vZGUgJiYgc2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJyAmJiB3aGlsZUlzQ2hhbmdpbmdUZW1wbGF0ZVwiXG4gICAgICB2YXJpYW50PVwidGV4dFwiXG4gICAgICBidG5TaXplPVwic21cIlxuICAgICAgdGV4dD1cIkNhbmNlbFwiXG4gICAgICAoY2xpY2tlZCk9XCJvbldoaWxlQ2FuY2VsQ2hhbmdlVGVtcGxhdGUoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMb29wIFR5cGUgU2VsZWN0aW9uOiBpbiBlZGl0IG1vZGUgc2hvdyBvbmx5IHRoZSBjdXJyZW50IHR5cGUgKEZvciBvciBXaGlsZSk7IGluIGNyZWF0ZSBtb2RlIHNob3cgYm90aCAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1tYi00IGNxYS13LWZ1bGxcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNFZGl0TW9kZVwiIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtZ2FwLTBcIiBzdHlsZT1cImhlaWdodDogMzBweDsgYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjtcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtcHgtMyBjcWEtdGV4dC1bIzExMTgyN11cIj57eyBzZWxlY3RlZExvb3BUeXBlID09PSAnd2hpbGUnID8gJ1doaWxlJyA6ICdGb3InIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhaXNFZGl0TW9kZVwiIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtZ2FwLTBcIiBzdHlsZT1cImhlaWdodDogMzBweDsgYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjtcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXctMS8yIGNxYS10ZXh0LVsxMnB4XSBjcWEtcm91bmRlZC1tZCBjcWEtZm9udC1tZWRpdW0gY3FhLXRyYW5zaXRpb24tYWxsIGNxYS1kdXJhdGlvbi0yMDAgY3FhLWVhc2UtaW4tb3V0IGNxYS1taW4tdy1bODBweF0gY3FhLXRleHQtY2VudGVyIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InID8gJyMzRjQzRUUnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgIFtzdHlsZS5jb2xvcl09XCJzZWxlY3RlZExvb3BUeXBlID09PSAnZm9yJyA/ICcjRkZGRkZGJyA6ICcjNkI3MjgwJ1wiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItcmFkaXVzXT1cIic4cHgnXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCInMjJweCdcIlxuICAgICAgICAoY2xpY2spPVwib25Mb29wVHlwZUNoYW5nZSgnZm9yJylcIj5cbiAgICAgICAgRm9yXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXctMS8yIGNxYS10ZXh0LVsxMnB4XSBjcWEtcm91bmRlZC1tZCBjcWEtZm9udC1tZWRpdW0gY3FhLXRyYW5zaXRpb24tYWxsIGNxYS1kdXJhdGlvbi0yMDAgY3FhLWVhc2UtaW4tb3V0IGNxYS1taW4tdy1bODBweF0gY3FhLXRleHQtY2VudGVyIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICd3aGlsZScgPyAnIzNGNDNFRScgOiAndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgW3N0eWxlLmNvbG9yXT1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICd3aGlsZScgPyAnI0ZGRkZGRicgOiAnIzZCNzI4MCdcIlxuICAgICAgICBbc3R5bGUuYm9yZGVyLXJhZGl1c109XCInOHB4J1wiXG4gICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiJzIycHgnXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uTG9vcFR5cGVDaGFuZ2UoJ3doaWxlJylcIj5cbiAgICAgICAgV2hpbGVcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEZvcm0gRmllbGRzIC0tPlxuICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InXCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00IGNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0b1wiPlxuICAgIDwhLS0gRHJvcGRvd24gRmllbGRzIFJvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC00IGNxYS1mbGV4LXdyYXBcIj5cbiAgICAgIDwhLS0gU2VsZWN0IE9wdGlvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMVwiIHN0eWxlPVwibWluLXdpZHRoOiBjYWxjKDI1JSAtIDEycHgpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEuNVwiPlxuICAgICAgICAgIFNlbGVjdCBPcHRpb25cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cInNlbGVjdE9wdGlvbkNvbmZpZ1wiPlxuICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9vcEZvcm0uZ2V0KCdzZWxlY3RPcHRpb24nKT8udmFsdWUgPT09ICdkYXRhUHJvZmlsZSdcIj5cbiAgICAgIDwhLS0gRGF0YSBQcm9maWxlIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgRGF0YSBQcm9maWxlXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICBbZm9ybV09XCJsb29wRm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJkYXRhUHJvZmlsZUNvbmZpZ1wiXG4gICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlYXJjaERhdGFQcm9maWxlcygkZXZlbnQucXVlcnkpXCJcbiAgICAgICAgICAobG9hZE1vcmUpPVwib25Mb2FkTW9yZURhdGFQcm9maWxlcygkZXZlbnQpXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTG9vcCBTdGFydCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMVwiIHN0eWxlPVwibWluLXdpZHRoOiBjYWxjKDI1JSAtIDEycHgpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEuNVwiPlxuICAgICAgICAgIExvb3AgU3RhcnRcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImxvb3BTdGFydENvbmZpZ1wiPlxuICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIExvb3AgRW5kIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgTG9vcCBFbmRcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImxvb3BFbmRDb25maWdcIj5cbiAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvb3BGb3JtLmdldCgnc2VsZWN0T3B0aW9uJyk/LnZhbHVlID09PSAncnVuVGltZSdcIj5cbiAgICAgICAgPCEtLSBSdW4gVGltZSBJbnB1dCBGaWVsZCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xLjVcIj5cbiAgICAgICAgICAgIFJ1biBUaW1lXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidFbnRlciBSdW4gVGltZSdcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImxvb3BGb3JtLmdldCgncnVuVGltZScpPy52YWx1ZVwiXG4gICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImxvb3BGb3JtLmdldCgncnVuVGltZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtdy1mdWxsXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuICBjcWEtZ2FwLTIgY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1wLTAgY3FhLW1iLTEuNVwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVBZHZhbmNlZCgpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdXCI+QWR2YW5jZWQ8L3NwYW4+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LWJhc2VcIiBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiYWR2YW5jZWRFeHBhbmRlZFwiPlxuICAgICAgICAgIGV4cGFuZF9tb3JlXG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXYgKm5nSWY9XCJhZHZhbmNlZEV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtbXQtMlwiPlxuICAgICAgICA8Y3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtIFxuICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlc109XCJhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzXCJcbiAgICAgICAgICBbYWR2YW5jZWRWYXJpYWJsZUZvcm1dPVwiYWR2YW5jZWRWYXJpYWJsZXNGb3JtXCJcbiAgICAgICAgICAodmFyaWFibGVCb29sZWFuQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICh2YXJpYWJsZVZhbHVlQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgIDwvY3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+IFxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJ1wiPlxuICAgIDxjcWEtc3RlcC1idWlsZGVyLWFjdGlvblxuICAgICAgW3Nob3dIZWFkZXJdPVwiZmFsc2VcIlxuICAgICAgW2NvbXB1dGVIdG1sR3JhbW1hckZuXT1cImNvbXB1dGVIdG1sR3JhbW1hckZuXCJcbiAgICAgIFtjaGFuZ2VUZW1wbGF0ZVNpZ25hbF09XCJ3aGlsZUNoYW5nZVRlbXBsYXRlU2lnbmFsXCJcbiAgICAgIFtjYW5jZWxDaGFuZ2VUZW1wbGF0ZVNpZ25hbF09XCJ3aGlsZUNhbmNlbENoYW5nZVRlbXBsYXRlU2lnbmFsXCJcbiAgICAgIFt0ZW1wbGF0ZXNdPVwid2hpbGVUZW1wbGF0ZXNcIlxuICAgICAgW3NldFRlbXBsYXRlVmFyaWFibGVzXT1cInNldFdoaWxlVGVtcGxhdGVWYXJpYWJsZXNcIlxuICAgICAgW3NldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXNdPVwic2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlc1wiXG4gICAgICBbZWRpdE1vZGVdPVwiaXNFZGl0TW9kZVwiXG4gICAgICBbaXNEZWJ1Z109XCJpc0RlYnVnXCJcbiAgICAgIFtpbml0aWFsVGVtcGxhdGVdPVwic2VsZWN0ZWRXaGlsZVRlbXBsYXRlXCJcbiAgICAgIFtpbml0aWFsRGVzY3JpcHRpb25dPVwic2VsZWN0ZWRXaGlsZURlc2NyaXB0aW9uXCJcbiAgICAgIFtpbml0aWFsTWV0YWRhdGFdPVwic2VsZWN0ZWRXaGlsZU1ldGFkYXRhXCJcbiAgICAgIFtzZWFyY2hQbGFjZWhvbGRlcl09XCJ3aGlsZVNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgIFtlbGVtZW50T3B0aW9uc109XCJlbGVtZW50T3B0aW9uc1wiXG4gICAgICBbaGFzTW9yZUVsZW1lbnRzXT1cImhhc01vcmVFbGVtZW50c1wiXG4gICAgICBbaXNMb2FkaW5nRWxlbWVudHNdPVwiaXNMb2FkaW5nRWxlbWVudHNcIlxuICAgICAgW3NjcmVlbk5hbWVPcHRpb25zXT1cInNjcmVlbk5hbWVPcHRpb25zXCJcbiAgICAgIFtoYXNNb3JlU2NyZWVuTmFtZXNdPVwiaGFzTW9yZVNjcmVlbk5hbWVzXCJcbiAgICAgIFtpc0xvYWRpbmdTY3JlZW5OYW1lc109XCJpc0xvYWRpbmdTY3JlZW5OYW1lc1wiXG4gICAgICBbcGFyYW1ldGVyT3B0aW9uc109XCJwYXJhbWV0ZXJPcHRpb25zXCJcbiAgICAgIFtoYXNNb3JlUGFyYW1ldGVyc109XCJoYXNNb3JlUGFyYW1ldGVyc1wiXG4gICAgICBbaXNMb2FkaW5nUGFyYW1ldGVyc109XCJpc0xvYWRpbmdQYXJhbWV0ZXJzXCJcbiAgICAgIFtlbnZpcm9ubWVudE9wdGlvbnNdPVwiZW52aXJvbm1lbnRPcHRpb25zXCJcbiAgICAgIFtoYXNNb3JlRW52aXJvbm1lbnRzXT1cImhhc01vcmVFbnZpcm9ubWVudHNcIlxuICAgICAgW2lzTG9hZGluZ0Vudmlyb25tZW50c109XCJpc0xvYWRpbmdFbnZpcm9ubWVudHNcIlxuICAgICAgW2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZF09XCJkZWZhdWx0VGVzdERhdGFQcm9maWxlSWRcIlxuICAgICAgW2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXhdPVwiZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleFwiXG4gICAgICBbZGVmYXVsdFRlc3REYXRhRW5kSW5kZXhdPVwiZGVmYXVsdFRlc3REYXRhRW5kSW5kZXhcIlxuICAgICAgW2lzSW5zaWRlRm9yTG9vcFN0ZXBdPVwiaXNJbnNpZGVGb3JMb29wU3RlcFwiXG4gICAgICAodGVtcGxhdGVDaGFuZ2VkKT1cInNlbGVjdFdoaWxlVGVtcGxhdGUoJGV2ZW50KVwiXG4gICAgICAoY2FuY2VsbGVkKT1cIm9uQ2FuY2VsKClcIlxuICAgICAgKGNyZWF0ZVN0ZXApPVwiY3JlYXRlV2hpbGVTdGVwKCRldmVudClcIlxuICAgICAgKGxvYWRNb3JlRWxlbWVudHMpPVwibG9hZE1vcmVFbGVtZW50cy5lbWl0KClcIlxuICAgICAgKHNlYXJjaEVsZW1lbnRzKT1cInNlYXJjaEVsZW1lbnRzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAoc2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUpPVwic2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChjcmVhdGVFbGVtZW50KT1cImNyZWF0ZUVsZW1lbnQuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChzZWFyY2hTY3JlZW5OYW1lKT1cInNlYXJjaFNjcmVlbk5hbWUuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChsb2FkTW9yZVNjcmVlbk5hbWVzKT1cImxvYWRNb3JlU2NyZWVuTmFtZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCk9XCJjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdC5lbWl0KCRldmVudClcIlxuICAgICAgKHNlYXJjaFBhcmFtZXRlcnMpPVwic2VhcmNoUGFyYW1ldGVycy5lbWl0KCRldmVudClcIlxuICAgICAgKGxvYWRNb3JlUGFyYW1ldGVycyk9XCJsb2FkTW9yZVBhcmFtZXRlcnMuZW1pdCgpXCJcbiAgICAgIChzZWFyY2hFbnZpcm9ubWVudHMpPVwic2VhcmNoRW52aXJvbm1lbnRzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAobG9hZE1vcmVFbnZpcm9ubWVudHMpPVwibG9hZE1vcmVFbnZpcm9ubWVudHMuZW1pdCgpXCJcbiAgICAgIChyZWRpcmVjdFRvUGFyYW1ldGVyKT1cInJlZGlyZWN0VG9QYXJhbWV0ZXIuZW1pdCgpXCJcbiAgICAgIChyZWRpcmVjdFRvRW52aXJvbm1lbnQpPVwicmVkaXJlY3RUb0Vudmlyb25tZW50LmVtaXQoKVwiXG4gICAgICAoY2FuY2VsRWxlbWVudEZvcm0pPVwiY2FuY2VsRWxlbWVudEZvcm0uZW1pdCgpXCI+XG4gICAgPC9jcWEtc3RlcC1idWlsZGVyLWFjdGlvbj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBBY3Rpb24gQnV0dG9uczogQXBwbHkgb25seSB3aGVuIGlzRGVidWcgKyBleGlzdGluZyBzdGVwIChpc0VkaXRNb2RlKSwgZWxzZSBDcmVhdGUgU3RlcCAtLT5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1nYXAtMiBjcWEtbXQtNiBjcWEtcHQtNCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICBjbGFzcz1cImNxYS13LTEvMlwiXG4gICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgdGV4dD1cIkNhbmNlbFwiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8Y3FhLWJ1dHRvbiAqbmdJZj1cIiFpc0NyZWF0aW5nU3RlcFwiXG4gICAgICBjbGFzcz1cImNxYS13LTEvMlwiXG4gICAgICB2YXJpYW50PVwiZmlsbGVkXCJcbiAgICAgIFt0ZXh0XT1cImlzRWRpdE1vZGUgPyAnVXBkYXRlIFN0ZXAnIDogJ0NyZWF0ZSBTdGVwJ1wiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFpc0Zvcm1WYWxpZCgpXCJcbiAgICAgIChjbGlja2VkKT1cIm9uQ3JlYXRlU3RlcCgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxkaXYgKm5nSWY9XCJpc0NyZWF0aW5nU3RlcFwiIGNsYXNzPVwiY3FhLXctMS8yIGNxYS1mbGV4LTEgY3FhLW1pbi1oLVszOHB4XSBjcWEtcm91bmRlZC1bOHB4XVwiPlxuICAgICAgPGNxYS1iYWRnZSBsYWJlbD1cIkNyZWF0aW5n4oCmXCIgaWNvbj1cImF1dG9yZW5ld1wiIFtpc0xvYWRpbmddPVwidHJ1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFtjZW50ZXJDb250ZW50XT1cInRydWVcIlxuICAgICAgICBbaW5saW5lU3R5bGVzXT1cIidtaW4taGVpZ2h0OiAzOHB4OyBoZWlnaHQ6IDM4cHg7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOydcIlxuICAgICAgICB2YXJpYW50PVwiaW5mb1wiIHNpemU9XCJtZWRpdW1cIj48L2NxYS1iYWRnZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuIl19
|