@cqa-lib/cqa-ui 1.1.548-gamma.21 → 1.1.548-gamma.23

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.
@@ -883,10 +883,10 @@ export class StepBuilderActionComponent {
883
883
  }
884
884
  }
885
885
  StepBuilderActionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderActionComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
886
- StepBuilderActionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: { showHeader: "showHeader", changeTemplateSignal: "changeTemplateSignal", cancelChangeTemplateSignal: "cancelChangeTemplateSignal", templates: "templates", initialTemplate: "initialTemplate", initialDescription: "initialDescription", initialMetadata: "initialMetadata", isDebug: "isDebug", editMode: "editMode", searchPlaceholder: "searchPlaceholder", setTemplateVariables: "setTemplateVariables", setAdvancedSettingsVariables: "setAdvancedSettingsVariables", computeHtmlGrammarFn: "computeHtmlGrammarFn", preventSelectTemplate: "preventSelectTemplate", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", uploadOptions: "uploadOptions", hasMoreUploads: "hasMoreUploads", isLoadingUploads: "isLoadingUploads", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", globalVariableOptions: "globalVariableOptions", isLoadingGlobalVariables: "isLoadingGlobalVariables", testCaseEnvironmentName: "testCaseEnvironmentName", testCaseEnvironmentLabelSuffix: "testCaseEnvironmentLabelSuffix", environmentLegacyDeprecationMessage: "environmentLegacyDeprecationMessage", testCaseTestDataId: "testCaseTestDataId", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", defaultTestDataEndIndex: "defaultTestDataEndIndex", isInsideForLoopStep: "isInsideForLoopStep", hasTestDataProfile: "hasTestDataProfile", isCreatingStep: "isCreatingStep", elementScreenPrefill: "elementScreenPrefill" }, outputs: { templateChanged: "templateChanged", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchUploads: "searchUploads", loadMoreUploads: "loadMoreUploads", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", searchGlobalVariables: "searchGlobalVariables", createStep: "createStep", cancelled: "cancelled", redirectToParameter: "redirectToParameter", redirectToEnvironment: "redirectToEnvironment" }, host: { styleAttribute: "display: block;height: 100%;width: 100%;", classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "templateVariablesForm", first: true, predicate: TemplateVariablesFormComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-p-[16px]\" [ngClass]=\"{'cqa-px-4': showHeader, 'cqa-py-2': showHeader && !selectedTemplate}\">\n <!-- Header -->\n \n <div *ngIf=\"showHeader\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-m-0\">\n {{ isEditMode ? 'Edit an action step' : 'Create an action step' }}\n </h2>\n <cqa-button\n *ngIf=\"isEditMode && selectedTemplate\"\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"swap_horiz\"\n text=\"Change Template\"\n (clicked)=\"onChangeTemplate()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isEditMode && !selectedTemplate\"\n variant=\"text\"\n btnSize=\"sm\"\n text=\"Cancel\"\n (clicked)=\"onCancelTemplateSelection()\">\n </cqa-button>\n </div>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-action-format cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-6\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-overflow-y-auto\" style=\"flex: 1 1 0 !important;\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-2 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700 cqa-py-2\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"updatedHtmlGrammar || selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n \n <div class=\"cqa-flex cqa-justify-end cqa-pt-2 cqa-gap-2\" *ngIf=\"!createElementVisible\">\n <cqa-button \n *ngIf=\"selectorVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Element\"\n (clicked)=\"onShowElementForm()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"parameterVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Parameter\"\n (clicked)=\"redirectToParameter.emit()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"environmentVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Environment\"\n (clicked)=\"redirectToEnvironment.emit()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto cqa-flex-1 cqa-pb-2\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <!-- Env banner \u2014 surfaces which environment's variables and TDPs are in scope. -->\n <div *ngIf=\"testCaseEnvironmentName\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-3 cqa-px-3 cqa-py-2 cqa-rounded-md cqa-text-xs cqa-text-gray-700 cqa-bg-gray-50 cqa-border cqa-border-gray-200\">\n Using <strong class=\"cqa-font-semibold\">{{ testCaseEnvironmentName }} Environment</strong>\n <span class=\"cqa-text-gray-500\">\u00B7</span>\n <span class=\"cqa-text-gray-500\">Environment variables and data profiles are resolved from this environment.</span>\n </div>\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap cqa-pb-4\">\n <!-- Template Variables Form Component -->\n <cqa-template-variables-form\n #templateVariablesForm\n style=\"width: 100%;\"\n [isDebug]=\"isDebug\"\n [templateVariables]=\"templateVariables\"\n [variablesForm]=\"variablesForm\"\n [metadata]=\"metadata\"\n [description]=\"description\"\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 [uploadOptions]=\"uploadOptions\"\n [hasMoreUploads]=\"hasMoreUploads\"\n [isLoadingUploads]=\"isLoadingUploads\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [globalVariableOptions]=\"globalVariableOptions\"\n [isLoadingGlobalVariables]=\"isLoadingGlobalVariables\"\n [testCaseEnvironmentName]=\"testCaseEnvironmentName\"\n [testCaseEnvironmentLabelSuffix]=\"testCaseEnvironmentLabelSuffix\"\n [environmentLegacyDeprecationMessage]=\"environmentLegacyDeprecationMessage\"\n [testCaseTestDataId]=\"testCaseTestDataId\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [defaultTestDataEndIndex]=\"defaultTestDataEndIndex\"\n [isInsideForLoopStep]=\"isInsideForLoopStep\"\n [hasTestDataProfile]=\"hasTestDataProfile\"\n [createElementVisible]=\"createElementVisible\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"metadata = $event\"\n (descriptionChange)=\"description = $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 (searchUploads)=\"searchUploads.emit($event)\"\n (loadMoreUploads)=\"loadMoreUploads.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (searchGlobalVariables)=\"searchGlobalVariables.emit($event)\"\n (elementFormVisibilityChange)=\"onElementFormVisibilityChange($event)\">\n </cqa-template-variables-form>\n </div>\n\n <!-- Advanced (Expandable) -->\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 \n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div *ngIf=\"!createElementVisible\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200 cqa-pb-2\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" class=\"cqa-w-1/2\" variant=\"filled\" [text]=\"isEditMode ? 'Update Step' : 'Create Step'\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <!-- Loader slot: same size as Create Step button (lg: 38px height, full width, rounded-[8px]) -->\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge\n label=\"Creating\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i4.TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: ["templateVariables", "variablesForm", "metadata", "description", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "parameterOptions", "hasMoreParameters", "isLoadingParameters", "uploadOptions", "hasMoreUploads", "isLoadingUploads", "environmentOptions", "hasMoreEnvironments", "isLoadingEnvironments", "globalVariableOptions", "isLoadingGlobalVariables", "testCaseEnvironmentName", "testCaseEnvironmentLabelSuffix", "environmentLegacyDeprecationMessage", "testCaseTestDataId", "defaultTestDataProfileId", "defaultTestDataStartIndex", "defaultTestDataEndIndex", "isInsideForLoopStep", "hasTestDataProfile", "isEditInDepth", "isDebug", "createElementVisible"], outputs: ["variableValueChange", "variableBooleanChange", "metadataChange", "descriptionChange", "loadMoreElements", "searchElements", "searchElementsByScreenName", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "searchParameters", "loadMoreParameters", "searchUploads", "loadMoreUploads", "searchEnvironments", "loadMoreEnvironments", "searchGlobalVariables", "cancelElementForm", "elementFormVisibilityChange"] }, { 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.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: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
886
+ StepBuilderActionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: { showHeader: "showHeader", changeTemplateSignal: "changeTemplateSignal", cancelChangeTemplateSignal: "cancelChangeTemplateSignal", templates: "templates", initialTemplate: "initialTemplate", initialDescription: "initialDescription", initialMetadata: "initialMetadata", isDebug: "isDebug", editMode: "editMode", searchPlaceholder: "searchPlaceholder", setTemplateVariables: "setTemplateVariables", setAdvancedSettingsVariables: "setAdvancedSettingsVariables", computeHtmlGrammarFn: "computeHtmlGrammarFn", preventSelectTemplate: "preventSelectTemplate", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", uploadOptions: "uploadOptions", hasMoreUploads: "hasMoreUploads", isLoadingUploads: "isLoadingUploads", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", globalVariableOptions: "globalVariableOptions", isLoadingGlobalVariables: "isLoadingGlobalVariables", testCaseEnvironmentName: "testCaseEnvironmentName", testCaseEnvironmentLabelSuffix: "testCaseEnvironmentLabelSuffix", environmentLegacyDeprecationMessage: "environmentLegacyDeprecationMessage", testCaseTestDataId: "testCaseTestDataId", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", defaultTestDataEndIndex: "defaultTestDataEndIndex", isInsideForLoopStep: "isInsideForLoopStep", hasTestDataProfile: "hasTestDataProfile", isCreatingStep: "isCreatingStep", elementScreenPrefill: "elementScreenPrefill" }, outputs: { templateChanged: "templateChanged", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchUploads: "searchUploads", loadMoreUploads: "loadMoreUploads", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", searchGlobalVariables: "searchGlobalVariables", createStep: "createStep", cancelled: "cancelled", redirectToParameter: "redirectToParameter", redirectToEnvironment: "redirectToEnvironment" }, host: { styleAttribute: "display: block;height: 100%;width: 100%;", classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "templateVariablesForm", first: true, predicate: TemplateVariablesFormComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-p-[16px]\" [ngClass]=\"{'cqa-px-4': showHeader, 'cqa-py-2': showHeader && !selectedTemplate}\">\n <!-- Header -->\n \n <div *ngIf=\"showHeader\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-m-0\">\n {{ isEditMode ? 'Edit an action step' : 'Create an action step' }}\n </h2>\n <cqa-button\n *ngIf=\"isEditMode && selectedTemplate\"\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"swap_horiz\"\n text=\"Change Template\"\n (clicked)=\"onChangeTemplate()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isEditMode && !selectedTemplate\"\n variant=\"text\"\n btnSize=\"sm\"\n text=\"Cancel\"\n (clicked)=\"onCancelTemplateSelection()\">\n </cqa-button>\n </div>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-action-format cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-6\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-overflow-y-auto\" style=\"flex: 1 1 0 !important;\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-2 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700 cqa-py-2\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"updatedHtmlGrammar || selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n \n <div class=\"cqa-flex cqa-justify-end cqa-pt-2 cqa-gap-2\" *ngIf=\"!createElementVisible\">\n <cqa-button \n *ngIf=\"selectorVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Element\"\n (clicked)=\"onShowElementForm()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"parameterVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Parameter\"\n (clicked)=\"redirectToParameter.emit()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"environmentVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Environment\"\n (clicked)=\"redirectToEnvironment.emit()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto cqa-flex-1 cqa-pb-2\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <!-- Env banner \u2014 surfaces which environment's variables and TDPs are in scope. -->\n <div *ngIf=\"testCaseEnvironmentName\"\n class=\"cqa-flex cqa-flex-col cqa-items-start cqa-gap-1 cqa-mb-3 cqa-px-3 cqa-py-2 cqa-rounded-md cqa-text-xs cqa-text-gray-700 cqa-bg-gray-50 cqa-border cqa-border-gray-200\">\n <div>\n Using\n <strong class=\"cqa-font-semibold\">{{ testCaseEnvironmentName }} Environment<ng-container *ngIf=\"testCaseEnvironmentLabelSuffix\"> (Default)</ng-container></strong>\n <span class=\"cqa-text-gray-500\"> \u00B7 </span>\n <span class=\"cqa-text-gray-500\">Environment variables and data profiles are resolved from this environment.</span>\n </div>\n <div *ngIf=\"testCaseEnvironmentLabelSuffix\" class=\"cqa-text-gray-500\">\n Set an environment on the test case to override this default.\n </div>\n </div>\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap cqa-pb-4\">\n <!-- Template Variables Form Component -->\n <cqa-template-variables-form\n #templateVariablesForm\n style=\"width: 100%;\"\n [isDebug]=\"isDebug\"\n [templateVariables]=\"templateVariables\"\n [variablesForm]=\"variablesForm\"\n [metadata]=\"metadata\"\n [description]=\"description\"\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 [uploadOptions]=\"uploadOptions\"\n [hasMoreUploads]=\"hasMoreUploads\"\n [isLoadingUploads]=\"isLoadingUploads\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [globalVariableOptions]=\"globalVariableOptions\"\n [isLoadingGlobalVariables]=\"isLoadingGlobalVariables\"\n [testCaseEnvironmentName]=\"testCaseEnvironmentName\"\n [testCaseEnvironmentLabelSuffix]=\"testCaseEnvironmentLabelSuffix\"\n [environmentLegacyDeprecationMessage]=\"environmentLegacyDeprecationMessage\"\n [testCaseTestDataId]=\"testCaseTestDataId\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [defaultTestDataEndIndex]=\"defaultTestDataEndIndex\"\n [isInsideForLoopStep]=\"isInsideForLoopStep\"\n [hasTestDataProfile]=\"hasTestDataProfile\"\n [createElementVisible]=\"createElementVisible\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"metadata = $event\"\n (descriptionChange)=\"description = $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 (searchUploads)=\"searchUploads.emit($event)\"\n (loadMoreUploads)=\"loadMoreUploads.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (searchGlobalVariables)=\"searchGlobalVariables.emit($event)\"\n (elementFormVisibilityChange)=\"onElementFormVisibilityChange($event)\">\n </cqa-template-variables-form>\n </div>\n\n <!-- Advanced (Expandable) -->\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 \n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div *ngIf=\"!createElementVisible\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200 cqa-pb-2\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" class=\"cqa-w-1/2\" variant=\"filled\" [text]=\"isEditMode ? 'Update Step' : 'Create Step'\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <!-- Loader slot: same size as Create Step button (lg: 38px height, full width, rounded-[8px]) -->\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge\n label=\"Creating\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i4.TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: ["templateVariables", "variablesForm", "metadata", "description", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "parameterOptions", "hasMoreParameters", "isLoadingParameters", "uploadOptions", "hasMoreUploads", "isLoadingUploads", "environmentOptions", "hasMoreEnvironments", "isLoadingEnvironments", "globalVariableOptions", "isLoadingGlobalVariables", "testCaseEnvironmentName", "testCaseEnvironmentLabelSuffix", "environmentLegacyDeprecationMessage", "testCaseTestDataId", "defaultTestDataProfileId", "defaultTestDataStartIndex", "defaultTestDataEndIndex", "isInsideForLoopStep", "hasTestDataProfile", "isEditInDepth", "isDebug", "createElementVisible"], outputs: ["variableValueChange", "variableBooleanChange", "metadataChange", "descriptionChange", "loadMoreElements", "searchElements", "searchElementsByScreenName", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "searchParameters", "loadMoreParameters", "searchUploads", "loadMoreUploads", "searchEnvironments", "loadMoreEnvironments", "searchGlobalVariables", "cancelElementForm", "elementFormVisibilityChange"] }, { 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.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: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
887
887
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderActionComponent, decorators: [{
888
888
  type: Component,
889
- args: [{ selector: 'cqa-step-builder-action', host: { class: 'cqa-ui-root', style: 'display: block;height: 100%;width: 100%;' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-p-[16px]\" [ngClass]=\"{'cqa-px-4': showHeader, 'cqa-py-2': showHeader && !selectedTemplate}\">\n <!-- Header -->\n \n <div *ngIf=\"showHeader\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-m-0\">\n {{ isEditMode ? 'Edit an action step' : 'Create an action step' }}\n </h2>\n <cqa-button\n *ngIf=\"isEditMode && selectedTemplate\"\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"swap_horiz\"\n text=\"Change Template\"\n (clicked)=\"onChangeTemplate()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isEditMode && !selectedTemplate\"\n variant=\"text\"\n btnSize=\"sm\"\n text=\"Cancel\"\n (clicked)=\"onCancelTemplateSelection()\">\n </cqa-button>\n </div>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-action-format cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-6\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-overflow-y-auto\" style=\"flex: 1 1 0 !important;\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-2 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700 cqa-py-2\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"updatedHtmlGrammar || selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n \n <div class=\"cqa-flex cqa-justify-end cqa-pt-2 cqa-gap-2\" *ngIf=\"!createElementVisible\">\n <cqa-button \n *ngIf=\"selectorVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Element\"\n (clicked)=\"onShowElementForm()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"parameterVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Parameter\"\n (clicked)=\"redirectToParameter.emit()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"environmentVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Environment\"\n (clicked)=\"redirectToEnvironment.emit()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto cqa-flex-1 cqa-pb-2\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <!-- Env banner \u2014 surfaces which environment's variables and TDPs are in scope. -->\n <div *ngIf=\"testCaseEnvironmentName\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-3 cqa-px-3 cqa-py-2 cqa-rounded-md cqa-text-xs cqa-text-gray-700 cqa-bg-gray-50 cqa-border cqa-border-gray-200\">\n Using <strong class=\"cqa-font-semibold\">{{ testCaseEnvironmentName }} Environment</strong>\n <span class=\"cqa-text-gray-500\">\u00B7</span>\n <span class=\"cqa-text-gray-500\">Environment variables and data profiles are resolved from this environment.</span>\n </div>\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap cqa-pb-4\">\n <!-- Template Variables Form Component -->\n <cqa-template-variables-form\n #templateVariablesForm\n style=\"width: 100%;\"\n [isDebug]=\"isDebug\"\n [templateVariables]=\"templateVariables\"\n [variablesForm]=\"variablesForm\"\n [metadata]=\"metadata\"\n [description]=\"description\"\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 [uploadOptions]=\"uploadOptions\"\n [hasMoreUploads]=\"hasMoreUploads\"\n [isLoadingUploads]=\"isLoadingUploads\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [globalVariableOptions]=\"globalVariableOptions\"\n [isLoadingGlobalVariables]=\"isLoadingGlobalVariables\"\n [testCaseEnvironmentName]=\"testCaseEnvironmentName\"\n [testCaseEnvironmentLabelSuffix]=\"testCaseEnvironmentLabelSuffix\"\n [environmentLegacyDeprecationMessage]=\"environmentLegacyDeprecationMessage\"\n [testCaseTestDataId]=\"testCaseTestDataId\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [defaultTestDataEndIndex]=\"defaultTestDataEndIndex\"\n [isInsideForLoopStep]=\"isInsideForLoopStep\"\n [hasTestDataProfile]=\"hasTestDataProfile\"\n [createElementVisible]=\"createElementVisible\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"metadata = $event\"\n (descriptionChange)=\"description = $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 (searchUploads)=\"searchUploads.emit($event)\"\n (loadMoreUploads)=\"loadMoreUploads.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (searchGlobalVariables)=\"searchGlobalVariables.emit($event)\"\n (elementFormVisibilityChange)=\"onElementFormVisibilityChange($event)\">\n </cqa-template-variables-form>\n </div>\n\n <!-- Advanced (Expandable) -->\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 \n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div *ngIf=\"!createElementVisible\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200 cqa-pb-2\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" class=\"cqa-w-1/2\" variant=\"filled\" [text]=\"isEditMode ? 'Update Step' : 'Create Step'\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <!-- Loader slot: same size as Create Step button (lg: 38px height, full width, rounded-[8px]) -->\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge\n label=\"Creating\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>", styles: [] }]
889
+ args: [{ selector: 'cqa-step-builder-action', host: { class: 'cqa-ui-root', style: 'display: block;height: 100%;width: 100%;' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-p-[16px]\" [ngClass]=\"{'cqa-px-4': showHeader, 'cqa-py-2': showHeader && !selectedTemplate}\">\n <!-- Header -->\n \n <div *ngIf=\"showHeader\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-m-0\">\n {{ isEditMode ? 'Edit an action step' : 'Create an action step' }}\n </h2>\n <cqa-button\n *ngIf=\"isEditMode && selectedTemplate\"\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"swap_horiz\"\n text=\"Change Template\"\n (clicked)=\"onChangeTemplate()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isEditMode && !selectedTemplate\"\n variant=\"text\"\n btnSize=\"sm\"\n text=\"Cancel\"\n (clicked)=\"onCancelTemplateSelection()\">\n </cqa-button>\n </div>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-action-format cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-6\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-overflow-y-auto\" style=\"flex: 1 1 0 !important;\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-2 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700 cqa-py-2\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"updatedHtmlGrammar || selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n \n <div class=\"cqa-flex cqa-justify-end cqa-pt-2 cqa-gap-2\" *ngIf=\"!createElementVisible\">\n <cqa-button \n *ngIf=\"selectorVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Element\"\n (clicked)=\"onShowElementForm()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"parameterVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Parameter\"\n (clicked)=\"redirectToParameter.emit()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"environmentVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Environment\"\n (clicked)=\"redirectToEnvironment.emit()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto cqa-flex-1 cqa-pb-2\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <!-- Env banner \u2014 surfaces which environment's variables and TDPs are in scope. -->\n <div *ngIf=\"testCaseEnvironmentName\"\n class=\"cqa-flex cqa-flex-col cqa-items-start cqa-gap-1 cqa-mb-3 cqa-px-3 cqa-py-2 cqa-rounded-md cqa-text-xs cqa-text-gray-700 cqa-bg-gray-50 cqa-border cqa-border-gray-200\">\n <div>\n Using\n <strong class=\"cqa-font-semibold\">{{ testCaseEnvironmentName }} Environment<ng-container *ngIf=\"testCaseEnvironmentLabelSuffix\"> (Default)</ng-container></strong>\n <span class=\"cqa-text-gray-500\"> \u00B7 </span>\n <span class=\"cqa-text-gray-500\">Environment variables and data profiles are resolved from this environment.</span>\n </div>\n <div *ngIf=\"testCaseEnvironmentLabelSuffix\" class=\"cqa-text-gray-500\">\n Set an environment on the test case to override this default.\n </div>\n </div>\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap cqa-pb-4\">\n <!-- Template Variables Form Component -->\n <cqa-template-variables-form\n #templateVariablesForm\n style=\"width: 100%;\"\n [isDebug]=\"isDebug\"\n [templateVariables]=\"templateVariables\"\n [variablesForm]=\"variablesForm\"\n [metadata]=\"metadata\"\n [description]=\"description\"\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 [uploadOptions]=\"uploadOptions\"\n [hasMoreUploads]=\"hasMoreUploads\"\n [isLoadingUploads]=\"isLoadingUploads\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [globalVariableOptions]=\"globalVariableOptions\"\n [isLoadingGlobalVariables]=\"isLoadingGlobalVariables\"\n [testCaseEnvironmentName]=\"testCaseEnvironmentName\"\n [testCaseEnvironmentLabelSuffix]=\"testCaseEnvironmentLabelSuffix\"\n [environmentLegacyDeprecationMessage]=\"environmentLegacyDeprecationMessage\"\n [testCaseTestDataId]=\"testCaseTestDataId\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [defaultTestDataEndIndex]=\"defaultTestDataEndIndex\"\n [isInsideForLoopStep]=\"isInsideForLoopStep\"\n [hasTestDataProfile]=\"hasTestDataProfile\"\n [createElementVisible]=\"createElementVisible\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"metadata = $event\"\n (descriptionChange)=\"description = $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 (searchUploads)=\"searchUploads.emit($event)\"\n (loadMoreUploads)=\"loadMoreUploads.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (searchGlobalVariables)=\"searchGlobalVariables.emit($event)\"\n (elementFormVisibilityChange)=\"onElementFormVisibilityChange($event)\">\n </cqa-template-variables-form>\n </div>\n\n <!-- Advanced (Expandable) -->\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 \n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div *ngIf=\"!createElementVisible\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200 cqa-pb-2\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" class=\"cqa-w-1/2\" variant=\"filled\" [text]=\"isEditMode ? 'Update Step' : 'Create Step'\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <!-- Loader slot: same size as Create Step button (lg: 38px height, full width, rounded-[8px]) -->\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge\n label=\"Creating\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>", styles: [] }]
890
890
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { showHeader: [{
891
891
  type: Input
892
892
  }], changeTemplateSignal: [{
@@ -1013,4 +1013,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1013
1013
  type: ViewChild,
1014
1014
  args: [TemplateVariablesFormComponent, { static: false }]
1015
1015
  }] } });
1016
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItYWN0aW9uL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWFjdGlvbi9zdGVwLWJ1aWxkZXItYWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStDLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDbEosT0FBTyxFQUEwQixXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHaEYsT0FBTyxFQUFvQiw4QkFBOEIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDOzs7Ozs7Ozs7O0FBZ0VoSSxNQUFNLE9BQU8sMEJBQTBCO0lBdUlyQyxZQUFvQixFQUFlLEVBQVUsR0FBc0I7UUFBL0MsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBdEkxRCxlQUFVLEdBQVksSUFBSSxDQUFDO1FBQ3BDLG1GQUFtRjtRQUMxRSx5QkFBb0IsR0FBVyxDQUFDLENBQUM7UUFDMUMsNkZBQTZGO1FBQ3BGLCtCQUEwQixHQUFXLENBQUMsQ0FBQztRQUNoRCwwQ0FBMEM7UUFDakMsY0FBUyxHQUFxQixFQUFFLENBQUM7UUFPMUMsZ0hBQWdIO1FBQ3ZHLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFTbEMsd0NBQXdDO1FBQy9CLHNCQUFpQixHQUFXLGdCQUFnQixDQUFDO1FBRXRELG1HQUFtRztRQUMxRix5QkFBb0IsR0FBdUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUEsQ0FBQSxDQUFDLENBQUM7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QUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLDBCQUEwQjtzQkFBbkMsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQWlCdUQscUJBQXFCO3NCQUFsRixTQUFTO3VCQUFDLDhCQUE4QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgT25EZXN0cm95LCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCwgRm9ybUFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZVZhcmlhYmxlLCBUZW1wbGF0ZVZhcmlhYmxlc0Zvcm1Db21wb25lbnQgfSBmcm9tICcuLi90ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybS90ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybS5jb21wb25lbnQnO1xuXG4vLyBJbXBvcnQgRWxlbWVudCB0eXBlIC0gdXNpbmcgYW55IGZvciBub3cgc2luY2UgRWxlbWVudCBpcyBmcm9tIHRzLXBvcnRhbC11aVxuLy8gSW4gYSByZWFsIHNjZW5hcmlvLCB5b3UgbWlnaHQgd2FudCB0byBjcmVhdGUgYSBzaGFyZWQgaW50ZXJmYWNlIG9yIGltcG9ydCBmcm9tIGEgc2hhcmVkIHBhY2thZ2VcbmludGVyZmFjZSBFbGVtZW50IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgbG9jYXRvclZhbHVlPzogc3RyaW5nO1xuICBvdGhlckxvY2F0b3I/OiBzdHJpbmdbXTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhcmlhYmxlRGVmaW5pdGlvbiB7XG4gIHBhdGg6IHN0cmluZztcbiAgZGVmYXVsdDogc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IG51bGw7XG4gIG11dGFibGU6IGJvb2xlYW47XG4gIHR5cGU/OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25UZW1wbGF0ZSB7XG4gIGlkPzogbnVtYmVyO1xuICBuYXR1cmFsVGV4dD86IHN0cmluZztcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gIGh0bWxHcmFtbWFyPzogc3RyaW5nO1xuICBzZWFyY2hhYmxlR3JhbW1hcj86IHN0cmluZztcbiAgd29ya3NwYWNlVHlwZT86IHN0cmluZztcbiAgYWN0aW9uPzogc3RyaW5nO1xuICBpc0FkZG9uPzogYm9vbGVhbjtcbiAgdmFyaWFibGVzPzogUmVjb3JkPHN0cmluZywgVmFyaWFibGVEZWZpbml0aW9uPjtcbiAgYWxsb3dlZFZhbHVlcz86IGFueTtcbiAgZGF0YT86IGFueTtcbiAgc3RlcEFjdGlvblR5cGU/OiBhbnk7XG4gIHN0ZXBUeXBlPzogYW55O1xuICBkaXNwbGF5T3JkZXI/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudEZpZWxkIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHR5cGU6ICdlbGVtZW50JyB8ICd0ZXN0LWRhdGEnIHwgJ2F0dHJpYnV0ZSc7XG59XG5cbnR5cGUgU3RlcFRlc3REYXRhTGlzdEl0ZW0gPSB7XG4gIHRlc3REYXRhOiBzdHJpbmc7XG4gIHRlc3REYXRhS2V5Pzogc3RyaW5nO1xuICB0ZXN0RGF0YVR5cGU6IHN0cmluZztcbiAgdGVzdERhdGFQcm9maWxlSWQ/OiBudW1iZXI7XG59O1xuXG4vKiogSG9zdCBwYXNzZXMgdGhpcyBhZnRlciBlbGVtZW50U2VydmljZS5zaG93KCkgc28gTGFiZWwgU2NyZWVuIE5hbWUgLyBMYWJlbCBwcmVmaWxsIG9uIGVkaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRTY3JlZW5QcmVmaWxsIHtcbiAgZWxlbWVudElkOiBudW1iZXI7XG4gIHNjcmVlbk5hbWVJZD86IG51bWJlcjtcbiAgc2VsZWN0ZWRTY3JlZW5OYW1lPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1idWlsZGVyLWFjdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGVwLWJ1aWxkZXItYWN0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290Jywgc3R5bGU6ICdkaXNwbGF5OiBibG9jaztoZWlnaHQ6IDEwMCU7d2lkdGg6IDEwMCU7JyB9XG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBCdWlsZGVyQWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHNob3dIZWFkZXI6IGJvb2xlYW4gPSB0cnVlO1xuICAvKiogSW5jcmVtZW50IHRoaXMgY291bnRlciB0byB0cmlnZ2VyIFwiQ2hhbmdlIFRlbXBsYXRlXCIgZnJvbSBhIHBhcmVudCBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIGNoYW5nZVRlbXBsYXRlU2lnbmFsOiBudW1iZXIgPSAwO1xuICAvKiogSW5jcmVtZW50IHRoaXMgY291bnRlciB0byB0cmlnZ2VyIFwiQ2FuY2VsIHRlbXBsYXRlIHNlbGVjdGlvblwiIGZyb20gYSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBjYW5jZWxDaGFuZ2VUZW1wbGF0ZVNpZ25hbDogbnVtYmVyID0gMDtcbiAgLyoqIExpc3Qgb2YgYWN0aW9uIHRlbXBsYXRlcyB0byBkaXNwbGF5ICovXG4gIEBJbnB1dCgpIHRlbXBsYXRlczogQWN0aW9uVGVtcGxhdGVbXSA9IFtdO1xuICAvKiogV2hlbiBwcm92aWRlZCwgYXV0b21hdGljYWxseSBzZWxlY3RzIHRoaXMgdGVtcGxhdGUgb24gaW5pdCAoZWRpdCBtb2RlKS4gKi9cbiAgQElucHV0KCkgaW5pdGlhbFRlbXBsYXRlPzogQWN0aW9uVGVtcGxhdGU7XG4gIC8qKiBXaGVuIHByb3ZpZGVkLCBwcmUtcG9wdWxhdGVzIHRoZSBkZXNjcmlwdGlvbiBmaWVsZCBpbiBlZGl0IG1vZGUuICovXG4gIEBJbnB1dCgpIGluaXRpYWxEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIHByZS1wb3B1bGF0ZXMgdGhlIG1ldGFkYXRhIGZpZWxkIGluIGVkaXQgbW9kZS4gKi9cbiAgQElucHV0KCkgaW5pdGlhbE1ldGFkYXRhPzogc3RyaW5nO1xuICAvKiogV2hlbiB0cnVlLCBlbmFibGVzIGRlYnVnLW1vZGUgYmVoYXZpb3VyOiBhdXRvLXNlbGVjdHMgaW5pdGlhbFRlbXBsYXRlIGFuZCBwcmUtZmlsbHMgZGVzY3JpcHRpb24vbWV0YWRhdGEuICovXG4gIEBJbnB1dCgpIGlzRGVidWc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBpc0VkaXRNb2RlIGxvZ2ljICh1c2VmdWwgd2hlbiBwYXJlbnQga25vd3MgZWRpdCBzdGF0ZSBpbmRlcGVuZGVudGx5IG9mIGluaXRpYWxUZW1wbGF0ZSkuICovXG4gIEBJbnB1dCgpIGVkaXRNb2RlPzogYm9vbGVhbjtcblxuICBnZXQgaXNFZGl0TW9kZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5lZGl0TW9kZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5lZGl0TW9kZTtcbiAgICByZXR1cm4gdGhpcy5pc0RlYnVnICYmICEhdGhpcy5pbml0aWFsVGVtcGxhdGU7XG4gIH1cblxuICAvKiogUGxhY2Vob2xkZXIgdGV4dCBmb3Igc2VhcmNoIGlucHV0ICovXG4gIEBJbnB1dCgpIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoIGxpYnJhcnknO1xuXG4gIC8qKiBGdW5jdGlvbiB0byBoYW5kbGUgdmFyaWFibGUgcHJvY2Vzc2luZyBvciBjdXN0b20gbG9naWMuIENhbiBiZSBwYXNzZWQgZnJvbSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBzZXRUZW1wbGF0ZVZhcmlhYmxlczogKHZhcmlhYmxlczogQWN0aW9uVGVtcGxhdGUpID0+IGFueSA9ICgpID0+IHsgcmV0dXJuIFtdfTtcbiAgXG4gIC8qKiBGdW5jdGlvbiB0byBoYW5kbGUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzLiBDYW4gYmUgcGFzc2VkIGZyb20gcGFyZW50IGNvbXBvbmVudC4gKi9cbiAgQElucHV0KCkgc2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogKHRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSwgdGVzdFN0ZXA/OiBhbnkpID0+IGFueVtdID0gKCkgPT4geyByZXR1cm4gW119O1xuXG4gIC8qKiBDZW50cmFsaXNlZCBIVE1MIGdyYW1tYXIgY29tcHV0YXRpb24gZnVuY3Rpb24uIFBhc3MgU3RlcEJ1aWxkZXJTZXJ2aWNlLmNvbXB1dGVIdG1sR3JhbW1hciBmcm9tIHRoZSBob3N0IGFwcC4gKi9cbiAgQElucHV0KCkgY29tcHV0ZUh0bWxHcmFtbWFyRm4/OiAodGVtcGxhdGU6IGFueSwgdmFyaWFibGVzOiBhbnlbXSkgPT4gc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHByZXZlbnRTZWxlY3RUZW1wbGF0ZTogc3RyaW5nW10gPSBbJ2RhdGFiYXNldmVyaWZpY2F0aW9uJ107XG4gIEBJbnB1dCgpIGVsZW1lbnRPcHRpb25zOiBFbGVtZW50W10gPSBbXTsgLy8gRWxlbWVudCBvYmplY3RzIGZvciBlbGVtZW50IGRyb3Bkb3duXG4gIEBJbnB1dCgpIGhhc01vcmVFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBXaGV0aGVyIG1vcmUgZWxlbWVudHMgYXJlIGF2YWlsYWJsZVxuICBASW5wdXQoKSBpc0xvYWRpbmdFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBMb2FkaW5nIHN0YXRlIGZvciBlbGVtZW50c1xuICAvKiogU2NyZWVuIG5hbWUgb3B0aW9ucyBmb3IgZWxlbWVudCBmb3JtIGF1dG9jb21wbGV0ZSAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHNjcmVlbk5hbWVPcHRpb25zOiB7IGlkPzogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVtdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgc2NyZWVuIG5hbWVzIGFyZSBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbCAqL1xuICBASW5wdXQoKSBoYXNNb3JlU2NyZWVuTmFtZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgc2NyZWVuIG5hbWVzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogUGFyYW1ldGVyIG9wdGlvbnMgZm9yIHRlc3QgZGF0YSBwYXJhbWV0ZXIgZHJvcGRvd24gKGZyb20gQVBJKSAqL1xuICBASW5wdXQoKSBwYXJhbWV0ZXJPcHRpb25zOiBhbnlbXSA9IFtdOyAvLyBUZXN0RGF0YVtdIC0gcmF3IHRlc3QgZGF0YSBwcm9maWxlc1xuICAvKiogV2hldGhlciBtb3JlIHBhcmFtZXRlcnMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIHBhcmFtZXRlcnMgKHNlYXJjaCBvciBsb2FkIG1vcmUpICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ1BhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFVwbG9hZCBvcHRpb25zIGZvciB1cGxvYWQgZHJvcGRvd24gKGZyb20gQVBJKSAqL1xuICBASW5wdXQoKSB1cGxvYWRPcHRpb25zOiBhbnlbXSA9IFtdO1xuICAvKiogV2hldGhlciBtb3JlIHVwbG9hZHMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVVcGxvYWRzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIHVwbG9hZHMgKHNlYXJjaCBvciBsb2FkIG1vcmUpICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ1VwbG9hZHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEVudmlyb25tZW50IG9wdGlvbnMgZm9yIGVudmlyb25tZW50IHBhcmFtZXRlciBkcm9wZG93biAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIGVudmlyb25tZW50T3B0aW9uczogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGVudmlyb25tZW50OiBzdHJpbmcgfVtdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgZW52aXJvbm1lbnRzIGFyZSBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbCAqL1xuICBASW5wdXQoKSBoYXNNb3JlRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIGVudmlyb25tZW50cyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBHbG9iYWwgRGF0YSB2YXJpYWJsZXMgKHdvcmtzcGFjZS1zY29wZWQpIGZvciB0aGUgR2xvYmFsIERhdGEgdGFiLiAqL1xuICBASW5wdXQoKSBnbG9iYWxWYXJpYWJsZU9wdGlvbnM6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyB0eXBlPzogc3RyaW5nOyByZWFkV3JpdGVNb2RlPzogc3RyaW5nIH1bXSA9IFtdO1xuICBASW5wdXQoKSBpc0xvYWRpbmdHbG9iYWxWYXJpYWJsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFJlc29sdmVkIHRlc3QtY2FzZSBlbnZpcm9ubWVudCBuYW1lLCB1c2VkIGZvciB0aGUgZW52IGJhbm5lciBzdWJoZWFkLiAqL1xuICBASW5wdXQoKSB0ZXN0Q2FzZUVudmlyb25tZW50TmFtZT86IHN0cmluZztcbiAgLyoqIFN1ZmZpeCBhcHBlbmRlZCB0byB0aGUgZW52LW5hbWUgb3B0aW9uIGxhYmVsIG9ubHkgKGUuZy4gJyhkZWZhdWx0KScpOyBhbHNvIGxvY2tzIHRoZSBlbnYgZHJvcGRvd24uICovXG4gIEBJbnB1dCgpIHRlc3RDYXNlRW52aXJvbm1lbnRMYWJlbFN1ZmZpeD86IHN0cmluZztcbiAgLyoqIEl0YWxpYyBub3RlIHJlbmRlcmVkIHVuZGVyIHRoZSBlbnYgZHJvcGRvd24g4oCUIHVzZWQgZm9yIGxlZ2FjeSBzdGVwLWxldmVsIGVudiBkZXByZWNhdGlvbi4gKi9cbiAgQElucHV0KCkgZW52aXJvbm1lbnRMZWdhY3lEZXByZWNhdGlvbk1lc3NhZ2U/OiBzdHJpbmc7XG4gIC8qKiBUZXN0IGNhc2UncyBURFAgaWQgKHdoZW4gc2V0LCBsb2NrIHRoZSBURFAgcGlja2VyIGluIHRoZSBwYXJhbWV0ZXIgdGFiKS4gKi9cbiAgQElucHV0KCkgdGVzdENhc2VUZXN0RGF0YUlkPzogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHByb2ZpbGUgSUQgZnJvbSB0ZXN0IGNhc2UgKGlmIGF2YWlsYWJsZSwgcHJvZmlsZSBhbmQgZGF0YSBzZXQgZHJvcGRvd25zIHdpbGwgYmUgZGlzYWJsZWQpICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHN0YXJ0IGluZGV4IGZyb20gdGVzdCBjYXNlIChkYXRhIHNldCBpbmRleCBpbiB0aGUgcHJvZmlsZSkgKi9cbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleD86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIGVuZCBpbmRleCBmcm9tIHRlc3QgY2FzZSAodXNlZCBmb3IgRk9SIGxvb3AgY29udGV4dCkgKi9cbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhRW5kSW5kZXg/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIGN1cnJlbnQgc3RlcCBjcmVhdGlvbiBpcyBoYXBwZW5pbmcgaW5zaWRlIEZPUiBsb29wIGNvbnRleHQgKi9cbiAgQElucHV0KCkgaXNJbnNpZGVGb3JMb29wU3RlcDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSBwYXJlbnQgdGVzdCBjYXNlIGhhcyBhIHRlc3QgZGF0YSBwcm9maWxlIGNvbmZpZ3VyZWQgKHRlc3RDYXNlLnRlc3REYXRhSWQgaXMgc2V0KS4gKi9cbiAgQElucHV0KCkgaGFzVGVzdERhdGFQcm9maWxlOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBjcmVhdGluZyB0aGUgc3RlcCAoQVBJIGluIHByb2dyZXNzKTsgc2hvdyBsb2FkZXIgb24gQ3JlYXRlL1VwZGF0ZSBTdGVwIGJ1dHRvbiAqL1xuICBASW5wdXQoKSBpc0NyZWF0aW5nU3RlcDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlbGVtZW50U2NyZWVuUHJlZmlsbD86IEVsZW1lbnRTY3JlZW5QcmVmaWxsIHwgbnVsbDtcbiAgQE91dHB1dCgpIHRlbXBsYXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QWN0aW9uVGVtcGxhdGU+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gbG9hZCBtb3JlIGlzIHJlcXVlc3RlZFxuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIGVsZW1lbnRzXG4gIEBPdXRwdXQoKSBzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzY3JlZW5OYW1lSWQ6IG51bWJlcjsgc2VhcmNoVGVybT86IHN0cmluZyB9PigpOyAvLyBFbWl0IHdoZW4gc2NyZWVuIG5hbWUgaXMgc2VsZWN0ZWQgdG8gZmV0Y2ggZWxlbWVudHMgZmlsdGVyZWQgYnkgc2NyZWVuIG5hbWVcbiAgQE91dHB1dCgpIGNyZWF0ZUVsZW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTsgLy8gRW1pdCB3aGVuIGVsZW1lbnQgaXMgY3JlYXRlZFxuICBAT3V0cHV0KCkgc2VhcmNoU2NyZWVuTmFtZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBzY3JlZW4gbmFtZXNcbiAgQE91dHB1dCgpIGxvYWRNb3JlU2NyZWVuTmFtZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgc2NyZWVuIG5hbWVzXG4gIEBPdXRwdXQoKSBjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciByZXF1ZXN0cyB0byBjcmVhdGUgYSBuZXcgc2NyZWVuIG5hbWVcbiAgQE91dHB1dCgpIHNlYXJjaFBhcmFtZXRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIHBhcmFtZXRlcnNcbiAgQE91dHB1dCgpIGxvYWRNb3JlUGFyYW1ldGVycyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgcGFyYW1ldGVyc1xuICBAT3V0cHV0KCkgc2VhcmNoVXBsb2FkcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgdXBsb2Fkc1xuICBAT3V0cHV0KCkgbG9hZE1vcmVVcGxvYWRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSB1cGxvYWRzXG4gIEBPdXRwdXQoKSBzZWFyY2hFbnZpcm9ubWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIGVudmlyb25tZW50c1xuICBAT3V0cHV0KCkgbG9hZE1vcmVFbnZpcm9ubWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIGVudmlyb25tZW50c1xuICBAT3V0cHV0KCkgc2VhcmNoR2xvYmFsVmFyaWFibGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0IHdoZW4gc3RlcCBpcyBjcmVhdGVkICovXG4gIEBPdXRwdXQoKSBjcmVhdGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBjYW5jZWxsZWQgKi9cbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlZGlyZWN0VG9QYXJhbWV0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSByZWRpcmVjdFRvRW52aXJvbm1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgZmlsdGVyZWRUZW1wbGF0ZXM6IEFjdGlvblRlbXBsYXRlW10gPSBbXTtcbiAgc2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuICBzZWxlY3RlZFRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByZXZpb3VzVGVtcGxhdGVGb3JFZGl0OiBBY3Rpb25UZW1wbGF0ZSB8IG51bGwgPSBudWxsO1xuICBtZXRhZGF0YTogc3RyaW5nID0gJyc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcbiAgYWR2YW5jZWRFeHBhbmRlZDogYm9vbGVhbiA9IHRydWU7XG4gIHRlbXBsYXRlVmFyaWFibGVzOiBUZW1wbGF0ZVZhcmlhYmxlW10gPSBbXTtcbiAgdmFyaWFibGVzRm9ybTogRm9ybUFycmF5O1xuICBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzOiBhbnlbXSA9IFtdO1xuICBhZHZhbmNlZFZhcmlhYmxlc0Zvcm06IEZvcm1BcnJheTtcbiAgdXBkYXRlZEh0bWxHcmFtbWFyOiBzdHJpbmcgPSAnJzsgLy8gVXBkYXRlZCBIVE1MIGdyYW1tYXIgd2l0aCB2YXJpYWJsZSB2YWx1ZXNcbiAgY3JlYXRlRWxlbWVudFZpc2libGUgPSBmYWxzZTtcbiAgLy8gVHJhY2sgZWxlbWVudCBmb3JtIHZpc2liaWxpdHlcbiAgXG4gIEBWaWV3Q2hpbGQoVGVtcGxhdGVWYXJpYWJsZXNGb3JtQ29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSkgdGVtcGxhdGVWYXJpYWJsZXNGb3JtPzogVGVtcGxhdGVWYXJpYWJsZXNGb3JtQ29tcG9uZW50O1xuICBcbiAgLy8gQ2FjaGUgZm9yIHNlbGVjdCBjb25maWdzIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICBwcml2YXRlIHNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGZvcm1WYWxpZENhY2hlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdEZvcm1WYWxpZGF0aW9uVGltZTogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBGT1JNX1ZBTElEQVRJT05fQ0FDSEVfTVMgPSAxMDA7IC8vIENhY2hlIGZvciAxMDBtc1xuICBwcml2YXRlIGZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHRoaXMudmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuYXJyYXkoW10pO1xuICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5hcnJheShbXSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGVsZW1lbnQgZm9ybSB2aXNpYmlsaXR5IGNoYW5nZVxuICAgKi9cbiAgb25FbGVtZW50Rm9ybVZpc2liaWxpdHlDaGFuZ2UodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlRWxlbWVudFZpc2libGUgPSB2aXNpYmxlO1xuICB9XG5cbiAgb25TaG93RWxlbWVudEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVFbGVtZW50VmlzaWJsZSA9IHRydWU7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzID0gWy4uLnRoaXMudGVtcGxhdGVzXTtcbiAgICBpZiAodGhpcy5pc0RlYnVnKSB7XG4gICAgICBpZiAodGhpcy5pbml0aWFsRGVzY3JpcHRpb24pIHRoaXMuZGVzY3JpcHRpb24gPSB0aGlzLmluaXRpYWxEZXNjcmlwdGlvbjtcbiAgICAgIGlmICh0aGlzLmluaXRpYWxNZXRhZGF0YSkgdGhpcy5tZXRhZGF0YSA9IHRoaXMuaW5pdGlhbE1ldGFkYXRhO1xuICAgICAgaWYgKHRoaXMuaW5pdGlhbFRlbXBsYXRlKSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VsZWN0VGVtcGxhdGUodGhpcy5pbml0aWFsVGVtcGxhdGUhKSwgMCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd0ZW1wbGF0ZXMnXSkge1xuICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZWxlbWVudFNjcmVlblByZWZpbGwnXSAmJiB0aGlzLmVsZW1lbnRTY3JlZW5QcmVmaWxsKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYXBwbHlFbGVtZW50U2NyZWVuUHJlZmlsbCgpLCAwKTtcbiAgICB9XG4gICAgLy8gV2hlbiBpbml0aWFsVGVtcGxhdGUgaXMgc2V0IGFmdGVyIGluaXQgKGFzeW5jIHByZS1maWxsKSwgYXV0by1zZWxlY3QgaXRcbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFRlbXBsYXRlJ10gJiYgdGhpcy5pc0RlYnVnICYmIHRoaXMuaW5pdGlhbFRlbXBsYXRlICYmICF0aGlzLnNlbGVjdGVkVGVtcGxhdGUpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZWxlY3RUZW1wbGF0ZSh0aGlzLmluaXRpYWxUZW1wbGF0ZSEpLCAwKTtcbiAgICB9XG4gICAgLy8gUGFyZW50IGNhbiB0cmlnZ2VyIFwiQ2hhbmdlIFRlbXBsYXRlXCIgYnkgaW5jcmVtZW50aW5nIGNoYW5nZVRlbXBsYXRlU2lnbmFsXG4gICAgaWYgKGNoYW5nZXNbJ2NoYW5nZVRlbXBsYXRlU2lnbmFsJ10gJiYgIWNoYW5nZXNbJ2NoYW5nZVRlbXBsYXRlU2lnbmFsJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMub25DaGFuZ2VUZW1wbGF0ZSgpO1xuICAgIH1cbiAgICAvLyBQYXJlbnQgY2FuIHRyaWdnZXIgXCJDYW5jZWwgdGVtcGxhdGUgc2VsZWN0aW9uXCIgYnkgaW5jcmVtZW50aW5nIGNhbmNlbENoYW5nZVRlbXBsYXRlU2lnbmFsXG4gICAgaWYgKGNoYW5nZXNbJ2NhbmNlbENoYW5nZVRlbXBsYXRlU2lnbmFsJ10gJiYgIWNoYW5nZXNbJ2NhbmNlbENoYW5nZVRlbXBsYXRlU2lnbmFsJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMub25DYW5jZWxUZW1wbGF0ZVNlbGVjdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VhcmNoQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgb25TZWFyY2hTdWJtaXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gIH1cblxuICBvblNlYXJjaENsZWFyZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlFbGVtZW50U2NyZWVuUHJlZmlsbCgpOiB2b2lkIHtcbiAgICBjb25zdCBwcmUgPSB0aGlzLmVsZW1lbnRTY3JlZW5QcmVmaWxsO1xuICAgIGlmICghcHJlIHx8IHByZS5lbGVtZW50SWQgPT0gbnVsbCB8fCAhdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldElkID0gTnVtYmVyKHByZS5lbGVtZW50SWQpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRhcmdldElkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdG91Y2hlZCA9IGZhbHNlO1xuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUsIGluZGV4KSA9PiB7XG4gICAgICBpZiAodmFyaWFibGUuZGF0YUtleSAhPT0gJ2VsZW1lbnQnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQgPT0gbnVsbCB8fCBOdW1iZXIodmFyaWFibGUuZWxlbWVudElkKSAhPT0gdGFyZ2V0SWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHByZS5zY3JlZW5OYW1lSWQgIT0gbnVsbCkge1xuICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSBOdW1iZXIocHJlLnNjcmVlbk5hbWVJZCk7XG4gICAgICAgIHRvdWNoZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHByZS5zZWxlY3RlZFNjcmVlbk5hbWUpIHtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gU3RyaW5nKHByZS5zZWxlY3RlZFNjcmVlbk5hbWUpO1xuICAgICAgICB0b3VjaGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLnZhcmlhYmxlc0Zvcm0uYXQoaW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHByZS5zY3JlZW5OYW1lSWQgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBzaWQgPSBTdHJpbmcocHJlLnNjcmVlbk5hbWVJZCk7XG4gICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woc2lkKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZShzaWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0b3VjaGVkKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gWy4uLnRoaXMudGVtcGxhdGVWYXJpYWJsZXNdO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIGFwcGx5RmlsdGVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWFyY2hWYWx1ZSB8fCB0aGlzLnNlYXJjaFZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRUZW1wbGF0ZXMgPSBbLi4udGhpcy50ZW1wbGF0ZXNdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLnNlYXJjaFZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIHRoaXMuZmlsdGVyZWRUZW1wbGF0ZXMgPSB0aGlzLnRlbXBsYXRlcy5maWx0ZXIodGVtcGxhdGUgPT4ge1xuICAgICAgY29uc3QgbmF0dXJhbFRleHQgPSB0ZW1wbGF0ZS5uYXR1cmFsVGV4dD8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIC8vIFN0cmlwIEhUTUwgdGFncyBmcm9tIGh0bWxHcmFtbWFyIGZvciBzZWFyY2hpbmcgKG9ubHkgc2VhcmNoIHRleHQgY29udGVudCwgbm90IEhUTUwgbWFya3VwKVxuICAgICAgY29uc3QgaHRtbEdyYW1tYXJUZXh0ID0gdGhpcy5zdHJpcEh0bWxUYWdzKHRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3Qgc2VhcmNoYWJsZUdyYW1tYXIgPSB0ZW1wbGF0ZS5zZWFyY2hhYmxlR3JhbW1hcj8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIFxuICAgICAgcmV0dXJuIG5hdHVyYWxUZXh0LmluY2x1ZGVzKHNlYXJjaFRlcm0pIHx8IFxuICAgICAgICAgICAgICBodG1sR3JhbW1hclRleHQuaW5jbHVkZXMoc2VhcmNoVGVybSkgfHwgXG4gICAgICAgICAgICAgc2VhcmNoYWJsZUdyYW1tYXIuaW5jbHVkZXMoc2VhcmNoVGVybSk7XG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coXCJmaWx0ZXJlZFRlbXBsYXRlc1wiLCB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpcCBIVE1MIHRhZ3MgZnJvbSBhIHN0cmluZywgcmV0dXJuaW5nIG9ubHkgdGhlIHRleHQgY29udGVudFxuICAgKiBAcGFyYW0gaHRtbFN0cmluZyAtIEhUTUwgc3RyaW5nIHRvIHN0cmlwIHRhZ3MgZnJvbVxuICAgKiBAcmV0dXJucyBQbGFpbiB0ZXh0IHdpdGhvdXQgSFRNTCB0YWdzXG4gICAqL1xuICBwcml2YXRlIHN0cmlwSHRtbFRhZ3MoaHRtbFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWh0bWxTdHJpbmcpIHJldHVybiAnJztcbiAgICBcbiAgICAvLyBVc2UgYnJvd3NlcidzIERPTVBhcnNlciBpZiBhdmFpbGFibGVcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gaHRtbFN0cmluZztcbiAgICAgICAgcmV0dXJuIHRlbXBEaXYudGV4dENvbnRlbnQgfHwgdGVtcERpdi5pbm5lclRleHQgfHwgJyc7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBGYWxsYmFjayB0byByZWdleCBpZiBET00gcGFyc2luZyBmYWlsc1xuICAgICAgICByZXR1cm4gaHRtbFN0cmluZy5yZXBsYWNlKC88W14+XSo+L2csICcnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gRmFsbGJhY2s6IHJlZ2V4LWJhc2VkIHRhZyByZW1vdmFsIGZvciBzZXJ2ZXItc2lkZSByZW5kZXJpbmdcbiAgICByZXR1cm4gaHRtbFN0cmluZy5yZXBsYWNlKC88W14+XSo+L2csICcnKTtcbiAgfVxuXG4gIHNlbGVjdFRlbXBsYXRlKHRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSk6IHZvaWQge1xuICAgIGlmKHRoaXMucHJldmVudFNlbGVjdFRlbXBsYXRlLmluY2x1ZGVzKHRlbXBsYXRlLmRpc3BsYXlOYW1lIHx8ICcnKSkge1xuICAgICAgdGhpcy50ZW1wbGF0ZUNoYW5nZWQuZW1pdCh0ZW1wbGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudGVtcGxhdGVDaGFuZ2VkLmVtaXQodGVtcGxhdGUpO1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIFxuICAgIC8vIENsZWFyIGNhY2hlIHdoZW4gdGVtcGxhdGUgY2hhbmdlc1xuICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG4gICAgXG4gICAgaWYodGhpcy5zZXRUZW1wbGF0ZVZhcmlhYmxlcyAmJiB0ZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGRlZmVyIGhlYXZ5IG9wZXJhdGlvbnMgYW5kIHByZXZlbnQgVUkgZnJlZXppbmdcbiAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBVSSB0byB1cGRhdGUgZmlyc3QsIHRoZW4gcHJvY2VzcyB0aGUgdGVtcGxhdGUgdmFyaWFibGVzXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRUZW1wbGF0ZVZhcmlhYmxlcyh0ZW1wbGF0ZSk7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ0ZW1wbGF0ZVZhcmlhYmxlc1wiLCB0aGlzLnRlbXBsYXRlVmFyaWFibGVzKTtcbiAgICAgICAgICBcbiAgICAgICAgICB0aGlzLmJ1aWxkVmFyaWFibGVzRm9ybSgpO1xuICAgICAgICAgIC8vIEluaXRpYWxpemUgdXBkYXRlZCBIVE1MIGdyYW1tYXJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUh0bWxHcmFtbWFyKCk7XG4gICAgICAgICAgdGhpcy5hcHBseUVsZW1lbnRTY3JlZW5QcmVmaWxsKCk7XG5cbiAgICAgICAgICAvLyBJbml0aWFsaXplIGFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlc1xuICAgICAgICAgIGlmICh0aGlzLnNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyA9IHRoaXMuc2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyh0ZW1wbGF0ZSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXNcIiwgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKTtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcHJvY2Vzc2luZyB0ZW1wbGF0ZSB2YXJpYWJsZXM6JywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIHRlbXBsYXRlJ3MgSFRNTCBncmFtbWFyIGlmIG5vIHZhcmlhYmxlc1xuICAgICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSB0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJztcbiAgICAgIFxuICAgICAgLy8gSW5pdGlhbGl6ZSBhZHZhbmNlZCBzZXR0aW5ncyB2YXJpYWJsZXMgZXZlbiBpZiBubyB0ZW1wbGF0ZSB2YXJpYWJsZXNcbiAgICAgIGlmICh0aGlzLnNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMpIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gdGhpcy5zZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKHRlbXBsYXRlKTtcbiAgICAgICAgdGhpcy5idWlsZEFkdmFuY2VkVmFyaWFibGVzRm9ybSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gYXJyYXlcbiAgICB3aGlsZSAodGhpcy52YXJpYWJsZXNGb3JtLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIC8vIENsZWFyIGNhY2hlIHdoZW4gZm9ybSBpcyByZWJ1aWx0XG4gICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcblxuICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gcHJldmlvdXMgc3Vic2NyaXB0aW9uIGlmIGl0IGV4aXN0c1xuICAgIGlmICh0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8vIEFkZCBmb3JtIGdyb3VwcyBmb3IgZWFjaCB2YXJpYWJsZVxuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiB2YXJpYWJsZXMgLSB1c2UgYm9vbGVhbiB2YWx1ZSwgb3RoZXJzIHVzZSBzdHJpbmdcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyBcbiAgICAgICAgPyAodmFyaWFibGUudmFsdWUgPT09IHRydWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICd0cnVlJyB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gMSlcbiAgICAgICAgOiAodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgXG4gICAgICAvLyBDcmVhdGUgYSBGb3JtR3JvdXAgZm9yIGVhY2ggdmFyaWFibGUgd2l0aCBuYW1lIGFuZCB2YWx1ZVxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiBbZGVmYXVsdFZhbHVlXSxcbiAgICAgICAgdHlwZTogW3ZhcmlhYmxlLnR5cGUgfHwgJ3N0cmluZyddLFxuICAgICAgICBsYWJlbDogW3ZhcmlhYmxlLmxhYmVsIHx8ICcnXSxcbiAgICAgICAgb3B0aW9uczogW3ZhcmlhYmxlLm9wdGlvbnMgfHwgW11dXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gQWRkIGRhdGFUeXBlIGNvbnRyb2wgZm9yIHRlc3QtZGF0YSB2YXJpYWJsZXMgaWYgbmVlZGVkXG4gICAgICBjb25zdCBsYWJlbCA9IHZhcmlhYmxlLmxhYmVsPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgaWYgKGxhYmVsID09PSAndGVzdF9kYXRhJyB8fCBsYWJlbCA9PT0gJ3NvdXJjZS12YWx1ZScgfHwgbGFiZWwgPT09ICd0YXJnZXQtdmFsdWUnIHx8IFxuICAgICAgICAgIGxhYmVsID09PSAnc291cmNlX3ZhbHVlJyB8fCBsYWJlbCA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgLy8gUGFyc2UgdGhlIHZhbHVlIHRvIGRldGVybWluZSBkYXRhIHR5cGVcbiAgICAgICAgY29uc3QgdmFsdWVTdHIgPSBTdHJpbmcoZGVmYXVsdFZhbHVlIHx8ICcnKTtcbiAgICAgICAgbGV0IGRhdGFUeXBlID0gJ3BsYWluLXRleHQnO1xuICAgICAgICBpZiAodmFsdWVTdHIuc3RhcnRzV2l0aCgnQHwnKSAmJiB2YWx1ZVN0ci5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICAgICAgZGF0YVR5cGUgPSAncGFyYW1ldGVyJztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCckfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgICBkYXRhVHlwZSA9ICdydW50aW1lJztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCcqfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgICBkYXRhVHlwZSA9ICdlbnZpcm9ubWVudCc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdkYXRhVHlwZScsIG5ldyBGb3JtQ29udHJvbChkYXRhVHlwZSkpO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucHVzaCh2YXJpYWJsZUdyb3VwKTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBTdWJzY3JpYmUgdG8gZm9ybSB2YWx1ZSBjaGFuZ2VzIHRvIGludmFsaWRhdGUgY2FjaGUgKG9ubHkgd2hlbiB1c2VyIGFjdHVhbGx5IGNoYW5nZXMgdmFsdWVzKVxuICAgIC8vIE5vdGU6IFdlIHVzZSBlbWl0RXZlbnQ6IGZhbHNlIHdoZW4gcHJvZ3JhbW1hdGljYWxseSBzZXR0aW5nIHZhbHVlcywgc28gdGhpcyB3b24ndCBmaXJlIHVubmVjZXNzYXJpbHlcbiAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLnZhcmlhYmxlc0Zvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gYXJyYXlcbiAgICB3aGlsZSAodGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5yZW1vdmVBdCgwKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZm9ybSBncm91cHMgZm9yIGVhY2ggYWR2YW5jZWQgdmFyaWFibGVcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IHR5cGVzXG4gICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnk7XG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3N0cl9saXN0Jykge1xuICAgICAgICAvLyBGb3Igc3RyX2xpc3QsIGNyZWF0ZSBhIEZvcm1BcnJheVxuICAgICAgICBjb25zdCB2YWx1ZUFycmF5ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZS52YWx1ZSkgPyB2YXJpYWJsZS52YWx1ZSA6IFtdO1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KFxuICAgICAgICAgIHZhbHVlQXJyYXkubGVuZ3RoID4gMCBcbiAgICAgICAgICAgID8gdmFsdWVBcnJheS5tYXAoKGl0ZW06IHN0cmluZykgPT4gdGhpcy5mYi5jb250cm9sKGl0ZW0pKVxuICAgICAgICAgICAgOiBbdGhpcy5mYi5jb250cm9sKCcnKV0gLy8gU3RhcnQgd2l0aCBvbmUgZW1wdHkgY29udHJvbFxuICAgICAgICApO1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBmb3JtQXJyYXk7XG4gICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgdmFyaWFibGUudmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudmFsdWUgfHwgJyc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBhIEZvcm1Hcm91cCBmb3IgZWFjaCB2YXJpYWJsZVxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiB2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnID8gZGVmYXVsdFZhbHVlIDogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICAgIHR5cGU6IFt2YXJpYWJsZS50eXBlIHx8ICdzdHJpbmcnXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCAnJ11cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIH0pO1xuICB9XG4gIFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhbiB1cCBzdWJzY3JpcHRpb24gdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICBpZiAodGhpcy5mb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXRTZWxlY3RDb25maWcodmFyaWFibGU6IGFueSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fJHt2YXJpYWJsZS5vcHRpb25zPy5qb2luKCcsJykgfHwgJyd9YDtcbiAgICBpZiAodGhpcy5zZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9ICh2YXJpYWJsZS5vcHRpb25zIHx8IFtdKS5tYXAoKG9wdDogc3RyaW5nKSA9PiAoe1xuICAgICAgaWQ6IG9wdCxcbiAgICAgIHZhbHVlOiBvcHQsXG4gICAgICBuYW1lOiBvcHQsXG4gICAgICBsYWJlbDogb3B0XG4gICAgfSkpO1xuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6IGB2YWx1ZWAsIC8vIFVzZSAndmFsdWUnIGFzIGtleSBzaW5jZSB3ZSdyZSBhY2Nlc3NpbmcgZnJvbSBGb3JtQXJyYXlcbiAgICAgIHBsYWNlaG9sZGVyOiBgU2VsZWN0ICR7dmFyaWFibGUubGFiZWx9YCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIFxuICAvKiogR2V0IGZvcm0gZ3JvdXAgZm9yIGEgdmFyaWFibGUgYnkgbmFtZSAqL1xuICBnZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IEZvcm1Hcm91cCB8IG51bGwge1xuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLnZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgLyoqIEFkZCBhIG5ldyB2YXJpYWJsZSB0byB0aGUgZm9ybSBhcnJheSBkeW5hbWljYWxseSAqL1xuICBhZGRWYXJpYWJsZSh2YXJpYWJsZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nIFxuICAgICAgPyAodmFyaWFibGUudmFsdWUgPT09IHRydWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICd0cnVlJyB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gMSlcbiAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICBcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICB2YWx1ZTogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICB0eXBlOiBbdmFyaWFibGUudHlwZSB8fCAnc3RyaW5nJ10sXG4gICAgICBsYWJlbDogW3ZhcmlhYmxlLmxhYmVsIHx8ICcnXSxcbiAgICAgIG9wdGlvbnM6IFt2YXJpYWJsZS5vcHRpb25zIHx8IFtdXVxuICAgIH0pO1xuICAgIFxuICAgIC8vIEFkZCBkYXRhVHlwZSBjb250cm9sIGZvciB0ZXN0LWRhdGEgdmFyaWFibGVzIGlmIG5lZWRlZFxuICAgIGNvbnN0IGxhYmVsID0gdmFyaWFibGUubGFiZWw/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgaWYgKGxhYmVsID09PSAndGVzdF9kYXRhJyB8fCBsYWJlbCA9PT0gJ3NvdXJjZS12YWx1ZScgfHwgbGFiZWwgPT09ICd0YXJnZXQtdmFsdWUnIHx8IFxuICAgICAgICBsYWJlbCA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgbGFiZWwgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICBjb25zdCB2YWx1ZVN0ciA9IFN0cmluZyhkZWZhdWx0VmFsdWUgfHwgJycpO1xuICAgICAgbGV0IGRhdGFUeXBlID0gJ3BsYWluLXRleHQnO1xuICAgICAgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJ0B8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICBkYXRhVHlwZSA9ICdwYXJhbWV0ZXInO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCckfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgZGF0YVR5cGUgPSAncnVudGltZSc7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJyp8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICBkYXRhVHlwZSA9ICdlbnZpcm9ubWVudCc7XG4gICAgICB9XG4gICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2RhdGFUeXBlJywgbmV3IEZvcm1Db250cm9sKGRhdGFUeXBlKSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMudmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcbiAgfVxuXG4gIG9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKFwib25WYXJpYWJsZVZhbHVlQ2hhbmdlXCIsIHZhcmlhYmxlTmFtZSwgdmFsdWUpO1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXkgKHVzZSBlbWl0RXZlbnQ6IGZhbHNlIHRvIHByZXZlbnQgdHJpZ2dlcmluZyB2YWx1ZUNoYW5nZXMpXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMudmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgLy8gSW52YWxpZGF0ZSBmb3JtIHZhbGlkYXRpb24gY2FjaGVcbiAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG4gICAgLy8gVXBkYXRlIEhUTUwgZ3JhbW1hciB3aXRoIG5ldyB2YWx1ZVxuICAgIHRoaXMudXBkYXRlSHRtbEdyYW1tYXIoKTtcbiAgfVxuXG4gIG9uVmFyaWFibGVCb29sZWFuQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXkgKHVzZSBlbWl0RXZlbnQ6IGZhbHNlIHRvIHByZXZlbnQgdHJpZ2dlcmluZyB2YWx1ZUNoYW5nZXMpXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMudmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIG5ldyBmb3JtIGdyb3VwIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW3ZhcmlhYmxlTmFtZV0sXG4gICAgICAgIHZhbHVlOiBbdmFsdWVdLFxuICAgICAgICB0eXBlOiBbJ2Jvb2xlYW4nXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZT8ubGFiZWwgfHwgJyddLFxuICAgICAgICBvcHRpb25zOiBbdmFyaWFibGU/Lm9wdGlvbnMgfHwgW11dXG4gICAgICB9KTtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIH1cbiAgICAvLyBJbnZhbGlkYXRlIGZvcm0gdmFsaWRhdGlvbiBjYWNoZVxuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcbiAgICAvLyBVcGRhdGUgSFRNTCBncmFtbWFyIHdpdGggbmV3IHZhbHVlXG4gICAgdGhpcy51cGRhdGVIdG1sR3JhbW1hcigpO1xuICB9XG5cbiAgb25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICAgIC8vIEZvciBzdHJfbGlzdCwgdGhlIEZvcm1BcnJheSBpcyBhbHJlYWR5IG1hbmFnZWQgaW5zaWRlIEFkdmFuY2VkVmFyaWFibGVzRm9ybUNvbXBvbmVudCxcbiAgICAgIC8vIHNvIHdlIGRvbid0IG5lZWQgdG8gcmVidWlsZCBvciB1cGRhdGUgaXQgaGVyZSB0byBhdm9pZCBmb2N1cyBsb3NzLlxuICAgICAgaWYgKHZhcmlhYmxlPy50eXBlICE9PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIGZvcm1Hcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2VUZW1wbGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlICYmIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSkge1xuICAgICAgdGhpcy5wcmV2aW91c1RlbXBsYXRlRm9yRWRpdCA9IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gbnVsbDtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gW107XG4gICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSAnJztcbiAgICB0aGlzLmFkdmFuY2VkRXhwYW5kZWQgPSBmYWxzZTtcbiAgICAvLyBDbGVhciBmb3JtIGFycmF5c1xuICAgIHdoaWxlICh0aGlzLnZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucmVtb3ZlQXQoMCk7XG4gICAgfVxuICAgIHdoaWxlICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgb25DYW5jZWxUZW1wbGF0ZVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlICYmIHRoaXMucHJldmlvdXNUZW1wbGF0ZUZvckVkaXQpIHtcbiAgICAgIHRoaXMuc2VsZWN0VGVtcGxhdGUodGhpcy5wcmV2aW91c1RlbXBsYXRlRm9yRWRpdCk7XG4gICAgfVxuICB9XG5cbiAgb25CYWNrKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IG51bGw7XG4gICAgdGhpcy5tZXRhZGF0YSA9ICcnO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSAnJztcbiAgICB0aGlzLmFkdmFuY2VkRXhwYW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gW107XG4gICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSAnJztcbiAgICAvLyBDbGVhciBmb3JtIGFycmF5c1xuICAgIHdoaWxlICh0aGlzLnZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucmVtb3ZlQXQoMCk7XG4gICAgfVxuICAgIHdoaWxlICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cbiAgICAvLyBSZWFwcGx5IGZpbHRlciB0byBtYWludGFpbiBzZWFyY2ggc3RhdGVcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNFZGl0TW9kZSkgdGhpcy5vbkJhY2soKTtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBVc2UgY2FjaGVkIHJlc3VsdCBpZiBhdmFpbGFibGUgYW5kIHJlY2VudFxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgaWYgKHRoaXMuZm9ybVZhbGlkQ2FjaGUgJiYgKG5vdyAtIHRoaXMubGFzdEZvcm1WYWxpZGF0aW9uVGltZSkgPCB0aGlzLkZPUk1fVkFMSURBVElPTl9DQUNIRV9NUykge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybVZhbGlkQ2FjaGU7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGlmIGFsbCByZXF1aXJlZCB2YXJpYWJsZXMgYXJlIGZpbGxlZDpcbiAgICAvLyBGb3IgYW55IHRlbXBsYXRlIHZhcmlhYmxlIHdpdGggZGF0YUtleSAndGVzdF9kYXRhJyB8ICdzb3VyY2VfdmFsdWUnIHwgJ3RhcmdldF92YWx1ZSdcbiAgICAvLyBBTkQgZGF0YVR5cGUgJ3BsYWluLXRleHQnIG9yICdydW50aW1lJywgdGhlIHVuZGVybHlpbmcgdmFsdWUgbXVzdCBiZSBub24tZW1wdHkuXG4gICAgbGV0IGN1c3RvbVZhcmlhYmxlc1ZhbGlkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGN1c3RvbVZhcmlhYmxlc1ZhbGlkID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5ldmVyeSh2YXJpYWJsZSA9PiB7XG4gICAgICAgIGlmICh2YXJpYWJsZS5kYXRhS2V5ID09PSAndGVzdF9kYXRhJyB8fCB2YXJpYWJsZS5kYXRhS2V5ID09PSAnc291cmNlX3ZhbHVlJyB8fCB2YXJpYWJsZS5kYXRhS2V5ID09PSAndGFyZ2V0X3ZhbHVlJykge1xuICAgICAgICAgIGlmICh2YXJpYWJsZS5kYXRhVHlwZSA9PT0gJ3BsYWluLXRleHQnIHx8IHZhcmlhYmxlLmRhdGFUeXBlID09PSAncnVudGltZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGUudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHZhcmlhYmxlLmRhdGFUeXBlID09PSAncGFyYW1ldGVyJyl7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZih2YXJpYWJsZS5kYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50Jyl7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZih2YXJpYWJsZS5kYXRhS2V5ID09PSAnZWxlbWVudCcpe1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGUudmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ29tYmluZSByZWFjdGl2ZSBmb3JtIHZhbGlkaXR5IHdpdGggY3VzdG9tIHZhcmlhYmxlIHZhbGlkYXRpb25cbiAgICBjb25zdCByZWFjdGl2ZVZhbGlkID0gdGhpcy52YXJpYWJsZXNGb3JtLnZhbGlkICYmIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnZhbGlkO1xuICAgIGNvbnN0IGZpbmFsVmFsaWQgPSByZWFjdGl2ZVZhbGlkICYmIGN1c3RvbVZhcmlhYmxlc1ZhbGlkO1xuXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmaW5hbFZhbGlkO1xuICAgIHRoaXMubGFzdEZvcm1WYWxpZGF0aW9uVGltZSA9IG5vdztcbiAgICByZXR1cm4gZmluYWxWYWxpZDtcbiAgfVxuICBcbiAgdHJhY2tCeVRlbXBsYXRlKGluZGV4OiBudW1iZXIsIHRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSk6IGFueSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmlkIHx8IHRlbXBsYXRlLmRpc3BsYXlOYW1lIHx8IGluZGV4O1xuICB9XG4gIFxuICB0cmFja0J5VmFyaWFibGUoaW5kZXg6IG51bWJlciwgdmFyaWFibGU6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLm5hbWUgfHwgaW5kZXg7XG4gIH1cblxuICBvbkNyZWF0ZVN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gR2V0IGVudmlyb25tZW50IElEcyBmcm9tIHRlbXBsYXRlIHZhcmlhYmxlcyAoaWYgYW55IGVudmlyb25tZW50IHR5cGUgdmFyaWFibGVzIGFyZSBzZWxlY3RlZClcbiAgICBjb25zdCBlbnZpcm9ubWVudElkcyA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtPy5nZXRFbnZpcm9ubWVudElkc0ZvclZhcmlhYmxlcygpIHx8IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgY29uc3QgY3VycmVudFRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5nZXRDdXJyZW50VGVtcGxhdGVWYXJpYWJsZXMoKTtcbiAgICBcbiAgICAvLyBTeW5jIGFkdmFuY2VkIHZhcmlhYmxlcyBmcm9tIGZvcm0gdG8gYXJyYXlcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgICAgaWYgKGZvcm1Hcm91cCkge1xuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSBmb3JtR3JvdXAuZ2V0KCd2YWx1ZScpPy52YWx1ZTtcbiAgICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdzdHJfbGlzdCcgJiYgZm9ybVZhbHVlIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgLy8gRXh0cmFjdCB2YWx1ZXMgZnJvbSBGb3JtQXJyYXlcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1WYWx1ZS5jb250cm9scy5tYXAoY29udHJvbCA9PiBjb250cm9sLnZhbHVlKS5maWx0ZXIoKHZhbDogc3RyaW5nKSA9PiB2YWwgJiYgdmFsLnRyaW0oKSAhPT0gJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybVZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgY29uc3Qgc3RlcERhdGEgPSB7XG4gICAgICB0ZW1wbGF0ZTogdGhpcy5zZWxlY3RlZFRlbXBsYXRlLFxuICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIHRlbXBsYXRlVmFyaWFibGVzOiBjdXJyZW50VGVtcGxhdGVWYXJpYWJsZXMsXG4gICAgICAvLyB0ZXN0RGF0YUxpc3Q6IHRoaXMuYnVpbGRUZXN0RGF0YUxpc3QoY3VycmVudFRlbXBsYXRlVmFyaWFibGVzKSxcbiAgICAgIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyxcbiAgICAgIGVudmlyb25tZW50SWRzOiBlbnZpcm9ubWVudElkcyAvLyBNYXAgb2YgdmFyaWFibGUgbmFtZSB0byBlbnZpcm9ubWVudCBJRFxuICAgIH07XG4gICAgY29uc29sZS5sb2coXCJzdGVwRGF0YVwiLCBzdGVwRGF0YSk7XG4gICAgY29uc29sZS5sb2coXCJ2YXJpYWJsZXNGb3JtXCIsIHRoaXMudmFyaWFibGVzRm9ybS52YWx1ZSk7XG4gICAgY29uc29sZS5sb2coXCJhZHZhbmNlZFZhcmlhYmxlc0Zvcm1cIiwgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0udmFsdWUpO1xuICAgIGNvbnNvbGUubG9nKFwiZW52aXJvbm1lbnRJZHNcIiwgZW52aXJvbm1lbnRJZHMpO1xuICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VycmVudFRlbXBsYXRlVmFyaWFibGVzKCk6IFRlbXBsYXRlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgY2hpbGRWYXJpYWJsZXMgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybT8udGVtcGxhdGVWYXJpYWJsZXM7XG4gICAgaWYgKGNoaWxkVmFyaWFibGVzICYmIGNoaWxkVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSBjaGlsZFZhcmlhYmxlcztcbiAgICAgIHJldHVybiBjaGlsZFZhcmlhYmxlcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgfHwgW107XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVGVzdERhdGFMaXN0KHZhcmlhYmxlczogVGVtcGxhdGVWYXJpYWJsZVtdKTogU3RlcFRlc3REYXRhTGlzdEl0ZW1bXSB7XG4gICAgY29uc3QgdGVzdERhdGFMaXN0OiBTdGVwVGVzdERhdGFMaXN0SXRlbVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHZhcmlhYmxlIG9mIHZhcmlhYmxlcyB8fCBbXSkge1xuICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB2YXJpYWJsZT8udmFsdWU7XG4gICAgICBpZiAoZm9ybWF0dGVkVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBmb3JtYXR0ZWRWYWx1ZSA9PT0gbnVsbCB8fCBmb3JtYXR0ZWRWYWx1ZSA9PT0gJycpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5yZXNvbHZlVmFyaWFibGVUZXN0RGF0YVZhbHVlKHZhcmlhYmxlKTtcbiAgICAgIGlmICghaXRlbS50ZXN0RGF0YSkgY29udGludWU7XG4gICAgICB0ZXN0RGF0YUxpc3QucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGVzdERhdGFMaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlVmFyaWFibGVUZXN0RGF0YVZhbHVlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogU3RlcFRlc3REYXRhTGlzdEl0ZW0ge1xuICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdmFyaWFibGU/LnZhbHVlICE9IG51bGwgPyBTdHJpbmcodmFyaWFibGUudmFsdWUpIDogJyc7XG4gICAgY29uc3QgcmF3VmFsdWUgPSB2YXJpYWJsZT8ucmF3VmFsdWUgIT0gbnVsbCAmJiBTdHJpbmcodmFyaWFibGUucmF3VmFsdWUpICE9PSAnJyA/IFN0cmluZyh2YXJpYWJsZS5yYXdWYWx1ZSkgOiBmb3JtYXR0ZWRWYWx1ZTtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlPy5kYXRhVHlwZSB8fCB0aGlzLnBhcnNlVmFyaWFibGVEYXRhVHlwZShmb3JtYXR0ZWRWYWx1ZSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IHRoaXMucmVzb2x2ZVNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQodmFyaWFibGUpO1xuXG4gICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVzdERhdGE6IHJhd1ZhbHVlLFxuICAgICAgICB0ZXN0RGF0YVR5cGU6ICdwYXJhbWV0ZXInLFxuICAgICAgICB0ZXN0RGF0YUtleTogdmFyaWFibGUubmFtZSxcbiAgICAgICAgLi4uKHNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCAmJiB7IHRlc3REYXRhUHJvZmlsZUlkOiBzZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkIH0pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YVR5cGUgPT09ICdydW50aW1lJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVzdERhdGE6IHJhd1ZhbHVlLFxuICAgICAgICB0ZXN0RGF0YUtleTogdmFyaWFibGUubmFtZSxcbiAgICAgICAgdGVzdERhdGFUeXBlOiAncnVudGltZScsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVzdERhdGE6IHJhd1ZhbHVlLFxuICAgICAgICB0ZXN0RGF0YUtleTogdmFyaWFibGUubmFtZSxcbiAgICAgICAgdGVzdERhdGFUeXBlOiAnZW52aXJvbm1lbnQnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVzdERhdGE6IGZvcm1hdHRlZFZhbHVlLFxuICAgICAgdGVzdERhdGFLZXk6IHZhcmlhYmxlLm5hbWUsXG4gICAgICB0ZXN0RGF0YVR5cGU6ICdyYXcnLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVTZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmICFpc05hTihOdW1iZXIodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCkpKSB7XG4gICAgICByZXR1cm4gTnVtYmVyKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybT8uZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlVmFsdWUgPSB2YXJpYWJsZUdyb3VwPy5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnZhbHVlO1xuXG4gICAgaWYgKHNlbGVjdGVkUHJvZmlsZVZhbHVlICE9IG51bGwgJiYgc2VsZWN0ZWRQcm9maWxlVmFsdWUgIT09ICcnICYmICFpc05hTihOdW1iZXIoc2VsZWN0ZWRQcm9maWxlVmFsdWUpKSkge1xuICAgICAgcmV0dXJuIE51bWJlcihzZWxlY3RlZFByb2ZpbGVWYWx1ZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlTmFtZSA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlIHx8IHNlbGVjdGVkUHJvZmlsZVZhbHVlO1xuICAgIGlmIChzZWxlY3RlZFByb2ZpbGVOYW1lICE9IG51bGwgJiYgc2VsZWN0ZWRQcm9maWxlTmFtZSAhPT0gJycpIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHByb2ZpbGVOYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICAgIHJldHVybiBwcm9maWxlTmFtZSA9PT0gc2VsZWN0ZWRQcm9maWxlTmFtZTtcbiAgICAgIH0pO1xuICAgICAgaWYgKG1hdGNoaW5nUHJvZmlsZT8uaWQgIT0gbnVsbCAmJiAhaXNOYU4oTnVtYmVyKG1hdGNoaW5nUHJvZmlsZS5pZCkpKSB7XG4gICAgICAgIHJldHVybiBOdW1iZXIobWF0Y2hpbmdQcm9maWxlLmlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVZhcmlhYmxlRGF0YVR5cGUodmFsdWU6IHN0cmluZyk6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JyB7XG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ0B8JykgJiYgdmFsdWUuZW5kc1dpdGgoJ3wnKSkgcmV0dXJuICdwYXJhbWV0ZXInO1xuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCckfCcpICYmIHZhbHVlLmVuZHNXaXRoKCd8JykpIHJldHVybiAncnVudGltZSc7XG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyp8JykgJiYgdmFsdWUuZW5kc1dpdGgoJ3wnKSkgcmV0dXJuICdlbnZpcm9ubWVudCc7XG4gICAgcmV0dXJuICdwbGFpbi10ZXh0JztcbiAgfVxuXG4gIHRvZ2dsZUFkdmFuY2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9ICF0aGlzLmFkdmFuY2VkRXhwYW5kZWQ7XG4gIH1cblxuXG4gIG9uRWxlbWVudENsaWNrKGVsZW1lbnRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEZvY3VzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IGZpZWxkXG4gICAgLy8gVGhpcyBjYW4gYmUgZW5oYW5jZWQgdG8gc2Nyb2xsIHRvIG9yIGhpZ2hsaWdodCB0aGUgZmllbGRcbiAgfVxuXG4gIG9uRWxlbWVudFZhbHVlQ2hhbmdlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBvblRlc3REYXRhVmFsdWVDaGFuZ2Uoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgSFRNTCBncmFtbWFyIGJ5IHJlcGxhY2luZyBwbGFjZWhvbGRlciBzcGFucyB3aXRoIGFjdHVhbCB2YXJpYWJsZSB2YWx1ZXMuXG4gICAqIERlbGVnYXRlcyB0byBjb21wdXRlSHRtbEdyYW1tYXJGbiB3aGVuIHByb3ZpZGVkIGJ5IHRoZSBob3N0IGFwcCAoY2VudHJhbGlzZWQgbG9naWMgaW4gU3RlcEJ1aWxkZXJTZXJ2aWNlKS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlSHRtbEdyYW1tYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcHV0ZUh0bWxHcmFtbWFyRm4pIHtcbiAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gdGhpcy5jb21wdXRlSHRtbEdyYW1tYXJGbih0aGlzLnNlbGVjdGVkVGVtcGxhdGUsIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zZWxlY3RlZFRlbXBsYXRlKSB7XG4gICAgICB0aGlzLnVwZGF0ZWRIdG1sR3JhbW1hciA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGh0bWxHcmFtbWFyID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJztcbiAgICBpZiAoIWh0bWxHcmFtbWFyKSB7XG4gICAgICB0aGlzLnVwZGF0ZWRIdG1sR3JhbW1hciA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIG1hcCBvZiB2YXJpYWJsZSB2YWx1ZXMgYnkgbmFtZSBmb3IgcXVpY2sgbG9va3VwXG4gICAgY29uc3QgdmFsdWVNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGlmICh0aGlzLnRlbXBsYXRlVmFyaWFibGVzICYmIEFycmF5LmlzQXJyYXkodGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGU6IGFueSkgPT4ge1xuICAgICAgICBpZiAodmFyaWFibGUubmFtZSAmJiB2YXJpYWJsZS52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhcmlhYmxlLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29udmVydCB2YWx1ZSB0byBzdHJpbmcsIGhhbmRsaW5nIGJvb2xlYW4gdmFsdWVzXG4gICAgICAgICAgbGV0IHZhbHVlU3RyID0gJyc7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YXJpYWJsZS52YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB2YWx1ZVN0ciA9IHZhcmlhYmxlLnZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLmRhdGFLZXkgPT09ICdlbGVtZW50JyAmJiB2YXJpYWJsZS5uYW1lICE9PSAnc2VsZWN0b3InKSB7XG4gICAgICAgICAgICAvLyBPbmx5IHVzZSBlbGVtZW50TmFtZSBpZiBpdCdzIGRlZmluZWQgYW5kIG5vdCBlbXB0eVxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmVsZW1lbnROYW1lICE9PSB1bmRlZmluZWQgJiYgdmFyaWFibGUuZWxlbWVudE5hbWUgIT09IG51bGwgJiYgdmFyaWFibGUuZWxlbWVudE5hbWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgIHZhbHVlU3RyID0gU3RyaW5nKHZhcmlhYmxlLmVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFNraXAgdGhpcyB2YXJpYWJsZSAtIGRvbid0IGFkZCB0byBtYXAgaWYgZWxlbWVudCBpcyBub3Qgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUuZGF0YUtleSA9PT0gJ2VsZW1lbnQnICYmIHZhcmlhYmxlLm5hbWUgPT09ICdzZWxlY3RvcicpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgdXNlIGVsZW1lbnRMb2NhdG9yIGlmIGl0J3MgZGVmaW5lZCBhbmQgbm90IGVtcHR5XG4gICAgICAgICAgICBpZiAodmFyaWFibGUuZWxlbWVudExvY2F0b3IgIT09IHVuZGVmaW5lZCAmJiB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciAhPT0gbnVsbCAmJiB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciAhPT0gJycpIHtcbiAgICAgICAgICAgICAgdmFsdWVTdHIgPSBTdHJpbmcodmFyaWFibGUuZWxlbWVudExvY2F0b3IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIHZhcmlhYmxlIC0gZG9uJ3QgYWRkIHRvIG1hcCBpZiBlbGVtZW50IGxvY2F0b3IgaXMgbm90IGF2YWlsYWJsZVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlU3RyID0gU3RyaW5nKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gT25seSBhZGQgdG8gbWFwIGlmIHZhbHVlU3RyIGlzIG5vdCBlbXB0eSBhbmQgbm90IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICBpZiAodmFsdWVTdHIgJiYgdmFsdWVTdHIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlU3RyLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgIHZhbHVlTWFwLnNldCh2YXJpYWJsZS5uYW1lLCB2YWx1ZVN0cik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBVc2UgYnJvd3NlcidzIERPTVBhcnNlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsYmFjayB0byBzdHJpbmcgcmVwbGFjZW1lbnRcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gU3RyaW5nKGh0bWxHcmFtbWFyKTtcblxuICAgICAgICAvLyBGaW5kIGFsbCBzcGFucyB3aXRoIGRhdGEtZXZlbnQta2V5IGF0dHJpYnV0ZVxuICAgICAgICBjb25zdCBzcGFucyA9IHRlbXBEaXYucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3NwYW5bZGF0YS1ldmVudC1rZXldJyk7XG4gICAgICAgIHNwYW5zLmZvckVhY2goKHNwYW46IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgZXZlbnRLZXkgPSBzcGFuLmdldEF0dHJpYnV0ZSgnZGF0YS1ldmVudC1rZXknKTtcbiAgICAgICAgICBpZiAoZXZlbnRLZXkgJiYgdmFsdWVNYXAuaGFzKGV2ZW50S2V5KSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZU1hcC5nZXQoZXZlbnRLZXkpO1xuICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgaWYgdmFsdWUgaXMgdmFsaWQgKG5vdCB1bmRlZmluZWQsIG5vdCBlbXB0eSlcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgc3BhbiBzdHJ1Y3R1cmUgYnV0IHVwZGF0ZSB0aGUgY29udGVudFxuICAgICAgICAgICAgICBzcGFuLmlubmVySFRNTCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdmFsdWUgaXMgaW52YWxpZCwgbGVhdmUgdGhlIHNwYW4gY29udGVudCBhcyBpcyAoZG9uJ3QgcmVwbGFjZSB3aXRoIHVuZGVmaW5lZClcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gdGVtcERpdi5pbm5lckhUTUw7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB1cGRhdGluZyBIVE1MIGdyYW1tYXI6JywgZXJyb3IpO1xuICAgICAgICAvLyBGYWxsYmFjayB0byBvcmlnaW5hbCBIVE1MIGdyYW1tYXJcbiAgICAgICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSBTdHJpbmcoaHRtbEdyYW1tYXIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGYWxsYmFjazogc2ltcGxlIHN0cmluZyByZXBsYWNlbWVudCBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nXG4gICAgICBsZXQgdXBkYXRlZEh0bWwgPSBTdHJpbmcoaHRtbEdyYW1tYXIpO1xuICAgICAgdmFsdWVNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAvLyBPbmx5IHJlcGxhY2UgaWYgdmFsdWUgaXMgdmFsaWQgKG5vdCB1bmRlZmluZWQsIG5vdCBlbXB0eSlcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgLy8gUmVwbGFjZSBzcGFucyB3aXRoIGRhdGEtZXZlbnQta2V5IG1hdGNoaW5nIHRoZSB2YXJpYWJsZSBuYW1lXG4gICAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGA8c3BhbltePl0qZGF0YS1ldmVudC1rZXk9XCIke2tleX1cIltePl0qPi4qPzwvc3Bhbj5gLCAnZ2knKTtcbiAgICAgICAgICB1cGRhdGVkSHRtbCA9IHVwZGF0ZWRIdG1sLnJlcGxhY2UocmVnZXgsIChtYXRjaCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgY29udGVudCBpbnNpZGUgdGhlIHNwYW5cbiAgICAgICAgICAgIHJldHVybiBtYXRjaC5yZXBsYWNlKC8+Lio/PC8sIGA+JHt2YWx1ZX08YCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSB1cGRhdGVkSHRtbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgc2VsZWN0b3IgdmFyaWFibGUgaXMgYXZhaWxhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzXG4gICAqL1xuICBnZXQgc2VsZWN0b3JWYXJpYWJsZUF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5zb21lKHYgPT4gdi5kYXRhS2V5ID09PSAnZWxlbWVudCcgfHwgdi5kYXRhS2V5ID09PSAnbGFiZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwYXJhbWV0ZXIgdmFyaWFibGUgaXMgYXZhaWxhYmxlICh0ZXN0RGF0YSB3aXRoIHBhcmFtZXRlciB0eXBlKVxuICAgKi9cbiAgZ2V0IHBhcmFtZXRlclZhcmlhYmxlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLnNvbWUodiA9PiB7XG4gICAgICBjb25zdCBkYXRhS2V5ID0gdi5kYXRhS2V5Py50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgaWYgKGRhdGFLZXkgPT09ICd0ZXN0X2RhdGEnIHx8IGRhdGFLZXkgPT09ICdzb3VyY2VfdmFsdWUnIHx8IGRhdGFLZXkgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICAgIC8vIGNvbnN0IGRhdGFUeXBlID0gdGhpcy52YXJpYWJsZURhdGFUeXBlcy5nZXQodi5uYW1lKSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGF2YWlsYWJsZSAodGVzdERhdGEgd2l0aCBlbnZpcm9ubWVudCB0eXBlKVxuICAgKi9cbiAgZ2V0IGVudmlyb25tZW50VmFyaWFibGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuc29tZSh2ID0+IHtcbiAgICAgIGNvbnN0IGRhdGFLZXkgPSB2LmRhdGFLZXk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBpZiAoZGF0YUtleSA9PT0gJ3Rlc3RfZGF0YScgfHwgZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgZGF0YUtleSA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgLy8gY29uc3QgZGF0YVR5cGUgPSB0aGlzLnZhcmlhYmxlRGF0YVR5cGVzLmdldCh2Lm5hbWUpIHx8ICdwbGFpbi10ZXh0JztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1mdWxsIGNxYS1iZy13aGl0ZSBjcWEtcC1bMTZweF1cIiBbbmdDbGFzc109XCJ7J2NxYS1weC00Jzogc2hvd0hlYWRlciwgJ2NxYS1weS0yJzogc2hvd0hlYWRlciAmJiAhc2VsZWN0ZWRUZW1wbGF0ZX1cIj5cbiAgPCEtLSBIZWFkZXIgLS0+XG4gIFxuICA8ZGl2ICpuZ0lmPVwic2hvd0hlYWRlclwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1tYi0yXCI+XG4gICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWJsYWNrLTEwMCBjcWEtbS0wXCI+XG4gICAgICB7eyBpc0VkaXRNb2RlID8gJ0VkaXQgYW4gYWN0aW9uIHN0ZXAnIDogJ0NyZWF0ZSBhbiBhY3Rpb24gc3RlcCcgfX1cbiAgICA8L2gyPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICAqbmdJZj1cImlzRWRpdE1vZGUgJiYgc2VsZWN0ZWRUZW1wbGF0ZVwiXG4gICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgYnRuU2l6ZT1cInNtXCJcbiAgICAgIGljb249XCJzd2FwX2hvcml6XCJcbiAgICAgIHRleHQ9XCJDaGFuZ2UgVGVtcGxhdGVcIlxuICAgICAgKGNsaWNrZWQpPVwib25DaGFuZ2VUZW1wbGF0ZSgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICAqbmdJZj1cImlzRWRpdE1vZGUgJiYgIXNlbGVjdGVkVGVtcGxhdGVcIlxuICAgICAgdmFyaWFudD1cInRleHRcIlxuICAgICAgYnRuU2l6ZT1cInNtXCJcbiAgICAgIHRleHQ9XCJDYW5jZWxcIlxuICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWxUZW1wbGF0ZVNlbGVjdGlvbigpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cIiFzZWxlY3RlZFRlbXBsYXRlXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWgtZnVsbCBjcWEtZmxleC0xXCJcbiAgICBbbmdDbGFzc109XCJ7J2NxYS1weC0zJzogc2hvd0hlYWRlcn1cIj5cblxuICAgIDwhLS0gU2VhcmNoIEJhciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXBiLTFcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcGItMVwiICpuZ0lmPVwic2hvd0hlYWRlclwiPlxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgIFRlbXBsYXRlIGxpYnJhcnlcbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8Y3FhLXNlYXJjaC1iYXIgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgW3ZhbHVlXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKCRldmVudClcIiAoc2VhcmNoKT1cIm9uU2VhcmNoU3VibWl0KCRldmVudClcIiAoY2xlYXJlZCk9XCJvblNlYXJjaENsZWFyZWQoKVwiPlxuICAgICAgPC9jcWEtc2VhcmNoLWJhcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVGVtcGxhdGUgTGlzdCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1weC0yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXB5LTJcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdGVtcGxhdGUgb2YgZmlsdGVyZWRUZW1wbGF0ZXM7IHRyYWNrQnk6IHRyYWNrQnlUZW1wbGF0ZVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtYWN0aW9uLWZvcm1hdCBjcWEtYmctd2hpdGUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWFsbCBob3ZlcjpjcWEtYm9yZGVyLWJsdWUtNTAwIGhvdmVyOmNxYS1zaGFkb3ctc20gbWItNlwiXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRlbXBsYXRlKHRlbXBsYXRlKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIzcHhdIGNxYS10ZXh0LWJsYWNrLTEwMFwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cInRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8IHRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnXCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJlZFRlbXBsYXRlcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtcHktOCBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1bMTJweF1cIj5cbiAgICAgICAgICBObyB0ZW1wbGF0ZXMgZm91bmRcbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdGVkVGVtcGxhdGVcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtb3ZlcmZsb3cteS1hdXRvXCIgc3R5bGU9XCJmbGV4OiAxIDEgMCAhaW1wb3J0YW50O1wiPlxuICAgIDwhLS0gSW5zdHJ1Y3Rpb24gVGV4dCB3aXRoIEVsZW1lbnQgQnV0dG9ucyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZmxleC13cmFwIGNxYS1nYXAtMSBjcWEtdGV4dC1zbSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtcHktMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1hY3Rpb24tZm9ybWF0IGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjNweF0gY3FhLXRleHQtYmxhY2stMTAwXCJcbiAgICAgICAgW2lubmVySFRNTF09XCJ1cGRhdGVkSHRtbEdyYW1tYXIgfHwgc2VsZWN0ZWRUZW1wbGF0ZS5odG1sR3JhbW1hciB8fCBzZWxlY3RlZFRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LWVuZCBjcWEtcHQtMiBjcWEtZ2FwLTJcIiAqbmdJZj1cIiFjcmVhdGVFbGVtZW50VmlzaWJsZVwiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiBcbiAgICAgICAgICAqbmdJZj1cInNlbGVjdG9yVmFyaWFibGVBdmFpbGFibGVcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIFxuICAgICAgICAgIGJ0blNpemU9XCJzbVwiXG4gICAgICAgICAgaWNvbj1cImFkZFwiXG4gICAgICAgICAgdGV4dD1cIkNyZWF0ZSBFbGVtZW50XCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJvblNob3dFbGVtZW50Rm9ybSgpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPGNxYS1idXR0b24gXG4gICAgICAgICAgKm5nSWY9XCJwYXJhbWV0ZXJWYXJpYWJsZUF2YWlsYWJsZVwiXG4gICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCIgXG4gICAgICAgICAgYnRuU2l6ZT1cInNtXCJcbiAgICAgICAgICBpY29uPVwiYWRkXCJcbiAgICAgICAgICB0ZXh0PVwiQ3JlYXRlIFBhcmFtZXRlclwiXG4gICAgICAgICAgKGNsaWNrZWQpPVwicmVkaXJlY3RUb1BhcmFtZXRlci5lbWl0KClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiBcbiAgICAgICAgICAqbmdJZj1cImVudmlyb25tZW50VmFyaWFibGVBdmFpbGFibGVcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIFxuICAgICAgICAgIGJ0blNpemU9XCJzbVwiXG4gICAgICAgICAgaWNvbj1cImFkZFwiXG4gICAgICAgICAgdGV4dD1cIkNyZWF0ZSBFbnZpcm9ubWVudFwiXG4gICAgICAgICAgKGNsaWNrZWQpPVwicmVkaXJlY3RUb0Vudmlyb25tZW50LmVtaXQoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRm9ybSBGaWVsZHMgaW4gVHdvIENvbHVtbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1vdmVyZmxvdy15LWF1dG8gY3FhLWZsZXgtMSBjcWEtcGItMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMVwiPlxuICAgICAgICA8IS0tIEVudiBiYW5uZXIg4oCUIHN1cmZhY2VzIHdoaWNoIGVudmlyb25tZW50J3MgdmFyaWFibGVzIGFuZCBURFBzIGFyZSBpbiBzY29wZS4gLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJ0ZXN0Q2FzZUVudmlyb25tZW50TmFtZVwiXG4gICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtbWItMyBjcWEtcHgtMyBjcWEtcHktMiBjcWEtcm91bmRlZC1tZCBjcWEtdGV4dC14cyBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtYmctZ3JheS01MCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItZ3JheS0yMDBcIj5cbiAgICAgICAgICBVc2luZyA8c3Ryb25nIGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGRcIj57eyB0ZXN0Q2FzZUVudmlyb25tZW50TmFtZSB9fSBFbnZpcm9ubWVudDwvc3Ryb25nPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtZ3JheS01MDBcIj7Ctzwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LWdyYXktNTAwXCI+RW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBkYXRhIHByb2ZpbGVzIGFyZSByZXNvbHZlZCBmcm9tIHRoaXMgZW52aXJvbm1lbnQuPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAteC02IGNxYS1mbGV4LXdyYXAgY3FhLXBiLTRcIj5cbiAgICAgICAgICA8IS0tIFRlbXBsYXRlIFZhcmlhYmxlcyBGb3JtIENvbXBvbmVudCAtLT5cbiAgICAgICAgICA8Y3FhLXRlbXBsYXRlLXZhcmlhYmxlcy1mb3JtXG4gICAgICAgICAgICAjdGVtcGxhdGVWYXJpYWJsZXNGb3JtXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlO1wiXG4gICAgICAgICAgICBbaXNEZWJ1Z109XCJpc0RlYnVnXCJcbiAgICAgICAgICAgIFt0ZW1wbGF0ZVZhcmlhYmxlc109XCJ0ZW1wbGF0ZVZhcmlhYmxlc1wiXG4gICAgICAgICAgICBbdmFyaWFibGVzRm9ybV09XCJ2YXJpYWJsZXNGb3JtXCJcbiAgICAgICAgICAgIFttZXRhZGF0YV09XCJtZXRhZGF0YVwiXG4gICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgW2VsZW1lbnRPcHRpb25zXT1cImVsZW1lbnRPcHRpb25zXCJcbiAgICAgICAgICAgIFtoYXNNb3JlRWxlbWVudHNdPVwiaGFzTW9yZUVsZW1lbnRzXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmdFbGVtZW50c109XCJpc0xvYWRpbmdFbGVtZW50c1wiXG4gICAgICAgICAgICBbc2NyZWVuTmFtZU9wdGlvbnNdPVwic2NyZWVuTmFtZU9wdGlvbnNcIlxuICAgICAgICAgICAgW2hhc01vcmVTY3JlZW5OYW1lc109XCJoYXNNb3JlU2NyZWVuTmFtZXNcIlxuICAgICAgICAgICAgW2lzTG9hZGluZ1NjcmVlbk5hbWVzXT1cImlzTG9hZGluZ1NjcmVlbk5hbWVzXCJcbiAgICAgICAgICAgIFtwYXJhbWV0ZXJPcHRpb25zXT1cInBhcmFtZXRlck9wdGlvbnNcIlxuICAgICAgICAgICAgW2hhc01vcmVQYXJhbWV0ZXJzXT1cImhhc01vcmVQYXJhbWV0ZXJzXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmdQYXJhbWV0ZXJzXT1cImlzTG9hZGluZ1BhcmFtZXRlcnNcIlxuICAgICAgICAgICAgW3VwbG9hZE9wdGlvbnNdPVwidXBsb2FkT3B0aW9uc1wiXG4gICAgICAgICAgICBbaGFzTW9yZVVwbG9hZHNdPVwiaGFzTW9yZVVwbG9hZHNcIlxuICAgICAgICAgICAgW2lzTG9hZGluZ1VwbG9hZHNdPVwiaXNMb2FkaW5nVXBsb2Fkc1wiXG4gICAgICAgICAgICBbZW52aXJvbm1lbnRPcHRpb25zXT1cImVudmlyb25tZW50T3B0aW9uc1wiXG4gICAgICAgICAgICBbaGFzTW9yZUVudmlyb25tZW50c109XCJoYXNNb3JlRW52aXJvbm1lbnRzXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmdFbnZpcm9ubWVudHNdPVwiaXNMb2FkaW5nRW52aXJvbm1lbnRzXCJcbiAgICAgICAgICAgIFtnbG9iYWxWYXJpYWJsZU9wdGlvbnNdPVwiZ2xvYmFsVmFyaWFibGVPcHRpb25zXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmdHbG9iYWxWYXJpYWJsZXNdPVwiaXNMb2FkaW5nR2xvYmFsVmFyaWFibGVzXCJcbiAgICAgICAgICAgIFt0ZXN0Q2FzZUVudmlyb25tZW50TmFtZV09XCJ0ZXN0Q2FzZUVudmlyb25tZW50TmFtZVwiXG4gICAgICAgICAgICBbdGVzdENhc2VFbnZpcm9ubWVudExhYmVsU3VmZml4XT1cInRlc3RDYXNlRW52aXJvbm1lbnRMYWJlbFN1ZmZpeFwiXG4gICAgICAgICAgICBbZW52aXJvbm1lbnRMZWdhY3lEZXByZWNhdGlvbk1lc3NhZ2VdPVwiZW52aXJvbm1lbnRMZWdhY3lEZXByZWNhdGlvbk1lc3NhZ2VcIlxuICAgICAgICAgICAgW3Rlc3RDYXNlVGVzdERhdGFJZF09XCJ0ZXN0Q2FzZVRlc3REYXRhSWRcIlxuICAgICAgICAgICAgW2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZF09XCJkZWZhdWx0VGVzdERhdGFQcm9maWxlSWRcIlxuICAgICAgICAgICAgW2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXhdPVwiZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleFwiXG4gICAgICAgICAgICBbZGVmYXVsdFRlc3REYXRhRW5kSW5kZXhdPVwiZGVmYXVsdFRlc3REYXRhRW5kSW5kZXhcIlxuICAgICAgICAgICAgW2lzSW5zaWRlRm9yTG9vcFN0ZXBdPVwiaXNJbnNpZGVGb3JMb29wU3RlcFwiXG4gICAgICAgICAgICBbaGFzVGVzdERhdGFQcm9maWxlXT1cImhhc1Rlc3REYXRhUHJvZmlsZVwiXG4gICAgICAgICAgICBbY3JlYXRlRWxlbWVudFZpc2libGVdPVwiY3JlYXRlRWxlbWVudFZpc2libGVcIlxuICAgICAgICAgICAgKHZhcmlhYmxlVmFsdWVDaGFuZ2UpPVwib25WYXJpYWJsZVZhbHVlQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICh2YXJpYWJsZUJvb2xlYW5DaGFuZ2UpPVwib25WYXJpYWJsZUJvb2xlYW5DaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgKG1ldGFkYXRhQ2hhbmdlKT1cIm1ldGFkYXRhID0gJGV2ZW50XCJcbiAgICAgICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCJkZXNjcmlwdGlvbiA9ICRldmVudFwiXG4gICAgICAgICAgICAobG9hZE1vcmVFbGVtZW50cyk9XCJsb2FkTW9yZUVsZW1lbnRzLmVtaXQoKVwiXG4gICAgICAgICAgICAoc2VhcmNoRWxlbWVudHMpPVwic2VhcmNoRWxlbWVudHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZSk9XCJzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGNyZWF0ZUVsZW1lbnQpPVwiY3JlYXRlRWxlbWVudC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKHNlYXJjaFNjcmVlbk5hbWUpPVwic2VhcmNoU2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlU2NyZWVuTmFtZXMpPVwibG9hZE1vcmVTY3JlZW5OYW1lcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0KT1cImNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VhcmNoUGFyYW1ldGVycyk9XCJzZWFyY2hQYXJhbWV0ZXJzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmVQYXJhbWV0ZXJzKT1cImxvYWRNb3JlUGFyYW1ldGVycy5lbWl0KClcIlxuICAgICAgICAgICAgKHNlYXJjaFVwbG9hZHMpPVwic2VhcmNoVXBsb2Fkcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlVXBsb2Fkcyk9XCJsb2FkTW9yZVVwbG9hZHMuZW1pdCgpXCJcbiAgICAgICAgICAgIChzZWFyY2hFbnZpcm9ubWVudHMpPVwic2VhcmNoRW52aXJvbm1lbnRzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmVFbnZpcm9ubWVudHMpPVwibG9hZE1vcmVFbnZpcm9ubWVudHMuZW1pdCgpXCJcbiAgICAgICAgICAgIChzZWFyY2hHbG9iYWxWYXJpYWJsZXMpPVwic2VhcmNoR2xvYmFsVmFyaWFibGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlKT1cIm9uRWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS10ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBBZHZhbmNlZCAoRXhwYW5kYWJsZSkgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuICBjcWEtZ2FwLTIgY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1wLTAgY3FhLW1iLTEuNVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVBZHZhbmNlZCgpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdXCI+QWR2YW5jZWQ8L3NwYW4+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LWJhc2VcIiBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiYWR2YW5jZWRFeHBhbmRlZFwiPlxuICAgICAgICAgICAgICAgIGV4cGFuZF9tb3JlXG4gICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhZHZhbmNlZEV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtbXQtMlwiPlxuICAgICAgICAgICAgICA8Y3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtIFxuICAgICAgICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlc109XCJhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzXCJcbiAgICAgICAgICAgICAgICBbYWR2YW5jZWRWYXJpYWJsZUZvcm1dPVwiYWR2YW5jZWRWYXJpYWJsZXNGb3JtXCJcbiAgICAgICAgICAgICAgICAodmFyaWFibGVCb29sZWFuQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICh2YXJpYWJsZVZhbHVlQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+IFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIFxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFjcmVhdGVFbGVtZW50VmlzaWJsZVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLXctZnVsbCBjcWEtZ2FwLTIgY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZ3JheS0yMDAgY3FhLXBiLTJcIj5cbiAgICAgIDxjcWEtYnV0dG9uIGNsYXNzPVwiY3FhLXctMS8yXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgdGV4dD1cIkNhbmNlbFwiIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIDxjcWEtYnV0dG9uICpuZ0lmPVwiIWlzQ3JlYXRpbmdTdGVwXCIgY2xhc3M9XCJjcWEtdy0xLzJcIiB2YXJpYW50PVwiZmlsbGVkXCIgW3RleHRdPVwiaXNFZGl0TW9kZSA/ICdVcGRhdGUgU3RlcCcgOiAnQ3JlYXRlIFN0ZXAnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0Zvcm1WYWxpZCgpXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DcmVhdGVTdGVwKClcIj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIDwhLS0gTG9hZGVyIHNsb3Q6IHNhbWUgc2l6ZSBhcyBDcmVhdGUgU3RlcCBidXR0b24gKGxnOiAzOHB4IGhlaWdodCwgZnVsbCB3aWR0aCwgcm91bmRlZC1bOHB4XSkgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNDcmVhdGluZ1N0ZXBcIiBjbGFzcz1cImNxYS13LTEvMiBjcWEtZmxleC0xIGNxYS1taW4taC1bMzhweF0gY3FhLXJvdW5kZWQtWzhweF1cIj5cbiAgICAgICAgPGNxYS1iYWRnZVxuICAgICAgICAgIGxhYmVsPVwiQ3JlYXRpbmfigKZcIlxuICAgICAgICAgIGljb249XCJhdXRvcmVuZXdcIlxuICAgICAgICAgIFtpc0xvYWRpbmddPVwidHJ1ZVwiXG4gICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICBbY2VudGVyQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICBbaW5saW5lU3R5bGVzXT1cIidtaW4taGVpZ2h0OiAzOHB4OyBoZWlnaHQ6IDM4cHg7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOydcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJpbmZvXCJcbiAgICAgICAgICBzaXplPVwibWVkaXVtXCI+XG4gICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19
1016
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItYWN0aW9uL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWFjdGlvbi9zdGVwLWJ1aWxkZXItYWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStDLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDbEosT0FBTyxFQUEwQixXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHaEYsT0FBTyxFQUFvQiw4QkFBOEIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDOzs7Ozs7Ozs7O0FBZ0VoSSxNQUFNLE9BQU8sMEJBQTBCO0lBdUlyQyxZQUFvQixFQUFlLEVBQVUsR0FBc0I7UUFBL0MsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBdEkxRCxlQUFVLEdBQVksSUFBSSxDQUFDO1FBQ3BDLG1GQUFtRjtRQUMxRSx5QkFBb0IsR0FBVyxDQUFDLENBQUM7UUFDMUMsNkZBQTZGO1FBQ3BGLCtCQUEwQixHQUFXLENBQUMsQ0FBQztRQUNoRCwwQ0FBMEM7UUFDakMsY0FBUyxHQUFxQixFQUFFLENBQUM7UUFPMUMsZ0hBQWdIO1FBQ3ZHLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFTbEMsd0NBQXdDO1FBQy9CLHNCQUFpQixHQUFXLGdCQUFnQixDQUFDO1FBRXRELG1HQUFtRztRQUMxRix5QkFBb0IsR0FBdUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUEsQ0FBQSxDQUFDLENBQUM7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QUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLDBCQUEwQjtzQkFBbkMsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQWlCdUQscUJBQXFCO3NCQUFsRixTQUFTO3VCQUFDLDhCQUE4QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgT25EZXN0cm95LCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCwgRm9ybUFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZVZhcmlhYmxlLCBUZW1wbGF0ZVZhcmlhYmxlc0Zvcm1Db21wb25lbnQgfSBmcm9tICcuLi90ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybS90ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybS5jb21wb25lbnQnO1xuXG4vLyBJbXBvcnQgRWxlbWVudCB0eXBlIC0gdXNpbmcgYW55IGZvciBub3cgc2luY2UgRWxlbWVudCBpcyBmcm9tIHRzLXBvcnRhbC11aVxuLy8gSW4gYSByZWFsIHNjZW5hcmlvLCB5b3UgbWlnaHQgd2FudCB0byBjcmVhdGUgYSBzaGFyZWQgaW50ZXJmYWNlIG9yIGltcG9ydCBmcm9tIGEgc2hhcmVkIHBhY2thZ2VcbmludGVyZmFjZSBFbGVtZW50IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgbG9jYXRvclZhbHVlPzogc3RyaW5nO1xuICBvdGhlckxvY2F0b3I/OiBzdHJpbmdbXTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhcmlhYmxlRGVmaW5pdGlvbiB7XG4gIHBhdGg6IHN0cmluZztcbiAgZGVmYXVsdDogc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IG51bGw7XG4gIG11dGFibGU6IGJvb2xlYW47XG4gIHR5cGU/OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25UZW1wbGF0ZSB7XG4gIGlkPzogbnVtYmVyO1xuICBuYXR1cmFsVGV4dD86IHN0cmluZztcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gIGh0bWxHcmFtbWFyPzogc3RyaW5nO1xuICBzZWFyY2hhYmxlR3JhbW1hcj86IHN0cmluZztcbiAgd29ya3NwYWNlVHlwZT86IHN0cmluZztcbiAgYWN0aW9uPzogc3RyaW5nO1xuICBpc0FkZG9uPzogYm9vbGVhbjtcbiAgdmFyaWFibGVzPzogUmVjb3JkPHN0cmluZywgVmFyaWFibGVEZWZpbml0aW9uPjtcbiAgYWxsb3dlZFZhbHVlcz86IGFueTtcbiAgZGF0YT86IGFueTtcbiAgc3RlcEFjdGlvblR5cGU/OiBhbnk7XG4gIHN0ZXBUeXBlPzogYW55O1xuICBkaXNwbGF5T3JkZXI/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudEZpZWxkIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHR5cGU6ICdlbGVtZW50JyB8ICd0ZXN0LWRhdGEnIHwgJ2F0dHJpYnV0ZSc7XG59XG5cbnR5cGUgU3RlcFRlc3REYXRhTGlzdEl0ZW0gPSB7XG4gIHRlc3REYXRhOiBzdHJpbmc7XG4gIHRlc3REYXRhS2V5Pzogc3RyaW5nO1xuICB0ZXN0RGF0YVR5cGU6IHN0cmluZztcbiAgdGVzdERhdGFQcm9maWxlSWQ/OiBudW1iZXI7XG59O1xuXG4vKiogSG9zdCBwYXNzZXMgdGhpcyBhZnRlciBlbGVtZW50U2VydmljZS5zaG93KCkgc28gTGFiZWwgU2NyZWVuIE5hbWUgLyBMYWJlbCBwcmVmaWxsIG9uIGVkaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRTY3JlZW5QcmVmaWxsIHtcbiAgZWxlbWVudElkOiBudW1iZXI7XG4gIHNjcmVlbk5hbWVJZD86IG51bWJlcjtcbiAgc2VsZWN0ZWRTY3JlZW5OYW1lPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1idWlsZGVyLWFjdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGVwLWJ1aWxkZXItYWN0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290Jywgc3R5bGU6ICdkaXNwbGF5OiBibG9jaztoZWlnaHQ6IDEwMCU7d2lkdGg6IDEwMCU7JyB9XG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBCdWlsZGVyQWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHNob3dIZWFkZXI6IGJvb2xlYW4gPSB0cnVlO1xuICAvKiogSW5jcmVtZW50IHRoaXMgY291bnRlciB0byB0cmlnZ2VyIFwiQ2hhbmdlIFRlbXBsYXRlXCIgZnJvbSBhIHBhcmVudCBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIGNoYW5nZVRlbXBsYXRlU2lnbmFsOiBudW1iZXIgPSAwO1xuICAvKiogSW5jcmVtZW50IHRoaXMgY291bnRlciB0byB0cmlnZ2VyIFwiQ2FuY2VsIHRlbXBsYXRlIHNlbGVjdGlvblwiIGZyb20gYSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBjYW5jZWxDaGFuZ2VUZW1wbGF0ZVNpZ25hbDogbnVtYmVyID0gMDtcbiAgLyoqIExpc3Qgb2YgYWN0aW9uIHRlbXBsYXRlcyB0byBkaXNwbGF5ICovXG4gIEBJbnB1dCgpIHRlbXBsYXRlczogQWN0aW9uVGVtcGxhdGVbXSA9IFtdO1xuICAvKiogV2hlbiBwcm92aWRlZCwgYXV0b21hdGljYWxseSBzZWxlY3RzIHRoaXMgdGVtcGxhdGUgb24gaW5pdCAoZWRpdCBtb2RlKS4gKi9cbiAgQElucHV0KCkgaW5pdGlhbFRlbXBsYXRlPzogQWN0aW9uVGVtcGxhdGU7XG4gIC8qKiBXaGVuIHByb3ZpZGVkLCBwcmUtcG9wdWxhdGVzIHRoZSBkZXNjcmlwdGlvbiBmaWVsZCBpbiBlZGl0IG1vZGUuICovXG4gIEBJbnB1dCgpIGluaXRpYWxEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIHByZS1wb3B1bGF0ZXMgdGhlIG1ldGFkYXRhIGZpZWxkIGluIGVkaXQgbW9kZS4gKi9cbiAgQElucHV0KCkgaW5pdGlhbE1ldGFkYXRhPzogc3RyaW5nO1xuICAvKiogV2hlbiB0cnVlLCBlbmFibGVzIGRlYnVnLW1vZGUgYmVoYXZpb3VyOiBhdXRvLXNlbGVjdHMgaW5pdGlhbFRlbXBsYXRlIGFuZCBwcmUtZmlsbHMgZGVzY3JpcHRpb24vbWV0YWRhdGEuICovXG4gIEBJbnB1dCgpIGlzRGVidWc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBpc0VkaXRNb2RlIGxvZ2ljICh1c2VmdWwgd2hlbiBwYXJlbnQga25vd3MgZWRpdCBzdGF0ZSBpbmRlcGVuZGVudGx5IG9mIGluaXRpYWxUZW1wbGF0ZSkuICovXG4gIEBJbnB1dCgpIGVkaXRNb2RlPzogYm9vbGVhbjtcblxuICBnZXQgaXNFZGl0TW9kZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5lZGl0TW9kZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5lZGl0TW9kZTtcbiAgICByZXR1cm4gdGhpcy5pc0RlYnVnICYmICEhdGhpcy5pbml0aWFsVGVtcGxhdGU7XG4gIH1cblxuICAvKiogUGxhY2Vob2xkZXIgdGV4dCBmb3Igc2VhcmNoIGlucHV0ICovXG4gIEBJbnB1dCgpIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoIGxpYnJhcnknO1xuXG4gIC8qKiBGdW5jdGlvbiB0byBoYW5kbGUgdmFyaWFibGUgcHJvY2Vzc2luZyBvciBjdXN0b20gbG9naWMuIENhbiBiZSBwYXNzZWQgZnJvbSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBzZXRUZW1wbGF0ZVZhcmlhYmxlczogKHZhcmlhYmxlczogQWN0aW9uVGVtcGxhdGUpID0+IGFueSA9ICgpID0+IHsgcmV0dXJuIFtdfTtcbiAgXG4gIC8qKiBGdW5jdGlvbiB0byBoYW5kbGUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzLiBDYW4gYmUgcGFzc2VkIGZyb20gcGFyZW50IGNvbXBvbmVudC4gKi9cbiAgQElucHV0KCkgc2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogKHRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSwgdGVzdFN0ZXA/OiBhbnkpID0+IGFueVtdID0gKCkgPT4geyByZXR1cm4gW119O1xuXG4gIC8qKiBDZW50cmFsaXNlZCBIVE1MIGdyYW1tYXIgY29tcHV0YXRpb24gZnVuY3Rpb24uIFBhc3MgU3RlcEJ1aWxkZXJTZXJ2aWNlLmNvbXB1dGVIdG1sR3JhbW1hciBmcm9tIHRoZSBob3N0IGFwcC4gKi9cbiAgQElucHV0KCkgY29tcHV0ZUh0bWxHcmFtbWFyRm4/OiAodGVtcGxhdGU6IGFueSwgdmFyaWFibGVzOiBhbnlbXSkgPT4gc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHByZXZlbnRTZWxlY3RUZW1wbGF0ZTogc3RyaW5nW10gPSBbJ2RhdGFiYXNldmVyaWZpY2F0aW9uJ107XG4gIEBJbnB1dCgpIGVsZW1lbnRPcHRpb25zOiBFbGVtZW50W10gPSBbXTsgLy8gRWxlbWVudCBvYmplY3RzIGZvciBlbGVtZW50IGRyb3Bkb3duXG4gIEBJbnB1dCgpIGhhc01vcmVFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBXaGV0aGVyIG1vcmUgZWxlbWVudHMgYXJlIGF2YWlsYWJsZVxuICBASW5wdXQoKSBpc0xvYWRpbmdFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBMb2FkaW5nIHN0YXRlIGZvciBlbGVtZW50c1xuICAvKiogU2NyZWVuIG5hbWUgb3B0aW9ucyBmb3IgZWxlbWVudCBmb3JtIGF1dG9jb21wbGV0ZSAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHNjcmVlbk5hbWVPcHRpb25zOiB7IGlkPzogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVtdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgc2NyZWVuIG5hbWVzIGFyZSBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbCAqL1xuICBASW5wdXQoKSBoYXNNb3JlU2NyZWVuTmFtZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgc2NyZWVuIG5hbWVzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogUGFyYW1ldGVyIG9wdGlvbnMgZm9yIHRlc3QgZGF0YSBwYXJhbWV0ZXIgZHJvcGRvd24gKGZyb20gQVBJKSAqL1xuICBASW5wdXQoKSBwYXJhbWV0ZXJPcHRpb25zOiBhbnlbXSA9IFtdOyAvLyBUZXN0RGF0YVtdIC0gcmF3IHRlc3QgZGF0YSBwcm9maWxlc1xuICAvKiogV2hldGhlciBtb3JlIHBhcmFtZXRlcnMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIHBhcmFtZXRlcnMgKHNlYXJjaCBvciBsb2FkIG1vcmUpICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ1BhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFVwbG9hZCBvcHRpb25zIGZvciB1cGxvYWQgZHJvcGRvd24gKGZyb20gQVBJKSAqL1xuICBASW5wdXQoKSB1cGxvYWRPcHRpb25zOiBhbnlbXSA9IFtdO1xuICAvKiogV2hldGhlciBtb3JlIHVwbG9hZHMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVVcGxvYWRzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIHVwbG9hZHMgKHNlYXJjaCBvciBsb2FkIG1vcmUpICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ1VwbG9hZHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEVudmlyb25tZW50IG9wdGlvbnMgZm9yIGVudmlyb25tZW50IHBhcmFtZXRlciBkcm9wZG93biAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIGVudmlyb25tZW50T3B0aW9uczogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGVudmlyb25tZW50OiBzdHJpbmcgfVtdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgZW52aXJvbm1lbnRzIGFyZSBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbCAqL1xuICBASW5wdXQoKSBoYXNNb3JlRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIGVudmlyb25tZW50cyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBHbG9iYWwgRGF0YSB2YXJpYWJsZXMgKHdvcmtzcGFjZS1zY29wZWQpIGZvciB0aGUgR2xvYmFsIERhdGEgdGFiLiAqL1xuICBASW5wdXQoKSBnbG9iYWxWYXJpYWJsZU9wdGlvbnM6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyB0eXBlPzogc3RyaW5nOyByZWFkV3JpdGVNb2RlPzogc3RyaW5nIH1bXSA9IFtdO1xuICBASW5wdXQoKSBpc0xvYWRpbmdHbG9iYWxWYXJpYWJsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFJlc29sdmVkIHRlc3QtY2FzZSBlbnZpcm9ubWVudCBuYW1lLCB1c2VkIGZvciB0aGUgZW52IGJhbm5lciBzdWJoZWFkLiAqL1xuICBASW5wdXQoKSB0ZXN0Q2FzZUVudmlyb25tZW50TmFtZT86IHN0cmluZztcbiAgLyoqIFN1ZmZpeCBhcHBlbmRlZCB0byB0aGUgZW52LW5hbWUgb3B0aW9uIGxhYmVsIG9ubHkgKGUuZy4gJyhkZWZhdWx0KScpOyBhbHNvIGxvY2tzIHRoZSBlbnYgZHJvcGRvd24uICovXG4gIEBJbnB1dCgpIHRlc3RDYXNlRW52aXJvbm1lbnRMYWJlbFN1ZmZpeD86IHN0cmluZztcbiAgLyoqIEl0YWxpYyBub3RlIHJlbmRlcmVkIHVuZGVyIHRoZSBlbnYgZHJvcGRvd24g4oCUIHVzZWQgZm9yIGxlZ2FjeSBzdGVwLWxldmVsIGVudiBkZXByZWNhdGlvbi4gKi9cbiAgQElucHV0KCkgZW52aXJvbm1lbnRMZWdhY3lEZXByZWNhdGlvbk1lc3NhZ2U/OiBzdHJpbmc7XG4gIC8qKiBUZXN0IGNhc2UncyBURFAgaWQgKHdoZW4gc2V0LCBsb2NrIHRoZSBURFAgcGlja2VyIGluIHRoZSBwYXJhbWV0ZXIgdGFiKS4gKi9cbiAgQElucHV0KCkgdGVzdENhc2VUZXN0RGF0YUlkPzogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHByb2ZpbGUgSUQgZnJvbSB0ZXN0IGNhc2UgKGlmIGF2YWlsYWJsZSwgcHJvZmlsZSBhbmQgZGF0YSBzZXQgZHJvcGRvd25zIHdpbGwgYmUgZGlzYWJsZWQpICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHN0YXJ0IGluZGV4IGZyb20gdGVzdCBjYXNlIChkYXRhIHNldCBpbmRleCBpbiB0aGUgcHJvZmlsZSkgKi9cbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleD86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIGVuZCBpbmRleCBmcm9tIHRlc3QgY2FzZSAodXNlZCBmb3IgRk9SIGxvb3AgY29udGV4dCkgKi9cbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhRW5kSW5kZXg/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIGN1cnJlbnQgc3RlcCBjcmVhdGlvbiBpcyBoYXBwZW5pbmcgaW5zaWRlIEZPUiBsb29wIGNvbnRleHQgKi9cbiAgQElucHV0KCkgaXNJbnNpZGVGb3JMb29wU3RlcDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSBwYXJlbnQgdGVzdCBjYXNlIGhhcyBhIHRlc3QgZGF0YSBwcm9maWxlIGNvbmZpZ3VyZWQgKHRlc3RDYXNlLnRlc3REYXRhSWQgaXMgc2V0KS4gKi9cbiAgQElucHV0KCkgaGFzVGVzdERhdGFQcm9maWxlOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBjcmVhdGluZyB0aGUgc3RlcCAoQVBJIGluIHByb2dyZXNzKTsgc2hvdyBsb2FkZXIgb24gQ3JlYXRlL1VwZGF0ZSBTdGVwIGJ1dHRvbiAqL1xuICBASW5wdXQoKSBpc0NyZWF0aW5nU3RlcDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlbGVtZW50U2NyZWVuUHJlZmlsbD86IEVsZW1lbnRTY3JlZW5QcmVmaWxsIHwgbnVsbDtcbiAgQE91dHB1dCgpIHRlbXBsYXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QWN0aW9uVGVtcGxhdGU+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gbG9hZCBtb3JlIGlzIHJlcXVlc3RlZFxuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIGVsZW1lbnRzXG4gIEBPdXRwdXQoKSBzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzY3JlZW5OYW1lSWQ6IG51bWJlcjsgc2VhcmNoVGVybT86IHN0cmluZyB9PigpOyAvLyBFbWl0IHdoZW4gc2NyZWVuIG5hbWUgaXMgc2VsZWN0ZWQgdG8gZmV0Y2ggZWxlbWVudHMgZmlsdGVyZWQgYnkgc2NyZWVuIG5hbWVcbiAgQE91dHB1dCgpIGNyZWF0ZUVsZW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTsgLy8gRW1pdCB3aGVuIGVsZW1lbnQgaXMgY3JlYXRlZFxuICBAT3V0cHV0KCkgc2VhcmNoU2NyZWVuTmFtZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBzY3JlZW4gbmFtZXNcbiAgQE91dHB1dCgpIGxvYWRNb3JlU2NyZWVuTmFtZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgc2NyZWVuIG5hbWVzXG4gIEBPdXRwdXQoKSBjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciByZXF1ZXN0cyB0byBjcmVhdGUgYSBuZXcgc2NyZWVuIG5hbWVcbiAgQE91dHB1dCgpIHNlYXJjaFBhcmFtZXRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIHBhcmFtZXRlcnNcbiAgQE91dHB1dCgpIGxvYWRNb3JlUGFyYW1ldGVycyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgcGFyYW1ldGVyc1xuICBAT3V0cHV0KCkgc2VhcmNoVXBsb2FkcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgdXBsb2Fkc1xuICBAT3V0cHV0KCkgbG9hZE1vcmVVcGxvYWRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSB1cGxvYWRzXG4gIEBPdXRwdXQoKSBzZWFyY2hFbnZpcm9ubWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIGVudmlyb25tZW50c1xuICBAT3V0cHV0KCkgbG9hZE1vcmVFbnZpcm9ubWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIGVudmlyb25tZW50c1xuICBAT3V0cHV0KCkgc2VhcmNoR2xvYmFsVmFyaWFibGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0IHdoZW4gc3RlcCBpcyBjcmVhdGVkICovXG4gIEBPdXRwdXQoKSBjcmVhdGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBjYW5jZWxsZWQgKi9cbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlZGlyZWN0VG9QYXJhbWV0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSByZWRpcmVjdFRvRW52aXJvbm1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgZmlsdGVyZWRUZW1wbGF0ZXM6IEFjdGlvblRlbXBsYXRlW10gPSBbXTtcbiAgc2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuICBzZWxlY3RlZFRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByZXZpb3VzVGVtcGxhdGVGb3JFZGl0OiBBY3Rpb25UZW1wbGF0ZSB8IG51bGwgPSBudWxsO1xuICBtZXRhZGF0YTogc3RyaW5nID0gJyc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcbiAgYWR2YW5jZWRFeHBhbmRlZDogYm9vbGVhbiA9IHRydWU7XG4gIHRlbXBsYXRlVmFyaWFibGVzOiBUZW1wbGF0ZVZhcmlhYmxlW10gPSBbXTtcbiAgdmFyaWFibGVzRm9ybTogRm9ybUFycmF5O1xuICBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzOiBhbnlbXSA9IFtdO1xuICBhZHZhbmNlZFZhcmlhYmxlc0Zvcm06IEZvcm1BcnJheTtcbiAgdXBkYXRlZEh0bWxHcmFtbWFyOiBzdHJpbmcgPSAnJzsgLy8gVXBkYXRlZCBIVE1MIGdyYW1tYXIgd2l0aCB2YXJpYWJsZSB2YWx1ZXNcbiAgY3JlYXRlRWxlbWVudFZpc2libGUgPSBmYWxzZTtcbiAgLy8gVHJhY2sgZWxlbWVudCBmb3JtIHZpc2liaWxpdHlcbiAgXG4gIEBWaWV3Q2hpbGQoVGVtcGxhdGVWYXJpYWJsZXNGb3JtQ29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSkgdGVtcGxhdGVWYXJpYWJsZXNGb3JtPzogVGVtcGxhdGVWYXJpYWJsZXNGb3JtQ29tcG9uZW50O1xuICBcbiAgLy8gQ2FjaGUgZm9yIHNlbGVjdCBjb25maWdzIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICBwcml2YXRlIHNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGZvcm1WYWxpZENhY2hlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdEZvcm1WYWxpZGF0aW9uVGltZTogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBGT1JNX1ZBTElEQVRJT05fQ0FDSEVfTVMgPSAxMDA7IC8vIENhY2hlIGZvciAxMDBtc1xuICBwcml2YXRlIGZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHRoaXMudmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuYXJyYXkoW10pO1xuICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5hcnJheShbXSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGVsZW1lbnQgZm9ybSB2aXNpYmlsaXR5IGNoYW5nZVxuICAgKi9cbiAgb25FbGVtZW50Rm9ybVZpc2liaWxpdHlDaGFuZ2UodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlRWxlbWVudFZpc2libGUgPSB2aXNpYmxlO1xuICB9XG5cbiAgb25TaG93RWxlbWVudEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVFbGVtZW50VmlzaWJsZSA9IHRydWU7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzID0gWy4uLnRoaXMudGVtcGxhdGVzXTtcbiAgICBpZiAodGhpcy5pc0RlYnVnKSB7XG4gICAgICBpZiAodGhpcy5pbml0aWFsRGVzY3JpcHRpb24pIHRoaXMuZGVzY3JpcHRpb24gPSB0aGlzLmluaXRpYWxEZXNjcmlwdGlvbjtcbiAgICAgIGlmICh0aGlzLmluaXRpYWxNZXRhZGF0YSkgdGhpcy5tZXRhZGF0YSA9IHRoaXMuaW5pdGlhbE1ldGFkYXRhO1xuICAgICAgaWYgKHRoaXMuaW5pdGlhbFRlbXBsYXRlKSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VsZWN0VGVtcGxhdGUodGhpcy5pbml0aWFsVGVtcGxhdGUhKSwgMCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd0ZW1wbGF0ZXMnXSkge1xuICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZWxlbWVudFNjcmVlblByZWZpbGwnXSAmJiB0aGlzLmVsZW1lbnRTY3JlZW5QcmVmaWxsKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYXBwbHlFbGVtZW50U2NyZWVuUHJlZmlsbCgpLCAwKTtcbiAgICB9XG4gICAgLy8gV2hlbiBpbml0aWFsVGVtcGxhdGUgaXMgc2V0IGFmdGVyIGluaXQgKGFzeW5jIHByZS1maWxsKSwgYXV0by1zZWxlY3QgaXRcbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFRlbXBsYXRlJ10gJiYgdGhpcy5pc0RlYnVnICYmIHRoaXMuaW5pdGlhbFRlbXBsYXRlICYmICF0aGlzLnNlbGVjdGVkVGVtcGxhdGUpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZWxlY3RUZW1wbGF0ZSh0aGlzLmluaXRpYWxUZW1wbGF0ZSEpLCAwKTtcbiAgICB9XG4gICAgLy8gUGFyZW50IGNhbiB0cmlnZ2VyIFwiQ2hhbmdlIFRlbXBsYXRlXCIgYnkgaW5jcmVtZW50aW5nIGNoYW5nZVRlbXBsYXRlU2lnbmFsXG4gICAgaWYgKGNoYW5nZXNbJ2NoYW5nZVRlbXBsYXRlU2lnbmFsJ10gJiYgIWNoYW5nZXNbJ2NoYW5nZVRlbXBsYXRlU2lnbmFsJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMub25DaGFuZ2VUZW1wbGF0ZSgpO1xuICAgIH1cbiAgICAvLyBQYXJlbnQgY2FuIHRyaWdnZXIgXCJDYW5jZWwgdGVtcGxhdGUgc2VsZWN0aW9uXCIgYnkgaW5jcmVtZW50aW5nIGNhbmNlbENoYW5nZVRlbXBsYXRlU2lnbmFsXG4gICAgaWYgKGNoYW5nZXNbJ2NhbmNlbENoYW5nZVRlbXBsYXRlU2lnbmFsJ10gJiYgIWNoYW5nZXNbJ2NhbmNlbENoYW5nZVRlbXBsYXRlU2lnbmFsJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMub25DYW5jZWxUZW1wbGF0ZVNlbGVjdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VhcmNoQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgb25TZWFyY2hTdWJtaXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gIH1cblxuICBvblNlYXJjaENsZWFyZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlFbGVtZW50U2NyZWVuUHJlZmlsbCgpOiB2b2lkIHtcbiAgICBjb25zdCBwcmUgPSB0aGlzLmVsZW1lbnRTY3JlZW5QcmVmaWxsO1xuICAgIGlmICghcHJlIHx8IHByZS5lbGVtZW50SWQgPT0gbnVsbCB8fCAhdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldElkID0gTnVtYmVyKHByZS5lbGVtZW50SWQpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRhcmdldElkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdG91Y2hlZCA9IGZhbHNlO1xuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUsIGluZGV4KSA9PiB7XG4gICAgICBpZiAodmFyaWFibGUuZGF0YUtleSAhPT0gJ2VsZW1lbnQnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQgPT0gbnVsbCB8fCBOdW1iZXIodmFyaWFibGUuZWxlbWVudElkKSAhPT0gdGFyZ2V0SWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHByZS5zY3JlZW5OYW1lSWQgIT0gbnVsbCkge1xuICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSBOdW1iZXIocHJlLnNjcmVlbk5hbWVJZCk7XG4gICAgICAgIHRvdWNoZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHByZS5zZWxlY3RlZFNjcmVlbk5hbWUpIHtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gU3RyaW5nKHByZS5zZWxlY3RlZFNjcmVlbk5hbWUpO1xuICAgICAgICB0b3VjaGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLnZhcmlhYmxlc0Zvcm0uYXQoaW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHByZS5zY3JlZW5OYW1lSWQgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBzaWQgPSBTdHJpbmcocHJlLnNjcmVlbk5hbWVJZCk7XG4gICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woc2lkKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZShzaWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0b3VjaGVkKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gWy4uLnRoaXMudGVtcGxhdGVWYXJpYWJsZXNdO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIGFwcGx5RmlsdGVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWFyY2hWYWx1ZSB8fCB0aGlzLnNlYXJjaFZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRUZW1wbGF0ZXMgPSBbLi4udGhpcy50ZW1wbGF0ZXNdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLnNlYXJjaFZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIHRoaXMuZmlsdGVyZWRUZW1wbGF0ZXMgPSB0aGlzLnRlbXBsYXRlcy5maWx0ZXIodGVtcGxhdGUgPT4ge1xuICAgICAgY29uc3QgbmF0dXJhbFRleHQgPSB0ZW1wbGF0ZS5uYXR1cmFsVGV4dD8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIC8vIFN0cmlwIEhUTUwgdGFncyBmcm9tIGh0bWxHcmFtbWFyIGZvciBzZWFyY2hpbmcgKG9ubHkgc2VhcmNoIHRleHQgY29udGVudCwgbm90IEhUTUwgbWFya3VwKVxuICAgICAgY29uc3QgaHRtbEdyYW1tYXJUZXh0ID0gdGhpcy5zdHJpcEh0bWxUYWdzKHRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3Qgc2VhcmNoYWJsZUdyYW1tYXIgPSB0ZW1wbGF0ZS5zZWFyY2hhYmxlR3JhbW1hcj8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIFxuICAgICAgcmV0dXJuIG5hdHVyYWxUZXh0LmluY2x1ZGVzKHNlYXJjaFRlcm0pIHx8IFxuICAgICAgICAgICAgICBodG1sR3JhbW1hclRleHQuaW5jbHVkZXMoc2VhcmNoVGVybSkgfHwgXG4gICAgICAgICAgICAgc2VhcmNoYWJsZUdyYW1tYXIuaW5jbHVkZXMoc2VhcmNoVGVybSk7XG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coXCJmaWx0ZXJlZFRlbXBsYXRlc1wiLCB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpcCBIVE1MIHRhZ3MgZnJvbSBhIHN0cmluZywgcmV0dXJuaW5nIG9ubHkgdGhlIHRleHQgY29udGVudFxuICAgKiBAcGFyYW0gaHRtbFN0cmluZyAtIEhUTUwgc3RyaW5nIHRvIHN0cmlwIHRhZ3MgZnJvbVxuICAgKiBAcmV0dXJucyBQbGFpbiB0ZXh0IHdpdGhvdXQgSFRNTCB0YWdzXG4gICAqL1xuICBwcml2YXRlIHN0cmlwSHRtbFRhZ3MoaHRtbFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWh0bWxTdHJpbmcpIHJldHVybiAnJztcbiAgICBcbiAgICAvLyBVc2UgYnJvd3NlcidzIERPTVBhcnNlciBpZiBhdmFpbGFibGVcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gaHRtbFN0cmluZztcbiAgICAgICAgcmV0dXJuIHRlbXBEaXYudGV4dENvbnRlbnQgfHwgdGVtcERpdi5pbm5lclRleHQgfHwgJyc7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBGYWxsYmFjayB0byByZWdleCBpZiBET00gcGFyc2luZyBmYWlsc1xuICAgICAgICByZXR1cm4gaHRtbFN0cmluZy5yZXBsYWNlKC88W14+XSo+L2csICcnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gRmFsbGJhY2s6IHJlZ2V4LWJhc2VkIHRhZyByZW1vdmFsIGZvciBzZXJ2ZXItc2lkZSByZW5kZXJpbmdcbiAgICByZXR1cm4gaHRtbFN0cmluZy5yZXBsYWNlKC88W14+XSo+L2csICcnKTtcbiAgfVxuXG4gIHNlbGVjdFRlbXBsYXRlKHRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSk6IHZvaWQge1xuICAgIGlmKHRoaXMucHJldmVudFNlbGVjdFRlbXBsYXRlLmluY2x1ZGVzKHRlbXBsYXRlLmRpc3BsYXlOYW1lIHx8ICcnKSkge1xuICAgICAgdGhpcy50ZW1wbGF0ZUNoYW5nZWQuZW1pdCh0ZW1wbGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudGVtcGxhdGVDaGFuZ2VkLmVtaXQodGVtcGxhdGUpO1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIFxuICAgIC8vIENsZWFyIGNhY2hlIHdoZW4gdGVtcGxhdGUgY2hhbmdlc1xuICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG4gICAgXG4gICAgaWYodGhpcy5zZXRUZW1wbGF0ZVZhcmlhYmxlcyAmJiB0ZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGRlZmVyIGhlYXZ5IG9wZXJhdGlvbnMgYW5kIHByZXZlbnQgVUkgZnJlZXppbmdcbiAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBVSSB0byB1cGRhdGUgZmlyc3QsIHRoZW4gcHJvY2VzcyB0aGUgdGVtcGxhdGUgdmFyaWFibGVzXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRUZW1wbGF0ZVZhcmlhYmxlcyh0ZW1wbGF0ZSk7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ0ZW1wbGF0ZVZhcmlhYmxlc1wiLCB0aGlzLnRlbXBsYXRlVmFyaWFibGVzKTtcbiAgICAgICAgICBcbiAgICAgICAgICB0aGlzLmJ1aWxkVmFyaWFibGVzRm9ybSgpO1xuICAgICAgICAgIC8vIEluaXRpYWxpemUgdXBkYXRlZCBIVE1MIGdyYW1tYXJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUh0bWxHcmFtbWFyKCk7XG4gICAgICAgICAgdGhpcy5hcHBseUVsZW1lbnRTY3JlZW5QcmVmaWxsKCk7XG5cbiAgICAgICAgICAvLyBJbml0aWFsaXplIGFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlc1xuICAgICAgICAgIGlmICh0aGlzLnNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyA9IHRoaXMuc2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyh0ZW1wbGF0ZSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXNcIiwgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKTtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcHJvY2Vzc2luZyB0ZW1wbGF0ZSB2YXJpYWJsZXM6JywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIHRlbXBsYXRlJ3MgSFRNTCBncmFtbWFyIGlmIG5vIHZhcmlhYmxlc1xuICAgICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSB0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJztcbiAgICAgIFxuICAgICAgLy8gSW5pdGlhbGl6ZSBhZHZhbmNlZCBzZXR0aW5ncyB2YXJpYWJsZXMgZXZlbiBpZiBubyB0ZW1wbGF0ZSB2YXJpYWJsZXNcbiAgICAgIGlmICh0aGlzLnNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMpIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gdGhpcy5zZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKHRlbXBsYXRlKTtcbiAgICAgICAgdGhpcy5idWlsZEFkdmFuY2VkVmFyaWFibGVzRm9ybSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gYXJyYXlcbiAgICB3aGlsZSAodGhpcy52YXJpYWJsZXNGb3JtLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIC8vIENsZWFyIGNhY2hlIHdoZW4gZm9ybSBpcyByZWJ1aWx0XG4gICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcblxuICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gcHJldmlvdXMgc3Vic2NyaXB0aW9uIGlmIGl0IGV4aXN0c1xuICAgIGlmICh0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8vIEFkZCBmb3JtIGdyb3VwcyBmb3IgZWFjaCB2YXJpYWJsZVxuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiB2YXJpYWJsZXMgLSB1c2UgYm9vbGVhbiB2YWx1ZSwgb3RoZXJzIHVzZSBzdHJpbmdcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyBcbiAgICAgICAgPyAodmFyaWFibGUudmFsdWUgPT09IHRydWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICd0cnVlJyB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gMSlcbiAgICAgICAgOiAodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgXG4gICAgICAvLyBDcmVhdGUgYSBGb3JtR3JvdXAgZm9yIGVhY2ggdmFyaWFibGUgd2l0aCBuYW1lIGFuZCB2YWx1ZVxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiBbZGVmYXVsdFZhbHVlXSxcbiAgICAgICAgdHlwZTogW3ZhcmlhYmxlLnR5cGUgfHwgJ3N0cmluZyddLFxuICAgICAgICBsYWJlbDogW3ZhcmlhYmxlLmxhYmVsIHx8ICcnXSxcbiAgICAgICAgb3B0aW9uczogW3ZhcmlhYmxlLm9wdGlvbnMgfHwgW11dXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gQWRkIGRhdGFUeXBlIGNvbnRyb2wgZm9yIHRlc3QtZGF0YSB2YXJpYWJsZXMgaWYgbmVlZGVkXG4gICAgICBjb25zdCBsYWJlbCA9IHZhcmlhYmxlLmxhYmVsPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgaWYgKGxhYmVsID09PSAndGVzdF9kYXRhJyB8fCBsYWJlbCA9PT0gJ3NvdXJjZS12YWx1ZScgfHwgbGFiZWwgPT09ICd0YXJnZXQtdmFsdWUnIHx8IFxuICAgICAgICAgIGxhYmVsID09PSAnc291cmNlX3ZhbHVlJyB8fCBsYWJlbCA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgLy8gUGFyc2UgdGhlIHZhbHVlIHRvIGRldGVybWluZSBkYXRhIHR5cGVcbiAgICAgICAgY29uc3QgdmFsdWVTdHIgPSBTdHJpbmcoZGVmYXVsdFZhbHVlIHx8ICcnKTtcbiAgICAgICAgbGV0IGRhdGFUeXBlID0gJ3BsYWluLXRleHQnO1xuICAgICAgICBpZiAodmFsdWVTdHIuc3RhcnRzV2l0aCgnQHwnKSAmJiB2YWx1ZVN0ci5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICAgICAgZGF0YVR5cGUgPSAncGFyYW1ldGVyJztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCckfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgICBkYXRhVHlwZSA9ICdydW50aW1lJztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCcqfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgICBkYXRhVHlwZSA9ICdlbnZpcm9ubWVudCc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdkYXRhVHlwZScsIG5ldyBGb3JtQ29udHJvbChkYXRhVHlwZSkpO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucHVzaCh2YXJpYWJsZUdyb3VwKTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBTdWJzY3JpYmUgdG8gZm9ybSB2YWx1ZSBjaGFuZ2VzIHRvIGludmFsaWRhdGUgY2FjaGUgKG9ubHkgd2hlbiB1c2VyIGFjdHVhbGx5IGNoYW5nZXMgdmFsdWVzKVxuICAgIC8vIE5vdGU6IFdlIHVzZSBlbWl0RXZlbnQ6IGZhbHNlIHdoZW4gcHJvZ3JhbW1hdGljYWxseSBzZXR0aW5nIHZhbHVlcywgc28gdGhpcyB3b24ndCBmaXJlIHVubmVjZXNzYXJpbHlcbiAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLnZhcmlhYmxlc0Zvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gYXJyYXlcbiAgICB3aGlsZSAodGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5yZW1vdmVBdCgwKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZm9ybSBncm91cHMgZm9yIGVhY2ggYWR2YW5jZWQgdmFyaWFibGVcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IHR5cGVzXG4gICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnk7XG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3N0cl9saXN0Jykge1xuICAgICAgICAvLyBGb3Igc3RyX2xpc3QsIGNyZWF0ZSBhIEZvcm1BcnJheVxuICAgICAgICBjb25zdCB2YWx1ZUFycmF5ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZS52YWx1ZSkgPyB2YXJpYWJsZS52YWx1ZSA6IFtdO1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KFxuICAgICAgICAgIHZhbHVlQXJyYXkubGVuZ3RoID4gMCBcbiAgICAgICAgICAgID8gdmFsdWVBcnJheS5tYXAoKGl0ZW06IHN0cmluZykgPT4gdGhpcy5mYi5jb250cm9sKGl0ZW0pKVxuICAgICAgICAgICAgOiBbdGhpcy5mYi5jb250cm9sKCcnKV0gLy8gU3RhcnQgd2l0aCBvbmUgZW1wdHkgY29udHJvbFxuICAgICAgICApO1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBmb3JtQXJyYXk7XG4gICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgdmFyaWFibGUudmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudmFsdWUgfHwgJyc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBhIEZvcm1Hcm91cCBmb3IgZWFjaCB2YXJpYWJsZVxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiB2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnID8gZGVmYXVsdFZhbHVlIDogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICAgIHR5cGU6IFt2YXJpYWJsZS50eXBlIHx8ICdzdHJpbmcnXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCAnJ11cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIH0pO1xuICB9XG4gIFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhbiB1cCBzdWJzY3JpcHRpb24gdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICBpZiAodGhpcy5mb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXRTZWxlY3RDb25maWcodmFyaWFibGU6IGFueSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fJHt2YXJpYWJsZS5vcHRpb25zPy5qb2luKCcsJykgfHwgJyd9YDtcbiAgICBpZiAodGhpcy5zZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9ICh2YXJpYWJsZS5vcHRpb25zIHx8IFtdKS5tYXAoKG9wdDogc3RyaW5nKSA9PiAoe1xuICAgICAgaWQ6IG9wdCxcbiAgICAgIHZhbHVlOiBvcHQsXG4gICAgICBuYW1lOiBvcHQsXG4gICAgICBsYWJlbDogb3B0XG4gICAgfSkpO1xuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6IGB2YWx1ZWAsIC8vIFVzZSAndmFsdWUnIGFzIGtleSBzaW5jZSB3ZSdyZSBhY2Nlc3NpbmcgZnJvbSBGb3JtQXJyYXlcbiAgICAgIHBsYWNlaG9sZGVyOiBgU2VsZWN0ICR7dmFyaWFibGUubGFiZWx9YCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIFxuICAvKiogR2V0IGZvcm0gZ3JvdXAgZm9yIGEgdmFyaWFibGUgYnkgbmFtZSAqL1xuICBnZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IEZvcm1Hcm91cCB8IG51bGwge1xuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLnZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgLyoqIEFkZCBhIG5ldyB2YXJpYWJsZSB0byB0aGUgZm9ybSBhcnJheSBkeW5hbWljYWxseSAqL1xuICBhZGRWYXJpYWJsZSh2YXJpYWJsZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nIFxuICAgICAgPyAodmFyaWFibGUudmFsdWUgPT09IHRydWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICd0cnVlJyB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gMSlcbiAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICBcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICB2YWx1ZTogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICB0eXBlOiBbdmFyaWFibGUudHlwZSB8fCAnc3RyaW5nJ10sXG4gICAgICBsYWJlbDogW3ZhcmlhYmxlLmxhYmVsIHx8ICcnXSxcbiAgICAgIG9wdGlvbnM6IFt2YXJpYWJsZS5vcHRpb25zIHx8IFtdXVxuICAgIH0pO1xuICAgIFxuICAgIC8vIEFkZCBkYXRhVHlwZSBjb250cm9sIGZvciB0ZXN0LWRhdGEgdmFyaWFibGVzIGlmIG5lZWRlZFxuICAgIGNvbnN0IGxhYmVsID0gdmFyaWFibGUubGFiZWw/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgaWYgKGxhYmVsID09PSAndGVzdF9kYXRhJyB8fCBsYWJlbCA9PT0gJ3NvdXJjZS12YWx1ZScgfHwgbGFiZWwgPT09ICd0YXJnZXQtdmFsdWUnIHx8IFxuICAgICAgICBsYWJlbCA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgbGFiZWwgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICBjb25zdCB2YWx1ZVN0ciA9IFN0cmluZyhkZWZhdWx0VmFsdWUgfHwgJycpO1xuICAgICAgbGV0IGRhdGFUeXBlID0gJ3BsYWluLXRleHQnO1xuICAgICAgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJ0B8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICBkYXRhVHlwZSA9ICdwYXJhbWV0ZXInO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCckfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgZGF0YVR5cGUgPSAncnVudGltZSc7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJyp8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICBkYXRhVHlwZSA9ICdlbnZpcm9ubWVudCc7XG4gICAgICB9XG4gICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2RhdGFUeXBlJywgbmV3IEZvcm1Db250cm9sKGRhdGFUeXBlKSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMudmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcbiAgfVxuXG4gIG9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKFwib25WYXJpYWJsZVZhbHVlQ2hhbmdlXCIsIHZhcmlhYmxlTmFtZSwgdmFsdWUpO1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXkgKHVzZSBlbWl0RXZlbnQ6IGZhbHNlIHRvIHByZXZlbnQgdHJpZ2dlcmluZyB2YWx1ZUNoYW5nZXMpXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMudmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgLy8gSW52YWxpZGF0ZSBmb3JtIHZhbGlkYXRpb24gY2FjaGVcbiAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG4gICAgLy8gVXBkYXRlIEhUTUwgZ3JhbW1hciB3aXRoIG5ldyB2YWx1ZVxuICAgIHRoaXMudXBkYXRlSHRtbEdyYW1tYXIoKTtcbiAgfVxuXG4gIG9uVmFyaWFibGVCb29sZWFuQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXkgKHVzZSBlbWl0RXZlbnQ6IGZhbHNlIHRvIHByZXZlbnQgdHJpZ2dlcmluZyB2YWx1ZUNoYW5nZXMpXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMudmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIG5ldyBmb3JtIGdyb3VwIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW3ZhcmlhYmxlTmFtZV0sXG4gICAgICAgIHZhbHVlOiBbdmFsdWVdLFxuICAgICAgICB0eXBlOiBbJ2Jvb2xlYW4nXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZT8ubGFiZWwgfHwgJyddLFxuICAgICAgICBvcHRpb25zOiBbdmFyaWFibGU/Lm9wdGlvbnMgfHwgW11dXG4gICAgICB9KTtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIH1cbiAgICAvLyBJbnZhbGlkYXRlIGZvcm0gdmFsaWRhdGlvbiBjYWNoZVxuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcbiAgICAvLyBVcGRhdGUgSFRNTCBncmFtbWFyIHdpdGggbmV3IHZhbHVlXG4gICAgdGhpcy51cGRhdGVIdG1sR3JhbW1hcigpO1xuICB9XG5cbiAgb25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICAgIC8vIEZvciBzdHJfbGlzdCwgdGhlIEZvcm1BcnJheSBpcyBhbHJlYWR5IG1hbmFnZWQgaW5zaWRlIEFkdmFuY2VkVmFyaWFibGVzRm9ybUNvbXBvbmVudCxcbiAgICAgIC8vIHNvIHdlIGRvbid0IG5lZWQgdG8gcmVidWlsZCBvciB1cGRhdGUgaXQgaGVyZSB0byBhdm9pZCBmb2N1cyBsb3NzLlxuICAgICAgaWYgKHZhcmlhYmxlPy50eXBlICE9PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIGZvcm1Hcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2VUZW1wbGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlICYmIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSkge1xuICAgICAgdGhpcy5wcmV2aW91c1RlbXBsYXRlRm9yRWRpdCA9IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gbnVsbDtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gW107XG4gICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSAnJztcbiAgICB0aGlzLmFkdmFuY2VkRXhwYW5kZWQgPSBmYWxzZTtcbiAgICAvLyBDbGVhciBmb3JtIGFycmF5c1xuICAgIHdoaWxlICh0aGlzLnZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucmVtb3ZlQXQoMCk7XG4gICAgfVxuICAgIHdoaWxlICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgb25DYW5jZWxUZW1wbGF0ZVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlICYmIHRoaXMucHJldmlvdXNUZW1wbGF0ZUZvckVkaXQpIHtcbiAgICAgIHRoaXMuc2VsZWN0VGVtcGxhdGUodGhpcy5wcmV2aW91c1RlbXBsYXRlRm9yRWRpdCk7XG4gICAgfVxuICB9XG5cbiAgb25CYWNrKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IG51bGw7XG4gICAgdGhpcy5tZXRhZGF0YSA9ICcnO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSAnJztcbiAgICB0aGlzLmFkdmFuY2VkRXhwYW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gW107XG4gICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSAnJztcbiAgICAvLyBDbGVhciBmb3JtIGFycmF5c1xuICAgIHdoaWxlICh0aGlzLnZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucmVtb3ZlQXQoMCk7XG4gICAgfVxuICAgIHdoaWxlICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cbiAgICAvLyBSZWFwcGx5IGZpbHRlciB0byBtYWludGFpbiBzZWFyY2ggc3RhdGVcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNFZGl0TW9kZSkgdGhpcy5vbkJhY2soKTtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBVc2UgY2FjaGVkIHJlc3VsdCBpZiBhdmFpbGFibGUgYW5kIHJlY2VudFxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgaWYgKHRoaXMuZm9ybVZhbGlkQ2FjaGUgJiYgKG5vdyAtIHRoaXMubGFzdEZvcm1WYWxpZGF0aW9uVGltZSkgPCB0aGlzLkZPUk1fVkFMSURBVElPTl9DQUNIRV9NUykge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybVZhbGlkQ2FjaGU7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGlmIGFsbCByZXF1aXJlZCB2YXJpYWJsZXMgYXJlIGZpbGxlZDpcbiAgICAvLyBGb3IgYW55IHRlbXBsYXRlIHZhcmlhYmxlIHdpdGggZGF0YUtleSAndGVzdF9kYXRhJyB8ICdzb3VyY2VfdmFsdWUnIHwgJ3RhcmdldF92YWx1ZSdcbiAgICAvLyBBTkQgZGF0YVR5cGUgJ3BsYWluLXRleHQnIG9yICdydW50aW1lJywgdGhlIHVuZGVybHlpbmcgdmFsdWUgbXVzdCBiZSBub24tZW1wdHkuXG4gICAgbGV0IGN1c3RvbVZhcmlhYmxlc1ZhbGlkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGN1c3RvbVZhcmlhYmxlc1ZhbGlkID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5ldmVyeSh2YXJpYWJsZSA9PiB7XG4gICAgICAgIGlmICh2YXJpYWJsZS5kYXRhS2V5ID09PSAndGVzdF9kYXRhJyB8fCB2YXJpYWJsZS5kYXRhS2V5ID09PSAnc291cmNlX3ZhbHVlJyB8fCB2YXJpYWJsZS5kYXRhS2V5ID09PSAndGFyZ2V0X3ZhbHVlJykge1xuICAgICAgICAgIGlmICh2YXJpYWJsZS5kYXRhVHlwZSA9PT0gJ3BsYWluLXRleHQnIHx8IHZhcmlhYmxlLmRhdGFUeXBlID09PSAncnVudGltZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGUudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHZhcmlhYmxlLmRhdGFUeXBlID09PSAncGFyYW1ldGVyJyl7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZih2YXJpYWJsZS5kYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50Jyl7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZih2YXJpYWJsZS5kYXRhS2V5ID09PSAnZWxlbWVudCcpe1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGUudmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ29tYmluZSByZWFjdGl2ZSBmb3JtIHZhbGlkaXR5IHdpdGggY3VzdG9tIHZhcmlhYmxlIHZhbGlkYXRpb25cbiAgICBjb25zdCByZWFjdGl2ZVZhbGlkID0gdGhpcy52YXJpYWJsZXNGb3JtLnZhbGlkICYmIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnZhbGlkO1xuICAgIGNvbnN0IGZpbmFsVmFsaWQgPSByZWFjdGl2ZVZhbGlkICYmIGN1c3RvbVZhcmlhYmxlc1ZhbGlkO1xuXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmaW5hbFZhbGlkO1xuICAgIHRoaXMubGFzdEZvcm1WYWxpZGF0aW9uVGltZSA9IG5vdztcbiAgICByZXR1cm4gZmluYWxWYWxpZDtcbiAgfVxuICBcbiAgdHJhY2tCeVRlbXBsYXRlKGluZGV4OiBudW1iZXIsIHRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSk6IGFueSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmlkIHx8IHRlbXBsYXRlLmRpc3BsYXlOYW1lIHx8IGluZGV4O1xuICB9XG4gIFxuICB0cmFja0J5VmFyaWFibGUoaW5kZXg6IG51bWJlciwgdmFyaWFibGU6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLm5hbWUgfHwgaW5kZXg7XG4gIH1cblxuICBvbkNyZWF0ZVN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gR2V0IGVudmlyb25tZW50IElEcyBmcm9tIHRlbXBsYXRlIHZhcmlhYmxlcyAoaWYgYW55IGVudmlyb25tZW50IHR5cGUgdmFyaWFibGVzIGFyZSBzZWxlY3RlZClcbiAgICBjb25zdCBlbnZpcm9ubWVudElkcyA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtPy5nZXRFbnZpcm9ubWVudElkc0ZvclZhcmlhYmxlcygpIHx8IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgY29uc3QgY3VycmVudFRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5nZXRDdXJyZW50VGVtcGxhdGVWYXJpYWJsZXMoKTtcbiAgICBcbiAgICAvLyBTeW5jIGFkdmFuY2VkIHZhcmlhYmxlcyBmcm9tIGZvcm0gdG8gYXJyYXlcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgICAgaWYgKGZvcm1Hcm91cCkge1xuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSBmb3JtR3JvdXAuZ2V0KCd2YWx1ZScpPy52YWx1ZTtcbiAgICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdzdHJfbGlzdCcgJiYgZm9ybVZhbHVlIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgLy8gRXh0cmFjdCB2YWx1ZXMgZnJvbSBGb3JtQXJyYXlcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1WYWx1ZS5jb250cm9scy5tYXAoY29udHJvbCA9PiBjb250cm9sLnZhbHVlKS5maWx0ZXIoKHZhbDogc3RyaW5nKSA9PiB2YWwgJiYgdmFsLnRyaW0oKSAhPT0gJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybVZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgY29uc3Qgc3RlcERhdGEgPSB7XG4gICAgICB0ZW1wbGF0ZTogdGhpcy5zZWxlY3RlZFRlbXBsYXRlLFxuICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIHRlbXBsYXRlVmFyaWFibGVzOiBjdXJyZW50VGVtcGxhdGVWYXJpYWJsZXMsXG4gICAgICAvLyB0ZXN0RGF0YUxpc3Q6IHRoaXMuYnVpbGRUZXN0RGF0YUxpc3QoY3VycmVudFRlbXBsYXRlVmFyaWFibGVzKSxcbiAgICAgIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyxcbiAgICAgIGVudmlyb25tZW50SWRzOiBlbnZpcm9ubWVudElkcyAvLyBNYXAgb2YgdmFyaWFibGUgbmFtZSB0byBlbnZpcm9ubWVudCBJRFxuICAgIH07XG4gICAgY29uc29sZS5sb2coXCJzdGVwRGF0YVwiLCBzdGVwRGF0YSk7XG4gICAgY29uc29sZS5sb2coXCJ2YXJpYWJsZXNGb3JtXCIsIHRoaXMudmFyaWFibGVzRm9ybS52YWx1ZSk7XG4gICAgY29uc29sZS5sb2coXCJhZHZhbmNlZFZhcmlhYmxlc0Zvcm1cIiwgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0udmFsdWUpO1xuICAgIGNvbnNvbGUubG9nKFwiZW52aXJvbm1lbnRJZHNcIiwgZW52aXJvbm1lbnRJZHMpO1xuICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VycmVudFRlbXBsYXRlVmFyaWFibGVzKCk6IFRlbXBsYXRlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgY2hpbGRWYXJpYWJsZXMgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybT8udGVtcGxhdGVWYXJpYWJsZXM7XG4gICAgaWYgKGNoaWxkVmFyaWFibGVzICYmIGNoaWxkVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSBjaGlsZFZhcmlhYmxlcztcbiAgICAgIHJldHVybiBjaGlsZFZhcmlhYmxlcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgfHwgW107XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVGVzdERhdGFMaXN0KHZhcmlhYmxlczogVGVtcGxhdGVWYXJpYWJsZVtdKTogU3RlcFRlc3REYXRhTGlzdEl0ZW1bXSB7XG4gICAgY29uc3QgdGVzdERhdGFMaXN0OiBTdGVwVGVzdERhdGFMaXN0SXRlbVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHZhcmlhYmxlIG9mIHZhcmlhYmxlcyB8fCBbXSkge1xuICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB2YXJpYWJsZT8udmFsdWU7XG4gICAgICBpZiAoZm9ybWF0dGVkVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBmb3JtYXR0ZWRWYWx1ZSA9PT0gbnVsbCB8fCBmb3JtYXR0ZWRWYWx1ZSA9PT0gJycpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5yZXNvbHZlVmFyaWFibGVUZXN0RGF0YVZhbHVlKHZhcmlhYmxlKTtcbiAgICAgIGlmICghaXRlbS50ZXN0RGF0YSkgY29udGludWU7XG4gICAgICB0ZXN0RGF0YUxpc3QucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGVzdERhdGFMaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlVmFyaWFibGVUZXN0RGF0YVZhbHVlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogU3RlcFRlc3REYXRhTGlzdEl0ZW0ge1xuICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdmFyaWFibGU/LnZhbHVlICE9IG51bGwgPyBTdHJpbmcodmFyaWFibGUudmFsdWUpIDogJyc7XG4gICAgY29uc3QgcmF3VmFsdWUgPSB2YXJpYWJsZT8ucmF3VmFsdWUgIT0gbnVsbCAmJiBTdHJpbmcodmFyaWFibGUucmF3VmFsdWUpICE9PSAnJyA/IFN0cmluZyh2YXJpYWJsZS5yYXdWYWx1ZSkgOiBmb3JtYXR0ZWRWYWx1ZTtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlPy5kYXRhVHlwZSB8fCB0aGlzLnBhcnNlVmFyaWFibGVEYXRhVHlwZShmb3JtYXR0ZWRWYWx1ZSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IHRoaXMucmVzb2x2ZVNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQodmFyaWFibGUpO1xuXG4gICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVzdERhdGE6IHJhd1ZhbHVlLFxuICAgICAgICB0ZXN0RGF0YVR5cGU6ICdwYXJhbWV0ZXInLFxuICAgICAgICB0ZXN0RGF0YUtleTogdmFyaWFibGUubmFtZSxcbiAgICAgICAgLi4uKHNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCAmJiB7IHRlc3REYXRhUHJvZmlsZUlkOiBzZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkIH0pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YVR5cGUgPT09ICdydW50aW1lJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVzdERhdGE6IHJhd1ZhbHVlLFxuICAgICAgICB0ZXN0RGF0YUtleTogdmFyaWFibGUubmFtZSxcbiAgICAgICAgdGVzdERhdGFUeXBlOiAncnVudGltZScsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVzdERhdGE6IHJhd1ZhbHVlLFxuICAgICAgICB0ZXN0RGF0YUtleTogdmFyaWFibGUubmFtZSxcbiAgICAgICAgdGVzdERhdGFUeXBlOiAnZW52aXJvbm1lbnQnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVzdERhdGE6IGZvcm1hdHRlZFZhbHVlLFxuICAgICAgdGVzdERhdGFLZXk6IHZhcmlhYmxlLm5hbWUsXG4gICAgICB0ZXN0RGF0YVR5cGU6ICdyYXcnLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVTZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmICFpc05hTihOdW1iZXIodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCkpKSB7XG4gICAgICByZXR1cm4gTnVtYmVyKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybT8uZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlVmFsdWUgPSB2YXJpYWJsZUdyb3VwPy5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnZhbHVlO1xuXG4gICAgaWYgKHNlbGVjdGVkUHJvZmlsZVZhbHVlICE9IG51bGwgJiYgc2VsZWN0ZWRQcm9maWxlVmFsdWUgIT09ICcnICYmICFpc05hTihOdW1iZXIoc2VsZWN0ZWRQcm9maWxlVmFsdWUpKSkge1xuICAgICAgcmV0dXJuIE51bWJlcihzZWxlY3RlZFByb2ZpbGVWYWx1ZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlTmFtZSA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlIHx8IHNlbGVjdGVkUHJvZmlsZVZhbHVlO1xuICAgIGlmIChzZWxlY3RlZFByb2ZpbGVOYW1lICE9IG51bGwgJiYgc2VsZWN0ZWRQcm9maWxlTmFtZSAhPT0gJycpIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHByb2ZpbGVOYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICAgIHJldHVybiBwcm9maWxlTmFtZSA9PT0gc2VsZWN0ZWRQcm9maWxlTmFtZTtcbiAgICAgIH0pO1xuICAgICAgaWYgKG1hdGNoaW5nUHJvZmlsZT8uaWQgIT0gbnVsbCAmJiAhaXNOYU4oTnVtYmVyKG1hdGNoaW5nUHJvZmlsZS5pZCkpKSB7XG4gICAgICAgIHJldHVybiBOdW1iZXIobWF0Y2hpbmdQcm9maWxlLmlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVZhcmlhYmxlRGF0YVR5cGUodmFsdWU6IHN0cmluZyk6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JyB7XG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ0B8JykgJiYgdmFsdWUuZW5kc1dpdGgoJ3wnKSkgcmV0dXJuICdwYXJhbWV0ZXInO1xuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCckfCcpICYmIHZhbHVlLmVuZHNXaXRoKCd8JykpIHJldHVybiAncnVudGltZSc7XG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyp8JykgJiYgdmFsdWUuZW5kc1dpdGgoJ3wnKSkgcmV0dXJuICdlbnZpcm9ubWVudCc7XG4gICAgcmV0dXJuICdwbGFpbi10ZXh0JztcbiAgfVxuXG4gIHRvZ2dsZUFkdmFuY2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9ICF0aGlzLmFkdmFuY2VkRXhwYW5kZWQ7XG4gIH1cblxuXG4gIG9uRWxlbWVudENsaWNrKGVsZW1lbnRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEZvY3VzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IGZpZWxkXG4gICAgLy8gVGhpcyBjYW4gYmUgZW5oYW5jZWQgdG8gc2Nyb2xsIHRvIG9yIGhpZ2hsaWdodCB0aGUgZmllbGRcbiAgfVxuXG4gIG9uRWxlbWVudFZhbHVlQ2hhbmdlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBvblRlc3REYXRhVmFsdWVDaGFuZ2Uoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgSFRNTCBncmFtbWFyIGJ5IHJlcGxhY2luZyBwbGFjZWhvbGRlciBzcGFucyB3aXRoIGFjdHVhbCB2YXJpYWJsZSB2YWx1ZXMuXG4gICAqIERlbGVnYXRlcyB0byBjb21wdXRlSHRtbEdyYW1tYXJGbiB3aGVuIHByb3ZpZGVkIGJ5IHRoZSBob3N0IGFwcCAoY2VudHJhbGlzZWQgbG9naWMgaW4gU3RlcEJ1aWxkZXJTZXJ2aWNlKS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlSHRtbEdyYW1tYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcHV0ZUh0bWxHcmFtbWFyRm4pIHtcbiAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gdGhpcy5jb21wdXRlSHRtbEdyYW1tYXJGbih0aGlzLnNlbGVjdGVkVGVtcGxhdGUsIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zZWxlY3RlZFRlbXBsYXRlKSB7XG4gICAgICB0aGlzLnVwZGF0ZWRIdG1sR3JhbW1hciA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGh0bWxHcmFtbWFyID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJztcbiAgICBpZiAoIWh0bWxHcmFtbWFyKSB7XG4gICAgICB0aGlzLnVwZGF0ZWRIdG1sR3JhbW1hciA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIG1hcCBvZiB2YXJpYWJsZSB2YWx1ZXMgYnkgbmFtZSBmb3IgcXVpY2sgbG9va3VwXG4gICAgY29uc3QgdmFsdWVNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGlmICh0aGlzLnRlbXBsYXRlVmFyaWFibGVzICYmIEFycmF5LmlzQXJyYXkodGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGU6IGFueSkgPT4ge1xuICAgICAgICBpZiAodmFyaWFibGUubmFtZSAmJiB2YXJpYWJsZS52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhcmlhYmxlLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29udmVydCB2YWx1ZSB0byBzdHJpbmcsIGhhbmRsaW5nIGJvb2xlYW4gdmFsdWVzXG4gICAgICAgICAgbGV0IHZhbHVlU3RyID0gJyc7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YXJpYWJsZS52YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB2YWx1ZVN0ciA9IHZhcmlhYmxlLnZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLmRhdGFLZXkgPT09ICdlbGVtZW50JyAmJiB2YXJpYWJsZS5uYW1lICE9PSAnc2VsZWN0b3InKSB7XG4gICAgICAgICAgICAvLyBPbmx5IHVzZSBlbGVtZW50TmFtZSBpZiBpdCdzIGRlZmluZWQgYW5kIG5vdCBlbXB0eVxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmVsZW1lbnROYW1lICE9PSB1bmRlZmluZWQgJiYgdmFyaWFibGUuZWxlbWVudE5hbWUgIT09IG51bGwgJiYgdmFyaWFibGUuZWxlbWVudE5hbWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgIHZhbHVlU3RyID0gU3RyaW5nKHZhcmlhYmxlLmVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFNraXAgdGhpcyB2YXJpYWJsZSAtIGRvbid0IGFkZCB0byBtYXAgaWYgZWxlbWVudCBpcyBub3Qgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUuZGF0YUtleSA9PT0gJ2VsZW1lbnQnICYmIHZhcmlhYmxlLm5hbWUgPT09ICdzZWxlY3RvcicpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgdXNlIGVsZW1lbnRMb2NhdG9yIGlmIGl0J3MgZGVmaW5lZCBhbmQgbm90IGVtcHR5XG4gICAgICAgICAgICBpZiAodmFyaWFibGUuZWxlbWVudExvY2F0b3IgIT09IHVuZGVmaW5lZCAmJiB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciAhPT0gbnVsbCAmJiB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciAhPT0gJycpIHtcbiAgICAgICAgICAgICAgdmFsdWVTdHIgPSBTdHJpbmcodmFyaWFibGUuZWxlbWVudExvY2F0b3IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIHZhcmlhYmxlIC0gZG9uJ3QgYWRkIHRvIG1hcCBpZiBlbGVtZW50IGxvY2F0b3IgaXMgbm90IGF2YWlsYWJsZVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlU3RyID0gU3RyaW5nKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gT25seSBhZGQgdG8gbWFwIGlmIHZhbHVlU3RyIGlzIG5vdCBlbXB0eSBhbmQgbm90IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICBpZiAodmFsdWVTdHIgJiYgdmFsdWVTdHIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlU3RyLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgIHZhbHVlTWFwLnNldCh2YXJpYWJsZS5uYW1lLCB2YWx1ZVN0cik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBVc2UgYnJvd3NlcidzIERPTVBhcnNlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsYmFjayB0byBzdHJpbmcgcmVwbGFjZW1lbnRcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gU3RyaW5nKGh0bWxHcmFtbWFyKTtcblxuICAgICAgICAvLyBGaW5kIGFsbCBzcGFucyB3aXRoIGRhdGEtZXZlbnQta2V5IGF0dHJpYnV0ZVxuICAgICAgICBjb25zdCBzcGFucyA9IHRlbXBEaXYucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3NwYW5bZGF0YS1ldmVudC1rZXldJyk7XG4gICAgICAgIHNwYW5zLmZvckVhY2goKHNwYW46IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgZXZlbnRLZXkgPSBzcGFuLmdldEF0dHJpYnV0ZSgnZGF0YS1ldmVudC1rZXknKTtcbiAgICAgICAgICBpZiAoZXZlbnRLZXkgJiYgdmFsdWVNYXAuaGFzKGV2ZW50S2V5KSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZU1hcC5nZXQoZXZlbnRLZXkpO1xuICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgaWYgdmFsdWUgaXMgdmFsaWQgKG5vdCB1bmRlZmluZWQsIG5vdCBlbXB0eSlcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgc3BhbiBzdHJ1Y3R1cmUgYnV0IHVwZGF0ZSB0aGUgY29udGVudFxuICAgICAgICAgICAgICBzcGFuLmlubmVySFRNTCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdmFsdWUgaXMgaW52YWxpZCwgbGVhdmUgdGhlIHNwYW4gY29udGVudCBhcyBpcyAoZG9uJ3QgcmVwbGFjZSB3aXRoIHVuZGVmaW5lZClcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gdGVtcERpdi5pbm5lckhUTUw7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB1cGRhdGluZyBIVE1MIGdyYW1tYXI6JywgZXJyb3IpO1xuICAgICAgICAvLyBGYWxsYmFjayB0byBvcmlnaW5hbCBIVE1MIGdyYW1tYXJcbiAgICAgICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSBTdHJpbmcoaHRtbEdyYW1tYXIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGYWxsYmFjazogc2ltcGxlIHN0cmluZyByZXBsYWNlbWVudCBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nXG4gICAgICBsZXQgdXBkYXRlZEh0bWwgPSBTdHJpbmcoaHRtbEdyYW1tYXIpO1xuICAgICAgdmFsdWVNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAvLyBPbmx5IHJlcGxhY2UgaWYgdmFsdWUgaXMgdmFsaWQgKG5vdCB1bmRlZmluZWQsIG5vdCBlbXB0eSlcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgLy8gUmVwbGFjZSBzcGFucyB3aXRoIGRhdGEtZXZlbnQta2V5IG1hdGNoaW5nIHRoZSB2YXJpYWJsZSBuYW1lXG4gICAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGA8c3BhbltePl0qZGF0YS1ldmVudC1rZXk9XCIke2tleX1cIltePl0qPi4qPzwvc3Bhbj5gLCAnZ2knKTtcbiAgICAgICAgICB1cGRhdGVkSHRtbCA9IHVwZGF0ZWRIdG1sLnJlcGxhY2UocmVnZXgsIChtYXRjaCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgY29udGVudCBpbnNpZGUgdGhlIHNwYW5cbiAgICAgICAgICAgIHJldHVybiBtYXRjaC5yZXBsYWNlKC8+Lio/PC8sIGA+JHt2YWx1ZX08YCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSB1cGRhdGVkSHRtbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgc2VsZWN0b3IgdmFyaWFibGUgaXMgYXZhaWxhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzXG4gICAqL1xuICBnZXQgc2VsZWN0b3JWYXJpYWJsZUF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5zb21lKHYgPT4gdi5kYXRhS2V5ID09PSAnZWxlbWVudCcgfHwgdi5kYXRhS2V5ID09PSAnbGFiZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwYXJhbWV0ZXIgdmFyaWFibGUgaXMgYXZhaWxhYmxlICh0ZXN0RGF0YSB3aXRoIHBhcmFtZXRlciB0eXBlKVxuICAgKi9cbiAgZ2V0IHBhcmFtZXRlclZhcmlhYmxlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLnNvbWUodiA9PiB7XG4gICAgICBjb25zdCBkYXRhS2V5ID0gdi5kYXRhS2V5Py50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgaWYgKGRhdGFLZXkgPT09ICd0ZXN0X2RhdGEnIHx8IGRhdGFLZXkgPT09ICdzb3VyY2VfdmFsdWUnIHx8IGRhdGFLZXkgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICAgIC8vIGNvbnN0IGRhdGFUeXBlID0gdGhpcy52YXJpYWJsZURhdGFUeXBlcy5nZXQodi5uYW1lKSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGF2YWlsYWJsZSAodGVzdERhdGEgd2l0aCBlbnZpcm9ubWVudCB0eXBlKVxuICAgKi9cbiAgZ2V0IGVudmlyb25tZW50VmFyaWFibGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuc29tZSh2ID0+IHtcbiAgICAgIGNvbnN0IGRhdGFLZXkgPSB2LmRhdGFLZXk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBpZiAoZGF0YUtleSA9PT0gJ3Rlc3RfZGF0YScgfHwgZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgZGF0YUtleSA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgLy8gY29uc3QgZGF0YVR5cGUgPSB0aGlzLnZhcmlhYmxlRGF0YVR5cGVzLmdldCh2Lm5hbWUpIHx8ICdwbGFpbi10ZXh0JztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1mdWxsIGNxYS1iZy13aGl0ZSBjcWEtcC1bMTZweF1cIiBbbmdDbGFzc109XCJ7J2NxYS1weC00Jzogc2hvd0hlYWRlciwgJ2NxYS1weS0yJzogc2hvd0hlYWRlciAmJiAhc2VsZWN0ZWRUZW1wbGF0ZX1cIj5cbiAgPCEtLSBIZWFkZXIgLS0+XG4gIFxuICA8ZGl2ICpuZ0lmPVwic2hvd0hlYWRlclwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1tYi0yXCI+XG4gICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWJsYWNrLTEwMCBjcWEtbS0wXCI+XG4gICAgICB7eyBpc0VkaXRNb2RlID8gJ0VkaXQgYW4gYWN0aW9uIHN0ZXAnIDogJ0NyZWF0ZSBhbiBhY3Rpb24gc3RlcCcgfX1cbiAgICA8L2gyPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICAqbmdJZj1cImlzRWRpdE1vZGUgJiYgc2VsZWN0ZWRUZW1wbGF0ZVwiXG4gICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgYnRuU2l6ZT1cInNtXCJcbiAgICAgIGljb249XCJzd2FwX2hvcml6XCJcbiAgICAgIHRleHQ9XCJDaGFuZ2UgVGVtcGxhdGVcIlxuICAgICAgKGNsaWNrZWQpPVwib25DaGFuZ2VUZW1wbGF0ZSgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICAqbmdJZj1cImlzRWRpdE1vZGUgJiYgIXNlbGVjdGVkVGVtcGxhdGVcIlxuICAgICAgdmFyaWFudD1cInRleHRcIlxuICAgICAgYnRuU2l6ZT1cInNtXCJcbiAgICAgIHRleHQ9XCJDYW5jZWxcIlxuICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWxUZW1wbGF0ZVNlbGVjdGlvbigpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cIiFzZWxlY3RlZFRlbXBsYXRlXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWgtZnVsbCBjcWEtZmxleC0xXCJcbiAgICBbbmdDbGFzc109XCJ7J2NxYS1weC0zJzogc2hvd0hlYWRlcn1cIj5cblxuICAgIDwhLS0gU2VhcmNoIEJhciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXBiLTFcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcGItMVwiICpuZ0lmPVwic2hvd0hlYWRlclwiPlxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgIFRlbXBsYXRlIGxpYnJhcnlcbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8Y3FhLXNlYXJjaC1iYXIgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgW3ZhbHVlXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKCRldmVudClcIiAoc2VhcmNoKT1cIm9uU2VhcmNoU3VibWl0KCRldmVudClcIiAoY2xlYXJlZCk9XCJvblNlYXJjaENsZWFyZWQoKVwiPlxuICAgICAgPC9jcWEtc2VhcmNoLWJhcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVGVtcGxhdGUgTGlzdCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1weC0yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXB5LTJcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdGVtcGxhdGUgb2YgZmlsdGVyZWRUZW1wbGF0ZXM7IHRyYWNrQnk6IHRyYWNrQnlUZW1wbGF0ZVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtYWN0aW9uLWZvcm1hdCBjcWEtYmctd2hpdGUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWFsbCBob3ZlcjpjcWEtYm9yZGVyLWJsdWUtNTAwIGhvdmVyOmNxYS1zaGFkb3ctc20gbWItNlwiXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRlbXBsYXRlKHRlbXBsYXRlKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIzcHhdIGNxYS10ZXh0LWJsYWNrLTEwMFwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cInRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8IHRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnXCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJlZFRlbXBsYXRlcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtcHktOCBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1bMTJweF1cIj5cbiAgICAgICAgICBObyB0ZW1wbGF0ZXMgZm91bmRcbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdGVkVGVtcGxhdGVcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtb3ZlcmZsb3cteS1hdXRvXCIgc3R5bGU9XCJmbGV4OiAxIDEgMCAhaW1wb3J0YW50O1wiPlxuICAgIDwhLS0gSW5zdHJ1Y3Rpb24gVGV4dCB3aXRoIEVsZW1lbnQgQnV0dG9ucyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZmxleC13cmFwIGNxYS1nYXAtMSBjcWEtdGV4dC1zbSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtcHktMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1hY3Rpb24tZm9ybWF0IGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjNweF0gY3FhLXRleHQtYmxhY2stMTAwXCJcbiAgICAgICAgW2lubmVySFRNTF09XCJ1cGRhdGVkSHRtbEdyYW1tYXIgfHwgc2VsZWN0ZWRUZW1wbGF0ZS5odG1sR3JhbW1hciB8fCBzZWxlY3RlZFRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LWVuZCBjcWEtcHQtMiBjcWEtZ2FwLTJcIiAqbmdJZj1cIiFjcmVhdGVFbGVtZW50VmlzaWJsZVwiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiBcbiAgICAgICAgICAqbmdJZj1cInNlbGVjdG9yVmFyaWFibGVBdmFpbGFibGVcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIFxuICAgICAgICAgIGJ0blNpemU9XCJzbVwiXG4gICAgICAgICAgaWNvbj1cImFkZFwiXG4gICAgICAgICAgdGV4dD1cIkNyZWF0ZSBFbGVtZW50XCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJvblNob3dFbGVtZW50Rm9ybSgpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPGNxYS1idXR0b24gXG4gICAgICAgICAgKm5nSWY9XCJwYXJhbWV0ZXJWYXJpYWJsZUF2YWlsYWJsZVwiXG4gICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCIgXG4gICAgICAgICAgYnRuU2l6ZT1cInNtXCJcbiAgICAgICAgICBpY29uPVwiYWRkXCJcbiAgICAgICAgICB0ZXh0PVwiQ3JlYXRlIFBhcmFtZXRlclwiXG4gICAgICAgICAgKGNsaWNrZWQpPVwicmVkaXJlY3RUb1BhcmFtZXRlci5lbWl0KClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiBcbiAgICAgICAgICAqbmdJZj1cImVudmlyb25tZW50VmFyaWFibGVBdmFpbGFibGVcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIFxuICAgICAgICAgIGJ0blNpemU9XCJzbVwiXG4gICAgICAgICAgaWNvbj1cImFkZFwiXG4gICAgICAgICAgdGV4dD1cIkNyZWF0ZSBFbnZpcm9ubWVudFwiXG4gICAgICAgICAgKGNsaWNrZWQpPVwicmVkaXJlY3RUb0Vudmlyb25tZW50LmVtaXQoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRm9ybSBGaWVsZHMgaW4gVHdvIENvbHVtbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1vdmVyZmxvdy15LWF1dG8gY3FhLWZsZXgtMSBjcWEtcGItMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMVwiPlxuICAgICAgICA8IS0tIEVudiBiYW5uZXIg4oCUIHN1cmZhY2VzIHdoaWNoIGVudmlyb25tZW50J3MgdmFyaWFibGVzIGFuZCBURFBzIGFyZSBpbiBzY29wZS4gLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJ0ZXN0Q2FzZUVudmlyb25tZW50TmFtZVwiXG4gICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtMSBjcWEtbWItMyBjcWEtcHgtMyBjcWEtcHktMiBjcWEtcm91bmRlZC1tZCBjcWEtdGV4dC14cyBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtYmctZ3JheS01MCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItZ3JheS0yMDBcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgVXNpbmdcbiAgICAgICAgICAgIDxzdHJvbmcgY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZFwiPnt7IHRlc3RDYXNlRW52aXJvbm1lbnROYW1lIH19IEVudmlyb25tZW50PG5nLWNvbnRhaW5lciAqbmdJZj1cInRlc3RDYXNlRW52aXJvbm1lbnRMYWJlbFN1ZmZpeFwiPiAoRGVmYXVsdCk8L25nLWNvbnRhaW5lcj48L3N0cm9uZz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtZ3JheS01MDBcIj4gwrcgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1ncmF5LTUwMFwiPkVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgZGF0YSBwcm9maWxlcyBhcmUgcmVzb2x2ZWQgZnJvbSB0aGlzIGVudmlyb25tZW50Ljwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGVzdENhc2VFbnZpcm9ubWVudExhYmVsU3VmZml4XCIgY2xhc3M9XCJjcWEtdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgU2V0IGFuIGVudmlyb25tZW50IG9uIHRoZSB0ZXN0IGNhc2UgdG8gb3ZlcnJpZGUgdGhpcyBkZWZhdWx0LlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAteC02IGNxYS1mbGV4LXdyYXAgY3FhLXBiLTRcIj5cbiAgICAgICAgICA8IS0tIFRlbXBsYXRlIFZhcmlhYmxlcyBGb3JtIENvbXBvbmVudCAtLT5cbiAgICAgICAgICA8Y3FhLXRlbXBsYXRlLXZhcmlhYmxlcy1mb3JtXG4gICAgICAgICAgICAjdGVtcGxhdGVWYXJpYWJsZXNGb3JtXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlO1wiXG4gICAgICAgICAgICBbaXNEZWJ1Z109XCJpc0RlYnVnXCJcbiAgICAgICAgICAgIFt0ZW1wbGF0ZVZhcmlhYmxlc109XCJ0ZW1wbGF0ZVZhcmlhYmxlc1wiXG4gICAgICAgICAgICBbdmFyaWFibGVzRm9ybV09XCJ2YXJpYWJsZXNGb3JtXCJcbiAgICAgICAgICAgIFttZXRhZGF0YV09XCJtZXRhZGF0YVwiXG4gICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgW2VsZW1lbnRPcHRpb25zXT1cImVsZW1lbnRPcHRpb25zXCJcbiAgICAgICAgICAgIFtoYXNNb3JlRWxlbWVudHNdPVwiaGFzTW9yZUVsZW1lbnRzXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmdFbGVtZW50c109XCJpc0xvYWRpbmdFbGVtZW50c1wiXG4gICAgICAgICAgICBbc2NyZWVuTmFtZU9wdGlvbnNdPVwic2NyZWVuTmFtZU9wdGlvbnNcIlxuICAgICAgICAgICAgW2hhc01vcmVTY3JlZW5OYW1lc109XCJoYXNNb3JlU2NyZWVuTmFtZXNcIlxuICAgICAgICAgICAgW2lzTG9hZGluZ1NjcmVlbk5hbWVzXT1cImlzTG9hZGluZ1NjcmVlbk5hbWVzXCJcbiAgICAgICAgICAgIFtwYXJhbWV0ZXJPcHRpb25zXT1cInBhcmFtZXRlck9wdGlvbnNcIlxuICAgICAgICAgICAgW2hhc01vcmVQYXJhbWV0ZXJzXT1cImhhc01vcmVQYXJhbWV0ZXJzXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmdQYXJhbWV0ZXJzXT1cImlzTG9hZGluZ1BhcmFtZXRlcnNcIlxuICAgICAgICAgICAgW3VwbG9hZE9wdGlvbnNdPVwidXBsb2FkT3B0aW9uc1wiXG4gICAgICAgICAgICBbaGFzTW9yZVVwbG9hZHNdPVwiaGFzTW9yZVVwbG9hZHNcIlxuICAgICAgICAgICAgW2lzTG9hZGluZ1VwbG9hZHNdPVwiaXNMb2FkaW5nVXBsb2Fkc1wiXG4gICAgICAgICAgICBbZW52aXJvbm1lbnRPcHRpb25zXT1cImVudmlyb25tZW50T3B0aW9uc1wiXG4gICAgICAgICAgICBbaGFzTW9yZUVudmlyb25tZW50c109XCJoYXNNb3JlRW52aXJvbm1lbnRzXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmdFbnZpcm9ubWVudHNdPVwiaXNMb2FkaW5nRW52aXJvbm1lbnRzXCJcbiAgICAgICAgICAgIFtnbG9iYWxWYXJpYWJsZU9wdGlvbnNdPVwiZ2xvYmFsVmFyaWFibGVPcHRpb25zXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmdHbG9iYWxWYXJpYWJsZXNdPVwiaXNMb2FkaW5nR2xvYmFsVmFyaWFibGVzXCJcbiAgICAgICAgICAgIFt0ZXN0Q2FzZUVudmlyb25tZW50TmFtZV09XCJ0ZXN0Q2FzZUVudmlyb25tZW50TmFtZVwiXG4gICAgICAgICAgICBbdGVzdENhc2VFbnZpcm9ubWVudExhYmVsU3VmZml4XT1cInRlc3RDYXNlRW52aXJvbm1lbnRMYWJlbFN1ZmZpeFwiXG4gICAgICAgICAgICBbZW52aXJvbm1lbnRMZWdhY3lEZXByZWNhdGlvbk1lc3NhZ2VdPVwiZW52aXJvbm1lbnRMZWdhY3lEZXByZWNhdGlvbk1lc3NhZ2VcIlxuICAgICAgICAgICAgW3Rlc3RDYXNlVGVzdERhdGFJZF09XCJ0ZXN0Q2FzZVRlc3REYXRhSWRcIlxuICAgICAgICAgICAgW2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZF09XCJkZWZhdWx0VGVzdERhdGFQcm9maWxlSWRcIlxuICAgICAgICAgICAgW2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXhdPVwiZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleFwiXG4gICAgICAgICAgICBbZGVmYXVsdFRlc3REYXRhRW5kSW5kZXhdPVwiZGVmYXVsdFRlc3REYXRhRW5kSW5kZXhcIlxuICAgICAgICAgICAgW2lzSW5zaWRlRm9yTG9vcFN0ZXBdPVwiaXNJbnNpZGVGb3JMb29wU3RlcFwiXG4gICAgICAgICAgICBbaGFzVGVzdERhdGFQcm9maWxlXT1cImhhc1Rlc3REYXRhUHJvZmlsZVwiXG4gICAgICAgICAgICBbY3JlYXRlRWxlbWVudFZpc2libGVdPVwiY3JlYXRlRWxlbWVudFZpc2libGVcIlxuICAgICAgICAgICAgKHZhcmlhYmxlVmFsdWVDaGFuZ2UpPVwib25WYXJpYWJsZVZhbHVlQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICh2YXJpYWJsZUJvb2xlYW5DaGFuZ2UpPVwib25WYXJpYWJsZUJvb2xlYW5DaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgKG1ldGFkYXRhQ2hhbmdlKT1cIm1ldGFkYXRhID0gJGV2ZW50XCJcbiAgICAgICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCJkZXNjcmlwdGlvbiA9ICRldmVudFwiXG4gICAgICAgICAgICAobG9hZE1vcmVFbGVtZW50cyk9XCJsb2FkTW9yZUVsZW1lbnRzLmVtaXQoKVwiXG4gICAgICAgICAgICAoc2VhcmNoRWxlbWVudHMpPVwic2VhcmNoRWxlbWVudHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZSk9XCJzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGNyZWF0ZUVsZW1lbnQpPVwiY3JlYXRlRWxlbWVudC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKHNlYXJjaFNjcmVlbk5hbWUpPVwic2VhcmNoU2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlU2NyZWVuTmFtZXMpPVwibG9hZE1vcmVTY3JlZW5OYW1lcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0KT1cImNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VhcmNoUGFyYW1ldGVycyk9XCJzZWFyY2hQYXJhbWV0ZXJzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmVQYXJhbWV0ZXJzKT1cImxvYWRNb3JlUGFyYW1ldGVycy5lbWl0KClcIlxuICAgICAgICAgICAgKHNlYXJjaFVwbG9hZHMpPVwic2VhcmNoVXBsb2Fkcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlVXBsb2Fkcyk9XCJsb2FkTW9yZVVwbG9hZHMuZW1pdCgpXCJcbiAgICAgICAgICAgIChzZWFyY2hFbnZpcm9ubWVudHMpPVwic2VhcmNoRW52aXJvbm1lbnRzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmVFbnZpcm9ubWVudHMpPVwibG9hZE1vcmVFbnZpcm9ubWVudHMuZW1pdCgpXCJcbiAgICAgICAgICAgIChzZWFyY2hHbG9iYWxWYXJpYWJsZXMpPVwic2VhcmNoR2xvYmFsVmFyaWFibGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlKT1cIm9uRWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS10ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBBZHZhbmNlZCAoRXhwYW5kYWJsZSkgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuICBjcWEtZ2FwLTIgY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1wLTAgY3FhLW1iLTEuNVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVBZHZhbmNlZCgpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdXCI+QWR2YW5jZWQ8L3NwYW4+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LWJhc2VcIiBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiYWR2YW5jZWRFeHBhbmRlZFwiPlxuICAgICAgICAgICAgICAgIGV4cGFuZF9tb3JlXG4gICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhZHZhbmNlZEV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtbXQtMlwiPlxuICAgICAgICAgICAgICA8Y3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtIFxuICAgICAgICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlc109XCJhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzXCJcbiAgICAgICAgICAgICAgICBbYWR2YW5jZWRWYXJpYWJsZUZvcm1dPVwiYWR2YW5jZWRWYXJpYWJsZXNGb3JtXCJcbiAgICAgICAgICAgICAgICAodmFyaWFibGVCb29sZWFuQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICh2YXJpYWJsZVZhbHVlQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+IFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIFxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFjcmVhdGVFbGVtZW50VmlzaWJsZVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLXctZnVsbCBjcWEtZ2FwLTIgY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZ3JheS0yMDAgY3FhLXBiLTJcIj5cbiAgICAgIDxjcWEtYnV0dG9uIGNsYXNzPVwiY3FhLXctMS8yXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgdGV4dD1cIkNhbmNlbFwiIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIDxjcWEtYnV0dG9uICpuZ0lmPVwiIWlzQ3JlYXRpbmdTdGVwXCIgY2xhc3M9XCJjcWEtdy0xLzJcIiB2YXJpYW50PVwiZmlsbGVkXCIgW3RleHRdPVwiaXNFZGl0TW9kZSA/ICdVcGRhdGUgU3RlcCcgOiAnQ3JlYXRlIFN0ZXAnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0Zvcm1WYWxpZCgpXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DcmVhdGVTdGVwKClcIj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIDwhLS0gTG9hZGVyIHNsb3Q6IHNhbWUgc2l6ZSBhcyBDcmVhdGUgU3RlcCBidXR0b24gKGxnOiAzOHB4IGhlaWdodCwgZnVsbCB3aWR0aCwgcm91bmRlZC1bOHB4XSkgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNDcmVhdGluZ1N0ZXBcIiBjbGFzcz1cImNxYS13LTEvMiBjcWEtZmxleC0xIGNxYS1taW4taC1bMzhweF0gY3FhLXJvdW5kZWQtWzhweF1cIj5cbiAgICAgICAgPGNxYS1iYWRnZVxuICAgICAgICAgIGxhYmVsPVwiQ3JlYXRpbmfigKZcIlxuICAgICAgICAgIGljb249XCJhdXRvcmVuZXdcIlxuICAgICAgICAgIFtpc0xvYWRpbmddPVwidHJ1ZVwiXG4gICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICBbY2VudGVyQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICBbaW5saW5lU3R5bGVzXT1cIidtaW4taGVpZ2h0OiAzOHB4OyBoZWlnaHQ6IDM4cHg7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOydcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJpbmZvXCJcbiAgICAgICAgICBzaXplPVwibWVkaXVtXCI+XG4gICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19