@cqa-lib/cqa-ui 1.1.366 → 1.1.368

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.
@@ -2164,10 +2164,10 @@ ApiEditStepComponent.DEFAULT_STATUS_VERIFICATION_OPTIONS = [
2164
2164
  { id: 'greater-than', value: 'greater-than', name: 'Greater than', label: 'Greater than' },
2165
2165
  ];
2166
2166
  ApiEditStepComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiEditStepComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
2167
- ApiEditStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ApiEditStepComponent, selector: "cqa-api-edit-step", inputs: { initialMethod: "initialMethod", initialEnvironment: "initialEnvironment", initialStep: "initialStep", initialUrl: "initialUrl", initialPayloadTab: "initialPayloadTab", initialPayloadType: "initialPayloadType", initialPayloadText: "initialPayloadText", initialHeaders: "initialHeaders", initialResponsePreview: "initialResponsePreview", initialVariableName: "initialVariableName", initialResponseBodyVerifications: "initialResponseBodyVerifications", initialStatusVerifications: "initialStatusVerifications", initialActiveResponseVerificationTab: "initialActiveResponseVerificationTab", editMode: "editMode", isCreatingStep: "isCreatingStep", httpMethodOptions: "httpMethodOptions", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", urlOptions: "urlOptions", authTypeOptions: "authTypeOptions", initialAuthType: "initialAuthType", formatOptions: "formatOptions", initialFormat: "initialFormat", headerNameOptions: "headerNameOptions", verificationOptions: "verificationOptions", verificationDataTypeOptions: "verificationDataTypeOptions", statusVerificationOptions: "statusVerificationOptions", advancedSettingsVariables: "advancedSettingsVariables" }, outputs: { importCurl: "importCurl", importCurlCancel: "importCurlCancel", sendRequest: "sendRequest", back: "back", cancel: "cancel", next: "next", create: "create", headersChange: "headersChange", environmentChange: "environmentChange", environmentSearch: "environmentSearch", environmentLoadMore: "environmentLoadMore" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "payloadEditorWithLinesRef", first: true, predicate: ["payloadEditorWithLinesRef"], descendants: true }, { propertyName: "payloadTextareaRef", first: true, predicate: ["payloadTextareaRef"], descendants: true }, { propertyName: "responsePreviewRef", first: true, predicate: ["responsePreviewRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-api-edit-step-container cqa-bg-[#ffffff] cqa-flex cqa-flex-col cqa-w-full cqa-h-full cqa-p-[16px] cqa-gap-[12px] cqa-overflow-y-auto cqa-overflow-x-hidden cqa-box-border\">\n\n <h2 class=\"cqa-api-edit-step-title cqa-font-inter cqa-text-[12px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#000000] cqa-m-0\">\n {{ editMode ? 'Update API Test Step' : 'Create API Test Step' }}\n </h2>\n\n <div class=\"cqa-api-edit-step-indicator cqa-flex cqa-items-center cqa-gap-0 cqa-max-[767px]:cqa-flex-wrap cqa-max-[767px]:cqa-gap-2 cqa-max-[767px]:cqa-justify-start\"\n [class.cqa-justify-start]=\"stepLabels.length === 1\"\n [class.cqa-justify-between]=\"stepLabels.length !== 1\">\n <ng-container *ngFor=\"let step of stepLabels; let i = index\">\n <cqa-button type=\"button\" variant=\"text\"\n customClass=\"cqa-api-edit-step-indicator-item cqa-api-edit-step-indicator-item--clickable cqa-flex cqa-items-center cqa-gap-[10px] cqa-cursor-pointer cqa-border-none cqa-p-0 cqa-font-inherit cqa-text-inherit cqa-text-left !cqa-bg-transparent\"\n [attr.aria-label]=\"'Step ' + step.index + ': ' + step.label\" [attr.aria-pressed]=\"step.index === currentStep\"\n (clicked)=\"setStep(step.index)\">\n <span class=\"cqa-api-edit-step-indicator-circle cqa-w-8 cqa-h-8 cqa-rounded-full cqa-inline-flex cqa-items-center cqa-justify-center cqa-text-sm cqa-font-medium cqa-leading-none cqa-border-none cqa-shrink-0\"\n [ngClass]=\"step.index === currentStep ? 'cqa-bg-[#4F46E5] cqa-text-white' : 'cqa-bg-[#E0E0E0] cqa-text-[#666666]'\">\n {{ step.index }}\n </span>\n <span class=\"cqa-api-edit-step-indicator-label cqa-text-sm cqa-leading-[18px] cqa-font-normal cqa-max-[767px]:cqa-text-xs\"\n [ngClass]=\"step.index === currentStep ? 'cqa-text-[#4F46E5]' : 'cqa-text-[#666666]'\">\n {{ step.label }}\n </span>\n <div *ngIf=\"i < stepLabels.length - 1\" class=\"cqa-api-edit-step-indicator-line cqa-w-[96px] cqa-h-[2px] cqa-bg-[#E0E0E0] cqa-my-0 cqa-mx-[6px] cqa-shrink-0 cqa-self-center cqa-max-[767px]:cqa-w-[24px] cqa-max-[767px]:cqa-mx-1\" aria-hidden=\"true\"></div>\n </cqa-button>\n </ng-container>\n </div>\n\n <!-- Step content viewport: only the active step body is shown (*ngIf) -->\n <div class=\"cqa-api-edit-step-viewport cqa-w-full\">\n <!-- Step 1: Environment, request, body, response -->\n <div *ngIf=\"currentStep === 1\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <!-- Environment row: label on top, select below (aligned right on desktop) -->\n <div class=\"cqa-api-edit-step-environment-row cqa-flex cqa-flex-col cqa-gap-1.5 cqa-items-end cqa-max-[767px]:cqa-items-stretch\">\n <span class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-max-[767px]:cqa-items-stretch\">\n <label class=\"cqa-api-edit-step-environment-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal\">Environments</label>\n <cqa-dynamic-select *ngIf=\"environmentForm\"\n [form]=\"environmentForm\"\n [config]=\"environmentSelectConfig\"\n class=\"cqa-api-edit-step-environment-select cqa-shrink-0 cqa-w-auto cqa-min-w-[315px] cqa-max-w-[315px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full [&_.mat-form-field-wrapper]:cqa-pb-0\"\n aria-label=\"Environment\"\n (selectionChange)=\"onEnvironmentSelectionChange($event)\">\n </cqa-dynamic-select>\n </span>\n </div>\n\n <!-- Request row: method, URL, buttons -->\n <div class=\"cqa-api-edit-step-request-row cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-max-[767px]:cqa-flex-col cqa-max-[767px]:cqa-items-stretch cqa-max-[767px]:cqa-gap-2.5\">\n <cqa-dynamic-select *ngIf=\"methodForm\" [form]=\"methodForm\" [config]=\"methodSelectConfig\"\n class=\"cqa-api-edit-step-method-select cqa-shrink-0 cqa-w-auto cqa-min-w-[152px] cqa-max-w-[152px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full\" aria-label=\"HTTP method\"\n (selectionChange)=\"onMethodSelectionChange($event)\">\n </cqa-dynamic-select>\n <div class=\"cqa-api-edit-step-url-wrap cqa-flex-1 cqa-min-w-[200px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-w-full\">\n <cqa-autocomplete\n [value]=\"url\"\n (valueChange)=\"url = $event\"\n [options]=\"urlOptions\"\n [placeholder]=\"urlPlaceholder\"\n ariaLabel=\"Enter URL or select Parameter\"\n [fullWidth]=\"true\"\n (optionSelect)=\"onUrlOptionSelect($event)\">\n </cqa-autocomplete>\n <div *ngIf=\"urlError\" class=\"cqa-text-red-600 cqa-text-sm cqa-mt-1\">\n {{ urlError }}\n </div>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-trigger cqa-contents cqa-max-[767px]:cqa-w-full cqa-max-[767px]:!cqa-flex\" (click)=\"openImportCurlPanel()\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Import API cURL\"\n customClass=\"cqa-api-edit-step-btn-outline !cqa-bg-white !cqa-border !cqa-border-solid !cqa-border-[#6B7280] cqa-text-[#414146] cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal hover:!cqa-bg-[#F9FAFB] hover:!cqa-text-[#414146] cqa-max-[767px]:cqa-w-full\">\n </cqa-button>\n </div>\n <cqa-button variant=\"filled\" btnSize=\"lg\" text=\"Send Request\" (clicked)=\"onSendRequest()\"\n [disabled]=\"!isUrlValid\"\n customClass=\"cqa-api-edit-step-btn-primary cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal !cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] !cqa-border-none cqa-py-2.5 cqa-px-6 cqa-gap-2 cqa-rounded-lg cqa-min-h-[37px] cqa-box-border hover:!cqa-bg-[#1B1FEB] cqa-max-[767px]:cqa-w-full\"\n [ngClass]=\"{'!cqa-opacity-50 !cqa-cursor-not-allowed': !isUrlValid}\">\n </cqa-button>\n </div>\n\n\n\n <!-- Body content: header section (default) OR import cURL section -->\n <ng-container *ngIf=\"bodyView === 'import-curl'\">\n <div class=\"cqa-api-edit-step-import-curl-panel cqa-flex cqa-flex-col cqa-bg-white cqa-rounded-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-shadow-[0_1px_3px_rgba(0,0,0,0.08)] cqa-overflow-hidden\">\n <div class=\"cqa-api-edit-step-import-curl-header cqa-flex cqa-items-center cqa-justify-between cqa-py-3 cqa-px-5 cqa-border-b cqa-border-solid cqa-border-[#E2E8F0] cqa-bg-[#F9FAFB] cqa-rounded-t-lg cqa-max-[767px]:cqa-px-4\">\n <h3 class=\"cqa-api-edit-step-import-curl-title cqa-m-0 cqa-text-xs cqa-font-bold cqa-leading-[18px] cqa-text-[#374151]\">Import API cURL</h3>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-separator cqa-h-px cqa-bg-[#E2E8F0] cqa-my-0 cqa-mx-5\"></div>\n <div class=\"cqa-api-edit-step-import-curl-body\">\n <cqa-custom-textarea [value]=\"importCurlControl.value\"\n (valueChange)=\"importCurlControl.setValue($event)\"\n placeholder=\"Paste your cURL command here (e.g., curl -X POST https://api.example.com/users)\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-import-curl-textarea\">\n </cqa-custom-textarea>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-footer\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-import-curl-btn-cancel\" (clicked)=\"onCancelImportCurl()\"></cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Import\"\n customClass=\"cqa-api-edit-step-import-curl-btn-import\" (clicked)=\"onImportCurlConfirm()\"></cqa-button>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"bodyView === 'headers'\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of payloadTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activePayloadTab === tab.value ? ' cqa-api-edit-step-tab--active' : '') + (isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params') ? ' cqa-api-edit-step-tab--disabled' : '')\"\n [disabled]=\"isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params')\"\n (clicked)=\"setPayloadTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Payload content (Authorization) -->\n <div *ngIf=\"activePayloadTab === 'authorization'\" class=\"cqa-api-edit-step-payload\"\n [attr.style]=\"'padding: 20px; min-height: 200px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 20px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 8px; width: fit-content;'\">\n <span [attr.style]=\"'font-size: 11px; font-weight: 600; letter-spacing: 0.02em; color: #6B7280; text-transform: uppercase; line-height: 1.25;'\">AUTH TYPE</span>\n <cqa-dynamic-select *ngIf=\"authTypeForm\" [form]=\"authTypeForm\" [config]=\"authTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-type-select\" aria-label=\"Auth type\"\n [attr.style]=\"'min-width: 160px;'\">\n </cqa-dynamic-select>\n </div>\n <!-- No Auth: centered message -->\n <div *ngIf=\"selectedAuthType === 'no-auth'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-width: 0; text-align: center;'\">\n <div aria-hidden=\"true\"\n [attr.style]=\"'width: 48px; height: 48px; border-radius: 10px; background: #F3F4F6; display: flex; align-items: center; justify-content: center; flex-shrink: 0;'\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <rect x=\"5\" y=\"11\" width=\"14\" height=\"2\" rx=\"1\" fill=\"#9CA3AF\"/>\n </svg>\n </div>\n <span [attr.style]=\"'font-size: 16px; font-weight: 600; color: #374151; line-height: 1.25;'\">No Auth</span>\n <div [attr.style]=\"'display: flex; align-items: center; justify-content: center; gap: 6px; flex-wrap: wrap;'\">\n <span [attr.style]=\"'font-size: 14px; font-weight: 400; color: #9CA3AF; line-height: 1.4;'\">This request does not use any authorization.</span>\n <span role=\"img\" aria-label=\"More information\" title=\"This request does not use any authorization.\"\n [attr.style]=\"'display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; color: #9CA3AF; flex-shrink: 0;'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M8 7v4M8 5v.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </div>\n </div>\n <!-- Bearer Token: Token label + textarea -->\n <div *ngIf=\"selectedAuthType === 'bearer'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; gap: 10px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Token</span>\n <cqa-custom-textarea [(value)]=\"bearerToken\"\n placeholder=\"Enter bearer token\"\n [fullWidth]=\"true\" [rows]=\"6\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-auth-token-textarea\" ariaLabel=\"Bearer token\">\n </cqa-custom-textarea>\n </div>\n <!-- OAuth 2.0: Grant Type, Access Token URL, Client ID, Client Secret, Scope, Client Authentication -->\n <div *ngIf=\"selectedAuthType === 'oauth2' && oauth2Form\"\n class=\"cqa-api-edit-step-oauth2-grid\"\n [attr.style]=\"'display: grid; grid-template-columns: 1fr 1fr; gap: 16px 24px; width: 100%;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Grant Type</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2GrantTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"OAuth grant type\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth grant type</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Access Token URL</span>\n <cqa-custom-input [value]=\"oauth2Form.get('accessTokenUrl')?.value\"\n (valueChange)=\"oauth2Form.get('accessTokenUrl')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth token endpoint\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Access Token URL\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth token endpoint</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client ID</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientId')?.value\"\n (valueChange)=\"oauth2Form.get('clientId')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth client identifier\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client ID\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client identifier</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Secret</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientSecret')?.value\"\n (valueChange)=\"oauth2Form.get('clientSecret')?.setValue($event)\"\n type=\"password\" [label]=\"''\" placeholder=\"Enter OAuth client secret\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client Secret\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client secret</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Scope</span>\n <cqa-custom-input [value]=\"oauth2Form.get('scope')?.value\"\n (valueChange)=\"oauth2Form.get('scope')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter space-separated scopes\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Scope\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Space-separated scopes</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Authentication</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2ClientAuthSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"Client authentication method\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Client authentication method</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Payload content (Headers) -->\n <div *ngIf=\"activePayloadTab === 'headers'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-headers-grid\">\n <span class=\"cqa-api-edit-step-headers-label\">Header Name</span>\n <span class=\"cqa-api-edit-step-headers-label\">Header Value</span>\n <span class=\"cqa-api-edit-step-headers-label cqa-api-edit-step-headers-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of headerRows; let i = index; trackBy: trackByHeader\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-header-row\">\n <cqa-dynamic-select [form]=\"row\" [config]=\"headerNameSelectConfig\"\n (addCustomValue)=\"onHeaderNameAddCustomValue($event, row)\"\n class=\"cqa-api-edit-step-header-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-header-value-input\" ariaLabel=\"Header value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-header-delete'\"\n [tooltip]=\"'Remove header'\" (clicked)=\"removeHeader(i)\">\n <svg class=\"cqa-api-edit-step-header-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-add-header-wrap\">\n <cqa-button type=\"button\" variant=\"text\" text=\"+ Add Header\"\n [customClass]=\"'cqa-api-edit-step-add-header-link'\" (clicked)=\"addHeader()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Params): Key\u2013Value table with add/delete rows -->\n <div *ngIf=\"activePayloadTab === 'params'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of paramsRows; let i = index; trackBy: trackByParams\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeParamsRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addParamsRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Body only): type, format, text area, Back/Next -->\n <div *ngIf=\"activePayloadTab === 'body'\"\n class=\"cqa-api-edit-step-payload cqa-api-edit-step-payload-editor\">\n <div class=\"cqa-api-edit-step-payload-type-row\">\n <span class=\"cqa-api-edit-step-payload-type-label\">Type</span>\n <div class=\"cqa-api-edit-step-payload-type-radios\">\n <cqa-segment-control [value]=\"payloadType\" [segments]=\"payloadTypeSegments\"\n (valueChange)=\"onPayloadTypeChange($event)\"\n class=\"cqa-api-edit-step-payload-type-segment\">\n </cqa-segment-control>\n </div>\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-format-wrap\">\n <span class=\"cqa-api-edit-step-payload-format-label\">Format:</span>\n <cqa-dynamic-select *ngIf=\"payloadFormatForm\" [form]=\"payloadFormatForm\"\n [config]=\"payloadFormatSelectConfig\" class=\"cqa-api-edit-step-payload-format-select\"\n aria-label=\"Format\">\n </cqa-dynamic-select>\n </div>\n </div>\n <!-- Raw: text area with line numbers (Postman-style payload body) -->\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-body\" #payloadEditorWithLinesRef>\n <div class=\"cqa-api-edit-step-payload-editor-with-lines\">\n <div class=\"cqa-api-edit-step-payload-line-numbers\" aria-hidden=\"true\">\n <span *ngFor=\"let n of payloadLineNumbers\" class=\"cqa-api-edit-step-payload-line-num\">\n <span *ngIf=\"payloadJsonError && payloadJsonError.line === n\"\n class=\"cqa-api-edit-step-payload-line-error-icon\" [title]=\"payloadJsonErrorTooltip\"\n aria-label=\"Parse error on this line\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#EF4444\"/>\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-api-edit-step-payload-line-num-text\">{{ n }}</span>\n </span>\n </div>\n <div class=\"cqa-api-edit-step-payload-textarea-cell\">\n <div class=\"cqa-api-edit-step-payload-textarea cqa-w-full cqa-flex cqa-flex-col cqa-min-h-0\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea--error': payloadJsonError}\">\n <textarea #payloadTextareaRef\n class=\"cqa-api-edit-step-payload-textarea-input cqa-w-full cqa-outline-none cqa-box-border\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea-input--error': payloadJsonError}\"\n [value]=\"payloadText\"\n placeholder=\"\"\n [attr.aria-label]=\"'Payload'\"\n [attr.aria-invalid]=\"!!payloadJsonError\"\n (input)=\"onPayloadInput($event)\"\n (keydown)=\"onPayloadKeydown($event)\">\n </textarea>\n </div>\n </div>\n </div>\n <p *ngIf=\"payloadJsonError\" class=\"cqa-api-edit-step-payload-json-error-msg\">\n Invalid JSON format. Please check your syntax.\n </p>\n </div>\n\n <!-- x-www-form-urlencoded: Key\u2013Value rows, add/remove dynamically -->\n <div *ngIf=\"payloadType === 'x-www-form-urlencoded'\" class=\"cqa-api-edit-step-key-value\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyValueRows; let i = index; trackBy: trackByKeyValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addKeyValueRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Data: Key\u2013Type\u2013Value rows; Type is a dropdown (Text/File), add/remove dynamically -->\n <div *ngIf=\"payloadType === 'form-data'\" class=\"cqa-api-edit-step-key-type-value\">\n <div class=\"cqa-api-edit-step-key-type-value-header\">\n <span class=\"cqa-api-edit-step-key-type-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Type</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-type-value-label cqa-api-edit-step-key-type-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyTypeValueRows; let i = index; trackBy: trackByKeyTypeValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-type-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"keyTypeValueTypeSelectConfig\"\n class=\"cqa-api-edit-step-key-type-value-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-type-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyTypeValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-type-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-type-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-type-value-add-btn\" (clicked)=\"addKeyTypeValueRow()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Advanced settings (step-level) -->\n <div class=\"cqa-mt-4\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-py-2 cqa-border-b cqa-border-gray-200\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-lg cqa-transition-transform\" [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\n </div>\n <!-- Step 2: Variable Name: input, validation, Back / Next -->\n <div *ngIf=\"currentStep === 2\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-variable-section\">\n <div class=\"cqa-api-edit-step-variable-input-wrap\">\n <cqa-custom-input [(value)]=\"variableName\" [label]=\"''\" placeholder=\"Variable Name\" [fullWidth]=\"true\"\n size=\"md\" (valueChange)=\"onVariableNameChange()\" aria-label=\"Variable Name\">\n </cqa-custom-input>\n </div>\n <p *ngIf=\"variableNameError\" class=\"cqa-api-edit-step-variable-error\" role=\"alert\">{{ variableNameError }}</p>\n </div>\n </div>\n <!-- Step 3: Response Body / Status tabs -->\n <div *ngIf=\"currentStep === 3\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of responseVerificationTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activeResponseVerificationTab === tab.value ? ' cqa-api-edit-step-tab--active' : '')\"\n (clicked)=\"setResponseVerificationTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Response Body tab content: verification grid -->\n <div *ngIf=\"activeResponseVerificationTab === 'response-body'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-verification\">\n <div class=\"cqa-api-edit-step-verification-grid cqa-api-edit-step-verification-grid-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">JSON Path</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Data Type</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of verificationRows; let i = index; trackBy: trackByVerification\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-custom-input [value]=\"row.get('jsonPath')?.value ?? ''\"\n (valueChange)=\"row.get('jsonPath')?.setValue($event)\" placeholder=\"Json Path\" [fullWidth]=\"true\"\n size=\"sm\" class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"JSON Path\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationDataTypeSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\"\n (selectionChange)=\"onVerificationDataTypeChange(row, $event)\">\n </cqa-dynamic-select>\n <!-- Expected Value: text for String/Array/Object, number for Number, dropdown for Boolean -->\n <ng-container [ngSwitch]=\"row.get('dataType')?.value\">\n <cqa-dynamic-select *ngSwitchCase=\"'boolean'\" [form]=\"row\"\n [config]=\"verificationExpectedValueBooleanSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-api-edit-step-verification-expected-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input *ngSwitchCase=\"'number'\" [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value (number)\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input cqa-api-edit-step-verification-expected-number\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-custom-input *ngSwitchDefault [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\"\n placeholder=\"Expected Value in String\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n </ng-container>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Status tab content: S.no, Verification dropdown, Expected Value, add/remove rows -->\n <div *ngIf=\"activeResponseVerificationTab === 'status'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addStatusVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-status-verification\">\n <div class=\"cqa-api-edit-step-status-verification-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of statusVerificationRows; let i = index; trackBy: trackByStatusVerification\"\n [formGroup]=\"row\" class=\"cqa-api-edit-step-status-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-dynamic-select [form]=\"row\" [config]=\"statusVerificationSelectConfig\"\n class=\"cqa-api-edit-step-status-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\" class=\"cqa-api-edit-step-verification-input\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeStatusVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Response Preview -->\n <div #responsePreviewRef class=\"cqa-api-edit-step-response\">\n <h3 class=\"cqa-api-edit-step-response-title cqa-text-[14px] cqa-font-bold cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-mb-[12px] cqa-shrink-0\">Response Preview</h3>\n <pre class=\"cqa-api-edit-step-response-content\">{{ responsePreview }}</pre>\n </div>\n\n <!-- Step actions: one row, full width. Step 1: Cancel + Next; Step 2: Back + Next; Step 3: Back + Create -->\n <div class=\"cqa-api-edit-step-actions\">\n <ng-container [ngSwitch]=\"currentStep\">\n <ng-container *ngSwitchCase=\"1\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-actions-btn-cancel\" (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" type=\"button\" variant=\"filled\" btnSize=\"lg\" [text]=\"editMode ? 'Update' : 'Create'\"\n customClass=\"cqa-api-edit-step-actions-btn-create\" (clicked)=\"onCreate()\">\n </cqa-button>\n <!-- Match cqa-button flex: actions row styles > cqa-button { flex: 1 1 0 } \u2014 loader div must grow same width as Create -->\n <div *ngIf=\"isCreatingStep\" class=\"cqa-api-edit-step-actions-loader cqa-w-full cqa-min-h-[38px] cqa-rounded-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; width: 100%; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</div>", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.AutocompleteComponent, selector: "cqa-autocomplete", inputs: ["placeholder", "options", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth", "compact"], outputs: ["valueChange", "optionSelect", "cleared"] }, { type: i5.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "enableMarkdown", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i6.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i7.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor"], outputs: ["valueChange"] }, { type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i9.AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: ["advancedVariables", "advancedVariableForm"], outputs: ["variableBooleanChange", "variableValueChange"] }, { type: i10.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: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i11.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i11.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i11.NgSwitchDefault, selector: "[ngSwitchDefault]" }], changeDetection: i0.ChangeDetectionStrategy.Default });
2167
+ ApiEditStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ApiEditStepComponent, selector: "cqa-api-edit-step", inputs: { initialMethod: "initialMethod", initialEnvironment: "initialEnvironment", initialStep: "initialStep", initialUrl: "initialUrl", initialPayloadTab: "initialPayloadTab", initialPayloadType: "initialPayloadType", initialPayloadText: "initialPayloadText", initialHeaders: "initialHeaders", initialResponsePreview: "initialResponsePreview", initialVariableName: "initialVariableName", initialResponseBodyVerifications: "initialResponseBodyVerifications", initialStatusVerifications: "initialStatusVerifications", initialActiveResponseVerificationTab: "initialActiveResponseVerificationTab", editMode: "editMode", isCreatingStep: "isCreatingStep", httpMethodOptions: "httpMethodOptions", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", urlOptions: "urlOptions", authTypeOptions: "authTypeOptions", initialAuthType: "initialAuthType", formatOptions: "formatOptions", initialFormat: "initialFormat", headerNameOptions: "headerNameOptions", verificationOptions: "verificationOptions", verificationDataTypeOptions: "verificationDataTypeOptions", statusVerificationOptions: "statusVerificationOptions", advancedSettingsVariables: "advancedSettingsVariables" }, outputs: { importCurl: "importCurl", importCurlCancel: "importCurlCancel", sendRequest: "sendRequest", back: "back", cancel: "cancel", next: "next", create: "create", headersChange: "headersChange", environmentChange: "environmentChange", environmentSearch: "environmentSearch", environmentLoadMore: "environmentLoadMore" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "payloadEditorWithLinesRef", first: true, predicate: ["payloadEditorWithLinesRef"], descendants: true }, { propertyName: "payloadTextareaRef", first: true, predicate: ["payloadTextareaRef"], descendants: true }, { propertyName: "responsePreviewRef", first: true, predicate: ["responsePreviewRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-api-edit-step-container cqa-bg-[#ffffff] cqa-flex cqa-flex-col cqa-w-full cqa-h-full cqa-p-[16px] cqa-gap-[12px] cqa-overflow-y-auto cqa-overflow-x-hidden cqa-box-border\">\n\n <h2 class=\"cqa-api-edit-step-title cqa-font-inter cqa-text-[12px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#000000] cqa-m-0\">\n {{ editMode ? 'Update API Test Step' : 'Create API Test Step' }}\n </h2>\n\n <div class=\"cqa-api-edit-step-indicator cqa-flex cqa-items-center cqa-gap-0 cqa-max-[767px]:cqa-flex-wrap cqa-max-[767px]:cqa-gap-2 cqa-max-[767px]:cqa-justify-start\"\n [class.cqa-justify-start]=\"stepLabels.length === 1\"\n [class.cqa-justify-between]=\"stepLabels.length !== 1\">\n <ng-container *ngFor=\"let step of stepLabels; let i = index\">\n <cqa-button type=\"button\" variant=\"text\"\n customClass=\"cqa-api-edit-step-indicator-item cqa-api-edit-step-indicator-item--clickable cqa-flex cqa-items-center cqa-gap-[10px] cqa-cursor-pointer cqa-border-none cqa-p-0 cqa-font-inherit cqa-text-inherit cqa-text-left !cqa-bg-transparent\"\n [attr.aria-label]=\"'Step ' + step.index + ': ' + step.label\" [attr.aria-pressed]=\"step.index === currentStep\"\n (clicked)=\"setStep(step.index)\">\n <span class=\"cqa-api-edit-step-indicator-circle cqa-w-8 cqa-h-8 cqa-rounded-full cqa-inline-flex cqa-items-center cqa-justify-center cqa-text-sm cqa-font-medium cqa-leading-none cqa-border-none cqa-shrink-0\"\n [ngClass]=\"step.index === currentStep ? 'cqa-bg-[#4F46E5] cqa-text-white' : 'cqa-bg-[#E0E0E0] cqa-text-[#666666]'\">\n {{ step.index }}\n </span>\n <span class=\"cqa-api-edit-step-indicator-label cqa-text-sm cqa-leading-[18px] cqa-font-normal cqa-max-[767px]:cqa-text-xs\"\n [ngClass]=\"step.index === currentStep ? 'cqa-text-[#4F46E5]' : 'cqa-text-[#666666]'\">\n {{ step.label }}\n </span>\n <div *ngIf=\"i < stepLabels.length - 1\" class=\"cqa-api-edit-step-indicator-line cqa-w-[96px] cqa-h-[2px] cqa-bg-[#E0E0E0] cqa-my-0 cqa-mx-[6px] cqa-shrink-0 cqa-self-center cqa-max-[767px]:cqa-w-[24px] cqa-max-[767px]:cqa-mx-1\" aria-hidden=\"true\"></div>\n </cqa-button>\n </ng-container>\n </div>\n\n <!-- Step content viewport: only the active step body is shown (*ngIf) -->\n <div class=\"cqa-api-edit-step-viewport cqa-w-full\">\n <!-- Step 1: Environment, request, body, response -->\n <div *ngIf=\"currentStep === 1\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <!-- Environment row: label on top, select below (aligned right on desktop) -->\n <div class=\"cqa-api-edit-step-environment-row cqa-flex cqa-flex-col cqa-gap-1.5 cqa-items-end cqa-max-[767px]:cqa-items-stretch\">\n <span class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-max-[767px]:cqa-items-stretch\">\n <label class=\"cqa-api-edit-step-environment-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal\">Environments</label>\n <cqa-dynamic-select *ngIf=\"environmentForm\"\n [form]=\"environmentForm\"\n [config]=\"environmentSelectConfig\"\n class=\"cqa-api-edit-step-environment-select cqa-shrink-0 cqa-w-auto cqa-min-w-[315px] cqa-max-w-[315px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full [&_.mat-form-field-wrapper]:cqa-pb-0\"\n aria-label=\"Environment\"\n (selectionChange)=\"onEnvironmentSelectionChange($event)\">\n </cqa-dynamic-select>\n </span>\n </div>\n\n <!-- Request row: method, URL, buttons -->\n <div class=\"cqa-api-edit-step-request-row cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-max-[767px]:cqa-flex-col cqa-max-[767px]:cqa-items-stretch cqa-max-[767px]:cqa-gap-2.5\">\n <cqa-dynamic-select *ngIf=\"methodForm\" [form]=\"methodForm\" [config]=\"methodSelectConfig\"\n class=\"cqa-api-edit-step-method-select cqa-shrink-0 cqa-w-auto cqa-min-w-[152px] cqa-max-w-[152px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full\" aria-label=\"HTTP method\"\n (selectionChange)=\"onMethodSelectionChange($event)\">\n </cqa-dynamic-select>\n <div class=\"cqa-api-edit-step-url-wrap cqa-flex-1 cqa-min-w-[200px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-w-full\">\n <cqa-autocomplete\n [value]=\"url\"\n (valueChange)=\"url = $event\"\n [options]=\"urlOptions\"\n [placeholder]=\"urlPlaceholder\"\n ariaLabel=\"Enter URL or select Parameter\"\n [fullWidth]=\"true\"\n (optionSelect)=\"onUrlOptionSelect($event)\">\n </cqa-autocomplete>\n <div *ngIf=\"urlError\" class=\"cqa-text-red-600 cqa-text-sm cqa-mt-1\">\n {{ urlError }}\n </div>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-trigger cqa-contents cqa-max-[767px]:cqa-w-full cqa-max-[767px]:!cqa-flex\" (click)=\"openImportCurlPanel()\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Import API cURL\"\n customClass=\"cqa-api-edit-step-btn-outline !cqa-bg-white !cqa-border !cqa-border-solid !cqa-border-[#6B7280] cqa-text-[#414146] cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal hover:!cqa-bg-[#F9FAFB] hover:!cqa-text-[#414146] cqa-max-[767px]:cqa-w-full\">\n </cqa-button>\n </div>\n <cqa-button variant=\"filled\" btnSize=\"lg\" text=\"Send Request\" (clicked)=\"onSendRequest()\"\n [disabled]=\"!isUrlValid\"\n customClass=\"cqa-api-edit-step-btn-primary cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal !cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] !cqa-border-none cqa-py-2.5 cqa-px-6 cqa-gap-2 cqa-rounded-lg cqa-min-h-[37px] cqa-box-border hover:!cqa-bg-[#1B1FEB] cqa-max-[767px]:cqa-w-full\"\n [ngClass]=\"{'!cqa-opacity-50 !cqa-cursor-not-allowed': !isUrlValid}\">\n </cqa-button>\n </div>\n\n\n\n <!-- Body content: header section (default) OR import cURL section -->\n <ng-container *ngIf=\"bodyView === 'import-curl'\">\n <div class=\"cqa-api-edit-step-import-curl-panel cqa-flex cqa-flex-col cqa-bg-white cqa-rounded-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-shadow-[0_1px_3px_rgba(0,0,0,0.08)] cqa-overflow-hidden\">\n <div class=\"cqa-api-edit-step-import-curl-header cqa-flex cqa-items-center cqa-justify-between cqa-py-3 cqa-px-5 cqa-border-b cqa-border-solid cqa-border-[#E2E8F0] cqa-bg-[#F9FAFB] cqa-rounded-t-lg cqa-max-[767px]:cqa-px-4\">\n <h3 class=\"cqa-api-edit-step-import-curl-title cqa-m-0 cqa-text-xs cqa-font-bold cqa-leading-[18px] cqa-text-[#374151]\">Import API cURL</h3>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-separator cqa-h-px cqa-bg-[#E2E8F0] cqa-my-0 cqa-mx-5\"></div>\n <div class=\"cqa-api-edit-step-import-curl-body\">\n <cqa-custom-textarea [value]=\"importCurlControl.value\"\n (valueChange)=\"importCurlControl.setValue($event)\"\n placeholder=\"Paste your cURL command here (e.g., curl -X POST https://api.example.com/users)\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-import-curl-textarea\">\n </cqa-custom-textarea>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-footer\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-import-curl-btn-cancel\" (clicked)=\"onCancelImportCurl()\"></cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Import\"\n customClass=\"cqa-api-edit-step-import-curl-btn-import\" (clicked)=\"onImportCurlConfirm()\"></cqa-button>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"bodyView === 'headers'\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of payloadTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activePayloadTab === tab.value ? ' cqa-api-edit-step-tab--active' : '') + (isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params') ? ' cqa-api-edit-step-tab--disabled' : '')\"\n [disabled]=\"isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params')\"\n (clicked)=\"setPayloadTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Payload content (Authorization) -->\n <div *ngIf=\"activePayloadTab === 'authorization'\" class=\"cqa-api-edit-step-payload\"\n [attr.style]=\"'padding: 20px; min-height: 200px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 20px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 8px; width: fit-content;'\">\n <span [attr.style]=\"'font-size: 11px; font-weight: 600; letter-spacing: 0.02em; color: #6B7280; text-transform: uppercase; line-height: 1.25;'\">AUTH TYPE</span>\n <cqa-dynamic-select *ngIf=\"authTypeForm\" [form]=\"authTypeForm\" [config]=\"authTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-type-select\" aria-label=\"Auth type\"\n [attr.style]=\"'min-width: 160px;'\">\n </cqa-dynamic-select>\n </div>\n <!-- No Auth: centered message -->\n <div *ngIf=\"selectedAuthType === 'no-auth'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-width: 0; text-align: center; border: 1px solid #E5E7EB; border-radius: 8px; padding-top: 16px; padding-bottom: 16px;'\">\n <div aria-hidden=\"true\"\n [attr.style]=\"'width: 48px; height: 48px; border-radius: 10px; background: #F3F4F6; display: flex; align-items: center; justify-content: center; flex-shrink: 0;'\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <rect x=\"5\" y=\"11\" width=\"14\" height=\"2\" rx=\"1\" fill=\"#9CA3AF\"/>\n </svg>\n </div>\n <span [attr.style]=\"'font-size: 16px; font-weight: 600; color: #374151; line-height: 1.25;'\">No Auth</span>\n <div [attr.style]=\"'display: flex; align-items: center; justify-content: center; gap: 6px; flex-wrap: wrap;'\">\n <span [attr.style]=\"'font-size: 14px; font-weight: 400; color: #9CA3AF; line-height: 1.4;'\">This request does not use any authorization.</span>\n <span role=\"img\" aria-label=\"More information\" title=\"This request does not use any authorization.\"\n [attr.style]=\"'display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; color: #9CA3AF; flex-shrink: 0;'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M8 7v4M8 5v.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </div>\n </div>\n <!-- Bearer Token: Token label + textarea -->\n <div *ngIf=\"selectedAuthType === 'bearer'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; gap: 10px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Token</span>\n <cqa-custom-textarea [(value)]=\"bearerToken\"\n placeholder=\"Enter bearer token\"\n [fullWidth]=\"true\" [rows]=\"6\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-auth-token-textarea\" ariaLabel=\"Bearer token\">\n </cqa-custom-textarea>\n </div>\n <!-- OAuth 2.0: Grant Type, Access Token URL, Client ID, Client Secret, Scope, Client Authentication -->\n <div *ngIf=\"selectedAuthType === 'oauth2' && oauth2Form\"\n class=\"cqa-api-edit-step-oauth2-grid\"\n [attr.style]=\"'display: grid; grid-template-columns: 1fr 1fr; gap: 16px 24px; width: 100%;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Grant Type</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2GrantTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"OAuth grant type\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth grant type</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Access Token URL</span>\n <cqa-custom-input [value]=\"oauth2Form.get('accessTokenUrl')?.value\"\n (valueChange)=\"oauth2Form.get('accessTokenUrl')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth token endpoint\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Access Token URL\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth token endpoint</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client ID</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientId')?.value\"\n (valueChange)=\"oauth2Form.get('clientId')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth client identifier\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client ID\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client identifier</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Secret</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientSecret')?.value\"\n (valueChange)=\"oauth2Form.get('clientSecret')?.setValue($event)\"\n type=\"password\" [label]=\"''\" placeholder=\"Enter OAuth client secret\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client Secret\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client secret</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Scope</span>\n <cqa-custom-input [value]=\"oauth2Form.get('scope')?.value\"\n (valueChange)=\"oauth2Form.get('scope')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter space-separated scopes\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Scope\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Space-separated scopes</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Authentication</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2ClientAuthSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"Client authentication method\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Client authentication method</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Payload content (Headers) -->\n <div *ngIf=\"activePayloadTab === 'headers'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-headers-grid\">\n <span class=\"cqa-api-edit-step-headers-label\">Header Name</span>\n <span class=\"cqa-api-edit-step-headers-label\">Header Value</span>\n <span class=\"cqa-api-edit-step-headers-label cqa-api-edit-step-headers-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of headerRows; let i = index; trackBy: trackByHeader\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-header-row\">\n <cqa-dynamic-select [form]=\"row\" [config]=\"headerNameSelectConfig\"\n (addCustomValue)=\"onHeaderNameAddCustomValue($event, row)\"\n class=\"cqa-api-edit-step-header-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-header-value-input\" ariaLabel=\"Header value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-header-delete'\"\n [tooltip]=\"'Remove header'\" (clicked)=\"removeHeader(i)\">\n <svg class=\"cqa-api-edit-step-header-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-add-header-wrap\">\n <cqa-button type=\"button\" variant=\"text\" text=\"+ Add Header\"\n [customClass]=\"'cqa-api-edit-step-add-header-link'\" (clicked)=\"addHeader()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Params): Key\u2013Value table with add/delete rows -->\n <div *ngIf=\"activePayloadTab === 'params'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of paramsRows; let i = index; trackBy: trackByParams\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeParamsRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addParamsRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Body only): type, format, text area, Back/Next -->\n <div *ngIf=\"activePayloadTab === 'body'\"\n class=\"cqa-api-edit-step-payload cqa-api-edit-step-payload-editor\">\n <div class=\"cqa-api-edit-step-payload-type-row\">\n <span class=\"cqa-api-edit-step-payload-type-label\">Type</span>\n <div class=\"cqa-api-edit-step-payload-type-radios\">\n <cqa-segment-control [value]=\"payloadType\" [segments]=\"payloadTypeSegments\"\n (valueChange)=\"onPayloadTypeChange($event)\"\n class=\"cqa-api-edit-step-payload-type-segment\">\n </cqa-segment-control>\n </div>\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-format-wrap\">\n <span class=\"cqa-api-edit-step-payload-format-label\">Format:</span>\n <cqa-dynamic-select *ngIf=\"payloadFormatForm\" [form]=\"payloadFormatForm\"\n [config]=\"payloadFormatSelectConfig\" class=\"cqa-api-edit-step-payload-format-select\"\n aria-label=\"Format\">\n </cqa-dynamic-select>\n </div>\n </div>\n <!-- Raw: text area with line numbers (Postman-style payload body) -->\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-body\" #payloadEditorWithLinesRef>\n <div class=\"cqa-api-edit-step-payload-editor-with-lines\">\n <div class=\"cqa-api-edit-step-payload-line-numbers\" aria-hidden=\"true\">\n <span *ngFor=\"let n of payloadLineNumbers\" class=\"cqa-api-edit-step-payload-line-num\">\n <span *ngIf=\"payloadJsonError && payloadJsonError.line === n\"\n class=\"cqa-api-edit-step-payload-line-error-icon\" [title]=\"payloadJsonErrorTooltip\"\n aria-label=\"Parse error on this line\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#EF4444\"/>\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-api-edit-step-payload-line-num-text\">{{ n }}</span>\n </span>\n </div>\n <div class=\"cqa-api-edit-step-payload-textarea-cell\">\n <div class=\"cqa-api-edit-step-payload-textarea cqa-w-full cqa-flex cqa-flex-col cqa-min-h-0\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea--error': payloadJsonError}\">\n <textarea #payloadTextareaRef\n class=\"cqa-api-edit-step-payload-textarea-input cqa-w-full cqa-outline-none cqa-box-border\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea-input--error': payloadJsonError}\"\n [value]=\"payloadText\"\n placeholder=\"\"\n [attr.aria-label]=\"'Payload'\"\n [attr.aria-invalid]=\"!!payloadJsonError\"\n (input)=\"onPayloadInput($event)\"\n (keydown)=\"onPayloadKeydown($event)\">\n </textarea>\n </div>\n </div>\n </div>\n <p *ngIf=\"payloadJsonError\" class=\"cqa-api-edit-step-payload-json-error-msg\">\n Invalid JSON format. Please check your syntax.\n </p>\n </div>\n\n <!-- x-www-form-urlencoded: Key\u2013Value rows, add/remove dynamically -->\n <div *ngIf=\"payloadType === 'x-www-form-urlencoded'\" class=\"cqa-api-edit-step-key-value\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyValueRows; let i = index; trackBy: trackByKeyValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addKeyValueRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Data: Key\u2013Type\u2013Value rows; Type is a dropdown (Text/File), add/remove dynamically -->\n <div *ngIf=\"payloadType === 'form-data'\" class=\"cqa-api-edit-step-key-type-value\">\n <div class=\"cqa-api-edit-step-key-type-value-header\">\n <span class=\"cqa-api-edit-step-key-type-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Type</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-type-value-label cqa-api-edit-step-key-type-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyTypeValueRows; let i = index; trackBy: trackByKeyTypeValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-type-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"keyTypeValueTypeSelectConfig\"\n class=\"cqa-api-edit-step-key-type-value-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-type-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyTypeValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-type-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-type-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-type-value-add-btn\" (clicked)=\"addKeyTypeValueRow()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Advanced settings (step-level) -->\n <div class=\"cqa-mt-4\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-py-2 cqa-border-b cqa-border-gray-200\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-lg cqa-transition-transform\" [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\n </div>\n <!-- Step 2: Variable Name: input, validation, Back / Next -->\n <div *ngIf=\"currentStep === 2\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-variable-section\">\n <div class=\"cqa-api-edit-step-variable-input-wrap\">\n <cqa-custom-input [(value)]=\"variableName\" [label]=\"''\" placeholder=\"Variable Name\" [fullWidth]=\"true\"\n size=\"md\" (valueChange)=\"onVariableNameChange()\" aria-label=\"Variable Name\">\n </cqa-custom-input>\n </div>\n <p *ngIf=\"variableNameError\" class=\"cqa-api-edit-step-variable-error\" role=\"alert\">{{ variableNameError }}</p>\n </div>\n </div>\n <!-- Step 3: Response Body / Status tabs -->\n <div *ngIf=\"currentStep === 3\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of responseVerificationTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activeResponseVerificationTab === tab.value ? ' cqa-api-edit-step-tab--active' : '')\"\n (clicked)=\"setResponseVerificationTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Response Body tab content: verification grid -->\n <div *ngIf=\"activeResponseVerificationTab === 'response-body'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-verification\">\n <div class=\"cqa-api-edit-step-verification-grid cqa-api-edit-step-verification-grid-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">JSON Path</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Data Type</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of verificationRows; let i = index; trackBy: trackByVerification\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-custom-input [value]=\"row.get('jsonPath')?.value ?? ''\"\n (valueChange)=\"row.get('jsonPath')?.setValue($event)\" placeholder=\"Json Path\" [fullWidth]=\"true\"\n size=\"sm\" class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"JSON Path\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationDataTypeSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\"\n (selectionChange)=\"onVerificationDataTypeChange(row, $event)\">\n </cqa-dynamic-select>\n <!-- Expected Value: text for String/Array/Object, number for Number, dropdown for Boolean -->\n <ng-container [ngSwitch]=\"row.get('dataType')?.value\">\n <cqa-dynamic-select *ngSwitchCase=\"'boolean'\" [form]=\"row\"\n [config]=\"verificationExpectedValueBooleanSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-api-edit-step-verification-expected-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input *ngSwitchCase=\"'number'\" [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value (number)\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input cqa-api-edit-step-verification-expected-number\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-custom-input *ngSwitchDefault [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\"\n placeholder=\"Expected Value in String\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n </ng-container>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Status tab content: S.no, Verification dropdown, Expected Value, add/remove rows -->\n <div *ngIf=\"activeResponseVerificationTab === 'status'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addStatusVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-status-verification\">\n <div class=\"cqa-api-edit-step-status-verification-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of statusVerificationRows; let i = index; trackBy: trackByStatusVerification\"\n [formGroup]=\"row\" class=\"cqa-api-edit-step-status-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-dynamic-select [form]=\"row\" [config]=\"statusVerificationSelectConfig\"\n class=\"cqa-api-edit-step-status-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\" class=\"cqa-api-edit-step-verification-input\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeStatusVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Response Preview -->\n <div #responsePreviewRef class=\"cqa-api-edit-step-response\">\n <h3 class=\"cqa-api-edit-step-response-title cqa-text-[14px] cqa-font-bold cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-mb-[12px] cqa-shrink-0\">Response Preview</h3>\n <pre class=\"cqa-api-edit-step-response-content\">{{ responsePreview }}</pre>\n </div>\n\n <!-- Step actions: one row, full width. Step 1: Cancel + Next; Step 2: Back + Next; Step 3: Back + Create -->\n <div class=\"cqa-api-edit-step-actions\">\n <ng-container [ngSwitch]=\"currentStep\">\n <ng-container *ngSwitchCase=\"1\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-actions-btn-cancel\" (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" type=\"button\" variant=\"filled\" btnSize=\"lg\" [text]=\"editMode ? 'Update' : 'Create'\"\n customClass=\"cqa-api-edit-step-actions-btn-create\" (clicked)=\"onCreate()\">\n </cqa-button>\n <!-- Match cqa-button flex: actions row styles > cqa-button { flex: 1 1 0 } \u2014 loader div must grow same width as Create -->\n <div *ngIf=\"isCreatingStep\" class=\"cqa-api-edit-step-actions-loader cqa-w-full cqa-min-h-[38px] cqa-rounded-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; width: 100%; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</div>", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.AutocompleteComponent, selector: "cqa-autocomplete", inputs: ["placeholder", "options", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth", "compact"], outputs: ["valueChange", "optionSelect", "cleared"] }, { type: i5.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "enableMarkdown", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i6.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i7.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor"], outputs: ["valueChange"] }, { type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i9.AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: ["advancedVariables", "advancedVariableForm"], outputs: ["variableBooleanChange", "variableValueChange"] }, { type: i10.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: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i11.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i11.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i11.NgSwitchDefault, selector: "[ngSwitchDefault]" }], changeDetection: i0.ChangeDetectionStrategy.Default });
2168
2168
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiEditStepComponent, decorators: [{
2169
2169
  type: Component,
2170
- args: [{ selector: 'cqa-api-edit-step', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.Default, template: "<div class=\"cqa-api-edit-step-container cqa-bg-[#ffffff] cqa-flex cqa-flex-col cqa-w-full cqa-h-full cqa-p-[16px] cqa-gap-[12px] cqa-overflow-y-auto cqa-overflow-x-hidden cqa-box-border\">\n\n <h2 class=\"cqa-api-edit-step-title cqa-font-inter cqa-text-[12px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#000000] cqa-m-0\">\n {{ editMode ? 'Update API Test Step' : 'Create API Test Step' }}\n </h2>\n\n <div class=\"cqa-api-edit-step-indicator cqa-flex cqa-items-center cqa-gap-0 cqa-max-[767px]:cqa-flex-wrap cqa-max-[767px]:cqa-gap-2 cqa-max-[767px]:cqa-justify-start\"\n [class.cqa-justify-start]=\"stepLabels.length === 1\"\n [class.cqa-justify-between]=\"stepLabels.length !== 1\">\n <ng-container *ngFor=\"let step of stepLabels; let i = index\">\n <cqa-button type=\"button\" variant=\"text\"\n customClass=\"cqa-api-edit-step-indicator-item cqa-api-edit-step-indicator-item--clickable cqa-flex cqa-items-center cqa-gap-[10px] cqa-cursor-pointer cqa-border-none cqa-p-0 cqa-font-inherit cqa-text-inherit cqa-text-left !cqa-bg-transparent\"\n [attr.aria-label]=\"'Step ' + step.index + ': ' + step.label\" [attr.aria-pressed]=\"step.index === currentStep\"\n (clicked)=\"setStep(step.index)\">\n <span class=\"cqa-api-edit-step-indicator-circle cqa-w-8 cqa-h-8 cqa-rounded-full cqa-inline-flex cqa-items-center cqa-justify-center cqa-text-sm cqa-font-medium cqa-leading-none cqa-border-none cqa-shrink-0\"\n [ngClass]=\"step.index === currentStep ? 'cqa-bg-[#4F46E5] cqa-text-white' : 'cqa-bg-[#E0E0E0] cqa-text-[#666666]'\">\n {{ step.index }}\n </span>\n <span class=\"cqa-api-edit-step-indicator-label cqa-text-sm cqa-leading-[18px] cqa-font-normal cqa-max-[767px]:cqa-text-xs\"\n [ngClass]=\"step.index === currentStep ? 'cqa-text-[#4F46E5]' : 'cqa-text-[#666666]'\">\n {{ step.label }}\n </span>\n <div *ngIf=\"i < stepLabels.length - 1\" class=\"cqa-api-edit-step-indicator-line cqa-w-[96px] cqa-h-[2px] cqa-bg-[#E0E0E0] cqa-my-0 cqa-mx-[6px] cqa-shrink-0 cqa-self-center cqa-max-[767px]:cqa-w-[24px] cqa-max-[767px]:cqa-mx-1\" aria-hidden=\"true\"></div>\n </cqa-button>\n </ng-container>\n </div>\n\n <!-- Step content viewport: only the active step body is shown (*ngIf) -->\n <div class=\"cqa-api-edit-step-viewport cqa-w-full\">\n <!-- Step 1: Environment, request, body, response -->\n <div *ngIf=\"currentStep === 1\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <!-- Environment row: label on top, select below (aligned right on desktop) -->\n <div class=\"cqa-api-edit-step-environment-row cqa-flex cqa-flex-col cqa-gap-1.5 cqa-items-end cqa-max-[767px]:cqa-items-stretch\">\n <span class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-max-[767px]:cqa-items-stretch\">\n <label class=\"cqa-api-edit-step-environment-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal\">Environments</label>\n <cqa-dynamic-select *ngIf=\"environmentForm\"\n [form]=\"environmentForm\"\n [config]=\"environmentSelectConfig\"\n class=\"cqa-api-edit-step-environment-select cqa-shrink-0 cqa-w-auto cqa-min-w-[315px] cqa-max-w-[315px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full [&_.mat-form-field-wrapper]:cqa-pb-0\"\n aria-label=\"Environment\"\n (selectionChange)=\"onEnvironmentSelectionChange($event)\">\n </cqa-dynamic-select>\n </span>\n </div>\n\n <!-- Request row: method, URL, buttons -->\n <div class=\"cqa-api-edit-step-request-row cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-max-[767px]:cqa-flex-col cqa-max-[767px]:cqa-items-stretch cqa-max-[767px]:cqa-gap-2.5\">\n <cqa-dynamic-select *ngIf=\"methodForm\" [form]=\"methodForm\" [config]=\"methodSelectConfig\"\n class=\"cqa-api-edit-step-method-select cqa-shrink-0 cqa-w-auto cqa-min-w-[152px] cqa-max-w-[152px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full\" aria-label=\"HTTP method\"\n (selectionChange)=\"onMethodSelectionChange($event)\">\n </cqa-dynamic-select>\n <div class=\"cqa-api-edit-step-url-wrap cqa-flex-1 cqa-min-w-[200px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-w-full\">\n <cqa-autocomplete\n [value]=\"url\"\n (valueChange)=\"url = $event\"\n [options]=\"urlOptions\"\n [placeholder]=\"urlPlaceholder\"\n ariaLabel=\"Enter URL or select Parameter\"\n [fullWidth]=\"true\"\n (optionSelect)=\"onUrlOptionSelect($event)\">\n </cqa-autocomplete>\n <div *ngIf=\"urlError\" class=\"cqa-text-red-600 cqa-text-sm cqa-mt-1\">\n {{ urlError }}\n </div>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-trigger cqa-contents cqa-max-[767px]:cqa-w-full cqa-max-[767px]:!cqa-flex\" (click)=\"openImportCurlPanel()\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Import API cURL\"\n customClass=\"cqa-api-edit-step-btn-outline !cqa-bg-white !cqa-border !cqa-border-solid !cqa-border-[#6B7280] cqa-text-[#414146] cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal hover:!cqa-bg-[#F9FAFB] hover:!cqa-text-[#414146] cqa-max-[767px]:cqa-w-full\">\n </cqa-button>\n </div>\n <cqa-button variant=\"filled\" btnSize=\"lg\" text=\"Send Request\" (clicked)=\"onSendRequest()\"\n [disabled]=\"!isUrlValid\"\n customClass=\"cqa-api-edit-step-btn-primary cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal !cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] !cqa-border-none cqa-py-2.5 cqa-px-6 cqa-gap-2 cqa-rounded-lg cqa-min-h-[37px] cqa-box-border hover:!cqa-bg-[#1B1FEB] cqa-max-[767px]:cqa-w-full\"\n [ngClass]=\"{'!cqa-opacity-50 !cqa-cursor-not-allowed': !isUrlValid}\">\n </cqa-button>\n </div>\n\n\n\n <!-- Body content: header section (default) OR import cURL section -->\n <ng-container *ngIf=\"bodyView === 'import-curl'\">\n <div class=\"cqa-api-edit-step-import-curl-panel cqa-flex cqa-flex-col cqa-bg-white cqa-rounded-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-shadow-[0_1px_3px_rgba(0,0,0,0.08)] cqa-overflow-hidden\">\n <div class=\"cqa-api-edit-step-import-curl-header cqa-flex cqa-items-center cqa-justify-between cqa-py-3 cqa-px-5 cqa-border-b cqa-border-solid cqa-border-[#E2E8F0] cqa-bg-[#F9FAFB] cqa-rounded-t-lg cqa-max-[767px]:cqa-px-4\">\n <h3 class=\"cqa-api-edit-step-import-curl-title cqa-m-0 cqa-text-xs cqa-font-bold cqa-leading-[18px] cqa-text-[#374151]\">Import API cURL</h3>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-separator cqa-h-px cqa-bg-[#E2E8F0] cqa-my-0 cqa-mx-5\"></div>\n <div class=\"cqa-api-edit-step-import-curl-body\">\n <cqa-custom-textarea [value]=\"importCurlControl.value\"\n (valueChange)=\"importCurlControl.setValue($event)\"\n placeholder=\"Paste your cURL command here (e.g., curl -X POST https://api.example.com/users)\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-import-curl-textarea\">\n </cqa-custom-textarea>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-footer\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-import-curl-btn-cancel\" (clicked)=\"onCancelImportCurl()\"></cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Import\"\n customClass=\"cqa-api-edit-step-import-curl-btn-import\" (clicked)=\"onImportCurlConfirm()\"></cqa-button>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"bodyView === 'headers'\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of payloadTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activePayloadTab === tab.value ? ' cqa-api-edit-step-tab--active' : '') + (isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params') ? ' cqa-api-edit-step-tab--disabled' : '')\"\n [disabled]=\"isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params')\"\n (clicked)=\"setPayloadTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Payload content (Authorization) -->\n <div *ngIf=\"activePayloadTab === 'authorization'\" class=\"cqa-api-edit-step-payload\"\n [attr.style]=\"'padding: 20px; min-height: 200px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 20px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 8px; width: fit-content;'\">\n <span [attr.style]=\"'font-size: 11px; font-weight: 600; letter-spacing: 0.02em; color: #6B7280; text-transform: uppercase; line-height: 1.25;'\">AUTH TYPE</span>\n <cqa-dynamic-select *ngIf=\"authTypeForm\" [form]=\"authTypeForm\" [config]=\"authTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-type-select\" aria-label=\"Auth type\"\n [attr.style]=\"'min-width: 160px;'\">\n </cqa-dynamic-select>\n </div>\n <!-- No Auth: centered message -->\n <div *ngIf=\"selectedAuthType === 'no-auth'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-width: 0; text-align: center;'\">\n <div aria-hidden=\"true\"\n [attr.style]=\"'width: 48px; height: 48px; border-radius: 10px; background: #F3F4F6; display: flex; align-items: center; justify-content: center; flex-shrink: 0;'\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <rect x=\"5\" y=\"11\" width=\"14\" height=\"2\" rx=\"1\" fill=\"#9CA3AF\"/>\n </svg>\n </div>\n <span [attr.style]=\"'font-size: 16px; font-weight: 600; color: #374151; line-height: 1.25;'\">No Auth</span>\n <div [attr.style]=\"'display: flex; align-items: center; justify-content: center; gap: 6px; flex-wrap: wrap;'\">\n <span [attr.style]=\"'font-size: 14px; font-weight: 400; color: #9CA3AF; line-height: 1.4;'\">This request does not use any authorization.</span>\n <span role=\"img\" aria-label=\"More information\" title=\"This request does not use any authorization.\"\n [attr.style]=\"'display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; color: #9CA3AF; flex-shrink: 0;'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M8 7v4M8 5v.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </div>\n </div>\n <!-- Bearer Token: Token label + textarea -->\n <div *ngIf=\"selectedAuthType === 'bearer'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; gap: 10px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Token</span>\n <cqa-custom-textarea [(value)]=\"bearerToken\"\n placeholder=\"Enter bearer token\"\n [fullWidth]=\"true\" [rows]=\"6\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-auth-token-textarea\" ariaLabel=\"Bearer token\">\n </cqa-custom-textarea>\n </div>\n <!-- OAuth 2.0: Grant Type, Access Token URL, Client ID, Client Secret, Scope, Client Authentication -->\n <div *ngIf=\"selectedAuthType === 'oauth2' && oauth2Form\"\n class=\"cqa-api-edit-step-oauth2-grid\"\n [attr.style]=\"'display: grid; grid-template-columns: 1fr 1fr; gap: 16px 24px; width: 100%;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Grant Type</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2GrantTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"OAuth grant type\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth grant type</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Access Token URL</span>\n <cqa-custom-input [value]=\"oauth2Form.get('accessTokenUrl')?.value\"\n (valueChange)=\"oauth2Form.get('accessTokenUrl')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth token endpoint\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Access Token URL\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth token endpoint</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client ID</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientId')?.value\"\n (valueChange)=\"oauth2Form.get('clientId')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth client identifier\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client ID\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client identifier</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Secret</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientSecret')?.value\"\n (valueChange)=\"oauth2Form.get('clientSecret')?.setValue($event)\"\n type=\"password\" [label]=\"''\" placeholder=\"Enter OAuth client secret\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client Secret\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client secret</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Scope</span>\n <cqa-custom-input [value]=\"oauth2Form.get('scope')?.value\"\n (valueChange)=\"oauth2Form.get('scope')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter space-separated scopes\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Scope\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Space-separated scopes</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Authentication</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2ClientAuthSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"Client authentication method\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Client authentication method</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Payload content (Headers) -->\n <div *ngIf=\"activePayloadTab === 'headers'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-headers-grid\">\n <span class=\"cqa-api-edit-step-headers-label\">Header Name</span>\n <span class=\"cqa-api-edit-step-headers-label\">Header Value</span>\n <span class=\"cqa-api-edit-step-headers-label cqa-api-edit-step-headers-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of headerRows; let i = index; trackBy: trackByHeader\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-header-row\">\n <cqa-dynamic-select [form]=\"row\" [config]=\"headerNameSelectConfig\"\n (addCustomValue)=\"onHeaderNameAddCustomValue($event, row)\"\n class=\"cqa-api-edit-step-header-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-header-value-input\" ariaLabel=\"Header value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-header-delete'\"\n [tooltip]=\"'Remove header'\" (clicked)=\"removeHeader(i)\">\n <svg class=\"cqa-api-edit-step-header-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-add-header-wrap\">\n <cqa-button type=\"button\" variant=\"text\" text=\"+ Add Header\"\n [customClass]=\"'cqa-api-edit-step-add-header-link'\" (clicked)=\"addHeader()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Params): Key\u2013Value table with add/delete rows -->\n <div *ngIf=\"activePayloadTab === 'params'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of paramsRows; let i = index; trackBy: trackByParams\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeParamsRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addParamsRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Body only): type, format, text area, Back/Next -->\n <div *ngIf=\"activePayloadTab === 'body'\"\n class=\"cqa-api-edit-step-payload cqa-api-edit-step-payload-editor\">\n <div class=\"cqa-api-edit-step-payload-type-row\">\n <span class=\"cqa-api-edit-step-payload-type-label\">Type</span>\n <div class=\"cqa-api-edit-step-payload-type-radios\">\n <cqa-segment-control [value]=\"payloadType\" [segments]=\"payloadTypeSegments\"\n (valueChange)=\"onPayloadTypeChange($event)\"\n class=\"cqa-api-edit-step-payload-type-segment\">\n </cqa-segment-control>\n </div>\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-format-wrap\">\n <span class=\"cqa-api-edit-step-payload-format-label\">Format:</span>\n <cqa-dynamic-select *ngIf=\"payloadFormatForm\" [form]=\"payloadFormatForm\"\n [config]=\"payloadFormatSelectConfig\" class=\"cqa-api-edit-step-payload-format-select\"\n aria-label=\"Format\">\n </cqa-dynamic-select>\n </div>\n </div>\n <!-- Raw: text area with line numbers (Postman-style payload body) -->\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-body\" #payloadEditorWithLinesRef>\n <div class=\"cqa-api-edit-step-payload-editor-with-lines\">\n <div class=\"cqa-api-edit-step-payload-line-numbers\" aria-hidden=\"true\">\n <span *ngFor=\"let n of payloadLineNumbers\" class=\"cqa-api-edit-step-payload-line-num\">\n <span *ngIf=\"payloadJsonError && payloadJsonError.line === n\"\n class=\"cqa-api-edit-step-payload-line-error-icon\" [title]=\"payloadJsonErrorTooltip\"\n aria-label=\"Parse error on this line\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#EF4444\"/>\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-api-edit-step-payload-line-num-text\">{{ n }}</span>\n </span>\n </div>\n <div class=\"cqa-api-edit-step-payload-textarea-cell\">\n <div class=\"cqa-api-edit-step-payload-textarea cqa-w-full cqa-flex cqa-flex-col cqa-min-h-0\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea--error': payloadJsonError}\">\n <textarea #payloadTextareaRef\n class=\"cqa-api-edit-step-payload-textarea-input cqa-w-full cqa-outline-none cqa-box-border\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea-input--error': payloadJsonError}\"\n [value]=\"payloadText\"\n placeholder=\"\"\n [attr.aria-label]=\"'Payload'\"\n [attr.aria-invalid]=\"!!payloadJsonError\"\n (input)=\"onPayloadInput($event)\"\n (keydown)=\"onPayloadKeydown($event)\">\n </textarea>\n </div>\n </div>\n </div>\n <p *ngIf=\"payloadJsonError\" class=\"cqa-api-edit-step-payload-json-error-msg\">\n Invalid JSON format. Please check your syntax.\n </p>\n </div>\n\n <!-- x-www-form-urlencoded: Key\u2013Value rows, add/remove dynamically -->\n <div *ngIf=\"payloadType === 'x-www-form-urlencoded'\" class=\"cqa-api-edit-step-key-value\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyValueRows; let i = index; trackBy: trackByKeyValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addKeyValueRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Data: Key\u2013Type\u2013Value rows; Type is a dropdown (Text/File), add/remove dynamically -->\n <div *ngIf=\"payloadType === 'form-data'\" class=\"cqa-api-edit-step-key-type-value\">\n <div class=\"cqa-api-edit-step-key-type-value-header\">\n <span class=\"cqa-api-edit-step-key-type-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Type</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-type-value-label cqa-api-edit-step-key-type-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyTypeValueRows; let i = index; trackBy: trackByKeyTypeValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-type-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"keyTypeValueTypeSelectConfig\"\n class=\"cqa-api-edit-step-key-type-value-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-type-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyTypeValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-type-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-type-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-type-value-add-btn\" (clicked)=\"addKeyTypeValueRow()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Advanced settings (step-level) -->\n <div class=\"cqa-mt-4\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-py-2 cqa-border-b cqa-border-gray-200\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-lg cqa-transition-transform\" [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\n </div>\n <!-- Step 2: Variable Name: input, validation, Back / Next -->\n <div *ngIf=\"currentStep === 2\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-variable-section\">\n <div class=\"cqa-api-edit-step-variable-input-wrap\">\n <cqa-custom-input [(value)]=\"variableName\" [label]=\"''\" placeholder=\"Variable Name\" [fullWidth]=\"true\"\n size=\"md\" (valueChange)=\"onVariableNameChange()\" aria-label=\"Variable Name\">\n </cqa-custom-input>\n </div>\n <p *ngIf=\"variableNameError\" class=\"cqa-api-edit-step-variable-error\" role=\"alert\">{{ variableNameError }}</p>\n </div>\n </div>\n <!-- Step 3: Response Body / Status tabs -->\n <div *ngIf=\"currentStep === 3\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of responseVerificationTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activeResponseVerificationTab === tab.value ? ' cqa-api-edit-step-tab--active' : '')\"\n (clicked)=\"setResponseVerificationTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Response Body tab content: verification grid -->\n <div *ngIf=\"activeResponseVerificationTab === 'response-body'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-verification\">\n <div class=\"cqa-api-edit-step-verification-grid cqa-api-edit-step-verification-grid-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">JSON Path</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Data Type</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of verificationRows; let i = index; trackBy: trackByVerification\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-custom-input [value]=\"row.get('jsonPath')?.value ?? ''\"\n (valueChange)=\"row.get('jsonPath')?.setValue($event)\" placeholder=\"Json Path\" [fullWidth]=\"true\"\n size=\"sm\" class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"JSON Path\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationDataTypeSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\"\n (selectionChange)=\"onVerificationDataTypeChange(row, $event)\">\n </cqa-dynamic-select>\n <!-- Expected Value: text for String/Array/Object, number for Number, dropdown for Boolean -->\n <ng-container [ngSwitch]=\"row.get('dataType')?.value\">\n <cqa-dynamic-select *ngSwitchCase=\"'boolean'\" [form]=\"row\"\n [config]=\"verificationExpectedValueBooleanSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-api-edit-step-verification-expected-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input *ngSwitchCase=\"'number'\" [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value (number)\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input cqa-api-edit-step-verification-expected-number\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-custom-input *ngSwitchDefault [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\"\n placeholder=\"Expected Value in String\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n </ng-container>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Status tab content: S.no, Verification dropdown, Expected Value, add/remove rows -->\n <div *ngIf=\"activeResponseVerificationTab === 'status'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addStatusVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-status-verification\">\n <div class=\"cqa-api-edit-step-status-verification-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of statusVerificationRows; let i = index; trackBy: trackByStatusVerification\"\n [formGroup]=\"row\" class=\"cqa-api-edit-step-status-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-dynamic-select [form]=\"row\" [config]=\"statusVerificationSelectConfig\"\n class=\"cqa-api-edit-step-status-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\" class=\"cqa-api-edit-step-verification-input\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeStatusVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Response Preview -->\n <div #responsePreviewRef class=\"cqa-api-edit-step-response\">\n <h3 class=\"cqa-api-edit-step-response-title cqa-text-[14px] cqa-font-bold cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-mb-[12px] cqa-shrink-0\">Response Preview</h3>\n <pre class=\"cqa-api-edit-step-response-content\">{{ responsePreview }}</pre>\n </div>\n\n <!-- Step actions: one row, full width. Step 1: Cancel + Next; Step 2: Back + Next; Step 3: Back + Create -->\n <div class=\"cqa-api-edit-step-actions\">\n <ng-container [ngSwitch]=\"currentStep\">\n <ng-container *ngSwitchCase=\"1\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-actions-btn-cancel\" (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" type=\"button\" variant=\"filled\" btnSize=\"lg\" [text]=\"editMode ? 'Update' : 'Create'\"\n customClass=\"cqa-api-edit-step-actions-btn-create\" (clicked)=\"onCreate()\">\n </cqa-button>\n <!-- Match cqa-button flex: actions row styles > cqa-button { flex: 1 1 0 } \u2014 loader div must grow same width as Create -->\n <div *ngIf=\"isCreatingStep\" class=\"cqa-api-edit-step-actions-loader cqa-w-full cqa-min-h-[38px] cqa-rounded-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; width: 100%; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</div>" }]
2170
+ args: [{ selector: 'cqa-api-edit-step', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.Default, template: "<div class=\"cqa-api-edit-step-container cqa-bg-[#ffffff] cqa-flex cqa-flex-col cqa-w-full cqa-h-full cqa-p-[16px] cqa-gap-[12px] cqa-overflow-y-auto cqa-overflow-x-hidden cqa-box-border\">\n\n <h2 class=\"cqa-api-edit-step-title cqa-font-inter cqa-text-[12px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#000000] cqa-m-0\">\n {{ editMode ? 'Update API Test Step' : 'Create API Test Step' }}\n </h2>\n\n <div class=\"cqa-api-edit-step-indicator cqa-flex cqa-items-center cqa-gap-0 cqa-max-[767px]:cqa-flex-wrap cqa-max-[767px]:cqa-gap-2 cqa-max-[767px]:cqa-justify-start\"\n [class.cqa-justify-start]=\"stepLabels.length === 1\"\n [class.cqa-justify-between]=\"stepLabels.length !== 1\">\n <ng-container *ngFor=\"let step of stepLabels; let i = index\">\n <cqa-button type=\"button\" variant=\"text\"\n customClass=\"cqa-api-edit-step-indicator-item cqa-api-edit-step-indicator-item--clickable cqa-flex cqa-items-center cqa-gap-[10px] cqa-cursor-pointer cqa-border-none cqa-p-0 cqa-font-inherit cqa-text-inherit cqa-text-left !cqa-bg-transparent\"\n [attr.aria-label]=\"'Step ' + step.index + ': ' + step.label\" [attr.aria-pressed]=\"step.index === currentStep\"\n (clicked)=\"setStep(step.index)\">\n <span class=\"cqa-api-edit-step-indicator-circle cqa-w-8 cqa-h-8 cqa-rounded-full cqa-inline-flex cqa-items-center cqa-justify-center cqa-text-sm cqa-font-medium cqa-leading-none cqa-border-none cqa-shrink-0\"\n [ngClass]=\"step.index === currentStep ? 'cqa-bg-[#4F46E5] cqa-text-white' : 'cqa-bg-[#E0E0E0] cqa-text-[#666666]'\">\n {{ step.index }}\n </span>\n <span class=\"cqa-api-edit-step-indicator-label cqa-text-sm cqa-leading-[18px] cqa-font-normal cqa-max-[767px]:cqa-text-xs\"\n [ngClass]=\"step.index === currentStep ? 'cqa-text-[#4F46E5]' : 'cqa-text-[#666666]'\">\n {{ step.label }}\n </span>\n <div *ngIf=\"i < stepLabels.length - 1\" class=\"cqa-api-edit-step-indicator-line cqa-w-[96px] cqa-h-[2px] cqa-bg-[#E0E0E0] cqa-my-0 cqa-mx-[6px] cqa-shrink-0 cqa-self-center cqa-max-[767px]:cqa-w-[24px] cqa-max-[767px]:cqa-mx-1\" aria-hidden=\"true\"></div>\n </cqa-button>\n </ng-container>\n </div>\n\n <!-- Step content viewport: only the active step body is shown (*ngIf) -->\n <div class=\"cqa-api-edit-step-viewport cqa-w-full\">\n <!-- Step 1: Environment, request, body, response -->\n <div *ngIf=\"currentStep === 1\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <!-- Environment row: label on top, select below (aligned right on desktop) -->\n <div class=\"cqa-api-edit-step-environment-row cqa-flex cqa-flex-col cqa-gap-1.5 cqa-items-end cqa-max-[767px]:cqa-items-stretch\">\n <span class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-max-[767px]:cqa-items-stretch\">\n <label class=\"cqa-api-edit-step-environment-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal\">Environments</label>\n <cqa-dynamic-select *ngIf=\"environmentForm\"\n [form]=\"environmentForm\"\n [config]=\"environmentSelectConfig\"\n class=\"cqa-api-edit-step-environment-select cqa-shrink-0 cqa-w-auto cqa-min-w-[315px] cqa-max-w-[315px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full [&_.mat-form-field-wrapper]:cqa-pb-0\"\n aria-label=\"Environment\"\n (selectionChange)=\"onEnvironmentSelectionChange($event)\">\n </cqa-dynamic-select>\n </span>\n </div>\n\n <!-- Request row: method, URL, buttons -->\n <div class=\"cqa-api-edit-step-request-row cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-max-[767px]:cqa-flex-col cqa-max-[767px]:cqa-items-stretch cqa-max-[767px]:cqa-gap-2.5\">\n <cqa-dynamic-select *ngIf=\"methodForm\" [form]=\"methodForm\" [config]=\"methodSelectConfig\"\n class=\"cqa-api-edit-step-method-select cqa-shrink-0 cqa-w-auto cqa-min-w-[152px] cqa-max-w-[152px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full\" aria-label=\"HTTP method\"\n (selectionChange)=\"onMethodSelectionChange($event)\">\n </cqa-dynamic-select>\n <div class=\"cqa-api-edit-step-url-wrap cqa-flex-1 cqa-min-w-[200px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-w-full\">\n <cqa-autocomplete\n [value]=\"url\"\n (valueChange)=\"url = $event\"\n [options]=\"urlOptions\"\n [placeholder]=\"urlPlaceholder\"\n ariaLabel=\"Enter URL or select Parameter\"\n [fullWidth]=\"true\"\n (optionSelect)=\"onUrlOptionSelect($event)\">\n </cqa-autocomplete>\n <div *ngIf=\"urlError\" class=\"cqa-text-red-600 cqa-text-sm cqa-mt-1\">\n {{ urlError }}\n </div>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-trigger cqa-contents cqa-max-[767px]:cqa-w-full cqa-max-[767px]:!cqa-flex\" (click)=\"openImportCurlPanel()\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Import API cURL\"\n customClass=\"cqa-api-edit-step-btn-outline !cqa-bg-white !cqa-border !cqa-border-solid !cqa-border-[#6B7280] cqa-text-[#414146] cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal hover:!cqa-bg-[#F9FAFB] hover:!cqa-text-[#414146] cqa-max-[767px]:cqa-w-full\">\n </cqa-button>\n </div>\n <cqa-button variant=\"filled\" btnSize=\"lg\" text=\"Send Request\" (clicked)=\"onSendRequest()\"\n [disabled]=\"!isUrlValid\"\n customClass=\"cqa-api-edit-step-btn-primary cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal !cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] !cqa-border-none cqa-py-2.5 cqa-px-6 cqa-gap-2 cqa-rounded-lg cqa-min-h-[37px] cqa-box-border hover:!cqa-bg-[#1B1FEB] cqa-max-[767px]:cqa-w-full\"\n [ngClass]=\"{'!cqa-opacity-50 !cqa-cursor-not-allowed': !isUrlValid}\">\n </cqa-button>\n </div>\n\n\n\n <!-- Body content: header section (default) OR import cURL section -->\n <ng-container *ngIf=\"bodyView === 'import-curl'\">\n <div class=\"cqa-api-edit-step-import-curl-panel cqa-flex cqa-flex-col cqa-bg-white cqa-rounded-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-shadow-[0_1px_3px_rgba(0,0,0,0.08)] cqa-overflow-hidden\">\n <div class=\"cqa-api-edit-step-import-curl-header cqa-flex cqa-items-center cqa-justify-between cqa-py-3 cqa-px-5 cqa-border-b cqa-border-solid cqa-border-[#E2E8F0] cqa-bg-[#F9FAFB] cqa-rounded-t-lg cqa-max-[767px]:cqa-px-4\">\n <h3 class=\"cqa-api-edit-step-import-curl-title cqa-m-0 cqa-text-xs cqa-font-bold cqa-leading-[18px] cqa-text-[#374151]\">Import API cURL</h3>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-separator cqa-h-px cqa-bg-[#E2E8F0] cqa-my-0 cqa-mx-5\"></div>\n <div class=\"cqa-api-edit-step-import-curl-body\">\n <cqa-custom-textarea [value]=\"importCurlControl.value\"\n (valueChange)=\"importCurlControl.setValue($event)\"\n placeholder=\"Paste your cURL command here (e.g., curl -X POST https://api.example.com/users)\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-import-curl-textarea\">\n </cqa-custom-textarea>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-footer\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-import-curl-btn-cancel\" (clicked)=\"onCancelImportCurl()\"></cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Import\"\n customClass=\"cqa-api-edit-step-import-curl-btn-import\" (clicked)=\"onImportCurlConfirm()\"></cqa-button>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"bodyView === 'headers'\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of payloadTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activePayloadTab === tab.value ? ' cqa-api-edit-step-tab--active' : '') + (isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params') ? ' cqa-api-edit-step-tab--disabled' : '')\"\n [disabled]=\"isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params')\"\n (clicked)=\"setPayloadTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Payload content (Authorization) -->\n <div *ngIf=\"activePayloadTab === 'authorization'\" class=\"cqa-api-edit-step-payload\"\n [attr.style]=\"'padding: 20px; min-height: 200px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 20px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 8px; width: fit-content;'\">\n <span [attr.style]=\"'font-size: 11px; font-weight: 600; letter-spacing: 0.02em; color: #6B7280; text-transform: uppercase; line-height: 1.25;'\">AUTH TYPE</span>\n <cqa-dynamic-select *ngIf=\"authTypeForm\" [form]=\"authTypeForm\" [config]=\"authTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-type-select\" aria-label=\"Auth type\"\n [attr.style]=\"'min-width: 160px;'\">\n </cqa-dynamic-select>\n </div>\n <!-- No Auth: centered message -->\n <div *ngIf=\"selectedAuthType === 'no-auth'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-width: 0; text-align: center; border: 1px solid #E5E7EB; border-radius: 8px; padding-top: 16px; padding-bottom: 16px;'\">\n <div aria-hidden=\"true\"\n [attr.style]=\"'width: 48px; height: 48px; border-radius: 10px; background: #F3F4F6; display: flex; align-items: center; justify-content: center; flex-shrink: 0;'\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <rect x=\"5\" y=\"11\" width=\"14\" height=\"2\" rx=\"1\" fill=\"#9CA3AF\"/>\n </svg>\n </div>\n <span [attr.style]=\"'font-size: 16px; font-weight: 600; color: #374151; line-height: 1.25;'\">No Auth</span>\n <div [attr.style]=\"'display: flex; align-items: center; justify-content: center; gap: 6px; flex-wrap: wrap;'\">\n <span [attr.style]=\"'font-size: 14px; font-weight: 400; color: #9CA3AF; line-height: 1.4;'\">This request does not use any authorization.</span>\n <span role=\"img\" aria-label=\"More information\" title=\"This request does not use any authorization.\"\n [attr.style]=\"'display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; color: #9CA3AF; flex-shrink: 0;'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M8 7v4M8 5v.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </div>\n </div>\n <!-- Bearer Token: Token label + textarea -->\n <div *ngIf=\"selectedAuthType === 'bearer'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; gap: 10px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Token</span>\n <cqa-custom-textarea [(value)]=\"bearerToken\"\n placeholder=\"Enter bearer token\"\n [fullWidth]=\"true\" [rows]=\"6\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-auth-token-textarea\" ariaLabel=\"Bearer token\">\n </cqa-custom-textarea>\n </div>\n <!-- OAuth 2.0: Grant Type, Access Token URL, Client ID, Client Secret, Scope, Client Authentication -->\n <div *ngIf=\"selectedAuthType === 'oauth2' && oauth2Form\"\n class=\"cqa-api-edit-step-oauth2-grid\"\n [attr.style]=\"'display: grid; grid-template-columns: 1fr 1fr; gap: 16px 24px; width: 100%;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Grant Type</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2GrantTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"OAuth grant type\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth grant type</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Access Token URL</span>\n <cqa-custom-input [value]=\"oauth2Form.get('accessTokenUrl')?.value\"\n (valueChange)=\"oauth2Form.get('accessTokenUrl')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth token endpoint\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Access Token URL\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth token endpoint</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client ID</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientId')?.value\"\n (valueChange)=\"oauth2Form.get('clientId')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth client identifier\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client ID\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client identifier</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Secret</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientSecret')?.value\"\n (valueChange)=\"oauth2Form.get('clientSecret')?.setValue($event)\"\n type=\"password\" [label]=\"''\" placeholder=\"Enter OAuth client secret\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client Secret\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client secret</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Scope</span>\n <cqa-custom-input [value]=\"oauth2Form.get('scope')?.value\"\n (valueChange)=\"oauth2Form.get('scope')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter space-separated scopes\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Scope\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Space-separated scopes</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Authentication</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2ClientAuthSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"Client authentication method\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Client authentication method</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Payload content (Headers) -->\n <div *ngIf=\"activePayloadTab === 'headers'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-headers-grid\">\n <span class=\"cqa-api-edit-step-headers-label\">Header Name</span>\n <span class=\"cqa-api-edit-step-headers-label\">Header Value</span>\n <span class=\"cqa-api-edit-step-headers-label cqa-api-edit-step-headers-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of headerRows; let i = index; trackBy: trackByHeader\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-header-row\">\n <cqa-dynamic-select [form]=\"row\" [config]=\"headerNameSelectConfig\"\n (addCustomValue)=\"onHeaderNameAddCustomValue($event, row)\"\n class=\"cqa-api-edit-step-header-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-header-value-input\" ariaLabel=\"Header value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-header-delete'\"\n [tooltip]=\"'Remove header'\" (clicked)=\"removeHeader(i)\">\n <svg class=\"cqa-api-edit-step-header-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-add-header-wrap\">\n <cqa-button type=\"button\" variant=\"text\" text=\"+ Add Header\"\n [customClass]=\"'cqa-api-edit-step-add-header-link'\" (clicked)=\"addHeader()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Params): Key\u2013Value table with add/delete rows -->\n <div *ngIf=\"activePayloadTab === 'params'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of paramsRows; let i = index; trackBy: trackByParams\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeParamsRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addParamsRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Body only): type, format, text area, Back/Next -->\n <div *ngIf=\"activePayloadTab === 'body'\"\n class=\"cqa-api-edit-step-payload cqa-api-edit-step-payload-editor\">\n <div class=\"cqa-api-edit-step-payload-type-row\">\n <span class=\"cqa-api-edit-step-payload-type-label\">Type</span>\n <div class=\"cqa-api-edit-step-payload-type-radios\">\n <cqa-segment-control [value]=\"payloadType\" [segments]=\"payloadTypeSegments\"\n (valueChange)=\"onPayloadTypeChange($event)\"\n class=\"cqa-api-edit-step-payload-type-segment\">\n </cqa-segment-control>\n </div>\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-format-wrap\">\n <span class=\"cqa-api-edit-step-payload-format-label\">Format:</span>\n <cqa-dynamic-select *ngIf=\"payloadFormatForm\" [form]=\"payloadFormatForm\"\n [config]=\"payloadFormatSelectConfig\" class=\"cqa-api-edit-step-payload-format-select\"\n aria-label=\"Format\">\n </cqa-dynamic-select>\n </div>\n </div>\n <!-- Raw: text area with line numbers (Postman-style payload body) -->\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-body\" #payloadEditorWithLinesRef>\n <div class=\"cqa-api-edit-step-payload-editor-with-lines\">\n <div class=\"cqa-api-edit-step-payload-line-numbers\" aria-hidden=\"true\">\n <span *ngFor=\"let n of payloadLineNumbers\" class=\"cqa-api-edit-step-payload-line-num\">\n <span *ngIf=\"payloadJsonError && payloadJsonError.line === n\"\n class=\"cqa-api-edit-step-payload-line-error-icon\" [title]=\"payloadJsonErrorTooltip\"\n aria-label=\"Parse error on this line\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#EF4444\"/>\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-api-edit-step-payload-line-num-text\">{{ n }}</span>\n </span>\n </div>\n <div class=\"cqa-api-edit-step-payload-textarea-cell\">\n <div class=\"cqa-api-edit-step-payload-textarea cqa-w-full cqa-flex cqa-flex-col cqa-min-h-0\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea--error': payloadJsonError}\">\n <textarea #payloadTextareaRef\n class=\"cqa-api-edit-step-payload-textarea-input cqa-w-full cqa-outline-none cqa-box-border\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea-input--error': payloadJsonError}\"\n [value]=\"payloadText\"\n placeholder=\"\"\n [attr.aria-label]=\"'Payload'\"\n [attr.aria-invalid]=\"!!payloadJsonError\"\n (input)=\"onPayloadInput($event)\"\n (keydown)=\"onPayloadKeydown($event)\">\n </textarea>\n </div>\n </div>\n </div>\n <p *ngIf=\"payloadJsonError\" class=\"cqa-api-edit-step-payload-json-error-msg\">\n Invalid JSON format. Please check your syntax.\n </p>\n </div>\n\n <!-- x-www-form-urlencoded: Key\u2013Value rows, add/remove dynamically -->\n <div *ngIf=\"payloadType === 'x-www-form-urlencoded'\" class=\"cqa-api-edit-step-key-value\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyValueRows; let i = index; trackBy: trackByKeyValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addKeyValueRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Data: Key\u2013Type\u2013Value rows; Type is a dropdown (Text/File), add/remove dynamically -->\n <div *ngIf=\"payloadType === 'form-data'\" class=\"cqa-api-edit-step-key-type-value\">\n <div class=\"cqa-api-edit-step-key-type-value-header\">\n <span class=\"cqa-api-edit-step-key-type-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Type</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-type-value-label cqa-api-edit-step-key-type-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyTypeValueRows; let i = index; trackBy: trackByKeyTypeValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-type-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"keyTypeValueTypeSelectConfig\"\n class=\"cqa-api-edit-step-key-type-value-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-type-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyTypeValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-type-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-type-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-type-value-add-btn\" (clicked)=\"addKeyTypeValueRow()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Advanced settings (step-level) -->\n <div class=\"cqa-mt-4\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-py-2 cqa-border-b cqa-border-gray-200\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-lg cqa-transition-transform\" [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\n </div>\n <!-- Step 2: Variable Name: input, validation, Back / Next -->\n <div *ngIf=\"currentStep === 2\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-variable-section\">\n <div class=\"cqa-api-edit-step-variable-input-wrap\">\n <cqa-custom-input [(value)]=\"variableName\" [label]=\"''\" placeholder=\"Variable Name\" [fullWidth]=\"true\"\n size=\"md\" (valueChange)=\"onVariableNameChange()\" aria-label=\"Variable Name\">\n </cqa-custom-input>\n </div>\n <p *ngIf=\"variableNameError\" class=\"cqa-api-edit-step-variable-error\" role=\"alert\">{{ variableNameError }}</p>\n </div>\n </div>\n <!-- Step 3: Response Body / Status tabs -->\n <div *ngIf=\"currentStep === 3\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of responseVerificationTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activeResponseVerificationTab === tab.value ? ' cqa-api-edit-step-tab--active' : '')\"\n (clicked)=\"setResponseVerificationTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Response Body tab content: verification grid -->\n <div *ngIf=\"activeResponseVerificationTab === 'response-body'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-verification\">\n <div class=\"cqa-api-edit-step-verification-grid cqa-api-edit-step-verification-grid-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">JSON Path</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Data Type</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of verificationRows; let i = index; trackBy: trackByVerification\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-custom-input [value]=\"row.get('jsonPath')?.value ?? ''\"\n (valueChange)=\"row.get('jsonPath')?.setValue($event)\" placeholder=\"Json Path\" [fullWidth]=\"true\"\n size=\"sm\" class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"JSON Path\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationDataTypeSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\"\n (selectionChange)=\"onVerificationDataTypeChange(row, $event)\">\n </cqa-dynamic-select>\n <!-- Expected Value: text for String/Array/Object, number for Number, dropdown for Boolean -->\n <ng-container [ngSwitch]=\"row.get('dataType')?.value\">\n <cqa-dynamic-select *ngSwitchCase=\"'boolean'\" [form]=\"row\"\n [config]=\"verificationExpectedValueBooleanSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-api-edit-step-verification-expected-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input *ngSwitchCase=\"'number'\" [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value (number)\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input cqa-api-edit-step-verification-expected-number\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-custom-input *ngSwitchDefault [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\"\n placeholder=\"Expected Value in String\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n </ng-container>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Status tab content: S.no, Verification dropdown, Expected Value, add/remove rows -->\n <div *ngIf=\"activeResponseVerificationTab === 'status'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addStatusVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-status-verification\">\n <div class=\"cqa-api-edit-step-status-verification-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of statusVerificationRows; let i = index; trackBy: trackByStatusVerification\"\n [formGroup]=\"row\" class=\"cqa-api-edit-step-status-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-dynamic-select [form]=\"row\" [config]=\"statusVerificationSelectConfig\"\n class=\"cqa-api-edit-step-status-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\" class=\"cqa-api-edit-step-verification-input\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeStatusVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Response Preview -->\n <div #responsePreviewRef class=\"cqa-api-edit-step-response\">\n <h3 class=\"cqa-api-edit-step-response-title cqa-text-[14px] cqa-font-bold cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-mb-[12px] cqa-shrink-0\">Response Preview</h3>\n <pre class=\"cqa-api-edit-step-response-content\">{{ responsePreview }}</pre>\n </div>\n\n <!-- Step actions: one row, full width. Step 1: Cancel + Next; Step 2: Back + Next; Step 3: Back + Create -->\n <div class=\"cqa-api-edit-step-actions\">\n <ng-container [ngSwitch]=\"currentStep\">\n <ng-container *ngSwitchCase=\"1\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-actions-btn-cancel\" (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" type=\"button\" variant=\"filled\" btnSize=\"lg\" [text]=\"editMode ? 'Update' : 'Create'\"\n customClass=\"cqa-api-edit-step-actions-btn-create\" (clicked)=\"onCreate()\">\n </cqa-button>\n <!-- Match cqa-button flex: actions row styles > cqa-button { flex: 1 1 0 } \u2014 loader div must grow same width as Create -->\n <div *ngIf=\"isCreatingStep\" class=\"cqa-api-edit-step-actions-loader cqa-w-full cqa-min-h-[38px] cqa-rounded-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; width: 100%; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</div>" }]
2171
2171
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { initialMethod: [{
2172
2172
  type: Input
2173
2173
  }], initialEnvironment: [{
@@ -2258,4 +2258,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
2258
2258
  }], advancedSettingsVariables: [{
2259
2259
  type: Input
2260
2260
  }] } });
2261
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1lZGl0LXN0ZXAvYXBpLWVkaXQtc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1lZGl0LXN0ZXAvYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBZSxXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQUtoRixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRztJQUNsQyxlQUFlLEVBQUUsaUJBQWlCO0lBQ2xDLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsVUFBVSxFQUFFLFlBQVk7Q0FDaEIsQ0FBQztBQTBGWCxNQUFNLG9CQUFvQixHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUV2RCw4RUFBOEU7QUFDOUUsTUFBTSx3QkFBd0IsR0FBMkIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFZcEcsU0FBUyxhQUFhLENBQUMsRUFBVTtJQUMvQixPQUFPLEVBQUUsS0FBSyxHQUFHLElBQUksRUFBRSxLQUFLLFFBQVEsSUFBSSxFQUFFLEtBQUssUUFBUSxDQUFDO0FBQzFELENBQUM7QUFDRCxTQUFTLGFBQWEsQ0FBQyxFQUFVO0lBQy9CLE9BQU8sRUFBRSxLQUFLLEdBQUcsSUFBSSxF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ckIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQWlLa0MseUJBQXlCO3NCQUFoRSxTQUFTO3VCQUFDLDJCQUEyQjtnQkFDTCxrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CO2dCQStDdEIsaUJBQWlCO3NCQUF6QixLQUFLO2dCQXNHRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBOENHLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFnRUcseUJBQXlCO3NCQUFqQyxLQUFLO2dCQThDOEMsa0JBQWtCO3NCQUFyRSxTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFXekMseUJBQXlCO3NCQUFqQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IENxYUF1dG9jb21wbGV0ZU9wdGlvbiB9IGZyb20gJy4uLy4uL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUubW9kZWwnO1xuXG5leHBvcnQgY29uc3QgQVBJX0VESVRfU1RFUF9MQUJFTFMgPSB7XG4gIFJFUVVFU1RfREVUQUlMUzogJ1JlcXVlc3QgRGV0YWlscycsXG4gIFNUT1JFX1JFU1BPTlNFOiAnU3RvcmUgUmVzcG9uc2UnLFxuICBWQUxJREFUSU9OOiAnVmFsaWRhdGlvbicsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBBcGlFZGl0UGF5bG9hZFRhYiA9ICdoZWFkZXJzJyB8ICdib2R5JyB8ICdwYXJhbXMnIHwgJ2F1dGhvcml6YXRpb24nO1xuXG4vKiogV2hpY2ggYm9keSBjb250ZW50IGJsb2NrIGlzIHZpc2libGU6IGhlYWRlcnMgKHRhYnMpIG9yIGltcG9ydCBjVVJMIHRleHRhcmVhLiAqL1xuZXhwb3J0IHR5cGUgQXBpRWRpdEJvZHlWaWV3ID0gJ2hlYWRlcnMnIHwgJ2ltcG9ydC1jdXJsJztcblxuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0SGVhZGVyUm93IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKiBQYXlsb2FkIGVtaXR0ZWQgd2hlbiB1c2VyIGNsaWNrcyBTZW5kIFJlcXVlc3QgKGVudmlyb25tZW50LCBtZXRob2QsIHVybCwgaGVhZGVycykuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRTZW5kUmVxdWVzdFBheWxvYWQge1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICBtZXRob2Q6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGhlYWRlcnM6IEFwaUVkaXRIZWFkZXJSb3dbXTtcbn1cblxuLyoqIE9BdXRoIDIuMCBhdXRoIGZpZWxkcyAod2hlbiBhdXRoIHR5cGUgaXMgT0F1dGggMi4wKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdE9BdXRoMlBheWxvYWQge1xuICBncmFudFR5cGU6IHN0cmluZztcbiAgYWNjZXNzVG9rZW5Vcmw6IHN0cmluZztcbiAgY2xpZW50SWQ6IHN0cmluZztcbiAgY2xpZW50U2VjcmV0OiBzdHJpbmc7XG4gIHNjb3BlOiBzdHJpbmc7XG4gIGNsaWVudEF1dGhlbnRpY2F0aW9uOiBzdHJpbmc7XG59XG5cbi8qKiBTdGVwIDEgcmVxdWVzdCArIGJvZHkgcGF5bG9hZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFN0ZXAxUGF5bG9hZCB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgaGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdO1xuICAvKiogU2VsZWN0ZWQgYXV0aCB0eXBlOiBlLmcuICduby1hdXRoJywgJ2JlYXJlcicsICdvYXV0aDInLiAqL1xuICBhdXRoVHlwZTogc3RyaW5nO1xuICAvKiogQmVhcmVyIHRva2VuIHZhbHVlIHdoZW4gYXV0aFR5cGUgaXMgJ2JlYXJlcicuICovXG4gIGJlYXJlclRva2VuPzogc3RyaW5nO1xuICAvKiogT0F1dGggMi4wIGZpZWxkcyB3aGVuIGF1dGhUeXBlIGlzICdvYXV0aDInLiAqL1xuICBvYXV0aDI/OiBBcGlFZGl0T0F1dGgyUGF5bG9hZDtcbiAgYWN0aXZlUGF5bG9hZFRhYjogQXBpRWRpdFBheWxvYWRUYWI7XG4gIHBheWxvYWRUeXBlOiAncmF3JyB8ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ2Zvcm0tZGF0YSc7XG4gIHBheWxvYWRGb3JtYXQ6IHN0cmluZztcbiAgcGF5bG9hZFRleHQ6IHN0cmluZztcbiAga2V5VmFsdWVSb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXTtcbiAga2V5VHlwZVZhbHVlUm93czogeyBrZXk6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXTtcbiAgcGFyYW1zUm93czogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W107XG59XG5cbi8qKiBTdGVwIDIgc3RvcmUtcmVzcG9uc2UgcGF5bG9hZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFN0ZXAyUGF5bG9hZCB7XG4gIHZhcmlhYmxlTmFtZTogc3RyaW5nO1xufVxuXG4vKiogUmVzcG9uc2UgYm9keSB2ZXJpZmljYXRpb24gcm93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0UmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9uUm93IHtcbiAganNvblBhdGg6IHN0cmluZztcbiAgdmVyaWZpY2F0aW9uOiBzdHJpbmc7XG4gIGRhdGFUeXBlOiBzdHJpbmc7XG4gIGV4cGVjdGVkVmFsdWU6IHN0cmluZztcbn1cblxuLyoqIFN0YXR1cyB2ZXJpZmljYXRpb24gcm93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0U3RhdHVzVmVyaWZpY2F0aW9uUm93IHtcbiAgdmVyaWZpY2F0aW9uOiBzdHJpbmc7XG4gIGV4cGVjdGVkVmFsdWU6IHN0cmluZztcbn1cblxuLyoqIFN0ZXAgMyB2YWxpZGF0aW9uIHBheWxvYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRTdGVwM1BheWxvYWQge1xuICBhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYjogJ3Jlc3BvbnNlLWJvZHknIHwgJ3N0YXR1cyc7XG4gIHJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnM6IEFwaUVkaXRSZXNwb25zZUJvZHlWZXJpZmljYXRpb25Sb3dbXTtcbiAgc3RhdHVzVmVyaWZpY2F0aW9uczogQXBpRWRpdFN0YXR1c1ZlcmlmaWNhdGlvblJvd1tdO1xufVxuXG4vKiogRnVsbCBwYXlsb2FkIGVtaXR0ZWQgd2hlbiB1c2VyIGNsaWNrcyBDcmVhdGUgKGFsbCBzdGVwc+KAmSBkYXRhKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdENyZWF0ZVBheWxvYWQge1xuICBzdGVwMTogQXBpRWRpdFN0ZXAxUGF5bG9hZDtcbiAgc3RlcDI6IEFwaUVkaXRTdGVwMlBheWxvYWQ7XG4gIHN0ZXAzOiBBcGlFZGl0U3RlcDNQYXlsb2FkO1xuICAvKiogQWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzIGZvciB0aGlzIEFQSSBzdGVwIChlLmcuIGlzU3RlcE9wdGlvbmFsLCBzaG91bGRTa2lwKS4gKi9cbiAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcz86IGFueVtdO1xufVxuXG4vKiogRW52aXJvbm1lbnQgb3B0aW9uOiBlaXRoZXIgYSBzdHJpbmcgKGRpc3BsYXkgPSB2YWx1ZSkgb3IgYW4gb2JqZWN0IHdpdGggaWQsIG5hbWUsIHZhbHVlLCBsYWJlbC4gKi9cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50T3B0aW9uSW5wdXQgPSBzdHJpbmcgfCBTZWxlY3RPcHRpb247XG5cbmNvbnN0IE1FVEhPRFNfV0lUSE9VVF9CT0RZID0gWydHRVQnLCAnSEVBRCcsICdERUxFVEUnXTtcblxuLyoqIEF1dG8tY2xvc2UgcGFpcnMgZm9yIHBheWxvYWQgSlNPTiBlZGl0b3I6IG9wZW5pbmcgY2hhciAtPiBjbG9zaW5nIGNoYXIuICovXG5jb25zdCBQQVlMT0FEX0FVVE9fQ0xPU0VfUEFJUlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7ICd7JzogJ30nLCAnWyc6ICddJywgJ1wiJzogJ1wiJywgXCInXCI6IFwiJ1wiIH07XG5cbi8qKiBSZXN1bHQgb2YgcGFyc2luZyBhIGNVUkwgY29tbWFuZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkQ3VybCB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgaGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdO1xuICBib2R5OiBzdHJpbmc7XG4gIC8qKiBFbnRyaWVzIGZyb20gLUYgLyAtLWZvcm0gZmxhZ3MgKG11bHRpcGFydC9mb3JtLWRhdGEpLiAqL1xuICBmb3JtRGF0YTogeyBrZXk6IHN0cmluZzsgdHlwZTogJ3RleHQnIHwgJ2ZpbGUnOyB2YWx1ZTogc3RyaW5nIH1bXTtcbn1cblxuZnVuY3Rpb24gaXNTaW5nbGVRdW90ZShjaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaCA9PT0gXCInXCIgfHwgY2ggPT09ICdcXHUyMDE4JyB8fCBjaCA9PT0gJ1xcdTIwMTknO1xufVxuZnVuY3Rpb24gaXNEb3VibGVRdW90ZShjaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaCA9PT0gJ1wiJyB8fCBjaCA9PT0gJ1xcdTIwMUMnIHx8IGNoID09PSAnXFx1MjAxRCc7XG59XG5mdW5jdGlvbiBpc0Nsb3NpbmdRdW90ZShjaDogc3RyaW5nLCBvcGVuUXVvdGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoaXNTaW5nbGVRdW90ZShvcGVuUXVvdGUpKSByZXR1cm4gaXNTaW5nbGVRdW90ZShjaCk7XG4gIGlmIChpc0RvdWJsZVF1b3RlKG9wZW5RdW90ZSkpIHJldHVybiBpc0RvdWJsZVF1b3RlKGNoKTtcbiAgcmV0dXJuIGNoID09PSBvcGVuUXVvdGU7XG59XG5cbi8qKlxuICogVG9rZW5pemUgYSBjVVJMIGNvbW1hbmQgc3RyaW5nIGludG8gYXJndW1lbnQgdG9rZW5zLCBtYXRjaGluZyBiYXNoIHF1b3RpbmcgcnVsZXM6XG4gKiAgLSBTaW5nbGUtcXVvdGVkIHN0cmluZ3MgYXJlIEZVTExZIExJVEVSQUwg4oCUIGJhY2tzbGFzaCBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLlxuICogICAgVGhpcyBwcmVzZXJ2ZXMgSlNPTiBlc2NhcGUgc2VxdWVuY2VzIChlLmcuIFxcXCIpIGluc2lkZSAnLS1kYXRhLXJhdycgYm9kaWVzLlxuICogIC0gRG91YmxlLXF1b3RlZCBzdHJpbmdzIHRyZWF0IGJhY2tzbGFzaCBhcyBhbiBlc2NhcGUgY2hhcmFjdGVyIChcXFwiIOKGkiBcIikuXG4gKiAgICBUaGlzIGhhbmRsZXMgV2luZG93cy1DTUQtbm9ybWFsaXNlZCB2YWx1ZXMgYW5kIHBsYWluIC1kIFwie1xcXCJrXFxcIjpcXFwidlxcXCJ9XCIgYm9kaWVzLlxuICogQWxzbyBoYW5kbGVzIHN0cmFpZ2h0IGFuZCBjdXJseS9zbWFydCBxdW90ZSBjaGFyYWN0ZXJzLlxuICovXG5mdW5jdGlvbiB0b2tlbml6ZUN1cmxMaW5lKGxpbmU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaSA9IDA7XG4gIGNvbnN0IG4gPSBsaW5lLmxlbmd0aDtcbiAgd2hpbGUgKGkgPCBuKSB7XG4gICAgd2hpbGUgKGkgPCBuICYmIC9cXHMvLnRlc3QobGluZVtpXSkpIGkrKztcbiAgICBpZiAoaSA+PSBuKSBicmVhaztcbiAgICBjb25zdCBjaCA9IGxpbmVbaV07XG4gICAgaWYgKGlzU2luZ2xlUXVvdGUoY2gpIHx8IGlzRG91YmxlUXVvdGUoY2gpKSB7XG4gICAgICBjb25zdCBxdW90ZSA9IGNoO1xuICAgICAgY29uc3Qgc2luZ2xlUXVvdGVkID0gaXNTaW5nbGVRdW90ZShjaCk7XG4gICAgICBpKys7XG4gICAgICBsZXQgdmFsdWUgPSAnJztcbiAgICAgIHdoaWxlIChpIDwgbiAmJiAhaXNDbG9zaW5nUXVvdGUobGluZVtpXSwgcXVvdGUpKSB7XG4gICAgICAgIGlmICghc2luZ2xlUXVvdGVkICYmIGxpbmVbaV0gPT09ICdcXFxcJykge1xuICAgICAgICAgIGkrKztcbiAgICAgICAgICBpZiAoaSA8IG4pIHZhbHVlICs9IGxpbmVbaSsrXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSArPSBsaW5lW2krK107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpIDwgbikgaSsrO1xuICAgICAgdG9rZW5zLnB1c2godmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGxldCB3b3JkID0gJyc7XG4gICAgd2hpbGUgKGkgPCBuICYmICEvXFxzLy50ZXN0KGxpbmVbaV0pICYmICFpc1NpbmdsZVF1b3RlKGxpbmVbaV0pICYmICFpc0RvdWJsZVF1b3RlKGxpbmVbaV0pKSB7XG4gICAgICB3b3JkICs9IGxpbmVbaSsrXTtcbiAgICB9XG4gICAgaWYgKHdvcmQpIHRva2Vucy5wdXNoKHdvcmQpO1xuICB9XG4gIHJldHVybiB0b2tlbnM7XG59XG5cbi8qKiBTdHJpcCBvbmUgbGF5ZXIgb2Ygc3Vycm91bmRpbmcgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMgKHVzZWQgZm9yIGlubGluZSAtLWRhdGE9IHZhbHVlcykuICovXG5mdW5jdGlvbiBzdHJpcFN1cnJvdW5kaW5nUXVvdGVzKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChzLmxlbmd0aCA+PSAyICYmICgocy5zdGFydHNXaXRoKFwiJ1wiKSAmJiBzLmVuZHNXaXRoKFwiJ1wiKSkgfHwgKHMuc3RhcnRzV2l0aCgnXCInKSAmJiBzLmVuZHNXaXRoKCdcIicpKSkpIHtcbiAgICByZXR1cm4gcy5zbGljZSgxLCAtMSk7XG4gIH1cbiAgcmV0dXJuIHM7XG59XG5cbi8qKlxuICogRmxhZ3MgdGhhdCB0YWtlIG9uZSBhcmd1bWVudCB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgY29uc3VtZWQgYnV0IERJU0NBUkRFRC5cbiAqIFdpdGhvdXQgdGhpcyBsaXN0LCBmbGFncyBsaWtlIC0tcmVmZXJlciBvciAtLXByb3h5IHdvdWxkIGhhdmUgdGhlaXIgVVJMLWxpa2VcbiAqIGFyZ3VtZW50IG1pc3Rha2VubHkgY2FwdHVyZWQgYXMgdGhlIHJlcXVlc3QgVVJMIGJ5IHRoZSBwYXR0ZXJuIG1hdGNoZXIgYmVsb3cuXG4gKi9cbmNvbnN0IENVUkxfRkxBR1NfV0lUSF9JR05PUkVEX0FSRyA9IG5ldyBTZXQoW1xuICAnLS1yZWZlcmVyJywgJy1lJywgJy0tcmVmZXInLFxuICAnLS1wcm94eScsICcteCcsICctLXNvY2tzNScsICctLXNvY2tzNCcsICctLXNvY2tzNGEnLCAnLS1zb2NrczUtaG9zdG5hbWUnLFxuICAnLS11c2VyLWFnZW50JywgJy1BJyxcbiAgJy0tY29va2llJywgJy1iJyxcbiAgJy0tY29va2llLWphcicsICctYycsXG4gICctbycsICctLW91dHB1dCcsXG4gICctdScsICctLXVzZXInLFxuICAnLS1jZXJ0JywgJy0ta2V5JywgJy0tY2FjZXJ0JywgJy0tY2FwYXRoJyxcbiAgJy0tY29ubmVjdC10aW1lb3V0JywgJy0tbWF4LXRpbWUnLCAnLW0nLFxuICAnLS1yZXRyeScsICctLXJldHJ5LWRlbGF5JywgJy0tcmV0cnktbWF4LXRpbWUnLFxuICAnLS1tYXgtcmVkaXJzJywgJy0taW50ZXJmYWNlJywgJy0tZG5zLXNlcnZlcnMnLFxuICAnLS1wcm94eS11c2VyJywgJy0tcHJveHktaGVhZGVyJyxcbiAgJy0tcmVzb2x2ZScsICctLWxpbWl0LXJhdGUnLFxuICAnLS10bHNwYXNzd29yZCcsICctLXRsc2F1dGh0eXBlJyxcbiAgJy0tdXBsb2FkLWZpbGUnLCAnLVQnLFxuICAnLS1yYW5nZScsICctcicsXG4gICctLXBhc3MnLCAnLS1lbmdpbmUnLFxuICAnLS1waW5uZWRwdWJrZXknLCAnLS1ob3N0cHVibWQ1Jyxcbl0pO1xuXG4vKiogQm9vbGVhbiBmbGFncyB0aGF0IHRha2Ugbm8gYXJndW1lbnQg4oCUIHNraXAgd2l0aG91dCBjb25zdW1pbmcgdGhlIG5leHQgdG9rZW4uICovXG5jb25zdCBDVVJMX05PX0FSR19GTEFHUyA9IG5ldyBTZXQoW1xuICAnLS1jb21wcmVzc2VkJywgJy0tbG9jYXRpb24nLCAnLUwnLCAnLS1pbnNlY3VyZScsICctaycsXG4gICctLXNpbGVudCcsICctcycsICctLXZlcmJvc2UnLCAnLXYnLCAnLS1nZXQnLCAnLUcnLFxuICAnLS1mYWlsJywgJy1mJywgJy0tc2hvdy1lcnJvcicsICctUycsXG4gICctLWhlYWQnLCAnLUknLCAnLS1pbmNsdWRlJywgJy1pJyxcbiAgJy0tcmVtb3RlLW5hbWUnLCAnLU8nLCAnLS1yZW1vdGUtbmFtZS1hbGwnLFxuICAnLS1pcHY0JywgJy00JywgJy0taXB2NicsICctNicsXG4gICctLWFueWF1dGgnLCAnLS1iYXNpYycsICctLWRpZ2VzdCcsICctLW50bG0nLCAnLS1uZWdvdGlhdGUnLFxuICAnLS1uby1rZWVwYWxpdmUnLCAnLS1uby1zZXNzaW9uaWQnLCAnLS1nbG9ib2ZmJywgJy1nJyxcbiAgJy0tcmVtb3RlLXRpbWUnLCAnLVInLCAnLS10Y3Atbm9kZWxheScsXG4gICctLWh0dHAxLjAnLCAnLTAnLCAnLS1odHRwMS4xJywgJy0taHR0cDInLCAnLS1odHRwMi1wcmlvci1rbm93bGVkZ2UnLFxuICAnLS1odHRwMycsICctLW5vLWJ1ZmZlcicsICctTicsXG4gICctLXRyYWNlLXRpbWUnLCAnLS1jZXJ0LXN0YXR1cycsICctLWZhbHNlLXN0YXJ0JyxcbiAgJy0tcGF0aC1hcy1pcycsICctLWxpc3Qtb25seScsICctbCcsXG4gICctLWFwcGVuZCcsICctYScsICctLXVzZS1hc2NpaScsICctQicsXG4gICctLWhhcHJveHktcHJvdG9jb2wnLCAnLS1uZXRyYycsICctbicsICctLW5ldHJjLW9wdGlvbmFsJyxcbl0pO1xuXG4vKiogUGFyc2UgYSBzaW5nbGUgLUYvLS1mb3JtIHZhbHVlIChrZXk9dmFsdWUgfCBrZXk9QGZpbGUgfCBrZXk9PGZpbGUpIGludG8gYSBmb3JtRGF0YSBlbnRyeS4gKi9cbmZ1bmN0aW9uIHBhcnNlRm9ybUVudHJ5KHJhdzogc3RyaW5nKTogeyBrZXk6IHN0cmluZzsgdHlwZTogJ3RleHQnIHwgJ2ZpbGUnOyB2YWx1ZTogc3RyaW5nIH0gfCBudWxsIHtcbiAgY29uc3QgZXEgPSByYXcuaW5kZXhPZignPScpO1xuICBpZiAoZXEgPT09IC0xKSByZXR1cm4gbnVsbDtcbiAgY29uc3Qga2V5ID0gcmF3LnNsaWNlKDAsIGVxKS50cmltKCk7XG4gIGlmICgha2V5KSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmVzdCA9IHJhdy5zbGljZShlcSArIDEpO1xuICAvLyBTdHJpcCBvcHRpb25hbCA7dHlwZT0uLi4gc3VmZml4XG4gIGNvbnN0IHNlbWkgPSByZXN0LmluZGV4T2YoJzsnKTtcbiAgY29uc3QgdmFsID0gKHNlbWkgIT09IC0xID8gcmVzdC5zbGljZSgwLCBzZW1pKSA6IHJlc3QpLnRyaW0oKTtcbiAgaWYgKHZhbC5zdGFydHNXaXRoKCdAJykgfHwgdmFsLnN0YXJ0c1dpdGgoJzwnKSkge1xuICAgIHJldHVybiB7IGtleSwgdHlwZTogJ2ZpbGUnLCB2YWx1ZTogdmFsLnNsaWNlKDEpIH07XG4gIH1cbiAgcmV0dXJuIHsga2V5LCB0eXBlOiAndGV4dCcsIHZhbHVlOiB2YWwgfTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhbnkgY1VSTCBjb21tYW5kIHN0cmluZyBhbmQgcmV0dXJuIG1ldGhvZCwgdXJsLCBoZWFkZXJzLCBib2R5LCBhbmQgZm9ybURhdGEuXG4gKlxuICogU3VwcG9ydGVkIGZvcm1hdHMgLyBmZWF0dXJlczpcbiAqICDigKIgVW5peC9NYWMgIDogc2luZ2xlLXF1b3RlIGFyZ3MsIGJhY2tzbGFzaCAoXFwpIGxpbmUgY29udGludWF0aW9uXG4gKiAg4oCiIFBvd2VyU2hlbGw6IGJhY2t0aWNrIChgKSBsaW5lIGNvbnRpbnVhdGlvblxuICogIOKAoiBXaW5kb3dzIENNRDogXlwiIHF1b3RlIGRlbGltaXRlcnMsIF5cXF5cIiBpbm5lciBlc2NhcGVkIHF1b3RlLCBeIGxpbmUgY29udGludWF0aW9uXG4gKiAg4oCiIEhUVFAgbWV0aG9kICA6IC1YIFBPU1QgfCAtLXJlcXVlc3QgUE9TVCB8IC0tcmVxdWVzdD1QT1NUIHwgLVhQT1NUXG4gKiAg4oCiIEhlYWRlcnMgICAgICA6IC1IIC8gLS1oZWFkZXIgLyAtLWhlYWRlcj0n4oCmJyAvIC1IPSfigKYnIGlubGluZS09IGZvcm1cbiAqICDigKIgQm9keSAgICAgICAgIDogLWQgLyAtLWRhdGEgLyAtLWRhdGEtcmF3IC8gLS1kYXRhLWJpbmFyeSAvIC0tZGF0YS1hc2NpaSAvXG4gKiAgICAgICAgICAgICAgICAgICBpbmxpbmUgLS1kYXRhPSfigKYnIC8gbXVsdGlwbGUgLWQgZmxhZ3MgKGNvbmNhdGVuYXRlZCB3aXRoICYpIC9cbiAqICAgICAgICAgICAgICAgICAgIC0tZGF0YS11cmxlbmNvZGUgLyAtLWpzb24gKGNVUkwgNy44MispXG4gKiAg4oCiIEZvcm0tZGF0YSAgICA6IC1GIC8gLS1mb3JtIC8gLS1mb3JtLXN0cmluZyAobXVsdGlwYXJ0L2Zvcm0tZGF0YSlcbiAqICDigKIgVVJMICAgICAgICAgIDogYmFyZSBodHRwcz86Ly8gdG9rZW4gb3IgZXhwbGljaXQgLS11cmwgZmxhZ1xuICogIOKAoiBBdXRoIGluZmVyICAgOiBCZWFyZXIgdG9rZW4gZXh0cmFjdGVkIGZyb20gQXV0aG9yaXphdGlvbiBoZWFkZXJcbiAqICDigKIgTWV0aG9kIGluZmVyIDogR0VU4oaSUE9TVCB3aGVuIGJvZHkvZm9ybS1kYXRhIHByZXNlbnQgYW5kIG5vIGV4cGxpY2l0IC1YXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ3VybChjdXJsU3RyaW5nOiBzdHJpbmcpOiBQYXJzZWRDdXJsIHwgbnVsbCB7XG4gIGNvbnN0IHJhdyA9IChjdXJsU3RyaW5nID8/ICcnKS50cmltKCk7XG4gIGlmICghcmF3KSByZXR1cm4gbnVsbDtcblxuICBsZXQgcyA9IHJhdztcblxuICAvLyDilIDilIAgV2luZG93cyBDTUQgZm9ybWF0IChDaHJvbWUgRGV2VG9vbHMgXCJDb3B5IGFzIGNVUkwgKGNtZClcIikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIERldGVjdGVkIGJ5IHByZXNlbmNlIG9mIF5cIiAoY2FyZXQgKyBkb3VibGUtcXVvdGUpIGFzIHF1b3RlIGRlbGltaXRlci5cbiAgLy8gT25seSBhcHBsaWVkIHdoZW4gdGhlIGNVUkwgaXMgTk9UIGFscmVhZHkgdXNpbmcgc2luZ2xlLXF1b3RlcyBhcyB0aGUgcHJpbWFyeVxuICAvLyBxdW90aW5nIG1lY2hhbmlzbSAoaS5lLiBub3QgYSBVbml4IGNVUkwgdGhhdCBtZXJlbHkgY29udGFpbnMgXlwiIGluIGEgYm9keSkuXG4gIGlmICgvXFxeXCIvLnRlc3QocykgJiYgIS8oPzpefFxccyknLy50ZXN0KHMpKSB7XG4gICAgcyA9IHMucmVwbGFjZSgvXFxzKlxcXlxccypcXHI/XFxuXFxzKi9nLCAnICcpOyAgLy8gXiBsaW5lLWNvbnRpbnVhdGlvblxuICAgIHMgPSBzLnJlcGxhY2UoL1xcXlxcXFxcXF5cIi9nLCAnXFxcXFwiJyk7ICAgICAgICAgICAvLyBeXFxeXCIg4oaSIFxcXCIgKGlubmVyIGVzY2FwZWQgcXVvdGUpXG4gICAgcyA9IHMucmVwbGFjZSgvXFxeXCIvZywgJ1wiJyk7ICAgICAgICAgICAgICAgICAvLyBeXCIgIOKGkiBcIiAgKHF1b3RlIGRlbGltaXRlcilcbiAgfVxuXG4gIC8vIOKUgOKUgCBQb3dlclNoZWxsIGJhY2t0aWNrIGxpbmUgY29udGludWF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBzID0gcy5yZXBsYWNlKC9gXFxzKlxccj9cXG5cXHMqL2csICcgJyk7XG5cbiAgLy8g4pSA4pSAIFVuaXgvTWFjIGJhY2tzbGFzaCBsaW5lIGNvbnRpbnVhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcyA9IHMucmVwbGFjZSgvXFxcXFxccypcXHI/XFxuXFxzKi9nLCAnICcpO1xuXG4gIC8vIENvbGxhcHNlIHJlbWFpbmluZyBsaXRlcmFsIG5ld2xpbmVzIGFuZCByZWR1bmRhbnQgc3BhY2VzXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBzLnJlcGxhY2UoL1xccj9cXG4vZywgJyAnKS5yZXBsYWNlKC9cXHMrL2csICcgJyk7XG4gIGNvbnN0IHRva2VucyA9IHRva2VuaXplQ3VybExpbmUobm9ybWFsaXplZCk7XG5cbiAgbGV0IG1ldGhvZCA9ICcnO1xuICBsZXQgdXJsID0gJyc7XG4gIGNvbnN0IGhlYWRlcnM6IEFwaUVkaXRIZWFkZXJSb3dbXSA9IFtdO1xuICBsZXQgYm9keSA9ICcnO1xuICBjb25zdCBmb3JtRGF0YTogeyBrZXk6IHN0cmluZzsgdHlwZTogJ3RleHQnIHwgJ2ZpbGUnOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdO1xuICBjb25zdCB1cmxQYXR0ZXJuID0gL15odHRwcz86XFwvXFwvL2k7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0ID0gdG9rZW5zW2ldO1xuICAgIGNvbnN0IGNvbnN1bWVOZXh0ID0gKCk6IHN0cmluZyA9PiB0b2tlbnNbKytpXSA/PyAnJztcblxuICAgIC8vIOKUgOKUgCBTa2lwIGJvb2xlYW4gbm8tYXJnIGZsYWdzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGlmIChDVVJMX05PX0FSR19GTEFHUy5oYXModCkpIGNvbnRpbnVlO1xuXG4gICAgLy8g4pSA4pSAIENvbnN1bWUtYW5kLWRpc2NhcmQgZmxhZ3MgKHRoZWlyIGFyZyBtdXN0IG5vdCBiZSBtaXN0YWtlbiBmb3IgdGhlIFVSTCkg4pSA4pSAXG4gICAgaWYgKENVUkxfRkxBR1NfV0lUSF9JR05PUkVEX0FSRy5oYXModCkpIHsgY29uc3VtZU5leHQoKTsgY29udGludWU7IH1cblxuICAgIC8vIOKUgOKUgCBIVFRQIG1ldGhvZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBpZiAodCA9PT0gJy1YJyB8fCB0ID09PSAnLS1yZXF1ZXN0Jykge1xuICAgICAgY29uc3QgdiA9IGNvbnN1bWVOZXh0KCk7IGlmICh2KSBtZXRob2QgPSB2LnRvVXBwZXJDYXNlKCk7IGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodC5zdGFydHNXaXRoKCctLXJlcXVlc3Q9JykpIHtcbiAgICAgIGNvbnN0IHYgPSB0LnNsaWNlKDEwKTsgaWYgKHYpIG1ldGhvZCA9IHYudG9VcHBlckNhc2UoKTsgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0LnN0YXJ0c1dpdGgoJy1YJykgJiYgdC5sZW5ndGggPiAyKSB7XG4gICAgICBtZXRob2QgPSB0LnNsaWNlKDIpLnRvVXBwZXJDYXNlKCk7IGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBIZWFkZXJzOiAtSCAvIC0taGVhZGVyIC8gaW5saW5lIC0taGVhZGVyPSfigKYnIC8gLUg9J+KApicg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgaWYgKHQgPT09ICctSCcgfHwgdCA9PT0gJy0taGVhZGVyJykge1xuICAgICAgY29uc3QgdiA9IGNvbnN1bWVOZXh0KCk7XG4gICAgICBjb25zdCBjb2xvbiA9IHYuaW5kZXhPZignOicpO1xuICAgICAgaWYgKGNvbG9uICE9PSAtMSkge1xuICAgICAgICBjb25zdCBuYW1lID0gdi5zbGljZSgwLCBjb2xvbikudHJpbSgpO1xuICAgICAgICBjb25zdCB2YWwgID0gdi5zbGljZShjb2xvbiArIDEpLnRyaW0oKTtcbiAgICAgICAgaWYgKG5hbWUpIGhlYWRlcnMucHVzaCh7IG5hbWUsIHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogdmFsIH0pO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIElubGluZSAtLWhlYWRlcj0nTmFtZTogVmFsdWUnIOKAlCB0b2tlbml6ZXIgc3BsaXRzIGludG8gWyctLWhlYWRlcj0nLCAnTmFtZTogVmFsdWUnXVxuICAgIGlmICh0LnN0YXJ0c1dpdGgoJy0taGVhZGVyPScpIHx8IHQuc3RhcnRzV2l0aCgnLUg9JykpIHtcbiAgICAgIGNvbnN0IHByZWZpeExlbiA9IHQuc3RhcnRzV2l0aCgnLS1oZWFkZXI9JykgPyA5IDogMztcbiAgICAgIGNvbnN0IGlubGluZSA9IHQuc2xpY2UocHJlZml4TGVuKSB8fCBjb25zdW1lTmV4dCgpO1xuICAgICAgY29uc3QgY29sb24gID0gaW5saW5lLmluZGV4T2YoJzonKTtcbiAgICAgIGlmIChjb2xvbiAhPT0gLTEpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGlubGluZS5zbGljZSgwLCBjb2xvbikudHJpbSgpO1xuICAgICAgICBjb25zdCB2YWwgID0gaW5saW5lLnNsaWNlKGNvbG9uICsgMSkudHJpbSgpO1xuICAgICAgICBpZiAobmFtZSkgaGVhZGVycy5wdXNoKHsgbmFtZSwgdHlwZTogJ3N0cmluZycsIHZhbHVlOiB2YWwgfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgUmVxdWVzdCBib2R5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIC8vIGNVUkwgY29uY2F0ZW5hdGVzIG11bHRpcGxlIC1kIGZsYWdzIHdpdGggJyYnOyByZXBsaWNhdGUgdGhhdCBiZWhhdmlvdXIuXG4gICAgaWYgKHQgPT09ICctZCcgfHwgdCA9PT0gJy0tZGF0YScgfHwgdCA9PT0gJy0tZGF0YS1yYXcnIHx8XG4gICAgICAgIHQgPT09ICctLWRhdGEtYmluYXJ5JyB8fCB0ID09PSAnLS1kYXRhLWFzY2lpJykge1xuICAgICAgY29uc3QgdiA9IGNvbnN1bWVOZXh0KCk7XG4gICAgICBpZiAodiAmJiAhdi5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSBzdHJpcFN1cnJvdW5kaW5nUXVvdGVzKHYpO1xuICAgICAgICBib2R5ID0gYm9keSA/IGAke2JvZHl9JiR7Y2h1bmt9YCA6IGNodW5rO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIC0tanNvbiBmbGFnIChjVVJMIDcuODIrKTogc2V0cyBDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbiArIGJvZHlcbiAgICBpZiAodCA9PT0gJy0tanNvbicpIHtcbiAgICAgIGNvbnN0IHYgPSBjb25zdW1lTmV4dCgpO1xuICAgICAgaWYgKHYgJiYgIXYuc3RhcnRzV2l0aCgnQCcpKSBib2R5ID0gc3RyaXBTdXJyb3VuZGluZ1F1b3Rlcyh2KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBJbmxpbmUgLS1kYXRhPSfigKYnIC8gLS1kYXRhLXJhdz0n4oCmJyDigJQgdG9rZW5pemVyIHNwbGl0cyBpbnRvIFsnLS1kYXRhPScsIHZhbHVlXVxuICAgIGlmICh0LnN0YXJ0c1dpdGgoJy0tZGF0YT0nKSB8fCB0LnN0YXJ0c1dpdGgoJy0tZGF0YS1yYXc9JykgfHxcbiAgICAgICAgdC5zdGFydHNXaXRoKCctLWRhdGEtYmluYXJ5PScpIHx8IHQuc3RhcnRzV2l0aCgnLS1kYXRhLWFzY2lpPScpKSB7XG4gICAgICBjb25zdCBlcUlkeCA9IHQuaW5kZXhPZignPScpO1xuICAgICAgY29uc3QgaW5saW5lID0gdC5zbGljZShlcUlkeCArIDEpIHx8IGNvbnN1bWVOZXh0KCk7XG4gICAgICBpZiAoaW5saW5lICYmICFTdHJpbmcoaW5saW5lKS5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSBzdHJpcFN1cnJvdW5kaW5nUXVvdGVzKFN0cmluZyhpbmxpbmUpKTtcbiAgICAgICAgYm9keSA9IGJvZHkgPyBgJHtib2R5fSYke2NodW5rfWAgOiBjaHVuaztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBJbmxpbmUgc2hvcnQgZm9ybSAtZFZBTFVFIG9yIC1kPVZBTFVFXG4gICAgaWYgKHQuc3RhcnRzV2l0aCgnLWQnKSAmJiB0Lmxlbmd0aCA+IDIpIHtcbiAgICAgIGNvbnN0IHYgPSB0LnN0YXJ0c1dpdGgoJy1kPScpID8gdC5zbGljZSgzKSA6IHQuc2xpY2UoMik7XG4gICAgICBpZiAoIXYuc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICAgIGNvbnN0IGNodW5rID0gc3RyaXBTdXJyb3VuZGluZ1F1b3Rlcyh2KTtcbiAgICAgICAgYm9keSA9IGJvZHkgPyBgJHtib2R5fSYke2NodW5rfWAgOiBjaHVuaztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyAtLWRhdGEtdXJsZW5jb2RlIG5hbWU9dmFsdWUgKHRyZWF0IGFzIHBsYWluIGJvZHkgZW50cnkpXG4gICAgaWYgKHQgPT09ICctLWRhdGEtdXJsZW5jb2RlJykge1xuICAgICAgY29uc3QgdiA9IGNvbnN1bWVOZXh0KCk7XG4gICAgICBpZiAodiAmJiAhdi5pbmNsdWRlcygnQCcpKSBib2R5ID0gYm9keSA/IGAke2JvZHl9JiR7dn1gIDogdjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodC5zdGFydHNXaXRoKCctLWRhdGEtdXJsZW5jb2RlPScpKSB7XG4gICAgICBjb25zdCBpbmxpbmUgPSB0LnNsaWNlKDE3KSB8fCBjb25zdW1lTmV4dCgpO1xuICAgICAgaWYgKGlubGluZSAmJiAhU3RyaW5nKGlubGluZSkuaW5jbHVkZXMoJ0AnKSkge1xuICAgICAgICBib2R5ID0gYm9keSA/IGAke2JvZHl9JiR7aW5saW5lfWAgOiBTdHJpbmcoaW5saW5lKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBNdWx0aXBhcnQgZm9ybS1kYXRhOiAtRiAvIC0tZm9ybSAvIC0tZm9ybS1zdHJpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgaWYgKHQgPT09ICctRicgfHwgdCA9PT0gJy0tZm9ybScgfHwgdCA9PT0gJy0tZm9ybS1zdHJpbmcnKSB7XG4gICAgICBjb25zdCB2ID0gY29uc3VtZU5leHQoKTtcbiAgICAgIGlmICh2KSB7IGNvbnN0IGUgPSBwYXJzZUZvcm1FbnRyeSh2KTsgaWYgKGUpIGZvcm1EYXRhLnB1c2goZSk7IH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodC5zdGFydHNXaXRoKCctLWZvcm09JykgfHwgdC5zdGFydHNXaXRoKCctRj0nKSkge1xuICAgICAgY29uc3QgcHJlZml4TGVuID0gdC5zdGFydHNXaXRoKCctLWZvcm09JykgPyA3IDogMztcbiAgICAgIGNvbnN0IGlubGluZSA9IHQuc2xpY2UocHJlZml4TGVuKSB8fCBjb25zdW1lTmV4dCgpO1xuICAgICAgaWYgKGlubGluZSkgeyBjb25zdCBlID0gcGFyc2VGb3JtRW50cnkoU3RyaW5nKGlubGluZSkpOyBpZiAoZSkgZm9ybURhdGEucHVzaChlKTsgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFVSTCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBpZiAodCA9PT0gJy0tdXJsJykge1xuICAgICAgY29uc3QgdiA9IGNvbnN1bWVOZXh0KCk7IGlmICh2ICYmICF1cmwpIHVybCA9IHY7IGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodC5zdGFydHNXaXRoKCctLXVybD0nKSkge1xuICAgICAgY29uc3QgdiA9IHQuc2xpY2UoNikgfHwgY29uc3VtZU5leHQoKTsgaWYgKHYgJiYgIXVybCkgdXJsID0gdjsgY29udGludWU7XG4gICAgfVxuICAgIGlmICh1cmxQYXR0ZXJuLnRlc3QodCkgJiYgIXVybCkgeyB1cmwgPSB0OyB9XG4gIH1cblxuICAvLyBGYWxsYmFjazogc2NhbiBhbGwgdG9rZW5zIGZvciB0aGUgZmlyc3QgVVJMLWxpa2UgdmFsdWVcbiAgaWYgKCF1cmwpIHtcbiAgICB1cmwgPSB0b2tlbnMuZmluZCh0b2sgPT4gdXJsUGF0dGVybi50ZXN0KHRvaykpID8/ICcnO1xuICB9XG5cbiAgLy8gSW5mZXIgbWV0aG9kOiBpZiBhIGJvZHkvZm9ybS1kYXRhIGlzIHByZXNlbnQgYnV0IG5vIGV4cGxpY2l0IC1YIHdhcyBnaXZlbixcbiAgLy8gdXNlIFBPU1QgKG1hbnkgYnJvd3NlciBEZXZUb29scyBjVVJMcyBvbWl0IC1YIFBPU1QpLlxuICBjb25zdCBmaW5hbE1ldGhvZCA9IChtZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XG4gIGlmICgoYm9keSB8fCBmb3JtRGF0YS5sZW5ndGggPiAwKSAmJiAoZmluYWxNZXRob2QgPT09ICdHRVQnIHx8IGZpbmFsTWV0aG9kID09PSAnSEVBRCcpKSB7XG4gICAgcmV0dXJuIHsgbWV0aG9kOiAnUE9TVCcsIHVybCwgaGVhZGVycywgYm9keSwgZm9ybURhdGEgfTtcbiAgfVxuICByZXR1cm4geyBtZXRob2Q6IGZpbmFsTWV0aG9kLCB1cmwsIGhlYWRlcnMsIGJvZHksIGZvcm1EYXRhIH07XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1hcGktZWRpdC1zdGVwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwaS1lZGl0LXN0ZXAuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCxcbn0pXG5leHBvcnQgY2xhc3MgQXBpRWRpdFN0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgaW5pdGlhbE1ldGhvZD86IHN0cmluZztcbiAgQElucHV0KCkgaW5pdGlhbEVudmlyb25tZW50Pzogc3RyaW5nO1xuICBASW5wdXQoKSBpbml0aWFsU3RlcD86IG51bWJlcjtcbiAgQElucHV0KCkgaW5pdGlhbFVybD86IHN0cmluZztcbiAgQElucHV0KCkgaW5pdGlhbFBheWxvYWRUYWI/OiBBcGlFZGl0UGF5bG9hZFRhYjtcbiAgLyoqIEluaXRpYWwgcGF5bG9hZCB0eXBlIChyYXcsIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCwgZm9ybS1kYXRhKSB3aGVuIGVkaXRpbmcgYW4gZXhpc3Rpbmcgc3RlcC4gKi9cbiAgQElucHV0KCkgaW5pdGlhbFBheWxvYWRUeXBlPzogJ3JhdycgfCAneC13d3ctZm9ybS11cmxlbmNvZGVkJyB8ICdmb3JtLWRhdGEnO1xuICAvKiogSW5pdGlhbCBwYXlsb2FkIHRleHQgKGJvZHkpIHdoZW4gZWRpdGluZyBhbiBleGlzdGluZyBzdGVwLiAqL1xuICBASW5wdXQoKSBpbml0aWFsUGF5bG9hZFRleHQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGluaXRpYWxIZWFkZXJzPzogQXBpRWRpdEhlYWRlclJvd1tdO1xuICBASW5wdXQoKSBpbml0aWFsUmVzcG9uc2VQcmV2aWV3Pzogc3RyaW5nO1xuICBASW5wdXQoKSBpbml0aWFsVmFyaWFibGVOYW1lPzogc3RyaW5nO1xuICAvKiogSW5pdGlhbCByZXNwb25zZSBib2R5IHZlcmlmaWNhdGlvbnMgd2hlbiBlZGl0aW5nIGFuIGV4aXN0aW5nIHN0ZXAuICovXG4gIEBJbnB1dCgpIGluaXRpYWxSZXNwb25zZUJvZHlWZXJpZmljYXRpb25zPzogQXBpRWRpdFJlc3BvbnNlQm9keVZlcmlmaWNhdGlvblJvd1tdO1xuICAvKiogSW5pdGlhbCBzdGF0dXMgdmVyaWZpY2F0aW9ucyB3aGVuIGVkaXRpbmcgYW4gZXhpc3Rpbmcgc3RlcC4gKi9cbiAgQElucHV0KCkgaW5pdGlhbFN0YXR1c1ZlcmlmaWNhdGlvbnM/OiBBcGlFZGl0U3RhdHVzVmVyaWZpY2F0aW9uUm93W107XG4gIC8qKiBJbml0aWFsIGFjdGl2ZSByZXNwb25zZSB2ZXJpZmljYXRpb24gdGFiIHdoZW4gZWRpdGluZyBhbiBleGlzdGluZyBzdGVwLiAqL1xuICBASW5wdXQoKSBpbml0aWFsQWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI/OiAncmVzcG9uc2UtYm9keScgfCAnc3RhdHVzJztcbiAgQElucHV0KCkgZWRpdE1vZGU/OiBib29sZWFuO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgY3JlYXRpbmcgdGhlIHN0ZXAgKEFQSSBpbiBwcm9ncmVzcyk7IHNob3cgbG9hZGVyIG9uIENyZWF0ZS9VcGRhdGUgYnV0dG9uICovXG4gIEBJbnB1dCgpIGlzQ3JlYXRpbmdTdGVwOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEVtaXRzIHRoZSBjVVJMIHN0cmluZyB3aGVuIHVzZXIgY2xpY2tzIEltcG9ydCAodmFsdWUgZnJvbSB0aGUgdGV4dGFyZWEgY29udHJvbCkuICovXG4gIEBPdXRwdXQoKSBpbXBvcnRDdXJsID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHVzZXIgY2FuY2VscyB0aGUgSW1wb3J0IGNVUkwgcGFuZWwgKGNsaWNrcyBDYW5jZWwpLiAqL1xuICBAT3V0cHV0KCkgaW1wb3J0Q3VybENhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdXNlciBjbGlja3MgU2VuZCBSZXF1ZXN0LCB3aXRoIGVudmlyb25tZW50LCBtZXRob2QsIHVybCwgYW5kIGhlYWRlcnMuICovXG4gIEBPdXRwdXQoKSBzZW5kUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8QXBpRWRpdFNlbmRSZXF1ZXN0UGF5bG9hZD4oKTtcbiAgQE91dHB1dCgpIGJhY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHVzZXIgY2xpY2tzIHRoZSBDYW5jZWwgYnV0dG9uIChzdGVwIDEpLiAqL1xuICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbmV4dCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdXNlciBjbGlja3MgQ3JlYXRlIHdpdGggYWxsIGVudGVyZWQgZGV0YWlsczogc3RlcDEgKGVudmlyb25tZW50LCBIVFRQIG1ldGhvZCwgVVJMLCBoZWFkZXJzLCBib2R5KSwgc3RlcDIgKHZhcmlhYmxlIG5hbWUpLCBzdGVwMyAodmVyaWZpY2F0aW9ucykuICovXG4gIEBPdXRwdXQoKSBjcmVhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPEFwaUVkaXRDcmVhdGVQYXlsb2FkPigpO1xuICAvKiogRW1pdHMgd2hlbmV2ZXIgaGVhZGVycyBjaGFuZ2UgKGFkZCwgcmVtb3ZlLCBvciBlZGl0KSBzbyB0aGUgcGFyZW50IGNhbiByZWZsZWN0IHRoZW0gaW4gdGhlIGNhbnZhcy9jb250cm9scy4gKi9cbiAgQE91dHB1dCgpIGhlYWRlcnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFwaUVkaXRIZWFkZXJSb3dbXT4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdGhlIGVudmlyb25tZW50IGRyb3Bkb3duIHNlbGVjdGlvbiBjaGFuZ2VzIChzZWxlY3RlZCB2YWx1ZS9pZCBvciBudWxsIGZvciBOb25lKSBzbyB0aGUgcGFyZW50IGNhbiBwcm92aWRlIHVybE9wdGlvbnMuICovXG4gIEBPdXRwdXQoKSBlbnZpcm9ubWVudENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVtYmVyIHwgbnVsbD4oKTtcblxuICAvKiogRm9ybSBjb250cm9sIGZvciBJbXBvcnQgY1VSTCB0ZXh0YXJlYTsgdmFsdWUgaXMgZW1pdHRlZCB3aGVuIHVzZXIgY2xpY2tzIEltcG9ydC4gKi9cbiAgcmVhZG9ubHkgaW1wb3J0Q3VybENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuXG4gIHZhcmlhYmxlTmFtZSA9ICcnO1xuICB2YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICB1cmxFcnJvciA9ICcnO1xuXG4gIC8qKiBDb250cm9scyB3aGljaCBib2R5IGNvbnRlbnQgaXMgdmlzaWJsZTogaGVhZGVycyAoZGVmYXVsdCkgb3IgaW1wb3J0LWN1cmwuICovXG4gIGJvZHlWaWV3OiBBcGlFZGl0Qm9keVZpZXcgPSAnaGVhZGVycyc7XG5cbiAgcmVhZG9ubHkgc3RlcExhYmVscyA9IFtcbiAgICB7IGluZGV4OiAxLCBsYWJlbDogQVBJX0VESVRfU1RFUF9MQUJFTFMuUkVRVUVTVF9ERVRBSUxTIH0sXG4gICAgeyBpbmRleDogMiwgbGFiZWw6IEFQSV9FRElUX1NURVBfTEFCRUxTLlNUT1JFX1JFU1BPTlNFIH0sXG4gICAgeyBpbmRleDogMywgbGFiZWw6IEFQSV9FRElUX1NURVBfTEFCRUxTLlZBTElEQVRJT04gfSxcbiAgXTtcbiAgY3VycmVudFN0ZXAgPSAxO1xuXG4gIC8qKiBUaGUgbGFiZWwgZm9yIHRoZSBjdXJyZW50IHN0ZXAgb25seSAodXNlZCB3aGVuIHNob3dpbmcgYSBzaW5nbGUgc3RlcCBpbiB0aGUgaW5kaWNhdG9yKS4gKi9cbiAgZ2V0IGFjdGl2ZVN0ZXBMYWJlbCgpOiB7IGluZGV4OiBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RlcExhYmVsc1t0aGlzLmN1cnJlbnRTdGVwIC0gMV07XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IG1pblN0ZXAgPSAxO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heFN0ZXAgPSAzO1xuXG4gIC8qKiBQZXJjZW50YWdlIHRvIHRyYW5zbGF0ZSB0aGUgc3RlcCBzdHJpcCAoMCwgLTMzLjMzMywgLTY2LjY2NikgZm9yIENTUyB0cmFuc2l0aW9uLiAqL1xuICBnZXQgc3RyaXBUcmFuc2xhdGVQZXJjZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRTdGVwIC0gMSkgKiAtMzMuMzMzO1xuICB9XG5cbiAgc2V0U3RlcChzdGVwOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoc3RlcCA+PSB0aGlzLm1pblN0ZXAgJiYgc3RlcCA8PSB0aGlzLm1heFN0ZXApIHtcbiAgICAgIHRoaXMuY3VycmVudFN0ZXAgPSBzdGVwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlJbml0aWFsU3RlcCh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjtcbiAgICBjb25zdCBjbGFtcGVkID0gTWF0aC5tYXgodGhpcy5taW5TdGVwLCBNYXRoLm1pbih0aGlzLm1heFN0ZXAsIE1hdGguZmxvb3IodmFsdWUpKSk7XG4gICAgdGhpcy5jdXJyZW50U3RlcCA9IGNsYW1wZWQ7XG4gIH1cblxuICAvKiogSFRUUCBtZXRob2Qgb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHdpdGggaWQsIG5hbWUsIHZhbHVlLCBsYWJlbCAocGFzc2VkIGZyb20gcGFyZW50KS4gKi9cbiAgQElucHV0KCkgaHR0cE1ldGhvZE9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIC8qKiBGb3JtIGZvciBIVFRQIG1ldGhvZCBzZWxlY3QgKGNxYS1keW5hbWljLXNlbGVjdCkgKi9cbiAgbWV0aG9kRm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogQ29uZmlnIGZvciBtZXRob2QgZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiBodHRwTWV0aG9kT3B0aW9ucyBjaGFuZ2VzIHRvIGF2b2lkIG5ldyByZWZlcmVuY2UgZXZlcnkgQ0QpICovXG4gIG1ldGhvZFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ21ldGhvZCcsXG4gICAgcGxhY2Vob2xkZXI6ICdNZXRob2QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlTWV0aG9kU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSAodGhpcy5odHRwTWV0aG9kT3B0aW9ucyA/PyBbXSkubWFwKChtKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihtKSk7XG4gICAgdGhpcy5tZXRob2RTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLm1ldGhvZFNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWV0aG9kVmFsdWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnMgPz8gW10pXG4gICAgICAubWFwKChtKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShtKSlcbiAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9IG51bGwpO1xuICB9XG5cbiAgLyoqIEZvcm0gZm9yIGVudmlyb25tZW50IHNlbGVjdCAoY3FhLWR5bmFtaWMtc2VsZWN0KSAqL1xuICBlbnZpcm9ubWVudEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIEVudmlyb25tZW50IG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB3aXRoIGlkLCBuYW1lLCB2YWx1ZSwgbGFiZWwgKHBhc3NlZCBmcm9tIHBhcmVudCkuICovXG4gIEBJbnB1dCgpIGVudmlyb25tZW50T3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgZW52aXJvbm1lbnRzIGFyZSBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbCAocHJvdmlkZWQgYnkgcGFyZW50KS4gKi9cbiAgQElucHV0KCkgaGFzTW9yZUVudmlyb25tZW50czogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgbG9hZGluZyBlbnZpcm9ubWVudHMgKHNlYXJjaCBvciBsb2FkIG1vcmUpLiAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFVSTCBmaWVsZCBvcHRpb25zIHdoZW4gYW4gZW52aXJvbm1lbnQgaXMgc2VsZWN0ZWQgKGJhc2UgVVJMICsgcGFyYW1ldGVycyBhcyAqfGtleXwpLiBQYXJlbnQgZmlsbHMgdGhpcyB3aGVuIGVudmlyb25tZW50Q2hhbmdlIGZpcmVzLiAqL1xuICBASW5wdXQoKSB1cmxPcHRpb25zOiBDcWFBdXRvY29tcGxldGVPcHRpb25bXSA9IFtdO1xuXG4gIC8qKiBDb25maWcgZm9yIGVudmlyb25tZW50IGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gZW52aXJvbm1lbnRPcHRpb25zIGNoYW5nZXMgdG8gYXZvaWQgbmV3IHJlZmVyZW5jZSBldmVyeSBDRCkgKi9cbiAgZW52aXJvbm1lbnRTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdlbnZpcm9ubWVudCcsXG4gICAgcGxhY2Vob2xkZXI6ICdFbnZpcm9ubWVudCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdG9TZWxlY3RPcHRpb24oaXRlbTogRW52aXJvbm1lbnRPcHRpb25JbnB1dCk6IFNlbGVjdE9wdGlvbiB7XG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgaWQ6IGl0ZW0sIHZhbHVlOiBpdGVtLCBuYW1lOiBpdGVtLCBsYWJlbDogaXRlbSB9O1xuICAgIH1cbiAgICBjb25zdCBvID0gaXRlbSBhcyBTZWxlY3RPcHRpb247XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBvLmlkID8/IG8udmFsdWUsXG4gICAgICB2YWx1ZTogby52YWx1ZSA/PyBvLmlkLFxuICAgICAgbmFtZTogby5uYW1lID8/IG8ubGFiZWwgPz8gU3RyaW5nKG8udmFsdWUgPz8gby5pZCksXG4gICAgICBsYWJlbDogby5sYWJlbCA/PyBvLm5hbWUgPz8gU3RyaW5nKG8udmFsdWUgPz8gby5pZCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldE9wdGlvblZhbHVlKGl0ZW06IEVudmlyb25tZW50T3B0aW9uSW5wdXQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHJldHVybiBpdGVtO1xuICAgIGNvbnN0IG8gPSBpdGVtIGFzIFNlbGVjdE9wdGlvbjtcbiAgICBjb25zdCB2ID0gby52YWx1ZSA/PyBvLmlkO1xuICAgIHJldHVybiB2ICE9IG51bGwgPyBTdHJpbmcodikgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVudmlyb25tZW50U2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSAodGhpcy5lbnZpcm9ubWVudE9wdGlvbnMgPz8gW10pLm1hcCgoZSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24oZSkpO1xuICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVFbnZpcm9ubWVudHMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRW52aXJvbm1lbnRzLFxuICAgICAgb25Mb2FkTW9yZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmVudmlyb25tZW50TG9hZE1vcmUuZW1pdCgpO1xuICAgICAgfSxcbiAgICAgIG9uU2VhcmNoOiAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmVudmlyb25tZW50U2VhcmNoLmVtaXQocXVlcnkpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbnZpcm9ubWVudFZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuICh0aGlzLmVudmlyb25tZW50T3B0aW9ucyA/PyBbXSlcbiAgICAgIC5tYXAoKGUpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGUpKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICAvKiogRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZW52aXJvbm1lbnRzIGZyb20gdGhlIGRyb3Bkb3duLiAqL1xuICBAT3V0cHV0KCkgZW52aXJvbm1lbnRTZWFyY2ggPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKiogRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgZW52aXJvbm1lbnRzLiAqL1xuICBAT3V0cHV0KCkgZW52aXJvbm1lbnRMb2FkTW9yZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogRm9ybSBmb3IgQXV0aCBUeXBlIHNlbGVjdCAoQXV0aG9yaXphdGlvbiB0YWIpICovXG4gIGF1dGhUeXBlRm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogQXV0aCB0eXBlIG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB3aXRoIGlkLCBuYW1lLCB2YWx1ZSwgbGFiZWwgKHBhc3NlZCBmcm9tIHBhcmVudCkuIEZhbGxzIGJhY2sgdG8gYnVpbHQtaW4gbGlzdCB3aGVuIGVtcHR5LiAqL1xuICBASW5wdXQoKSBhdXRoVHlwZU9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIC8qKiBJbml0aWFsIGF1dGggdHlwZSAoc3RyaW5nIG9yIG9wdGlvbiBvYmplY3QpLiBXaGVuIG5vdCBzZXQsIGZpcnN0IG9mIGF1dGhUeXBlT3B0aW9ucyBvciBkZWZhdWx0IFwiTm8gQXV0aFwiIGlzIHVzZWQuICovXG4gIEBJbnB1dCgpIGluaXRpYWxBdXRoVHlwZT86IHN0cmluZyB8IEVudmlyb25tZW50T3B0aW9uSW5wdXQ7XG5cbiAgLyoqIERlZmF1bHQgb3B0aW9ucyB3aGVuIGF1dGhUeXBlT3B0aW9ucyBpcyBlbXB0eSAoc2FtZSBzaGFwZSBhcyBlbnZpcm9ubWVudCkgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9BVVRIX1RZUEVfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ25vLWF1dGgnLCB2YWx1ZTogJ25vLWF1dGgnLCBuYW1lOiAnTm8gQXV0aCcsIGxhYmVsOiAnTm8gQXV0aCcgfSxcbiAgICB7IGlkOiAnYmVhcmVyJywgdmFsdWU6ICdiZWFyZXInLCBuYW1lOiAnQmVhcmVyIFRva2VuJywgbGFiZWw6ICdCZWFyZXIgVG9rZW4nIH0sXG4gICAgeyBpZDogJ29hdXRoMicsIHZhbHVlOiAnb2F1dGgyJywgbmFtZTogJ09BdXRoIDIuMCcsIGxhYmVsOiAnT0F1dGggMi4wJyB9LFxuICBdO1xuXG4gIC8qKiBDb25maWcgZm9yIEF1dGggVHlwZSBkcm9wZG93biAodXBkYXRlZCB3aGVuIGF1dGhUeXBlT3B0aW9ucyBjaGFuZ2VzLCBsaWtlIGVudmlyb25tZW50KSAqL1xuICBhdXRoVHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2F1dGhUeXBlJyxcbiAgICBwbGFjZWhvbGRlcjogJ05vIEF1dGgnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlQXV0aFR5cGVTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0aGlzLmF1dGhUeXBlT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuYXV0aFR5cGVPcHRpb25zLm1hcCgoYSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24oYSkpXG4gICAgICAgIDogWy4uLkFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfQVVUSF9UWVBFX09QVElPTlNdO1xuICAgIHRoaXMuYXV0aFR5cGVTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmF1dGhUeXBlU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdXRoVHlwZVZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMuYXV0aFR5cGVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5hdXRoVHlwZU9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9BVVRIX1RZUEVfT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKGEpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGEgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IGF1dGggdHlwZSB2YWx1ZSAoZS5nLiAnbm8tYXV0aCcpIGZvciB0ZW1wbGF0ZSAqL1xuICBnZXQgc2VsZWN0ZWRBdXRoVHlwZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHYgPSB0aGlzLmF1dGhUeXBlRm9ybT8uZ2V0KCdhdXRoVHlwZScpPy52YWx1ZTtcbiAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09ICcnKSByZXR1cm4gJ25vLWF1dGgnO1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyAodj8udmFsdWUgPz8gdj8uaWQgPz8gJ25vLWF1dGgnKSA6IFN0cmluZyh2KTtcbiAgfVxuXG4gIC8qKiBCZWFyZXIgdG9rZW4gdmFsdWUgKEF1dGhvcml6YXRpb24gdGFiLCB3aGVuIGF1dGggdHlwZSBpcyBCZWFyZXIgVG9rZW4pLiAqL1xuICBiZWFyZXJUb2tlbiA9ICcnO1xuXG4gIC8qKiBGb3JtIGZvciBPQXV0aCAyLjAgZmllbGRzIChBdXRob3JpemF0aW9uIHRhYiB3aGVuIGF1dGggdHlwZSBpcyBPQXV0aCAyLjApLiAqL1xuICBvYXV0aDJGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBHcmFudCB0eXBlIG9wdGlvbnMgZm9yIE9BdXRoIDIuMCAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBPQVVUSF9HUkFOVF9UWVBFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdjbGllbnRfY3JlZGVudGlhbHMnLCB2YWx1ZTogJ2NsaWVudF9jcmVkZW50aWFscycsIG5hbWU6ICdDbGllbnQgQ3JlZGVudGlhbHMnLCBsYWJlbDogJ0NsaWVudCBDcmVkZW50aWFscycgfSxcbiAgICB7IGlkOiAnYXV0aG9yaXphdGlvbl9jb2RlJywgdmFsdWU6ICdhdXRob3JpemF0aW9uX2NvZGUnLCBuYW1lOiAnQXV0aG9yaXphdGlvbiBDb2RlJywgbGFiZWw6ICdBdXRob3JpemF0aW9uIENvZGUnIH0sXG4gICAgeyBpZDogJ3Bhc3N3b3JkJywgdmFsdWU6ICdwYXNzd29yZCcsIG5hbWU6ICdQYXNzd29yZCcsIGxhYmVsOiAnUGFzc3dvcmQnIH0sXG4gICAgeyBpZDogJ2ltcGxpY2l0JywgdmFsdWU6ICdpbXBsaWNpdCcsIG5hbWU6ICdJbXBsaWNpdCcsIGxhYmVsOiAnSW1wbGljaXQnIH0sXG4gIF07XG5cbiAgLyoqIENsaWVudCBhdXRoZW50aWNhdGlvbiBtZXRob2Qgb3B0aW9ucyBmb3IgT0F1dGggMi4wICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE9BVVRIX0NMSUVOVF9BVVRIX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdiYXNpYycsIHZhbHVlOiAnYmFzaWMnLCBuYW1lOiAnU2VuZCBhcyBCYXNpYyBBdXRoIGhlYWRlcicsIGxhYmVsOiAnU2VuZCBhcyBCYXNpYyBBdXRoIGhlYWRlcicgfSxcbiAgICB7IGlkOiAnYm9keScsIHZhbHVlOiAnYm9keScsIG5hbWU6ICdTZW5kIGluIGJvZHknLCBsYWJlbDogJ1NlbmQgaW4gYm9keScgfSxcbiAgXTtcblxuICByZWFkb25seSBvYXV0aDJHcmFudFR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdncmFudFR5cGUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGdyYW50IHR5cGUnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5PQVVUSF9HUkFOVF9UWVBFX09QVElPTlNdLFxuICB9O1xuXG4gIHJlYWRvbmx5IG9hdXRoMkNsaWVudEF1dGhTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdjbGllbnRBdXRoZW50aWNhdGlvbicsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgbWV0aG9kJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuT0FVVEhfQ0xJRU5UX0FVVEhfT1BUSU9OU10sXG4gIH07XG5cbiAgLyoqIEN1cnJlbnQgSFRUUCBtZXRob2QgKGZyb20gZm9ybSBvciBkZWZhdWx0OiBmaXJzdCBvZiBodHRwTWV0aG9kT3B0aW9ucykuIFRyZWF0cyBlbXB0eSBzdHJpbmcgYXMgdW5zZXQuICovXG4gIGdldCBzZWxlY3RlZE1ldGhvZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5tZXRob2RGb3JtPy5nZXQoJ21ldGhvZCcpPy52YWx1ZTtcbiAgICBjb25zdCBmaXJzdFZhbHVlID0gdGhpcy5odHRwTWV0aG9kT3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnNbMF0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXNvbHZlZCA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09ICcnID8gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2YWx1ZSBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA6IFN0cmluZyh2YWx1ZSkpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXNvbHZlZCA/PyBmaXJzdFZhbHVlID8/ICdHRVQnO1xuICB9XG4gIHNldCBzZWxlY3RlZE1ldGhvZCh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLm1ldGhvZEZvcm0/LnBhdGNoVmFsdWUoeyBtZXRob2Q6IHYgfSk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoZSBzZWxlY3RlZCBIVFRQIG1ldGhvZCBpcyBHRVQsIEhFQUQsIG9yIERFTEVURSAobm8gcmVxdWVzdCBib2R5KS4gKi9cbiAgZ2V0IGlzTWV0aG9kV2l0aG91dEJvZHkoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5zZWxlY3RlZE1ldGhvZCAhPSBudWxsID8gU3RyaW5nKHRoaXMuc2VsZWN0ZWRNZXRob2QpLnRvVXBwZXJDYXNlKCkgOiAnJztcbiAgICByZXR1cm4gTUVUSE9EU19XSVRIT1VUX0JPRFkuaW5jbHVkZXMobWV0aG9kKTtcbiAgfVxuXG4gIC8qKiBDYWNoZWQgZW52aXJvbm1lbnQgdmFsdWUgZnJvbSBsYXN0IHNlbGVjdGlvbiAoc28gQ3JlYXRlIHBheWxvYWQgaGFzIHRoZSBzZWxlY3RlZCB2YWx1ZSkuICovXG4gIHByaXZhdGUgY3VycmVudEVudmlyb25tZW50VmFsdWUgPSAnJztcblxuICAvKiogQ2FjaGVkIEhUVFAgbWV0aG9kIGZyb20gbGFzdCBzZWxlY3Rpb24gKHNvIENyZWF0ZSBwYXlsb2FkIGhhcyB0aGUgc2VsZWN0ZWQgdmFsdWUpLiAqL1xuICBwcml2YXRlIGN1cnJlbnRNZXRob2RWYWx1ZSA9ICcnO1xuXG4gIC8qKiBDdXJyZW50IGVudmlyb25tZW50IChmcm9tIGZvcm0gb3IgZGVmYXVsdDogZmlyc3Qgb2YgZW52aXJvbm1lbnRPcHRpb25zKS4gVHJlYXRzIGVtcHR5IHN0cmluZyBhcyB1bnNldC4gKi9cbiAgZ2V0IHNlbGVjdGVkRW52aXJvbm1lbnQoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZW52aXJvbm1lbnRGb3JtPy5nZXQoJ2Vudmlyb25tZW50Jyk/LnZhbHVlO1xuICAgIGNvbnN0IGZpcnN0VmFsdWUgPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuZW52aXJvbm1lbnRPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSAnJyA/ICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodmFsdWUgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodmFsdWUpKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZWQgPz8gZmlyc3RWYWx1ZSA/PyAnRGV2ZWxvcG1lbnQnO1xuICB9XG4gIHNldCBzZWxlY3RlZEVudmlyb25tZW50KHY6IHN0cmluZykge1xuICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtPy5wYXRjaFZhbHVlKHsgZW52aXJvbm1lbnQ6IHYgfSk7XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBzZWxlY3RzIGFuIGVudmlyb25tZW50OyBrZWVwcyBjdXJyZW50RW52aXJvbm1lbnRWYWx1ZSBpbiBzeW5jLCBzZXRzIHJlcXVlc3QgVVJMIGZyb20gZW52aXJvbm1lbnQgd2hlbiBhdmFpbGFibGUsIGFuZCBub3RpZmllcyBwYXJlbnQgZm9yIHVybE9wdGlvbnMuICovXG4gIG9uRW52aXJvbm1lbnRTZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gZXZlbnQudmFsdWU7XG4gICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9XG4gICAgICB2ICE9IG51bGxcbiAgICAgICAgPyB0eXBlb2YgdiA9PT0gJ29iamVjdCdcbiAgICAgICAgICA/IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKVxuICAgICAgICAgIDogU3RyaW5nKHYpXG4gICAgICAgIDogJyc7XG5cbiAgICAvLyBDbGVhciBVUkwgZmllbGQgd2hlbiBlbnZpcm9ubWVudCBjaGFuZ2VzXG4gICAgdGhpcy51cmwgPSAnJztcbiAgICB0aGlzLnVybEVycm9yID0gJyc7IC8vIEFsc28gY2xlYXIgYW55IFVSTCB2YWxpZGF0aW9uIGVycm9yc1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgLy8gTm90aWZ5IHBhcmVudCBzbyBpdCBjYW4gcHJvdmlkZSB1cmxPcHRpb25zIChlbnZpcm9ubWVudCBwYXJhbWV0ZXJzIGZvciBcIkVudGVyIFVSTCBvciBzZWxlY3QgUGFyYW1ldGVyXCIpXG4gICAgY29uc3QgZW1pdFZhbCA9IHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgPT09ICcnIHx8IHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgPT09ICdub25lJ1xuICAgICAgPyBudWxsXG4gICAgICA6ICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/IHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgOiB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlKTtcbiAgICB0aGlzLmVudmlyb25tZW50Q2hhbmdlLmVtaXQoZW1pdFZhbCA9PT0gJ25vbmUnID8gbnVsbCA6IChlbWl0VmFsIGFzIHN0cmluZyB8IG51bWJlciB8IG51bGwpKTtcbiAgfVxuXG4gIC8qKiBXaGVuIHVzZXIgc2VsZWN0cyBhbiBvcHRpb24gZnJvbSB0aGUgVVJMIGF1dG9jb21wbGV0ZSAoZS5nLiBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgKnxrZXl8KSwgc2V0IHRoZSBVUkwgZmllbGQgdG8gdGhhdCB2YWx1ZS4gKi9cbiAgb25VcmxPcHRpb25TZWxlY3Qob3B0aW9uOiBDcWFBdXRvY29tcGxldGVPcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnVybCA9IG9wdGlvbi52YWx1ZSA/PyAnJztcbiAgICB0aGlzLnVybEVycm9yID0gJyc7IC8vIENsZWFyIGVycm9yIHdoZW4gb3B0aW9uIGlzIHNlbGVjdGVkXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgcmVxdWVzdCBVUkwgZm9yIHRoZSBzZWxlY3RlZCBlbnZpcm9ubWVudCBvcHRpb24uXG4gICAqIEVudmlyb25tZW50IG9wdGlvbnMgbWF5IGNhcnJ5IGFuIG9wdGlvbmFsIGB1cmxgIChlLmcuIGZyb20gRW52aXJvbm1lbnQgbW9kZWwpOyBcIk5vbmVcIiBoYXMgbm8gdXJsLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZEVudmlyb25tZW50VXJsKHNlbGVjdGVkVmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBvYmogPSBzZWxlY3RlZFZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHVybFByb3AgPSBvYmpbJ3VybCddO1xuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdXJsUHJvcCA9PT0gJ3N0cmluZycgJiYgdXJsUHJvcC50cmltKCkgIT09ICcnKSB7XG4gICAgICByZXR1cm4gdXJsUHJvcC50cmltKCk7XG4gICAgfVxuICAgIGNvbnN0IGlkT3JWYWx1ZSA9XG4gICAgICB0eXBlb2Ygc2VsZWN0ZWRWYWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoc2VsZWN0ZWRWYWx1ZSBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJylcbiAgICAgICAgOiBTdHJpbmcoc2VsZWN0ZWRWYWx1ZSk7XG4gICAgaWYgKCFpZE9yVmFsdWUgfHwgaWRPclZhbHVlID09PSAnbm9uZScpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG9wdGlvbiA9ICh0aGlzLmVudmlyb25tZW50T3B0aW9ucyA/PyBbXSkuZmluZChcbiAgICAgIChvcHQpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKG9wdCkgPT09IGlkT3JWYWx1ZVxuICAgICk7XG4gICAgY29uc3QgdXJsID0gb3B0aW9uICE9IG51bGwgJiYgdHlwZW9mIG9wdGlvbiA9PT0gJ29iamVjdCcgPyAob3B0aW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVsndXJsJ10gOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnICYmIHVybC50cmltKCkgIT09ICcnID8gdXJsLnRyaW0oKSA6IG51bGw7XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBzZWxlY3RzIGFuIEhUVFAgbWV0aG9kOyBrZWVwcyBjdXJyZW50TWV0aG9kVmFsdWUgaW4gc3luYyBmb3IgY3JlYXRlIHBheWxvYWQuICovXG4gIG9uTWV0aG9kU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KTogdm9pZCB7XG4gICAgY29uc3QgdiA9IGV2ZW50LnZhbHVlO1xuICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID1cbiAgICAgIHYgIT0gbnVsbFxuICAgICAgICA/IHR5cGVvZiB2ID09PSAnb2JqZWN0J1xuICAgICAgICAgID8gKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpXG4gICAgICAgICAgOiBTdHJpbmcodilcbiAgICAgICAgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgX3VybCA9ICcnO1xuXG4gIC8qKiBVUkwgZm9yIHRoZSByZXF1ZXN0LiBHZXR0ZXIvc2V0dGVyIHN5bmNzIHF1ZXJ5IHBhcmFtcyB3aXRoIHRoZSBQYXJhbXMgdGFiIChQb3N0bWFuLXN0eWxlKS4gKi9cbiAgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cbiAgc2V0IHVybCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgbmV4dCA9IHZhbHVlID8/ICcnO1xuICAgIGlmICh0aGlzLl91cmwgPT09IG5leHQpIHJldHVybjtcbiAgICB0aGlzLl91cmwgPSBuZXh0O1xuICAgIC8vIENsZWFyIGVycm9yIHdoZW4gVVJMIGNoYW5nZXNcbiAgICB0aGlzLnVybEVycm9yID0gJyc7XG4gICAgaWYgKHRoaXMucGFyYW1zRm9ybUFycmF5KSB7XG4gICAgICB0aGlzLnBhcmFtc1N5bmNpbmdGcm9tVXJsID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3luY1BhcmFtc0Zyb21VcmwoKTtcbiAgICAgIHRoaXMucGFyYW1zU3luY2luZ0Zyb21VcmwgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogV2hlbiB0cnVlLCBwYXJhbXMgZm9ybSBjaGFuZ2VzIHNob3VsZCBub3QgdXBkYXRlIHRoZSBVUkwgKHdlJ3JlIHN5bmNpbmcgZnJvbSBVUkwpLiAqL1xuICBwcml2YXRlIHBhcmFtc1N5bmNpbmdGcm9tVXJsID0gZmFsc2U7XG5cbiAgLyoqIFBsYWNlaG9sZGVyIGZvciB0aGUgVVJMIGZpZWxkOiBzaG93IFwiRW50ZXIgVVJMIG9yIHNlbGVjdCBQYXJhbWV0ZXIgKlwiIHdoZW4gdXJsT3B0aW9ucyBhcmUgYXZhaWxhYmxlIChlbnZpcm9ubWVudCBzZWxlY3RlZCkuICovXG4gIGdldCB1cmxQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiAodGhpcy51cmxPcHRpb25zPy5sZW5ndGggPz8gMCkgPiAwID8gJ0VudGVyIFVSTCBvciBzZWxlY3QgUGFyYW1ldGVyIConIDogJ0VudGVyIFVSTCAqJztcbiAgfVxuXG4gIHJlYWRvbmx5IHBheWxvYWRUYWJzOiB7IHZhbHVlOiBBcGlFZGl0UGF5bG9hZFRhYjsgbGFiZWw6IHN0cmluZyB9W10gPSBbXG4gICAgeyB2YWx1ZTogJ2F1dGhvcml6YXRpb24nLCBsYWJlbDogJ0F1dGhvcml6YXRpb24nIH0sXG4gICAgeyB2YWx1ZTogJ2hlYWRlcnMnLCBsYWJlbDogJ0hlYWRlcnMnIH0sXG4gICAgeyB2YWx1ZTogJ2JvZHknLCBsYWJlbDogJ0JvZHknIH0sXG4gICAgeyB2YWx1ZTogJ3BhcmFtcycsIGxhYmVsOiAnUGFyYW1zJyB9LFxuICBdO1xuICBhY3RpdmVQYXlsb2FkVGFiOiBBcGlFZGl0UGF5bG9hZFRhYiA9ICdoZWFkZXJzJztcblxuICAvKiogU3RlcCAzOiBSZXNwb25zZSB2ZXJpZmljYXRpb24gdGFicyAqL1xuICByZWFkb25seSByZXNwb25zZVZlcmlmaWNhdGlvblRhYnM6IHsgdmFsdWU6ICdyZXNwb25zZS1ib2R5JyB8ICdzdGF0dXMnOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtcbiAgICB7IHZhbHVlOiAncmVzcG9uc2UtYm9keScsIGxhYmVsOiAnUmVzcG9uc2UgQm9keScgfSxcbiAgICB7IHZhbHVlOiAnc3RhdHVzJywgbGFiZWw6ICdTdGF0dXMnIH0sXG4gIF07XG4gIGFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiOiAncmVzcG9uc2UtYm9keScgfCAnc3RhdHVzJyA9ICdyZXNwb25zZS1ib2R5JztcblxuICAvKiogUGF5bG9hZCB0eXBlIGZvciBCb2R5L1BhcmFtcy9BdXRob3JpemF0aW9uOiByYXcsIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCwgZm9ybS1kYXRhICovXG4gIHBheWxvYWRUeXBlOiAncmF3JyB8ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ2Zvcm0tZGF0YScgPSAncmF3JztcblxuICAvKiogU2VnbWVudCBvcHRpb25zIGZvciBwYXlsb2FkIHR5cGUgKHVzZWQgYnkgY3FhLXNlZ21lbnQtY29udHJvbCkgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZFR5cGVTZWdtZW50cyA9IFtcbiAgICB7IGxhYmVsOiAnUmF3JywgdmFsdWU6ICdyYXcnIH0sXG4gICAgeyBsYWJlbDogJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsIHZhbHVlOiAneC13d3ctZm9ybS11cmxlbmNvZGVkJyB9LFxuICAgIHsgbGFiZWw6ICdGb3JtIERhdGEnLCB2YWx1ZTogJ2Zvcm0tZGF0YScgfSxcbiAgXTtcblxuICBvblBheWxvYWRUeXBlQ2hhbmdlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wYXlsb2FkVHlwZSA9IHZhbCBhcyAncmF3JyB8ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ2Zvcm0tZGF0YSc7XG4gIH1cblxuICAvKiogRm9ybSBmb3IgRm9ybWF0IHNlbGVjdCAoQm9keS9QYXJhbXMvQXV0aG9yaXphdGlvbikgKi9cbiAgcGF5bG9hZEZvcm1hdEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIEZvcm1hdCBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgKHBhc3NlZCBmcm9tIHBhcmVudCkuIEZhbGxzIGJhY2sgdG8gSlNPTiwgWE1MLCBIVE1MLCBUZXh0IHdoZW4gZW1wdHkuICovXG4gIEBJbnB1dCgpIGZvcm1hdE9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIGluaXRpYWxGb3JtYXQ/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GT1JNQVRfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ2pzb24nLCB2YWx1ZTogJ2pzb24nLCBuYW1lOiAnSlNPTicsIGxhYmVsOiAnSlNPTicgfSxcbiAgICB7IGlkOiAneG1sJywgdmFsdWU6ICd4bWwnLCBuYW1lOiAnWE1MJywgbGFiZWw6ICdYTUwnIH0sXG4gICAgeyBpZDogJ2h0bWwnLCB2YWx1ZTogJ2h0bWwnLCBuYW1lOiAnSFRNTCcsIGxhYmVsOiAnSFRNTCcgfSxcbiAgICB7IGlkOiAndGV4dCcsIHZhbHVlOiAndGV4dCcsIG5hbWU6ICdUZXh0JywgbGFiZWw6ICdUZXh0JyB9LFxuICBdO1xuXG4gIC8qKiBDb25maWcgZm9yIEZvcm1hdCBkcm9wZG93biAodXBkYXRlZCB3aGVuIGZvcm1hdE9wdGlvbnMgY2hhbmdlcywgbGlrZSBNZXRob2QgZHJvcGRvd24pICovXG4gIHBheWxvYWRGb3JtYXRTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdmb3JtYXQnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9GT1JNQVRfT1BUSU9OU10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYXlsb2FkRm9ybWF0U2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgdGhpcy5mb3JtYXRPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5mb3JtYXRPcHRpb25zLm1hcCgoZikgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24oZikpXG4gICAgICAgIDogQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9GT1JNQVRfT1BUSU9OUztcbiAgICB0aGlzLnBheWxvYWRGb3JtYXRTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnBheWxvYWRGb3JtYXRTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEZvcm1hdFZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMuZm9ybWF0T3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuZm9ybWF0T3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVF9PUFRJT05TIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSk7XG4gICAgcmV0dXJuIHNvdXJjZVxuICAgICAgLm1hcCgoZikgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSlcbiAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9IG51bGwpO1xuICB9XG5cbiAgLyoqIFBheWxvYWQgdGV4dCBhcmVhIHZhbHVlIGZvciBCb2R5L1BhcmFtcy9BdXRob3JpemF0aW9uICovXG4gIHBheWxvYWRUZXh0ID0gJyc7XG5cbiAgLyoqIEpTT04gcGFyc2UgZXJyb3Igd2hlbiBmb3JtYXQgaXMgSlNPTiBhbmQgcGF5bG9hZCBpcyBpbnZhbGlkOyBudWxsIHdoZW4gdmFsaWQgb3Igbm90IEpTT04uICovXG4gIHBheWxvYWRKc29uRXJyb3I6IHtcbiAgICBsaW5lOiBudW1iZXI7XG4gICAgY29sdW1uOiBudW1iZXI7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGV4Y2VycHQ6IHN0cmluZztcbiAgICBjYXJldE9mZnNldDogbnVtYmVyO1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIExpbmUgbnVtYmVycyBmb3IgcGF5bG9hZCB0ZXh0YXJlYSAoMSwgMiwgMywgLi4uKSBiYXNlZCBvbiBjdXJyZW50IGxpbmUgY291bnQuICovXG4gIGdldCBwYXlsb2FkTGluZU51bWJlcnMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IG4gPSBNYXRoLm1heCgxLCAodGhpcy5wYXlsb2FkVGV4dCB8fCAnJykuc3BsaXQoL1xccj9cXG4vKS5sZW5ndGgpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuIH0sIChfLCBpKSA9PiBpICsgMSk7XG4gIH1cblxuICAvKiogV2hldGhlciBjdXJyZW50IHBheWxvYWQgZm9ybWF0IGlzIEpTT04gKHNvIHdlIHZhbGlkYXRlIGFuZCBzaG93IEpTT04gZWRpdG9yIGJlaGF2aW9yKS4gKi9cbiAgZ2V0IGlzUGF5bG9hZEZvcm1hdEpzb24oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZm9ybWF0ID0gdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybT8uZ2V0KCdmb3JtYXQnKT8udmFsdWU7XG4gICAgcmV0dXJuIGZvcm1hdCA9PT0gJ2pzb24nO1xuICB9XG5cbiAgLyoqIEVycm9yIG1lc3NhZ2VzIGZvciB0aGUgcGF5bG9hZCB0ZXh0YXJlYSAocmVkIGJvcmRlciArIGJvdHRvbSBsaW5lKS4gKi9cbiAgZ2V0IHBheWxvYWRKc29uRXJyb3JzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5wYXlsb2FkSnNvbkVycm9yID8gWydJbnZhbGlkIEpTT04gZm9ybWF0LiBQbGVhc2UgY2hlY2sgeW91ciBzeW50YXguJ10gOiBbXTtcbiAgfVxuXG4gIC8qKiBUb29sdGlwIGNvbnRlbnQgZm9yIHRoZSBsaW5lLWxldmVsIGVycm9yIGljb24gKHBhcnNlIGVycm9yIG9uIGxpbmUgWCwgZXhjZXJwdCwgY2FyZXQsIG1lc3NhZ2UpLiAqL1xuICBnZXQgcGF5bG9hZEpzb25FcnJvclRvb2x0aXAoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucGF5bG9hZEpzb25FcnJvcikgcmV0dXJuICcnO1xuICAgIGNvbnN0IGUgPSB0aGlzLnBheWxvYWRKc29uRXJyb3I7XG4gICAgY29uc3QgY2FyZXQgPSAnICcucmVwZWF0KGUuY2FyZXRPZmZzZXQpICsgJ14nO1xuICAgIHJldHVybiBgUGFyc2UgZXJyb3Igb24gbGluZSAke2UubGluZX06XFxuXFxuJHtlLmV4Y2VycHR9XFxuJHtjYXJldH1cXG5cXG4ke2UubWVzc2FnZX1gO1xuICB9XG5cbiAgb25QYXlsb2FkVGV4dENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wYXlsb2FkVGV4dCA9IHZhbHVlO1xuICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICB9XG5cbiAgb25QYXlsb2FkSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xuICAgIHRoaXMub25QYXlsb2FkVGV4dENoYW5nZSh0YXJnZXQ/LnZhbHVlID8/ICcnKTtcbiAgfVxuXG4gIG9uUGF5bG9hZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNQYXlsb2FkRm9ybWF0SnNvbikgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcbiAgICBjb25zdCBjbG9zZSA9IFBBWUxPQURfQVVUT19DTE9TRV9QQUlSU1trZXldO1xuICAgIGlmICghY2xvc2UpIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID8/IDA7XG4gICAgY29uc3QgZW5kID0gdGFyZ2V0LnNlbGVjdGlvbkVuZCA/PyBzdGFydDtcbiAgICBjb25zdCBiZWZvcmUgPSB0aGlzLnBheWxvYWRUZXh0LnNsaWNlKDAsIHN0YXJ0KTtcbiAgICBjb25zdCBhZnRlciA9IHRoaXMucGF5bG9hZFRleHQuc2xpY2UoZW5kKTtcbiAgICBjb25zdCBpbnNlcnRQb3MgPSBzdGFydCArIDE7XG4gICAgY29uc3QgbmV3VmFsdWUgPSBiZWZvcmUgKyBrZXkgKyBjbG9zZSArIGFmdGVyO1xuICAgIHRoaXMucGF5bG9hZFRleHQgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucGF5bG9hZFRleHRhcmVhUmVmPy5uYXRpdmVFbGVtZW50Py5zZXRTZWxlY3Rpb25SYW5nZShpbnNlcnRQb3MsIGluc2VydFBvcyk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKiogVmFsaWRhdGUgcGF5bG9hZCB3aGVuIGZvcm1hdCBpcyBKU09OOyBzZXRzIHBheWxvYWRKc29uRXJyb3Igb3IgY2xlYXJzIGl0LiAqL1xuICB2YWxpZGF0ZVBheWxvYWRKc29uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1BheWxvYWRGb3JtYXRKc29uKSB7XG4gICAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5wYXlsb2FkVGV4dCA/PyAnJztcbiAgICBpZiAodGV4dC50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmV4dHJhY3RQb3NpdGlvbkZyb21Kc29uRXJyb3IobWVzc2FnZSk7XG4gICAgICBjb25zdCB7IGxpbmUsIGNvbHVtbiB9ID0gdGhpcy5wb3NpdGlvblRvTGluZUNvbHVtbih0ZXh0LCBwb3NpdGlvbik7XG4gICAgICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgIGNvbnN0IGxpbmVJbmRleCA9IE1hdGgubWF4KDAsIGxpbmUgLSAxKTtcbiAgICAgIGNvbnN0IGxpbmVDb250ZW50ID0gbGluZXNbbGluZUluZGV4XSA/PyAnJztcbiAgICAgIGNvbnN0IGV4Y2VycHQgPSBsaW5lQ29udGVudCB8fCAnICc7XG4gICAgICBjb25zdCBjYXJldE9mZnNldCA9IGxpbmVJbmRleCA9PT0gbGluZSAtIDEgPyBNYXRoLm1pbihjb2x1bW4gLSAxLCBsaW5lQ29udGVudC5sZW5ndGgpIDogMDtcbiAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IHtcbiAgICAgICAgbGluZSxcbiAgICAgICAgY29sdW1uLFxuICAgICAgICBtZXNzYWdlOiB0aGlzLm5vcm1hbGl6ZUpzb25FcnJvck1lc3NhZ2UobWVzc2FnZSksXG4gICAgICAgIGV4Y2VycHQsXG4gICAgICAgIGNhcmV0T2Zmc2V0LFxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RQb3NpdGlvbkZyb21Kc29uRXJyb3IobWVzc2FnZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBtYXRjaCA9IG1lc3NhZ2UubWF0Y2goL3Bvc2l0aW9uXFxzKyhcXGQrKS9pKSB8fCBtZXNzYWdlLm1hdGNoKC9hdFxccytwb3NpdGlvblxccysoXFxkKykvaSk7XG4gICAgcmV0dXJuIG1hdGNoID8gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKSA6IDA7XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uVG9MaW5lQ29sdW1uKHRleHQ6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IHsgbGluZTogbnVtYmVyOyBjb2x1bW46IG51bWJlciB9IHtcbiAgICBjb25zdCBiZWZvcmUgPSB0ZXh0LnNsaWNlKDAsIE1hdGgubWluKHBvc2l0aW9uLCB0ZXh0Lmxlbmd0aCkpO1xuICAgIGNvbnN0IGxpbmVzID0gYmVmb3JlLnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgY29uc3QgbGluZSA9IGxpbmVzLmxlbmd0aDtcbiAgICBjb25zdCBsYXN0TGluZSA9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID8/ICcnO1xuICAgIHJldHVybiB7IGxpbmUsIGNvbHVtbjogbGFzdExpbmUubGVuZ3RoICsgMSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVKc29uRXJyb3JNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoJ0V4cGVjdGluZycpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoJ2V4cGVjdGluZycpKSByZXR1cm4gbWVzc2FnZTtcbiAgICBjb25zdCB0b2tlbk1hdGNoID0gbWVzc2FnZS5tYXRjaCgvVW5leHBlY3RlZCB0b2tlblxccytbJ1wiXT8oW14nXCJdKylbJ1wiXT8vaSlcbiAgICAgIHx8IG1lc3NhZ2UubWF0Y2goL3VuZXhwZWN0ZWQgY2hhcmFjdGVyLio/KFteXFxzXSspL2kpO1xuICAgIGNvbnN0IHRva2VuID0gdG9rZW5NYXRjaCA/IHRva2VuTWF0Y2hbMV0udHJpbSgpIDogJ3VuZGVmaW5lZCc7XG4gICAgcmV0dXJuIGBFeHBlY3RpbmcgJ1NUUklORycsICdOVU1CRVInLCAnTlVMTCcsICdUUlVFJywgJ0ZBTFNFJywgJ3snLCAnWycsIGdvdCAnJHt0b2tlbn0nYDtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3BheWxvYWRFZGl0b3JXaXRoTGluZXNSZWYnKSBwYXlsb2FkRWRpdG9yV2l0aExpbmVzUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BheWxvYWRUZXh0YXJlYVJlZicpIHBheWxvYWRUZXh0YXJlYVJlZj86IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9IRUFERVJfTkFNRV9PUFRJT05TOiBzdHJpbmdbXSA9IFtcbiAgICAnQWNjZXB0JyxcbiAgICAnQWNjZXB0LUNoYXJzZXQnLFxuICAgICdBY2NlcHQtRW5jb2RpbmcnLFxuICAgICdBY2NlcHQtTGFuZ3VhZ2UnLFxuICAgICdBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LUhlYWRlcnMnLFxuICAgICdBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LU1ldGhvZCcsXG4gICAgJ1NjcmlwdHMnLFxuICAgICdDYWNoZS1Db250cm9sJyxcbiAgICAnQ29udGVudC1NRDUnLFxuICAgICdDb250ZW50LUxlbmd0aCcsXG4gICAgJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLFxuICAgICdDb250ZW50LVR5cGUnLFxuICAgICdDb29raWUnLFxuICAgICdEYXRlJyxcbiAgICAnRXhwZWN0JyxcbiAgICAnRnJvbScsXG4gICAgJ0hvc3QnLFxuICAgICdJZi1NYXRjaCcsXG4gICAgJ0lmLU1vZGlmaWVkLVNpbmNlJyxcbiAgICAnSWYtTm9uZS1NYXRjaCcsXG4gICAgJ0lmLVVubW9kaWZpZWQtU2luY2UnLFxuICAgICdJZi1SYW5nZScsXG4gICAgJ0tlZXAtQWxpdmUnLFxuICAgICdNYXgtRm9yd2FyZHMnLFxuICAgICdPcmlnaW4nLFxuICAgICdQcmFnbWEnLFxuICAgICdQcm94eS1BdXRob3JpemF0aW9uJyxcbiAgICAnUmFuZ2UnLFxuICAgICdSZWZlcmVyJyxcbiAgICAnVEUnLFxuICAgICdUcmFpbGVyJyxcbiAgICAnVHJhbnNmZXItRW5jb2RpbmcnLFxuICAgICdVcGdyYWRlJyxcbiAgICAnVXNlci1BZ2VudCcsXG4gICAgJ1ZpYScsXG4gICAgJ1dhcm5pbmcnLFxuICAgICdYLVJlcXVlc3RlZC1XaXRoJyxcbiAgICAnWC1Eby1Ob3QtVHJhY2snLFxuICAgICdETlQnLFxuICAgICd4LWFwaS1rZXknLFxuICAgICdDb25uZWN0aW9uJyxcbiAgXTtcblxuICAvKiogSGVhZGVyIG5hbWUgb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHdpdGggaWQsIG5hbWUsIHZhbHVlLCBsYWJlbCAocGFzc2VkIGZyb20gcGFyZW50KS4gRmFsbHMgYmFjayB0byBidWlsdC1pbiBsaXN0IHdoZW4gZW1wdHkuICovXG4gIEBJbnB1dCgpIGhlYWRlck5hbWVPcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICAvKiogRm9ybSBhcnJheSBmb3IgaGVhZGVyIHJvd3M7IGVhY2ggaXRlbSBpcyBGb3JtR3JvdXAoeyBuYW1lLCB2YWx1ZSB9KSBmb3IgY3FhLWR5bmFtaWMtc2VsZWN0IGFuZCB2YWx1ZSBpbnB1dCAqL1xuICBoZWFkZXJzRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIC8qKiBUeXBlZCBhY2Nlc3NvciBmb3IgdGVtcGxhdGUgKEZvcm1BcnJheS5jb250cm9scyBpcyBBYnN0cmFjdENvbnRyb2xbXSkgKi9cbiAgZ2V0IGhlYWRlclJvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy5oZWFkZXJzRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogQ29uZmlnIGZvciBoZWFkZXIgbmFtZSBkcm9wZG93biAodXBkYXRlZCB3aGVuIGhlYWRlck5hbWVPcHRpb25zIGNoYW5nZXMgdG8gYXZvaWQgbmV3IHJlZmVyZW5jZSBldmVyeSBDRCkgKi9cbiAgaGVhZGVyTmFtZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ25hbWUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGhlYWRlcicsXG4gICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICBhbGxvd0N1c3RvbVZhbHVlOiB0cnVlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2UgPVxuICAgICAgdGhpcy5oZWFkZXJOYW1lT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuaGVhZGVyTmFtZU9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9IRUFERVJfTkFNRV9PUFRJT05TIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSk7XG4gICAgY29uc3QgYmFzZU9wdGlvbnMgPSBzb3VyY2UubWFwKChoKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihoKSk7XG4gICAgY29uc3QgYmFzZVZhbHVlcyA9IG5ldyBTZXQoYmFzZU9wdGlvbnMubWFwKChvKSA9PiBTdHJpbmcoby52YWx1ZSA/PyBvLmlkID8/ICcnKS50cmltKCkpLmZpbHRlcihCb29sZWFuKSk7XG4gICAgY29uc3QgY3VycmVudE5hbWVzRnJvbUZvcm0gPSB0aGlzLmdldEN1cnJlbnRIZWFkZXJOYW1lc0Zyb21Gb3JtKCk7XG4gICAgY29uc3QgZXh0cmFPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBjdXJyZW50TmFtZXNGcm9tRm9ybSkge1xuICAgICAgY29uc3Qga2V5ID0gbmFtZS50cmltKCk7XG4gICAgICBpZiAoa2V5ICYmICFiYXNlVmFsdWVzLmhhcyhrZXkpKSB7XG4gICAgICAgIGJhc2VWYWx1ZXMuYWRkKGtleSk7XG4gICAgICAgIGV4dHJhT3B0aW9ucy5wdXNoKHsgaWQ6IGtleSwgdmFsdWU6IGtleSwgbmFtZToga2V5LCBsYWJlbDoga2V5IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvcHRpb25zID0gWy4uLmJhc2VPcHRpb25zLCAuLi5leHRyYU9wdGlvbnNdO1xuICAgIHRoaXMuaGVhZGVyTmFtZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuaGVhZGVyTmFtZVNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDb2xsZWN0cyBkaXN0aW5jdCBub24tZW1wdHkgaGVhZGVyIG5hbWVzIGN1cnJlbnRseSBpbiB0aGUgaGVhZGVycyBmb3JtIChmb3IgZHluYW1pYyBvcHRpb25zKS4gKi9cbiAgcHJpdmF0ZSBnZXRDdXJyZW50SGVhZGVyTmFtZXNGcm9tRm9ybSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgbmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGlmICghdGhpcy5oZWFkZXJzRm9ybUFycmF5Py5jb250cm9scz8ubGVuZ3RoKSByZXR1cm4gbmFtZXM7XG4gICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5jb250cm9scykge1xuICAgICAgY29uc3QgbmFtZSA9IChjb250cm9sIGFzIEZvcm1Hcm91cCkuZ2V0KCduYW1lJyk/LnZhbHVlO1xuICAgICAgY29uc3Qgc3RyID0gbmFtZSAhPSBudWxsID8gU3RyaW5nKG5hbWUpLnRyaW0oKSA6ICcnO1xuICAgICAgaWYgKHN0ciAmJiAhc2Vlbi5oYXMoc3RyKSkge1xuICAgICAgICBzZWVuLmFkZChzdHIpO1xuICAgICAgICBuYW1lcy5wdXNoKHN0cik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdEhlYWRlcnM6IEFwaUVkaXRIZWFkZXJSb3dbXSA9IFtcbiAgICB7IG5hbWU6ICdDb250ZW50LVR5cGUnLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICBdO1xuXG4gIC8qKiBGb3JtIGFycmF5IGZvciBrZXktdmFsdWUgcm93cyAoQm9keSBwYXlsb2FkKTsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IGtleSwgdmFsdWUgfSkgKi9cbiAga2V5VmFsdWVGb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IGtleVZhbHVlUm93cygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLmtleVZhbHVlRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogRm9ybSBhcnJheSBmb3Iga2V5LXR5cGUtdmFsdWUgcm93czsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IGtleSwgdHlwZSwgdmFsdWUgfSkgKi9cbiAga2V5VHlwZVZhbHVlRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIGdldCBrZXlUeXBlVmFsdWVSb3dzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMua2V5VHlwZVZhbHVlRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogRm9ybSBhcnJheSBmb3IgUGFyYW1zIHRhYiBrZXktdmFsdWUgcm93czsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IGtleSwgdmFsdWUgfSkgKi9cbiAgcGFyYW1zRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIGdldCBwYXJhbXNSb3dzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMucGFyYW1zRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogQ29uZmlnIGZvciBUeXBlIGRyb3Bkb3duIGluIGtleS10eXBlLXZhbHVlIHJvd3MgKFRleHQsIEZpbGUpICovXG4gIHJlYWRvbmx5IGtleVR5cGVWYWx1ZVR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBwbGFjZWhvbGRlcjogJ1RleHQnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgaWQ6ICd0ZXh0JywgdmFsdWU6ICd0ZXh0JywgbmFtZTogJ1RleHQnLCBsYWJlbDogJ1RleHQnIH0sXG4gICAgICB7IGlkOiAnZmlsZScsIHZhbHVlOiAnZmlsZScsIG5hbWU6ICdGaWxlJywgbGFiZWw6ICdGaWxlJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgLyoqIEZvcm0gYXJyYXkgZm9yIHJlc3BvbnNlIGJvZHkgdmVyaWZpY2F0aW9uIHJvd3M7IGVhY2ggaXRlbSBpcyBGb3JtR3JvdXAoeyBqc29uUGF0aCwgdmVyaWZpY2F0aW9uLCBkYXRhVHlwZSwgZXhwZWN0ZWRWYWx1ZSB9KSAqL1xuICB2ZXJpZmljYXRpb25Gb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IHZlcmlmaWNhdGlvblJvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBWZXJpZmljYXRpb24gb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIChwYXNzZWQgZnJvbSBwYXJlbnQpLiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3Qgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgdmVyaWZpY2F0aW9uT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9WRVJJRklDQVRJT05fT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ2VxdWFscycsIHZhbHVlOiAnZXF1YWxzJywgbmFtZTogJ0VxdWFscycsIGxhYmVsOiAnRXF1YWxzJyB9LFxuICAgIHsgaWQ6ICdub3QtZXF1YWwnLCB2YWx1ZTogJ25vdC1lcXVhbCcsIG5hbWU6ICdOb3QgZXF1YWwnLCBsYWJlbDogJ05vdCBlcXVhbCcgfSxcbiAgICB7IGlkOiAnbGVzcy10aGFuJywgdmFsdWU6ICdsZXNzLXRoYW4nLCBuYW1lOiAnTGVzcyB0aGFuJywgbGFiZWw6ICdMZXNzIHRoYW4nIH0sXG4gICAgeyBpZDogJ2dyZWF0ZXItdGhhbicsIHZhbHVlOiAnZ3JlYXRlci10aGFuJywgbmFtZTogJ0dyZWF0ZXIgdGhhbicsIGxhYmVsOiAnR3JlYXRlciB0aGFuJyB9LFxuICAgIHsgaWQ6ICdpcy1udWxsJywgdmFsdWU6ICdpcy1udWxsJywgbmFtZTogJ0lzIG51bGwnLCBsYWJlbDogJ0lzIG51bGwnIH0sXG4gICAgeyBpZDogJ2lzLW5vdC1udWxsJywgdmFsdWU6ICdpcy1ub3QtbnVsbCcsIG5hbWU6ICdJcyBub3QgbnVsbCcsIGxhYmVsOiAnSXMgbm90IG51bGwnIH0sXG4gIF07XG5cbiAgLyoqIENvbmZpZyBmb3IgVmVyaWZpY2F0aW9uIGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gdmVyaWZpY2F0aW9uT3B0aW9ucyBjaGFuZ2VzLCBsaWtlIE1ldGhvZCBkcm9wZG93bikgKi9cbiAgdmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndmVyaWZpY2F0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ0VxdWFscycsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogWy4uLkFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfVkVSSUZJQ0FUSU9OX09QVElPTlNdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgdGhpcy52ZXJpZmljYXRpb25PcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy52ZXJpZmljYXRpb25PcHRpb25zLm1hcCgodikgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24odikpXG4gICAgICAgIDogQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9WRVJJRklDQVRJT05fT1BUSU9OUztcbiAgICB0aGlzLnZlcmlmaWNhdGlvblNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMudmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRWZXJpZmljYXRpb25WYWx1ZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNvdXJjZSA9XG4gICAgICB0aGlzLnZlcmlmaWNhdGlvbk9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnZlcmlmaWNhdGlvbk9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9WRVJJRklDQVRJT05fT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKHYpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFZlcmlmaWNhdGlvbigpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmVyaWZpY2F0aW9uVmFsdWVzKCk7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPiAwID8gdmFsdWVzWzBdIDogJ2VxdWFscyc7XG4gIH1cblxuICAvKiogRGF0YSBUeXBlIG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyAocGFzc2VkIGZyb20gcGFyZW50KS4gRmFsbHMgYmFjayB0byBidWlsdC1pbiBsaXN0IHdoZW4gZW1wdHkuICovXG4gIEBJbnB1dCgpIHZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9EQVRBX1RZUEVfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ3N0cmluZycsIHZhbHVlOiAnc3RyaW5nJywgbmFtZTogJ1N0cmluZycsIGxhYmVsOiAnU3RyaW5nJyB9LFxuICAgIHsgaWQ6ICdudW1iZXInLCB2YWx1ZTogJ251bWJlcicsIG5hbWU6ICdOdW1iZXInLCBsYWJlbDogJ051bWJlcicgfSxcbiAgICB7IGlkOiAnYm9vbGVhbicsIHZhbHVlOiAnYm9vbGVhbicsIG5hbWU6ICdCb29sZWFuJywgbGFiZWw6ICdCb29sZWFuJyB9LFxuICAgIHsgaWQ6ICdhcnJheScsIHZhbHVlOiAnYXJyYXknLCBuYW1lOiAnQXJyYXknLCBsYWJlbDogJ0FycmF5JyB9LFxuICAgIHsgaWQ6ICdvYmplY3QnLCB2YWx1ZTogJ29iamVjdCcsIG5hbWU6ICdPYmplY3QnLCBsYWJlbDogJ09iamVjdCcgfSxcbiAgXTtcblxuICAvKiogQ29uZmlnIGZvciBEYXRhIFR5cGUgZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiB2ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnMgY2hhbmdlcywgbGlrZSBNZXRob2QgZHJvcGRvd24pICovXG4gIHZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZGF0YVR5cGUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU3RyaW5nJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9EQVRBX1RZUEVfT1BUSU9OU10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVWZXJpZmljYXRpb25EYXRhVHlwZVNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID1cbiAgICAgIHRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnMubWFwKChkKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihkKSlcbiAgICAgICAgOiBBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0RBVEFfVFlQRV9PUFRJT05TO1xuICAgIHRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRhVHlwZVZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9EQVRBX1RZUEVfT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKGQpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGQgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdERhdGFUeXBlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXREYXRhVHlwZVZhbHVlcygpO1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlc1swXSA6ICdzdHJpbmcnO1xuICB9XG5cbiAgLyoqIENvbmZpZyBmb3IgRXhwZWN0ZWQgVmFsdWUgd2hlbiBEYXRhIFR5cGUgaXMgQm9vbGVhbiAodHJ1ZS9mYWxzZSBkcm9wZG93bikgKi9cbiAgcmVhZG9ubHkgdmVyaWZpY2F0aW9uRXhwZWN0ZWRWYWx1ZUJvb2xlYW5TZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdleHBlY3RlZFZhbHVlJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyBpZDogJ3RydWUnLCB2YWx1ZTogJ3RydWUnLCBuYW1lOiAndHJ1ZScsIGxhYmVsOiAndHJ1ZScgfSxcbiAgICAgIHsgaWQ6ICdmYWxzZScsIHZhbHVlOiAnZmFsc2UnLCBuYW1lOiAnZmFsc2UnLCBsYWJlbDogJ2ZhbHNlJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgLyoqIEZvcm0gYXJyYXkgZm9yIFN0YXR1cyB0YWIgdmVyaWZpY2F0aW9uIHJvd3M7IGVhY2ggaXRlbSBpcyBGb3JtR3JvdXAoeyB2ZXJpZmljYXRpb24sIGV4cGVjdGVkVmFsdWUgfSkgKi9cbiAgc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIGdldCBzdGF0dXNWZXJpZmljYXRpb25Sb3dzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogQ29uZmlnIGZvciBTdGF0dXMgdGFiIFZlcmlmaWNhdGlvbiBkcm9wZG93biAoRXF1YWxzLCBOb3QgZXF1YWwsIExlc3MgdGhhbiwgR3JlYXRlciB0aGFuKSAqL1xuICAvKiogU3RhdHVzIHRhYiBWZXJpZmljYXRpb24gb3B0aW9ucyAoRXF1YWxzLCBOb3QgZXF1YWwsIGV0Yy4pLiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3Qgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9TVEFUVVNfVkVSSUZJQ0FUSU9OX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdlcXVhbHMnLCB2YWx1ZTogJ2VxdWFscycsIG5hbWU6ICdFcXVhbHMnLCBsYWJlbDogJ0VxdWFscycgfSxcbiAgICB7IGlkOiAnbm90LWVxdWFsJywgdmFsdWU6ICdub3QtZXF1YWwnLCBuYW1lOiAnTm90IGVxdWFsJywgbGFiZWw6ICdOb3QgZXF1YWwnIH0sXG4gICAgeyBpZDogJ2xlc3MtdGhhbicsIHZhbHVlOiAnbGVzcy10aGFuJywgbmFtZTogJ0xlc3MgdGhhbicsIGxhYmVsOiAnTGVzcyB0aGFuJyB9LFxuICAgIHsgaWQ6ICdncmVhdGVyLXRoYW4nLCB2YWx1ZTogJ2dyZWF0ZXItdGhhbicsIG5hbWU6ICdHcmVhdGVyIHRoYW4nLCBsYWJlbDogJ0dyZWF0ZXIgdGhhbicgfSxcbiAgXTtcblxuICAvKiogQ29uZmlnIGZvciBTdGF0dXMgdGFiIFZlcmlmaWNhdGlvbiBkcm9wZG93biAodXBkYXRlZCB3aGVuIHN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnMgY2hhbmdlcykuICovXG4gIHN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3ZlcmlmaWNhdGlvbicsXG4gICAgcGxhY2Vob2xkZXI6ICdFcXVhbHMnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1NUQVRVU19WRVJJRklDQVRJT05fT1BUSU9OU10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnMubWFwKChvKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihvKSlcbiAgICAgICAgOiBBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1NUQVRVU19WRVJJRklDQVRJT05fT1BUSU9OUztcbiAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGF0dXNWZXJpZmljYXRpb25WYWx1ZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNvdXJjZSA9XG4gICAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9TVEFUVVNfVkVSSUZJQ0FUSU9OX09QVElPTlMgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdKTtcbiAgICByZXR1cm4gc291cmNlXG4gICAgICAubWFwKChvKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShvIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRTdGF0dXNWZXJpZmljYXRpb24oKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFN0YXR1c1ZlcmlmaWNhdGlvblZhbHVlcygpO1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlc1swXSA6ICdlcXVhbHMnO1xuICB9XG5cbiAgcmVzcG9uc2VQcmV2aWV3ID0gYGA7XG5cbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgcmVzcG9uc2UgcHJldmlldyBzZWN0aW9uLCB1c2VkIHRvIHNjcm9sbCBpbnRvIHZpZXcgYWZ0ZXIgU2VuZCBSZXF1ZXN0IGNvbXBsZXRlcy4gKi9cbiAgQFZpZXdDaGlsZCgncmVzcG9uc2VQcmV2aWV3UmVmJywgeyBzdGF0aWM6IGZhbHNlIH0pIHJlc3BvbnNlUHJldmlld1JlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIHByaXZhdGUgbWV0aG9kQ2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBmb3JtYXRDaGFuZ2VzU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGhlYWRlck5hbWVPcHRpb25zQ2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBlbnZpcm9ubWVudEZvcm1DaGFuZ2VzU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIG1ldGhvZEZvcm1DaGFuZ2VzU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHBhcmFtc0Zvcm1BcnJheUNoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG5cbiAgLy8gQWR2YW5jZWQgc2V0dGluZ3M6IGdlbmVyaWMgYWR2YW5jZWQgdmFyaWFibGVzIGZvciB0aGlzIEFQSSBzdGVwIChjYW4gYmUgcHJvdmlkZWQgYnkgcGFyZW50KVxuICBhZHZhbmNlZEV4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogYW55W10gPSBbXTtcbiAgYWR2YW5jZWRWYXJpYWJsZXNGb3JtOiBGb3JtQXJyYXkgPSBuZXcgRm9ybUFycmF5KFtdKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFwcGx5SW5pdGlhbFN0ZXAodGhpcy5pbml0aWFsU3RlcCk7XG4gICAgdGhpcy51cGRhdGVNZXRob2RTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLnVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTtcbiAgICBjb25zdCBmaXJzdE1ldGhvZFZhbHVlID0gdGhpcy5odHRwTWV0aG9kT3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnNbMF0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZWZhdWx0TWV0aG9kID0gdGhpcy5pbml0aWFsTWV0aG9kID8/IGZpcnN0TWV0aG9kVmFsdWUgPz8gJ0dFVCc7XG4gICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSB0eXBlb2YgZGVmYXVsdE1ldGhvZCA9PT0gJ3N0cmluZycgPyBkZWZhdWx0TWV0aG9kIDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGRlZmF1bHRNZXRob2QgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpO1xuICAgIHRoaXMubWV0aG9kRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgbWV0aG9kOiBbZGVmYXVsdE1ldGhvZF0sXG4gICAgfSk7XG4gICAgY29uc3QgZmlyc3RWYWx1ZSA9IHRoaXMuZW52aXJvbm1lbnRPcHRpb25zPy5sZW5ndGhcbiAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5lbnZpcm9ubWVudE9wdGlvbnNbMF0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZWZhdWx0RW52ID0gdGhpcy5pbml0aWFsRW52aXJvbm1lbnQgPz8gZmlyc3RWYWx1ZSA/PyAnRGV2ZWxvcG1lbnQnO1xuICAgIHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgPSB0eXBlb2YgZGVmYXVsdEVudiA9PT0gJ3N0cmluZycgPyBkZWZhdWx0RW52IDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGRlZmF1bHRFbnYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpO1xuICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBlbnZpcm9ubWVudDogW2RlZmF1bHRFbnZdLFxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlQXV0aFR5cGVTZWxlY3RDb25maWcoKTtcbiAgICBjb25zdCBmaXJzdEF1dGhWYWx1ZSA9IHRoaXMuZ2V0QXV0aFR5cGVWYWx1ZXMoKVswXTtcbiAgICBjb25zdCBkZWZhdWx0QXV0aFR5cGUgPSB0aGlzLmluaXRpYWxBdXRoVHlwZSA/PyBmaXJzdEF1dGhWYWx1ZSA/PyAnbm8tYXV0aCc7XG4gICAgdGhpcy5hdXRoVHlwZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGF1dGhUeXBlOiBbZGVmYXVsdEF1dGhUeXBlXSxcbiAgICB9KTtcbiAgICB0aGlzLm9hdXRoMkZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGdyYW50VHlwZTogWydjbGllbnRfY3JlZGVudGlhbHMnXSxcbiAgICAgIGFjY2Vzc1Rva2VuVXJsOiBbJyddLFxuICAgICAgY2xpZW50SWQ6IFsnJ10sXG4gICAgICBjbGllbnRTZWNyZXQ6IFsnJ10sXG4gICAgICBzY29wZTogWycnXSxcbiAgICAgIGNsaWVudEF1dGhlbnRpY2F0aW9uOiBbJ2Jhc2ljJ10sXG4gICAgfSk7XG4gICAgdGhpcy5lbnZpcm9ubWVudEZvcm1DaGFuZ2VzU3ViID0gdGhpcy5lbnZpcm9ubWVudEZvcm0uZ2V0KCdlbnZpcm9ubWVudCcpPy52YWx1ZUNoYW5nZXM/LnN1YnNjcmliZSgodjogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3QgcyA9IHYgIT0gbnVsbCAmJiB2ICE9PSAnJyA/ICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpIDogU3RyaW5nKHYpKSA6ICcnO1xuICAgICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9IHMgPz8gJyc7XG4gICAgfSk7XG4gICAgdGhpcy5tZXRob2RGb3JtQ2hhbmdlc1N1YiA9IHRoaXMubWV0aG9kRm9ybS5nZXQoJ21ldGhvZCcpPy52YWx1ZUNoYW5nZXM/LnN1YnNjcmliZSgodjogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3QgcyA9IHYgIT0gbnVsbCAmJiB2ICE9PSAnJyA/ICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpIDogU3RyaW5nKHYpKSA6ICcnO1xuICAgICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSBzID8/ICcnO1xuICAgIH0pO1xuICAgIHRoaXMuYnVpbGRIZWFkZXJzRm9ybUFycmF5KFxuICAgICAgdGhpcy5pbml0aWFsSGVhZGVycyA/PyBbeyBuYW1lOiAnJywgdHlwZTogJ3N0cmluZycsIHZhbHVlOiAnJyB9XVxuICAgICk7XG4gICAgdGhpcy5oZWFkZXJOYW1lT3B0aW9uc0NoYW5nZXNTdWIgPSB0aGlzLmhlYWRlcnNGb3JtQXJyYXk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgICAgdGhpcy5oZWFkZXJzQ2hhbmdlLmVtaXQodGhpcy5oZWFkZXJzKTtcbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLmhlYWRlcnNDaGFuZ2UuZW1pdCh0aGlzLmhlYWRlcnMpO1xuICAgIHRoaXMudXBkYXRlRW52aXJvbm1lbnRTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLnVwZGF0ZVBheWxvYWRGb3JtYXRTZWxlY3RDb25maWcoKTtcbiAgICBjb25zdCBmaXJzdEZvcm1hdFZhbHVlID0gdGhpcy5nZXRGb3JtYXRWYWx1ZXMoKVswXTtcbiAgICBjb25zdCBkZWZhdWx0Rm9ybWF0ID0gdGhpcy5pbml0aWFsRm9ybWF0ID8/IGZpcnN0Rm9ybWF0VmFsdWUgPz8gJ2pzb24nO1xuICAgIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0gPSB0aGlzLmZiLmdyb3VwKHsgZm9ybWF0OiBbZGVmYXVsdEZvcm1hdF0gfSk7XG5cbiAgICAvLyBJbml0aWFsaXplIHBheWxvYWQgdHlwZSBhbmQgdGV4dCBmcm9tIGlucHV0cyB3aGVuIGVkaXRpbmdcbiAgICBpZiAodGhpcy5pbml0aWFsUGF5bG9hZFR5cGUpIHtcbiAgICAgIHRoaXMucGF5bG9hZFR5cGUgPSB0aGlzLmluaXRpYWxQYXlsb2FkVHlwZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5pdGlhbFBheWxvYWRUZXh0ICE9IG51bGwpIHtcbiAgICAgIHRoaXMucGF5bG9hZFRleHQgPSB0aGlzLmluaXRpYWxQYXlsb2FkVGV4dDtcbiAgICB9XG5cbiAgICB0aGlzLmJ1aWxkS2V5VmFsdWVGb3JtQXJyYXkoKTtcbiAgICB0aGlzLmJ1aWxkS2V5VHlwZVZhbHVlRm9ybUFycmF5KCk7XG4gICAgdGhpcy5idWlsZFBhcmFtc0Zvcm1BcnJheSgpO1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5Q2hhbmdlc1N1YiA9IHRoaXMucGFyYW1zRm9ybUFycmF5LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCgpID0+IHRoaXMuc3luY1VybEZyb21QYXJhbXMoKSk7XG4gICAgaWYgKHRoaXMuaW5pdGlhbFVybCAhPSBudWxsICYmIHRoaXMuaW5pdGlhbFVybCAhPT0gJycpIHtcbiAgICAgIHRoaXMuX3VybCA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmRlY29kZVVybEZvckRpc3BsYXkodGhpcy5pbml0aWFsVXJsKTtcbiAgICAgIHRoaXMuc3luY1BhcmFtc0Zyb21VcmwoKTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZSB2YXJpYWJsZU5hbWUgZnJvbSBpbml0aWFsVmFyaWFibGVOYW1lXG4gICAgaWYgKHRoaXMuaW5pdGlhbFZhcmlhYmxlTmFtZSAhPSBudWxsICYmIHRoaXMuaW5pdGlhbFZhcmlhYmxlTmFtZSAhPT0gJycpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lID0gdGhpcy5pbml0aWFsVmFyaWFibGVOYW1lO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVZlcmlmaWNhdGlvblNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMudXBkYXRlVmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcoKTtcblxuICAgIC8vIEluaXRpYWxpemUgdmVyaWZpY2F0aW9uIHJvd3MgZnJvbSBpbnB1dHMgd2hlbiBwcm92aWRlZDsgb3RoZXJ3aXNlIGJ1aWxkIGRlZmF1bHRzXG4gICAgY29uc3QgYm9keVJvd3MgPVxuICAgICAgdGhpcy5pbml0aWFsUmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9ucyAmJiB0aGlzLmluaXRpYWxSZXNwb25zZUJvZHlWZXJpZmljYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLmluaXRpYWxSZXNwb25zZUJvZHlWZXJpZmljYXRpb25zXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuYnVpbGRWZXJpZmljYXRpb25Gb3JtQXJyYXkoYm9keVJvd3MpO1xuXG4gICAgdGhpcy51cGRhdGVTdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTtcbiAgICBjb25zdCBzdGF0dXNSb3dzID1cbiAgICAgIHRoaXMuaW5pdGlhbFN0YXR1c1ZlcmlmaWNhdGlvbnMgJiYgdGhpcy5pbml0aWFsU3RhdHVzVmVyaWZpY2F0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5pbml0aWFsU3RhdHVzVmVyaWZpY2F0aW9uc1xuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJ1aWxkU3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5KHN0YXR1c1Jvd3MpO1xuICAgIHRoaXMubWV0aG9kQ2hhbmdlc1N1YiA9IHRoaXMubWV0aG9kRm9ybS5nZXQoJ21ldGhvZCcpPy52YWx1ZUNoYW5nZXM/LnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgbWV0aG9kID0gdmFsdWUgIT0gbnVsbCA/IFN0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKSA6ICcnO1xuICAgICAgaWYgKE1FVEhPRFNfV0lUSE9VVF9CT0RZLmluY2x1ZGVzKG1ldGhvZCkgJiYgdGhpcy5hY3RpdmVQYXlsb2FkVGFiICE9PSAnaGVhZGVycycpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gJ2hlYWRlcnMnO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5mb3JtYXRDaGFuZ2VzU3ViID0gdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5nZXQoJ2Zvcm1hdCcpPy52YWx1ZUNoYW5nZXM/LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICB9KTtcbiAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcblxuICAgIC8vIEluaXRpYWxpemUgYWN0aXZlIHJlc3BvbnNlIHZlcmlmaWNhdGlvbiB0YWIgZnJvbSBpbnB1dCB3aGVuIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMuaW5pdGlhbEFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiKSB7XG4gICAgICB0aGlzLmFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiID0gdGhpcy5pbml0aWFsQWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgYWR2YW5jZWQgc2V0dGluZ3MgZm9ybSBvbmx5IGZyb20gaW5wdXQgdmFyaWFibGVzIChubyBsb2NhbCBpbml0aWFsaXphdGlvbilcbiAgICBpZiAodGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzICYmIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0dXBQYXlsb2FkVGV4dGFyZWFTY3JvbGxTeW5jKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm1ldGhvZENoYW5nZXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5mb3JtYXRDaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaGVhZGVyTmFtZU9wdGlvbnNDaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtQ2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm1ldGhvZEZvcm1DaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5Q2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKiBTeW5jIGxpbmUgbnVtYmVycyBjb2x1bW4gc2Nyb2xsIHdpdGggcGF5bG9hZCB0ZXh0YXJlYSBzY3JvbGwgKFBvc3RtYW4tc3R5bGUpLiAqL1xuICBwcml2YXRlIHNldHVwUGF5bG9hZFRleHRhcmVhU2Nyb2xsU3luYygpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLnBheWxvYWRFZGl0b3JXaXRoTGluZXNSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWhvc3QpIHJldHVybjtcbiAgICAgIGNvbnN0IGxpbmVOdW1iZXJzRWwgPSBob3N0LnF1ZXJ5U2VsZWN0b3IoJy5jcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWxpbmUtbnVtYmVycycpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGNvbnN0IHRleHRhcmVhID0gaG9zdC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpIGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKCFsaW5lTnVtYmVyc0VsIHx8ICF0ZXh0YXJlYSkgcmV0dXJuO1xuICAgICAgdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgICBsaW5lTnVtYmVyc0VsLnNjcm9sbFRvcCA9IHRleHRhcmVhLnNjcm9sbFRvcDtcbiAgICAgIH0pO1xuICAgICAgbGluZU51bWJlcnNFbC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB7XG4gICAgICAgIHRleHRhcmVhLnNjcm9sbFRvcCA9IGxpbmVOdW1iZXJzRWwuc2Nyb2xsVG9wO1xuICAgICAgfSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkS2V5VmFsdWVGb3JtQXJyYXkocm93cz86IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdKTogdm9pZCB7XG4gICAgY29uc3QgaW5pdGlhbCA9IHJvd3MgPz8gW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dO1xuICAgIGNvbnN0IGdyb3VwcyA9IGluaXRpYWwubWFwKChyKSA9PiB0aGlzLmZiLmdyb3VwKHsga2V5OiBbci5rZXldLCB2YWx1ZTogW3IudmFsdWVdIH0pKTtcbiAgICB0aGlzLmtleVZhbHVlRm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShncm91cHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEtleVR5cGVWYWx1ZUZvcm1BcnJheShyb3dzPzogeyBrZXk6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuICAgIGNvbnN0IGluaXRpYWwgPSByb3dzID8/IFt7IGtleTogJycsIHR5cGU6ICd0ZXh0JywgdmFsdWU6ICcnIH1dO1xuICAgIGNvbnN0IGdyb3VwcyA9IGluaXRpYWwubWFwKChyKSA9PiB0aGlzLmZiLmdyb3VwKHsga2V5OiBbci5rZXldLCB0eXBlOiBbci50eXBlXSwgdmFsdWU6IFtyLnZhbHVlXSB9KSk7XG4gICAgdGhpcy5rZXlUeXBlVmFsdWVGb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KGdyb3Vwcyk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUGFyYW1zRm9ybUFycmF5KHJvd3M/OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuICAgIGNvbnN0IGluaXRpYWwgPSByb3dzID8/IFt7IGtleTogJycsIHZhbHVlOiAnJyB9XTtcbiAgICBjb25zdCBncm91cHMgPSBpbml0aWFsLm1hcCgocikgPT4gdGhpcy5mYi5ncm91cCh7IGtleTogW3Iua2V5XSwgdmFsdWU6IFtyLnZhbHVlXSB9KSk7XG4gICAgaWYgKHRoaXMucGFyYW1zRm9ybUFycmF5KSB7XG4gICAgICB0aGlzLnBhcmFtc0Zvcm1BcnJheS5jbGVhcigpO1xuICAgICAgZ3JvdXBzLmZvckVhY2goKGcpID0+IHRoaXMucGFyYW1zRm9ybUFycmF5LnB1c2goZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcmFtc0Zvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoZ3JvdXBzKTtcbiAgICB9XG4gIH1cblxuICAvKiogVHJ1ZSBpZiBVUkwgaXMgYSBwYXJhbWV0ZXIgcGxhY2Vob2xkZXIgKGUuZy4gKnxwYXJhbXwpOyBtdXN0IG5vdCBiZSBwYXJzZWQgd2l0aCBVUkwoKSB3aGljaCBlbmNvZGVzIHwgdG8gJTdDLiAqL1xuICBwcml2YXRlIHN0YXRpYyBpc1BhcmFtZXRlclVybCh1cmxTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdXJsU3RyIHx8IHR5cGVvZiB1cmxTdHIgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIC8oXFwqXFx8W1xcdy1dK1xcfChcXCopP3xcXCRcXHxbXFx3LV0rXFx8KFxcKik/fEBcXHxbXFx3LV0rXFx8KFxcKik/fFxcJFxce1tefV0rXFx9KS8udGVzdCh1cmxTdHIudHJpbSgpKTtcbiAgfVxuXG4gIC8qKiBEZWNvZGUgVVJMIGZvciBkaXNwbGF5L3BheWxvYWQ6IHN0cmlwIC8qIHByZWZpeCBhbmQgZGVjb2RlICU3QyB0byB8IHNvICp8cGFyYW18IHNob3dzIGNvcnJlY3RseS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZGVjb2RlVXJsRm9yRGlzcGxheShyYXc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ3N0cmluZycpIHJldHVybiAnJztcbiAgICBsZXQgcyA9IHJhdy50cmltKCk7XG4gICAgaWYgKCFzKSByZXR1cm4gJyc7XG4gICAgaWYgKHMuc3RhcnRzV2l0aCgnLyonKSkgcyA9IHMuc2xpY2UoMikudHJpbSgpO1xuICAgIGlmIChzLmluY2x1ZGVzKCclN0MnKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcyA9IGRlY29kZVVSSUNvbXBvbmVudChzKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBsZWF2ZSBhcy1pcyAqL1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcztcbiAgfVxuXG4gIC8qKiBQYXJzZSBVUkwgaW50byBiYXNlICh3aXRob3V0IHF1ZXJ5L2ZyYWdtZW50KSBhbmQgcXVlcnkga2V5LXZhbHVlIHBhaXJzLiBQcmVzZXJ2ZXMgcmVsYXRpdmUgVVJMcyBhbmQgcGFyYW1ldGVyIHBsYWNlaG9sZGVycy4gKi9cbiAgcHJpdmF0ZSBwYXJzZVF1ZXJ5UGFyYW1zRnJvbVVybCh1cmxTdHI6IHN0cmluZyk6IHsgYmFzZVVybDogc3RyaW5nOyByb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB9IHtcbiAgICBjb25zdCB0cmltbWVkID0gdXJsU3RyPy50cmltKCkgPz8gJyc7XG4gICAgY29uc3QgZW1wdHkgPSB7IGJhc2VVcmw6IHRyaW1tZWQgfHwgdXJsU3RyLCByb3dzOiBbeyBrZXk6ICcnLCB2YWx1ZTogJycgfV0gfTtcbiAgICBpZiAoIXRyaW1tZWQpIHJldHVybiBlbXB0eTtcbiAgICBpZiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuaXNQYXJhbWV0ZXJVcmwodXJsU3RyKSkgcmV0dXJuIGVtcHR5O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpc0Fic29sdXRlID0gL15odHRwcz86XFwvXFwvL2kudGVzdCh0cmltbWVkKTtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodXJsU3RyLCAnaHR0cDovL2xvY2FsaG9zdCcpO1xuICAgICAgY29uc3QgYmFzZVVybCA9IGlzQWJzb2x1dGUgPyB1cmwub3JpZ2luICsgdXJsLnBhdGhuYW1lIDogdXJsLnBhdGhuYW1lO1xuICAgICAgY29uc3Qgcm93czogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICByb3dzLnB1c2goeyBrZXksIHZhbHVlIH0pO1xuICAgICAgfSk7XG4gICAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHJvd3MucHVzaCh7IGtleTogJycsIHZhbHVlOiAnJyB9KTtcbiAgICAgIHJldHVybiB7IGJhc2VVcmwsIHJvd3MgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBlbXB0eTtcbiAgICB9XG4gIH1cblxuICAvKiogR2V0IGJhc2UgVVJMICh3aXRob3V0IHF1ZXJ5L2ZyYWdtZW50KSBmb3IgYnVpbGRpbmcgVVJMIGZyb20gcGFyYW1zLiBQcmVzZXJ2ZXMgcmVsYXRpdmUgVVJMcyBhbmQgcGFyYW1ldGVyIHBsYWNlaG9sZGVycy4gKi9cbiAgcHJpdmF0ZSBnZXRCYXNlVXJsKHVybFN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXVybFN0ciB8fCAhdXJsU3RyLnRyaW0oKSkgcmV0dXJuIHVybFN0cjtcbiAgICBpZiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuaXNQYXJhbWV0ZXJVcmwodXJsU3RyKSkgcmV0dXJuIHVybFN0ci50cmltKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlzQWJzb2x1dGUgPSAvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KHVybFN0ci50cmltKCkpO1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh1cmxTdHIsICdodHRwOi8vbG9jYWxob3N0Jyk7XG4gICAgICByZXR1cm4gaXNBYnNvbHV0ZSA/IHVybC5vcmlnaW4gKyB1cmwucGF0aG5hbWUgOiB1cmwucGF0aG5hbWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdXJsU3RyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHBheWxvYWQgZm9ybWF0IGRyb3Bkb3duIHVzaW5nIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIGZpcnN0LCB0aGVuXG4gICAqIGZhbGwgYmFjayB0byBpbnNwZWN0aW5nIHRoZSBib2R5IGNvbnRlbnQgKEpTT04gYnJhY2VzLCBYTUwgdGFncywgSFRNTCBkb2N0eXBlKS5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlCb2R5Rm9ybWF0KGJvZHk6IHN0cmluZywgY29udGVudFR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1hdFZhbHVlcyA9IHRoaXMuZ2V0Rm9ybWF0VmFsdWVzKCk7XG4gICAgaWYgKCF0aGlzLnBheWxvYWRGb3JtYXRGb3JtIHx8IGZvcm1hdFZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBjdCA9IChjb250ZW50VHlwZSA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBzZXRGbXQgPSAoZm10OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChmb3JtYXRWYWx1ZXMuaW5jbHVkZXMoZm10KSkgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiBmbXQgfSk7XG4gICAgfTtcbiAgICAvLyBDb250ZW50LVR5cGUgdGFrZXMgcHJpb3JpdHlcbiAgICBpZiAoY3QuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSB8fCBjdC5pbmNsdWRlcygndGV4dC9qc29uJykpICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRGbXQoJ2pzb24nKTtcbiAgICBpZiAoY3QuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL3htbCcpIHx8IGN0LmluY2x1ZGVzKCd0ZXh0L3htbCcpIHx8IGN0LmluY2x1ZGVzKCd4aHRtbCcpKSByZXR1cm4gc2V0Rm10KCd4bWwnKTtcbiAgICBpZiAoY3QuaW5jbHVkZXMoJ3RleHQvaHRtbCcpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEZtdCgnaHRtbCcpO1xuICAgIGlmIChjdC5pbmNsdWRlcygndGV4dC9wbGFpbicpIHx8IGN0LmluY2x1ZGVzKCd0ZXh0L2NzdicpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRGbXQoJ3RleHQnKTtcbiAgICAvLyBGYWxsIGJhY2sgdG8gYm9keS1jb250ZW50IGluc3BlY3Rpb25cbiAgICBjb25zdCB0ID0gKGJvZHkgPz8gJycpLnRyaW0oKTtcbiAgICBpZiAoKHQuc3RhcnRzV2l0aCgneycpICYmIHQuZW5kc1dpdGgoJ30nKSkgfHwgKHQuc3RhcnRzV2l0aCgnWycpICYmIHQuZW5kc1dpdGgoJ10nKSkpICByZXR1cm4gc2V0Rm10KCdqc29uJyk7XG4gICAgaWYgKHQuc3RhcnRzV2l0aCgnPD94bWwnKSB8fCAodC5zdGFydHNXaXRoKCc8JykgJiYgIXQuc3RhcnRzV2l0aCgnPCEnKSAmJiAhdC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJzwhZG9jdHlwZScpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEZtdCgneG1sJyk7XG4gICAgaWYgKHQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCc8IWRvY3R5cGUgaHRtbCcpIHx8IHQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCc8aHRtbCcpKSByZXR1cm4gc2V0Rm10KCdodG1sJyk7XG4gIH1cblxuICAvKiogUGFyc2UgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIGJvZHkgKGtleT12YWx1ZSYuLi4pIGludG8ga2V5LXZhbHVlIHJvd3MuICovXG4gIHByaXZhdGUgcGFyc2VGb3JtVXJsRW5jb2RlZEJvZHkoYm9keTogc3RyaW5nKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IHRyaW1tZWQgPSAoYm9keSA/PyAnJykudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZCkgcmV0dXJuIFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHRyaW1tZWQpO1xuICAgICAgY29uc3Qgcm93czogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcbiAgICAgIHBhcmFtcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiByb3dzLnB1c2goeyBrZXksIHZhbHVlIH0pKTtcbiAgICAgIHJldHVybiByb3dzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBmb3JtIGJvZHkgaGFzIGEgc2luZ2xlIGtleSB3aG9zZSB2YWx1ZSBpcyBVUkwtZGVjb2RlZCBKU09OLCByZXR1cm4gaXQgcHJldHR5LXByaW50ZWQgZm9yIFJhdyBib2R5LlxuICAgKiBPdGhlcndpc2UgcmV0dXJuIG51bGwgKGNhbGxlciBrZWVwcyB4LXd3dy1mb3JtLXVybGVuY29kZWQgdmlldykuXG4gICAqL1xuICBwcml2YXRlIHRyeUZvcm1Cb2R5VmFsdWVBc1Jhd0pzb24ocm93czogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAocm93cy5sZW5ndGggIT09IDEgfHwgIXJvd3NbMF0udmFsdWU/LnRyaW0oKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdmFsdWUgPSByb3dzWzBdLnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoISh2YWx1ZS5zdGFydHNXaXRoKCd7JykgfHwgdmFsdWUuc3RhcnRzV2l0aCgnWycpKSkgcmV0dXJuIG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBhcnNlZCwgbnVsbCwgMik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogVXBkYXRlIFBhcmFtcyB0YWJsZSBmcm9tIGN1cnJlbnQgVVJMIHF1ZXJ5IHN0cmluZyAoUG9zdG1hbi1zdHlsZSkuICovXG4gIHByaXZhdGUgc3luY1BhcmFtc0Zyb21VcmwoKTogdm9pZCB7XG4gICAgY29uc3QgeyBiYXNlVXJsOiBfYiwgcm93cyB9ID0gdGhpcy5wYXJzZVF1ZXJ5UGFyYW1zRnJvbVVybCh0aGlzLl91cmwpO1xuICAgIHRoaXMuYnVpbGRQYXJhbXNGb3JtQXJyYXkocm93cyk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogVXBkYXRlIFVSTCBxdWVyeSBzdHJpbmcgZnJvbSBQYXJhbXMgdGFibGUgKFBvc3RtYW4tc3R5bGUpLiAqL1xuICBwcml2YXRlIHN5bmNVcmxGcm9tUGFyYW1zKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhcmFtc1N5bmNpbmdGcm9tVXJsIHx8ICF0aGlzLnBhcmFtc0Zvcm1BcnJheSkgcmV0dXJuO1xuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEJhc2VVcmwodGhpcy5fdXJsKTtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMucGFyYW1zRm9ybUFycmF5LmNvbnRyb2xzKSB7XG4gICAgICBjb25zdCBrZXkgPSAoKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2tleScpPy52YWx1ZSA/PyAnJykudHJpbSgpO1xuICAgICAgY29uc3QgdmFsdWUgPSAoYyBhcyBGb3JtR3JvdXApLmdldCgndmFsdWUnKT8udmFsdWUgPz8gJyc7XG4gICAgICBpZiAoa2V5ICE9PSAnJykgcGFyYW1zLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgICBjb25zdCBuZXdVcmwgPSBxdWVyeVN0cmluZyA/IGAke2Jhc2VVcmx9PyR7cXVlcnlTdHJpbmd9YCA6IGJhc2VVcmw7XG4gICAgaWYgKHRoaXMuX3VybCAhPT0gbmV3VXJsKSB7XG4gICAgICB0aGlzLl91cmwgPSBuZXdVcmw7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVmVyaWZpY2F0aW9uRm9ybUFycmF5KHJvd3M/OiB7IGpzb25QYXRoOiBzdHJpbmc7IHZlcmlmaWNhdGlvbjogc3RyaW5nOyBkYXRhVHlwZTogc3RyaW5nOyBleHBlY3RlZFZhbHVlOiBzdHJpbmcgfVtdKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdFZlcmlmaWNhdGlvbiA9IHRoaXMuZ2V0RGVmYXVsdFZlcmlmaWNhdGlvbigpO1xuICAgIGNvbnN0IGRlZmF1bHREYXRhVHlwZSA9IHRoaXMuZ2V0RGVmYXVsdERhdGFUeXBlKCk7XG4gICAgY29uc3QgaW5pdGlhbCA9IHJvd3MgPz8gW3sganNvblBhdGg6ICcnLCB2ZXJpZmljYXRpb246IGRlZmF1bHRWZXJpZmljYXRpb24sIGRhdGFUeXBlOiBkZWZhdWx0RGF0YVR5cGUsIGV4cGVjdGVkVmFsdWU6ICcnIH1dO1xuICAgIGNvbnN0IGdyb3VwcyA9IGluaXRpYWwubWFwKChyKSA9PlxuICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGpzb25QYXRoOiBbci5qc29uUGF0aF0sXG4gICAgICAgIHZlcmlmaWNhdGlvbjogW3IudmVyaWZpY2F0aW9uXSxcbiAgICAgICAgZGF0YVR5cGU6IFtyLmRhdGFUeXBlXSxcbiAgICAgICAgZXhwZWN0ZWRWYWx1ZTogW3IuZXhwZWN0ZWRWYWx1ZV0sXG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KGdyb3Vwcyk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5KHJvd3M/OiB7IHZlcmlmaWNhdGlvbjogc3RyaW5nOyBleHBlY3RlZFZhbHVlOiBzdHJpbmcgfVtdKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdFZlcmlmaWNhdGlvbiA9IHRoaXMuZ2V0RGVmYXVsdFN0YXR1c1ZlcmlmaWNhdGlvbigpO1xuICAgIGNvbnN0IGluaXRpYWwgPSByb3dzID8/IFt7IHZlcmlmaWNhdGlvbjogZGVmYXVsdFZlcmlmaWNhdGlvbiwgZXhwZWN0ZWRWYWx1ZTogJycgfV07XG4gICAgY29uc3QgZ3JvdXBzID0gaW5pdGlhbC5tYXAoKHIpID0+XG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgdmVyaWZpY2F0aW9uOiBbci52ZXJpZmljYXRpb25dLFxuICAgICAgICBleHBlY3RlZFZhbHVlOiBbci5leHBlY3RlZFZhbHVlXSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoZ3JvdXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRIZWFkZXJzRm9ybUFycmF5KHJvd3M6IEFwaUVkaXRIZWFkZXJSb3dbXSk6IHZvaWQge1xuICAgIGNvbnN0IGdyb3VwcyA9IHJvd3MubWFwKChoKSA9PlxuICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG5hbWU6IFtoLm5hbWVdLFxuICAgICAgICB2YWx1ZTogW2gudmFsdWVdLFxuICAgICAgfSlcbiAgICApO1xuICAgIGlmICh0aGlzLmhlYWRlcnNGb3JtQXJyYXkpIHtcbiAgICAgIHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5jbGVhcigpO1xuICAgICAgZ3JvdXBzLmZvckVhY2goKGcpID0+IHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5wdXNoKGcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWFkZXJzRm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShncm91cHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZXNldCBhbGwgdGhyZWUgc3RlcHMgYW5kIGFsbCBlbnRlcmVkIGRhdGEgdG8gaW5pdGlhbC9kZWZhdWx0IHN0YXRlLiBVc2VkIHdoZW4gdXNlciBjYW5jZWxzIG9uIHN0ZXAgMS4gKi9cbiAgcHJpdmF0ZSByZXNldEFsbFN0ZXBzQW5kRGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRTdGVwID0gMTtcblxuICAgIGNvbnN0IGZpcnN0TWV0aG9kVmFsdWUgPSB0aGlzLmh0dHBNZXRob2RPcHRpb25zPy5sZW5ndGhcbiAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5odHRwTWV0aG9kT3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRNZXRob2QgPSB0aGlzLmluaXRpYWxNZXRob2QgPz8gZmlyc3RNZXRob2RWYWx1ZSA/PyAnR0VUJztcbiAgICBjb25zdCBtZXRob2RWYWwgPSB0eXBlb2YgZGVmYXVsdE1ldGhvZCA9PT0gJ3N0cmluZycgPyBkZWZhdWx0TWV0aG9kIDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGRlZmF1bHRNZXRob2QgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpO1xuICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gbWV0aG9kVmFsID8/ICcnO1xuICAgIGlmICh0aGlzLm1ldGhvZEZvcm0pIHRoaXMubWV0aG9kRm9ybS5wYXRjaFZhbHVlKHsgbWV0aG9kOiBkZWZhdWx0TWV0aG9kIH0pO1xuXG4gICAgY29uc3QgZmlyc3RFbnZWYWx1ZSA9IHRoaXMuZW52aXJvbm1lbnRPcHRpb25zPy5sZW5ndGhcbiAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5lbnZpcm9ubWVudE9wdGlvbnNbMF0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZWZhdWx0RW52ID0gdGhpcy5pbml0aWFsRW52aXJvbm1lbnQgPz8gZmlyc3RFbnZWYWx1ZSA/PyAnRGV2ZWxvcG1lbnQnO1xuICAgIGNvbnN0IGVudlZhbCA9IHR5cGVvZiBkZWZhdWx0RW52ID09PSAnc3RyaW5nJyA/IGRlZmF1bHRFbnYgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdEVudiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9IGVudlZhbCA/PyAnJztcbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudEZvcm0pIHRoaXMuZW52aXJvbm1lbnRGb3JtLnBhdGNoVmFsdWUoeyBlbnZpcm9ubWVudDogZGVmYXVsdEVudiB9KTtcblxuICAgIHRoaXMudXJsID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZGVjb2RlVXJsRm9yRGlzcGxheSh0aGlzLmluaXRpYWxVcmwgPz8gJycpIHx8ICcnO1xuICAgIHRoaXMuYnVpbGRIZWFkZXJzRm9ybUFycmF5KHRoaXMuaW5pdGlhbEhlYWRlcnMgPz8gW3sgbmFtZTogJycsIHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogJycgfV0pO1xuICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMuaGVhZGVyc0NoYW5nZS5lbWl0KHRoaXMuaGVhZGVycyk7XG5cbiAgICB0aGlzLmJvZHlWaWV3ID0gJ2hlYWRlcnMnO1xuICAgIHRoaXMuYWN0aXZlUGF5bG9hZFRhYiA9ICdoZWFkZXJzJztcbiAgICB0aGlzLnBheWxvYWRUeXBlID0gJ3Jhdyc7XG4gICAgdGhpcy5wYXlsb2FkVGV4dCA9ICcnO1xuICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgY29uc3QgZGVmYXVsdEZvcm1hdCA9IHRoaXMuaW5pdGlhbEZvcm1hdCA/PyB0aGlzLmdldEZvcm1hdFZhbHVlcygpWzBdID8/ICdqc29uJztcbiAgICBpZiAodGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSkgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiBkZWZhdWx0Rm9ybWF0IH0pO1xuICAgIHRoaXMuYnVpbGRLZXlWYWx1ZUZvcm1BcnJheSgpO1xuICAgIHRoaXMuYnVpbGRLZXlUeXBlVmFsdWVGb3JtQXJyYXkoKTtcbiAgICB0aGlzLmJ1aWxkUGFyYW1zRm9ybUFycmF5KCk7XG4gICAgdGhpcy5pbXBvcnRDdXJsQ29udHJvbC5zZXRWYWx1ZSgnJyk7XG5cbiAgICB0aGlzLnZhcmlhYmxlTmFtZSA9ICcnO1xuICAgIHRoaXMudmFyaWFibGVOYW1lRXJyb3IgPSAnJztcblxuICAgIHRoaXMuYnVpbGRWZXJpZmljYXRpb25Gb3JtQXJyYXkoKTtcbiAgICB0aGlzLmJ1aWxkU3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5KCk7XG4gICAgdGhpcy5hY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9ICdyZXNwb25zZS1ib2R5JztcblxuICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVyOiBzaG93IGltcG9ydCBjVVJMIHBhbmVsIChjYWxsZWQgd2hlbiB1c2VyIGNsaWNrcyBcIkltcG9ydCBBUEkgY1VSTFwiKS4gUmVzZXRzIHRleHRhcmVhIHNvIGl0IGlzIGNsZWFyZWQgZWFjaCB0aW1lLiAqL1xuICBvcGVuSW1wb3J0Q3VybFBhbmVsKCk6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0Q3VybENvbnRyb2wuc2V0VmFsdWUoJycpO1xuICAgIHRoaXMuYm9keVZpZXcgPSAnaW1wb3J0LWN1cmwnO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBSZXNldCBVUkwsIG1ldGhvZCwgaGVhZGVycywgYm9keSwgYW5kIHBhcmFtcyB0byBlbXB0eS9kZWZhdWx0IGJlZm9yZSBhcHBseWluZyBpbXBvcnRlZCBjVVJMLiAqL1xuICBwcml2YXRlIHJlc2V0UmVxdWVzdEZpZWxkc0JlZm9yZUN1cmxJbXBvcnQoKTogdm9pZCB7XG4gICAgY29uc3QgZmlyc3RNZXRob2RWYWx1ZSA9IHRoaXMuaHR0cE1ldGhvZE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmh0dHBNZXRob2RPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVmYXVsdE1ldGhvZCA9IHRoaXMuaW5pdGlhbE1ldGhvZCA/PyBmaXJzdE1ldGhvZFZhbHVlID8/ICdHRVQnO1xuICAgIHRoaXMuc2VsZWN0ZWRNZXRob2QgPSB0eXBlb2YgZGVmYXVsdE1ldGhvZCA9PT0gJ3N0cmluZycgPyBkZWZhdWx0TWV0aG9kIDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGRlZmF1bHRNZXRob2QgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpID8/ICdHRVQnO1xuICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gdGhpcy5zZWxlY3RlZE1ldGhvZDtcbiAgICBpZiAodGhpcy5tZXRob2RGb3JtKSB0aGlzLm1ldGhvZEZvcm0ucGF0Y2hWYWx1ZSh7IG1ldGhvZDogZGVmYXVsdE1ldGhvZCB9KTtcblxuICAgIHRoaXMudXJsID0gJyc7XG5cbiAgICAvLyBSZXNldCBhdXRoIHNvIGEgcHJldmlvdXMgQmVhcmVyIHRva2VuIGRvZXNuJ3QgcGVyc2lzdCB3aGVuIHJlLWltcG9ydGluZ1xuICAgIGNvbnN0IGZpcnN0QXV0aFZhbHVlID0gdGhpcy5nZXRBdXRoVHlwZVZhbHVlcygpWzBdID8/ICduby1hdXRoJztcbiAgICBpZiAodGhpcy5hdXRoVHlwZUZvcm0pIHRoaXMuYXV0aFR5cGVGb3JtLnBhdGNoVmFsdWUoeyBhdXRoVHlwZTogZmlyc3RBdXRoVmFsdWUgfSk7XG4gICAgdGhpcy5iZWFyZXJUb2tlbiA9ICcnO1xuXG4gICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkoW3sgbmFtZTogJycsIHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogJycgfV0pO1xuICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMuaGVhZGVyc0NoYW5nZS5lbWl0KHRoaXMuaGVhZGVycyk7XG5cbiAgICB0aGlzLnBheWxvYWRUeXBlID0gJ3Jhdyc7XG4gICAgdGhpcy5wYXlsb2FkVGV4dCA9ICcnO1xuICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgY29uc3QgZGVmYXVsdEZvcm1hdCA9IHRoaXMuaW5pdGlhbEZvcm1hdCA/PyB0aGlzLmdldEZvcm1hdFZhbHVlcygpWzBdID8/ICdqc29uJztcbiAgICBpZiAodGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSkgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiBkZWZhdWx0Rm9ybWF0IH0pO1xuICAgIHRoaXMuYnVpbGRLZXlWYWx1ZUZvcm1BcnJheShbeyBrZXk6ICcnLCB2YWx1ZTogJycgfV0pO1xuICAgIHRoaXMuYnVpbGRLZXlUeXBlVmFsdWVGb3JtQXJyYXkoW3sga2V5OiAnJywgdHlwZTogJ3RleHQnLCB2YWx1ZTogJycgfV0pO1xuICAgIHRoaXMuYnVpbGRQYXJhbXNGb3JtQXJyYXkoW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dKTtcblxuICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVyOiBwYXJzZSBjVVJMIGZyb20gY29udHJvbCwgYmluZCB0byBmb3JtIGZpZWxkcywgZW1pdCBhbmQgY2xvc2UgcGFuZWwuICovXG4gIG9uSW1wb3J0Q3VybENvbmZpcm0oKTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmltcG9ydEN1cmxDb250cm9sLnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGN1cmxTdHIgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiAnJztcbiAgICB0aGlzLmltcG9ydEN1cmwuZW1pdChjdXJsU3RyKTtcblxuICAgIHRoaXMucmVzZXRSZXF1ZXN0RmllbGRzQmVmb3JlQ3VybEltcG9ydCgpO1xuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VDdXJsKGN1cmxTdHIpO1xuICAgIGlmIChwYXJzZWQpIHtcbiAgICAgIC8vIOKUgOKUgCBNZXRob2Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICBjb25zdCBtZXRob2RWYWx1ZSA9IHBhcnNlZC5tZXRob2QgJiYgdGhpcy5nZXRNZXRob2RWYWx1ZXMoKS5pbmNsdWRlcyhwYXJzZWQubWV0aG9kKVxuICAgICAgICA/IHBhcnNlZC5tZXRob2RcbiAgICAgICAgOiBwYXJzZWQubWV0aG9kIHx8ICdHRVQnO1xuICAgICAgdGhpcy5zZWxlY3RlZE1ldGhvZCA9IG1ldGhvZFZhbHVlO1xuICAgICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSBtZXRob2RWYWx1ZTtcblxuICAgICAgLy8g4pSA4pSAIFVSTCAoYWxzbyBzeW5jcyBQYXJhbXMgdGFiIGZyb20gcXVlcnkgc3RyaW5nKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgIGlmIChwYXJzZWQudXJsKSB0aGlzLnVybCA9IHBhcnNlZC51cmw7XG5cbiAgICAgIC8vIOKUgOKUgCBBdXRob3JpemF0aW9uIGhlYWRlciDihpIgQmVhcmVyIFRva2VuIC8gYXV0aCB0eXBlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgbGV0IGhlYWRlclJvd3M6IEFwaUVkaXRIZWFkZXJSb3dbXSA9IHBhcnNlZC5oZWFkZXJzO1xuICAgICAgY29uc3QgYXV0aEhlYWRlciA9IGhlYWRlclJvd3MuZmluZChoID0+IGgubmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYXV0aG9yaXphdGlvbicpO1xuICAgICAgaWYgKGF1dGhIZWFkZXI/LnZhbHVlPy50cmltKCkpIHtcbiAgICAgICAgY29uc3QgYmVhcmVyTWF0Y2ggPSAvXkJlYXJlclxccysoLispJC9pLmV4ZWMoYXV0aEhlYWRlci52YWx1ZS50cmltKCkpO1xuICAgICAgICBpZiAoYmVhcmVyTWF0Y2gpIHtcbiAgICAgICAgICBjb25zdCB0b2tlbiA9IGJlYXJlck1hdGNoWzFdLnRyaW0oKTtcbiAgICAgICAgICBpZiAodGhpcy5nZXRBdXRoVHlwZVZhbHVlcygpLmluY2x1ZGVzKCdiZWFyZXInKSAmJiB0aGlzLmF1dGhUeXBlRm9ybSkge1xuICAgICAgICAgICAgdGhpcy5hdXRoVHlwZUZvcm0ucGF0Y2hWYWx1ZSh7IGF1dGhUeXBlOiAnYmVhcmVyJyB9KTtcbiAgICAgICAgICAgIHRoaXMuYmVhcmVyVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUmVtb3ZlIEF1dGhvcml6YXRpb24gZnJvbSBoZWFkZXJzIHRhYmxlIChpdCBsaXZlcyBpbiB0aGUgQXV0aCB0YWIpXG4gICAgICAgICAgaGVhZGVyUm93cyA9IGhlYWRlclJvd3MuZmlsdGVyKGggPT4gaC5uYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdhdXRob3JpemF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSAIEhlYWRlcnMgdGFibGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICBoZWFkZXJSb3dzID0gaGVhZGVyUm93cy5sZW5ndGggPiAwID8gaGVhZGVyUm93cyA6IFt7IG5hbWU6ICcnLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6ICcnIH1dO1xuICAgICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkoaGVhZGVyUm93cyk7XG4gICAgICB0aGlzLnVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTtcbiAgICAgIHRoaXMuaGVhZGVyc0NoYW5nZS5lbWl0KHRoaXMuaGVhZGVycyk7XG5cbiAgICAgIC8vIOKUgOKUgCBEZXRlcm1pbmUgQ29udGVudC1UeXBlIGZvciBib2R5L2Zvcm1hdCBkZWNpc2lvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICBjb25zdCBjb250ZW50VHlwZSA9IHBhcnNlZC5oZWFkZXJzXG4gICAgICAgIC5maW5kKGggPT4gaC5uYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnKVxuICAgICAgICA/LnZhbHVlPy50b0xvd2VyQ2FzZSgpID8/ICcnO1xuXG4gICAgICAvLyDilIDilIAgQm9keSAvIEZvcm0tZGF0YSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgIGxldCB0YWJUb0FjdGl2YXRlOiBBcGlFZGl0UGF5bG9hZFRhYiA9ICdoZWFkZXJzJztcblxuICAgICAgaWYgKHBhcnNlZC5mb3JtRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIE11bHRpcGFydCBmb3JtLWRhdGEgKC1GIC8gLS1mb3JtIGVudHJpZXMpXG4gICAgICAgIHRoaXMucGF5bG9hZFR5cGUgPSAnZm9ybS1kYXRhJztcbiAgICAgICAgdGhpcy5idWlsZEtleVR5cGVWYWx1ZUZvcm1BcnJheShcbiAgICAgICAgICBwYXJzZWQuZm9ybURhdGEubWFwKGUgPT4gKHsga2V5OiBlLmtleSwgdHlwZTogZS50eXBlLCB2YWx1ZTogZS52YWx1ZSB9KSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5wYXlsb2FkVGV4dCA9ICcnO1xuICAgICAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgICAgICB0YWJUb0FjdGl2YXRlID0gJ2JvZHknO1xuXG4gICAgICB9IGVsc2UgaWYgKHBhcnNlZC5ib2R5KSB7XG4gICAgICAgIGNvbnN0IGlzRm9ybVVybEVuY29kZWQgPSBjb250ZW50VHlwZS5pbmNsdWRlcygnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG5cbiAgICAgICAgaWYgKGlzRm9ybVVybEVuY29kZWQpIHtcbiAgICAgICAgICBjb25zdCByb3dzID0gdGhpcy5wYXJzZUZvcm1VcmxFbmNvZGVkQm9keShwYXJzZWQuYm9keSk7XG4gICAgICAgICAgdGhpcy5idWlsZEtleVZhbHVlRm9ybUFycmF5KHJvd3MubGVuZ3RoID4gMCA/IHJvd3MgOiBbeyBrZXk6ICcnLCB2YWx1ZTogJycgfV0pO1xuICAgICAgICAgIGNvbnN0IGRlY29kZWRBc0pzb24gPSB0aGlzLnRyeUZvcm1Cb2R5VmFsdWVBc1Jhd0pzb24ocm93cyk7XG4gICAgICAgICAgaWYgKGRlY29kZWRBc0pzb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5wYXlsb2FkVHlwZSA9ICdyYXcnO1xuICAgICAgICAgICAgdGhpcy5wYXlsb2FkVGV4dCA9IGRlY29kZWRBc0pzb247XG4gICAgICAgICAgICBpZiAodGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSkgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiAnanNvbicgfSk7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZFR5cGUgPSAneC13d3ctZm9ybS11cmxlbmNvZGVkJztcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZFRleHQgPSAnJztcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucGF5bG9hZFRleHQgPSBwYXJzZWQuYm9keTtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICAgICAgICB0aGlzLmFwcGx5Qm9keUZvcm1hdChwYXJzZWQuYm9keSwgY29udGVudFR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHRhYlRvQWN0aXZhdGUgPSAnYm9keSc7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBBdXRvLXN3aXRjaCB0byB0aGUgbW9zdCByZWxldmFudCB0YWIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICBpZiAodGFiVG9BY3RpdmF0ZSA9PT0gJ2JvZHknKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlUGF5bG9hZFRhYiA9ICdib2R5JztcbiAgICAgIH0gZWxzZSBpZiAoYXV0aEhlYWRlcj8udmFsdWU/LnRyaW0oKSkge1xuICAgICAgICB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgPSAnYXV0aG9yaXphdGlvbic7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlSW1wb3J0Q3VybFBhbmVsKCk7XG4gIH1cblxuICAvKiogSGFuZGxlcjogZW1pdCBjYW5jZWwgYW5kIGNsb3NlIHBhbmVsLiBDYWxsZWQgd2hlbiB1c2VyIGNsaWNrcyBDYW5jZWwgaW4gaW1wb3J0IGNVUkwgcGFuZWwuICovXG4gIG9uQ2FuY2VsSW1wb3J0Q3VybCgpOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydEN1cmxDYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMuY2xvc2VJbXBvcnRDdXJsUGFuZWwoKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVyOiBzaG93IGhlYWRlcnMgc2VjdGlvbiAoY2FsbGVkIGZyb20gQ2FuY2VsIG9yIGFmdGVyIEltcG9ydCBpbiBpbXBvcnQgcGFuZWwpLiAqL1xuICBjbG9zZUltcG9ydEN1cmxQYW5lbCgpOiB2b2lkIHtcbiAgICB0aGlzLmJvZHlWaWV3ID0gJ2hlYWRlcnMnO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBVUkw6IG11c3QgYmUgcmVxdWlyZWQgYW5kIG1hdGNoIGh0dHAvaHR0cHMgcGF0dGVyblxuICAgKiBBbHNvIGFsbG93cyBwYXJhbWV0ZXIgcGxhY2Vob2xkZXJzIGxpa2UgQHxwYXJhbU5hbWV8XG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVXJsKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVybFZhbHVlID0gdGhpcy51cmw/LnRyaW0oKSB8fCAnJztcbiAgICBcbiAgICAvLyBDaGVjayBpZiBVUkwgaXMgZW1wdHlcbiAgICBpZiAoIXVybFZhbHVlKSB7XG4gICAgICB0aGlzLnVybEVycm9yID0gJ1VSTCBpcyByZXF1aXJlZCc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBwYXJhbWV0ZXIgcGxhY2Vob2xkZXIgKGZvcm1hdDogQHxwYXJhbU5hbWV8KVxuICAgIGNvbnN0IGlzUGFyYW1ldGVyUGxhY2Vob2xkZXIgPSAvXkBcXHxbXnxdK1xcfCQvLnRlc3QodXJsVmFsdWUpO1xuICAgIGlmIChpc1BhcmFtZXRlclBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLnVybEVycm9yID0gJyc7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgVVJMIG1hdGNoZXMgaHR0cCBvciBodHRwcyBwYXR0ZXJuXG4gICAgY29uc3QgdXJsUGF0dGVybiA9IC9eaHR0cHM/OlxcL1xcLy4rL2k7XG4gICAgaWYgKCF1cmxQYXR0ZXJuLnRlc3QodXJsVmFsdWUpKSB7XG4gICAgICB0aGlzLnVybEVycm9yID0gJ1VSTCBtdXN0IHN0YXJ0IHdpdGggaHR0cDovLyBvciBodHRwczovLyc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZGl0aW9uYWwgdmFsaWRhdGlvbjogdHJ5IHRvIGNyZWF0ZSBVUkwgb2JqZWN0IHRvIGVuc3VyZSBpdCdzIHZhbGlkXG4gICAgdHJ5IHtcbiAgICAgIG5ldyBVUkwodXJsVmFsdWUpO1xuICAgICAgdGhpcy51cmxFcnJvciA9ICcnO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnVybEVycm9yID0gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIFVSTCc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIFVSTCBpcyB2YWxpZCAoZm9yIGJ1dHRvbiBkaXNhYmxlZCBzdGF0ZSlcbiAgICovXG4gIGdldCBpc1VybFZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVybFZhbHVlID0gdGhpcy51cmw/LnRyaW0oKSB8fCAnJztcbiAgICBcbiAgICAvLyBFbXB0eSBVUkwgaXMgaW52YWxpZFxuICAgIGlmICghdXJsVmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gUGFyYW1ldGVyIHBsYWNlaG9sZGVyIGlzIHZhbGlkXG4gICAgY29uc3QgaXNQYXJhbWV0ZXJQbGFjZWhvbGRlciA9IC9eQFxcfFtefF0rXFx8JC8udGVzdCh1cmxWYWx1ZSk7XG4gICAgaWYgKGlzUGFyYW1ldGVyUGxhY2Vob2xkZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBNdXN0IG1hdGNoIGh0dHAvaHR0cHMgcGF0dGVyblxuICAgIGNvbnN0IHVybFBhdHRlcm4gPSAvXmh0dHBzPzpcXC9cXC8uKy9pO1xuICAgIGlmICghdXJsUGF0dGVybi50ZXN0KHVybFZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBUcnkgdG8gY3JlYXRlIFVSTCBvYmplY3QgdG8gZW5zdXJlIGl0J3MgdmFsaWRcbiAgICB0cnkge1xuICAgICAgbmV3IFVSTCh1cmxWYWx1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBvblNlbmRSZXF1ZXN0KCk6IHZvaWQge1xuICAgIC8vIFZhbGlkYXRlIFVSTCBiZWZvcmUgc2VuZGluZyByZXF1ZXN0XG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlVXJsKCkpIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudCAhPSBudWxsID8gU3RyaW5nKHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudCkgOiAnJztcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLnNlbGVjdGVkTWV0aG9kICE9IG51bGwgPyBTdHJpbmcodGhpcy5zZWxlY3RlZE1ldGhvZCkgOiAnJztcbiAgICB0aGlzLnNlbmRSZXF1ZXN0LmVtaXQoe1xuICAgICAgZW52aXJvbm1lbnQsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmw6IHRoaXMudXJsID8/ICcnLFxuICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgb25WYXJpYWJsZU5hbWVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICB9XG5cbiAgb25CYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID4gMSkge1xuICAgICAgdGhpcy5zZXRTdGVwKHRoaXMuY3VycmVudFN0ZXAgLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXNldEFsbFN0ZXBzQW5kRGF0YSgpO1xuICAgICAgdGhpcy5iYWNrLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBjbGlja3MgdGhlIENhbmNlbCBidXR0b24gKHN0ZXAgMSkuIEVtaXRzIGNhbmNlbCB0aGVuIHJ1bnMgbm9ybWFsIGJhY2sgZmxvdy4gKi9cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMub25CYWNrKCk7XG4gIH1cblxuICBvbk5leHQoKTogdm9pZCB7XG4gICAgLy8gVmFsaWRhdGUgVVJMIG9uIHN0ZXAgMVxuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID09PSAxKSB7XG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVVcmwoKSkge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBWYWxpZGF0ZSB2YXJpYWJsZSBuYW1lIG9uIHN0ZXAgMlxuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID09PSAyICYmICF0aGlzLnZhcmlhYmxlTmFtZT8udHJpbSgpKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZUVycm9yID0gJ1ZhcmlhYmxlIE5hbWUgaXMgcmVxdWlyZWQuJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwIDwgdGhpcy5zdGVwTGFiZWxzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zZXRTdGVwKHRoaXMuY3VycmVudFN0ZXAgKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uZXh0LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBzZXRQYXlsb2FkVGFiKHZhbHVlOiBBcGlFZGl0UGF5bG9hZFRhYik6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlUGF5bG9hZFRhYiA9IHZhbHVlO1xuICB9XG5cbiAgc2V0UmVzcG9uc2VWZXJpZmljYXRpb25UYWIodmFsdWU6ICdyZXNwb25zZS1ib2R5JyB8ICdzdGF0dXMnKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9IHZhbHVlO1xuICB9XG5cbiAgYWRkSGVhZGVyKCk6IHZvaWQge1xuICAgIHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5wdXNoKFxuICAgICAgdGhpcy5mYi5ncm91cCh7IG5hbWU6IFsnJ10sIHZhbHVlOiBbJyddIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZUhlYWRlcihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5oZWFkZXJzRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIC8qKiBXaGVuIHVzZXIgYWRkcyBhIGN1c3RvbSBoZWFkZXIgbmFtZSB2aWEgdGhlIGRyb3Bkb3duIFwiQWRkICfigKYnXCIgb3B0aW9uLCBzZXQgdGhlIGNvbnRyb2wgdmFsdWUuICovXG4gIG9uSGVhZGVyTmFtZUFkZEN1c3RvbVZhbHVlKGV2ZW50OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0sIHJvdzogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbCA9IHJvdy5nZXQoZXZlbnQua2V5KTtcbiAgICBpZiAoY29udHJvbCAmJiBldmVudC52YWx1ZSAhPSBudWxsKSB7XG4gICAgICBjb250cm9sLnNldFZhbHVlKGV2ZW50LnZhbHVlLnRyaW0oKSk7XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeUhlYWRlcihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBhZGRLZXlWYWx1ZVJvdygpOiB2b2lkIHtcbiAgICB0aGlzLmtleVZhbHVlRm9ybUFycmF5LnB1c2godGhpcy5mYi5ncm91cCh7IGtleTogWycnXSwgdmFsdWU6IFsnJ10gfSkpO1xuICB9XG5cbiAgcmVtb3ZlS2V5VmFsdWVSb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMua2V5VmFsdWVGb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgdHJhY2tCeUtleVZhbHVlKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGFkZEtleVR5cGVWYWx1ZVJvdygpOiB2b2lkIHtcbiAgICB0aGlzLmtleVR5cGVWYWx1ZUZvcm1BcnJheS5wdXNoKHRoaXMuZmIuZ3JvdXAoeyBrZXk6IFsnJ10sIHR5cGU6IFsndGV4dCddLCB2YWx1ZTogWycnXSB9KSk7XG4gIH1cblxuICByZW1vdmVLZXlUeXBlVmFsdWVSb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMua2V5VHlwZVZhbHVlRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIHRyYWNrQnlLZXlUeXBlVmFsdWUoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgYWRkUGFyYW1zUm93KCk6IHZvaWQge1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5LnB1c2godGhpcy5mYi5ncm91cCh7IGtleTogWycnXSwgdmFsdWU6IFsnJ10gfSkpO1xuICB9XG5cbiAgcmVtb3ZlUGFyYW1zUm93KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmFtc0Zvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gIH1cblxuICB0cmFja0J5UGFyYW1zKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGFkZFZlcmlmaWNhdGlvblJvdygpOiB2b2lkIHtcbiAgICB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheS5wdXNoKFxuICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGpzb25QYXRoOiBbJyddLFxuICAgICAgICB2ZXJpZmljYXRpb246IFt0aGlzLmdldERlZmF1bHRWZXJpZmljYXRpb24oKV0sXG4gICAgICAgIGRhdGFUeXBlOiBbdGhpcy5nZXREZWZhdWx0RGF0YVR5cGUoKV0sXG4gICAgICAgIGV4cGVjdGVkVmFsdWU6IFsnJ10sXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICByZW1vdmVWZXJpZmljYXRpb25Sb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIHRyYWNrQnlWZXJpZmljYXRpb24oaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqIFdoZW4gRGF0YSBUeXBlIGNoYW5nZXMgaW4gUmVzcG9uc2UgQm9keSB2ZXJpZmljYXRpb24sIHJlc2V0IEV4cGVjdGVkIFZhbHVlIGZvciB0aGF0IHJvdy4gKi9cbiAgb25WZXJpZmljYXRpb25EYXRhVHlwZUNoYW5nZShyb3c6IEZvcm1Hcm91cCwgZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnZGF0YVR5cGUnKSB7XG4gICAgICByb3cuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgYWRkU3RhdHVzVmVyaWZpY2F0aW9uUm93KCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5LnB1c2goXG4gICAgICB0aGlzLmZiLmdyb3VwKHsgdmVyaWZpY2F0aW9uOiBbdGhpcy5nZXREZWZhdWx0U3RhdHVzVmVyaWZpY2F0aW9uKCldLCBleHBlY3RlZFZhbHVlOiBbJyddIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZVN0YXR1c1ZlcmlmaWNhdGlvblJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgdHJhY2tCeVN0YXR1c1ZlcmlmaWNhdGlvbihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgcmVhY3RpdmUgZm9ybSBmb3IgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEFkdmFuY2VkVmFyaWFibGVzRm9ybSgpOiB2b2lkIHtcbiAgICB3aGlsZSAodGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5yZW1vdmVBdCgwKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPVxuICAgICAgICB2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIHZhcmlhYmxlLnZhbHVlID09PSAnYm9vbGVhbidcbiAgICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcblxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiBbZGVmYXVsdFZhbHVlXSxcbiAgICAgICAgdHlwZTogW3ZhcmlhYmxlLnR5cGUgfHwgJ3N0cmluZyddLFxuICAgICAgICBsYWJlbDogW3ZhcmlhYmxlLmxhYmVsIHx8ICcnXVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnB1c2godmFyaWFibGVHcm91cCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGFkdmFuY2VkIGJvb2xlYW4gY2hhbmdlcyBhbmQga2VlcCBib3RoIGRhdGEgYW5kIGZvcm0gaW4gc3luYy5cbiAgICovXG4gIG9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5hdCh2YXJpYWJsZUluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBub24tYm9vbGVhbiBhZHZhbmNlZCB2YWx1ZXMgKGtlcHQgZm9yIEFQSSBjb21wYXRpYmlsaXR5OyBjdXJyZW50bHkgdW51c2VkKS5cbiAgICovXG4gIG9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5hdCh2YXJpYWJsZUluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEVtaXQgYWxsIGVudGVyZWQgZGV0YWlscyAoZW52aXJvbm1lbnQsIEhUVFAgbWV0aG9kLCBVUkwsIGhlYWRlcnMsIGJvZHksIHN0ZXAyIHZhcmlhYmxlLCBzdGVwMyB2ZXJpZmljYXRpb25zKSB3aGVuIHVzZXIgY2xpY2tzIENyZWF0ZS4gKi9cbiAgb25DcmVhdGUoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJzk5OTk5OTknKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuZ2V0Q3JlYXRlUGF5bG9hZCgpO1xuICAgICAgY29uc29sZS5sb2coJzk5OTk5OTkgcGF5bG9hZCcsIHBheWxvYWQpO1xuICAgICAgdGhpcy5jcmVhdGUuZW1pdChwYXlsb2FkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0FwaUVkaXRTdGVwIGdldENyZWF0ZVBheWxvYWQgZXJyb3I6JywgZXJyKTtcbiAgICAgIHRoaXMuY3JlYXRlLmVtaXQodGhpcy5nZXRDcmVhdGVQYXlsb2FkRmFsbGJhY2soKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIE1pbmltYWwgcGF5bG9hZCB3aGVuIGdldENyZWF0ZVBheWxvYWQgdGhyb3dzIChzbyBjcmVhdGUgYWx3YXlzIGVtaXRzKS4gKi9cbiAgcHJpdmF0ZSBnZXRDcmVhdGVQYXlsb2FkRmFsbGJhY2soKTogQXBpRWRpdENyZWF0ZVBheWxvYWQge1xuICAgIGNvbnN0IGF1dGhUeXBlID0gdGhpcy5zZWxlY3RlZEF1dGhUeXBlO1xuICAgIGNvbnN0IGJlYXJlclRva2VuID0gYXV0aFR5cGUgPT09ICdiZWFyZXInID8gKHRoaXMuYmVhcmVyVG9rZW4gPz8gJycpIDogdW5kZWZpbmVkO1xuICAgIGxldCBvYXV0aDI6IEFwaUVkaXRPQXV0aDJQYXlsb2FkIHwgdW5kZWZpbmVkO1xuICAgIGlmIChhdXRoVHlwZSA9PT0gJ29hdXRoMicgJiYgdGhpcy5vYXV0aDJGb3JtKSB7XG4gICAgICBjb25zdCBncmFudFR5cGUgPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRDb250cm9sVmFsdWUodGhpcy5vYXV0aDJGb3JtLmdldCgnZ3JhbnRUeXBlJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgICBjb25zdCBjbGllbnRBdXRoID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0Q29udHJvbFZhbHVlKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2NsaWVudEF1dGhlbnRpY2F0aW9uJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgICBvYXV0aDIgPSB7XG4gICAgICAgIGdyYW50VHlwZTogZ3JhbnRUeXBlICE9PSAnJyA/IGdyYW50VHlwZSA6ICdjbGllbnRfY3JlZGVudGlhbHMnLFxuICAgICAgICBhY2Nlc3NUb2tlblVybDogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2FjY2Vzc1Rva2VuVXJsJyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIGNsaWVudElkOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50SWQnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50U2VjcmV0OiAodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50U2VjcmV0Jyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIHNjb3BlOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnc2NvcGUnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50QXV0aGVudGljYXRpb246IGNsaWVudEF1dGggIT09ICcnID8gY2xpZW50QXV0aCA6ICdiYXNpYycsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RlcDE6IHtcbiAgICAgICAgZW52aXJvbm1lbnQ6ICcnLFxuICAgICAgICBtZXRob2Q6ICcnLFxuICAgICAgICB1cmw6IHRoaXMudXJsID8/ICcnLFxuICAgICAgICBoZWFkZXJzOiBbXSxcbiAgICAgICAgYXV0aFR5cGUsXG4gICAgICAgIC4uLihiZWFyZXJUb2tlbiAhPT0gdW5kZWZpbmVkICYmIHsgYmVhcmVyVG9rZW4gfSksXG4gICAgICAgIC4uLihvYXV0aDIgIT09IHVuZGVmaW5lZCAmJiB7IG9hdXRoMiB9KSxcbiAgICAgICAgYWN0aXZlUGF5bG9hZFRhYjogdGhpcy5hY3RpdmVQYXlsb2FkVGFiLFxuICAgICAgICBwYXlsb2FkVHlwZTogdGhpcy5wYXlsb2FkVHlwZSxcbiAgICAgICAgcGF5bG9hZEZvcm1hdDogJycsXG4gICAgICAgIHBheWxvYWRUZXh0OiB0aGlzLnBheWxvYWRUZXh0ID8/ICcnLFxuICAgICAgICBrZXlWYWx1ZVJvd3M6IFtdLFxuICAgICAgICBrZXlUeXBlVmFsdWVSb3dzOiBbXSxcbiAgICAgICAgcGFyYW1zUm93czogW10sXG4gICAgICB9LFxuICAgICAgc3RlcDI6IHsgdmFyaWFibGVOYW1lOiB0aGlzLnZhcmlhYmxlTmFtZSA/PyAnJyB9LFxuICAgICAgc3RlcDM6IHtcbiAgICAgICAgYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI6IHRoaXMuYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIsXG4gICAgICAgIHJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnM6IFtdLFxuICAgICAgICBzdGF0dXNWZXJpZmljYXRpb25zOiBbXSxcbiAgICAgIH0sXG4gICAgICBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzOiB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBOb3JtYWxpemUgZm9ybSBjb250cm9sIHZhbHVlIHRvIHN0cmluZyAoaGFuZGxlcyBvYmplY3Qgb3Igc3RyaW5nKS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q29udHJvbFZhbHVlKGNvbnRyb2w6IHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHYgPSBjb250cm9sPy52YWx1ZTtcbiAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09ICcnKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKSA6IFN0cmluZyh2KTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBmdWxsIGNyZWF0ZSBwYXlsb2FkOiBlbnZpcm9ubWVudCwgSFRUUCBtZXRob2QsIFVSTCwgaGVhZGVycywgYm9keSAoc3RlcDEpLCB2YXJpYWJsZSBuYW1lIChzdGVwMiksIHZlcmlmaWNhdGlvbnMgKHN0ZXAzKS4gKi9cbiAgcHJpdmF0ZSBnZXRDcmVhdGVQYXlsb2FkKCk6IEFwaUVkaXRDcmVhdGVQYXlsb2FkIHtcbiAgICBjb25zdCBlbnZGcm9tRm9ybSA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldENvbnRyb2xWYWx1ZSh0aGlzLmVudmlyb25tZW50Rm9ybT8uZ2V0KCdlbnZpcm9ubWVudCcpIGFzIHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwpO1xuICAgIGNvbnN0IGVudmlyb25tZW50ID1cbiAgICAgIGVudkZyb21Gb3JtICE9PSAnJyA/IGVudkZyb21Gb3JtIDogKHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgIT09ICcnID8gdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA6IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudCk7XG4gICAgY29uc3QgbWV0aG9kRnJvbUZvcm0gPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRDb250cm9sVmFsdWUodGhpcy5tZXRob2RGb3JtPy5nZXQoJ21ldGhvZCcpIGFzIHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwpO1xuICAgIGNvbnN0IG1ldGhvZCA9XG4gICAgICBtZXRob2RGcm9tRm9ybSAhPT0gJycgPyBtZXRob2RGcm9tRm9ybSA6ICh0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSAhPT0gJycgPyB0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSA6IHRoaXMuc2VsZWN0ZWRNZXRob2QpO1xuICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMucGF5bG9hZEZvcm1hdEZvcm0/LmdldCgnZm9ybWF0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGtleVZhbHVlRm9ybUFycmF5ID0gdGhpcy5rZXlWYWx1ZUZvcm1BcnJheTtcbiAgICBjb25zdCBrZXlWYWx1ZVJvd3MgPSAoa2V5VmFsdWVGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKS5tYXAoKGMpID0+ICh7XG4gICAgICBrZXk6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdrZXknKT8udmFsdWUgPz8gJycsXG4gICAgICB2YWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnLFxuICAgIH0pKTtcbiAgICBjb25zdCBrZXlUeXBlVmFsdWVGb3JtQXJyYXkgPSB0aGlzLmtleVR5cGVWYWx1ZUZvcm1BcnJheTtcbiAgICBjb25zdCBrZXlUeXBlVmFsdWVSb3dzID0gKGtleVR5cGVWYWx1ZUZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pLm1hcCgoYykgPT4gKHtcbiAgICAgIGtleTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2tleScpPy52YWx1ZSA/PyAnJyxcbiAgICAgIHR5cGU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd0eXBlJyk/LnZhbHVlID8/ICd0ZXh0JyxcbiAgICAgIHZhbHVlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgndmFsdWUnKT8udmFsdWUgPz8gJycsXG4gICAgfSkpO1xuICAgIGNvbnN0IHBhcmFtc0Zvcm1BcnJheSA9IHRoaXMucGFyYW1zRm9ybUFycmF5O1xuICAgIGNvbnN0IHBhcmFtc1Jvd3MgPSAocGFyYW1zRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkubWFwKChjKSA9PiAoe1xuICAgICAga2V5OiAoYyBhcyBGb3JtR3JvdXApLmdldCgna2V5Jyk/LnZhbHVlID8/ICcnLFxuICAgICAgdmFsdWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gICAgY29uc3QgdmVyaWZpY2F0aW9uRm9ybUFycmF5ID0gdGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXk7XG4gICAgY29uc3QgcmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9ucyA9ICh2ZXJpZmljYXRpb25Gb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKS5tYXAoKGMpID0+ICh7XG4gICAgICBqc29uUGF0aDogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2pzb25QYXRoJyk/LnZhbHVlID8/ICcnLFxuICAgICAgdmVyaWZpY2F0aW9uOiAoYyBhcyBGb3JtR3JvdXApLmdldCgndmVyaWZpY2F0aW9uJyk/LnZhbHVlID8/ICcnLFxuICAgICAgZGF0YVR5cGU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdkYXRhVHlwZScpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGV4cGVjdGVkVmFsdWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnZhbHVlID8/ICcnLFxuICAgIH0pKTtcbiAgICBjb25zdCBzdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkgPSB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheTtcbiAgICBjb25zdCBzdGF0dXNWZXJpZmljYXRpb25zID0gKHN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pLm1hcCgoYykgPT4gKHtcbiAgICAgIHZlcmlmaWNhdGlvbjogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZlcmlmaWNhdGlvbicpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGV4cGVjdGVkVmFsdWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnZhbHVlID8/ICcnLFxuICAgIH0pKTtcbiAgICBjb25zdCBhdXRoVHlwZSA9IHRoaXMuc2VsZWN0ZWRBdXRoVHlwZTtcbiAgICBjb25zdCBiZWFyZXJUb2tlbiA9IGF1dGhUeXBlID09PSAnYmVhcmVyJyA/ICh0aGlzLmJlYXJlclRva2VuID8/ICcnKSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgb2F1dGgyOiBBcGlFZGl0T0F1dGgyUGF5bG9hZCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYXV0aFR5cGUgPT09ICdvYXV0aDInICYmIHRoaXMub2F1dGgyRm9ybSkge1xuICAgICAgY29uc3QgZ3JhbnRUeXBlID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0Q29udHJvbFZhbHVlKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2dyYW50VHlwZScpIGFzIHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwpO1xuICAgICAgY29uc3QgY2xpZW50QXV0aCA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldENvbnRyb2xWYWx1ZSh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdjbGllbnRBdXRoZW50aWNhdGlvbicpIGFzIHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwpO1xuICAgICAgb2F1dGgyID0ge1xuICAgICAgICBncmFudFR5cGU6IGdyYW50VHlwZSAhPT0gJycgPyBncmFudFR5cGUgOiAnY2xpZW50X2NyZWRlbnRpYWxzJyxcbiAgICAgICAgYWNjZXNzVG9rZW5Vcmw6ICh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdhY2Nlc3NUb2tlblVybCcpPy52YWx1ZSA/PyAnJykgYXMgc3RyaW5nLFxuICAgICAgICBjbGllbnRJZDogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2NsaWVudElkJyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIGNsaWVudFNlY3JldDogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2NsaWVudFNlY3JldCcpPy52YWx1ZSA/PyAnJykgYXMgc3RyaW5nLFxuICAgICAgICBzY29wZTogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ3Njb3BlJyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIGNsaWVudEF1dGhlbnRpY2F0aW9uOiBjbGllbnRBdXRoICE9PSAnJyA/IGNsaWVudEF1dGggOiAnYmFzaWMnLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0ZXAxOiB7XG4gICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIHVybDogdGhpcy51cmwgPz8gJycsXG4gICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgYXV0aFR5cGUsXG4gICAgICAgIC4uLihiZWFyZXJUb2tlbiAhPT0gdW5kZWZpbmVkICYmIHsgYmVhcmVyVG9rZW4gfSksXG4gICAgICAgIC4uLihvYXV0aDIgIT09IHVuZGVmaW5lZCAmJiB7IG9hdXRoMiB9KSxcbiAgICAgICAgYWN0aXZlUGF5bG9hZFRhYjogdGhpcy5hY3RpdmVQYXlsb2FkVGFiLFxuICAgICAgICBwYXlsb2FkVHlwZTogdGhpcy5wYXlsb2FkVHlwZSxcbiAgICAgICAgcGF5bG9hZEZvcm1hdDogZm9ybWF0LFxuICAgICAgICBwYXlsb2FkVGV4dDogdGhpcy5wYXlsb2FkVGV4dCA/PyAnJyxcbiAgICAgICAga2V5VmFsdWVSb3dzLFxuICAgICAgICBrZXlUeXBlVmFsdWVSb3dzLFxuICAgICAgICBwYXJhbXNSb3dzLFxuICAgICAgfSxcbiAgICAgIHN0ZXAyOiB7XG4gICAgICAgIHZhcmlhYmxlTmFtZTogdGhpcy52YXJpYWJsZU5hbWUgPz8gJycsXG4gICAgICB9LFxuICAgICAgc3RlcDM6IHtcbiAgICAgICAgYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI6IHRoaXMuYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIsXG4gICAgICAgIHJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnMsXG4gICAgICAgIHN0YXR1c1ZlcmlmaWNhdGlvbnMsXG4gICAgICB9LFxuICAgICAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLFxuICAgIH07XG4gIH1cblxuICAvKiogQ3VycmVudCBoZWFkZXIgcm93cyBmcm9tIGZvcm0gKGZvciBjb25zdW1lcnMgdGhhdCByZWFkIGhlYWRlcnMpICovXG4gIGdldCBoZWFkZXJzKCk6IEFwaUVkaXRIZWFkZXJSb3dbXSB7XG4gICAgaWYgKCF0aGlzLmhlYWRlcnNGb3JtQXJyYXkpIHJldHVybiBbXTtcbiAgICByZXR1cm4gdGhpcy5oZWFkZXJzRm9ybUFycmF5LmNvbnRyb2xzLm1hcCgoYykgPT4gKHtcbiAgICAgIG5hbWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCduYW1lJyk/LnZhbHVlID8/ICcnLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICB2YWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnLFxuICAgIH0pKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbE1ldGhvZCddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCAmJiB0aGlzLm1ldGhvZEZvcm0pIHtcbiAgICAgIGNvbnN0IHYgPSBjaGFuZ2VzWydpbml0aWFsTWV0aG9kJ10uY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSB0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyB2IDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpO1xuICAgICAgdGhpcy5tZXRob2RGb3JtLnBhdGNoVmFsdWUoeyBtZXRob2Q6IHYgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydodHRwTWV0aG9kT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1ldGhvZFNlbGVjdENvbmZpZygpO1xuICAgICAgaWYgKHRoaXMubWV0aG9kRm9ybSAmJiB0aGlzLmh0dHBNZXRob2RPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMubWV0aG9kRm9ybS5nZXQoJ21ldGhvZCcpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRNZXRob2RWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgdmFsaWQgPSB2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCk7XG4gICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5odHRwTWV0aG9kT3B0aW9uc1swXSk7XG4gICAgICAgICAgaWYgKGZpcnN0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSBmaXJzdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5tZXRob2RGb3JtLnBhdGNoVmFsdWUoeyBtZXRob2Q6IGZpcnN0VmFsdWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsRW52aXJvbm1lbnQnXT8uY3VycmVudFZhbHVlICE9IG51bGwgJiYgdGhpcy5lbnZpcm9ubWVudEZvcm0pIHtcbiAgICAgIGNvbnN0IHYgPSBjaGFuZ2VzWydpbml0aWFsRW52aXJvbm1lbnQnXS5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gdHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKTtcbiAgICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtLnBhdGNoVmFsdWUoeyBlbnZpcm9ubWVudDogdiB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2Vudmlyb25tZW50T3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUVudmlyb25tZW50U2VsZWN0Q29uZmlnKCk7XG4gICAgICBpZiAodGhpcy5lbnZpcm9ubWVudEZvcm0gJiYgdGhpcy5lbnZpcm9ubWVudE9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5lbnZpcm9ubWVudEZvcm0uZ2V0KCdlbnZpcm9ubWVudCcpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRFbnZpcm9ubWVudFZhbHVlcygpO1xuICAgICAgICBjb25zdCB2YWxpZCA9IHZhbHVlcy5pbmNsdWRlcyhjdXJyZW50KTtcbiAgICAgICAgaWYgKCF2YWxpZCkge1xuICAgICAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmVudmlyb25tZW50T3B0aW9uc1swXSk7XG4gICAgICAgICAgaWYgKGZpcnN0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9IGZpcnN0VmFsdWU7XG4gICAgICAgICAgICB0aGlzLmVudmlyb25tZW50Rm9ybS5wYXRjaFZhbHVlKHsgZW52aXJvbm1lbnQ6IGZpcnN0VmFsdWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydoYXNNb3JlRW52aXJvbm1lbnRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRW52aXJvbm1lbnRzJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlRW52aXJvbm1lbnRTZWxlY3RDb25maWcoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxBdXRoVHlwZSddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCAmJiB0aGlzLmF1dGhUeXBlRm9ybSkge1xuICAgICAgY29uc3QgdiA9IGNoYW5nZXNbJ2luaXRpYWxBdXRoVHlwZSddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGNvbnN0IHJlc29sdmVkID1cbiAgICAgICAgdHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiA6IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCk7XG4gICAgICBpZiAocmVzb2x2ZWQgIT0gbnVsbCkgdGhpcy5hdXRoVHlwZUZvcm0ucGF0Y2hWYWx1ZSh7IGF1dGhUeXBlOiB2IH0pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snYXV0aFR5cGVPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlQXV0aFR5cGVTZWxlY3RDb25maWcoKTtcbiAgICAgIGlmICh0aGlzLmF1dGhUeXBlRm9ybSkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldEF1dGhUeXBlVmFsdWVzKCk7XG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmF1dGhUeXBlRm9ybS5nZXQoJ2F1dGhUeXBlJyk/LnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWwgPVxuICAgICAgICAgICAgY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQgIT09ICcnXG4gICAgICAgICAgICAgID8gdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShjdXJyZW50IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpXG4gICAgICAgICAgICAgICAgOiBTdHJpbmcoY3VycmVudClcbiAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgIGNvbnN0IHZhbGlkID0gY3VycmVudFZhbCAhPSBudWxsICYmIHZhbHVlcy5pbmNsdWRlcyhjdXJyZW50VmFsKTtcbiAgICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gdmFsdWVzWzBdO1xuICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aGlzLmF1dGhUeXBlRm9ybS5wYXRjaFZhbHVlKHsgYXV0aFR5cGU6IGZpcnN0VmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsU3RlcCddKSB7XG4gICAgICB0aGlzLmFwcGx5SW5pdGlhbFN0ZXAoY2hhbmdlc1snaW5pdGlhbFN0ZXAnXS5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFVybCddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy51cmwgPSBBcGlFZGl0U3RlcENvbXBvbmVudC5kZWNvZGVVcmxGb3JEaXNwbGF5KGNoYW5nZXNbJ2luaXRpYWxVcmwnXS5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFBheWxvYWRUYWInXT8uY3VycmVudFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYWN0aXZlUGF5bG9hZFRhYiA9IGNoYW5nZXNbJ2luaXRpYWxQYXlsb2FkVGFiJ10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaGVhZGVyTmFtZU9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsSGVhZGVycyddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkoY2hhbmdlc1snaW5pdGlhbEhlYWRlcnMnXS5jdXJyZW50VmFsdWUgYXMgQXBpRWRpdEhlYWRlclJvd1tdKTtcbiAgICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFJlc3BvbnNlUHJldmlldyddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgY29uc29sZS5sb2coJzk5OTk5OTkgaW5pdGlhbFJlc3BvbnNlUHJldmlldycsIHRoaXMuaW5pdGlhbFJlc3BvbnNlUHJldmlldyk7XG4gICAgICB0aGlzLnJlc3BvbnNlUHJldmlldyA9IGNoYW5nZXNbJ2luaXRpYWxSZXNwb25zZVByZXZpZXcnXS5jdXJyZW50VmFsdWU7XG4gICAgICAvLyBXaGVuIGEgbmV3IHJlc3BvbnNlIHByZXZpZXcgaXMgcHJvdmlkZWQgKGFmdGVyIFNlbmQgUmVxdWVzdCksIHNjcm9sbCBwcmV2aWV3IHNlY3Rpb24gaW50byB2aWV3XG4gICAgICB0aGlzLnNjcm9sbFByZXZpZXdJbnRvVmlldygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbEZvcm1hdCddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCAmJiB0aGlzLnBheWxvYWRGb3JtYXRGb3JtKSB7XG4gICAgICB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IGNoYW5nZXNbJ2luaXRpYWxGb3JtYXQnXS5jdXJyZW50VmFsdWUgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsVmFyaWFibGVOYW1lJ10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZSA9IGNoYW5nZXNbJ2luaXRpYWxWYXJpYWJsZU5hbWUnXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydmb3JtYXRPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlUGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZygpO1xuICAgICAgaWYgKHRoaXMucGF5bG9hZEZvcm1hdEZvcm0pIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMucGF5bG9hZEZvcm1hdEZvcm0uZ2V0KCdmb3JtYXQnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0Rm9ybWF0VmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IHZhbGlkID0gdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnQpO1xuICAgICAgICBpZiAoIXZhbGlkICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IHZhbHVlc1swXTtcbiAgICAgICAgICB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IGZpcnN0VmFsdWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZlcmlmaWNhdGlvbk9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmVyaWZpY2F0aW9uVmFsdWVzKCk7XG4gICAgICBjb25zdCBkZWZhdWx0VmVyaWZpY2F0aW9uID0gdGhpcy5nZXREZWZhdWx0VmVyaWZpY2F0aW9uKCk7XG4gICAgICBpZiAodGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSAoY29udHJvbCBhcyBGb3JtR3JvdXApLmdldCgndmVyaWZpY2F0aW9uJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50ICYmICF2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCkpIHtcbiAgICAgICAgICAgIChjb250cm9sIGFzIEZvcm1Hcm91cCkucGF0Y2hWYWx1ZSh7IHZlcmlmaWNhdGlvbjogZGVmYXVsdFZlcmlmaWNhdGlvbiB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlVmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcoKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0RGF0YVR5cGVWYWx1ZXMoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHREYXRhVHlwZSA9IHRoaXMuZ2V0RGVmYXVsdERhdGFUeXBlKCk7XG4gICAgICBpZiAodGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSAoY29udHJvbCBhcyBGb3JtR3JvdXApLmdldCgnZGF0YVR5cGUnKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgJiYgIXZhbHVlcy5pbmNsdWRlcyhjdXJyZW50KSkge1xuICAgICAgICAgICAgKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5wYXRjaFZhbHVlKHsgZGF0YVR5cGU6IGRlZmF1bHREYXRhVHlwZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZygpO1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRTdGF0dXNWZXJpZmljYXRpb25WYWx1ZXMoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWZXJpZmljYXRpb24gPSB0aGlzLmdldERlZmF1bHRTdGF0dXNWZXJpZmljYXRpb24oKTtcbiAgICAgIGlmICh0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheSAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IChjb250cm9sIGFzIEZvcm1Hcm91cCkuZ2V0KCd2ZXJpZmljYXRpb24nKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgJiYgIXZhbHVlcy5pbmNsdWRlcyhjdXJyZW50KSkge1xuICAgICAgICAgICAgKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5wYXRjaFZhbHVlKHsgdmVyaWZpY2F0aW9uOiBkZWZhdWx0VmVyaWZpY2F0aW9uIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNtb290aGx5IHNjcm9sbHMgdGhlIHJlc3BvbnNlIHByZXZpZXcgc2VjdGlvbiBpbnRvIHZpZXcgd2l0aGluIHRoZSBzY3JvbGxhYmxlIGNvbnRhaW5lci5cbiAgICogQ2FsbGVkIHdoZW4gYSBmcmVzaCByZXNwb25zZSBwcmV2aWV3IHZhbHVlIGlzIHNldCBmcm9tIHRoZSBwYXJlbnQgKEFQSSBidWlsZGVyKS5cbiAgICovXG4gIHByaXZhdGUgc2Nyb2xsUHJldmlld0ludG9WaWV3KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZXNwb25zZVByZXZpZXdSZWYgfHwgIXRoaXMucmVzcG9uc2VQcmV2aWV3UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5yZXNwb25zZVByZXZpZXdSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgYmxvY2s6ICdzdGFydCcsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGxiYWNrOiBtYW51YWxseSBhZGp1c3QgY2xvc2VzdCBzY3JvbGxhYmxlIHBhcmVudCBpZiBuZWVkZWRcbiAgICAgIGNvbnN0IGVsID0gdGhpcy5yZXNwb25zZVByZXZpZXdSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIGNvbnN0IHNjcm9sbFBhcmVudCA9IGVsLmNsb3Nlc3QoJy5jcWEtYXBpLWVkaXQtc3RlcC1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICBpZiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFRvcCA9IGVsLm9mZnNldFRvcCAtIDE2OyAvLyBzbWFsbCBwYWRkaW5nXG4gICAgICAgIHNjcm9sbFBhcmVudC5zY3JvbGxUbyh7IHRvcDogb2Zmc2V0VG9wIDwgMCA/IDAgOiBvZmZzZXRUb3AsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1jb250YWluZXIgY3FhLWJnLVsjZmZmZmZmXSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1wLVsxNnB4XSBjcWEtZ2FwLVsxMnB4XSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1vdmVyZmxvdy14LWhpZGRlbiBjcWEtYm94LWJvcmRlclwiPlxuXG4gIDxoMiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXRpdGxlIGNxYS1mb250LWludGVyIGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTAwJV0gY3FhLXRyYWNraW5nLW5vcm1hbCBjcWEtdGV4dC1bIzAwMDAwMF0gY3FhLW0tMFwiPlxuICAgIHt7IGVkaXRNb2RlID8gJ1VwZGF0ZSBBUEkgVGVzdCBTdGVwJyA6ICdDcmVhdGUgQVBJIFRlc3QgU3RlcCcgfX1cbiAgPC9oMj5cblxuICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW5kaWNhdG9yIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0wIGNxYS1tYXgtWzc2N3B4XTpjcWEtZmxleC13cmFwIGNxYS1tYXgtWzc2N3B4XTpjcWEtZ2FwLTIgY3FhLW1heC1bNzY3cHhdOmNxYS1qdXN0aWZ5LXN0YXJ0XCJcbiAgICBbY2xhc3MuY3FhLWp1c3RpZnktc3RhcnRdPVwic3RlcExhYmVscy5sZW5ndGggPT09IDFcIlxuICAgIFtjbGFzcy5jcWEtanVzdGlmeS1iZXR3ZWVuXT1cInN0ZXBMYWJlbHMubGVuZ3RoICE9PSAxXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RlcCBvZiBzdGVwTGFiZWxzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIlxuICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvci1pdGVtIGNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvci1pdGVtLS1jbGlja2FibGUgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVsxMHB4XSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWZvbnQtaW5oZXJpdCBjcWEtdGV4dC1pbmhlcml0IGNxYS10ZXh0LWxlZnQgIWNxYS1iZy10cmFuc3BhcmVudFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1N0ZXAgJyArIHN0ZXAuaW5kZXggKyAnOiAnICsgc3RlcC5sYWJlbFwiIFthdHRyLmFyaWEtcHJlc3NlZF09XCJzdGVwLmluZGV4ID09PSBjdXJyZW50U3RlcFwiXG4gICAgICAgIChjbGlja2VkKT1cInNldFN0ZXAoc3RlcC5pbmRleClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbmRpY2F0b3ItY2lyY2xlIGNxYS13LTggY3FhLWgtOCBjcWEtcm91bmRlZC1mdWxsIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLWxlYWRpbmctbm9uZSBjcWEtYm9yZGVyLW5vbmUgY3FhLXNocmluay0wXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJzdGVwLmluZGV4ID09PSBjdXJyZW50U3RlcCA/ICdjcWEtYmctWyM0RjQ2RTVdIGNxYS10ZXh0LXdoaXRlJyA6ICdjcWEtYmctWyNFMEUwRTBdIGNxYS10ZXh0LVsjNjY2NjY2XSdcIj5cbiAgICAgICAgICB7eyBzdGVwLmluZGV4IH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbmRpY2F0b3ItbGFiZWwgY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtbWF4LVs3NjdweF06Y3FhLXRleHQteHNcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInN0ZXAuaW5kZXggPT09IGN1cnJlbnRTdGVwID8gJ2NxYS10ZXh0LVsjNEY0NkU1XScgOiAnY3FhLXRleHQtWyM2NjY2NjZdJ1wiPlxuICAgICAgICAgIHt7IHN0ZXAubGFiZWwgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaSA8IHN0ZXBMYWJlbHMubGVuZ3RoIC0gMVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW5kaWNhdG9yLWxpbmUgY3FhLXctWzk2cHhdIGNxYS1oLVsycHhdIGNxYS1iZy1bI0UwRTBFMF0gY3FhLW15LTAgY3FhLW14LVs2cHhdIGNxYS1zaHJpbmstMCBjcWEtc2VsZi1jZW50ZXIgY3FhLW1heC1bNzY3cHhdOmNxYS13LVsyNHB4XSBjcWEtbWF4LVs3NjdweF06Y3FhLW14LTFcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2Rpdj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTdGVwIGNvbnRlbnQgdmlld3BvcnQ6IG9ubHkgdGhlIGFjdGl2ZSBzdGVwIGJvZHkgaXMgc2hvd24gKCpuZ0lmKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZpZXdwb3J0IGNxYS13LWZ1bGxcIj5cbiAgICA8IS0tIFN0ZXAgMTogRW52aXJvbm1lbnQsIHJlcXVlc3QsIGJvZHksIHJlc3BvbnNlIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U3RlcCA9PT0gMVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGFuZWwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNiBjcWEtYm94LWJvcmRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgIDwhLS0gRW52aXJvbm1lbnQgcm93OiBsYWJlbCBvbiB0b3AsIHNlbGVjdCBiZWxvdyAoYWxpZ25lZCByaWdodCBvbiBkZXNrdG9wKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWVudmlyb25tZW50LXJvdyBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLWl0ZW1zLWVuZCBjcWEtbWF4LVs3NjdweF06Y3FhLWl0ZW1zLXN0cmV0Y2hcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWF4LVs3NjdweF06Y3FhLWl0ZW1zLXN0cmV0Y2hcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1lbnZpcm9ubWVudC1sYWJlbCBjcWEtbS0wIGNxYS10ZXh0LVsxNHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTAwJV0gY3FhLXRyYWNraW5nLW5vcm1hbFwiPkVudmlyb25tZW50czwvbGFiZWw+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cImVudmlyb25tZW50Rm9ybVwiXG4gICAgICAgICAgICBbZm9ybV09XCJlbnZpcm9ubWVudEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJlbnZpcm9ubWVudFNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWVudmlyb25tZW50LXNlbGVjdCBjcWEtc2hyaW5rLTAgY3FhLXctYXV0byBjcWEtbWluLXctWzMxNXB4XSBjcWEtbWF4LXctWzMxNXB4XSBjcWEtbWF4LVs3NjdweF06Y3FhLW1pbi13LTAgY3FhLW1heC1bNzY3cHhdOmNxYS1tYXgtdy1mdWxsIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsIFsmXy5tYXQtZm9ybS1maWVsZC13cmFwcGVyXTpjcWEtcGItMFwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiRW52aXJvbm1lbnRcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbkVudmlyb25tZW50U2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJlcXVlc3Qgcm93OiBtZXRob2QsIFVSTCwgYnV0dG9ucyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXJlcXVlc3Qtcm93IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1mbGV4LXdyYXAgY3FhLW1heC1bNzY3cHhdOmNxYS1mbGV4LWNvbCBjcWEtbWF4LVs3NjdweF06Y3FhLWl0ZW1zLXN0cmV0Y2ggY3FhLW1heC1bNzY3cHhdOmNxYS1nYXAtMi41XCI+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cIm1ldGhvZEZvcm1cIiBbZm9ybV09XCJtZXRob2RGb3JtXCIgW2NvbmZpZ109XCJtZXRob2RTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1tZXRob2Qtc2VsZWN0IGNxYS1zaHJpbmstMCBjcWEtdy1hdXRvIGNxYS1taW4tdy1bMTUycHhdIGNxYS1tYXgtdy1bMTUycHhdIGNxYS1tYXgtWzc2N3B4XTpjcWEtbWluLXctMCBjcWEtbWF4LVs3NjdweF06Y3FhLW1heC13LWZ1bGwgY3FhLW1heC1bNzY3cHhdOmNxYS13LWZ1bGxcIiBhcmlhLWxhYmVsPVwiSFRUUCBtZXRob2RcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbk1ldGhvZFNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXVybC13cmFwIGNxYS1mbGV4LTEgY3FhLW1pbi13LVsyMDBweF0gY3FhLW1heC1bNzY3cHhdOmNxYS1taW4tdy0wIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICBbdmFsdWVdPVwidXJsXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInVybCA9ICRldmVudFwiXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cInVybE9wdGlvbnNcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidXJsUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJFbnRlciBVUkwgb3Igc2VsZWN0IFBhcmFtZXRlclwiXG4gICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIChvcHRpb25TZWxlY3QpPVwib25VcmxPcHRpb25TZWxlY3QoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9jcWEtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVybEVycm9yXCIgY2xhc3M9XCJjcWEtdGV4dC1yZWQtNjAwIGNxYS10ZXh0LXNtIGNxYS1tdC0xXCI+XG4gICAgICAgICAgICAgIHt7IHVybEVycm9yIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtdHJpZ2dlciBjcWEtY29udGVudHMgY3FhLW1heC1bNzY3cHhdOmNxYS13LWZ1bGwgY3FhLW1heC1bNzY3cHhdOiFjcWEtZmxleFwiIChjbGljayk9XCJvcGVuSW1wb3J0Q3VybFBhbmVsKClcIj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiSW1wb3J0IEFQSSBjVVJMXCJcbiAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1idG4tb3V0bGluZSAhY3FhLWJnLXdoaXRlICFjcWEtYm9yZGVyICFjcWEtYm9yZGVyLXNvbGlkICFjcWEtYm9yZGVyLVsjNkI3MjgwXSBjcWEtdGV4dC1bIzQxNDE0Nl0gY3FhLWZvbnQtaW50ZXIgY3FhLXRleHQtWzE0cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLVsxMDAlXSBjcWEtdHJhY2tpbmctbm9ybWFsIGhvdmVyOiFjcWEtYmctWyNGOUZBRkJdIGhvdmVyOiFjcWEtdGV4dC1bIzQxNDE0Nl0gY3FhLW1heC1bNzY3cHhdOmNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIlNlbmQgUmVxdWVzdFwiIChjbGlja2VkKT1cIm9uU2VuZFJlcXVlc3QoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzVXJsVmFsaWRcIlxuICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1idG4tcHJpbWFyeSBjcWEtZm9udC1pbnRlciBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzEwMCVdIGNxYS10cmFja2luZy1ub3JtYWwgIWNxYS1iZy1bIzNGNDNFRV0gY3FhLXRleHQtWyNGQkZDRkZdICFjcWEtYm9yZGVyLW5vbmUgY3FhLXB5LTIuNSBjcWEtcHgtNiBjcWEtZ2FwLTIgY3FhLXJvdW5kZWQtbGcgY3FhLW1pbi1oLVszN3B4XSBjcWEtYm94LWJvcmRlciBob3ZlcjohY3FhLWJnLVsjMUIxRkVCXSBjcWEtbWF4LVs3NjdweF06Y3FhLXctZnVsbFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7JyFjcWEtb3BhY2l0eS01MCAhY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6ICFpc1VybFZhbGlkfVwiPlxuICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cblxuXG4gICAgICAgIDwhLS0gQm9keSBjb250ZW50OiBoZWFkZXIgc2VjdGlvbiAoZGVmYXVsdCkgT1IgaW1wb3J0IGNVUkwgc2VjdGlvbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJvZHlWaWV3ID09PSAnaW1wb3J0LWN1cmwnXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXBhbmVsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1zaGFkb3ctWzBfMXB4XzNweF9yZ2JhKDAsMCwwLDAuMDgpXSBjcWEtb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtaGVhZGVyIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHktMyBjcWEtcHgtNSBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtYmctWyNGOUZBRkJdIGNxYS1yb3VuZGVkLXQtbGcgY3FhLW1heC1bNzY3cHhdOmNxYS1weC00XCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXRpdGxlIGNxYS1tLTAgY3FhLXRleHQteHMgY3FhLWZvbnQtYm9sZCBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRleHQtWyMzNzQxNTFdXCI+SW1wb3J0IEFQSSBjVVJMPC9oMz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXNlcGFyYXRvciBjcWEtaC1weCBjcWEtYmctWyNFMkU4RjBdIGNxYS1teS0wIGNxYS1teC01XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYm9keVwiPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYSBbdmFsdWVdPVwiaW1wb3J0Q3VybENvbnRyb2wudmFsdWVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJpbXBvcnRDdXJsQ29udHJvbC5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBhc3RlIHlvdXIgY1VSTCBjb21tYW5kIGhlcmUgKGUuZy4sIGN1cmwgLVggUE9TVCBodHRwczovL2FwaS5leGFtcGxlLmNvbS91c2VycylcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFtyb3dzXT1cIjhcIiByZXNpemU9XCJ2ZXJ0aWNhbFwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC10ZXh0YXJlYVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJDYW5jZWxcIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYnRuLWNhbmNlbFwiIChjbGlja2VkKT1cIm9uQ2FuY2VsSW1wb3J0Q3VybCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJJbXBvcnRcIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYnRuLWltcG9ydFwiIChjbGlja2VkKT1cIm9uSW1wb3J0Q3VybENvbmZpcm0oKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm9keVZpZXcgPT09ICdoZWFkZXJzJ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzLXdyYXBwZXIgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXRhYnNcIj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gKm5nRm9yPVwibGV0IHRhYiBvZiBwYXlsb2FkVGFic1wiIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFt0ZXh0XT1cInRhYi5sYWJlbFwiXG4gICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC10YWInICsgKGFjdGl2ZVBheWxvYWRUYWIgPT09IHRhYi52YWx1ZSA/ICcgY3FhLWFwaS1lZGl0LXN0ZXAtdGFiLS1hY3RpdmUnIDogJycpICsgKGlzTWV0aG9kV2l0aG91dEJvZHkgJiYgKHRhYi52YWx1ZSA9PT0gJ2JvZHknIHx8IHRhYi52YWx1ZSA9PT0gJ3BhcmFtcycpID8gJyBjcWEtYXBpLWVkaXQtc3RlcC10YWItLWRpc2FibGVkJyA6ICcnKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTWV0aG9kV2l0aG91dEJvZHkgJiYgKHRhYi52YWx1ZSA9PT0gJ2JvZHknIHx8IHRhYi52YWx1ZSA9PT0gJ3BhcmFtcycpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJzZXRQYXlsb2FkVGFiKHRhYi52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUGF5bG9hZCBjb250ZW50IChBdXRob3JpemF0aW9uKSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVQYXlsb2FkVGFiID09PSAnYXV0aG9yaXphdGlvbidcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWRcIlxuICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCIncGFkZGluZzogMjBweDsgbWluLWhlaWdodDogMjAwcHg7J1wiPlxuICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDIwcHg7J1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogOHB4OyB3aWR0aDogZml0LWNvbnRlbnQ7J1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC13ZWlnaHQ6IDYwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsgY29sb3I6ICM2QjcyODA7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5BVVRIIFRZUEU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0ICpuZ0lmPVwiYXV0aFR5cGVGb3JtXCIgW2Zvcm1dPVwiYXV0aFR5cGVGb3JtXCIgW2NvbmZpZ109XCJhdXRoVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYXV0aC10eXBlLXNlbGVjdFwiIGFyaWEtbGFiZWw9XCJBdXRoIHR5cGVcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInbWluLXdpZHRoOiAxNjBweDsnXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIE5vIEF1dGg6IGNlbnRlcmVkIG1lc3NhZ2UgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkQXV0aFR5cGUgPT09ICduby1hdXRoJ1wiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInZmxleDogMTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogMTJweDsgbWluLXdpZHRoOiAwOyB0ZXh0LWFsaWduOiBjZW50ZXI7J1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInd2lkdGg6IDQ4cHg7IGhlaWdodDogNDhweDsgYm9yZGVyLXJhZGl1czogMTBweDsgYmFja2dyb3VuZDogI0YzRjRGNjsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGZsZXgtc2hyaW5rOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNVwiIHk9XCIxMVwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIyXCIgcng9XCIxXCIgZmlsbD1cIiM5Q0EzQUZcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPk5vIEF1dGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgZ2FwOiA2cHg7IGZsZXgtd3JhcDogd3JhcDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA0MDA7IGNvbG9yOiAjOUNBM0FGOyBsaW5lLWhlaWdodDogMS40OydcIj5UaGlzIHJlcXVlc3QgZG9lcyBub3QgdXNlIGFueSBhdXRob3JpemF0aW9uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gcm9sZT1cImltZ1wiIGFyaWEtbGFiZWw9XCJNb3JlIGluZm9ybWF0aW9uXCIgdGl0bGU9XCJUaGlzIHJlcXVlc3QgZG9lcyBub3QgdXNlIGFueSBhdXRob3JpemF0aW9uLlwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgd2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgY29sb3I6ICM5Q0EzQUY7IGZsZXgtc2hyaW5rOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiN1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOCA3djRNOCA1di41XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gQmVhcmVyIFRva2VuOiBUb2tlbiBsYWJlbCArIHRleHRhcmVhIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEF1dGhUeXBlID09PSAnYmVhcmVyJ1wiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInZmxleDogMTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxMHB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5Ub2tlbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRleHRhcmVhIFsodmFsdWUpXT1cImJlYXJlclRva2VuXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBiZWFyZXIgdG9rZW5cIlxuICAgICAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIiBbcm93c109XCI2XCIgcmVzaXplPVwidmVydGljYWxcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWF1dGgtdG9rZW4tdGV4dGFyZWFcIiBhcmlhTGFiZWw9XCJCZWFyZXIgdG9rZW5cIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS10ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIE9BdXRoIDIuMDogR3JhbnQgVHlwZSwgQWNjZXNzIFRva2VuIFVSTCwgQ2xpZW50IElELCBDbGllbnQgU2VjcmV0LCBTY29wZSwgQ2xpZW50IEF1dGhlbnRpY2F0aW9uIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEF1dGhUeXBlID09PSAnb2F1dGgyJyAmJiBvYXV0aDJGb3JtXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtb2F1dGgyLWdyaWRcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgZ2FwOiAxNnB4IDI0cHg7IHdpZHRoOiAxMDAlOydcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPkdyYW50IFR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgKm5nSWY9XCJvYXV0aDJGb3JtXCIgW2Zvcm1dPVwib2F1dGgyRm9ybVwiIFtjb25maWddPVwib2F1dGgyR3JhbnRUeXBlU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWF1dGgtb2F1dGgtc2VsZWN0XCIgYXJpYS1sYWJlbD1cIk9BdXRoIGdyYW50IHR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cIidtaW4td2lkdGg6IDA7IHdpZHRoOiAxMDAlOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgY29sb3I6ICM2QjcyODA7IGxpbmUtaGVpZ2h0OiAxLjM7J1wiPk9BdXRoIGdyYW50IHR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPkFjY2VzcyBUb2tlbiBVUkw8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJvYXV0aDJGb3JtLmdldCgnYWNjZXNzVG9rZW5VcmwnKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvYXV0aDJGb3JtLmdldCgnYWNjZXNzVG9rZW5VcmwnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicnXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBPQXV0aCB0b2tlbiBlbmRwb2ludFwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiQWNjZXNzIFRva2VuIFVSTFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgY29sb3I6ICM2QjcyODA7IGxpbmUtaGVpZ2h0OiAxLjM7J1wiPk9BdXRoIHRva2VuIGVuZHBvaW50PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5DbGllbnQgSUQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJvYXV0aDJGb3JtLmdldCgnY2xpZW50SWQnKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvYXV0aDJGb3JtLmdldCgnY2xpZW50SWQnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicnXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBPQXV0aCBjbGllbnQgaWRlbnRpZmllclwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiQ2xpZW50IElEXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzZCNzI4MDsgbGluZS1oZWlnaHQ6IDEuMzsnXCI+T0F1dGggY2xpZW50IGlkZW50aWZpZXI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPkNsaWVudCBTZWNyZXQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJvYXV0aDJGb3JtLmdldCgnY2xpZW50U2VjcmV0Jyk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib2F1dGgyRm9ybS5nZXQoJ2NsaWVudFNlY3JldCcpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicGFzc3dvcmRcIiBbbGFiZWxdPVwiJydcIiBwbGFjZWhvbGRlcj1cIkVudGVyIE9BdXRoIGNsaWVudCBzZWNyZXRcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkNsaWVudCBTZWNyZXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMXB4OyBmb250LXN0eWxlOiBpdGFsaWM7IGNvbG9yOiAjNkI3MjgwOyBsaW5lLWhlaWdodDogMS4zOydcIj5PQXV0aCBjbGllbnQgc2VjcmV0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5TY29wZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cIm9hdXRoMkZvcm0uZ2V0KCdzY29wZScpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9hdXRoMkZvcm0uZ2V0KCdzY29wZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJydcIiBwbGFjZWhvbGRlcj1cIkVudGVyIHNwYWNlLXNlcGFyYXRlZCBzY29wZXNcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIlNjb3BlXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzZCNzI4MDsgbGluZS1oZWlnaHQ6IDEuMzsnXCI+U3BhY2Utc2VwYXJhdGVkIHNjb3Blczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7IG1pbi13aWR0aDogMDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMzc0MTUxOyBsaW5lLWhlaWdodDogMS4yNTsnXCI+Q2xpZW50IEF1dGhlbnRpY2F0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0ICpuZ0lmPVwib2F1dGgyRm9ybVwiIFtmb3JtXT1cIm9hdXRoMkZvcm1cIiBbY29uZmlnXT1cIm9hdXRoMkNsaWVudEF1dGhTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYXV0aC1vYXV0aC1zZWxlY3RcIiBhcmlhLWxhYmVsPVwiQ2xpZW50IGF1dGhlbnRpY2F0aW9uIG1ldGhvZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ21pbi13aWR0aDogMDsgd2lkdGg6IDEwMCU7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzZCNzI4MDsgbGluZS1oZWlnaHQ6IDEuMzsnXCI+Q2xpZW50IGF1dGhlbnRpY2F0aW9uIG1ldGhvZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBheWxvYWQgY29udGVudCAoSGVhZGVycykgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlUGF5bG9hZFRhYiA9PT0gJ2hlYWRlcnMnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWdyaWRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWhlYWRlcnMtbGFiZWxcIj5IZWFkZXIgTmFtZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWhlYWRlcnMtbGFiZWxcIj5IZWFkZXIgVmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLWhlYWRlcnMtbGFiZWwtLWVtcHR5XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBoZWFkZXJSb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5SGVhZGVyXCIgW2Zvcm1Hcm91cF09XCJyb3dcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwicm93XCIgW2NvbmZpZ109XCJoZWFkZXJOYW1lU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgIChhZGRDdXN0b21WYWx1ZSk9XCJvbkhlYWRlck5hbWVBZGRDdXN0b21WYWx1ZSgkZXZlbnQsIHJvdylcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItdHlwZS1zZWxlY3QgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItdmFsdWUtaW5wdXRcIiBhcmlhTGFiZWw9XCJIZWFkZXIgdmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInUmVtb3ZlIGhlYWRlcidcIiAoY2xpY2tlZCk9XCJyZW1vdmVIZWFkZXIoaSlcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5QkZCRlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWRkLWhlYWRlci13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgdGV4dD1cIisgQWRkIEhlYWRlclwiXG4gICAgICAgICAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLWFkZC1oZWFkZXItbGluaydcIiAoY2xpY2tlZCk9XCJhZGRIZWFkZXIoKVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBQYXlsb2FkIGNvbnRlbnQgKFBhcmFtcyk6IEtleeKAk1ZhbHVlIHRhYmxlIHdpdGggYWRkL2RlbGV0ZSByb3dzIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVBheWxvYWRUYWIgPT09ICdwYXJhbXMnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtZ3JpZCBjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWxcIj5LZXk8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWxcIj5WYWx1ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1sYWJlbCBjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWwtLWVtcHR5XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBwYXJhbXNSb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5UGFyYW1zXCIgW2Zvcm1Hcm91cF09XCJyb3dcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCdrZXknKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2tleScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJLZXlcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtaW5wdXRcIiBhcmlhTGFiZWw9XCJLZXlcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyb3cuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJWYWx1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIlZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSByb3cnXCIgKGNsaWNrZWQpPVwicmVtb3ZlUGFyYW1zUm93KGkpXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1hZGQtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIisgQWRkIFJvd1wiXG4gICAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1hZGQtYnRuXCIgKGNsaWNrZWQpPVwiYWRkUGFyYW1zUm93KClcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUGF5bG9hZCBjb250ZW50IChCb2R5IG9ubHkpOiB0eXBlLCBmb3JtYXQsIHRleHQgYXJlYSwgQmFjay9OZXh0IC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVBheWxvYWRUYWIgPT09ICdib2R5J1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZCBjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWVkaXRvclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLWxhYmVsXCI+VHlwZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLXJhZGlvc1wiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2wgW3ZhbHVlXT1cInBheWxvYWRUeXBlXCIgW3NlZ21lbnRzXT1cInBheWxvYWRUeXBlU2VnbWVudHNcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25QYXlsb2FkVHlwZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXR5cGUtc2VnbWVudFwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYXlsb2FkVHlwZSA9PT0gJ3JhdydcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZm9ybWF0LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1mb3JtYXQtbGFiZWxcIj5Gb3JtYXQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cInBheWxvYWRGb3JtYXRGb3JtXCIgW2Zvcm1dPVwicGF5bG9hZEZvcm1hdEZvcm1cIlxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cInBheWxvYWRGb3JtYXRTZWxlY3RDb25maWdcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZm9ybWF0LXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGb3JtYXRcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPCEtLSBSYXc6IHRleHQgYXJlYSB3aXRoIGxpbmUgbnVtYmVycyAoUG9zdG1hbi1zdHlsZSBwYXlsb2FkIGJvZHkpIC0tPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGF5bG9hZFR5cGUgPT09ICdyYXcnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWJvZHlcIiAjcGF5bG9hZEVkaXRvcldpdGhMaW5lc1JlZj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1lZGl0b3Itd2l0aC1saW5lc1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtbGluZS1udW1iZXJzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBuIG9mIHBheWxvYWRMaW5lTnVtYmVyc1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1saW5lLW51bVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGF5bG9hZEpzb25FcnJvciAmJiBwYXlsb2FkSnNvbkVycm9yLmxpbmUgPT09IG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWxpbmUtZXJyb3ItaWNvblwiIFt0aXRsZV09XCJwYXlsb2FkSnNvbkVycm9yVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUGFyc2UgZXJyb3Igb24gdGhpcyBsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIGZpbGw9XCIjRUY0NDQ0XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNGw2IDZNMTAgNGwtNiA2XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1saW5lLW51bS10ZXh0XCI+e3sgbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10ZXh0YXJlYS1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhIGNxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4taC0wXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdGV4dGFyZWEtLWVycm9yJzogcGF5bG9hZEpzb25FcnJvcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgI3BheWxvYWRUZXh0YXJlYVJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhLWlucHV0IGNxYS13LWZ1bGwgY3FhLW91dGxpbmUtbm9uZSBjcWEtYm94LWJvcmRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdGV4dGFyZWEtaW5wdXQtLWVycm9yJzogcGF5bG9hZEpzb25FcnJvcn1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInBheWxvYWRUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1BheWxvYWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCIhIXBheWxvYWRKc29uRXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uUGF5bG9hZElucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25QYXlsb2FkS2V5ZG93bigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cInBheWxvYWRKc29uRXJyb3JcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtanNvbi1lcnJvci1tc2dcIj5cbiAgICAgICAgICAgICAgICAgIEludmFsaWQgSlNPTiBmb3JtYXQuIFBsZWFzZSBjaGVjayB5b3VyIHN5bnRheC5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0geC13d3ctZm9ybS11cmxlbmNvZGVkOiBLZXnigJNWYWx1ZSByb3dzLCBhZGQvcmVtb3ZlIGR5bmFtaWNhbGx5IC0tPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGF5bG9hZFR5cGUgPT09ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWdyaWQgY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWxcIj5LZXk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1sYWJlbFwiPlZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWwgY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2Yga2V5VmFsdWVSb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5S2V5VmFsdWVcIiBbZm9ybUdyb3VwXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCdrZXknKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgna2V5Jyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIktleVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiS2V5XCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgndmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIlZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1kZWxldGUnXCJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSByb3cnXCIgKGNsaWNrZWQpPVwicmVtb3ZlS2V5VmFsdWVSb3coaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1kZWxldGUtaWNvblwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwLjY2NjMgNlYxMi42NjY3SDUuMzMzMDFWNkgxMC42NjYzWk05LjY2NjM0IDJINi4zMzMwMUw1LjY2NjM0IDIuNjY2NjdIMy4zMzMwMVY0SDEyLjY2NjNWMi42NjY2N0gxMC4zMzNMOS42NjYzNCAyWk0xMS45OTk3IDQuNjY2NjdIMy45OTk2N1YxMi42NjY3QzMuOTk5NjcgMTMuNCA0LjU5OTY3IDE0IDUuMzMzMDEgMTRIMTAuNjY2M0MxMS4zOTk3IDE0IDExLjk5OTcgMTMuNCAxMS45OTk3IDEyLjY2NjdWNC42NjY2N1pcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWFkZC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCIrIEFkZCBSb3dcIlxuICAgICAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1hZGQtYnRuXCIgKGNsaWNrZWQpPVwiYWRkS2V5VmFsdWVSb3coKVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIEZvcm0gRGF0YTogS2V54oCTVHlwZeKAk1ZhbHVlIHJvd3M7IFR5cGUgaXMgYSBkcm9wZG93biAoVGV4dC9GaWxlKSwgYWRkL3JlbW92ZSBkeW5hbWljYWxseSAtLT5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBheWxvYWRUeXBlID09PSAnZm9ybS1kYXRhJ1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsXCI+S2V5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbFwiPlR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsXCI+VmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2Yga2V5VHlwZVZhbHVlUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUtleVR5cGVWYWx1ZVwiIFtmb3JtR3JvdXBdPVwicm93XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtcm93XCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgna2V5Jyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2tleScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJLZXlcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiS2V5XCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cInJvd1wiIFtjb25maWddPVwia2V5VHlwZVZhbHVlVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtdHlwZS1zZWxlY3QgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgndmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidSZW1vdmUgcm93J1wiIChjbGlja2VkKT1cInJlbW92ZUtleVR5cGVWYWx1ZVJvdyhpKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjlCRkJGXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWFkZC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCIrIEFkZCBSb3dcIlxuICAgICAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWFkZC1idG5cIiAoY2xpY2tlZCk9XCJhZGRLZXlUeXBlVmFsdWVSb3coKVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEFkdmFuY2VkIHNldHRpbmdzIChzdGVwLWxldmVsKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1tdC00XCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtdy1mdWxsIGNxYS10ZXh0LWxlZnQgY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtcHktMiBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWR2YW5jZWRFeHBhbmRlZCA9ICFhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XVwiPkFkdmFuY2VkPC9zcGFuPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtbGcgY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cImFkdmFuY2VkRXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgZXhwYW5kX21vcmVcbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFkdmFuY2VkRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1tdC0yXCI+XG4gICAgICAgICAgICA8Y3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtXG4gICAgICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlc109XCJhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzXCJcbiAgICAgICAgICAgICAgW2FkdmFuY2VkVmFyaWFibGVGb3JtXT1cImFkdmFuY2VkVmFyaWFibGVzRm9ybVwiXG4gICAgICAgICAgICAgICh2YXJpYWJsZUJvb2xlYW5DaGFuZ2UpPVwib25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSgkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICh2YXJpYWJsZVZhbHVlQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgICAgICA8L2NxYS1hZHZhbmNlZC12YXJpYWJsZXMtZm9ybT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIFN0ZXAgMjogVmFyaWFibGUgTmFtZTogaW5wdXQsIHZhbGlkYXRpb24sIEJhY2sgLyBOZXh0IC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U3RlcCA9PT0gMlwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGFuZWwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNiBjcWEtYm94LWJvcmRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12YXJpYWJsZS1zZWN0aW9uXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZhcmlhYmxlLWlucHV0LXdyYXBcIj5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFsodmFsdWUpXT1cInZhcmlhYmxlTmFtZVwiIFtsYWJlbF09XCInJ1wiIHBsYWNlaG9sZGVyPVwiVmFyaWFibGUgTmFtZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIHNpemU9XCJtZFwiICh2YWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlTmFtZUNoYW5nZSgpXCIgYXJpYS1sYWJlbD1cIlZhcmlhYmxlIE5hbWVcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCAqbmdJZj1cInZhcmlhYmxlTmFtZUVycm9yXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12YXJpYWJsZS1lcnJvclwiIHJvbGU9XCJhbGVydFwiPnt7IHZhcmlhYmxlTmFtZUVycm9yIH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIFN0ZXAgMzogUmVzcG9uc2UgQm9keSAvIFN0YXR1cyB0YWJzIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U3RlcCA9PT0gM1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGFuZWwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNiBjcWEtYm94LWJvcmRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzLXdyYXBwZXIgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzXCI+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvbiAqbmdGb3I9XCJsZXQgdGFiIG9mIHJlc3BvbnNlVmVyaWZpY2F0aW9uVGFic1wiIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFt0ZXh0XT1cInRhYi5sYWJlbFwiXG4gICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtdGFiJyArIChhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9PT0gdGFiLnZhbHVlID8gJyBjcWEtYXBpLWVkaXQtc3RlcC10YWItLWFjdGl2ZScgOiAnJylcIlxuICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJzZXRSZXNwb25zZVZlcmlmaWNhdGlvblRhYih0YWIudmFsdWUpXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFJlc3BvbnNlIEJvZHkgdGFiIGNvbnRlbnQ6IHZlcmlmaWNhdGlvbiBncmlkIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9PT0gJ3Jlc3BvbnNlLWJvZHknXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGVwMy1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWhlYWRlci1yb3cgY3FhLWZsZXggY3FhLWZsZXgtcm93IGNxYS1qdXN0aWZ5LWVuZCBjcWEtaXRlbXMtY2VudGVyIGNxYS1wdC0wIGNxYS1wci0wIGNxYS1wYi0yIGNxYS1wbC0wXCI+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgdGV4dD1cIkFkZCBWZXJpZmljYXRpb25cIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWFkZC1saW5rXCIgKGNsaWNrZWQpPVwiYWRkVmVyaWZpY2F0aW9uUm93KClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZ3JpZCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZ3JpZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPlMubm88L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5KU09OIFBhdGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5WZXJpZmljYXRpb248L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5EYXRhIFR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5FeHBlY3RlZCBWYWx1ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWwtLWVtcHR5XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiB2ZXJpZmljYXRpb25Sb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5VmVyaWZpY2F0aW9uXCIgW2Zvcm1Hcm91cF09XCJyb3dcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNub1wiPnt7IGkgKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCdqc29uUGF0aCcpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnanNvblBhdGgnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiSnNvbiBQYXRoXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWlucHV0XCIgYXJpYUxhYmVsPVwiSlNPTiBQYXRoXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwicm93XCIgW2NvbmZpZ109XCJ2ZXJpZmljYXRpb25TZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cInJvd1wiIFtjb25maWddPVwidmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tc2VsZWN0IGNxYS13LWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblZlcmlmaWNhdGlvbkRhdGFUeXBlQ2hhbmdlKHJvdywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwhLS0gRXhwZWN0ZWQgVmFsdWU6IHRleHQgZm9yIFN0cmluZy9BcnJheS9PYmplY3QsIG51bWJlciBmb3IgTnVtYmVyLCBkcm9wZG93biBmb3IgQm9vbGVhbiAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJyb3cuZ2V0KCdkYXRhVHlwZScpPy52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdTd2l0Y2hDYXNlPVwiJ2Jvb2xlYW4nXCIgW2Zvcm1dPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJ2ZXJpZmljYXRpb25FeHBlY3RlZFZhbHVlQm9vbGVhblNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNlbGVjdCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZXhwZWN0ZWQtc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCIgW3ZhbHVlXT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnZXhwZWN0ZWRWYWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJFeHBlY3RlZCBWYWx1ZSAobnVtYmVyKVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1pbnB1dCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZXhwZWN0ZWQtbnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiRXhwZWN0ZWQgVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0ICpuZ1N3aXRjaERlZmF1bHQgW3ZhbHVlXT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnZXhwZWN0ZWRWYWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFeHBlY3RlZCBWYWx1ZSBpbiBTdHJpbmdcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1pbnB1dFwiIGFyaWFMYWJlbD1cIkV4cGVjdGVkIFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInUmVtb3ZlIHJvdydcIiAoY2xpY2tlZCk9XCJyZW1vdmVWZXJpZmljYXRpb25Sb3coaSlcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5QkZCRlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFN0YXR1cyB0YWIgY29udGVudDogUy5ubywgVmVyaWZpY2F0aW9uIGRyb3Bkb3duLCBFeHBlY3RlZCBWYWx1ZSwgYWRkL3JlbW92ZSByb3dzIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9PT0gJ3N0YXR1cydcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN0ZXAzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24taGVhZGVyLXJvdyBjcWEtZmxleCBjcWEtZmxleC1yb3cgY3FhLWp1c3RpZnktZW5kIGNxYS1pdGVtcy1jZW50ZXIgY3FhLXB0LTAgY3FhLXByLTAgY3FhLXBiLTIgY3FhLXBsLTBcIj5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiB0ZXh0PVwiQWRkIFZlcmlmaWNhdGlvblwiXG4gICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tYWRkLWxpbmtcIiAoY2xpY2tlZCk9XCJhZGRTdGF0dXNWZXJpZmljYXRpb25Sb3coKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+Uy5ubzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPlZlcmlmaWNhdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPkV4cGVjdGVkIFZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbC0tZW1wdHlcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIHN0YXR1c1ZlcmlmaWNhdGlvblJvd3M7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlTdGF0dXNWZXJpZmljYXRpb25cIlxuICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwicm93XCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNub1wiPnt7IGkgKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwicm93XCIgW2NvbmZpZ109XCJzdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uLXNlbGVjdCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiRXhwZWN0ZWQgVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkV4cGVjdGVkIFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSByb3cnXCIgKGNsaWNrZWQpPVwicmVtb3ZlU3RhdHVzVmVyaWZpY2F0aW9uUm93KGkpXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBSZXNwb25zZSBQcmV2aWV3IC0tPlxuICA8ZGl2ICNyZXNwb25zZVByZXZpZXdSZWYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1yZXNwb25zZVwiPlxuICAgIDxoMyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXJlc3BvbnNlLXRpdGxlIGNxYS10ZXh0LVsxNHB4XSBjcWEtZm9udC1ib2xkIGNxYS1sZWFkaW5nLVsyMHB4XSBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMCBjcWEtbWItWzEycHhdIGNxYS1zaHJpbmstMFwiPlJlc3BvbnNlIFByZXZpZXc8L2gzPlxuICAgIDxwcmUgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1yZXNwb25zZS1jb250ZW50XCI+e3sgcmVzcG9uc2VQcmV2aWV3IH19PC9wcmU+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU3RlcCBhY3Rpb25zOiBvbmUgcm93LCBmdWxsIHdpZHRoLiBTdGVwIDE6IENhbmNlbCArIE5leHQ7IFN0ZXAgMjogQmFjayArIE5leHQ7IFN0ZXAgMzogQmFjayArIENyZWF0ZSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnNcIj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjdXJyZW50U3RlcFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiMVwiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIkNhbmNlbFwiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1jYW5jZWxcIiAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiTmV4dFwiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1uZXh0XCIgKGNsaWNrZWQpPVwib25OZXh0KClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIyXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiQmFja1wiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1iYWNrXCIgKGNsaWNrZWQpPVwib25CYWNrKClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJOZXh0XCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLW5leHRcIiAoY2xpY2tlZCk9XCJvbk5leHQoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIjNcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJCYWNrXCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLWJhY2tcIiAoY2xpY2tlZCk9XCJvbkJhY2soKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgIDxjcWEtYnV0dG9uICpuZ0lmPVwiIWlzQ3JlYXRpbmdTdGVwXCIgdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiBbdGV4dF09XCJlZGl0TW9kZSA/ICdVcGRhdGUnIDogJ0NyZWF0ZSdcIlxuICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWN0aW9ucy1idG4tY3JlYXRlXCIgKGNsaWNrZWQpPVwib25DcmVhdGUoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgIDwhLS0gTWF0Y2ggY3FhLWJ1dHRvbiBmbGV4OiBhY3Rpb25zIHJvdyBzdHlsZXMgPiBjcWEtYnV0dG9uIHsgZmxleDogMSAxIDAgfSDigJQgbG9hZGVyIGRpdiBtdXN0IGdyb3cgc2FtZSB3aWR0aCBhcyBDcmVhdGUgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0NyZWF0aW5nU3RlcFwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWN0aW9ucy1sb2FkZXIgY3FhLXctZnVsbCBjcWEtbWluLWgtWzM4cHhdIGNxYS1yb3VuZGVkLVs4cHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgPGNxYS1iYWRnZSBsYWJlbD1cIkNyZWF0aW5n4oCmXCIgaWNvbj1cImF1dG9yZW5ld1wiIFtpc0xvYWRpbmddPVwidHJ1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFtjZW50ZXJDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgW2lubGluZVN0eWxlc109XCInbWluLWhlaWdodDogMzhweDsgaGVpZ2h0OiAzOHB4OyB3aWR0aDogMTAwJTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7J1wiXG4gICAgICAgICAgICB2YXJpYW50PVwiaW5mb1wiIHNpemU9XCJtZWRpdW1cIj48L2NxYS1iYWRnZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
2261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1lZGl0LXN0ZXAvYXBpLWVkaXQtc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1lZGl0LXN0ZXAvYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBZSxXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQUtoRixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRztJQUNsQyxlQUFlLEVBQUUsaUJBQWlCO0lBQ2xDLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsVUFBVSxFQUFFLFlBQVk7Q0FDaEIsQ0FBQztBQTBGWCxNQUFNLG9CQUFvQixHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUV2RCw4RUFBOEU7QUFDOUUsTUFBTSx3QkFBd0IsR0FBMkIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFZcEcsU0FBUyxhQUFhLENBQUMsRUFBVTtJQUMvQixPQUFPLEVBQUUsS0FBSyxHQUFHLElBQUksRUFBRSxLQUFLLFFBQVEsSUFBSSxFQUFFLEtBQUssUUFBUSxDQUFDO0FBQzFELENBQUM7QUFDRCxTQUFTLGFBQWEsQ0FBQyxFQUFVO0lBQy9CLE9BQU8sRUFBRSxLQUFLLEdBQUcsSUFBSSxF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ckIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQWlLa0MseUJBQXlCO3NCQUFoRSxTQUFTO3VCQUFDLDJCQUEyQjtnQkFDTCxrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CO2dCQStDdEIsaUJBQWlCO3NCQUF6QixLQUFLO2dCQXNHRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBOENHLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFnRUcseUJBQXlCO3NCQUFqQyxLQUFLO2dCQThDOEMsa0JBQWtCO3NCQUFyRSxTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFXekMseUJBQXlCO3NCQUFqQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IENxYUF1dG9jb21wbGV0ZU9wdGlvbiB9IGZyb20gJy4uLy4uL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUubW9kZWwnO1xuXG5leHBvcnQgY29uc3QgQVBJX0VESVRfU1RFUF9MQUJFTFMgPSB7XG4gIFJFUVVFU1RfREVUQUlMUzogJ1JlcXVlc3QgRGV0YWlscycsXG4gIFNUT1JFX1JFU1BPTlNFOiAnU3RvcmUgUmVzcG9uc2UnLFxuICBWQUxJREFUSU9OOiAnVmFsaWRhdGlvbicsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBBcGlFZGl0UGF5bG9hZFRhYiA9ICdoZWFkZXJzJyB8ICdib2R5JyB8ICdwYXJhbXMnIHwgJ2F1dGhvcml6YXRpb24nO1xuXG4vKiogV2hpY2ggYm9keSBjb250ZW50IGJsb2NrIGlzIHZpc2libGU6IGhlYWRlcnMgKHRhYnMpIG9yIGltcG9ydCBjVVJMIHRleHRhcmVhLiAqL1xuZXhwb3J0IHR5cGUgQXBpRWRpdEJvZHlWaWV3ID0gJ2hlYWRlcnMnIHwgJ2ltcG9ydC1jdXJsJztcblxuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0SGVhZGVyUm93IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKiBQYXlsb2FkIGVtaXR0ZWQgd2hlbiB1c2VyIGNsaWNrcyBTZW5kIFJlcXVlc3QgKGVudmlyb25tZW50LCBtZXRob2QsIHVybCwgaGVhZGVycykuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRTZW5kUmVxdWVzdFBheWxvYWQge1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICBtZXRob2Q6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGhlYWRlcnM6IEFwaUVkaXRIZWFkZXJSb3dbXTtcbn1cblxuLyoqIE9BdXRoIDIuMCBhdXRoIGZpZWxkcyAod2hlbiBhdXRoIHR5cGUgaXMgT0F1dGggMi4wKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdE9BdXRoMlBheWxvYWQge1xuICBncmFudFR5cGU6IHN0cmluZztcbiAgYWNjZXNzVG9rZW5Vcmw6IHN0cmluZztcbiAgY2xpZW50SWQ6IHN0cmluZztcbiAgY2xpZW50U2VjcmV0OiBzdHJpbmc7XG4gIHNjb3BlOiBzdHJpbmc7XG4gIGNsaWVudEF1dGhlbnRpY2F0aW9uOiBzdHJpbmc7XG59XG5cbi8qKiBTdGVwIDEgcmVxdWVzdCArIGJvZHkgcGF5bG9hZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFN0ZXAxUGF5bG9hZCB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgaGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdO1xuICAvKiogU2VsZWN0ZWQgYXV0aCB0eXBlOiBlLmcuICduby1hdXRoJywgJ2JlYXJlcicsICdvYXV0aDInLiAqL1xuICBhdXRoVHlwZTogc3RyaW5nO1xuICAvKiogQmVhcmVyIHRva2VuIHZhbHVlIHdoZW4gYXV0aFR5cGUgaXMgJ2JlYXJlcicuICovXG4gIGJlYXJlclRva2VuPzogc3RyaW5nO1xuICAvKiogT0F1dGggMi4wIGZpZWxkcyB3aGVuIGF1dGhUeXBlIGlzICdvYXV0aDInLiAqL1xuICBvYXV0aDI/OiBBcGlFZGl0T0F1dGgyUGF5bG9hZDtcbiAgYWN0aXZlUGF5bG9hZFRhYjogQXBpRWRpdFBheWxvYWRUYWI7XG4gIHBheWxvYWRUeXBlOiAncmF3JyB8ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ2Zvcm0tZGF0YSc7XG4gIHBheWxvYWRGb3JtYXQ6IHN0cmluZztcbiAgcGF5bG9hZFRleHQ6IHN0cmluZztcbiAga2V5VmFsdWVSb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXTtcbiAga2V5VHlwZVZhbHVlUm93czogeyBrZXk6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXTtcbiAgcGFyYW1zUm93czogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W107XG59XG5cbi8qKiBTdGVwIDIgc3RvcmUtcmVzcG9uc2UgcGF5bG9hZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFN0ZXAyUGF5bG9hZCB7XG4gIHZhcmlhYmxlTmFtZTogc3RyaW5nO1xufVxuXG4vKiogUmVzcG9uc2UgYm9keSB2ZXJpZmljYXRpb24gcm93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0UmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9uUm93IHtcbiAganNvblBhdGg6IHN0cmluZztcbiAgdmVyaWZpY2F0aW9uOiBzdHJpbmc7XG4gIGRhdGFUeXBlOiBzdHJpbmc7XG4gIGV4cGVjdGVkVmFsdWU6IHN0cmluZztcbn1cblxuLyoqIFN0YXR1cyB2ZXJpZmljYXRpb24gcm93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0U3RhdHVzVmVyaWZpY2F0aW9uUm93IHtcbiAgdmVyaWZpY2F0aW9uOiBzdHJpbmc7XG4gIGV4cGVjdGVkVmFsdWU6IHN0cmluZztcbn1cblxuLyoqIFN0ZXAgMyB2YWxpZGF0aW9uIHBheWxvYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRTdGVwM1BheWxvYWQge1xuICBhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYjogJ3Jlc3BvbnNlLWJvZHknIHwgJ3N0YXR1cyc7XG4gIHJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnM6IEFwaUVkaXRSZXNwb25zZUJvZHlWZXJpZmljYXRpb25Sb3dbXTtcbiAgc3RhdHVzVmVyaWZpY2F0aW9uczogQXBpRWRpdFN0YXR1c1ZlcmlmaWNhdGlvblJvd1tdO1xufVxuXG4vKiogRnVsbCBwYXlsb2FkIGVtaXR0ZWQgd2hlbiB1c2VyIGNsaWNrcyBDcmVhdGUgKGFsbCBzdGVwc+KAmSBkYXRhKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdENyZWF0ZVBheWxvYWQge1xuICBzdGVwMTogQXBpRWRpdFN0ZXAxUGF5bG9hZDtcbiAgc3RlcDI6IEFwaUVkaXRTdGVwMlBheWxvYWQ7XG4gIHN0ZXAzOiBBcGlFZGl0U3RlcDNQYXlsb2FkO1xuICAvKiogQWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzIGZvciB0aGlzIEFQSSBzdGVwIChlLmcuIGlzU3RlcE9wdGlvbmFsLCBzaG91bGRTa2lwKS4gKi9cbiAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcz86IGFueVtdO1xufVxuXG4vKiogRW52aXJvbm1lbnQgb3B0aW9uOiBlaXRoZXIgYSBzdHJpbmcgKGRpc3BsYXkgPSB2YWx1ZSkgb3IgYW4gb2JqZWN0IHdpdGggaWQsIG5hbWUsIHZhbHVlLCBsYWJlbC4gKi9cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50T3B0aW9uSW5wdXQgPSBzdHJpbmcgfCBTZWxlY3RPcHRpb247XG5cbmNvbnN0IE1FVEhPRFNfV0lUSE9VVF9CT0RZID0gWydHRVQnLCAnSEVBRCcsICdERUxFVEUnXTtcblxuLyoqIEF1dG8tY2xvc2UgcGFpcnMgZm9yIHBheWxvYWQgSlNPTiBlZGl0b3I6IG9wZW5pbmcgY2hhciAtPiBjbG9zaW5nIGNoYXIuICovXG5jb25zdCBQQVlMT0FEX0FVVE9fQ0xPU0VfUEFJUlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7ICd7JzogJ30nLCAnWyc6ICddJywgJ1wiJzogJ1wiJywgXCInXCI6IFwiJ1wiIH07XG5cbi8qKiBSZXN1bHQgb2YgcGFyc2luZyBhIGNVUkwgY29tbWFuZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkQ3VybCB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgaGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdO1xuICBib2R5OiBzdHJpbmc7XG4gIC8qKiBFbnRyaWVzIGZyb20gLUYgLyAtLWZvcm0gZmxhZ3MgKG11bHRpcGFydC9mb3JtLWRhdGEpLiAqL1xuICBmb3JtRGF0YTogeyBrZXk6IHN0cmluZzsgdHlwZTogJ3RleHQnIHwgJ2ZpbGUnOyB2YWx1ZTogc3RyaW5nIH1bXTtcbn1cblxuZnVuY3Rpb24gaXNTaW5nbGVRdW90ZShjaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaCA9PT0gXCInXCIgfHwgY2ggPT09ICdcXHUyMDE4JyB8fCBjaCA9PT0gJ1xcdTIwMTknO1xufVxuZnVuY3Rpb24gaXNEb3VibGVRdW90ZShjaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaCA9PT0gJ1wiJyB8fCBjaCA9PT0gJ1xcdTIwMUMnIHx8IGNoID09PSAnXFx1MjAxRCc7XG59XG5mdW5jdGlvbiBpc0Nsb3NpbmdRdW90ZShjaDogc3RyaW5nLCBvcGVuUXVvdGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoaXNTaW5nbGVRdW90ZShvcGVuUXVvdGUpKSByZXR1cm4gaXNTaW5nbGVRdW90ZShjaCk7XG4gIGlmIChpc0RvdWJsZVF1b3RlKG9wZW5RdW90ZSkpIHJldHVybiBpc0RvdWJsZVF1b3RlKGNoKTtcbiAgcmV0dXJuIGNoID09PSBvcGVuUXVvdGU7XG59XG5cbi8qKlxuICogVG9rZW5pemUgYSBjVVJMIGNvbW1hbmQgc3RyaW5nIGludG8gYXJndW1lbnQgdG9rZW5zLCBtYXRjaGluZyBiYXNoIHF1b3RpbmcgcnVsZXM6XG4gKiAgLSBTaW5nbGUtcXVvdGVkIHN0cmluZ3MgYXJlIEZVTExZIExJVEVSQUwg4oCUIGJhY2tzbGFzaCBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLlxuICogICAgVGhpcyBwcmVzZXJ2ZXMgSlNPTiBlc2NhcGUgc2VxdWVuY2VzIChlLmcuIFxcXCIpIGluc2lkZSAnLS1kYXRhLXJhdycgYm9kaWVzLlxuICogIC0gRG91YmxlLXF1b3RlZCBzdHJpbmdzIHRyZWF0IGJhY2tzbGFzaCBhcyBhbiBlc2NhcGUgY2hhcmFjdGVyIChcXFwiIOKGkiBcIikuXG4gKiAgICBUaGlzIGhhbmRsZXMgV2luZG93cy1DTUQtbm9ybWFsaXNlZCB2YWx1ZXMgYW5kIHBsYWluIC1kIFwie1xcXCJrXFxcIjpcXFwidlxcXCJ9XCIgYm9kaWVzLlxuICogQWxzbyBoYW5kbGVzIHN0cmFpZ2h0IGFuZCBjdXJseS9zbWFydCBxdW90ZSBjaGFyYWN0ZXJzLlxuICovXG5mdW5jdGlvbiB0b2tlbml6ZUN1cmxMaW5lKGxpbmU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaSA9IDA7XG4gIGNvbnN0IG4gPSBsaW5lLmxlbmd0aDtcbiAgd2hpbGUgKGkgPCBuKSB7XG4gICAgd2hpbGUgKGkgPCBuICYmIC9cXHMvLnRlc3QobGluZVtpXSkpIGkrKztcbiAgICBpZiAoaSA+PSBuKSBicmVhaztcbiAgICBjb25zdCBjaCA9IGxpbmVbaV07XG4gICAgaWYgKGlzU2luZ2xlUXVvdGUoY2gpIHx8IGlzRG91YmxlUXVvdGUoY2gpKSB7XG4gICAgICBjb25zdCBxdW90ZSA9IGNoO1xuICAgICAgY29uc3Qgc2luZ2xlUXVvdGVkID0gaXNTaW5nbGVRdW90ZShjaCk7XG4gICAgICBpKys7XG4gICAgICBsZXQgdmFsdWUgPSAnJztcbiAgICAgIHdoaWxlIChpIDwgbiAmJiAhaXNDbG9zaW5nUXVvdGUobGluZVtpXSwgcXVvdGUpKSB7XG4gICAgICAgIGlmICghc2luZ2xlUXVvdGVkICYmIGxpbmVbaV0gPT09ICdcXFxcJykge1xuICAgICAgICAgIGkrKztcbiAgICAgICAgICBpZiAoaSA8IG4pIHZhbHVlICs9IGxpbmVbaSsrXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSArPSBsaW5lW2krK107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpIDwgbikgaSsrO1xuICAgICAgdG9rZW5zLnB1c2godmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGxldCB3b3JkID0gJyc7XG4gICAgd2hpbGUgKGkgPCBuICYmICEvXFxzLy50ZXN0KGxpbmVbaV0pICYmICFpc1NpbmdsZVF1b3RlKGxpbmVbaV0pICYmICFpc0RvdWJsZVF1b3RlKGxpbmVbaV0pKSB7XG4gICAgICB3b3JkICs9IGxpbmVbaSsrXTtcbiAgICB9XG4gICAgaWYgKHdvcmQpIHRva2Vucy5wdXNoKHdvcmQpO1xuICB9XG4gIHJldHVybiB0b2tlbnM7XG59XG5cbi8qKiBTdHJpcCBvbmUgbGF5ZXIgb2Ygc3Vycm91bmRpbmcgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMgKHVzZWQgZm9yIGlubGluZSAtLWRhdGE9IHZhbHVlcykuICovXG5mdW5jdGlvbiBzdHJpcFN1cnJvdW5kaW5nUXVvdGVzKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChzLmxlbmd0aCA+PSAyICYmICgocy5zdGFydHNXaXRoKFwiJ1wiKSAmJiBzLmVuZHNXaXRoKFwiJ1wiKSkgfHwgKHMuc3RhcnRzV2l0aCgnXCInKSAmJiBzLmVuZHNXaXRoKCdcIicpKSkpIHtcbiAgICByZXR1cm4gcy5zbGljZSgxLCAtMSk7XG4gIH1cbiAgcmV0dXJuIHM7XG59XG5cbi8qKlxuICogRmxhZ3MgdGhhdCB0YWtlIG9uZSBhcmd1bWVudCB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgY29uc3VtZWQgYnV0IERJU0NBUkRFRC5cbiAqIFdpdGhvdXQgdGhpcyBsaXN0LCBmbGFncyBsaWtlIC0tcmVmZXJlciBvciAtLXByb3h5IHdvdWxkIGhhdmUgdGhlaXIgVVJMLWxpa2VcbiAqIGFyZ3VtZW50IG1pc3Rha2VubHkgY2FwdHVyZWQgYXMgdGhlIHJlcXVlc3QgVVJMIGJ5IHRoZSBwYXR0ZXJuIG1hdGNoZXIgYmVsb3cuXG4gKi9cbmNvbnN0IENVUkxfRkxBR1NfV0lUSF9JR05PUkVEX0FSRyA9IG5ldyBTZXQoW1xuICAnLS1yZWZlcmVyJywgJy1lJywgJy0tcmVmZXInLFxuICAnLS1wcm94eScsICcteCcsICctLXNvY2tzNScsICctLXNvY2tzNCcsICctLXNvY2tzNGEnLCAnLS1zb2NrczUtaG9zdG5hbWUnLFxuICAnLS11c2VyLWFnZW50JywgJy1BJyxcbiAgJy0tY29va2llJywgJy1iJyxcbiAgJy0tY29va2llLWphcicsICctYycsXG4gICctbycsICctLW91dHB1dCcsXG4gICctdScsICctLXVzZXInLFxuICAnLS1jZXJ0JywgJy0ta2V5JywgJy0tY2FjZXJ0JywgJy0tY2FwYXRoJyxcbiAgJy0tY29ubmVjdC10aW1lb3V0JywgJy0tbWF4LXRpbWUnLCAnLW0nLFxuICAnLS1yZXRyeScsICctLXJldHJ5LWRlbGF5JywgJy0tcmV0cnktbWF4LXRpbWUnLFxuICAnLS1tYXgtcmVkaXJzJywgJy0taW50ZXJmYWNlJywgJy0tZG5zLXNlcnZlcnMnLFxuICAnLS1wcm94eS11c2VyJywgJy0tcHJveHktaGVhZGVyJyxcbiAgJy0tcmVzb2x2ZScsICctLWxpbWl0LXJhdGUnLFxuICAnLS10bHNwYXNzd29yZCcsICctLXRsc2F1dGh0eXBlJyxcbiAgJy0tdXBsb2FkLWZpbGUnLCAnLVQnLFxuICAnLS1yYW5nZScsICctcicsXG4gICctLXBhc3MnLCAnLS1lbmdpbmUnLFxuICAnLS1waW5uZWRwdWJrZXknLCAnLS1ob3N0cHVibWQ1Jyxcbl0pO1xuXG4vKiogQm9vbGVhbiBmbGFncyB0aGF0IHRha2Ugbm8gYXJndW1lbnQg4oCUIHNraXAgd2l0aG91dCBjb25zdW1pbmcgdGhlIG5leHQgdG9rZW4uICovXG5jb25zdCBDVVJMX05PX0FSR19GTEFHUyA9IG5ldyBTZXQoW1xuICAnLS1jb21wcmVzc2VkJywgJy0tbG9jYXRpb24nLCAnLUwnLCAnLS1pbnNlY3VyZScsICctaycsXG4gICctLXNpbGVudCcsICctcycsICctLXZlcmJvc2UnLCAnLXYnLCAnLS1nZXQnLCAnLUcnLFxuICAnLS1mYWlsJywgJy1mJywgJy0tc2hvdy1lcnJvcicsICctUycsXG4gICctLWhlYWQnLCAnLUknLCAnLS1pbmNsdWRlJywgJy1pJyxcbiAgJy0tcmVtb3RlLW5hbWUnLCAnLU8nLCAnLS1yZW1vdGUtbmFtZS1hbGwnLFxuICAnLS1pcHY0JywgJy00JywgJy0taXB2NicsICctNicsXG4gICctLWFueWF1dGgnLCAnLS1iYXNpYycsICctLWRpZ2VzdCcsICctLW50bG0nLCAnLS1uZWdvdGlhdGUnLFxuICAnLS1uby1rZWVwYWxpdmUnLCAnLS1uby1zZXNzaW9uaWQnLCAnLS1nbG9ib2ZmJywgJy1nJyxcbiAgJy0tcmVtb3RlLXRpbWUnLCAnLVInLCAnLS10Y3Atbm9kZWxheScsXG4gICctLWh0dHAxLjAnLCAnLTAnLCAnLS1odHRwMS4xJywgJy0taHR0cDInLCAnLS1odHRwMi1wcmlvci1rbm93bGVkZ2UnLFxuICAnLS1odHRwMycsICctLW5vLWJ1ZmZlcicsICctTicsXG4gICctLXRyYWNlLXRpbWUnLCAnLS1jZXJ0LXN0YXR1cycsICctLWZhbHNlLXN0YXJ0JyxcbiAgJy0tcGF0aC1hcy1pcycsICctLWxpc3Qtb25seScsICctbCcsXG4gICctLWFwcGVuZCcsICctYScsICctLXVzZS1hc2NpaScsICctQicsXG4gICctLWhhcHJveHktcHJvdG9jb2wnLCAnLS1uZXRyYycsICctbicsICctLW5ldHJjLW9wdGlvbmFsJyxcbl0pO1xuXG4vKiogUGFyc2UgYSBzaW5nbGUgLUYvLS1mb3JtIHZhbHVlIChrZXk9dmFsdWUgfCBrZXk9QGZpbGUgfCBrZXk9PGZpbGUpIGludG8gYSBmb3JtRGF0YSBlbnRyeS4gKi9cbmZ1bmN0aW9uIHBhcnNlRm9ybUVudHJ5KHJhdzogc3RyaW5nKTogeyBrZXk6IHN0cmluZzsgdHlwZTogJ3RleHQnIHwgJ2ZpbGUnOyB2YWx1ZTogc3RyaW5nIH0gfCBudWxsIHtcbiAgY29uc3QgZXEgPSByYXcuaW5kZXhPZignPScpO1xuICBpZiAoZXEgPT09IC0xKSByZXR1cm4gbnVsbDtcbiAgY29uc3Qga2V5ID0gcmF3LnNsaWNlKDAsIGVxKS50cmltKCk7XG4gIGlmICgha2V5KSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmVzdCA9IHJhdy5zbGljZShlcSArIDEpO1xuICAvLyBTdHJpcCBvcHRpb25hbCA7dHlwZT0uLi4gc3VmZml4XG4gIGNvbnN0IHNlbWkgPSByZXN0LmluZGV4T2YoJzsnKTtcbiAgY29uc3QgdmFsID0gKHNlbWkgIT09IC0xID8gcmVzdC5zbGljZSgwLCBzZW1pKSA6IHJlc3QpLnRyaW0oKTtcbiAgaWYgKHZhbC5zdGFydHNXaXRoKCdAJykgfHwgdmFsLnN0YXJ0c1dpdGgoJzwnKSkge1xuICAgIHJldHVybiB7IGtleSwgdHlwZTogJ2ZpbGUnLCB2YWx1ZTogdmFsLnNsaWNlKDEpIH07XG4gIH1cbiAgcmV0dXJuIHsga2V5LCB0eXBlOiAndGV4dCcsIHZhbHVlOiB2YWwgfTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhbnkgY1VSTCBjb21tYW5kIHN0cmluZyBhbmQgcmV0dXJuIG1ldGhvZCwgdXJsLCBoZWFkZXJzLCBib2R5LCBhbmQgZm9ybURhdGEuXG4gKlxuICogU3VwcG9ydGVkIGZvcm1hdHMgLyBmZWF0dXJlczpcbiAqICDigKIgVW5peC9NYWMgIDogc2luZ2xlLXF1b3RlIGFyZ3MsIGJhY2tzbGFzaCAoXFwpIGxpbmUgY29udGludWF0aW9uXG4gKiAg4oCiIFBvd2VyU2hlbGw6IGJhY2t0aWNrIChgKSBsaW5lIGNvbnRpbnVhdGlvblxuICogIOKAoiBXaW5kb3dzIENNRDogXlwiIHF1b3RlIGRlbGltaXRlcnMsIF5cXF5cIiBpbm5lciBlc2NhcGVkIHF1b3RlLCBeIGxpbmUgY29udGludWF0aW9uXG4gKiAg4oCiIEhUVFAgbWV0aG9kICA6IC1YIFBPU1QgfCAtLXJlcXVlc3QgUE9TVCB8IC0tcmVxdWVzdD1QT1NUIHwgLVhQT1NUXG4gKiAg4oCiIEhlYWRlcnMgICAgICA6IC1IIC8gLS1oZWFkZXIgLyAtLWhlYWRlcj0n4oCmJyAvIC1IPSfigKYnIGlubGluZS09IGZvcm1cbiAqICDigKIgQm9keSAgICAgICAgIDogLWQgLyAtLWRhdGEgLyAtLWRhdGEtcmF3IC8gLS1kYXRhLWJpbmFyeSAvIC0tZGF0YS1hc2NpaSAvXG4gKiAgICAgICAgICAgICAgICAgICBpbmxpbmUgLS1kYXRhPSfigKYnIC8gbXVsdGlwbGUgLWQgZmxhZ3MgKGNvbmNhdGVuYXRlZCB3aXRoICYpIC9cbiAqICAgICAgICAgICAgICAgICAgIC0tZGF0YS11cmxlbmNvZGUgLyAtLWpzb24gKGNVUkwgNy44MispXG4gKiAg4oCiIEZvcm0tZGF0YSAgICA6IC1GIC8gLS1mb3JtIC8gLS1mb3JtLXN0cmluZyAobXVsdGlwYXJ0L2Zvcm0tZGF0YSlcbiAqICDigKIgVVJMICAgICAgICAgIDogYmFyZSBodHRwcz86Ly8gdG9rZW4gb3IgZXhwbGljaXQgLS11cmwgZmxhZ1xuICogIOKAoiBBdXRoIGluZmVyICAgOiBCZWFyZXIgdG9rZW4gZXh0cmFjdGVkIGZyb20gQXV0aG9yaXphdGlvbiBoZWFkZXJcbiAqICDigKIgTWV0aG9kIGluZmVyIDogR0VU4oaSUE9TVCB3aGVuIGJvZHkvZm9ybS1kYXRhIHByZXNlbnQgYW5kIG5vIGV4cGxpY2l0IC1YXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ3VybChjdXJsU3RyaW5nOiBzdHJpbmcpOiBQYXJzZWRDdXJsIHwgbnVsbCB7XG4gIGNvbnN0IHJhdyA9IChjdXJsU3RyaW5nID8/ICcnKS50cmltKCk7XG4gIGlmICghcmF3KSByZXR1cm4gbnVsbDtcblxuICBsZXQgcyA9IHJhdztcblxuICAvLyDilIDilIAgV2luZG93cyBDTUQgZm9ybWF0IChDaHJvbWUgRGV2VG9vbHMgXCJDb3B5IGFzIGNVUkwgKGNtZClcIikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIERldGVjdGVkIGJ5IHByZXNlbmNlIG9mIF5cIiAoY2FyZXQgKyBkb3VibGUtcXVvdGUpIGFzIHF1b3RlIGRlbGltaXRlci5cbiAgLy8gT25seSBhcHBsaWVkIHdoZW4gdGhlIGNVUkwgaXMgTk9UIGFscmVhZHkgdXNpbmcgc2luZ2xlLXF1b3RlcyBhcyB0aGUgcHJpbWFyeVxuICAvLyBxdW90aW5nIG1lY2hhbmlzbSAoaS5lLiBub3QgYSBVbml4IGNVUkwgdGhhdCBtZXJlbHkgY29udGFpbnMgXlwiIGluIGEgYm9keSkuXG4gIGlmICgvXFxeXCIvLnRlc3QocykgJiYgIS8oPzpefFxccyknLy50ZXN0KHMpKSB7XG4gICAgcyA9IHMucmVwbGFjZSgvXFxzKlxcXlxccypcXHI/XFxuXFxzKi9nLCAnICcpOyAgLy8gXiBsaW5lLWNvbnRpbnVhdGlvblxuICAgIHMgPSBzLnJlcGxhY2UoL1xcXlxcXFxcXF5cIi9nLCAnXFxcXFwiJyk7ICAgICAgICAgICAvLyBeXFxeXCIg4oaSIFxcXCIgKGlubmVyIGVzY2FwZWQgcXVvdGUpXG4gICAgcyA9IHMucmVwbGFjZSgvXFxeXCIvZywgJ1wiJyk7ICAgICAgICAgICAgICAgICAvLyBeXCIgIOKGkiBcIiAgKHF1b3RlIGRlbGltaXRlcilcbiAgfVxuXG4gIC8vIOKUgOKUgCBQb3dlclNoZWxsIGJhY2t0aWNrIGxpbmUgY29udGludWF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBzID0gcy5yZXBsYWNlKC9gXFxzKlxccj9cXG5cXHMqL2csICcgJyk7XG5cbiAgLy8g4pSA4pSAIFVuaXgvTWFjIGJhY2tzbGFzaCBsaW5lIGNvbnRpbnVhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcyA9IHMucmVwbGFjZSgvXFxcXFxccypcXHI/XFxuXFxzKi9nLCAnICcpO1xuXG4gIC8vIENvbGxhcHNlIHJlbWFpbmluZyBsaXRlcmFsIG5ld2xpbmVzIGFuZCByZWR1bmRhbnQgc3BhY2VzXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBzLnJlcGxhY2UoL1xccj9cXG4vZywgJyAnKS5yZXBsYWNlKC9cXHMrL2csICcgJyk7XG4gIGNvbnN0IHRva2VucyA9IHRva2VuaXplQ3VybExpbmUobm9ybWFsaXplZCk7XG5cbiAgbGV0IG1ldGhvZCA9ICcnO1xuICBsZXQgdXJsID0gJyc7XG4gIGNvbnN0IGhlYWRlcnM6IEFwaUVkaXRIZWFkZXJSb3dbXSA9IFtdO1xuICBsZXQgYm9keSA9ICcnO1xuICBjb25zdCBmb3JtRGF0YTogeyBrZXk6IHN0cmluZzsgdHlwZTogJ3RleHQnIHwgJ2ZpbGUnOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdO1xuICBjb25zdCB1cmxQYXR0ZXJuID0gL15odHRwcz86XFwvXFwvL2k7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0ID0gdG9rZW5zW2ldO1xuICAgIGNvbnN0IGNvbnN1bWVOZXh0ID0gKCk6IHN0cmluZyA9PiB0b2tlbnNbKytpXSA/PyAnJztcblxuICAgIC8vIOKUgOKUgCBTa2lwIGJvb2xlYW4gbm8tYXJnIGZsYWdzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGlmIChDVVJMX05PX0FSR19GTEFHUy5oYXModCkpIGNvbnRpbnVlO1xuXG4gICAgLy8g4pSA4pSAIENvbnN1bWUtYW5kLWRpc2NhcmQgZmxhZ3MgKHRoZWlyIGFyZyBtdXN0IG5vdCBiZSBtaXN0YWtlbiBmb3IgdGhlIFVSTCkg4pSA4pSAXG4gICAgaWYgKENVUkxfRkxBR1NfV0lUSF9JR05PUkVEX0FSRy5oYXModCkpIHsgY29uc3VtZU5leHQoKTsgY29udGludWU7IH1cblxuICAgIC8vIOKUgOKUgCBIVFRQIG1ldGhvZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBpZiAodCA9PT0gJy1YJyB8fCB0ID09PSAnLS1yZXF1ZXN0Jykge1xuICAgICAgY29uc3QgdiA9IGNvbnN1bWVOZXh0KCk7IGlmICh2KSBtZXRob2QgPSB2LnRvVXBwZXJDYXNlKCk7IGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodC5zdGFydHNXaXRoKCctLXJlcXVlc3Q9JykpIHtcbiAgICAgIGNvbnN0IHYgPSB0LnNsaWNlKDEwKTsgaWYgKHYpIG1ldGhvZCA9IHYudG9VcHBlckNhc2UoKTsgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0LnN0YXJ0c1dpdGgoJy1YJykgJiYgdC5sZW5ndGggPiAyKSB7XG4gICAgICBtZXRob2QgPSB0LnNsaWNlKDIpLnRvVXBwZXJDYXNlKCk7IGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBIZWFkZXJzOiAtSCAvIC0taGVhZGVyIC8gaW5saW5lIC0taGVhZGVyPSfigKYnIC8gLUg9J+KApicg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgaWYgKHQgPT09ICctSCcgfHwgdCA9PT0gJy0taGVhZGVyJykge1xuICAgICAgY29uc3QgdiA9IGNvbnN1bWVOZXh0KCk7XG4gICAgICBjb25zdCBjb2xvbiA9IHYuaW5kZXhPZignOicpO1xuICAgICAgaWYgKGNvbG9uICE9PSAtMSkge1xuICAgICAgICBjb25zdCBuYW1lID0gdi5zbGljZSgwLCBjb2xvbikudHJpbSgpO1xuICAgICAgICBjb25zdCB2YWwgID0gdi5zbGljZShjb2xvbiArIDEpLnRyaW0oKTtcbiAgICAgICAgaWYgKG5hbWUpIGhlYWRlcnMucHVzaCh7IG5hbWUsIHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogdmFsIH0pO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIElubGluZSAtLWhlYWRlcj0nTmFtZTogVmFsdWUnIOKAlCB0b2tlbml6ZXIgc3BsaXRzIGludG8gWyctLWhlYWRlcj0nLCAnTmFtZTogVmFsdWUnXVxuICAgIGlmICh0LnN0YXJ0c1dpdGgoJy0taGVhZGVyPScpIHx8IHQuc3RhcnRzV2l0aCgnLUg9JykpIHtcbiAgICAgIGNvbnN0IHByZWZpeExlbiA9IHQuc3RhcnRzV2l0aCgnLS1oZWFkZXI9JykgPyA5IDogMztcbiAgICAgIGNvbnN0IGlubGluZSA9IHQuc2xpY2UocHJlZml4TGVuKSB8fCBjb25zdW1lTmV4dCgpO1xuICAgICAgY29uc3QgY29sb24gID0gaW5saW5lLmluZGV4T2YoJzonKTtcbiAgICAgIGlmIChjb2xvbiAhPT0gLTEpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGlubGluZS5zbGljZSgwLCBjb2xvbikudHJpbSgpO1xuICAgICAgICBjb25zdCB2YWwgID0gaW5saW5lLnNsaWNlKGNvbG9uICsgMSkudHJpbSgpO1xuICAgICAgICBpZiAobmFtZSkgaGVhZGVycy5wdXNoKHsgbmFtZSwgdHlwZTogJ3N0cmluZycsIHZhbHVlOiB2YWwgfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgUmVxdWVzdCBib2R5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIC8vIGNVUkwgY29uY2F0ZW5hdGVzIG11bHRpcGxlIC1kIGZsYWdzIHdpdGggJyYnOyByZXBsaWNhdGUgdGhhdCBiZWhhdmlvdXIuXG4gICAgaWYgKHQgPT09ICctZCcgfHwgdCA9PT0gJy0tZGF0YScgfHwgdCA9PT0gJy0tZGF0YS1yYXcnIHx8XG4gICAgICAgIHQgPT09ICctLWRhdGEtYmluYXJ5JyB8fCB0ID09PSAnLS1kYXRhLWFzY2lpJykge1xuICAgICAgY29uc3QgdiA9IGNvbnN1bWVOZXh0KCk7XG4gICAgICBpZiAodiAmJiAhdi5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSBzdHJpcFN1cnJvdW5kaW5nUXVvdGVzKHYpO1xuICAgICAgICBib2R5ID0gYm9keSA/IGAke2JvZHl9JiR7Y2h1bmt9YCA6IGNodW5rO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIC0tanNvbiBmbGFnIChjVVJMIDcuODIrKTogc2V0cyBDb250ZW50LVR5cGUgYXBwbGljYXRpb24vanNvbiArIGJvZHlcbiAgICBpZiAodCA9PT0gJy0tanNvbicpIHtcbiAgICAgIGNvbnN0IHYgPSBjb25zdW1lTmV4dCgpO1xuICAgICAgaWYgKHYgJiYgIXYuc3RhcnRzV2l0aCgnQCcpKSBib2R5ID0gc3RyaXBTdXJyb3VuZGluZ1F1b3Rlcyh2KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBJbmxpbmUgLS1kYXRhPSfigKYnIC8gLS1kYXRhLXJhdz0n4oCmJyDigJQgdG9rZW5pemVyIHNwbGl0cyBpbnRvIFsnLS1kYXRhPScsIHZhbHVlXVxuICAgIGlmICh0LnN0YXJ0c1dpdGgoJy0tZGF0YT0nKSB8fCB0LnN0YXJ0c1dpdGgoJy0tZGF0YS1yYXc9JykgfHxcbiAgICAgICAgdC5zdGFydHNXaXRoKCctLWRhdGEtYmluYXJ5PScpIHx8IHQuc3RhcnRzV2l0aCgnLS1kYXRhLWFzY2lpPScpKSB7XG4gICAgICBjb25zdCBlcUlkeCA9IHQuaW5kZXhPZignPScpO1xuICAgICAgY29uc3QgaW5saW5lID0gdC5zbGljZShlcUlkeCArIDEpIHx8IGNvbnN1bWVOZXh0KCk7XG4gICAgICBpZiAoaW5saW5lICYmICFTdHJpbmcoaW5saW5lKS5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSBzdHJpcFN1cnJvdW5kaW5nUXVvdGVzKFN0cmluZyhpbmxpbmUpKTtcbiAgICAgICAgYm9keSA9IGJvZHkgPyBgJHtib2R5fSYke2NodW5rfWAgOiBjaHVuaztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBJbmxpbmUgc2hvcnQgZm9ybSAtZFZBTFVFIG9yIC1kPVZBTFVFXG4gICAgaWYgKHQuc3RhcnRzV2l0aCgnLWQnKSAmJiB0Lmxlbmd0aCA+IDIpIHtcbiAgICAgIGNvbnN0IHYgPSB0LnN0YXJ0c1dpdGgoJy1kPScpID8gdC5zbGljZSgzKSA6IHQuc2xpY2UoMik7XG4gICAgICBpZiAoIXYuc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICAgIGNvbnN0IGNodW5rID0gc3RyaXBTdXJyb3VuZGluZ1F1b3Rlcyh2KTtcbiAgICAgICAgYm9keSA9IGJvZHkgPyBgJHtib2R5fSYke2NodW5rfWAgOiBjaHVuaztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyAtLWRhdGEtdXJsZW5jb2RlIG5hbWU9dmFsdWUgKHRyZWF0IGFzIHBsYWluIGJvZHkgZW50cnkpXG4gICAgaWYgKHQgPT09ICctLWRhdGEtdXJsZW5jb2RlJykge1xuICAgICAgY29uc3QgdiA9IGNvbnN1bWVOZXh0KCk7XG4gICAgICBpZiAodiAmJiAhdi5pbmNsdWRlcygnQCcpKSBib2R5ID0gYm9keSA/IGAke2JvZHl9JiR7dn1gIDogdjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodC5zdGFydHNXaXRoKCctLWRhdGEtdXJsZW5jb2RlPScpKSB7XG4gICAgICBjb25zdCBpbmxpbmUgPSB0LnNsaWNlKDE3KSB8fCBjb25zdW1lTmV4dCgpO1xuICAgICAgaWYgKGlubGluZSAmJiAhU3RyaW5nKGlubGluZSkuaW5jbHVkZXMoJ0AnKSkge1xuICAgICAgICBib2R5ID0gYm9keSA/IGAke2JvZHl9JiR7aW5saW5lfWAgOiBTdHJpbmcoaW5saW5lKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBNdWx0aXBhcnQgZm9ybS1kYXRhOiAtRiAvIC0tZm9ybSAvIC0tZm9ybS1zdHJpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgaWYgKHQgPT09ICctRicgfHwgdCA9PT0gJy0tZm9ybScgfHwgdCA9PT0gJy0tZm9ybS1zdHJpbmcnKSB7XG4gICAgICBjb25zdCB2ID0gY29uc3VtZU5leHQoKTtcbiAgICAgIGlmICh2KSB7IGNvbnN0IGUgPSBwYXJzZUZvcm1FbnRyeSh2KTsgaWYgKGUpIGZvcm1EYXRhLnB1c2goZSk7IH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodC5zdGFydHNXaXRoKCctLWZvcm09JykgfHwgdC5zdGFydHNXaXRoKCctRj0nKSkge1xuICAgICAgY29uc3QgcHJlZml4TGVuID0gdC5zdGFydHNXaXRoKCctLWZvcm09JykgPyA3IDogMztcbiAgICAgIGNvbnN0IGlubGluZSA9IHQuc2xpY2UocHJlZml4TGVuKSB8fCBjb25zdW1lTmV4dCgpO1xuICAgICAgaWYgKGlubGluZSkgeyBjb25zdCBlID0gcGFyc2VGb3JtRW50cnkoU3RyaW5nKGlubGluZSkpOyBpZiAoZSkgZm9ybURhdGEucHVzaChlKTsgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFVSTCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBpZiAodCA9PT0gJy0tdXJsJykge1xuICAgICAgY29uc3QgdiA9IGNvbnN1bWVOZXh0KCk7IGlmICh2ICYmICF1cmwpIHVybCA9IHY7IGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodC5zdGFydHNXaXRoKCctLXVybD0nKSkge1xuICAgICAgY29uc3QgdiA9IHQuc2xpY2UoNikgfHwgY29uc3VtZU5leHQoKTsgaWYgKHYgJiYgIXVybCkgdXJsID0gdjsgY29udGludWU7XG4gICAgfVxuICAgIGlmICh1cmxQYXR0ZXJuLnRlc3QodCkgJiYgIXVybCkgeyB1cmwgPSB0OyB9XG4gIH1cblxuICAvLyBGYWxsYmFjazogc2NhbiBhbGwgdG9rZW5zIGZvciB0aGUgZmlyc3QgVVJMLWxpa2UgdmFsdWVcbiAgaWYgKCF1cmwpIHtcbiAgICB1cmwgPSB0b2tlbnMuZmluZCh0b2sgPT4gdXJsUGF0dGVybi50ZXN0KHRvaykpID8/ICcnO1xuICB9XG5cbiAgLy8gSW5mZXIgbWV0aG9kOiBpZiBhIGJvZHkvZm9ybS1kYXRhIGlzIHByZXNlbnQgYnV0IG5vIGV4cGxpY2l0IC1YIHdhcyBnaXZlbixcbiAgLy8gdXNlIFBPU1QgKG1hbnkgYnJvd3NlciBEZXZUb29scyBjVVJMcyBvbWl0IC1YIFBPU1QpLlxuICBjb25zdCBmaW5hbE1ldGhvZCA9IChtZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XG4gIGlmICgoYm9keSB8fCBmb3JtRGF0YS5sZW5ndGggPiAwKSAmJiAoZmluYWxNZXRob2QgPT09ICdHRVQnIHx8IGZpbmFsTWV0aG9kID09PSAnSEVBRCcpKSB7XG4gICAgcmV0dXJuIHsgbWV0aG9kOiAnUE9TVCcsIHVybCwgaGVhZGVycywgYm9keSwgZm9ybURhdGEgfTtcbiAgfVxuICByZXR1cm4geyBtZXRob2Q6IGZpbmFsTWV0aG9kLCB1cmwsIGhlYWRlcnMsIGJvZHksIGZvcm1EYXRhIH07XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1hcGktZWRpdC1zdGVwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwaS1lZGl0LXN0ZXAuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCxcbn0pXG5leHBvcnQgY2xhc3MgQXBpRWRpdFN0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgaW5pdGlhbE1ldGhvZD86IHN0cmluZztcbiAgQElucHV0KCkgaW5pdGlhbEVudmlyb25tZW50Pzogc3RyaW5nO1xuICBASW5wdXQoKSBpbml0aWFsU3RlcD86IG51bWJlcjtcbiAgQElucHV0KCkgaW5pdGlhbFVybD86IHN0cmluZztcbiAgQElucHV0KCkgaW5pdGlhbFBheWxvYWRUYWI/OiBBcGlFZGl0UGF5bG9hZFRhYjtcbiAgLyoqIEluaXRpYWwgcGF5bG9hZCB0eXBlIChyYXcsIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCwgZm9ybS1kYXRhKSB3aGVuIGVkaXRpbmcgYW4gZXhpc3Rpbmcgc3RlcC4gKi9cbiAgQElucHV0KCkgaW5pdGlhbFBheWxvYWRUeXBlPzogJ3JhdycgfCAneC13d3ctZm9ybS11cmxlbmNvZGVkJyB8ICdmb3JtLWRhdGEnO1xuICAvKiogSW5pdGlhbCBwYXlsb2FkIHRleHQgKGJvZHkpIHdoZW4gZWRpdGluZyBhbiBleGlzdGluZyBzdGVwLiAqL1xuICBASW5wdXQoKSBpbml0aWFsUGF5bG9hZFRleHQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGluaXRpYWxIZWFkZXJzPzogQXBpRWRpdEhlYWRlclJvd1tdO1xuICBASW5wdXQoKSBpbml0aWFsUmVzcG9uc2VQcmV2aWV3Pzogc3RyaW5nO1xuICBASW5wdXQoKSBpbml0aWFsVmFyaWFibGVOYW1lPzogc3RyaW5nO1xuICAvKiogSW5pdGlhbCByZXNwb25zZSBib2R5IHZlcmlmaWNhdGlvbnMgd2hlbiBlZGl0aW5nIGFuIGV4aXN0aW5nIHN0ZXAuICovXG4gIEBJbnB1dCgpIGluaXRpYWxSZXNwb25zZUJvZHlWZXJpZmljYXRpb25zPzogQXBpRWRpdFJlc3BvbnNlQm9keVZlcmlmaWNhdGlvblJvd1tdO1xuICAvKiogSW5pdGlhbCBzdGF0dXMgdmVyaWZpY2F0aW9ucyB3aGVuIGVkaXRpbmcgYW4gZXhpc3Rpbmcgc3RlcC4gKi9cbiAgQElucHV0KCkgaW5pdGlhbFN0YXR1c1ZlcmlmaWNhdGlvbnM/OiBBcGlFZGl0U3RhdHVzVmVyaWZpY2F0aW9uUm93W107XG4gIC8qKiBJbml0aWFsIGFjdGl2ZSByZXNwb25zZSB2ZXJpZmljYXRpb24gdGFiIHdoZW4gZWRpdGluZyBhbiBleGlzdGluZyBzdGVwLiAqL1xuICBASW5wdXQoKSBpbml0aWFsQWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI/OiAncmVzcG9uc2UtYm9keScgfCAnc3RhdHVzJztcbiAgQElucHV0KCkgZWRpdE1vZGU/OiBib29sZWFuO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgY3JlYXRpbmcgdGhlIHN0ZXAgKEFQSSBpbiBwcm9ncmVzcyk7IHNob3cgbG9hZGVyIG9uIENyZWF0ZS9VcGRhdGUgYnV0dG9uICovXG4gIEBJbnB1dCgpIGlzQ3JlYXRpbmdTdGVwOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEVtaXRzIHRoZSBjVVJMIHN0cmluZyB3aGVuIHVzZXIgY2xpY2tzIEltcG9ydCAodmFsdWUgZnJvbSB0aGUgdGV4dGFyZWEgY29udHJvbCkuICovXG4gIEBPdXRwdXQoKSBpbXBvcnRDdXJsID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHVzZXIgY2FuY2VscyB0aGUgSW1wb3J0IGNVUkwgcGFuZWwgKGNsaWNrcyBDYW5jZWwpLiAqL1xuICBAT3V0cHV0KCkgaW1wb3J0Q3VybENhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdXNlciBjbGlja3MgU2VuZCBSZXF1ZXN0LCB3aXRoIGVudmlyb25tZW50LCBtZXRob2QsIHVybCwgYW5kIGhlYWRlcnMuICovXG4gIEBPdXRwdXQoKSBzZW5kUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8QXBpRWRpdFNlbmRSZXF1ZXN0UGF5bG9hZD4oKTtcbiAgQE91dHB1dCgpIGJhY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHVzZXIgY2xpY2tzIHRoZSBDYW5jZWwgYnV0dG9uIChzdGVwIDEpLiAqL1xuICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbmV4dCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdXNlciBjbGlja3MgQ3JlYXRlIHdpdGggYWxsIGVudGVyZWQgZGV0YWlsczogc3RlcDEgKGVudmlyb25tZW50LCBIVFRQIG1ldGhvZCwgVVJMLCBoZWFkZXJzLCBib2R5KSwgc3RlcDIgKHZhcmlhYmxlIG5hbWUpLCBzdGVwMyAodmVyaWZpY2F0aW9ucykuICovXG4gIEBPdXRwdXQoKSBjcmVhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPEFwaUVkaXRDcmVhdGVQYXlsb2FkPigpO1xuICAvKiogRW1pdHMgd2hlbmV2ZXIgaGVhZGVycyBjaGFuZ2UgKGFkZCwgcmVtb3ZlLCBvciBlZGl0KSBzbyB0aGUgcGFyZW50IGNhbiByZWZsZWN0IHRoZW0gaW4gdGhlIGNhbnZhcy9jb250cm9scy4gKi9cbiAgQE91dHB1dCgpIGhlYWRlcnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFwaUVkaXRIZWFkZXJSb3dbXT4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdGhlIGVudmlyb25tZW50IGRyb3Bkb3duIHNlbGVjdGlvbiBjaGFuZ2VzIChzZWxlY3RlZCB2YWx1ZS9pZCBvciBudWxsIGZvciBOb25lKSBzbyB0aGUgcGFyZW50IGNhbiBwcm92aWRlIHVybE9wdGlvbnMuICovXG4gIEBPdXRwdXQoKSBlbnZpcm9ubWVudENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVtYmVyIHwgbnVsbD4oKTtcblxuICAvKiogRm9ybSBjb250cm9sIGZvciBJbXBvcnQgY1VSTCB0ZXh0YXJlYTsgdmFsdWUgaXMgZW1pdHRlZCB3aGVuIHVzZXIgY2xpY2tzIEltcG9ydC4gKi9cbiAgcmVhZG9ubHkgaW1wb3J0Q3VybENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuXG4gIHZhcmlhYmxlTmFtZSA9ICcnO1xuICB2YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICB1cmxFcnJvciA9ICcnO1xuXG4gIC8qKiBDb250cm9scyB3aGljaCBib2R5IGNvbnRlbnQgaXMgdmlzaWJsZTogaGVhZGVycyAoZGVmYXVsdCkgb3IgaW1wb3J0LWN1cmwuICovXG4gIGJvZHlWaWV3OiBBcGlFZGl0Qm9keVZpZXcgPSAnaGVhZGVycyc7XG5cbiAgcmVhZG9ubHkgc3RlcExhYmVscyA9IFtcbiAgICB7IGluZGV4OiAxLCBsYWJlbDogQVBJX0VESVRfU1RFUF9MQUJFTFMuUkVRVUVTVF9ERVRBSUxTIH0sXG4gICAgeyBpbmRleDogMiwgbGFiZWw6IEFQSV9FRElUX1NURVBfTEFCRUxTLlNUT1JFX1JFU1BPTlNFIH0sXG4gICAgeyBpbmRleDogMywgbGFiZWw6IEFQSV9FRElUX1NURVBfTEFCRUxTLlZBTElEQVRJT04gfSxcbiAgXTtcbiAgY3VycmVudFN0ZXAgPSAxO1xuXG4gIC8qKiBUaGUgbGFiZWwgZm9yIHRoZSBjdXJyZW50IHN0ZXAgb25seSAodXNlZCB3aGVuIHNob3dpbmcgYSBzaW5nbGUgc3RlcCBpbiB0aGUgaW5kaWNhdG9yKS4gKi9cbiAgZ2V0IGFjdGl2ZVN0ZXBMYWJlbCgpOiB7IGluZGV4OiBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RlcExhYmVsc1t0aGlzLmN1cnJlbnRTdGVwIC0gMV07XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IG1pblN0ZXAgPSAxO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heFN0ZXAgPSAzO1xuXG4gIC8qKiBQZXJjZW50YWdlIHRvIHRyYW5zbGF0ZSB0aGUgc3RlcCBzdHJpcCAoMCwgLTMzLjMzMywgLTY2LjY2NikgZm9yIENTUyB0cmFuc2l0aW9uLiAqL1xuICBnZXQgc3RyaXBUcmFuc2xhdGVQZXJjZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRTdGVwIC0gMSkgKiAtMzMuMzMzO1xuICB9XG5cbiAgc2V0U3RlcChzdGVwOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoc3RlcCA+PSB0aGlzLm1pblN0ZXAgJiYgc3RlcCA8PSB0aGlzLm1heFN0ZXApIHtcbiAgICAgIHRoaXMuY3VycmVudFN0ZXAgPSBzdGVwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlJbml0aWFsU3RlcCh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjtcbiAgICBjb25zdCBjbGFtcGVkID0gTWF0aC5tYXgodGhpcy5taW5TdGVwLCBNYXRoLm1pbih0aGlzLm1heFN0ZXAsIE1hdGguZmxvb3IodmFsdWUpKSk7XG4gICAgdGhpcy5jdXJyZW50U3RlcCA9IGNsYW1wZWQ7XG4gIH1cblxuICAvKiogSFRUUCBtZXRob2Qgb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHdpdGggaWQsIG5hbWUsIHZhbHVlLCBsYWJlbCAocGFzc2VkIGZyb20gcGFyZW50KS4gKi9cbiAgQElucHV0KCkgaHR0cE1ldGhvZE9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIC8qKiBGb3JtIGZvciBIVFRQIG1ldGhvZCBzZWxlY3QgKGNxYS1keW5hbWljLXNlbGVjdCkgKi9cbiAgbWV0aG9kRm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogQ29uZmlnIGZvciBtZXRob2QgZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiBodHRwTWV0aG9kT3B0aW9ucyBjaGFuZ2VzIHRvIGF2b2lkIG5ldyByZWZlcmVuY2UgZXZlcnkgQ0QpICovXG4gIG1ldGhvZFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ21ldGhvZCcsXG4gICAgcGxhY2Vob2xkZXI6ICdNZXRob2QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlTWV0aG9kU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSAodGhpcy5odHRwTWV0aG9kT3B0aW9ucyA/PyBbXSkubWFwKChtKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihtKSk7XG4gICAgdGhpcy5tZXRob2RTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLm1ldGhvZFNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWV0aG9kVmFsdWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnMgPz8gW10pXG4gICAgICAubWFwKChtKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShtKSlcbiAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9IG51bGwpO1xuICB9XG5cbiAgLyoqIEZvcm0gZm9yIGVudmlyb25tZW50IHNlbGVjdCAoY3FhLWR5bmFtaWMtc2VsZWN0KSAqL1xuICBlbnZpcm9ubWVudEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIEVudmlyb25tZW50IG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB3aXRoIGlkLCBuYW1lLCB2YWx1ZSwgbGFiZWwgKHBhc3NlZCBmcm9tIHBhcmVudCkuICovXG4gIEBJbnB1dCgpIGVudmlyb25tZW50T3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgZW52aXJvbm1lbnRzIGFyZSBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbCAocHJvdmlkZWQgYnkgcGFyZW50KS4gKi9cbiAgQElucHV0KCkgaGFzTW9yZUVudmlyb25tZW50czogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgbG9hZGluZyBlbnZpcm9ubWVudHMgKHNlYXJjaCBvciBsb2FkIG1vcmUpLiAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFVSTCBmaWVsZCBvcHRpb25zIHdoZW4gYW4gZW52aXJvbm1lbnQgaXMgc2VsZWN0ZWQgKGJhc2UgVVJMICsgcGFyYW1ldGVycyBhcyAqfGtleXwpLiBQYXJlbnQgZmlsbHMgdGhpcyB3aGVuIGVudmlyb25tZW50Q2hhbmdlIGZpcmVzLiAqL1xuICBASW5wdXQoKSB1cmxPcHRpb25zOiBDcWFBdXRvY29tcGxldGVPcHRpb25bXSA9IFtdO1xuXG4gIC8qKiBDb25maWcgZm9yIGVudmlyb25tZW50IGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gZW52aXJvbm1lbnRPcHRpb25zIGNoYW5nZXMgdG8gYXZvaWQgbmV3IHJlZmVyZW5jZSBldmVyeSBDRCkgKi9cbiAgZW52aXJvbm1lbnRTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdlbnZpcm9ubWVudCcsXG4gICAgcGxhY2Vob2xkZXI6ICdFbnZpcm9ubWVudCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdG9TZWxlY3RPcHRpb24oaXRlbTogRW52aXJvbm1lbnRPcHRpb25JbnB1dCk6IFNlbGVjdE9wdGlvbiB7XG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgaWQ6IGl0ZW0sIHZhbHVlOiBpdGVtLCBuYW1lOiBpdGVtLCBsYWJlbDogaXRlbSB9O1xuICAgIH1cbiAgICBjb25zdCBvID0gaXRlbSBhcyBTZWxlY3RPcHRpb247XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBvLmlkID8/IG8udmFsdWUsXG4gICAgICB2YWx1ZTogby52YWx1ZSA/PyBvLmlkLFxuICAgICAgbmFtZTogby5uYW1lID8/IG8ubGFiZWwgPz8gU3RyaW5nKG8udmFsdWUgPz8gby5pZCksXG4gICAgICBsYWJlbDogby5sYWJlbCA/PyBvLm5hbWUgPz8gU3RyaW5nKG8udmFsdWUgPz8gby5pZCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldE9wdGlvblZhbHVlKGl0ZW06IEVudmlyb25tZW50T3B0aW9uSW5wdXQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHJldHVybiBpdGVtO1xuICAgIGNvbnN0IG8gPSBpdGVtIGFzIFNlbGVjdE9wdGlvbjtcbiAgICBjb25zdCB2ID0gby52YWx1ZSA/PyBvLmlkO1xuICAgIHJldHVybiB2ICE9IG51bGwgPyBTdHJpbmcodikgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVudmlyb25tZW50U2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSAodGhpcy5lbnZpcm9ubWVudE9wdGlvbnMgPz8gW10pLm1hcCgoZSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24oZSkpO1xuICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVFbnZpcm9ubWVudHMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRW52aXJvbm1lbnRzLFxuICAgICAgb25Mb2FkTW9yZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmVudmlyb25tZW50TG9hZE1vcmUuZW1pdCgpO1xuICAgICAgfSxcbiAgICAgIG9uU2VhcmNoOiAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmVudmlyb25tZW50U2VhcmNoLmVtaXQocXVlcnkpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbnZpcm9ubWVudFZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuICh0aGlzLmVudmlyb25tZW50T3B0aW9ucyA/PyBbXSlcbiAgICAgIC5tYXAoKGUpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGUpKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICAvKiogRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZW52aXJvbm1lbnRzIGZyb20gdGhlIGRyb3Bkb3duLiAqL1xuICBAT3V0cHV0KCkgZW52aXJvbm1lbnRTZWFyY2ggPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKiogRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgZW52aXJvbm1lbnRzLiAqL1xuICBAT3V0cHV0KCkgZW52aXJvbm1lbnRMb2FkTW9yZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogRm9ybSBmb3IgQXV0aCBUeXBlIHNlbGVjdCAoQXV0aG9yaXphdGlvbiB0YWIpICovXG4gIGF1dGhUeXBlRm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogQXV0aCB0eXBlIG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB3aXRoIGlkLCBuYW1lLCB2YWx1ZSwgbGFiZWwgKHBhc3NlZCBmcm9tIHBhcmVudCkuIEZhbGxzIGJhY2sgdG8gYnVpbHQtaW4gbGlzdCB3aGVuIGVtcHR5LiAqL1xuICBASW5wdXQoKSBhdXRoVHlwZU9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIC8qKiBJbml0aWFsIGF1dGggdHlwZSAoc3RyaW5nIG9yIG9wdGlvbiBvYmplY3QpLiBXaGVuIG5vdCBzZXQsIGZpcnN0IG9mIGF1dGhUeXBlT3B0aW9ucyBvciBkZWZhdWx0IFwiTm8gQXV0aFwiIGlzIHVzZWQuICovXG4gIEBJbnB1dCgpIGluaXRpYWxBdXRoVHlwZT86IHN0cmluZyB8IEVudmlyb25tZW50T3B0aW9uSW5wdXQ7XG5cbiAgLyoqIERlZmF1bHQgb3B0aW9ucyB3aGVuIGF1dGhUeXBlT3B0aW9ucyBpcyBlbXB0eSAoc2FtZSBzaGFwZSBhcyBlbnZpcm9ubWVudCkgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9BVVRIX1RZUEVfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ25vLWF1dGgnLCB2YWx1ZTogJ25vLWF1dGgnLCBuYW1lOiAnTm8gQXV0aCcsIGxhYmVsOiAnTm8gQXV0aCcgfSxcbiAgICB7IGlkOiAnYmVhcmVyJywgdmFsdWU6ICdiZWFyZXInLCBuYW1lOiAnQmVhcmVyIFRva2VuJywgbGFiZWw6ICdCZWFyZXIgVG9rZW4nIH0sXG4gICAgeyBpZDogJ29hdXRoMicsIHZhbHVlOiAnb2F1dGgyJywgbmFtZTogJ09BdXRoIDIuMCcsIGxhYmVsOiAnT0F1dGggMi4wJyB9LFxuICBdO1xuXG4gIC8qKiBDb25maWcgZm9yIEF1dGggVHlwZSBkcm9wZG93biAodXBkYXRlZCB3aGVuIGF1dGhUeXBlT3B0aW9ucyBjaGFuZ2VzLCBsaWtlIGVudmlyb25tZW50KSAqL1xuICBhdXRoVHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2F1dGhUeXBlJyxcbiAgICBwbGFjZWhvbGRlcjogJ05vIEF1dGgnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlQXV0aFR5cGVTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0aGlzLmF1dGhUeXBlT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuYXV0aFR5cGVPcHRpb25zLm1hcCgoYSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24oYSkpXG4gICAgICAgIDogWy4uLkFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfQVVUSF9UWVBFX09QVElPTlNdO1xuICAgIHRoaXMuYXV0aFR5cGVTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmF1dGhUeXBlU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdXRoVHlwZVZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMuYXV0aFR5cGVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5hdXRoVHlwZU9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9BVVRIX1RZUEVfT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKGEpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGEgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IGF1dGggdHlwZSB2YWx1ZSAoZS5nLiAnbm8tYXV0aCcpIGZvciB0ZW1wbGF0ZSAqL1xuICBnZXQgc2VsZWN0ZWRBdXRoVHlwZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHYgPSB0aGlzLmF1dGhUeXBlRm9ybT8uZ2V0KCdhdXRoVHlwZScpPy52YWx1ZTtcbiAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09ICcnKSByZXR1cm4gJ25vLWF1dGgnO1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyAodj8udmFsdWUgPz8gdj8uaWQgPz8gJ25vLWF1dGgnKSA6IFN0cmluZyh2KTtcbiAgfVxuXG4gIC8qKiBCZWFyZXIgdG9rZW4gdmFsdWUgKEF1dGhvcml6YXRpb24gdGFiLCB3aGVuIGF1dGggdHlwZSBpcyBCZWFyZXIgVG9rZW4pLiAqL1xuICBiZWFyZXJUb2tlbiA9ICcnO1xuXG4gIC8qKiBGb3JtIGZvciBPQXV0aCAyLjAgZmllbGRzIChBdXRob3JpemF0aW9uIHRhYiB3aGVuIGF1dGggdHlwZSBpcyBPQXV0aCAyLjApLiAqL1xuICBvYXV0aDJGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBHcmFudCB0eXBlIG9wdGlvbnMgZm9yIE9BdXRoIDIuMCAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBPQVVUSF9HUkFOVF9UWVBFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdjbGllbnRfY3JlZGVudGlhbHMnLCB2YWx1ZTogJ2NsaWVudF9jcmVkZW50aWFscycsIG5hbWU6ICdDbGllbnQgQ3JlZGVudGlhbHMnLCBsYWJlbDogJ0NsaWVudCBDcmVkZW50aWFscycgfSxcbiAgICB7IGlkOiAnYXV0aG9yaXphdGlvbl9jb2RlJywgdmFsdWU6ICdhdXRob3JpemF0aW9uX2NvZGUnLCBuYW1lOiAnQXV0aG9yaXphdGlvbiBDb2RlJywgbGFiZWw6ICdBdXRob3JpemF0aW9uIENvZGUnIH0sXG4gICAgeyBpZDogJ3Bhc3N3b3JkJywgdmFsdWU6ICdwYXNzd29yZCcsIG5hbWU6ICdQYXNzd29yZCcsIGxhYmVsOiAnUGFzc3dvcmQnIH0sXG4gICAgeyBpZDogJ2ltcGxpY2l0JywgdmFsdWU6ICdpbXBsaWNpdCcsIG5hbWU6ICdJbXBsaWNpdCcsIGxhYmVsOiAnSW1wbGljaXQnIH0sXG4gIF07XG5cbiAgLyoqIENsaWVudCBhdXRoZW50aWNhdGlvbiBtZXRob2Qgb3B0aW9ucyBmb3IgT0F1dGggMi4wICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE9BVVRIX0NMSUVOVF9BVVRIX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdiYXNpYycsIHZhbHVlOiAnYmFzaWMnLCBuYW1lOiAnU2VuZCBhcyBCYXNpYyBBdXRoIGhlYWRlcicsIGxhYmVsOiAnU2VuZCBhcyBCYXNpYyBBdXRoIGhlYWRlcicgfSxcbiAgICB7IGlkOiAnYm9keScsIHZhbHVlOiAnYm9keScsIG5hbWU6ICdTZW5kIGluIGJvZHknLCBsYWJlbDogJ1NlbmQgaW4gYm9keScgfSxcbiAgXTtcblxuICByZWFkb25seSBvYXV0aDJHcmFudFR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdncmFudFR5cGUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGdyYW50IHR5cGUnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5PQVVUSF9HUkFOVF9UWVBFX09QVElPTlNdLFxuICB9O1xuXG4gIHJlYWRvbmx5IG9hdXRoMkNsaWVudEF1dGhTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdjbGllbnRBdXRoZW50aWNhdGlvbicsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgbWV0aG9kJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuT0FVVEhfQ0xJRU5UX0FVVEhfT1BUSU9OU10sXG4gIH07XG5cbiAgLyoqIEN1cnJlbnQgSFRUUCBtZXRob2QgKGZyb20gZm9ybSBvciBkZWZhdWx0OiBmaXJzdCBvZiBodHRwTWV0aG9kT3B0aW9ucykuIFRyZWF0cyBlbXB0eSBzdHJpbmcgYXMgdW5zZXQuICovXG4gIGdldCBzZWxlY3RlZE1ldGhvZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5tZXRob2RGb3JtPy5nZXQoJ21ldGhvZCcpPy52YWx1ZTtcbiAgICBjb25zdCBmaXJzdFZhbHVlID0gdGhpcy5odHRwTWV0aG9kT3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnNbMF0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXNvbHZlZCA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09ICcnID8gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2YWx1ZSBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA6IFN0cmluZyh2YWx1ZSkpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXNvbHZlZCA/PyBmaXJzdFZhbHVlID8/ICdHRVQnO1xuICB9XG4gIHNldCBzZWxlY3RlZE1ldGhvZCh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLm1ldGhvZEZvcm0/LnBhdGNoVmFsdWUoeyBtZXRob2Q6IHYgfSk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoZSBzZWxlY3RlZCBIVFRQIG1ldGhvZCBpcyBHRVQsIEhFQUQsIG9yIERFTEVURSAobm8gcmVxdWVzdCBib2R5KS4gKi9cbiAgZ2V0IGlzTWV0aG9kV2l0aG91dEJvZHkoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5zZWxlY3RlZE1ldGhvZCAhPSBudWxsID8gU3RyaW5nKHRoaXMuc2VsZWN0ZWRNZXRob2QpLnRvVXBwZXJDYXNlKCkgOiAnJztcbiAgICByZXR1cm4gTUVUSE9EU19XSVRIT1VUX0JPRFkuaW5jbHVkZXMobWV0aG9kKTtcbiAgfVxuXG4gIC8qKiBDYWNoZWQgZW52aXJvbm1lbnQgdmFsdWUgZnJvbSBsYXN0IHNlbGVjdGlvbiAoc28gQ3JlYXRlIHBheWxvYWQgaGFzIHRoZSBzZWxlY3RlZCB2YWx1ZSkuICovXG4gIHByaXZhdGUgY3VycmVudEVudmlyb25tZW50VmFsdWUgPSAnJztcblxuICAvKiogQ2FjaGVkIEhUVFAgbWV0aG9kIGZyb20gbGFzdCBzZWxlY3Rpb24gKHNvIENyZWF0ZSBwYXlsb2FkIGhhcyB0aGUgc2VsZWN0ZWQgdmFsdWUpLiAqL1xuICBwcml2YXRlIGN1cnJlbnRNZXRob2RWYWx1ZSA9ICcnO1xuXG4gIC8qKiBDdXJyZW50IGVudmlyb25tZW50IChmcm9tIGZvcm0gb3IgZGVmYXVsdDogZmlyc3Qgb2YgZW52aXJvbm1lbnRPcHRpb25zKS4gVHJlYXRzIGVtcHR5IHN0cmluZyBhcyB1bnNldC4gKi9cbiAgZ2V0IHNlbGVjdGVkRW52aXJvbm1lbnQoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZW52aXJvbm1lbnRGb3JtPy5nZXQoJ2Vudmlyb25tZW50Jyk/LnZhbHVlO1xuICAgIGNvbnN0IGZpcnN0VmFsdWUgPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuZW52aXJvbm1lbnRPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSAnJyA/ICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodmFsdWUgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodmFsdWUpKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZWQgPz8gZmlyc3RWYWx1ZSA/PyAnRGV2ZWxvcG1lbnQnO1xuICB9XG4gIHNldCBzZWxlY3RlZEVudmlyb25tZW50KHY6IHN0cmluZykge1xuICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtPy5wYXRjaFZhbHVlKHsgZW52aXJvbm1lbnQ6IHYgfSk7XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBzZWxlY3RzIGFuIGVudmlyb25tZW50OyBrZWVwcyBjdXJyZW50RW52aXJvbm1lbnRWYWx1ZSBpbiBzeW5jLCBzZXRzIHJlcXVlc3QgVVJMIGZyb20gZW52aXJvbm1lbnQgd2hlbiBhdmFpbGFibGUsIGFuZCBub3RpZmllcyBwYXJlbnQgZm9yIHVybE9wdGlvbnMuICovXG4gIG9uRW52aXJvbm1lbnRTZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gZXZlbnQudmFsdWU7XG4gICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9XG4gICAgICB2ICE9IG51bGxcbiAgICAgICAgPyB0eXBlb2YgdiA9PT0gJ29iamVjdCdcbiAgICAgICAgICA/IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKVxuICAgICAgICAgIDogU3RyaW5nKHYpXG4gICAgICAgIDogJyc7XG5cbiAgICAvLyBDbGVhciBVUkwgZmllbGQgd2hlbiBlbnZpcm9ubWVudCBjaGFuZ2VzXG4gICAgdGhpcy51cmwgPSAnJztcbiAgICB0aGlzLnVybEVycm9yID0gJyc7IC8vIEFsc28gY2xlYXIgYW55IFVSTCB2YWxpZGF0aW9uIGVycm9yc1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgLy8gTm90aWZ5IHBhcmVudCBzbyBpdCBjYW4gcHJvdmlkZSB1cmxPcHRpb25zIChlbnZpcm9ubWVudCBwYXJhbWV0ZXJzIGZvciBcIkVudGVyIFVSTCBvciBzZWxlY3QgUGFyYW1ldGVyXCIpXG4gICAgY29uc3QgZW1pdFZhbCA9IHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgPT09ICcnIHx8IHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgPT09ICdub25lJ1xuICAgICAgPyBudWxsXG4gICAgICA6ICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/IHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgOiB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlKTtcbiAgICB0aGlzLmVudmlyb25tZW50Q2hhbmdlLmVtaXQoZW1pdFZhbCA9PT0gJ25vbmUnID8gbnVsbCA6IChlbWl0VmFsIGFzIHN0cmluZyB8IG51bWJlciB8IG51bGwpKTtcbiAgfVxuXG4gIC8qKiBXaGVuIHVzZXIgc2VsZWN0cyBhbiBvcHRpb24gZnJvbSB0aGUgVVJMIGF1dG9jb21wbGV0ZSAoZS5nLiBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgKnxrZXl8KSwgc2V0IHRoZSBVUkwgZmllbGQgdG8gdGhhdCB2YWx1ZS4gKi9cbiAgb25VcmxPcHRpb25TZWxlY3Qob3B0aW9uOiBDcWFBdXRvY29tcGxldGVPcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnVybCA9IG9wdGlvbi52YWx1ZSA/PyAnJztcbiAgICB0aGlzLnVybEVycm9yID0gJyc7IC8vIENsZWFyIGVycm9yIHdoZW4gb3B0aW9uIGlzIHNlbGVjdGVkXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgcmVxdWVzdCBVUkwgZm9yIHRoZSBzZWxlY3RlZCBlbnZpcm9ubWVudCBvcHRpb24uXG4gICAqIEVudmlyb25tZW50IG9wdGlvbnMgbWF5IGNhcnJ5IGFuIG9wdGlvbmFsIGB1cmxgIChlLmcuIGZyb20gRW52aXJvbm1lbnQgbW9kZWwpOyBcIk5vbmVcIiBoYXMgbm8gdXJsLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZEVudmlyb25tZW50VXJsKHNlbGVjdGVkVmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBvYmogPSBzZWxlY3RlZFZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHVybFByb3AgPSBvYmpbJ3VybCddO1xuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdXJsUHJvcCA9PT0gJ3N0cmluZycgJiYgdXJsUHJvcC50cmltKCkgIT09ICcnKSB7XG4gICAgICByZXR1cm4gdXJsUHJvcC50cmltKCk7XG4gICAgfVxuICAgIGNvbnN0IGlkT3JWYWx1ZSA9XG4gICAgICB0eXBlb2Ygc2VsZWN0ZWRWYWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoc2VsZWN0ZWRWYWx1ZSBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJylcbiAgICAgICAgOiBTdHJpbmcoc2VsZWN0ZWRWYWx1ZSk7XG4gICAgaWYgKCFpZE9yVmFsdWUgfHwgaWRPclZhbHVlID09PSAnbm9uZScpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG9wdGlvbiA9ICh0aGlzLmVudmlyb25tZW50T3B0aW9ucyA/PyBbXSkuZmluZChcbiAgICAgIChvcHQpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKG9wdCkgPT09IGlkT3JWYWx1ZVxuICAgICk7XG4gICAgY29uc3QgdXJsID0gb3B0aW9uICE9IG51bGwgJiYgdHlwZW9mIG9wdGlvbiA9PT0gJ29iamVjdCcgPyAob3B0aW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVsndXJsJ10gOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnICYmIHVybC50cmltKCkgIT09ICcnID8gdXJsLnRyaW0oKSA6IG51bGw7XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBzZWxlY3RzIGFuIEhUVFAgbWV0aG9kOyBrZWVwcyBjdXJyZW50TWV0aG9kVmFsdWUgaW4gc3luYyBmb3IgY3JlYXRlIHBheWxvYWQuICovXG4gIG9uTWV0aG9kU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KTogdm9pZCB7XG4gICAgY29uc3QgdiA9IGV2ZW50LnZhbHVlO1xuICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID1cbiAgICAgIHYgIT0gbnVsbFxuICAgICAgICA/IHR5cGVvZiB2ID09PSAnb2JqZWN0J1xuICAgICAgICAgID8gKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpXG4gICAgICAgICAgOiBTdHJpbmcodilcbiAgICAgICAgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgX3VybCA9ICcnO1xuXG4gIC8qKiBVUkwgZm9yIHRoZSByZXF1ZXN0LiBHZXR0ZXIvc2V0dGVyIHN5bmNzIHF1ZXJ5IHBhcmFtcyB3aXRoIHRoZSBQYXJhbXMgdGFiIChQb3N0bWFuLXN0eWxlKS4gKi9cbiAgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cbiAgc2V0IHVybCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgbmV4dCA9IHZhbHVlID8/ICcnO1xuICAgIGlmICh0aGlzLl91cmwgPT09IG5leHQpIHJldHVybjtcbiAgICB0aGlzLl91cmwgPSBuZXh0O1xuICAgIC8vIENsZWFyIGVycm9yIHdoZW4gVVJMIGNoYW5nZXNcbiAgICB0aGlzLnVybEVycm9yID0gJyc7XG4gICAgaWYgKHRoaXMucGFyYW1zRm9ybUFycmF5KSB7XG4gICAgICB0aGlzLnBhcmFtc1N5bmNpbmdGcm9tVXJsID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3luY1BhcmFtc0Zyb21VcmwoKTtcbiAgICAgIHRoaXMucGFyYW1zU3luY2luZ0Zyb21VcmwgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogV2hlbiB0cnVlLCBwYXJhbXMgZm9ybSBjaGFuZ2VzIHNob3VsZCBub3QgdXBkYXRlIHRoZSBVUkwgKHdlJ3JlIHN5bmNpbmcgZnJvbSBVUkwpLiAqL1xuICBwcml2YXRlIHBhcmFtc1N5bmNpbmdGcm9tVXJsID0gZmFsc2U7XG5cbiAgLyoqIFBsYWNlaG9sZGVyIGZvciB0aGUgVVJMIGZpZWxkOiBzaG93IFwiRW50ZXIgVVJMIG9yIHNlbGVjdCBQYXJhbWV0ZXIgKlwiIHdoZW4gdXJsT3B0aW9ucyBhcmUgYXZhaWxhYmxlIChlbnZpcm9ubWVudCBzZWxlY3RlZCkuICovXG4gIGdldCB1cmxQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiAodGhpcy51cmxPcHRpb25zPy5sZW5ndGggPz8gMCkgPiAwID8gJ0VudGVyIFVSTCBvciBzZWxlY3QgUGFyYW1ldGVyIConIDogJ0VudGVyIFVSTCAqJztcbiAgfVxuXG4gIHJlYWRvbmx5IHBheWxvYWRUYWJzOiB7IHZhbHVlOiBBcGlFZGl0UGF5bG9hZFRhYjsgbGFiZWw6IHN0cmluZyB9W10gPSBbXG4gICAgeyB2YWx1ZTogJ2F1dGhvcml6YXRpb24nLCBsYWJlbDogJ0F1dGhvcml6YXRpb24nIH0sXG4gICAgeyB2YWx1ZTogJ2hlYWRlcnMnLCBsYWJlbDogJ0hlYWRlcnMnIH0sXG4gICAgeyB2YWx1ZTogJ2JvZHknLCBsYWJlbDogJ0JvZHknIH0sXG4gICAgeyB2YWx1ZTogJ3BhcmFtcycsIGxhYmVsOiAnUGFyYW1zJyB9LFxuICBdO1xuICBhY3RpdmVQYXlsb2FkVGFiOiBBcGlFZGl0UGF5bG9hZFRhYiA9ICdoZWFkZXJzJztcblxuICAvKiogU3RlcCAzOiBSZXNwb25zZSB2ZXJpZmljYXRpb24gdGFicyAqL1xuICByZWFkb25seSByZXNwb25zZVZlcmlmaWNhdGlvblRhYnM6IHsgdmFsdWU6ICdyZXNwb25zZS1ib2R5JyB8ICdzdGF0dXMnOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtcbiAgICB7IHZhbHVlOiAncmVzcG9uc2UtYm9keScsIGxhYmVsOiAnUmVzcG9uc2UgQm9keScgfSxcbiAgICB7IHZhbHVlOiAnc3RhdHVzJywgbGFiZWw6ICdTdGF0dXMnIH0sXG4gIF07XG4gIGFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiOiAncmVzcG9uc2UtYm9keScgfCAnc3RhdHVzJyA9ICdyZXNwb25zZS1ib2R5JztcblxuICAvKiogUGF5bG9hZCB0eXBlIGZvciBCb2R5L1BhcmFtcy9BdXRob3JpemF0aW9uOiByYXcsIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCwgZm9ybS1kYXRhICovXG4gIHBheWxvYWRUeXBlOiAncmF3JyB8ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ2Zvcm0tZGF0YScgPSAncmF3JztcblxuICAvKiogU2VnbWVudCBvcHRpb25zIGZvciBwYXlsb2FkIHR5cGUgKHVzZWQgYnkgY3FhLXNlZ21lbnQtY29udHJvbCkgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZFR5cGVTZWdtZW50cyA9IFtcbiAgICB7IGxhYmVsOiAnUmF3JywgdmFsdWU6ICdyYXcnIH0sXG4gICAgeyBsYWJlbDogJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsIHZhbHVlOiAneC13d3ctZm9ybS11cmxlbmNvZGVkJyB9LFxuICAgIHsgbGFiZWw6ICdGb3JtIERhdGEnLCB2YWx1ZTogJ2Zvcm0tZGF0YScgfSxcbiAgXTtcblxuICBvblBheWxvYWRUeXBlQ2hhbmdlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wYXlsb2FkVHlwZSA9IHZhbCBhcyAncmF3JyB8ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ2Zvcm0tZGF0YSc7XG4gIH1cblxuICAvKiogRm9ybSBmb3IgRm9ybWF0IHNlbGVjdCAoQm9keS9QYXJhbXMvQXV0aG9yaXphdGlvbikgKi9cbiAgcGF5bG9hZEZvcm1hdEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIEZvcm1hdCBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgKHBhc3NlZCBmcm9tIHBhcmVudCkuIEZhbGxzIGJhY2sgdG8gSlNPTiwgWE1MLCBIVE1MLCBUZXh0IHdoZW4gZW1wdHkuICovXG4gIEBJbnB1dCgpIGZvcm1hdE9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIGluaXRpYWxGb3JtYXQ/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GT1JNQVRfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ2pzb24nLCB2YWx1ZTogJ2pzb24nLCBuYW1lOiAnSlNPTicsIGxhYmVsOiAnSlNPTicgfSxcbiAgICB7IGlkOiAneG1sJywgdmFsdWU6ICd4bWwnLCBuYW1lOiAnWE1MJywgbGFiZWw6ICdYTUwnIH0sXG4gICAgeyBpZDogJ2h0bWwnLCB2YWx1ZTogJ2h0bWwnLCBuYW1lOiAnSFRNTCcsIGxhYmVsOiAnSFRNTCcgfSxcbiAgICB7IGlkOiAndGV4dCcsIHZhbHVlOiAndGV4dCcsIG5hbWU6ICdUZXh0JywgbGFiZWw6ICdUZXh0JyB9LFxuICBdO1xuXG4gIC8qKiBDb25maWcgZm9yIEZvcm1hdCBkcm9wZG93biAodXBkYXRlZCB3aGVuIGZvcm1hdE9wdGlvbnMgY2hhbmdlcywgbGlrZSBNZXRob2QgZHJvcGRvd24pICovXG4gIHBheWxvYWRGb3JtYXRTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdmb3JtYXQnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9GT1JNQVRfT1BUSU9OU10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYXlsb2FkRm9ybWF0U2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgdGhpcy5mb3JtYXRPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5mb3JtYXRPcHRpb25zLm1hcCgoZikgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24oZikpXG4gICAgICAgIDogQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9GT1JNQVRfT1BUSU9OUztcbiAgICB0aGlzLnBheWxvYWRGb3JtYXRTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnBheWxvYWRGb3JtYXRTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEZvcm1hdFZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMuZm9ybWF0T3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuZm9ybWF0T3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVF9PUFRJT05TIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSk7XG4gICAgcmV0dXJuIHNvdXJjZVxuICAgICAgLm1hcCgoZikgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSlcbiAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9IG51bGwpO1xuICB9XG5cbiAgLyoqIFBheWxvYWQgdGV4dCBhcmVhIHZhbHVlIGZvciBCb2R5L1BhcmFtcy9BdXRob3JpemF0aW9uICovXG4gIHBheWxvYWRUZXh0ID0gJyc7XG5cbiAgLyoqIEpTT04gcGFyc2UgZXJyb3Igd2hlbiBmb3JtYXQgaXMgSlNPTiBhbmQgcGF5bG9hZCBpcyBpbnZhbGlkOyBudWxsIHdoZW4gdmFsaWQgb3Igbm90IEpTT04uICovXG4gIHBheWxvYWRKc29uRXJyb3I6IHtcbiAgICBsaW5lOiBudW1iZXI7XG4gICAgY29sdW1uOiBudW1iZXI7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGV4Y2VycHQ6IHN0cmluZztcbiAgICBjYXJldE9mZnNldDogbnVtYmVyO1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIExpbmUgbnVtYmVycyBmb3IgcGF5bG9hZCB0ZXh0YXJlYSAoMSwgMiwgMywgLi4uKSBiYXNlZCBvbiBjdXJyZW50IGxpbmUgY291bnQuICovXG4gIGdldCBwYXlsb2FkTGluZU51bWJlcnMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IG4gPSBNYXRoLm1heCgxLCAodGhpcy5wYXlsb2FkVGV4dCB8fCAnJykuc3BsaXQoL1xccj9cXG4vKS5sZW5ndGgpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuIH0sIChfLCBpKSA9PiBpICsgMSk7XG4gIH1cblxuICAvKiogV2hldGhlciBjdXJyZW50IHBheWxvYWQgZm9ybWF0IGlzIEpTT04gKHNvIHdlIHZhbGlkYXRlIGFuZCBzaG93IEpTT04gZWRpdG9yIGJlaGF2aW9yKS4gKi9cbiAgZ2V0IGlzUGF5bG9hZEZvcm1hdEpzb24oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZm9ybWF0ID0gdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybT8uZ2V0KCdmb3JtYXQnKT8udmFsdWU7XG4gICAgcmV0dXJuIGZvcm1hdCA9PT0gJ2pzb24nO1xuICB9XG5cbiAgLyoqIEVycm9yIG1lc3NhZ2VzIGZvciB0aGUgcGF5bG9hZCB0ZXh0YXJlYSAocmVkIGJvcmRlciArIGJvdHRvbSBsaW5lKS4gKi9cbiAgZ2V0IHBheWxvYWRKc29uRXJyb3JzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5wYXlsb2FkSnNvbkVycm9yID8gWydJbnZhbGlkIEpTT04gZm9ybWF0LiBQbGVhc2UgY2hlY2sgeW91ciBzeW50YXguJ10gOiBbXTtcbiAgfVxuXG4gIC8qKiBUb29sdGlwIGNvbnRlbnQgZm9yIHRoZSBsaW5lLWxldmVsIGVycm9yIGljb24gKHBhcnNlIGVycm9yIG9uIGxpbmUgWCwgZXhjZXJwdCwgY2FyZXQsIG1lc3NhZ2UpLiAqL1xuICBnZXQgcGF5bG9hZEpzb25FcnJvclRvb2x0aXAoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucGF5bG9hZEpzb25FcnJvcikgcmV0dXJuICcnO1xuICAgIGNvbnN0IGUgPSB0aGlzLnBheWxvYWRKc29uRXJyb3I7XG4gICAgY29uc3QgY2FyZXQgPSAnICcucmVwZWF0KGUuY2FyZXRPZmZzZXQpICsgJ14nO1xuICAgIHJldHVybiBgUGFyc2UgZXJyb3Igb24gbGluZSAke2UubGluZX06XFxuXFxuJHtlLmV4Y2VycHR9XFxuJHtjYXJldH1cXG5cXG4ke2UubWVzc2FnZX1gO1xuICB9XG5cbiAgb25QYXlsb2FkVGV4dENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wYXlsb2FkVGV4dCA9IHZhbHVlO1xuICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICB9XG5cbiAgb25QYXlsb2FkSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xuICAgIHRoaXMub25QYXlsb2FkVGV4dENoYW5nZSh0YXJnZXQ/LnZhbHVlID8/ICcnKTtcbiAgfVxuXG4gIG9uUGF5bG9hZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNQYXlsb2FkRm9ybWF0SnNvbikgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcbiAgICBjb25zdCBjbG9zZSA9IFBBWUxPQURfQVVUT19DTE9TRV9QQUlSU1trZXldO1xuICAgIGlmICghY2xvc2UpIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID8/IDA7XG4gICAgY29uc3QgZW5kID0gdGFyZ2V0LnNlbGVjdGlvbkVuZCA/PyBzdGFydDtcbiAgICBjb25zdCBiZWZvcmUgPSB0aGlzLnBheWxvYWRUZXh0LnNsaWNlKDAsIHN0YXJ0KTtcbiAgICBjb25zdCBhZnRlciA9IHRoaXMucGF5bG9hZFRleHQuc2xpY2UoZW5kKTtcbiAgICBjb25zdCBpbnNlcnRQb3MgPSBzdGFydCArIDE7XG4gICAgY29uc3QgbmV3VmFsdWUgPSBiZWZvcmUgKyBrZXkgKyBjbG9zZSArIGFmdGVyO1xuICAgIHRoaXMucGF5bG9hZFRleHQgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucGF5bG9hZFRleHRhcmVhUmVmPy5uYXRpdmVFbGVtZW50Py5zZXRTZWxlY3Rpb25SYW5nZShpbnNlcnRQb3MsIGluc2VydFBvcyk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKiogVmFsaWRhdGUgcGF5bG9hZCB3aGVuIGZvcm1hdCBpcyBKU09OOyBzZXRzIHBheWxvYWRKc29uRXJyb3Igb3IgY2xlYXJzIGl0LiAqL1xuICB2YWxpZGF0ZVBheWxvYWRKc29uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1BheWxvYWRGb3JtYXRKc29uKSB7XG4gICAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5wYXlsb2FkVGV4dCA/PyAnJztcbiAgICBpZiAodGV4dC50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmV4dHJhY3RQb3NpdGlvbkZyb21Kc29uRXJyb3IobWVzc2FnZSk7XG4gICAgICBjb25zdCB7IGxpbmUsIGNvbHVtbiB9ID0gdGhpcy5wb3NpdGlvblRvTGluZUNvbHVtbih0ZXh0LCBwb3NpdGlvbik7XG4gICAgICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgIGNvbnN0IGxpbmVJbmRleCA9IE1hdGgubWF4KDAsIGxpbmUgLSAxKTtcbiAgICAgIGNvbnN0IGxpbmVDb250ZW50ID0gbGluZXNbbGluZUluZGV4XSA/PyAnJztcbiAgICAgIGNvbnN0IGV4Y2VycHQgPSBsaW5lQ29udGVudCB8fCAnICc7XG4gICAgICBjb25zdCBjYXJldE9mZnNldCA9IGxpbmVJbmRleCA9PT0gbGluZSAtIDEgPyBNYXRoLm1pbihjb2x1bW4gLSAxLCBsaW5lQ29udGVudC5sZW5ndGgpIDogMDtcbiAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IHtcbiAgICAgICAgbGluZSxcbiAgICAgICAgY29sdW1uLFxuICAgICAgICBtZXNzYWdlOiB0aGlzLm5vcm1hbGl6ZUpzb25FcnJvck1lc3NhZ2UobWVzc2FnZSksXG4gICAgICAgIGV4Y2VycHQsXG4gICAgICAgIGNhcmV0T2Zmc2V0LFxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RQb3NpdGlvbkZyb21Kc29uRXJyb3IobWVzc2FnZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBtYXRjaCA9IG1lc3NhZ2UubWF0Y2goL3Bvc2l0aW9uXFxzKyhcXGQrKS9pKSB8fCBtZXNzYWdlLm1hdGNoKC9hdFxccytwb3NpdGlvblxccysoXFxkKykvaSk7XG4gICAgcmV0dXJuIG1hdGNoID8gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKSA6IDA7XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uVG9MaW5lQ29sdW1uKHRleHQ6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IHsgbGluZTogbnVtYmVyOyBjb2x1bW46IG51bWJlciB9IHtcbiAgICBjb25zdCBiZWZvcmUgPSB0ZXh0LnNsaWNlKDAsIE1hdGgubWluKHBvc2l0aW9uLCB0ZXh0Lmxlbmd0aCkpO1xuICAgIGNvbnN0IGxpbmVzID0gYmVmb3JlLnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgY29uc3QgbGluZSA9IGxpbmVzLmxlbmd0aDtcbiAgICBjb25zdCBsYXN0TGluZSA9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID8/ICcnO1xuICAgIHJldHVybiB7IGxpbmUsIGNvbHVtbjogbGFzdExpbmUubGVuZ3RoICsgMSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVKc29uRXJyb3JNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoJ0V4cGVjdGluZycpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoJ2V4cGVjdGluZycpKSByZXR1cm4gbWVzc2FnZTtcbiAgICBjb25zdCB0b2tlbk1hdGNoID0gbWVzc2FnZS5tYXRjaCgvVW5leHBlY3RlZCB0b2tlblxccytbJ1wiXT8oW14nXCJdKylbJ1wiXT8vaSlcbiAgICAgIHx8IG1lc3NhZ2UubWF0Y2goL3VuZXhwZWN0ZWQgY2hhcmFjdGVyLio/KFteXFxzXSspL2kpO1xuICAgIGNvbnN0IHRva2VuID0gdG9rZW5NYXRjaCA/IHRva2VuTWF0Y2hbMV0udHJpbSgpIDogJ3VuZGVmaW5lZCc7XG4gICAgcmV0dXJuIGBFeHBlY3RpbmcgJ1NUUklORycsICdOVU1CRVInLCAnTlVMTCcsICdUUlVFJywgJ0ZBTFNFJywgJ3snLCAnWycsIGdvdCAnJHt0b2tlbn0nYDtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3BheWxvYWRFZGl0b3JXaXRoTGluZXNSZWYnKSBwYXlsb2FkRWRpdG9yV2l0aExpbmVzUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BheWxvYWRUZXh0YXJlYVJlZicpIHBheWxvYWRUZXh0YXJlYVJlZj86IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9IRUFERVJfTkFNRV9PUFRJT05TOiBzdHJpbmdbXSA9IFtcbiAgICAnQWNjZXB0JyxcbiAgICAnQWNjZXB0LUNoYXJzZXQnLFxuICAgICdBY2NlcHQtRW5jb2RpbmcnLFxuICAgICdBY2NlcHQtTGFuZ3VhZ2UnLFxuICAgICdBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LUhlYWRlcnMnLFxuICAgICdBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LU1ldGhvZCcsXG4gICAgJ1NjcmlwdHMnLFxuICAgICdDYWNoZS1Db250cm9sJyxcbiAgICAnQ29udGVudC1NRDUnLFxuICAgICdDb250ZW50LUxlbmd0aCcsXG4gICAgJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLFxuICAgICdDb250ZW50LVR5cGUnLFxuICAgICdDb29raWUnLFxuICAgICdEYXRlJyxcbiAgICAnRXhwZWN0JyxcbiAgICAnRnJvbScsXG4gICAgJ0hvc3QnLFxuICAgICdJZi1NYXRjaCcsXG4gICAgJ0lmLU1vZGlmaWVkLVNpbmNlJyxcbiAgICAnSWYtTm9uZS1NYXRjaCcsXG4gICAgJ0lmLVVubW9kaWZpZWQtU2luY2UnLFxuICAgICdJZi1SYW5nZScsXG4gICAgJ0tlZXAtQWxpdmUnLFxuICAgICdNYXgtRm9yd2FyZHMnLFxuICAgICdPcmlnaW4nLFxuICAgICdQcmFnbWEnLFxuICAgICdQcm94eS1BdXRob3JpemF0aW9uJyxcbiAgICAnUmFuZ2UnLFxuICAgICdSZWZlcmVyJyxcbiAgICAnVEUnLFxuICAgICdUcmFpbGVyJyxcbiAgICAnVHJhbnNmZXItRW5jb2RpbmcnLFxuICAgICdVcGdyYWRlJyxcbiAgICAnVXNlci1BZ2VudCcsXG4gICAgJ1ZpYScsXG4gICAgJ1dhcm5pbmcnLFxuICAgICdYLVJlcXVlc3RlZC1XaXRoJyxcbiAgICAnWC1Eby1Ob3QtVHJhY2snLFxuICAgICdETlQnLFxuICAgICd4LWFwaS1rZXknLFxuICAgICdDb25uZWN0aW9uJyxcbiAgXTtcblxuICAvKiogSGVhZGVyIG5hbWUgb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHdpdGggaWQsIG5hbWUsIHZhbHVlLCBsYWJlbCAocGFzc2VkIGZyb20gcGFyZW50KS4gRmFsbHMgYmFjayB0byBidWlsdC1pbiBsaXN0IHdoZW4gZW1wdHkuICovXG4gIEBJbnB1dCgpIGhlYWRlck5hbWVPcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICAvKiogRm9ybSBhcnJheSBmb3IgaGVhZGVyIHJvd3M7IGVhY2ggaXRlbSBpcyBGb3JtR3JvdXAoeyBuYW1lLCB2YWx1ZSB9KSBmb3IgY3FhLWR5bmFtaWMtc2VsZWN0IGFuZCB2YWx1ZSBpbnB1dCAqL1xuICBoZWFkZXJzRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIC8qKiBUeXBlZCBhY2Nlc3NvciBmb3IgdGVtcGxhdGUgKEZvcm1BcnJheS5jb250cm9scyBpcyBBYnN0cmFjdENvbnRyb2xbXSkgKi9cbiAgZ2V0IGhlYWRlclJvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy5oZWFkZXJzRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogQ29uZmlnIGZvciBoZWFkZXIgbmFtZSBkcm9wZG93biAodXBkYXRlZCB3aGVuIGhlYWRlck5hbWVPcHRpb25zIGNoYW5nZXMgdG8gYXZvaWQgbmV3IHJlZmVyZW5jZSBldmVyeSBDRCkgKi9cbiAgaGVhZGVyTmFtZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ25hbWUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGhlYWRlcicsXG4gICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICBhbGxvd0N1c3RvbVZhbHVlOiB0cnVlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2UgPVxuICAgICAgdGhpcy5oZWFkZXJOYW1lT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuaGVhZGVyTmFtZU9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9IRUFERVJfTkFNRV9PUFRJT05TIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSk7XG4gICAgY29uc3QgYmFzZU9wdGlvbnMgPSBzb3VyY2UubWFwKChoKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihoKSk7XG4gICAgY29uc3QgYmFzZVZhbHVlcyA9IG5ldyBTZXQoYmFzZU9wdGlvbnMubWFwKChvKSA9PiBTdHJpbmcoby52YWx1ZSA/PyBvLmlkID8/ICcnKS50cmltKCkpLmZpbHRlcihCb29sZWFuKSk7XG4gICAgY29uc3QgY3VycmVudE5hbWVzRnJvbUZvcm0gPSB0aGlzLmdldEN1cnJlbnRIZWFkZXJOYW1lc0Zyb21Gb3JtKCk7XG4gICAgY29uc3QgZXh0cmFPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBjdXJyZW50TmFtZXNGcm9tRm9ybSkge1xuICAgICAgY29uc3Qga2V5ID0gbmFtZS50cmltKCk7XG4gICAgICBpZiAoa2V5ICYmICFiYXNlVmFsdWVzLmhhcyhrZXkpKSB7XG4gICAgICAgIGJhc2VWYWx1ZXMuYWRkKGtleSk7XG4gICAgICAgIGV4dHJhT3B0aW9ucy5wdXNoKHsgaWQ6IGtleSwgdmFsdWU6IGtleSwgbmFtZToga2V5LCBsYWJlbDoga2V5IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvcHRpb25zID0gWy4uLmJhc2VPcHRpb25zLCAuLi5leHRyYU9wdGlvbnNdO1xuICAgIHRoaXMuaGVhZGVyTmFtZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuaGVhZGVyTmFtZVNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDb2xsZWN0cyBkaXN0aW5jdCBub24tZW1wdHkgaGVhZGVyIG5hbWVzIGN1cnJlbnRseSBpbiB0aGUgaGVhZGVycyBmb3JtIChmb3IgZHluYW1pYyBvcHRpb25zKS4gKi9cbiAgcHJpdmF0ZSBnZXRDdXJyZW50SGVhZGVyTmFtZXNGcm9tRm9ybSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgbmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGlmICghdGhpcy5oZWFkZXJzRm9ybUFycmF5Py5jb250cm9scz8ubGVuZ3RoKSByZXR1cm4gbmFtZXM7XG4gICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5jb250cm9scykge1xuICAgICAgY29uc3QgbmFtZSA9IChjb250cm9sIGFzIEZvcm1Hcm91cCkuZ2V0KCduYW1lJyk/LnZhbHVlO1xuICAgICAgY29uc3Qgc3RyID0gbmFtZSAhPSBudWxsID8gU3RyaW5nKG5hbWUpLnRyaW0oKSA6ICcnO1xuICAgICAgaWYgKHN0ciAmJiAhc2Vlbi5oYXMoc3RyKSkge1xuICAgICAgICBzZWVuLmFkZChzdHIpO1xuICAgICAgICBuYW1lcy5wdXNoKHN0cik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdEhlYWRlcnM6IEFwaUVkaXRIZWFkZXJSb3dbXSA9IFtcbiAgICB7IG5hbWU6ICdDb250ZW50LVR5cGUnLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICBdO1xuXG4gIC8qKiBGb3JtIGFycmF5IGZvciBrZXktdmFsdWUgcm93cyAoQm9keSBwYXlsb2FkKTsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IGtleSwgdmFsdWUgfSkgKi9cbiAga2V5VmFsdWVGb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IGtleVZhbHVlUm93cygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLmtleVZhbHVlRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogRm9ybSBhcnJheSBmb3Iga2V5LXR5cGUtdmFsdWUgcm93czsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IGtleSwgdHlwZSwgdmFsdWUgfSkgKi9cbiAga2V5VHlwZVZhbHVlRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIGdldCBrZXlUeXBlVmFsdWVSb3dzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMua2V5VHlwZVZhbHVlRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogRm9ybSBhcnJheSBmb3IgUGFyYW1zIHRhYiBrZXktdmFsdWUgcm93czsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IGtleSwgdmFsdWUgfSkgKi9cbiAgcGFyYW1zRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIGdldCBwYXJhbXNSb3dzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMucGFyYW1zRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogQ29uZmlnIGZvciBUeXBlIGRyb3Bkb3duIGluIGtleS10eXBlLXZhbHVlIHJvd3MgKFRleHQsIEZpbGUpICovXG4gIHJlYWRvbmx5IGtleVR5cGVWYWx1ZVR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBwbGFjZWhvbGRlcjogJ1RleHQnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgaWQ6ICd0ZXh0JywgdmFsdWU6ICd0ZXh0JywgbmFtZTogJ1RleHQnLCBsYWJlbDogJ1RleHQnIH0sXG4gICAgICB7IGlkOiAnZmlsZScsIHZhbHVlOiAnZmlsZScsIG5hbWU6ICdGaWxlJywgbGFiZWw6ICdGaWxlJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgLyoqIEZvcm0gYXJyYXkgZm9yIHJlc3BvbnNlIGJvZHkgdmVyaWZpY2F0aW9uIHJvd3M7IGVhY2ggaXRlbSBpcyBGb3JtR3JvdXAoeyBqc29uUGF0aCwgdmVyaWZpY2F0aW9uLCBkYXRhVHlwZSwgZXhwZWN0ZWRWYWx1ZSB9KSAqL1xuICB2ZXJpZmljYXRpb25Gb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IHZlcmlmaWNhdGlvblJvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBWZXJpZmljYXRpb24gb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIChwYXNzZWQgZnJvbSBwYXJlbnQpLiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3Qgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgdmVyaWZpY2F0aW9uT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9WRVJJRklDQVRJT05fT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ2VxdWFscycsIHZhbHVlOiAnZXF1YWxzJywgbmFtZTogJ0VxdWFscycsIGxhYmVsOiAnRXF1YWxzJyB9LFxuICAgIHsgaWQ6ICdub3QtZXF1YWwnLCB2YWx1ZTogJ25vdC1lcXVhbCcsIG5hbWU6ICdOb3QgZXF1YWwnLCBsYWJlbDogJ05vdCBlcXVhbCcgfSxcbiAgICB7IGlkOiAnbGVzcy10aGFuJywgdmFsdWU6ICdsZXNzLXRoYW4nLCBuYW1lOiAnTGVzcyB0aGFuJywgbGFiZWw6ICdMZXNzIHRoYW4nIH0sXG4gICAgeyBpZDogJ2dyZWF0ZXItdGhhbicsIHZhbHVlOiAnZ3JlYXRlci10aGFuJywgbmFtZTogJ0dyZWF0ZXIgdGhhbicsIGxhYmVsOiAnR3JlYXRlciB0aGFuJyB9LFxuICAgIHsgaWQ6ICdpcy1udWxsJywgdmFsdWU6ICdpcy1udWxsJywgbmFtZTogJ0lzIG51bGwnLCBsYWJlbDogJ0lzIG51bGwnIH0sXG4gICAgeyBpZDogJ2lzLW5vdC1udWxsJywgdmFsdWU6ICdpcy1ub3QtbnVsbCcsIG5hbWU6ICdJcyBub3QgbnVsbCcsIGxhYmVsOiAnSXMgbm90IG51bGwnIH0sXG4gIF07XG5cbiAgLyoqIENvbmZpZyBmb3IgVmVyaWZpY2F0aW9uIGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gdmVyaWZpY2F0aW9uT3B0aW9ucyBjaGFuZ2VzLCBsaWtlIE1ldGhvZCBkcm9wZG93bikgKi9cbiAgdmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndmVyaWZpY2F0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ0VxdWFscycsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogWy4uLkFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfVkVSSUZJQ0FUSU9OX09QVElPTlNdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgdGhpcy52ZXJpZmljYXRpb25PcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy52ZXJpZmljYXRpb25PcHRpb25zLm1hcCgodikgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24odikpXG4gICAgICAgIDogQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9WRVJJRklDQVRJT05fT1BUSU9OUztcbiAgICB0aGlzLnZlcmlmaWNhdGlvblNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMudmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRWZXJpZmljYXRpb25WYWx1ZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNvdXJjZSA9XG4gICAgICB0aGlzLnZlcmlmaWNhdGlvbk9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnZlcmlmaWNhdGlvbk9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9WRVJJRklDQVRJT05fT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKHYpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFZlcmlmaWNhdGlvbigpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmVyaWZpY2F0aW9uVmFsdWVzKCk7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPiAwID8gdmFsdWVzWzBdIDogJ2VxdWFscyc7XG4gIH1cblxuICAvKiogRGF0YSBUeXBlIG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyAocGFzc2VkIGZyb20gcGFyZW50KS4gRmFsbHMgYmFjayB0byBidWlsdC1pbiBsaXN0IHdoZW4gZW1wdHkuICovXG4gIEBJbnB1dCgpIHZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9EQVRBX1RZUEVfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ3N0cmluZycsIHZhbHVlOiAnc3RyaW5nJywgbmFtZTogJ1N0cmluZycsIGxhYmVsOiAnU3RyaW5nJyB9LFxuICAgIHsgaWQ6ICdudW1iZXInLCB2YWx1ZTogJ251bWJlcicsIG5hbWU6ICdOdW1iZXInLCBsYWJlbDogJ051bWJlcicgfSxcbiAgICB7IGlkOiAnYm9vbGVhbicsIHZhbHVlOiAnYm9vbGVhbicsIG5hbWU6ICdCb29sZWFuJywgbGFiZWw6ICdCb29sZWFuJyB9LFxuICAgIHsgaWQ6ICdhcnJheScsIHZhbHVlOiAnYXJyYXknLCBuYW1lOiAnQXJyYXknLCBsYWJlbDogJ0FycmF5JyB9LFxuICAgIHsgaWQ6ICdvYmplY3QnLCB2YWx1ZTogJ29iamVjdCcsIG5hbWU6ICdPYmplY3QnLCBsYWJlbDogJ09iamVjdCcgfSxcbiAgXTtcblxuICAvKiogQ29uZmlnIGZvciBEYXRhIFR5cGUgZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiB2ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnMgY2hhbmdlcywgbGlrZSBNZXRob2QgZHJvcGRvd24pICovXG4gIHZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZGF0YVR5cGUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU3RyaW5nJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9EQVRBX1RZUEVfT1BUSU9OU10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVWZXJpZmljYXRpb25EYXRhVHlwZVNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID1cbiAgICAgIHRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnMubWFwKChkKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihkKSlcbiAgICAgICAgOiBBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0RBVEFfVFlQRV9PUFRJT05TO1xuICAgIHRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRhVHlwZVZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9EQVRBX1RZUEVfT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKGQpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGQgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdERhdGFUeXBlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXREYXRhVHlwZVZhbHVlcygpO1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlc1swXSA6ICdzdHJpbmcnO1xuICB9XG5cbiAgLyoqIENvbmZpZyBmb3IgRXhwZWN0ZWQgVmFsdWUgd2hlbiBEYXRhIFR5cGUgaXMgQm9vbGVhbiAodHJ1ZS9mYWxzZSBkcm9wZG93bikgKi9cbiAgcmVhZG9ubHkgdmVyaWZpY2F0aW9uRXhwZWN0ZWRWYWx1ZUJvb2xlYW5TZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdleHBlY3RlZFZhbHVlJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyBpZDogJ3RydWUnLCB2YWx1ZTogJ3RydWUnLCBuYW1lOiAndHJ1ZScsIGxhYmVsOiAndHJ1ZScgfSxcbiAgICAgIHsgaWQ6ICdmYWxzZScsIHZhbHVlOiAnZmFsc2UnLCBuYW1lOiAnZmFsc2UnLCBsYWJlbDogJ2ZhbHNlJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgLyoqIEZvcm0gYXJyYXkgZm9yIFN0YXR1cyB0YWIgdmVyaWZpY2F0aW9uIHJvd3M7IGVhY2ggaXRlbSBpcyBGb3JtR3JvdXAoeyB2ZXJpZmljYXRpb24sIGV4cGVjdGVkVmFsdWUgfSkgKi9cbiAgc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIGdldCBzdGF0dXNWZXJpZmljYXRpb25Sb3dzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogQ29uZmlnIGZvciBTdGF0dXMgdGFiIFZlcmlmaWNhdGlvbiBkcm9wZG93biAoRXF1YWxzLCBOb3QgZXF1YWwsIExlc3MgdGhhbiwgR3JlYXRlciB0aGFuKSAqL1xuICAvKiogU3RhdHVzIHRhYiBWZXJpZmljYXRpb24gb3B0aW9ucyAoRXF1YWxzLCBOb3QgZXF1YWwsIGV0Yy4pLiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3Qgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9TVEFUVVNfVkVSSUZJQ0FUSU9OX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdlcXVhbHMnLCB2YWx1ZTogJ2VxdWFscycsIG5hbWU6ICdFcXVhbHMnLCBsYWJlbDogJ0VxdWFscycgfSxcbiAgICB7IGlkOiAnbm90LWVxdWFsJywgdmFsdWU6ICdub3QtZXF1YWwnLCBuYW1lOiAnTm90IGVxdWFsJywgbGFiZWw6ICdOb3QgZXF1YWwnIH0sXG4gICAgeyBpZDogJ2xlc3MtdGhhbicsIHZhbHVlOiAnbGVzcy10aGFuJywgbmFtZTogJ0xlc3MgdGhhbicsIGxhYmVsOiAnTGVzcyB0aGFuJyB9LFxuICAgIHsgaWQ6ICdncmVhdGVyLXRoYW4nLCB2YWx1ZTogJ2dyZWF0ZXItdGhhbicsIG5hbWU6ICdHcmVhdGVyIHRoYW4nLCBsYWJlbDogJ0dyZWF0ZXIgdGhhbicgfSxcbiAgXTtcblxuICAvKiogQ29uZmlnIGZvciBTdGF0dXMgdGFiIFZlcmlmaWNhdGlvbiBkcm9wZG93biAodXBkYXRlZCB3aGVuIHN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnMgY2hhbmdlcykuICovXG4gIHN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3ZlcmlmaWNhdGlvbicsXG4gICAgcGxhY2Vob2xkZXI6ICdFcXVhbHMnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1NUQVRVU19WRVJJRklDQVRJT05fT1BUSU9OU10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnMubWFwKChvKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihvKSlcbiAgICAgICAgOiBBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1NUQVRVU19WRVJJRklDQVRJT05fT1BUSU9OUztcbiAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGF0dXNWZXJpZmljYXRpb25WYWx1ZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNvdXJjZSA9XG4gICAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9TVEFUVVNfVkVSSUZJQ0FUSU9OX09QVElPTlMgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdKTtcbiAgICByZXR1cm4gc291cmNlXG4gICAgICAubWFwKChvKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShvIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRTdGF0dXNWZXJpZmljYXRpb24oKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFN0YXR1c1ZlcmlmaWNhdGlvblZhbHVlcygpO1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlc1swXSA6ICdlcXVhbHMnO1xuICB9XG5cbiAgcmVzcG9uc2VQcmV2aWV3ID0gYGA7XG5cbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgcmVzcG9uc2UgcHJldmlldyBzZWN0aW9uLCB1c2VkIHRvIHNjcm9sbCBpbnRvIHZpZXcgYWZ0ZXIgU2VuZCBSZXF1ZXN0IGNvbXBsZXRlcy4gKi9cbiAgQFZpZXdDaGlsZCgncmVzcG9uc2VQcmV2aWV3UmVmJywgeyBzdGF0aWM6IGZhbHNlIH0pIHJlc3BvbnNlUHJldmlld1JlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIHByaXZhdGUgbWV0aG9kQ2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBmb3JtYXRDaGFuZ2VzU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGhlYWRlck5hbWVPcHRpb25zQ2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBlbnZpcm9ubWVudEZvcm1DaGFuZ2VzU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIG1ldGhvZEZvcm1DaGFuZ2VzU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHBhcmFtc0Zvcm1BcnJheUNoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG5cbiAgLy8gQWR2YW5jZWQgc2V0dGluZ3M6IGdlbmVyaWMgYWR2YW5jZWQgdmFyaWFibGVzIGZvciB0aGlzIEFQSSBzdGVwIChjYW4gYmUgcHJvdmlkZWQgYnkgcGFyZW50KVxuICBhZHZhbmNlZEV4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogYW55W10gPSBbXTtcbiAgYWR2YW5jZWRWYXJpYWJsZXNGb3JtOiBGb3JtQXJyYXkgPSBuZXcgRm9ybUFycmF5KFtdKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFwcGx5SW5pdGlhbFN0ZXAodGhpcy5pbml0aWFsU3RlcCk7XG4gICAgdGhpcy51cGRhdGVNZXRob2RTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLnVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTtcbiAgICBjb25zdCBmaXJzdE1ldGhvZFZhbHVlID0gdGhpcy5odHRwTWV0aG9kT3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnNbMF0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZWZhdWx0TWV0aG9kID0gdGhpcy5pbml0aWFsTWV0aG9kID8/IGZpcnN0TWV0aG9kVmFsdWUgPz8gJ0dFVCc7XG4gICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSB0eXBlb2YgZGVmYXVsdE1ldGhvZCA9PT0gJ3N0cmluZycgPyBkZWZhdWx0TWV0aG9kIDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGRlZmF1bHRNZXRob2QgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpO1xuICAgIHRoaXMubWV0aG9kRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgbWV0aG9kOiBbZGVmYXVsdE1ldGhvZF0sXG4gICAgfSk7XG4gICAgY29uc3QgZmlyc3RWYWx1ZSA9IHRoaXMuZW52aXJvbm1lbnRPcHRpb25zPy5sZW5ndGhcbiAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5lbnZpcm9ubWVudE9wdGlvbnNbMF0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZWZhdWx0RW52ID0gdGhpcy5pbml0aWFsRW52aXJvbm1lbnQgPz8gZmlyc3RWYWx1ZSA/PyAnRGV2ZWxvcG1lbnQnO1xuICAgIHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgPSB0eXBlb2YgZGVmYXVsdEVudiA9PT0gJ3N0cmluZycgPyBkZWZhdWx0RW52IDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGRlZmF1bHRFbnYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpO1xuICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBlbnZpcm9ubWVudDogW2RlZmF1bHRFbnZdLFxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlQXV0aFR5cGVTZWxlY3RDb25maWcoKTtcbiAgICBjb25zdCBmaXJzdEF1dGhWYWx1ZSA9IHRoaXMuZ2V0QXV0aFR5cGVWYWx1ZXMoKVswXTtcbiAgICBjb25zdCBkZWZhdWx0QXV0aFR5cGUgPSB0aGlzLmluaXRpYWxBdXRoVHlwZSA/PyBmaXJzdEF1dGhWYWx1ZSA/PyAnbm8tYXV0aCc7XG4gICAgdGhpcy5hdXRoVHlwZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGF1dGhUeXBlOiBbZGVmYXVsdEF1dGhUeXBlXSxcbiAgICB9KTtcbiAgICB0aGlzLm9hdXRoMkZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGdyYW50VHlwZTogWydjbGllbnRfY3JlZGVudGlhbHMnXSxcbiAgICAgIGFjY2Vzc1Rva2VuVXJsOiBbJyddLFxuICAgICAgY2xpZW50SWQ6IFsnJ10sXG4gICAgICBjbGllbnRTZWNyZXQ6IFsnJ10sXG4gICAgICBzY29wZTogWycnXSxcbiAgICAgIGNsaWVudEF1dGhlbnRpY2F0aW9uOiBbJ2Jhc2ljJ10sXG4gICAgfSk7XG4gICAgdGhpcy5lbnZpcm9ubWVudEZvcm1DaGFuZ2VzU3ViID0gdGhpcy5lbnZpcm9ubWVudEZvcm0uZ2V0KCdlbnZpcm9ubWVudCcpPy52YWx1ZUNoYW5nZXM/LnN1YnNjcmliZSgodjogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3QgcyA9IHYgIT0gbnVsbCAmJiB2ICE9PSAnJyA/ICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpIDogU3RyaW5nKHYpKSA6ICcnO1xuICAgICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9IHMgPz8gJyc7XG4gICAgfSk7XG4gICAgdGhpcy5tZXRob2RGb3JtQ2hhbmdlc1N1YiA9IHRoaXMubWV0aG9kRm9ybS5nZXQoJ21ldGhvZCcpPy52YWx1ZUNoYW5nZXM/LnN1YnNjcmliZSgodjogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3QgcyA9IHYgIT0gbnVsbCAmJiB2ICE9PSAnJyA/ICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpIDogU3RyaW5nKHYpKSA6ICcnO1xuICAgICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSBzID8/ICcnO1xuICAgIH0pO1xuICAgIHRoaXMuYnVpbGRIZWFkZXJzRm9ybUFycmF5KFxuICAgICAgdGhpcy5pbml0aWFsSGVhZGVycyA/PyBbeyBuYW1lOiAnJywgdHlwZTogJ3N0cmluZycsIHZhbHVlOiAnJyB9XVxuICAgICk7XG4gICAgdGhpcy5oZWFkZXJOYW1lT3B0aW9uc0NoYW5nZXNTdWIgPSB0aGlzLmhlYWRlcnNGb3JtQXJyYXk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgICAgdGhpcy5oZWFkZXJzQ2hhbmdlLmVtaXQodGhpcy5oZWFkZXJzKTtcbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLmhlYWRlcnNDaGFuZ2UuZW1pdCh0aGlzLmhlYWRlcnMpO1xuICAgIHRoaXMudXBkYXRlRW52aXJvbm1lbnRTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLnVwZGF0ZVBheWxvYWRGb3JtYXRTZWxlY3RDb25maWcoKTtcbiAgICBjb25zdCBmaXJzdEZvcm1hdFZhbHVlID0gdGhpcy5nZXRGb3JtYXRWYWx1ZXMoKVswXTtcbiAgICBjb25zdCBkZWZhdWx0Rm9ybWF0ID0gdGhpcy5pbml0aWFsRm9ybWF0ID8/IGZpcnN0Rm9ybWF0VmFsdWUgPz8gJ2pzb24nO1xuICAgIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0gPSB0aGlzLmZiLmdyb3VwKHsgZm9ybWF0OiBbZGVmYXVsdEZvcm1hdF0gfSk7XG5cbiAgICAvLyBJbml0aWFsaXplIHBheWxvYWQgdHlwZSBhbmQgdGV4dCBmcm9tIGlucHV0cyB3aGVuIGVkaXRpbmdcbiAgICBpZiAodGhpcy5pbml0aWFsUGF5bG9hZFR5cGUpIHtcbiAgICAgIHRoaXMucGF5bG9hZFR5cGUgPSB0aGlzLmluaXRpYWxQYXlsb2FkVHlwZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5pdGlhbFBheWxvYWRUZXh0ICE9IG51bGwpIHtcbiAgICAgIHRoaXMucGF5bG9hZFRleHQgPSB0aGlzLmluaXRpYWxQYXlsb2FkVGV4dDtcbiAgICB9XG5cbiAgICB0aGlzLmJ1aWxkS2V5VmFsdWVGb3JtQXJyYXkoKTtcbiAgICB0aGlzLmJ1aWxkS2V5VHlwZVZhbHVlRm9ybUFycmF5KCk7XG4gICAgdGhpcy5idWlsZFBhcmFtc0Zvcm1BcnJheSgpO1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5Q2hhbmdlc1N1YiA9IHRoaXMucGFyYW1zRm9ybUFycmF5LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCgpID0+IHRoaXMuc3luY1VybEZyb21QYXJhbXMoKSk7XG4gICAgaWYgKHRoaXMuaW5pdGlhbFVybCAhPSBudWxsICYmIHRoaXMuaW5pdGlhbFVybCAhPT0gJycpIHtcbiAgICAgIHRoaXMuX3VybCA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmRlY29kZVVybEZvckRpc3BsYXkodGhpcy5pbml0aWFsVXJsKTtcbiAgICAgIHRoaXMuc3luY1BhcmFtc0Zyb21VcmwoKTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZSB2YXJpYWJsZU5hbWUgZnJvbSBpbml0aWFsVmFyaWFibGVOYW1lXG4gICAgaWYgKHRoaXMuaW5pdGlhbFZhcmlhYmxlTmFtZSAhPSBudWxsICYmIHRoaXMuaW5pdGlhbFZhcmlhYmxlTmFtZSAhPT0gJycpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lID0gdGhpcy5pbml0aWFsVmFyaWFibGVOYW1lO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVZlcmlmaWNhdGlvblNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMudXBkYXRlVmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcoKTtcblxuICAgIC8vIEluaXRpYWxpemUgdmVyaWZpY2F0aW9uIHJvd3MgZnJvbSBpbnB1dHMgd2hlbiBwcm92aWRlZDsgb3RoZXJ3aXNlIGJ1aWxkIGRlZmF1bHRzXG4gICAgY29uc3QgYm9keVJvd3MgPVxuICAgICAgdGhpcy5pbml0aWFsUmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9ucyAmJiB0aGlzLmluaXRpYWxSZXNwb25zZUJvZHlWZXJpZmljYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLmluaXRpYWxSZXNwb25zZUJvZHlWZXJpZmljYXRpb25zXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuYnVpbGRWZXJpZmljYXRpb25Gb3JtQXJyYXkoYm9keVJvd3MpO1xuXG4gICAgdGhpcy51cGRhdGVTdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTtcbiAgICBjb25zdCBzdGF0dXNSb3dzID1cbiAgICAgIHRoaXMuaW5pdGlhbFN0YXR1c1ZlcmlmaWNhdGlvbnMgJiYgdGhpcy5pbml0aWFsU3RhdHVzVmVyaWZpY2F0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5pbml0aWFsU3RhdHVzVmVyaWZpY2F0aW9uc1xuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJ1aWxkU3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5KHN0YXR1c1Jvd3MpO1xuICAgIHRoaXMubWV0aG9kQ2hhbmdlc1N1YiA9IHRoaXMubWV0aG9kRm9ybS5nZXQoJ21ldGhvZCcpPy52YWx1ZUNoYW5nZXM/LnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgbWV0aG9kID0gdmFsdWUgIT0gbnVsbCA/IFN0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKSA6ICcnO1xuICAgICAgaWYgKE1FVEhPRFNfV0lUSE9VVF9CT0RZLmluY2x1ZGVzKG1ldGhvZCkgJiYgdGhpcy5hY3RpdmVQYXlsb2FkVGFiICE9PSAnaGVhZGVycycpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gJ2hlYWRlcnMnO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5mb3JtYXRDaGFuZ2VzU3ViID0gdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5nZXQoJ2Zvcm1hdCcpPy52YWx1ZUNoYW5nZXM/LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICB9KTtcbiAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcblxuICAgIC8vIEluaXRpYWxpemUgYWN0aXZlIHJlc3BvbnNlIHZlcmlmaWNhdGlvbiB0YWIgZnJvbSBpbnB1dCB3aGVuIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMuaW5pdGlhbEFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiKSB7XG4gICAgICB0aGlzLmFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiID0gdGhpcy5pbml0aWFsQWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgYWR2YW5jZWQgc2V0dGluZ3MgZm9ybSBvbmx5IGZyb20gaW5wdXQgdmFyaWFibGVzIChubyBsb2NhbCBpbml0aWFsaXphdGlvbilcbiAgICBpZiAodGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzICYmIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0dXBQYXlsb2FkVGV4dGFyZWFTY3JvbGxTeW5jKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm1ldGhvZENoYW5nZXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5mb3JtYXRDaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaGVhZGVyTmFtZU9wdGlvbnNDaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtQ2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm1ldGhvZEZvcm1DaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5Q2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKiBTeW5jIGxpbmUgbnVtYmVycyBjb2x1bW4gc2Nyb2xsIHdpdGggcGF5bG9hZCB0ZXh0YXJlYSBzY3JvbGwgKFBvc3RtYW4tc3R5bGUpLiAqL1xuICBwcml2YXRlIHNldHVwUGF5bG9hZFRleHRhcmVhU2Nyb2xsU3luYygpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLnBheWxvYWRFZGl0b3JXaXRoTGluZXNSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWhvc3QpIHJldHVybjtcbiAgICAgIGNvbnN0IGxpbmVOdW1iZXJzRWwgPSBob3N0LnF1ZXJ5U2VsZWN0b3IoJy5jcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWxpbmUtbnVtYmVycycpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGNvbnN0IHRleHRhcmVhID0gaG9zdC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpIGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKCFsaW5lTnVtYmVyc0VsIHx8ICF0ZXh0YXJlYSkgcmV0dXJuO1xuICAgICAgdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgICBsaW5lTnVtYmVyc0VsLnNjcm9sbFRvcCA9IHRleHRhcmVhLnNjcm9sbFRvcDtcbiAgICAgIH0pO1xuICAgICAgbGluZU51bWJlcnNFbC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB7XG4gICAgICAgIHRleHRhcmVhLnNjcm9sbFRvcCA9IGxpbmVOdW1iZXJzRWwuc2Nyb2xsVG9wO1xuICAgICAgfSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkS2V5VmFsdWVGb3JtQXJyYXkocm93cz86IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdKTogdm9pZCB7XG4gICAgY29uc3QgaW5pdGlhbCA9IHJvd3MgPz8gW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dO1xuICAgIGNvbnN0IGdyb3VwcyA9IGluaXRpYWwubWFwKChyKSA9PiB0aGlzLmZiLmdyb3VwKHsga2V5OiBbci5rZXldLCB2YWx1ZTogW3IudmFsdWVdIH0pKTtcbiAgICB0aGlzLmtleVZhbHVlRm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShncm91cHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEtleVR5cGVWYWx1ZUZvcm1BcnJheShyb3dzPzogeyBrZXk6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuICAgIGNvbnN0IGluaXRpYWwgPSByb3dzID8/IFt7IGtleTogJycsIHR5cGU6ICd0ZXh0JywgdmFsdWU6ICcnIH1dO1xuICAgIGNvbnN0IGdyb3VwcyA9IGluaXRpYWwubWFwKChyKSA9PiB0aGlzLmZiLmdyb3VwKHsga2V5OiBbci5rZXldLCB0eXBlOiBbci50eXBlXSwgdmFsdWU6IFtyLnZhbHVlXSB9KSk7XG4gICAgdGhpcy5rZXlUeXBlVmFsdWVGb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KGdyb3Vwcyk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUGFyYW1zRm9ybUFycmF5KHJvd3M/OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuICAgIGNvbnN0IGluaXRpYWwgPSByb3dzID8/IFt7IGtleTogJycsIHZhbHVlOiAnJyB9XTtcbiAgICBjb25zdCBncm91cHMgPSBpbml0aWFsLm1hcCgocikgPT4gdGhpcy5mYi5ncm91cCh7IGtleTogW3Iua2V5XSwgdmFsdWU6IFtyLnZhbHVlXSB9KSk7XG4gICAgaWYgKHRoaXMucGFyYW1zRm9ybUFycmF5KSB7XG4gICAgICB0aGlzLnBhcmFtc0Zvcm1BcnJheS5jbGVhcigpO1xuICAgICAgZ3JvdXBzLmZvckVhY2goKGcpID0+IHRoaXMucGFyYW1zRm9ybUFycmF5LnB1c2goZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcmFtc0Zvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoZ3JvdXBzKTtcbiAgICB9XG4gIH1cblxuICAvKiogVHJ1ZSBpZiBVUkwgaXMgYSBwYXJhbWV0ZXIgcGxhY2Vob2xkZXIgKGUuZy4gKnxwYXJhbXwpOyBtdXN0IG5vdCBiZSBwYXJzZWQgd2l0aCBVUkwoKSB3aGljaCBlbmNvZGVzIHwgdG8gJTdDLiAqL1xuICBwcml2YXRlIHN0YXRpYyBpc1BhcmFtZXRlclVybCh1cmxTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdXJsU3RyIHx8IHR5cGVvZiB1cmxTdHIgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIC8oXFwqXFx8W1xcdy1dK1xcfChcXCopP3xcXCRcXHxbXFx3LV0rXFx8KFxcKik/fEBcXHxbXFx3LV0rXFx8KFxcKik/fFxcJFxce1tefV0rXFx9KS8udGVzdCh1cmxTdHIudHJpbSgpKTtcbiAgfVxuXG4gIC8qKiBEZWNvZGUgVVJMIGZvciBkaXNwbGF5L3BheWxvYWQ6IHN0cmlwIC8qIHByZWZpeCBhbmQgZGVjb2RlICU3QyB0byB8IHNvICp8cGFyYW18IHNob3dzIGNvcnJlY3RseS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZGVjb2RlVXJsRm9yRGlzcGxheShyYXc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ3N0cmluZycpIHJldHVybiAnJztcbiAgICBsZXQgcyA9IHJhdy50cmltKCk7XG4gICAgaWYgKCFzKSByZXR1cm4gJyc7XG4gICAgaWYgKHMuc3RhcnRzV2l0aCgnLyonKSkgcyA9IHMuc2xpY2UoMikudHJpbSgpO1xuICAgIGlmIChzLmluY2x1ZGVzKCclN0MnKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcyA9IGRlY29kZVVSSUNvbXBvbmVudChzKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBsZWF2ZSBhcy1pcyAqL1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcztcbiAgfVxuXG4gIC8qKiBQYXJzZSBVUkwgaW50byBiYXNlICh3aXRob3V0IHF1ZXJ5L2ZyYWdtZW50KSBhbmQgcXVlcnkga2V5LXZhbHVlIHBhaXJzLiBQcmVzZXJ2ZXMgcmVsYXRpdmUgVVJMcyBhbmQgcGFyYW1ldGVyIHBsYWNlaG9sZGVycy4gKi9cbiAgcHJpdmF0ZSBwYXJzZVF1ZXJ5UGFyYW1zRnJvbVVybCh1cmxTdHI6IHN0cmluZyk6IHsgYmFzZVVybDogc3RyaW5nOyByb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB9IHtcbiAgICBjb25zdCB0cmltbWVkID0gdXJsU3RyPy50cmltKCkgPz8gJyc7XG4gICAgY29uc3QgZW1wdHkgPSB7IGJhc2VVcmw6IHRyaW1tZWQgfHwgdXJsU3RyLCByb3dzOiBbeyBrZXk6ICcnLCB2YWx1ZTogJycgfV0gfTtcbiAgICBpZiAoIXRyaW1tZWQpIHJldHVybiBlbXB0eTtcbiAgICBpZiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuaXNQYXJhbWV0ZXJVcmwodXJsU3RyKSkgcmV0dXJuIGVtcHR5O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpc0Fic29sdXRlID0gL15odHRwcz86XFwvXFwvL2kudGVzdCh0cmltbWVkKTtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodXJsU3RyLCAnaHR0cDovL2xvY2FsaG9zdCcpO1xuICAgICAgY29uc3QgYmFzZVVybCA9IGlzQWJzb2x1dGUgPyB1cmwub3JpZ2luICsgdXJsLnBhdGhuYW1lIDogdXJsLnBhdGhuYW1lO1xuICAgICAgY29uc3Qgcm93czogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICByb3dzLnB1c2goeyBrZXksIHZhbHVlIH0pO1xuICAgICAgfSk7XG4gICAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHJvd3MucHVzaCh7IGtleTogJycsIHZhbHVlOiAnJyB9KTtcbiAgICAgIHJldHVybiB7IGJhc2VVcmwsIHJvd3MgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBlbXB0eTtcbiAgICB9XG4gIH1cblxuICAvKiogR2V0IGJhc2UgVVJMICh3aXRob3V0IHF1ZXJ5L2ZyYWdtZW50KSBmb3IgYnVpbGRpbmcgVVJMIGZyb20gcGFyYW1zLiBQcmVzZXJ2ZXMgcmVsYXRpdmUgVVJMcyBhbmQgcGFyYW1ldGVyIHBsYWNlaG9sZGVycy4gKi9cbiAgcHJpdmF0ZSBnZXRCYXNlVXJsKHVybFN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXVybFN0ciB8fCAhdXJsU3RyLnRyaW0oKSkgcmV0dXJuIHVybFN0cjtcbiAgICBpZiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuaXNQYXJhbWV0ZXJVcmwodXJsU3RyKSkgcmV0dXJuIHVybFN0ci50cmltKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlzQWJzb2x1dGUgPSAvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KHVybFN0ci50cmltKCkpO1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh1cmxTdHIsICdodHRwOi8vbG9jYWxob3N0Jyk7XG4gICAgICByZXR1cm4gaXNBYnNvbHV0ZSA/IHVybC5vcmlnaW4gKyB1cmwucGF0aG5hbWUgOiB1cmwucGF0aG5hbWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdXJsU3RyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHBheWxvYWQgZm9ybWF0IGRyb3Bkb3duIHVzaW5nIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIGZpcnN0LCB0aGVuXG4gICAqIGZhbGwgYmFjayB0byBpbnNwZWN0aW5nIHRoZSBib2R5IGNvbnRlbnQgKEpTT04gYnJhY2VzLCBYTUwgdGFncywgSFRNTCBkb2N0eXBlKS5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlCb2R5Rm9ybWF0KGJvZHk6IHN0cmluZywgY29udGVudFR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1hdFZhbHVlcyA9IHRoaXMuZ2V0Rm9ybWF0VmFsdWVzKCk7XG4gICAgaWYgKCF0aGlzLnBheWxvYWRGb3JtYXRGb3JtIHx8IGZvcm1hdFZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBjdCA9IChjb250ZW50VHlwZSA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBzZXRGbXQgPSAoZm10OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChmb3JtYXRWYWx1ZXMuaW5jbHVkZXMoZm10KSkgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiBmbXQgfSk7XG4gICAgfTtcbiAgICAvLyBDb250ZW50LVR5cGUgdGFrZXMgcHJpb3JpdHlcbiAgICBpZiAoY3QuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSB8fCBjdC5pbmNsdWRlcygndGV4dC9qc29uJykpICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRGbXQoJ2pzb24nKTtcbiAgICBpZiAoY3QuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL3htbCcpIHx8IGN0LmluY2x1ZGVzKCd0ZXh0L3htbCcpIHx8IGN0LmluY2x1ZGVzKCd4aHRtbCcpKSByZXR1cm4gc2V0Rm10KCd4bWwnKTtcbiAgICBpZiAoY3QuaW5jbHVkZXMoJ3RleHQvaHRtbCcpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEZtdCgnaHRtbCcpO1xuICAgIGlmIChjdC5pbmNsdWRlcygndGV4dC9wbGFpbicpIHx8IGN0LmluY2x1ZGVzKCd0ZXh0L2NzdicpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRGbXQoJ3RleHQnKTtcbiAgICAvLyBGYWxsIGJhY2sgdG8gYm9keS1jb250ZW50IGluc3BlY3Rpb25cbiAgICBjb25zdCB0ID0gKGJvZHkgPz8gJycpLnRyaW0oKTtcbiAgICBpZiAoKHQuc3RhcnRzV2l0aCgneycpICYmIHQuZW5kc1dpdGgoJ30nKSkgfHwgKHQuc3RhcnRzV2l0aCgnWycpICYmIHQuZW5kc1dpdGgoJ10nKSkpICByZXR1cm4gc2V0Rm10KCdqc29uJyk7XG4gICAgaWYgKHQuc3RhcnRzV2l0aCgnPD94bWwnKSB8fCAodC5zdGFydHNXaXRoKCc8JykgJiYgIXQuc3RhcnRzV2l0aCgnPCEnKSAmJiAhdC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJzwhZG9jdHlwZScpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEZtdCgneG1sJyk7XG4gICAgaWYgKHQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCc8IWRvY3R5cGUgaHRtbCcpIHx8IHQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCc8aHRtbCcpKSByZXR1cm4gc2V0Rm10KCdodG1sJyk7XG4gIH1cblxuICAvKiogUGFyc2UgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIGJvZHkgKGtleT12YWx1ZSYuLi4pIGludG8ga2V5LXZhbHVlIHJvd3MuICovXG4gIHByaXZhdGUgcGFyc2VGb3JtVXJsRW5jb2RlZEJvZHkoYm9keTogc3RyaW5nKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IHRyaW1tZWQgPSAoYm9keSA/PyAnJykudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZCkgcmV0dXJuIFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHRyaW1tZWQpO1xuICAgICAgY29uc3Qgcm93czogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcbiAgICAgIHBhcmFtcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiByb3dzLnB1c2goeyBrZXksIHZhbHVlIH0pKTtcbiAgICAgIHJldHVybiByb3dzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBmb3JtIGJvZHkgaGFzIGEgc2luZ2xlIGtleSB3aG9zZSB2YWx1ZSBpcyBVUkwtZGVjb2RlZCBKU09OLCByZXR1cm4gaXQgcHJldHR5LXByaW50ZWQgZm9yIFJhdyBib2R5LlxuICAgKiBPdGhlcndpc2UgcmV0dXJuIG51bGwgKGNhbGxlciBrZWVwcyB4LXd3dy1mb3JtLXVybGVuY29kZWQgdmlldykuXG4gICAqL1xuICBwcml2YXRlIHRyeUZvcm1Cb2R5VmFsdWVBc1Jhd0pzb24ocm93czogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAocm93cy5sZW5ndGggIT09IDEgfHwgIXJvd3NbMF0udmFsdWU/LnRyaW0oKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdmFsdWUgPSByb3dzWzBdLnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoISh2YWx1ZS5zdGFydHNXaXRoKCd7JykgfHwgdmFsdWUuc3RhcnRzV2l0aCgnWycpKSkgcmV0dXJuIG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBhcnNlZCwgbnVsbCwgMik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogVXBkYXRlIFBhcmFtcyB0YWJsZSBmcm9tIGN1cnJlbnQgVVJMIHF1ZXJ5IHN0cmluZyAoUG9zdG1hbi1zdHlsZSkuICovXG4gIHByaXZhdGUgc3luY1BhcmFtc0Zyb21VcmwoKTogdm9pZCB7XG4gICAgY29uc3QgeyBiYXNlVXJsOiBfYiwgcm93cyB9ID0gdGhpcy5wYXJzZVF1ZXJ5UGFyYW1zRnJvbVVybCh0aGlzLl91cmwpO1xuICAgIHRoaXMuYnVpbGRQYXJhbXNGb3JtQXJyYXkocm93cyk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogVXBkYXRlIFVSTCBxdWVyeSBzdHJpbmcgZnJvbSBQYXJhbXMgdGFibGUgKFBvc3RtYW4tc3R5bGUpLiAqL1xuICBwcml2YXRlIHN5bmNVcmxGcm9tUGFyYW1zKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhcmFtc1N5bmNpbmdGcm9tVXJsIHx8ICF0aGlzLnBhcmFtc0Zvcm1BcnJheSkgcmV0dXJuO1xuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEJhc2VVcmwodGhpcy5fdXJsKTtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMucGFyYW1zRm9ybUFycmF5LmNvbnRyb2xzKSB7XG4gICAgICBjb25zdCBrZXkgPSAoKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2tleScpPy52YWx1ZSA/PyAnJykudHJpbSgpO1xuICAgICAgY29uc3QgdmFsdWUgPSAoYyBhcyBGb3JtR3JvdXApLmdldCgndmFsdWUnKT8udmFsdWUgPz8gJyc7XG4gICAgICBpZiAoa2V5ICE9PSAnJykgcGFyYW1zLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgICBjb25zdCBuZXdVcmwgPSBxdWVyeVN0cmluZyA/IGAke2Jhc2VVcmx9PyR7cXVlcnlTdHJpbmd9YCA6IGJhc2VVcmw7XG4gICAgaWYgKHRoaXMuX3VybCAhPT0gbmV3VXJsKSB7XG4gICAgICB0aGlzLl91cmwgPSBuZXdVcmw7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVmVyaWZpY2F0aW9uRm9ybUFycmF5KHJvd3M/OiB7IGpzb25QYXRoOiBzdHJpbmc7IHZlcmlmaWNhdGlvbjogc3RyaW5nOyBkYXRhVHlwZTogc3RyaW5nOyBleHBlY3RlZFZhbHVlOiBzdHJpbmcgfVtdKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdFZlcmlmaWNhdGlvbiA9IHRoaXMuZ2V0RGVmYXVsdFZlcmlmaWNhdGlvbigpO1xuICAgIGNvbnN0IGRlZmF1bHREYXRhVHlwZSA9IHRoaXMuZ2V0RGVmYXVsdERhdGFUeXBlKCk7XG4gICAgY29uc3QgaW5pdGlhbCA9IHJvd3MgPz8gW3sganNvblBhdGg6ICcnLCB2ZXJpZmljYXRpb246IGRlZmF1bHRWZXJpZmljYXRpb24sIGRhdGFUeXBlOiBkZWZhdWx0RGF0YVR5cGUsIGV4cGVjdGVkVmFsdWU6ICcnIH1dO1xuICAgIGNvbnN0IGdyb3VwcyA9IGluaXRpYWwubWFwKChyKSA9PlxuICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGpzb25QYXRoOiBbci5qc29uUGF0aF0sXG4gICAgICAgIHZlcmlmaWNhdGlvbjogW3IudmVyaWZpY2F0aW9uXSxcbiAgICAgICAgZGF0YVR5cGU6IFtyLmRhdGFUeXBlXSxcbiAgICAgICAgZXhwZWN0ZWRWYWx1ZTogW3IuZXhwZWN0ZWRWYWx1ZV0sXG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KGdyb3Vwcyk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5KHJvd3M/OiB7IHZlcmlmaWNhdGlvbjogc3RyaW5nOyBleHBlY3RlZFZhbHVlOiBzdHJpbmcgfVtdKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdFZlcmlmaWNhdGlvbiA9IHRoaXMuZ2V0RGVmYXVsdFN0YXR1c1ZlcmlmaWNhdGlvbigpO1xuICAgIGNvbnN0IGluaXRpYWwgPSByb3dzID8/IFt7IHZlcmlmaWNhdGlvbjogZGVmYXVsdFZlcmlmaWNhdGlvbiwgZXhwZWN0ZWRWYWx1ZTogJycgfV07XG4gICAgY29uc3QgZ3JvdXBzID0gaW5pdGlhbC5tYXAoKHIpID0+XG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgdmVyaWZpY2F0aW9uOiBbci52ZXJpZmljYXRpb25dLFxuICAgICAgICBleHBlY3RlZFZhbHVlOiBbci5leHBlY3RlZFZhbHVlXSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoZ3JvdXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRIZWFkZXJzRm9ybUFycmF5KHJvd3M6IEFwaUVkaXRIZWFkZXJSb3dbXSk6IHZvaWQge1xuICAgIGNvbnN0IGdyb3VwcyA9IHJvd3MubWFwKChoKSA9PlxuICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG5hbWU6IFtoLm5hbWVdLFxuICAgICAgICB2YWx1ZTogW2gudmFsdWVdLFxuICAgICAgfSlcbiAgICApO1xuICAgIGlmICh0aGlzLmhlYWRlcnNGb3JtQXJyYXkpIHtcbiAgICAgIHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5jbGVhcigpO1xuICAgICAgZ3JvdXBzLmZvckVhY2goKGcpID0+IHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5wdXNoKGcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWFkZXJzRm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShncm91cHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZXNldCBhbGwgdGhyZWUgc3RlcHMgYW5kIGFsbCBlbnRlcmVkIGRhdGEgdG8gaW5pdGlhbC9kZWZhdWx0IHN0YXRlLiBVc2VkIHdoZW4gdXNlciBjYW5jZWxzIG9uIHN0ZXAgMS4gKi9cbiAgcHJpdmF0ZSByZXNldEFsbFN0ZXBzQW5kRGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRTdGVwID0gMTtcblxuICAgIGNvbnN0IGZpcnN0TWV0aG9kVmFsdWUgPSB0aGlzLmh0dHBNZXRob2RPcHRpb25zPy5sZW5ndGhcbiAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5odHRwTWV0aG9kT3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRNZXRob2QgPSB0aGlzLmluaXRpYWxNZXRob2QgPz8gZmlyc3RNZXRob2RWYWx1ZSA/PyAnR0VUJztcbiAgICBjb25zdCBtZXRob2RWYWwgPSB0eXBlb2YgZGVmYXVsdE1ldGhvZCA9PT0gJ3N0cmluZycgPyBkZWZhdWx0TWV0aG9kIDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGRlZmF1bHRNZXRob2QgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpO1xuICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gbWV0aG9kVmFsID8/ICcnO1xuICAgIGlmICh0aGlzLm1ldGhvZEZvcm0pIHRoaXMubWV0aG9kRm9ybS5wYXRjaFZhbHVlKHsgbWV0aG9kOiBkZWZhdWx0TWV0aG9kIH0pO1xuXG4gICAgY29uc3QgZmlyc3RFbnZWYWx1ZSA9IHRoaXMuZW52aXJvbm1lbnRPcHRpb25zPy5sZW5ndGhcbiAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5lbnZpcm9ubWVudE9wdGlvbnNbMF0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZWZhdWx0RW52ID0gdGhpcy5pbml0aWFsRW52aXJvbm1lbnQgPz8gZmlyc3RFbnZWYWx1ZSA/PyAnRGV2ZWxvcG1lbnQnO1xuICAgIGNvbnN0IGVudlZhbCA9IHR5cGVvZiBkZWZhdWx0RW52ID09PSAnc3RyaW5nJyA/IGRlZmF1bHRFbnYgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdEVudiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9IGVudlZhbCA/PyAnJztcbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudEZvcm0pIHRoaXMuZW52aXJvbm1lbnRGb3JtLnBhdGNoVmFsdWUoeyBlbnZpcm9ubWVudDogZGVmYXVsdEVudiB9KTtcblxuICAgIHRoaXMudXJsID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZGVjb2RlVXJsRm9yRGlzcGxheSh0aGlzLmluaXRpYWxVcmwgPz8gJycpIHx8ICcnO1xuICAgIHRoaXMuYnVpbGRIZWFkZXJzRm9ybUFycmF5KHRoaXMuaW5pdGlhbEhlYWRlcnMgPz8gW3sgbmFtZTogJycsIHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogJycgfV0pO1xuICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMuaGVhZGVyc0NoYW5nZS5lbWl0KHRoaXMuaGVhZGVycyk7XG5cbiAgICB0aGlzLmJvZHlWaWV3ID0gJ2hlYWRlcnMnO1xuICAgIHRoaXMuYWN0aXZlUGF5bG9hZFRhYiA9ICdoZWFkZXJzJztcbiAgICB0aGlzLnBheWxvYWRUeXBlID0gJ3Jhdyc7XG4gICAgdGhpcy5wYXlsb2FkVGV4dCA9ICcnO1xuICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgY29uc3QgZGVmYXVsdEZvcm1hdCA9IHRoaXMuaW5pdGlhbEZvcm1hdCA/PyB0aGlzLmdldEZvcm1hdFZhbHVlcygpWzBdID8/ICdqc29uJztcbiAgICBpZiAodGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSkgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiBkZWZhdWx0Rm9ybWF0IH0pO1xuICAgIHRoaXMuYnVpbGRLZXlWYWx1ZUZvcm1BcnJheSgpO1xuICAgIHRoaXMuYnVpbGRLZXlUeXBlVmFsdWVGb3JtQXJyYXkoKTtcbiAgICB0aGlzLmJ1aWxkUGFyYW1zRm9ybUFycmF5KCk7XG4gICAgdGhpcy5pbXBvcnRDdXJsQ29udHJvbC5zZXRWYWx1ZSgnJyk7XG5cbiAgICB0aGlzLnZhcmlhYmxlTmFtZSA9ICcnO1xuICAgIHRoaXMudmFyaWFibGVOYW1lRXJyb3IgPSAnJztcblxuICAgIHRoaXMuYnVpbGRWZXJpZmljYXRpb25Gb3JtQXJyYXkoKTtcbiAgICB0aGlzLmJ1aWxkU3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5KCk7XG4gICAgdGhpcy5hY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9ICdyZXNwb25zZS1ib2R5JztcblxuICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVyOiBzaG93IGltcG9ydCBjVVJMIHBhbmVsIChjYWxsZWQgd2hlbiB1c2VyIGNsaWNrcyBcIkltcG9ydCBBUEkgY1VSTFwiKS4gUmVzZXRzIHRleHRhcmVhIHNvIGl0IGlzIGNsZWFyZWQgZWFjaCB0aW1lLiAqL1xuICBvcGVuSW1wb3J0Q3VybFBhbmVsKCk6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0Q3VybENvbnRyb2wuc2V0VmFsdWUoJycpO1xuICAgIHRoaXMuYm9keVZpZXcgPSAnaW1wb3J0LWN1cmwnO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBSZXNldCBVUkwsIG1ldGhvZCwgaGVhZGVycywgYm9keSwgYW5kIHBhcmFtcyB0byBlbXB0eS9kZWZhdWx0IGJlZm9yZSBhcHBseWluZyBpbXBvcnRlZCBjVVJMLiAqL1xuICBwcml2YXRlIHJlc2V0UmVxdWVzdEZpZWxkc0JlZm9yZUN1cmxJbXBvcnQoKTogdm9pZCB7XG4gICAgY29uc3QgZmlyc3RNZXRob2RWYWx1ZSA9IHRoaXMuaHR0cE1ldGhvZE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmh0dHBNZXRob2RPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVmYXVsdE1ldGhvZCA9IHRoaXMuaW5pdGlhbE1ldGhvZCA/PyBmaXJzdE1ldGhvZFZhbHVlID8/ICdHRVQnO1xuICAgIHRoaXMuc2VsZWN0ZWRNZXRob2QgPSB0eXBlb2YgZGVmYXVsdE1ldGhvZCA9PT0gJ3N0cmluZycgPyBkZWZhdWx0TWV0aG9kIDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGRlZmF1bHRNZXRob2QgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpID8/ICdHRVQnO1xuICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gdGhpcy5zZWxlY3RlZE1ldGhvZDtcbiAgICBpZiAodGhpcy5tZXRob2RGb3JtKSB0aGlzLm1ldGhvZEZvcm0ucGF0Y2hWYWx1ZSh7IG1ldGhvZDogZGVmYXVsdE1ldGhvZCB9KTtcblxuICAgIHRoaXMudXJsID0gJyc7XG5cbiAgICAvLyBSZXNldCBhdXRoIHNvIGEgcHJldmlvdXMgQmVhcmVyIHRva2VuIGRvZXNuJ3QgcGVyc2lzdCB3aGVuIHJlLWltcG9ydGluZ1xuICAgIGNvbnN0IGZpcnN0QXV0aFZhbHVlID0gdGhpcy5nZXRBdXRoVHlwZVZhbHVlcygpWzBdID8/ICduby1hdXRoJztcbiAgICBpZiAodGhpcy5hdXRoVHlwZUZvcm0pIHRoaXMuYXV0aFR5cGVGb3JtLnBhdGNoVmFsdWUoeyBhdXRoVHlwZTogZmlyc3RBdXRoVmFsdWUgfSk7XG4gICAgdGhpcy5iZWFyZXJUb2tlbiA9ICcnO1xuXG4gICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkoW3sgbmFtZTogJycsIHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogJycgfV0pO1xuICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMuaGVhZGVyc0NoYW5nZS5lbWl0KHRoaXMuaGVhZGVycyk7XG5cbiAgICB0aGlzLnBheWxvYWRUeXBlID0gJ3Jhdyc7XG4gICAgdGhpcy5wYXlsb2FkVGV4dCA9ICcnO1xuICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgY29uc3QgZGVmYXVsdEZvcm1hdCA9IHRoaXMuaW5pdGlhbEZvcm1hdCA/PyB0aGlzLmdldEZvcm1hdFZhbHVlcygpWzBdID8/ICdqc29uJztcbiAgICBpZiAodGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSkgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiBkZWZhdWx0Rm9ybWF0IH0pO1xuICAgIHRoaXMuYnVpbGRLZXlWYWx1ZUZvcm1BcnJheShbeyBrZXk6ICcnLCB2YWx1ZTogJycgfV0pO1xuICAgIHRoaXMuYnVpbGRLZXlUeXBlVmFsdWVGb3JtQXJyYXkoW3sga2V5OiAnJywgdHlwZTogJ3RleHQnLCB2YWx1ZTogJycgfV0pO1xuICAgIHRoaXMuYnVpbGRQYXJhbXNGb3JtQXJyYXkoW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dKTtcblxuICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVyOiBwYXJzZSBjVVJMIGZyb20gY29udHJvbCwgYmluZCB0byBmb3JtIGZpZWxkcywgZW1pdCBhbmQgY2xvc2UgcGFuZWwuICovXG4gIG9uSW1wb3J0Q3VybENvbmZpcm0oKTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmltcG9ydEN1cmxDb250cm9sLnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGN1cmxTdHIgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiAnJztcbiAgICB0aGlzLmltcG9ydEN1cmwuZW1pdChjdXJsU3RyKTtcblxuICAgIHRoaXMucmVzZXRSZXF1ZXN0RmllbGRzQmVmb3JlQ3VybEltcG9ydCgpO1xuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VDdXJsKGN1cmxTdHIpO1xuICAgIGlmIChwYXJzZWQpIHtcbiAgICAgIC8vIOKUgOKUgCBNZXRob2Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICBjb25zdCBtZXRob2RWYWx1ZSA9IHBhcnNlZC5tZXRob2QgJiYgdGhpcy5nZXRNZXRob2RWYWx1ZXMoKS5pbmNsdWRlcyhwYXJzZWQubWV0aG9kKVxuICAgICAgICA/IHBhcnNlZC5tZXRob2RcbiAgICAgICAgOiBwYXJzZWQubWV0aG9kIHx8ICdHRVQnO1xuICAgICAgdGhpcy5zZWxlY3RlZE1ldGhvZCA9IG1ldGhvZFZhbHVlO1xuICAgICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSBtZXRob2RWYWx1ZTtcblxuICAgICAgLy8g4pSA4pSAIFVSTCAoYWxzbyBzeW5jcyBQYXJhbXMgdGFiIGZyb20gcXVlcnkgc3RyaW5nKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgIGlmIChwYXJzZWQudXJsKSB0aGlzLnVybCA9IHBhcnNlZC51cmw7XG5cbiAgICAgIC8vIOKUgOKUgCBBdXRob3JpemF0aW9uIGhlYWRlciDihpIgQmVhcmVyIFRva2VuIC8gYXV0aCB0eXBlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgbGV0IGhlYWRlclJvd3M6IEFwaUVkaXRIZWFkZXJSb3dbXSA9IHBhcnNlZC5oZWFkZXJzO1xuICAgICAgY29uc3QgYXV0aEhlYWRlciA9IGhlYWRlclJvd3MuZmluZChoID0+IGgubmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYXV0aG9yaXphdGlvbicpO1xuICAgICAgaWYgKGF1dGhIZWFkZXI/LnZhbHVlPy50cmltKCkpIHtcbiAgICAgICAgY29uc3QgYmVhcmVyTWF0Y2ggPSAvXkJlYXJlclxccysoLispJC9pLmV4ZWMoYXV0aEhlYWRlci52YWx1ZS50cmltKCkpO1xuICAgICAgICBpZiAoYmVhcmVyTWF0Y2gpIHtcbiAgICAgICAgICBjb25zdCB0b2tlbiA9IGJlYXJlck1hdGNoWzFdLnRyaW0oKTtcbiAgICAgICAgICBpZiAodGhpcy5nZXRBdXRoVHlwZVZhbHVlcygpLmluY2x1ZGVzKCdiZWFyZXInKSAmJiB0aGlzLmF1dGhUeXBlRm9ybSkge1xuICAgICAgICAgICAgdGhpcy5hdXRoVHlwZUZvcm0ucGF0Y2hWYWx1ZSh7IGF1dGhUeXBlOiAnYmVhcmVyJyB9KTtcbiAgICAgICAgICAgIHRoaXMuYmVhcmVyVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUmVtb3ZlIEF1dGhvcml6YXRpb24gZnJvbSBoZWFkZXJzIHRhYmxlIChpdCBsaXZlcyBpbiB0aGUgQXV0aCB0YWIpXG4gICAgICAgICAgaGVhZGVyUm93cyA9IGhlYWRlclJvd3MuZmlsdGVyKGggPT4gaC5uYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdhdXRob3JpemF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSAIEhlYWRlcnMgdGFibGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICBoZWFkZXJSb3dzID0gaGVhZGVyUm93cy5sZW5ndGggPiAwID8gaGVhZGVyUm93cyA6IFt7IG5hbWU6ICcnLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6ICcnIH1dO1xuICAgICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkoaGVhZGVyUm93cyk7XG4gICAgICB0aGlzLnVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTtcbiAgICAgIHRoaXMuaGVhZGVyc0NoYW5nZS5lbWl0KHRoaXMuaGVhZGVycyk7XG5cbiAgICAgIC8vIOKUgOKUgCBEZXRlcm1pbmUgQ29udGVudC1UeXBlIGZvciBib2R5L2Zvcm1hdCBkZWNpc2lvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICBjb25zdCBjb250ZW50VHlwZSA9IHBhcnNlZC5oZWFkZXJzXG4gICAgICAgIC5maW5kKGggPT4gaC5uYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnKVxuICAgICAgICA/LnZhbHVlPy50b0xvd2VyQ2FzZSgpID8/ICcnO1xuXG4gICAgICAvLyDilIDilIAgQm9keSAvIEZvcm0tZGF0YSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgIGxldCB0YWJUb0FjdGl2YXRlOiBBcGlFZGl0UGF5bG9hZFRhYiA9ICdoZWFkZXJzJztcblxuICAgICAgaWYgKHBhcnNlZC5mb3JtRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIE11bHRpcGFydCBmb3JtLWRhdGEgKC1GIC8gLS1mb3JtIGVudHJpZXMpXG4gICAgICAgIHRoaXMucGF5bG9hZFR5cGUgPSAnZm9ybS1kYXRhJztcbiAgICAgICAgdGhpcy5idWlsZEtleVR5cGVWYWx1ZUZvcm1BcnJheShcbiAgICAgICAgICBwYXJzZWQuZm9ybURhdGEubWFwKGUgPT4gKHsga2V5OiBlLmtleSwgdHlwZTogZS50eXBlLCB2YWx1ZTogZS52YWx1ZSB9KSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5wYXlsb2FkVGV4dCA9ICcnO1xuICAgICAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgICAgICB0YWJUb0FjdGl2YXRlID0gJ2JvZHknO1xuXG4gICAgICB9IGVsc2UgaWYgKHBhcnNlZC5ib2R5KSB7XG4gICAgICAgIGNvbnN0IGlzRm9ybVVybEVuY29kZWQgPSBjb250ZW50VHlwZS5pbmNsdWRlcygnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG5cbiAgICAgICAgaWYgKGlzRm9ybVVybEVuY29kZWQpIHtcbiAgICAgICAgICBjb25zdCByb3dzID0gdGhpcy5wYXJzZUZvcm1VcmxFbmNvZGVkQm9keShwYXJzZWQuYm9keSk7XG4gICAgICAgICAgdGhpcy5idWlsZEtleVZhbHVlRm9ybUFycmF5KHJvd3MubGVuZ3RoID4gMCA/IHJvd3MgOiBbeyBrZXk6ICcnLCB2YWx1ZTogJycgfV0pO1xuICAgICAgICAgIGNvbnN0IGRlY29kZWRBc0pzb24gPSB0aGlzLnRyeUZvcm1Cb2R5VmFsdWVBc1Jhd0pzb24ocm93cyk7XG4gICAgICAgICAgaWYgKGRlY29kZWRBc0pzb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5wYXlsb2FkVHlwZSA9ICdyYXcnO1xuICAgICAgICAgICAgdGhpcy5wYXlsb2FkVGV4dCA9IGRlY29kZWRBc0pzb247XG4gICAgICAgICAgICBpZiAodGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSkgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiAnanNvbicgfSk7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZFR5cGUgPSAneC13d3ctZm9ybS11cmxlbmNvZGVkJztcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZFRleHQgPSAnJztcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucGF5bG9hZFRleHQgPSBwYXJzZWQuYm9keTtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICAgICAgICB0aGlzLmFwcGx5Qm9keUZvcm1hdChwYXJzZWQuYm9keSwgY29udGVudFR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHRhYlRvQWN0aXZhdGUgPSAnYm9keSc7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBBdXRvLXN3aXRjaCB0byB0aGUgbW9zdCByZWxldmFudCB0YWIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICBpZiAodGFiVG9BY3RpdmF0ZSA9PT0gJ2JvZHknKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlUGF5bG9hZFRhYiA9ICdib2R5JztcbiAgICAgIH0gZWxzZSBpZiAoYXV0aEhlYWRlcj8udmFsdWU/LnRyaW0oKSkge1xuICAgICAgICB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgPSAnYXV0aG9yaXphdGlvbic7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlSW1wb3J0Q3VybFBhbmVsKCk7XG4gIH1cblxuICAvKiogSGFuZGxlcjogZW1pdCBjYW5jZWwgYW5kIGNsb3NlIHBhbmVsLiBDYWxsZWQgd2hlbiB1c2VyIGNsaWNrcyBDYW5jZWwgaW4gaW1wb3J0IGNVUkwgcGFuZWwuICovXG4gIG9uQ2FuY2VsSW1wb3J0Q3VybCgpOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydEN1cmxDYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMuY2xvc2VJbXBvcnRDdXJsUGFuZWwoKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVyOiBzaG93IGhlYWRlcnMgc2VjdGlvbiAoY2FsbGVkIGZyb20gQ2FuY2VsIG9yIGFmdGVyIEltcG9ydCBpbiBpbXBvcnQgcGFuZWwpLiAqL1xuICBjbG9zZUltcG9ydEN1cmxQYW5lbCgpOiB2b2lkIHtcbiAgICB0aGlzLmJvZHlWaWV3ID0gJ2hlYWRlcnMnO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBVUkw6IG11c3QgYmUgcmVxdWlyZWQgYW5kIG1hdGNoIGh0dHAvaHR0cHMgcGF0dGVyblxuICAgKiBBbHNvIGFsbG93cyBwYXJhbWV0ZXIgcGxhY2Vob2xkZXJzIGxpa2UgQHxwYXJhbU5hbWV8XG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVXJsKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVybFZhbHVlID0gdGhpcy51cmw/LnRyaW0oKSB8fCAnJztcbiAgICBcbiAgICAvLyBDaGVjayBpZiBVUkwgaXMgZW1wdHlcbiAgICBpZiAoIXVybFZhbHVlKSB7XG4gICAgICB0aGlzLnVybEVycm9yID0gJ1VSTCBpcyByZXF1aXJlZCc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBwYXJhbWV0ZXIgcGxhY2Vob2xkZXIgKGZvcm1hdDogQHxwYXJhbU5hbWV8KVxuICAgIGNvbnN0IGlzUGFyYW1ldGVyUGxhY2Vob2xkZXIgPSAvXkBcXHxbXnxdK1xcfCQvLnRlc3QodXJsVmFsdWUpO1xuICAgIGlmIChpc1BhcmFtZXRlclBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLnVybEVycm9yID0gJyc7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgVVJMIG1hdGNoZXMgaHR0cCBvciBodHRwcyBwYXR0ZXJuXG4gICAgY29uc3QgdXJsUGF0dGVybiA9IC9eaHR0cHM/OlxcL1xcLy4rL2k7XG4gICAgaWYgKCF1cmxQYXR0ZXJuLnRlc3QodXJsVmFsdWUpKSB7XG4gICAgICB0aGlzLnVybEVycm9yID0gJ1VSTCBtdXN0IHN0YXJ0IHdpdGggaHR0cDovLyBvciBodHRwczovLyc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZGl0aW9uYWwgdmFsaWRhdGlvbjogdHJ5IHRvIGNyZWF0ZSBVUkwgb2JqZWN0IHRvIGVuc3VyZSBpdCdzIHZhbGlkXG4gICAgdHJ5IHtcbiAgICAgIG5ldyBVUkwodXJsVmFsdWUpO1xuICAgICAgdGhpcy51cmxFcnJvciA9ICcnO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnVybEVycm9yID0gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIFVSTCc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIFVSTCBpcyB2YWxpZCAoZm9yIGJ1dHRvbiBkaXNhYmxlZCBzdGF0ZSlcbiAgICovXG4gIGdldCBpc1VybFZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVybFZhbHVlID0gdGhpcy51cmw/LnRyaW0oKSB8fCAnJztcbiAgICBcbiAgICAvLyBFbXB0eSBVUkwgaXMgaW52YWxpZFxuICAgIGlmICghdXJsVmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gUGFyYW1ldGVyIHBsYWNlaG9sZGVyIGlzIHZhbGlkXG4gICAgY29uc3QgaXNQYXJhbWV0ZXJQbGFjZWhvbGRlciA9IC9eQFxcfFtefF0rXFx8JC8udGVzdCh1cmxWYWx1ZSk7XG4gICAgaWYgKGlzUGFyYW1ldGVyUGxhY2Vob2xkZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBNdXN0IG1hdGNoIGh0dHAvaHR0cHMgcGF0dGVyblxuICAgIGNvbnN0IHVybFBhdHRlcm4gPSAvXmh0dHBzPzpcXC9cXC8uKy9pO1xuICAgIGlmICghdXJsUGF0dGVybi50ZXN0KHVybFZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBUcnkgdG8gY3JlYXRlIFVSTCBvYmplY3QgdG8gZW5zdXJlIGl0J3MgdmFsaWRcbiAgICB0cnkge1xuICAgICAgbmV3IFVSTCh1cmxWYWx1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBvblNlbmRSZXF1ZXN0KCk6IHZvaWQge1xuICAgIC8vIFZhbGlkYXRlIFVSTCBiZWZvcmUgc2VuZGluZyByZXF1ZXN0XG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlVXJsKCkpIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudCAhPSBudWxsID8gU3RyaW5nKHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudCkgOiAnJztcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLnNlbGVjdGVkTWV0aG9kICE9IG51bGwgPyBTdHJpbmcodGhpcy5zZWxlY3RlZE1ldGhvZCkgOiAnJztcbiAgICB0aGlzLnNlbmRSZXF1ZXN0LmVtaXQoe1xuICAgICAgZW52aXJvbm1lbnQsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmw6IHRoaXMudXJsID8/ICcnLFxuICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgb25WYXJpYWJsZU5hbWVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICB9XG5cbiAgb25CYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID4gMSkge1xuICAgICAgdGhpcy5zZXRTdGVwKHRoaXMuY3VycmVudFN0ZXAgLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXNldEFsbFN0ZXBzQW5kRGF0YSgpO1xuICAgICAgdGhpcy5iYWNrLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBjbGlja3MgdGhlIENhbmNlbCBidXR0b24gKHN0ZXAgMSkuIEVtaXRzIGNhbmNlbCB0aGVuIHJ1bnMgbm9ybWFsIGJhY2sgZmxvdy4gKi9cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMub25CYWNrKCk7XG4gIH1cblxuICBvbk5leHQoKTogdm9pZCB7XG4gICAgLy8gVmFsaWRhdGUgVVJMIG9uIHN0ZXAgMVxuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID09PSAxKSB7XG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVVcmwoKSkge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBWYWxpZGF0ZSB2YXJpYWJsZSBuYW1lIG9uIHN0ZXAgMlxuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID09PSAyICYmICF0aGlzLnZhcmlhYmxlTmFtZT8udHJpbSgpKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZUVycm9yID0gJ1ZhcmlhYmxlIE5hbWUgaXMgcmVxdWlyZWQuJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwIDwgdGhpcy5zdGVwTGFiZWxzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zZXRTdGVwKHRoaXMuY3VycmVudFN0ZXAgKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uZXh0LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBzZXRQYXlsb2FkVGFiKHZhbHVlOiBBcGlFZGl0UGF5bG9hZFRhYik6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlUGF5bG9hZFRhYiA9IHZhbHVlO1xuICB9XG5cbiAgc2V0UmVzcG9uc2VWZXJpZmljYXRpb25UYWIodmFsdWU6ICdyZXNwb25zZS1ib2R5JyB8ICdzdGF0dXMnKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9IHZhbHVlO1xuICB9XG5cbiAgYWRkSGVhZGVyKCk6IHZvaWQge1xuICAgIHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5wdXNoKFxuICAgICAgdGhpcy5mYi5ncm91cCh7IG5hbWU6IFsnJ10sIHZhbHVlOiBbJyddIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZUhlYWRlcihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5oZWFkZXJzRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIC8qKiBXaGVuIHVzZXIgYWRkcyBhIGN1c3RvbSBoZWFkZXIgbmFtZSB2aWEgdGhlIGRyb3Bkb3duIFwiQWRkICfigKYnXCIgb3B0aW9uLCBzZXQgdGhlIGNvbnRyb2wgdmFsdWUuICovXG4gIG9uSGVhZGVyTmFtZUFkZEN1c3RvbVZhbHVlKGV2ZW50OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0sIHJvdzogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbCA9IHJvdy5nZXQoZXZlbnQua2V5KTtcbiAgICBpZiAoY29udHJvbCAmJiBldmVudC52YWx1ZSAhPSBudWxsKSB7XG4gICAgICBjb250cm9sLnNldFZhbHVlKGV2ZW50LnZhbHVlLnRyaW0oKSk7XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeUhlYWRlcihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBhZGRLZXlWYWx1ZVJvdygpOiB2b2lkIHtcbiAgICB0aGlzLmtleVZhbHVlRm9ybUFycmF5LnB1c2godGhpcy5mYi5ncm91cCh7IGtleTogWycnXSwgdmFsdWU6IFsnJ10gfSkpO1xuICB9XG5cbiAgcmVtb3ZlS2V5VmFsdWVSb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMua2V5VmFsdWVGb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgdHJhY2tCeUtleVZhbHVlKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGFkZEtleVR5cGVWYWx1ZVJvdygpOiB2b2lkIHtcbiAgICB0aGlzLmtleVR5cGVWYWx1ZUZvcm1BcnJheS5wdXNoKHRoaXMuZmIuZ3JvdXAoeyBrZXk6IFsnJ10sIHR5cGU6IFsndGV4dCddLCB2YWx1ZTogWycnXSB9KSk7XG4gIH1cblxuICByZW1vdmVLZXlUeXBlVmFsdWVSb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMua2V5VHlwZVZhbHVlRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIHRyYWNrQnlLZXlUeXBlVmFsdWUoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgYWRkUGFyYW1zUm93KCk6IHZvaWQge1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5LnB1c2godGhpcy5mYi5ncm91cCh7IGtleTogWycnXSwgdmFsdWU6IFsnJ10gfSkpO1xuICB9XG5cbiAgcmVtb3ZlUGFyYW1zUm93KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmFtc0Zvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gIH1cblxuICB0cmFja0J5UGFyYW1zKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGFkZFZlcmlmaWNhdGlvblJvdygpOiB2b2lkIHtcbiAgICB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheS5wdXNoKFxuICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGpzb25QYXRoOiBbJyddLFxuICAgICAgICB2ZXJpZmljYXRpb246IFt0aGlzLmdldERlZmF1bHRWZXJpZmljYXRpb24oKV0sXG4gICAgICAgIGRhdGFUeXBlOiBbdGhpcy5nZXREZWZhdWx0RGF0YVR5cGUoKV0sXG4gICAgICAgIGV4cGVjdGVkVmFsdWU6IFsnJ10sXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICByZW1vdmVWZXJpZmljYXRpb25Sb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIHRyYWNrQnlWZXJpZmljYXRpb24oaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqIFdoZW4gRGF0YSBUeXBlIGNoYW5nZXMgaW4gUmVzcG9uc2UgQm9keSB2ZXJpZmljYXRpb24sIHJlc2V0IEV4cGVjdGVkIFZhbHVlIGZvciB0aGF0IHJvdy4gKi9cbiAgb25WZXJpZmljYXRpb25EYXRhVHlwZUNoYW5nZShyb3c6IEZvcm1Hcm91cCwgZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnZGF0YVR5cGUnKSB7XG4gICAgICByb3cuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgYWRkU3RhdHVzVmVyaWZpY2F0aW9uUm93KCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5LnB1c2goXG4gICAgICB0aGlzLmZiLmdyb3VwKHsgdmVyaWZpY2F0aW9uOiBbdGhpcy5nZXREZWZhdWx0U3RhdHVzVmVyaWZpY2F0aW9uKCldLCBleHBlY3RlZFZhbHVlOiBbJyddIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZVN0YXR1c1ZlcmlmaWNhdGlvblJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgdHJhY2tCeVN0YXR1c1ZlcmlmaWNhdGlvbihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgcmVhY3RpdmUgZm9ybSBmb3IgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEFkdmFuY2VkVmFyaWFibGVzRm9ybSgpOiB2b2lkIHtcbiAgICB3aGlsZSAodGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5yZW1vdmVBdCgwKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPVxuICAgICAgICB2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIHZhcmlhYmxlLnZhbHVlID09PSAnYm9vbGVhbidcbiAgICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcblxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiBbZGVmYXVsdFZhbHVlXSxcbiAgICAgICAgdHlwZTogW3ZhcmlhYmxlLnR5cGUgfHwgJ3N0cmluZyddLFxuICAgICAgICBsYWJlbDogW3ZhcmlhYmxlLmxhYmVsIHx8ICcnXVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnB1c2godmFyaWFibGVHcm91cCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGFkdmFuY2VkIGJvb2xlYW4gY2hhbmdlcyBhbmQga2VlcCBib3RoIGRhdGEgYW5kIGZvcm0gaW4gc3luYy5cbiAgICovXG4gIG9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5hdCh2YXJpYWJsZUluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBub24tYm9vbGVhbiBhZHZhbmNlZCB2YWx1ZXMgKGtlcHQgZm9yIEFQSSBjb21wYXRpYmlsaXR5OyBjdXJyZW50bHkgdW51c2VkKS5cbiAgICovXG4gIG9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5hdCh2YXJpYWJsZUluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEVtaXQgYWxsIGVudGVyZWQgZGV0YWlscyAoZW52aXJvbm1lbnQsIEhUVFAgbWV0aG9kLCBVUkwsIGhlYWRlcnMsIGJvZHksIHN0ZXAyIHZhcmlhYmxlLCBzdGVwMyB2ZXJpZmljYXRpb25zKSB3aGVuIHVzZXIgY2xpY2tzIENyZWF0ZS4gKi9cbiAgb25DcmVhdGUoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJzk5OTk5OTknKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuZ2V0Q3JlYXRlUGF5bG9hZCgpO1xuICAgICAgY29uc29sZS5sb2coJzk5OTk5OTkgcGF5bG9hZCcsIHBheWxvYWQpO1xuICAgICAgdGhpcy5jcmVhdGUuZW1pdChwYXlsb2FkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0FwaUVkaXRTdGVwIGdldENyZWF0ZVBheWxvYWQgZXJyb3I6JywgZXJyKTtcbiAgICAgIHRoaXMuY3JlYXRlLmVtaXQodGhpcy5nZXRDcmVhdGVQYXlsb2FkRmFsbGJhY2soKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIE1pbmltYWwgcGF5bG9hZCB3aGVuIGdldENyZWF0ZVBheWxvYWQgdGhyb3dzIChzbyBjcmVhdGUgYWx3YXlzIGVtaXRzKS4gKi9cbiAgcHJpdmF0ZSBnZXRDcmVhdGVQYXlsb2FkRmFsbGJhY2soKTogQXBpRWRpdENyZWF0ZVBheWxvYWQge1xuICAgIGNvbnN0IGF1dGhUeXBlID0gdGhpcy5zZWxlY3RlZEF1dGhUeXBlO1xuICAgIGNvbnN0IGJlYXJlclRva2VuID0gYXV0aFR5cGUgPT09ICdiZWFyZXInID8gKHRoaXMuYmVhcmVyVG9rZW4gPz8gJycpIDogdW5kZWZpbmVkO1xuICAgIGxldCBvYXV0aDI6IEFwaUVkaXRPQXV0aDJQYXlsb2FkIHwgdW5kZWZpbmVkO1xuICAgIGlmIChhdXRoVHlwZSA9PT0gJ29hdXRoMicgJiYgdGhpcy5vYXV0aDJGb3JtKSB7XG4gICAgICBjb25zdCBncmFudFR5cGUgPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRDb250cm9sVmFsdWUodGhpcy5vYXV0aDJGb3JtLmdldCgnZ3JhbnRUeXBlJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgICBjb25zdCBjbGllbnRBdXRoID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0Q29udHJvbFZhbHVlKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2NsaWVudEF1dGhlbnRpY2F0aW9uJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgICBvYXV0aDIgPSB7XG4gICAgICAgIGdyYW50VHlwZTogZ3JhbnRUeXBlICE9PSAnJyA/IGdyYW50VHlwZSA6ICdjbGllbnRfY3JlZGVudGlhbHMnLFxuICAgICAgICBhY2Nlc3NUb2tlblVybDogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2FjY2Vzc1Rva2VuVXJsJyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIGNsaWVudElkOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50SWQnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50U2VjcmV0OiAodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50U2VjcmV0Jyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIHNjb3BlOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnc2NvcGUnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50QXV0aGVudGljYXRpb246IGNsaWVudEF1dGggIT09ICcnID8gY2xpZW50QXV0aCA6ICdiYXNpYycsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RlcDE6IHtcbiAgICAgICAgZW52aXJvbm1lbnQ6ICcnLFxuICAgICAgICBtZXRob2Q6ICcnLFxuICAgICAgICB1cmw6IHRoaXMudXJsID8/ICcnLFxuICAgICAgICBoZWFkZXJzOiBbXSxcbiAgICAgICAgYXV0aFR5cGUsXG4gICAgICAgIC4uLihiZWFyZXJUb2tlbiAhPT0gdW5kZWZpbmVkICYmIHsgYmVhcmVyVG9rZW4gfSksXG4gICAgICAgIC4uLihvYXV0aDIgIT09IHVuZGVmaW5lZCAmJiB7IG9hdXRoMiB9KSxcbiAgICAgICAgYWN0aXZlUGF5bG9hZFRhYjogdGhpcy5hY3RpdmVQYXlsb2FkVGFiLFxuICAgICAgICBwYXlsb2FkVHlwZTogdGhpcy5wYXlsb2FkVHlwZSxcbiAgICAgICAgcGF5bG9hZEZvcm1hdDogJycsXG4gICAgICAgIHBheWxvYWRUZXh0OiB0aGlzLnBheWxvYWRUZXh0ID8/ICcnLFxuICAgICAgICBrZXlWYWx1ZVJvd3M6IFtdLFxuICAgICAgICBrZXlUeXBlVmFsdWVSb3dzOiBbXSxcbiAgICAgICAgcGFyYW1zUm93czogW10sXG4gICAgICB9LFxuICAgICAgc3RlcDI6IHsgdmFyaWFibGVOYW1lOiB0aGlzLnZhcmlhYmxlTmFtZSA/PyAnJyB9LFxuICAgICAgc3RlcDM6IHtcbiAgICAgICAgYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI6IHRoaXMuYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIsXG4gICAgICAgIHJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnM6IFtdLFxuICAgICAgICBzdGF0dXNWZXJpZmljYXRpb25zOiBbXSxcbiAgICAgIH0sXG4gICAgICBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzOiB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBOb3JtYWxpemUgZm9ybSBjb250cm9sIHZhbHVlIHRvIHN0cmluZyAoaGFuZGxlcyBvYmplY3Qgb3Igc3RyaW5nKS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q29udHJvbFZhbHVlKGNvbnRyb2w6IHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHYgPSBjb250cm9sPy52YWx1ZTtcbiAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09ICcnKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKSA6IFN0cmluZyh2KTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBmdWxsIGNyZWF0ZSBwYXlsb2FkOiBlbnZpcm9ubWVudCwgSFRUUCBtZXRob2QsIFVSTCwgaGVhZGVycywgYm9keSAoc3RlcDEpLCB2YXJpYWJsZSBuYW1lIChzdGVwMiksIHZlcmlmaWNhdGlvbnMgKHN0ZXAzKS4gKi9cbiAgcHJpdmF0ZSBnZXRDcmVhdGVQYXlsb2FkKCk6IEFwaUVkaXRDcmVhdGVQYXlsb2FkIHtcbiAgICBjb25zdCBlbnZGcm9tRm9ybSA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldENvbnRyb2xWYWx1ZSh0aGlzLmVudmlyb25tZW50Rm9ybT8uZ2V0KCdlbnZpcm9ubWVudCcpIGFzIHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwpO1xuICAgIGNvbnN0IGVudmlyb25tZW50ID1cbiAgICAgIGVudkZyb21Gb3JtICE9PSAnJyA/IGVudkZyb21Gb3JtIDogKHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgIT09ICcnID8gdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA6IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudCk7XG4gICAgY29uc3QgbWV0aG9kRnJvbUZvcm0gPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRDb250cm9sVmFsdWUodGhpcy5tZXRob2RGb3JtPy5nZXQoJ21ldGhvZCcpIGFzIHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwpO1xuICAgIGNvbnN0IG1ldGhvZCA9XG4gICAgICBtZXRob2RGcm9tRm9ybSAhPT0gJycgPyBtZXRob2RGcm9tRm9ybSA6ICh0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSAhPT0gJycgPyB0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSA6IHRoaXMuc2VsZWN0ZWRNZXRob2QpO1xuICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMucGF5bG9hZEZvcm1hdEZvcm0/LmdldCgnZm9ybWF0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGtleVZhbHVlRm9ybUFycmF5ID0gdGhpcy5rZXlWYWx1ZUZvcm1BcnJheTtcbiAgICBjb25zdCBrZXlWYWx1ZVJvd3MgPSAoa2V5VmFsdWVGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKS5tYXAoKGMpID0+ICh7XG4gICAgICBrZXk6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdrZXknKT8udmFsdWUgPz8gJycsXG4gICAgICB2YWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnLFxuICAgIH0pKTtcbiAgICBjb25zdCBrZXlUeXBlVmFsdWVGb3JtQXJyYXkgPSB0aGlzLmtleVR5cGVWYWx1ZUZvcm1BcnJheTtcbiAgICBjb25zdCBrZXlUeXBlVmFsdWVSb3dzID0gKGtleVR5cGVWYWx1ZUZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pLm1hcCgoYykgPT4gKHtcbiAgICAgIGtleTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2tleScpPy52YWx1ZSA/PyAnJyxcbiAgICAgIHR5cGU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd0eXBlJyk/LnZhbHVlID8/ICd0ZXh0JyxcbiAgICAgIHZhbHVlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgndmFsdWUnKT8udmFsdWUgPz8gJycsXG4gICAgfSkpO1xuICAgIGNvbnN0IHBhcmFtc0Zvcm1BcnJheSA9IHRoaXMucGFyYW1zRm9ybUFycmF5O1xuICAgIGNvbnN0IHBhcmFtc1Jvd3MgPSAocGFyYW1zRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkubWFwKChjKSA9PiAoe1xuICAgICAga2V5OiAoYyBhcyBGb3JtR3JvdXApLmdldCgna2V5Jyk/LnZhbHVlID8/ICcnLFxuICAgICAgdmFsdWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gICAgY29uc3QgdmVyaWZpY2F0aW9uRm9ybUFycmF5ID0gdGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXk7XG4gICAgY29uc3QgcmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9ucyA9ICh2ZXJpZmljYXRpb25Gb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKS5tYXAoKGMpID0+ICh7XG4gICAgICBqc29uUGF0aDogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2pzb25QYXRoJyk/LnZhbHVlID8/ICcnLFxuICAgICAgdmVyaWZpY2F0aW9uOiAoYyBhcyBGb3JtR3JvdXApLmdldCgndmVyaWZpY2F0aW9uJyk/LnZhbHVlID8/ICcnLFxuICAgICAgZGF0YVR5cGU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdkYXRhVHlwZScpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGV4cGVjdGVkVmFsdWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnZhbHVlID8/ICcnLFxuICAgIH0pKTtcbiAgICBjb25zdCBzdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkgPSB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheTtcbiAgICBjb25zdCBzdGF0dXNWZXJpZmljYXRpb25zID0gKHN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pLm1hcCgoYykgPT4gKHtcbiAgICAgIHZlcmlmaWNhdGlvbjogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZlcmlmaWNhdGlvbicpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGV4cGVjdGVkVmFsdWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnZhbHVlID8/ICcnLFxuICAgIH0pKTtcbiAgICBjb25zdCBhdXRoVHlwZSA9IHRoaXMuc2VsZWN0ZWRBdXRoVHlwZTtcbiAgICBjb25zdCBiZWFyZXJUb2tlbiA9IGF1dGhUeXBlID09PSAnYmVhcmVyJyA/ICh0aGlzLmJlYXJlclRva2VuID8/ICcnKSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgb2F1dGgyOiBBcGlFZGl0T0F1dGgyUGF5bG9hZCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYXV0aFR5cGUgPT09ICdvYXV0aDInICYmIHRoaXMub2F1dGgyRm9ybSkge1xuICAgICAgY29uc3QgZ3JhbnRUeXBlID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0Q29udHJvbFZhbHVlKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2dyYW50VHlwZScpIGFzIHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwpO1xuICAgICAgY29uc3QgY2xpZW50QXV0aCA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldENvbnRyb2xWYWx1ZSh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdjbGllbnRBdXRoZW50aWNhdGlvbicpIGFzIHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwpO1xuICAgICAgb2F1dGgyID0ge1xuICAgICAgICBncmFudFR5cGU6IGdyYW50VHlwZSAhPT0gJycgPyBncmFudFR5cGUgOiAnY2xpZW50X2NyZWRlbnRpYWxzJyxcbiAgICAgICAgYWNjZXNzVG9rZW5Vcmw6ICh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdhY2Nlc3NUb2tlblVybCcpPy52YWx1ZSA/PyAnJykgYXMgc3RyaW5nLFxuICAgICAgICBjbGllbnRJZDogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2NsaWVudElkJyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIGNsaWVudFNlY3JldDogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2NsaWVudFNlY3JldCcpPy52YWx1ZSA/PyAnJykgYXMgc3RyaW5nLFxuICAgICAgICBzY29wZTogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ3Njb3BlJyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIGNsaWVudEF1dGhlbnRpY2F0aW9uOiBjbGllbnRBdXRoICE9PSAnJyA/IGNsaWVudEF1dGggOiAnYmFzaWMnLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0ZXAxOiB7XG4gICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIHVybDogdGhpcy51cmwgPz8gJycsXG4gICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgYXV0aFR5cGUsXG4gICAgICAgIC4uLihiZWFyZXJUb2tlbiAhPT0gdW5kZWZpbmVkICYmIHsgYmVhcmVyVG9rZW4gfSksXG4gICAgICAgIC4uLihvYXV0aDIgIT09IHVuZGVmaW5lZCAmJiB7IG9hdXRoMiB9KSxcbiAgICAgICAgYWN0aXZlUGF5bG9hZFRhYjogdGhpcy5hY3RpdmVQYXlsb2FkVGFiLFxuICAgICAgICBwYXlsb2FkVHlwZTogdGhpcy5wYXlsb2FkVHlwZSxcbiAgICAgICAgcGF5bG9hZEZvcm1hdDogZm9ybWF0LFxuICAgICAgICBwYXlsb2FkVGV4dDogdGhpcy5wYXlsb2FkVGV4dCA/PyAnJyxcbiAgICAgICAga2V5VmFsdWVSb3dzLFxuICAgICAgICBrZXlUeXBlVmFsdWVSb3dzLFxuICAgICAgICBwYXJhbXNSb3dzLFxuICAgICAgfSxcbiAgICAgIHN0ZXAyOiB7XG4gICAgICAgIHZhcmlhYmxlTmFtZTogdGhpcy52YXJpYWJsZU5hbWUgPz8gJycsXG4gICAgICB9LFxuICAgICAgc3RlcDM6IHtcbiAgICAgICAgYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI6IHRoaXMuYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIsXG4gICAgICAgIHJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnMsXG4gICAgICAgIHN0YXR1c1ZlcmlmaWNhdGlvbnMsXG4gICAgICB9LFxuICAgICAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLFxuICAgIH07XG4gIH1cblxuICAvKiogQ3VycmVudCBoZWFkZXIgcm93cyBmcm9tIGZvcm0gKGZvciBjb25zdW1lcnMgdGhhdCByZWFkIGhlYWRlcnMpICovXG4gIGdldCBoZWFkZXJzKCk6IEFwaUVkaXRIZWFkZXJSb3dbXSB7XG4gICAgaWYgKCF0aGlzLmhlYWRlcnNGb3JtQXJyYXkpIHJldHVybiBbXTtcbiAgICByZXR1cm4gdGhpcy5oZWFkZXJzRm9ybUFycmF5LmNvbnRyb2xzLm1hcCgoYykgPT4gKHtcbiAgICAgIG5hbWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCduYW1lJyk/LnZhbHVlID8/ICcnLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICB2YWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnLFxuICAgIH0pKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbE1ldGhvZCddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCAmJiB0aGlzLm1ldGhvZEZvcm0pIHtcbiAgICAgIGNvbnN0IHYgPSBjaGFuZ2VzWydpbml0aWFsTWV0aG9kJ10uY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSB0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyB2IDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpO1xuICAgICAgdGhpcy5tZXRob2RGb3JtLnBhdGNoVmFsdWUoeyBtZXRob2Q6IHYgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydodHRwTWV0aG9kT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1ldGhvZFNlbGVjdENvbmZpZygpO1xuICAgICAgaWYgKHRoaXMubWV0aG9kRm9ybSAmJiB0aGlzLmh0dHBNZXRob2RPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMubWV0aG9kRm9ybS5nZXQoJ21ldGhvZCcpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRNZXRob2RWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgdmFsaWQgPSB2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCk7XG4gICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5odHRwTWV0aG9kT3B0aW9uc1swXSk7XG4gICAgICAgICAgaWYgKGZpcnN0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSBmaXJzdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5tZXRob2RGb3JtLnBhdGNoVmFsdWUoeyBtZXRob2Q6IGZpcnN0VmFsdWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsRW52aXJvbm1lbnQnXT8uY3VycmVudFZhbHVlICE9IG51bGwgJiYgdGhpcy5lbnZpcm9ubWVudEZvcm0pIHtcbiAgICAgIGNvbnN0IHYgPSBjaGFuZ2VzWydpbml0aWFsRW52aXJvbm1lbnQnXS5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gdHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKTtcbiAgICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtLnBhdGNoVmFsdWUoeyBlbnZpcm9ubWVudDogdiB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2Vudmlyb25tZW50T3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUVudmlyb25tZW50U2VsZWN0Q29uZmlnKCk7XG4gICAgICBpZiAodGhpcy5lbnZpcm9ubWVudEZvcm0gJiYgdGhpcy5lbnZpcm9ubWVudE9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5lbnZpcm9ubWVudEZvcm0uZ2V0KCdlbnZpcm9ubWVudCcpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRFbnZpcm9ubWVudFZhbHVlcygpO1xuICAgICAgICBjb25zdCB2YWxpZCA9IHZhbHVlcy5pbmNsdWRlcyhjdXJyZW50KTtcbiAgICAgICAgaWYgKCF2YWxpZCkge1xuICAgICAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmVudmlyb25tZW50T3B0aW9uc1swXSk7XG4gICAgICAgICAgaWYgKGZpcnN0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9IGZpcnN0VmFsdWU7XG4gICAgICAgICAgICB0aGlzLmVudmlyb25tZW50Rm9ybS5wYXRjaFZhbHVlKHsgZW52aXJvbm1lbnQ6IGZpcnN0VmFsdWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydoYXNNb3JlRW52aXJvbm1lbnRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRW52aXJvbm1lbnRzJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlRW52aXJvbm1lbnRTZWxlY3RDb25maWcoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxBdXRoVHlwZSddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCAmJiB0aGlzLmF1dGhUeXBlRm9ybSkge1xuICAgICAgY29uc3QgdiA9IGNoYW5nZXNbJ2luaXRpYWxBdXRoVHlwZSddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGNvbnN0IHJlc29sdmVkID1cbiAgICAgICAgdHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiA6IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCk7XG4gICAgICBpZiAocmVzb2x2ZWQgIT0gbnVsbCkgdGhpcy5hdXRoVHlwZUZvcm0ucGF0Y2hWYWx1ZSh7IGF1dGhUeXBlOiB2IH0pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snYXV0aFR5cGVPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlQXV0aFR5cGVTZWxlY3RDb25maWcoKTtcbiAgICAgIGlmICh0aGlzLmF1dGhUeXBlRm9ybSkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldEF1dGhUeXBlVmFsdWVzKCk7XG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmF1dGhUeXBlRm9ybS5nZXQoJ2F1dGhUeXBlJyk/LnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWwgPVxuICAgICAgICAgICAgY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQgIT09ICcnXG4gICAgICAgICAgICAgID8gdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShjdXJyZW50IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpXG4gICAgICAgICAgICAgICAgOiBTdHJpbmcoY3VycmVudClcbiAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgIGNvbnN0IHZhbGlkID0gY3VycmVudFZhbCAhPSBudWxsICYmIHZhbHVlcy5pbmNsdWRlcyhjdXJyZW50VmFsKTtcbiAgICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gdmFsdWVzWzBdO1xuICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aGlzLmF1dGhUeXBlRm9ybS5wYXRjaFZhbHVlKHsgYXV0aFR5cGU6IGZpcnN0VmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsU3RlcCddKSB7XG4gICAgICB0aGlzLmFwcGx5SW5pdGlhbFN0ZXAoY2hhbmdlc1snaW5pdGlhbFN0ZXAnXS5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFVybCddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy51cmwgPSBBcGlFZGl0U3RlcENvbXBvbmVudC5kZWNvZGVVcmxGb3JEaXNwbGF5KGNoYW5nZXNbJ2luaXRpYWxVcmwnXS5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFBheWxvYWRUYWInXT8uY3VycmVudFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYWN0aXZlUGF5bG9hZFRhYiA9IGNoYW5nZXNbJ2luaXRpYWxQYXlsb2FkVGFiJ10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaGVhZGVyTmFtZU9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsSGVhZGVycyddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkoY2hhbmdlc1snaW5pdGlhbEhlYWRlcnMnXS5jdXJyZW50VmFsdWUgYXMgQXBpRWRpdEhlYWRlclJvd1tdKTtcbiAgICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFJlc3BvbnNlUHJldmlldyddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgY29uc29sZS5sb2coJzk5OTk5OTkgaW5pdGlhbFJlc3BvbnNlUHJldmlldycsIHRoaXMuaW5pdGlhbFJlc3BvbnNlUHJldmlldyk7XG4gICAgICB0aGlzLnJlc3BvbnNlUHJldmlldyA9IGNoYW5nZXNbJ2luaXRpYWxSZXNwb25zZVByZXZpZXcnXS5jdXJyZW50VmFsdWU7XG4gICAgICAvLyBXaGVuIGEgbmV3IHJlc3BvbnNlIHByZXZpZXcgaXMgcHJvdmlkZWQgKGFmdGVyIFNlbmQgUmVxdWVzdCksIHNjcm9sbCBwcmV2aWV3IHNlY3Rpb24gaW50byB2aWV3XG4gICAgICB0aGlzLnNjcm9sbFByZXZpZXdJbnRvVmlldygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbEZvcm1hdCddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCAmJiB0aGlzLnBheWxvYWRGb3JtYXRGb3JtKSB7XG4gICAgICB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IGNoYW5nZXNbJ2luaXRpYWxGb3JtYXQnXS5jdXJyZW50VmFsdWUgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsVmFyaWFibGVOYW1lJ10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZSA9IGNoYW5nZXNbJ2luaXRpYWxWYXJpYWJsZU5hbWUnXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydmb3JtYXRPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlUGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZygpO1xuICAgICAgaWYgKHRoaXMucGF5bG9hZEZvcm1hdEZvcm0pIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMucGF5bG9hZEZvcm1hdEZvcm0uZ2V0KCdmb3JtYXQnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0Rm9ybWF0VmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IHZhbGlkID0gdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnQpO1xuICAgICAgICBpZiAoIXZhbGlkICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IHZhbHVlc1swXTtcbiAgICAgICAgICB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IGZpcnN0VmFsdWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZlcmlmaWNhdGlvbk9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmVyaWZpY2F0aW9uVmFsdWVzKCk7XG4gICAgICBjb25zdCBkZWZhdWx0VmVyaWZpY2F0aW9uID0gdGhpcy5nZXREZWZhdWx0VmVyaWZpY2F0aW9uKCk7XG4gICAgICBpZiAodGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSAoY29udHJvbCBhcyBGb3JtR3JvdXApLmdldCgndmVyaWZpY2F0aW9uJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50ICYmICF2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCkpIHtcbiAgICAgICAgICAgIChjb250cm9sIGFzIEZvcm1Hcm91cCkucGF0Y2hWYWx1ZSh7IHZlcmlmaWNhdGlvbjogZGVmYXVsdFZlcmlmaWNhdGlvbiB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlVmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcoKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0RGF0YVR5cGVWYWx1ZXMoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHREYXRhVHlwZSA9IHRoaXMuZ2V0RGVmYXVsdERhdGFUeXBlKCk7XG4gICAgICBpZiAodGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSAoY29udHJvbCBhcyBGb3JtR3JvdXApLmdldCgnZGF0YVR5cGUnKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgJiYgIXZhbHVlcy5pbmNsdWRlcyhjdXJyZW50KSkge1xuICAgICAgICAgICAgKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5wYXRjaFZhbHVlKHsgZGF0YVR5cGU6IGRlZmF1bHREYXRhVHlwZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZygpO1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRTdGF0dXNWZXJpZmljYXRpb25WYWx1ZXMoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWZXJpZmljYXRpb24gPSB0aGlzLmdldERlZmF1bHRTdGF0dXNWZXJpZmljYXRpb24oKTtcbiAgICAgIGlmICh0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheSAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IChjb250cm9sIGFzIEZvcm1Hcm91cCkuZ2V0KCd2ZXJpZmljYXRpb24nKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgJiYgIXZhbHVlcy5pbmNsdWRlcyhjdXJyZW50KSkge1xuICAgICAgICAgICAgKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5wYXRjaFZhbHVlKHsgdmVyaWZpY2F0aW9uOiBkZWZhdWx0VmVyaWZpY2F0aW9uIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNtb290aGx5IHNjcm9sbHMgdGhlIHJlc3BvbnNlIHByZXZpZXcgc2VjdGlvbiBpbnRvIHZpZXcgd2l0aGluIHRoZSBzY3JvbGxhYmxlIGNvbnRhaW5lci5cbiAgICogQ2FsbGVkIHdoZW4gYSBmcmVzaCByZXNwb25zZSBwcmV2aWV3IHZhbHVlIGlzIHNldCBmcm9tIHRoZSBwYXJlbnQgKEFQSSBidWlsZGVyKS5cbiAgICovXG4gIHByaXZhdGUgc2Nyb2xsUHJldmlld0ludG9WaWV3KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZXNwb25zZVByZXZpZXdSZWYgfHwgIXRoaXMucmVzcG9uc2VQcmV2aWV3UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5yZXNwb25zZVByZXZpZXdSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgYmxvY2s6ICdzdGFydCcsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGxiYWNrOiBtYW51YWxseSBhZGp1c3QgY2xvc2VzdCBzY3JvbGxhYmxlIHBhcmVudCBpZiBuZWVkZWRcbiAgICAgIGNvbnN0IGVsID0gdGhpcy5yZXNwb25zZVByZXZpZXdSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIGNvbnN0IHNjcm9sbFBhcmVudCA9IGVsLmNsb3Nlc3QoJy5jcWEtYXBpLWVkaXQtc3RlcC1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICBpZiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFRvcCA9IGVsLm9mZnNldFRvcCAtIDE2OyAvLyBzbWFsbCBwYWRkaW5nXG4gICAgICAgIHNjcm9sbFBhcmVudC5zY3JvbGxUbyh7IHRvcDogb2Zmc2V0VG9wIDwgMCA/IDAgOiBvZmZzZXRUb3AsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1jb250YWluZXIgY3FhLWJnLVsjZmZmZmZmXSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1wLVsxNnB4XSBjcWEtZ2FwLVsxMnB4XSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1vdmVyZmxvdy14LWhpZGRlbiBjcWEtYm94LWJvcmRlclwiPlxuXG4gIDxoMiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXRpdGxlIGNxYS1mb250LWludGVyIGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTAwJV0gY3FhLXRyYWNraW5nLW5vcm1hbCBjcWEtdGV4dC1bIzAwMDAwMF0gY3FhLW0tMFwiPlxuICAgIHt7IGVkaXRNb2RlID8gJ1VwZGF0ZSBBUEkgVGVzdCBTdGVwJyA6ICdDcmVhdGUgQVBJIFRlc3QgU3RlcCcgfX1cbiAgPC9oMj5cblxuICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW5kaWNhdG9yIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0wIGNxYS1tYXgtWzc2N3B4XTpjcWEtZmxleC13cmFwIGNxYS1tYXgtWzc2N3B4XTpjcWEtZ2FwLTIgY3FhLW1heC1bNzY3cHhdOmNxYS1qdXN0aWZ5LXN0YXJ0XCJcbiAgICBbY2xhc3MuY3FhLWp1c3RpZnktc3RhcnRdPVwic3RlcExhYmVscy5sZW5ndGggPT09IDFcIlxuICAgIFtjbGFzcy5jcWEtanVzdGlmeS1iZXR3ZWVuXT1cInN0ZXBMYWJlbHMubGVuZ3RoICE9PSAxXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RlcCBvZiBzdGVwTGFiZWxzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIlxuICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvci1pdGVtIGNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvci1pdGVtLS1jbGlja2FibGUgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVsxMHB4XSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWZvbnQtaW5oZXJpdCBjcWEtdGV4dC1pbmhlcml0IGNxYS10ZXh0LWxlZnQgIWNxYS1iZy10cmFuc3BhcmVudFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1N0ZXAgJyArIHN0ZXAuaW5kZXggKyAnOiAnICsgc3RlcC5sYWJlbFwiIFthdHRyLmFyaWEtcHJlc3NlZF09XCJzdGVwLmluZGV4ID09PSBjdXJyZW50U3RlcFwiXG4gICAgICAgIChjbGlja2VkKT1cInNldFN0ZXAoc3RlcC5pbmRleClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbmRpY2F0b3ItY2lyY2xlIGNxYS13LTggY3FhLWgtOCBjcWEtcm91bmRlZC1mdWxsIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLWxlYWRpbmctbm9uZSBjcWEtYm9yZGVyLW5vbmUgY3FhLXNocmluay0wXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJzdGVwLmluZGV4ID09PSBjdXJyZW50U3RlcCA/ICdjcWEtYmctWyM0RjQ2RTVdIGNxYS10ZXh0LXdoaXRlJyA6ICdjcWEtYmctWyNFMEUwRTBdIGNxYS10ZXh0LVsjNjY2NjY2XSdcIj5cbiAgICAgICAgICB7eyBzdGVwLmluZGV4IH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbmRpY2F0b3ItbGFiZWwgY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtbWF4LVs3NjdweF06Y3FhLXRleHQteHNcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInN0ZXAuaW5kZXggPT09IGN1cnJlbnRTdGVwID8gJ2NxYS10ZXh0LVsjNEY0NkU1XScgOiAnY3FhLXRleHQtWyM2NjY2NjZdJ1wiPlxuICAgICAgICAgIHt7IHN0ZXAubGFiZWwgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaSA8IHN0ZXBMYWJlbHMubGVuZ3RoIC0gMVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW5kaWNhdG9yLWxpbmUgY3FhLXctWzk2cHhdIGNxYS1oLVsycHhdIGNxYS1iZy1bI0UwRTBFMF0gY3FhLW15LTAgY3FhLW14LVs2cHhdIGNxYS1zaHJpbmstMCBjcWEtc2VsZi1jZW50ZXIgY3FhLW1heC1bNzY3cHhdOmNxYS13LVsyNHB4XSBjcWEtbWF4LVs3NjdweF06Y3FhLW14LTFcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2Rpdj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTdGVwIGNvbnRlbnQgdmlld3BvcnQ6IG9ubHkgdGhlIGFjdGl2ZSBzdGVwIGJvZHkgaXMgc2hvd24gKCpuZ0lmKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZpZXdwb3J0IGNxYS13LWZ1bGxcIj5cbiAgICA8IS0tIFN0ZXAgMTogRW52aXJvbm1lbnQsIHJlcXVlc3QsIGJvZHksIHJlc3BvbnNlIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U3RlcCA9PT0gMVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGFuZWwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNiBjcWEtYm94LWJvcmRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgIDwhLS0gRW52aXJvbm1lbnQgcm93OiBsYWJlbCBvbiB0b3AsIHNlbGVjdCBiZWxvdyAoYWxpZ25lZCByaWdodCBvbiBkZXNrdG9wKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWVudmlyb25tZW50LXJvdyBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLWl0ZW1zLWVuZCBjcWEtbWF4LVs3NjdweF06Y3FhLWl0ZW1zLXN0cmV0Y2hcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWF4LVs3NjdweF06Y3FhLWl0ZW1zLXN0cmV0Y2hcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1lbnZpcm9ubWVudC1sYWJlbCBjcWEtbS0wIGNxYS10ZXh0LVsxNHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTAwJV0gY3FhLXRyYWNraW5nLW5vcm1hbFwiPkVudmlyb25tZW50czwvbGFiZWw+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cImVudmlyb25tZW50Rm9ybVwiXG4gICAgICAgICAgICBbZm9ybV09XCJlbnZpcm9ubWVudEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJlbnZpcm9ubWVudFNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWVudmlyb25tZW50LXNlbGVjdCBjcWEtc2hyaW5rLTAgY3FhLXctYXV0byBjcWEtbWluLXctWzMxNXB4XSBjcWEtbWF4LXctWzMxNXB4XSBjcWEtbWF4LVs3NjdweF06Y3FhLW1pbi13LTAgY3FhLW1heC1bNzY3cHhdOmNxYS1tYXgtdy1mdWxsIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsIFsmXy5tYXQtZm9ybS1maWVsZC13cmFwcGVyXTpjcWEtcGItMFwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiRW52aXJvbm1lbnRcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbkVudmlyb25tZW50U2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJlcXVlc3Qgcm93OiBtZXRob2QsIFVSTCwgYnV0dG9ucyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXJlcXVlc3Qtcm93IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1mbGV4LXdyYXAgY3FhLW1heC1bNzY3cHhdOmNxYS1mbGV4LWNvbCBjcWEtbWF4LVs3NjdweF06Y3FhLWl0ZW1zLXN0cmV0Y2ggY3FhLW1heC1bNzY3cHhdOmNxYS1nYXAtMi41XCI+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cIm1ldGhvZEZvcm1cIiBbZm9ybV09XCJtZXRob2RGb3JtXCIgW2NvbmZpZ109XCJtZXRob2RTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1tZXRob2Qtc2VsZWN0IGNxYS1zaHJpbmstMCBjcWEtdy1hdXRvIGNxYS1taW4tdy1bMTUycHhdIGNxYS1tYXgtdy1bMTUycHhdIGNxYS1tYXgtWzc2N3B4XTpjcWEtbWluLXctMCBjcWEtbWF4LVs3NjdweF06Y3FhLW1heC13LWZ1bGwgY3FhLW1heC1bNzY3cHhdOmNxYS13LWZ1bGxcIiBhcmlhLWxhYmVsPVwiSFRUUCBtZXRob2RcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbk1ldGhvZFNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXVybC13cmFwIGNxYS1mbGV4LTEgY3FhLW1pbi13LVsyMDBweF0gY3FhLW1heC1bNzY3cHhdOmNxYS1taW4tdy0wIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICBbdmFsdWVdPVwidXJsXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInVybCA9ICRldmVudFwiXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cInVybE9wdGlvbnNcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidXJsUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJFbnRlciBVUkwgb3Igc2VsZWN0IFBhcmFtZXRlclwiXG4gICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIChvcHRpb25TZWxlY3QpPVwib25VcmxPcHRpb25TZWxlY3QoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9jcWEtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVybEVycm9yXCIgY2xhc3M9XCJjcWEtdGV4dC1yZWQtNjAwIGNxYS10ZXh0LXNtIGNxYS1tdC0xXCI+XG4gICAgICAgICAgICAgIHt7IHVybEVycm9yIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtdHJpZ2dlciBjcWEtY29udGVudHMgY3FhLW1heC1bNzY3cHhdOmNxYS13LWZ1bGwgY3FhLW1heC1bNzY3cHhdOiFjcWEtZmxleFwiIChjbGljayk9XCJvcGVuSW1wb3J0Q3VybFBhbmVsKClcIj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiSW1wb3J0IEFQSSBjVVJMXCJcbiAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1idG4tb3V0bGluZSAhY3FhLWJnLXdoaXRlICFjcWEtYm9yZGVyICFjcWEtYm9yZGVyLXNvbGlkICFjcWEtYm9yZGVyLVsjNkI3MjgwXSBjcWEtdGV4dC1bIzQxNDE0Nl0gY3FhLWZvbnQtaW50ZXIgY3FhLXRleHQtWzE0cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLVsxMDAlXSBjcWEtdHJhY2tpbmctbm9ybWFsIGhvdmVyOiFjcWEtYmctWyNGOUZBRkJdIGhvdmVyOiFjcWEtdGV4dC1bIzQxNDE0Nl0gY3FhLW1heC1bNzY3cHhdOmNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIlNlbmQgUmVxdWVzdFwiIChjbGlja2VkKT1cIm9uU2VuZFJlcXVlc3QoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzVXJsVmFsaWRcIlxuICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1idG4tcHJpbWFyeSBjcWEtZm9udC1pbnRlciBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzEwMCVdIGNxYS10cmFja2luZy1ub3JtYWwgIWNxYS1iZy1bIzNGNDNFRV0gY3FhLXRleHQtWyNGQkZDRkZdICFjcWEtYm9yZGVyLW5vbmUgY3FhLXB5LTIuNSBjcWEtcHgtNiBjcWEtZ2FwLTIgY3FhLXJvdW5kZWQtbGcgY3FhLW1pbi1oLVszN3B4XSBjcWEtYm94LWJvcmRlciBob3ZlcjohY3FhLWJnLVsjMUIxRkVCXSBjcWEtbWF4LVs3NjdweF06Y3FhLXctZnVsbFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7JyFjcWEtb3BhY2l0eS01MCAhY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6ICFpc1VybFZhbGlkfVwiPlxuICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cblxuXG4gICAgICAgIDwhLS0gQm9keSBjb250ZW50OiBoZWFkZXIgc2VjdGlvbiAoZGVmYXVsdCkgT1IgaW1wb3J0IGNVUkwgc2VjdGlvbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJvZHlWaWV3ID09PSAnaW1wb3J0LWN1cmwnXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXBhbmVsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1zaGFkb3ctWzBfMXB4XzNweF9yZ2JhKDAsMCwwLDAuMDgpXSBjcWEtb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtaGVhZGVyIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHktMyBjcWEtcHgtNSBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtYmctWyNGOUZBRkJdIGNxYS1yb3VuZGVkLXQtbGcgY3FhLW1heC1bNzY3cHhdOmNxYS1weC00XCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXRpdGxlIGNxYS1tLTAgY3FhLXRleHQteHMgY3FhLWZvbnQtYm9sZCBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRleHQtWyMzNzQxNTFdXCI+SW1wb3J0IEFQSSBjVVJMPC9oMz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXNlcGFyYXRvciBjcWEtaC1weCBjcWEtYmctWyNFMkU4RjBdIGNxYS1teS0wIGNxYS1teC01XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYm9keVwiPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYSBbdmFsdWVdPVwiaW1wb3J0Q3VybENvbnRyb2wudmFsdWVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJpbXBvcnRDdXJsQ29udHJvbC5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBhc3RlIHlvdXIgY1VSTCBjb21tYW5kIGhlcmUgKGUuZy4sIGN1cmwgLVggUE9TVCBodHRwczovL2FwaS5leGFtcGxlLmNvbS91c2VycylcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFtyb3dzXT1cIjhcIiByZXNpemU9XCJ2ZXJ0aWNhbFwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC10ZXh0YXJlYVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJDYW5jZWxcIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYnRuLWNhbmNlbFwiIChjbGlja2VkKT1cIm9uQ2FuY2VsSW1wb3J0Q3VybCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJJbXBvcnRcIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYnRuLWltcG9ydFwiIChjbGlja2VkKT1cIm9uSW1wb3J0Q3VybENvbmZpcm0oKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm9keVZpZXcgPT09ICdoZWFkZXJzJ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzLXdyYXBwZXIgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXRhYnNcIj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gKm5nRm9yPVwibGV0IHRhYiBvZiBwYXlsb2FkVGFic1wiIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFt0ZXh0XT1cInRhYi5sYWJlbFwiXG4gICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC10YWInICsgKGFjdGl2ZVBheWxvYWRUYWIgPT09IHRhYi52YWx1ZSA/ICcgY3FhLWFwaS1lZGl0LXN0ZXAtdGFiLS1hY3RpdmUnIDogJycpICsgKGlzTWV0aG9kV2l0aG91dEJvZHkgJiYgKHRhYi52YWx1ZSA9PT0gJ2JvZHknIHx8IHRhYi52YWx1ZSA9PT0gJ3BhcmFtcycpID8gJyBjcWEtYXBpLWVkaXQtc3RlcC10YWItLWRpc2FibGVkJyA6ICcnKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTWV0aG9kV2l0aG91dEJvZHkgJiYgKHRhYi52YWx1ZSA9PT0gJ2JvZHknIHx8IHRhYi52YWx1ZSA9PT0gJ3BhcmFtcycpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJzZXRQYXlsb2FkVGFiKHRhYi52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUGF5bG9hZCBjb250ZW50IChBdXRob3JpemF0aW9uKSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVQYXlsb2FkVGFiID09PSAnYXV0aG9yaXphdGlvbidcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWRcIlxuICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCIncGFkZGluZzogMjBweDsgbWluLWhlaWdodDogMjAwcHg7J1wiPlxuICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDIwcHg7J1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogOHB4OyB3aWR0aDogZml0LWNvbnRlbnQ7J1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC13ZWlnaHQ6IDYwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsgY29sb3I6ICM2QjcyODA7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5BVVRIIFRZUEU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0ICpuZ0lmPVwiYXV0aFR5cGVGb3JtXCIgW2Zvcm1dPVwiYXV0aFR5cGVGb3JtXCIgW2NvbmZpZ109XCJhdXRoVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYXV0aC10eXBlLXNlbGVjdFwiIGFyaWEtbGFiZWw9XCJBdXRoIHR5cGVcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInbWluLXdpZHRoOiAxNjBweDsnXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIE5vIEF1dGg6IGNlbnRlcmVkIG1lc3NhZ2UgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkQXV0aFR5cGUgPT09ICduby1hdXRoJ1wiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInZmxleDogMTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogMTJweDsgbWluLXdpZHRoOiAwOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJvcmRlcjogMXB4IHNvbGlkICNFNUU3RUI7IGJvcmRlci1yYWRpdXM6IDhweDsgcGFkZGluZy10b3A6IDE2cHg7IHBhZGRpbmctYm90dG9tOiAxNnB4OydcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ3dpZHRoOiA0OHB4OyBoZWlnaHQ6IDQ4cHg7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJhY2tncm91bmQ6ICNGM0Y0RjY7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBmbGV4LXNocmluazogMDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjVcIiB5PVwiMTFcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMlwiIHJ4PVwiMVwiIGZpbGw9XCIjOUNBM0FGXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTZweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5ObyBBdXRoPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGRpdiBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogNnB4OyBmbGV4LXdyYXA6IHdyYXA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxNHB4OyBmb250LXdlaWdodDogNDAwOyBjb2xvcjogIzlDQTNBRjsgbGluZS1oZWlnaHQ6IDEuNDsnXCI+VGhpcyByZXF1ZXN0IGRvZXMgbm90IHVzZSBhbnkgYXV0aG9yaXphdGlvbi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHJvbGU9XCJpbWdcIiBhcmlhLWxhYmVsPVwiTW9yZSBpbmZvcm1hdGlvblwiIHRpdGxlPVwiVGhpcyByZXF1ZXN0IGRvZXMgbm90IHVzZSBhbnkgYXV0aG9yaXphdGlvbi5cIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IHdpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7IGNvbG9yOiAjOUNBM0FGOyBmbGV4LXNocmluazogMDsnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjdcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTggN3Y0TTggNXYuNVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIEJlYXJlciBUb2tlbjogVG9rZW4gbGFiZWwgKyB0ZXh0YXJlYSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRBdXRoVHlwZSA9PT0gJ2JlYXJlcidcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ2ZsZXg6IDE7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMTBweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMzc0MTUxOyBsaW5lLWhlaWdodDogMS4yNTsnXCI+VG9rZW48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYSBbKHZhbHVlKV09XCJiZWFyZXJUb2tlblwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgYmVhcmVyIHRva2VuXCJcbiAgICAgICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgW3Jvd3NdPVwiNlwiIHJlc2l6ZT1cInZlcnRpY2FsXCIgc2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hdXRoLXRva2VuLXRleHRhcmVhXCIgYXJpYUxhYmVsPVwiQmVhcmVyIHRva2VuXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSBPQXV0aCAyLjA6IEdyYW50IFR5cGUsIEFjY2VzcyBUb2tlbiBVUkwsIENsaWVudCBJRCwgQ2xpZW50IFNlY3JldCwgU2NvcGUsIENsaWVudCBBdXRoZW50aWNhdGlvbiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRBdXRoVHlwZSA9PT0gJ29hdXRoMicgJiYgb2F1dGgyRm9ybVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLW9hdXRoMi1ncmlkXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogMTZweCAyNHB4OyB3aWR0aDogMTAwJTsnXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5HcmFudCBUeXBlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0ICpuZ0lmPVwib2F1dGgyRm9ybVwiIFtmb3JtXT1cIm9hdXRoMkZvcm1cIiBbY29uZmlnXT1cIm9hdXRoMkdyYW50VHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hdXRoLW9hdXRoLXNlbGVjdFwiIGFyaWEtbGFiZWw9XCJPQXV0aCBncmFudCB0eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInbWluLXdpZHRoOiAwOyB3aWR0aDogMTAwJTsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMXB4OyBmb250LXN0eWxlOiBpdGFsaWM7IGNvbG9yOiAjNkI3MjgwOyBsaW5lLWhlaWdodDogMS4zOydcIj5PQXV0aCBncmFudCB0eXBlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5BY2Nlc3MgVG9rZW4gVVJMPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwib2F1dGgyRm9ybS5nZXQoJ2FjY2Vzc1Rva2VuVXJsJyk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib2F1dGgyRm9ybS5nZXQoJ2FjY2Vzc1Rva2VuVXJsJyk/LnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInJ1wiIHBsYWNlaG9sZGVyPVwiRW50ZXIgT0F1dGggdG9rZW4gZW5kcG9pbnRcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkFjY2VzcyBUb2tlbiBVUkxcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMXB4OyBmb250LXN0eWxlOiBpdGFsaWM7IGNvbG9yOiAjNkI3MjgwOyBsaW5lLWhlaWdodDogMS4zOydcIj5PQXV0aCB0b2tlbiBlbmRwb2ludDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7IG1pbi13aWR0aDogMDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMzc0MTUxOyBsaW5lLWhlaWdodDogMS4yNTsnXCI+Q2xpZW50IElEPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwib2F1dGgyRm9ybS5nZXQoJ2NsaWVudElkJyk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib2F1dGgyRm9ybS5nZXQoJ2NsaWVudElkJyk/LnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInJ1wiIHBsYWNlaG9sZGVyPVwiRW50ZXIgT0F1dGggY2xpZW50IGlkZW50aWZpZXJcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkNsaWVudCBJRFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgY29sb3I6ICM2QjcyODA7IGxpbmUtaGVpZ2h0OiAxLjM7J1wiPk9BdXRoIGNsaWVudCBpZGVudGlmaWVyPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5DbGllbnQgU2VjcmV0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwib2F1dGgyRm9ybS5nZXQoJ2NsaWVudFNlY3JldCcpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9hdXRoMkZvcm0uZ2V0KCdjbGllbnRTZWNyZXQnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCIgW2xhYmVsXT1cIicnXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBPQXV0aCBjbGllbnQgc2VjcmV0XCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJDbGllbnQgU2VjcmV0XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzZCNzI4MDsgbGluZS1oZWlnaHQ6IDEuMzsnXCI+T0F1dGggY2xpZW50IHNlY3JldDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7IG1pbi13aWR0aDogMDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMzc0MTUxOyBsaW5lLWhlaWdodDogMS4yNTsnXCI+U2NvcGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJvYXV0aDJGb3JtLmdldCgnc2NvcGUnKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvYXV0aDJGb3JtLmdldCgnc2NvcGUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicnXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBzcGFjZS1zZXBhcmF0ZWQgc2NvcGVzXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJTY29wZVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgY29sb3I6ICM2QjcyODA7IGxpbmUtaGVpZ2h0OiAxLjM7J1wiPlNwYWNlLXNlcGFyYXRlZCBzY29wZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPkNsaWVudCBBdXRoZW50aWNhdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cIm9hdXRoMkZvcm1cIiBbZm9ybV09XCJvYXV0aDJGb3JtXCIgW2NvbmZpZ109XCJvYXV0aDJDbGllbnRBdXRoU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWF1dGgtb2F1dGgtc2VsZWN0XCIgYXJpYS1sYWJlbD1cIkNsaWVudCBhdXRoZW50aWNhdGlvbiBtZXRob2RcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cIidtaW4td2lkdGg6IDA7IHdpZHRoOiAxMDAlOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgY29sb3I6ICM2QjcyODA7IGxpbmUtaGVpZ2h0OiAxLjM7J1wiPkNsaWVudCBhdXRoZW50aWNhdGlvbiBtZXRob2Q8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBQYXlsb2FkIGNvbnRlbnQgKEhlYWRlcnMpIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVBheWxvYWRUYWIgPT09ICdoZWFkZXJzJ1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVycy1ncmlkXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWxhYmVsXCI+SGVhZGVyIE5hbWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWxhYmVsXCI+SGVhZGVyIFZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVycy1sYWJlbCBjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgaGVhZGVyUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUhlYWRlclwiIFtmb3JtR3JvdXBdPVwicm93XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWhlYWRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cInJvd1wiIFtjb25maWddPVwiaGVhZGVyTmFtZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAoYWRkQ3VzdG9tVmFsdWUpPVwib25IZWFkZXJOYW1lQWRkQ3VzdG9tVmFsdWUoJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVyLXR5cGUtc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgndmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIlZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVyLXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiSGVhZGVyIHZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVyLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSBoZWFkZXInXCIgKGNsaWNrZWQpPVwicmVtb3ZlSGVhZGVyKGkpXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVyLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFkZC1oZWFkZXItd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIHRleHQ9XCIrIEFkZCBIZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC1hZGQtaGVhZGVyLWxpbmsnXCIgKGNsaWNrZWQpPVwiYWRkSGVhZGVyKClcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUGF5bG9hZCBjb250ZW50IChQYXJhbXMpOiBLZXnigJNWYWx1ZSB0YWJsZSB3aXRoIGFkZC9kZWxldGUgcm93cyAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVQYXlsb2FkVGFiID09PSAncGFyYW1zJ1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWdyaWQgY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsXCI+S2V5PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsXCI+VmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWwgY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgcGFyYW1zUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeVBhcmFtc1wiIFtmb3JtR3JvdXBdPVwicm93XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1yb3dcIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgna2V5Jyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyb3cuZ2V0KCdrZXknKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiS2V5XCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiS2V5XCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtaW5wdXRcIiBhcmlhTGFiZWw9XCJWYWx1ZVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1kZWxldGUnXCJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidSZW1vdmUgcm93J1wiIChjbGlja2VkKT1cInJlbW92ZVBhcmFtc1JvdyhpKVwiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1kZWxldGUtaWNvblwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwLjY2NjMgNlYxMi42NjY3SDUuMzMzMDFWNkgxMC42NjYzWk05LjY2NjM0IDJINi4zMzMwMUw1LjY2NjM0IDIuNjY2NjdIMy4zMzMwMVY0SDEyLjY2NjNWMi42NjY2N0gxMC4zMzNMOS42NjYzNCAyWk0xMS45OTk3IDQuNjY2NjdIMy45OTk2N1YxMi42NjY3QzMuOTk5NjcgMTMuNCA0LjU5OTY3IDE0IDUuMzMzMDEgMTRIMTAuNjY2M0MxMS4zOTk3IDE0IDExLjk5OTcgMTMuNCAxMS45OTk3IDEyLjY2NjdWNC42NjY2N1pcIlxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjlCRkJGXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtYWRkLXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCIrIEFkZCBSb3dcIlxuICAgICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtYWRkLWJ0blwiIChjbGlja2VkKT1cImFkZFBhcmFtc1JvdygpXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBheWxvYWQgY29udGVudCAoQm9keSBvbmx5KTogdHlwZSwgZm9ybWF0LCB0ZXh0IGFyZWEsIEJhY2svTmV4dCAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVQYXlsb2FkVGFiID09PSAnYm9keSdcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQgY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1lZGl0b3JcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdHlwZS1yb3dcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdHlwZS1sYWJlbFwiPlR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdHlwZS1yYWRpb3NcIj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sIFt2YWx1ZV09XCJwYXlsb2FkVHlwZVwiIFtzZWdtZW50c109XCJwYXlsb2FkVHlwZVNlZ21lbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uUGF5bG9hZFR5cGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLXNlZ21lbnRcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLXNlZ21lbnQtY29udHJvbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGF5bG9hZFR5cGUgPT09ICdyYXcnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWZvcm1hdC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZm9ybWF0LWxhYmVsXCI+Rm9ybWF0Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgKm5nSWY9XCJwYXlsb2FkRm9ybWF0Rm9ybVwiIFtmb3JtXT1cInBheWxvYWRGb3JtYXRGb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJwYXlsb2FkRm9ybWF0U2VsZWN0Q29uZmlnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWZvcm1hdC1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRm9ybWF0XCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwhLS0gUmF3OiB0ZXh0IGFyZWEgd2l0aCBsaW5lIG51bWJlcnMgKFBvc3RtYW4tc3R5bGUgcGF5bG9hZCBib2R5KSAtLT5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBheWxvYWRUeXBlID09PSAncmF3J1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1ib2R5XCIgI3BheWxvYWRFZGl0b3JXaXRoTGluZXNSZWY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZWRpdG9yLXdpdGgtbGluZXNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWxpbmUtbnVtYmVyc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgbiBvZiBwYXlsb2FkTGluZU51bWJlcnNcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtbGluZS1udW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInBheWxvYWRKc29uRXJyb3IgJiYgcGF5bG9hZEpzb25FcnJvci5saW5lID09PSBuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1saW5lLWVycm9yLWljb25cIiBbdGl0bGVdPVwicGF5bG9hZEpzb25FcnJvclRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlBhcnNlIGVycm9yIG9uIHRoaXMgbGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI3XCIgY3k9XCI3XCIgcj1cIjZcIiBmaWxsPVwiI0VGNDQ0NFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDRsNiA2TTEwIDRsLTYgNlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtbGluZS1udW0tdGV4dFwiPnt7IG4gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdGV4dGFyZWEtY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10ZXh0YXJlYSBjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtbWluLWgtMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhLS1lcnJvcic6IHBheWxvYWRKc29uRXJyb3J9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhICNwYXlsb2FkVGV4dGFyZWFSZWZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10ZXh0YXJlYS1pbnB1dCBjcWEtdy1mdWxsIGNxYS1vdXRsaW5lLW5vbmUgY3FhLWJveC1ib3JkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhLWlucHV0LS1lcnJvcic6IHBheWxvYWRKc29uRXJyb3J9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwYXlsb2FkVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidQYXlsb2FkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiISFwYXlsb2FkSnNvbkVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvblBheWxvYWRJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uUGF5bG9hZEtleWRvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJwYXlsb2FkSnNvbkVycm9yXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWpzb24tZXJyb3ItbXNnXCI+XG4gICAgICAgICAgICAgICAgICBJbnZhbGlkIEpTT04gZm9ybWF0LiBQbGVhc2UgY2hlY2sgeW91ciBzeW50YXguXG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIHgtd3d3LWZvcm0tdXJsZW5jb2RlZDogS2V54oCTVmFsdWUgcm93cywgYWRkL3JlbW92ZSBkeW5hbWljYWxseSAtLT5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBheWxvYWRUeXBlID09PSAneC13d3ctZm9ybS11cmxlbmNvZGVkJ1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1ncmlkIGNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsXCI+S2V5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWxcIj5WYWx1ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1sYWJlbC0tZW1wdHlcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGtleVZhbHVlUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUtleVZhbHVlXCIgW2Zvcm1Hcm91cF09XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtcm93XCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgna2V5Jyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2tleScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJLZXlcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIktleVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIlZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtaW5wdXRcIiBhcmlhTGFiZWw9XCJWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidSZW1vdmUgcm93J1wiIChjbGlja2VkKT1cInJlbW92ZUtleVZhbHVlUm93KGkpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjlCRkJGXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1hZGQtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiKyBBZGQgUm93XCJcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtYWRkLWJ0blwiIChjbGlja2VkKT1cImFkZEtleVZhbHVlUm93KClcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPCEtLSBGb3JtIERhdGE6IEtleeKAk1R5cGXigJNWYWx1ZSByb3dzOyBUeXBlIGlzIGEgZHJvcGRvd24gKFRleHQvRmlsZSksIGFkZC9yZW1vdmUgZHluYW1pY2FsbHkgLS0+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYXlsb2FkVHlwZSA9PT0gJ2Zvcm0tZGF0YSdcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbFwiPktleTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtbGFiZWxcIj5UeXBlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbFwiPlZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbCBjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbC0tZW1wdHlcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGtleVR5cGVWYWx1ZVJvd3M7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlLZXlUeXBlVmFsdWVcIiBbZm9ybUdyb3VwXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ2tleScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyb3cuZ2V0KCdrZXknKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiS2V5XCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIktleVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJyb3dcIiBbY29uZmlnXT1cImtleVR5cGVWYWx1ZVR5cGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLXR5cGUtc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIlZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIlZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInUmVtb3ZlIHJvdydcIiAoY2xpY2tlZCk9XCJyZW1vdmVLZXlUeXBlVmFsdWVSb3coaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5QkZCRlwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1hZGQtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiKyBBZGQgUm93XCJcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1hZGQtYnRuXCIgKGNsaWNrZWQpPVwiYWRkS2V5VHlwZVZhbHVlUm93KClcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBBZHZhbmNlZCBzZXR0aW5ncyAoc3RlcC1sZXZlbCkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbXQtNFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtdGV4dC1sZWZ0IGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLXB5LTIgY3FhLWJvcmRlci1iIGNxYS1ib3JkZXItZ3JheS0yMDBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkdmFuY2VkRXhwYW5kZWQgPSAhYWR2YW5jZWRFeHBhbmRlZFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTBweF1cIj5BZHZhbmNlZDwvc3Bhbj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LWxnIGNxYS10cmFuc2l0aW9uLXRyYW5zZm9ybVwiIFtjbGFzcy5jcWEtcm90YXRlLTE4MF09XCJhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgIGV4cGFuZF9tb3JlXG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhZHZhbmNlZEV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtbXQtMlwiPlxuICAgICAgICAgICAgPGNxYS1hZHZhbmNlZC12YXJpYWJsZXMtZm9ybVxuICAgICAgICAgICAgICBbYWR2YW5jZWRWYXJpYWJsZXNdPVwiYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlc1wiXG4gICAgICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlRm9ybV09XCJhZHZhbmNlZFZhcmlhYmxlc0Zvcm1cIlxuICAgICAgICAgICAgICAodmFyaWFibGVCb29sZWFuQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAodmFyaWFibGVWYWx1ZUNoYW5nZSk9XCJvbkFkdmFuY2VkVmFyaWFibGVWYWx1ZUNoYW5nZSgkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiPlxuICAgICAgICAgICAgPC9jcWEtYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG4gICAgPCEtLSBTdGVwIDI6IFZhcmlhYmxlIE5hbWU6IGlucHV0LCB2YWxpZGF0aW9uLCBCYWNrIC8gTmV4dCAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFN0ZXAgPT09IDJcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBhbmVsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTYgY3FhLWJveC1ib3JkZXIgY3FhLXctZnVsbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmFyaWFibGUtc2VjdGlvblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12YXJpYWJsZS1pbnB1dC13cmFwXCI+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbKHZhbHVlKV09XCJ2YXJpYWJsZU5hbWVcIiBbbGFiZWxdPVwiJydcIiBwbGFjZWhvbGRlcj1cIlZhcmlhYmxlIE5hbWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICBzaXplPVwibWRcIiAodmFsdWVDaGFuZ2UpPVwib25WYXJpYWJsZU5hbWVDaGFuZ2UoKVwiIGFyaWEtbGFiZWw9XCJWYXJpYWJsZSBOYW1lXCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHAgKm5nSWY9XCJ2YXJpYWJsZU5hbWVFcnJvclwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmFyaWFibGUtZXJyb3JcIiByb2xlPVwiYWxlcnRcIj57eyB2YXJpYWJsZU5hbWVFcnJvciB9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBTdGVwIDM6IFJlc3BvbnNlIEJvZHkgLyBTdGF0dXMgdGFicyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFN0ZXAgPT09IDNcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBhbmVsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTYgY3FhLWJveC1ib3JkZXIgY3FhLXctZnVsbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdGFicy13cmFwcGVyIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdGFic1wiPlxuICAgICAgICAgICAgPGNxYS1idXR0b24gKm5nRm9yPVwibGV0IHRhYiBvZiByZXNwb25zZVZlcmlmaWNhdGlvblRhYnNcIiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbdGV4dF09XCJ0YWIubGFiZWxcIlxuICAgICAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLXRhYicgKyAoYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIgPT09IHRhYi52YWx1ZSA/ICcgY3FhLWFwaS1lZGl0LXN0ZXAtdGFiLS1hY3RpdmUnIDogJycpXCJcbiAgICAgICAgICAgICAgKGNsaWNrZWQpPVwic2V0UmVzcG9uc2VWZXJpZmljYXRpb25UYWIodGFiLnZhbHVlKVwiPlxuICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBSZXNwb25zZSBCb2R5IHRhYiBjb250ZW50OiB2ZXJpZmljYXRpb24gZ3JpZCAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIgPT09ICdyZXNwb25zZS1ib2R5J1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtc3RlcDMtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1oZWFkZXItcm93IGNxYS1mbGV4IGNxYS1mbGV4LXJvdyBjcWEtanVzdGlmeS1lbmQgY3FhLWl0ZW1zLWNlbnRlciBjcWEtcHQtMCBjcWEtcHItMCBjcWEtcGItMiBjcWEtcGwtMFwiPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIHRleHQ9XCJBZGQgVmVyaWZpY2F0aW9uXCJcbiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1hZGQtbGlua1wiIChjbGlja2VkKT1cImFkZFZlcmlmaWNhdGlvblJvdygpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWdyaWQgY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWdyaWQtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5TLm5vPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+SlNPTiBQYXRoPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+VmVyaWZpY2F0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+RGF0YSBUeXBlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+RXhwZWN0ZWQgVmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWwgY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgdmVyaWZpY2F0aW9uUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeVZlcmlmaWNhdGlvblwiIFtmb3JtR3JvdXBdPVwicm93XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1yb3dcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1zbm9cIj57eyBpICsgMSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgnanNvblBhdGgnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2pzb25QYXRoJyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIkpzb24gUGF0aFwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBzaXplPVwic21cIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1pbnB1dFwiIGFyaWFMYWJlbD1cIkpTT04gUGF0aFwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cInJvd1wiIFtjb25maWddPVwidmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNlbGVjdCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJyb3dcIiBbY29uZmlnXT1cInZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNlbGVjdCBjcWEtdy1mdWxsXCJcbiAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25WZXJpZmljYXRpb25EYXRhVHlwZUNoYW5nZShyb3csICRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8IS0tIEV4cGVjdGVkIFZhbHVlOiB0ZXh0IGZvciBTdHJpbmcvQXJyYXkvT2JqZWN0LCBudW1iZXIgZm9yIE51bWJlciwgZHJvcGRvd24gZm9yIEJvb2xlYW4gLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicm93LmdldCgnZGF0YVR5cGUnKT8udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgKm5nU3dpdGNoQ2FzZT1cIidib29sZWFuJ1wiIFtmb3JtXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwidmVyaWZpY2F0aW9uRXhwZWN0ZWRWYWx1ZUJvb2xlYW5TZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1zZWxlY3QgY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWV4cGVjdGVkLXNlbGVjdCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0ICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiIFt2YWx1ZV09XCJyb3cuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiRXhwZWN0ZWQgVmFsdWUgKG51bWJlcilcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24taW5wdXQgY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWV4cGVjdGVkLW51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkV4cGVjdGVkIFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCAqbmdTd2l0Y2hEZWZhdWx0IFt2YWx1ZV09XCJyb3cuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRXhwZWN0ZWQgVmFsdWUgaW4gU3RyaW5nXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24taW5wdXRcIiBhcmlhTGFiZWw9XCJFeHBlY3RlZCBWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSByb3cnXCIgKGNsaWNrZWQpPVwicmVtb3ZlVmVyaWZpY2F0aW9uUm93KGkpXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBTdGF0dXMgdGFiIGNvbnRlbnQ6IFMubm8sIFZlcmlmaWNhdGlvbiBkcm9wZG93biwgRXhwZWN0ZWQgVmFsdWUsIGFkZC9yZW1vdmUgcm93cyAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWIgPT09ICdzdGF0dXMnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGVwMy1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWhlYWRlci1yb3cgY3FhLWZsZXggY3FhLWZsZXgtcm93IGNxYS1qdXN0aWZ5LWVuZCBjcWEtaXRlbXMtY2VudGVyIGNxYS1wdC0wIGNxYS1wci0wIGNxYS1wYi0yIGNxYS1wbC0wXCI+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgdGV4dD1cIkFkZCBWZXJpZmljYXRpb25cIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWFkZC1saW5rXCIgKGNsaWNrZWQpPVwiYWRkU3RhdHVzVmVyaWZpY2F0aW9uUm93KClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtc3RhdHVzLXZlcmlmaWNhdGlvblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtc3RhdHVzLXZlcmlmaWNhdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPlMubm88L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5WZXJpZmljYXRpb248L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5FeHBlY3RlZCBWYWx1ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWwtLWVtcHR5XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBzdGF0dXNWZXJpZmljYXRpb25Sb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5U3RhdHVzVmVyaWZpY2F0aW9uXCJcbiAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cInJvd1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtc3RhdHVzLXZlcmlmaWNhdGlvbi1yb3dcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1zbm9cIj57eyBpICsgMSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cInJvd1wiIFtjb25maWddPVwic3RhdHVzVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtc3RhdHVzLXZlcmlmaWNhdGlvbi1zZWxlY3QgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyb3cuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIkV4cGVjdGVkIFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJFeHBlY3RlZCBWYWx1ZVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1kZWxldGUnXCJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidSZW1vdmUgcm93J1wiIChjbGlja2VkKT1cInJlbW92ZVN0YXR1c1ZlcmlmaWNhdGlvblJvdyhpKVwiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1kZWxldGUtaWNvblwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwLjY2NjMgNlYxMi42NjY3SDUuMzMzMDFWNkgxMC42NjYzWk05LjY2NjM0IDJINi4zMzMwMUw1LjY2NjM0IDIuNjY2NjdIMy4zMzMwMVY0SDEyLjY2NjNWMi42NjY2N0gxMC4zMzNMOS42NjYzNCAyWk0xMS45OTk3IDQuNjY2NjdIMy45OTk2N1YxMi42NjY3QzMuOTk5NjcgMTMuNCA0LjU5OTY3IDE0IDUuMzMzMDEgMTRIMTAuNjY2M0MxMS4zOTk3IDE0IDExLjk5OTcgMTMuNCAxMS45OTk3IDEyLjY2NjdWNC42NjY2N1pcIlxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjlCRkJGXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gUmVzcG9uc2UgUHJldmlldyAtLT5cbiAgPGRpdiAjcmVzcG9uc2VQcmV2aWV3UmVmIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcmVzcG9uc2VcIj5cbiAgICA8aDMgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1yZXNwb25zZS10aXRsZSBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtYm9sZCBjcWEtbGVhZGluZy1bMjBweF0gY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTAgY3FhLW1iLVsxMnB4XSBjcWEtc2hyaW5rLTBcIj5SZXNwb25zZSBQcmV2aWV3PC9oMz5cbiAgICA8cHJlIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcmVzcG9uc2UtY29udGVudFwiPnt7IHJlc3BvbnNlUHJldmlldyB9fTwvcHJlPlxuICA8L2Rpdj5cblxuICA8IS0tIFN0ZXAgYWN0aW9uczogb25lIHJvdywgZnVsbCB3aWR0aC4gU3RlcCAxOiBDYW5jZWwgKyBOZXh0OyBTdGVwIDI6IEJhY2sgKyBOZXh0OyBTdGVwIDM6IEJhY2sgKyBDcmVhdGUgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zXCI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY3VycmVudFN0ZXBcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIjFcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJDYW5jZWxcIlxuICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWN0aW9ucy1idG4tY2FuY2VsXCIgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIk5leHRcIlxuICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWN0aW9ucy1idG4tbmV4dFwiIChjbGlja2VkKT1cIm9uTmV4dCgpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiMlwiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIkJhY2tcIlxuICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWN0aW9ucy1idG4tYmFja1wiIChjbGlja2VkKT1cIm9uQmFjaygpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiTmV4dFwiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1uZXh0XCIgKGNsaWNrZWQpPVwib25OZXh0KClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIzXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiQmFja1wiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1iYWNrXCIgKGNsaWNrZWQpPVwib25CYWNrKClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiAqbmdJZj1cIiFpc0NyZWF0aW5nU3RlcFwiIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiZWRpdE1vZGUgPyAnVXBkYXRlJyA6ICdDcmVhdGUnXCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLWNyZWF0ZVwiIChjbGlja2VkKT1cIm9uQ3JlYXRlKClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8IS0tIE1hdGNoIGNxYS1idXR0b24gZmxleDogYWN0aW9ucyByb3cgc3R5bGVzID4gY3FhLWJ1dHRvbiB7IGZsZXg6IDEgMSAwIH0g4oCUIGxvYWRlciBkaXYgbXVzdCBncm93IHNhbWUgd2lkdGggYXMgQ3JlYXRlIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDcmVhdGluZ1N0ZXBcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtbG9hZGVyIGNxYS13LWZ1bGwgY3FhLW1pbi1oLVszOHB4XSBjcWEtcm91bmRlZC1bOHB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgIDxjcWEtYmFkZ2UgbGFiZWw9XCJDcmVhdGluZ+KAplwiIGljb249XCJhdXRvcmVuZXdcIiBbaXNMb2FkaW5nXT1cInRydWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBbY2VudGVyQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtpbmxpbmVTdHlsZXNdPVwiJ21pbi1oZWlnaHQ6IDM4cHg7IGhlaWdodDogMzhweDsgd2lkdGg6IDEwMCU7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOydcIlxuICAgICAgICAgICAgdmFyaWFudD1cImluZm9cIiBzaXplPVwibWVkaXVtXCI+PC9jcWEtYmFkZ2U+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+Il19