@sunbird-cb/tree-hierarchy 0.0.5-cbrelease-4.8.26 → 0.0.5-cbrelease-4.8.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/action-bar/action-bar.component.mjs +3 -2
- package/esm2022/lib/components/approval/approval.component.mjs +3 -2
- package/esm2022/lib/components/approve-view/approve-view.component.mjs +4 -3
- package/esm2022/lib/components/categories-preview/categories-preview.component.mjs +3 -2
- package/esm2022/lib/components/category-edit/category-edit-module/category-edit-module.component.mjs +9 -10
- package/esm2022/lib/components/conforamtion-popup/conforamtion-popup.component.mjs +3 -2
- package/esm2022/lib/components/connector/connector.component.mjs +3 -2
- package/esm2022/lib/components/create-categories/create-categories.component.mjs +3 -2
- package/esm2022/lib/components/create-term/create-term.component.mjs +3 -2
- package/esm2022/lib/components/create-term-from-framework/create-term-from-framework.component.mjs +6 -4
- package/esm2022/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.mjs +102 -46
- package/esm2022/lib/components/pending-approval/pending-approval.component.mjs +3 -2
- package/esm2022/lib/components/term-card/term-card.component.mjs +32 -6
- package/esm2022/lib/components/tree-column-view/tree-column-view.component.mjs +35 -6
- package/esm2022/lib/components/tree-view/tree-view.component.mjs +127 -24
- package/esm2022/lib/containers/config-framework/config-framework.component.mjs +3 -2
- package/esm2022/lib/containers/dashboard/dashboard.component.mjs +3 -2
- package/esm2022/lib/models/framework.model.mjs +1 -1
- package/esm2022/lib/pipes/order-by.pipe.mjs +3 -2
- package/esm2022/lib/services/approval.service.mjs +3 -2
- package/esm2022/lib/services/connector.service.mjs +53 -6
- package/esm2022/lib/services/framework.service.mjs +153 -13
- package/esm2022/lib/services/local-connection.service.mjs +3 -2
- package/esm2022/lib/services/odcs.service.mjs +3 -2
- package/esm2022/lib/tree-hierarchy-routing.module.mjs +3 -2
- package/esm2022/lib/tree-hierarchy.component.mjs +3 -2
- package/esm2022/lib/tree-hierarchy.module.mjs +9 -4
- package/esm2022/lib/tree-hierarchy.service.mjs +12 -3
- package/esm2022/material.module.mjs +4 -3
- package/fesm2022/sunbird-cb-tree-hierarchy.mjs +535 -131
- package/fesm2022/sunbird-cb-tree-hierarchy.mjs.map +1 -1
- package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts.map +1 -1
- package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts +16 -3
- package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts.map +1 -1
- package/lib/components/term-card/term-card.component.d.ts +8 -2
- package/lib/components/term-card/term-card.component.d.ts.map +1 -1
- package/lib/components/tree-column-view/tree-column-view.component.d.ts +4 -1
- package/lib/components/tree-column-view/tree-column-view.component.d.ts.map +1 -1
- package/lib/components/tree-view/tree-view.component.d.ts +8 -2
- package/lib/components/tree-view/tree-view.component.d.ts.map +1 -1
- package/lib/models/framework.model.d.ts +1 -0
- package/lib/models/framework.model.d.ts.map +1 -1
- package/lib/services/connector.service.d.ts +1 -0
- package/lib/services/connector.service.d.ts.map +1 -1
- package/lib/services/framework.service.d.ts +9 -3
- package/lib/services/framework.service.d.ts.map +1 -1
- package/lib/tree-hierarchy.module.d.ts +2 -1
- package/lib/tree-hierarchy.module.d.ts.map +1 -1
- package/lib/tree-hierarchy.service.d.ts +2 -0
- package/lib/tree-hierarchy.service.d.ts.map +1 -1
- package/material.module.d.ts +2 -2
- package/package.json +1 -1
|
@@ -25,7 +25,7 @@ import * as i16 from "@angular/material/progress-spinner";
|
|
|
25
25
|
import * as i17 from "@angular/material/radio";
|
|
26
26
|
import * as i18 from "@angular/material/select";
|
|
27
27
|
import * as i19 from "@angular/material/tooltip";
|
|
28
|
-
|
|
28
|
+
class CreateTermComponent {
|
|
29
29
|
constructor(dialogRef, data, frameWorkService, fb, odcsService, _snackBar, cdr) {
|
|
30
30
|
this.dialogRef = dialogRef;
|
|
31
31
|
this.data = data;
|
|
@@ -837,6 +837,7 @@ export class CreateTermComponent {
|
|
|
837
837
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateTermComponent, deps: [{ token: i1.MatLegacyDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.FrameworkService }, { token: i3.UntypedFormBuilder }, { token: i4.OdcsService }, { token: i5.MatLegacySnackBar }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
838
838
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CreateTermComponent, selector: "lib-create-term", ngImport: i0, template: "<ng-container [ngSwitch]=\"data?.columnInfo?.code || 'defaultCreate'\">\n <ng-container *ngIf=\"disableMultiCreate\">\n <div class=\"flex flex-col flex-1 w-100 absolute loader-bg items-center pt-5 text-center\">\n <mat-spinner class=\"display-inline-block mb-5\" [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n <!-- <p>{{loaderMsg}}</p> -->\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault [ngTemplateOutlet]=\"themeCreate\"></ng-container>\n <ng-container *ngSwitchCase=\"'theme'\" [ngTemplateOutlet]=\"themeCreate\"></ng-container>\n <ng-container *ngSwitchCase=\"'subtheme'\" [ngTemplateOutlet]=\"themeCreate\"></ng-container>\n <ng-container *ngSwitchCase=\"'designation'\" [ngTemplateOutlet]=\"themeDesignation\"></ng-container>\n <ng-container *ngSwitchCase=\"'competency'\" [ngTemplateOutlet]=\"compTheme\"></ng-container>\n</ng-container>\n\n<ng-template #modalTitle>\n <!-- <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>{{data.columnInfo.name === 'Theme' ? app_strings.addCompetency : app_strings.createNew}} {{data.columnInfo.name}}</div>\n </ng-container> -->\n <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>Add {{data?.columnInfo?.config?.categoryDisplayName || data.columnInfo.name }} </div>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'view'\">\n <div class=\"dialog-title\" mat-dialog-title></div>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <div class=\"dialog-title\" mat-dialog-title>{{app_strings.edit}} {{data?.columnInfo?.config?.categoryDisplayName || data.columnInfo.name}}</div>\n </ng-container>\n</ng-template>\n\n<ng-template #defaultCreate>\n <div class=\"dialog\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <form [formGroup]=\"createTermForm\" novalidate (ngSubmit)=\"disableCreate?updateTermAssociations():saveTerm()\"\n class=\"defaultForm\">\n <mat-form-field appearance=\"outline\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <input matInput formControlName=\"name\" placeholder=\"{{app_strings.name}}\" [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onSelect($event.option, createTermForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name }}\n </mat-option>\n </mat-autocomplete>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <textarea matInput formControlName=\"description\" placeholder=\"{{app_strings.description}}\" maxlength=\"2000\"></textarea>\n </mat-form-field>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n *ngIf=\"!disableCreate || disableMultiCreate\">{{app_strings.create}}</button>\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n *ngIf=\"disableCreate\">{{app_strings.update}}</button>\n </footer>\n </form>\n </div>\n</ng-template>\n\n<ng-template #themeCreate >\n <div class=\"dialogNew\" [ngClass]=\"{'disabled-div': disableMultiCreate}\" >\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <div class=\"flex gap-4\">\n <ng-container *ngFor=\"let term of data?.selectedParentTerms\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{getCategoryName(term.category,term)}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput name=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [value]=\"term.name\" disabled>\n </mat-form-field>\n </div>\n </ng-container>\n </div>\n <div class=\"row-divider\"></div>\n <ng-container *ngIf=\"data?.mode !== 'multi-create'\">\n <form class=\"themeForm\" [formGroup]=\"createThemeForm\" novalidate\n (ngSubmit)=\"disableCreate?updateTermAssociations():saveThemeTerm()\">\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \" *ngIf=\"data.columnInfo?.code !== 'competencyarea' && data.mode === 'view'\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Name\n </label>\n \n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select placeholder=\"{{app_strings?.name}}\" formControlName=\"name\" id=\"name\" #name (selectionChange)=\"change($event,createThemeForm)\">\n <input #search autocomplete=\"off\" placeholder=\"Search\" class=\"assigneeSearch\"\n (keydown.space)=\"$event.stopPropagation()\" (keyup)=\"onKey($event)\" matInput>\n <mat-option *ngFor=\"let option of filteredMasterList\" (blur)=\"updateDname(option?.title, createThemeForm)\" [disabled]=\"onDisableTheme(option)\" [value]=\"option\">{{option.title}}</mat-option>\n <mat-option *ngIf=\"filteredMasterList.length === 0\" disabled>\n No results found!\n </mat-option>\n </mat-select>\n\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name\n placeholder=\"{{app_strings.name}}\"\n (blur)=\"updateDname(name.value, createThemeForm)\" maxlength=\"70\"> -->\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </div>\n <div class=\"flex-1 flex-col\">\n \n <div class=\"flex\">\n\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Display Name\n </label>\n <mat-icon class=\"info-icon cursor-pointer\" [matTooltip]=\"toolTipText\" \n matTooltipClass=\"tooltip-sec\">info_outline</mat-icon>\n \n </div>\n \n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"dname\" id=\"dname\" #dname \n placeholder=\"Field automatically generated from the name field.\" maxlength=\"70\" >\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\"> -->\n <!-- <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n <!-- <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error> -->\n </mat-form-field>\n </div>\n </div>\n <div class=\"flex gap-4 \" *ngIf=\"data.columnInfo?.code === 'competencyarea' && data.mode === 'view'\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Name\n </label>\n \n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input autocomplete=\"off\" \n matInput [value]=\"data?.childrenData?.name\" disabled>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n Description\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <textarea matInput [cdkTextareaAutosize] [cdkAutosizeMaxRows]=\"10\"\n [cdkAutosizeMinRows]=\"3\" formControlName=\"description\"\n placeholder=\"{{app_strings.description}}\" maxlength=\"2000\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"createThemeForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(createThemeForm, data)\" [disabled]=\"createThemeForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </form>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <form class=\"themeForm\" [formGroup]=\"createThemeFormMulti\" novalidate\n (ngSubmit)=\"disableCreate?updateTermAssociations():saveThemeTerm()\">\n <div class=\"flex flex-end mb-4\">\n <button type=\"button\" class=\"mat-button flex items-center \" *ngIf=\"data.mode === 'multi-create'\" (click)=\"addThemeFields()\">\n <mat-icon class=\"mr-2 mat-icon-custom \">add_circle_outline</mat-icon>\n Add more\n </button>\n </div>\n <mat-accordion formArrayName=\"themeFields\">\n <mat-expansion-panel #mep=\"matExpansionPanel\" *ngFor=\"let field of themeFieldsControls; let i = index; let isFirst = first\" \n class=\"margin-bottom-l\" [formGroupName]=\"i\" [expanded]=\"isFirst\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n {{getExpansionTitle(field)}} \n </mat-panel-title>\n <button mat-button type=\"button\" *ngIf=\"data.mode === 'multi-create'\"\n (click)=\"removeThemeFields(i)\">\n <mat-icon class=\"mat-icon-custom \">delete</mat-icon>\n </button>\n </mat-expansion-panel-header>\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Name\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name\n placeholder=\"{{app_strings.name}}\"\n (blur)=\"updateDname(name.value, createThemeFormMulti, i)\" maxlength=\"70\"> -->\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n \n <mat-select placeholder=\"{{app_strings?.name}}\" formControlName=\"name\" id=\"name\" #name (selectionChange)=\"change($event,createThemeFormMulti, i )\">\n <input #search autocomplete=\"off\" placeholder=\"Search\" class=\"assigneeSearch\"\n (keydown.space)=\"$event.stopPropagation()\" (keyup)=\"onKey($event)\" matInput>\n <mat-option *ngFor=\"let option of filteredMasterList\" (blur)=\"updateDname(option?.title, createThemeFormMulti, i)\" [disabled]=\"onDisableTheme(option)\" [value]=\"option\">{{option.title}} </mat-option>\n <mat-option *ngIf=\"filteredMasterList.length === 0\" disabled>\n No results found!\n </mat-option>\n \n </mat-select>\n \n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings?.alreadyExist}}</mat-error>\n </div>\n <div class=\"flex-1 flex-col\">\n <div class=\"flex\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Display Name\n </label>\n \n \n <mat-icon class=\"info-icon cursor-pointer\" [matTooltip]=\"toolTipText\" \n matTooltipClass=\"tooltip-sec\">info_outline</mat-icon>\n \n \n \n \n \n </div>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"dname\" id=\"dname\" #dname\n placeholder=\"Field automatically generated from the name field.\" maxlength=\"70\" [disabled]=\"name?.value?.length === 0\">\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\"> -->\n <!-- <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n <!-- <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error> -->\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n Description\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <textarea matInput [cdkTextareaAutosize] [cdkAutosizeMaxRows]=\"10\"\n [cdkAutosizeMinRows]=\"3\" formControlName=\"description\"\n placeholder=\"{{app_strings.description}}\" maxlength=\"2000\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div class=\"flex flex-end\">\n <button mat-raised-button color=\"primary\" type=\"button\" (click)=\"mep.expanded = false\"\n [disabled]=\"createThemeFormMulti?.get('themeFields')['controls'][i].invalid\">\n Save\n </button>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"createThemeForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.add_btn}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"createThemeFormMulti.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreate(createThemeFormMulti, data)\">\n {{app_strings.add_btn}}\n </button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(createThemeForm, data)\"\n [disabled]=\"createThemeForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </form>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #themeDesignation>\n <div class=\"themDesignation\">\n <div class=\"dialogNew\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <div class=\"mb-2\">\n <span class=\"organisation\">Organisation</span>\n <div class=\"org-name pl-4 flex items-center\">\n <!-- <span>Department of Fisheries</span> -->\n <span>{{data?.columnInfo?.name}}</span>\n </div>\n </div>\n <div class=\"row-divider\"></div>\n <div class=\"flex w-full items-center justify-end mt-4\">\n <a class=\"add-designation flex justify-center items-center\" (click)=\"addDesignation()\">\n <mat-icon class=\"add-icon mr-2\">add_circle_outline</mat-icon>\n <span>Add Designations</span>\n </a>\n </div>\n <div class=\"mt-5\">\n <form [formGroup]=\"createThemeForm\">\n <mat-accordion class=\"flex flex-col gap-2\" formArrayName=\"designations\">\n <ng-container *ngFor=\"let designation of designationControls; let i = index\">\n <mat-expansion-panel [formGroupName]=\"i\" class=\"designation-panel\" [expanded]=\"panelOpenState[i]\">\n <mat-expansion-panel-header>\n <div class=\"flex w-full items-center justify-end\">\n <mat-icon class=\"deletDesignation mr-4\" (click)=\"deleteDesignation(i)\">delete</mat-icon>\n </div>\n </mat-expansion-panel-header>\n <div class=\"flex flex-col gap-2 \">\n <div class=\"w-full\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\">\n Designation Name <mat-icon class=\"info-icon\">info</mat-icon>\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"name\" placeholder=\"Type here\" [matAutocomplete]=\"auto\" (change)=\"clearSelectedDesignaionOnChange(i, $event)\">\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onSelect($event.option, designation)\">\n <mat-option *ngFor=\"let option of getFilteredDesignationList(i)\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete>\n <!-- <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error> -->\n </mat-form-field>\n <!-- <mat-error>{{app_strings.alreadyExist}}</mat-error> -->\n </div>\n <div class=\"w-full\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\">\n Description <mat-icon class=\"info-icon\">info</mat-icon>\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <textarea matInput formControlName=\"designationDescription\"\n placeholder=\"Type the decription in fewer than 600 characters\"></textarea>\n </mat-form-field>\n </div>\n \n <div class=\"w-full flex justify-end items-center\">\n <button mat-raised-button class=\"saveDesignaton flex justify-center items-center\"\n (click)=\"saveDesignation(i)\">Save</button>\n </div>\n </div>\n </mat-expansion-panel>\n </ng-container>\n </mat-accordion>\n </form>\n </div>\n </div>\n <div class=\"flex justify-end items-center gap-4 mt-5 designation-footer\">\n <button mat-raised-button class=\"cancel flex justify-center items-center\"\n (click)=\"cancel()\">Cancel</button>\n <button mat-raised-button [disabled]=\"!enableAddBtn\" class=\"addBtn flex justify-center items-center\" (click)=\"submitDesignation()\">Add</button>\n </div>\n </div>\n</ng-template>\n<ng-template #compTheme>\n <div class=\"dialogNew\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <div class=\"flex gap-4\">\n <ng-container *ngFor=\"let term of data?.selectedParentTerms\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{term.category}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput name=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [value]=\"term.name\" disabled>\n </mat-form-field>\n </div>\n </ng-container>\n </div>\n <div class=\"row-divider\"></div>\n <form [formGroup]=\"competencyForm\">\n <div class=\"title-text\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{'Select Area'}}\n </label>\n <div class=\"mt-5\">\n <mat-radio-group aria-label=\"Select an option\" formControlName=\"compArea\">\n <mat-radio-button class=\"learning-section\" *ngFor=\"let item of allCompetency\" [value]=\"item\" (change)=\"onSelectionArea(item)\">{{item.name}}</mat-radio-button>\n \n </mat-radio-group>\n </div>\n </div>\n \n <ng-container *ngIf=\"data?.mode !== 'multi-create'\">\n <form class=\"themeForm\" [formGroup]=\"createThemeForm\" novalidate\n (ngSubmit)=\"disableCreate?updateTermAssociations():saveThemeTerm()\">\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Add Name\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"name\" id=\"name\" #name\n placeholder=\"{{app_strings.name}}\"\n (blur)=\"updateDname(name.value, createThemeForm)\">\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </div>\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Display Name\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"dname\" id=\"dname\" #dname\n placeholder=\"Competency display name\">\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\"> -->\n <!-- <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n <!-- <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error> -->\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label required\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n Description\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <textarea matInput [cdkTextareaAutosize] [cdkAutosizeMaxRows]=\"10\"\n [cdkAutosizeMinRows]=\"3\" formControlName=\"description\"\n placeholder=\"{{app_strings.description}}\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"createThemeForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(createThemeForm, data)\" [disabled]=\"createThemeForm?.invalid\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </form>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n \n <div class=\"flex flex-end mb-4\">\n <button type=\"button\" class=\"mat-button flex items-center \" *ngIf=\"data.mode === 'multi-create'\" (click)=\"addCompetencyTheme()\">\n <mat-icon class=\"mr-2 mat-icon-custom \">add_circle_outline</mat-icon>\n Add {{data.columnInfo.name}}\n </button>\n </div>\n <mat-accordion formArrayName=\"compThemeFields\">\n <mat-expansion-panel *ngFor=\"let field of competencyForm?.get('compThemeFields')['controls']; let i = index; let isFirst = first\" \n class=\"margin-bottom-l\" [formGroupName]=\"i\" [expanded]=\"isFirst\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <!-- {{name?.value}} -->\n </mat-panel-title>\n <button mat-button type=\"button\" *ngIf=\"data.mode === 'multi-create'\"\n (click)=\"removeCompFields(i)\">\n <mat-icon class=\"mat-icon-custom \">delete</mat-icon>\n </button>\n </mat-expansion-panel-header>\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Select Competency Theme\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select placeholder=\"Choose the Competency Theme\" formControlName=\"competencyTheme\">\n <!-- <input #search autocomplete=\"off\" placeholder=\"Search\" class=\"assigneeSearch\"\n (keydown.space)=\"$event.stopPropagation()\" formControlName=\"assigneeText\" matInput> -->\n <mat-option *ngFor=\"let option of filteredallCompetencyTheme\" [value]=\"option\" (onSelectionChange)=\"OnThemeSelection($event)\" >{{option.name}}</mat-option>\n </mat-select>\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </div>\n <!-- <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Display Name\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"dname\" id=\"dname\" #dname\n placeholder=\"Competency display name\">\n </mat-form-field>\n </div> -->\n </div>\n\n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label required\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n Select Competency Sub-Theme\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <mat-select placeholder=\"Choose the Competency Theme\" formControlName=\"competencySubTheme\">\n <!-- <input #search autocomplete=\"off\" placeholder=\"Search\" class=\"assigneeSearch\"\n (keydown.space)=\"$event.stopPropagation()\" formControlName=\"assigneeText\" matInput> -->\n <mat-option *ngFor=\"let option of filteredallCompetencySubTheme\" [value]=\"option\">{{option.name}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"createThemeForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"createThemeFormMulti.invalid\" *ngIf=\"!disableCreate\" (click)=\"multiCreate(createThemeFormMulti, data)\">\n {{app_strings.create}}\n </button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(createThemeForm, data)\"\n [disabled]=\"createThemeForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </ng-container>\n </form>\n \n </div>\n</ng-template>", styles: [".gap-3{gap:1.25rem}.gap-4{gap:1.5rem}.row-divider{width:100%;border-top:1px solid rgba(0,0,0,.08);margin:1rem 0}.defaultForm{padding:16px;display:flex;gap:16px;flex-direction:column}.theme-actions{display:flex;justify-content:right;padding:1em 0;gap:16px;margin-top:30px;border-top:1px solid rgba(0,0,0,.0784313725)}.dialog .mat-dialog-title{padding:1em;margin-bottom:0;background:#00000014}.dialog .mat-form-field{padding:0;background:#fff;border-radius:2px}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper{padding-bottom:0}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper .mat-form-field-infix{padding:15px;margin-top:0;border-top:0}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper .mat-form-field-infix textarea{resize:none}.dialog .mat-form-field-disabled{background:#00000014}.dialog .actions{display:flex;flex-direction:row;justify-content:space-between;padding:0 1em 1em}.dialog .mat-error{padding:0 25px;margin-top:-10px}.dialogNew{padding:0 1rem}.dialogNew .mat-dialog-title{padding:1em;margin-bottom:0}.dialogNew .actions{display:flex;justify-content:right;padding:1em 0;gap:16px;margin-top:16px;border-top:1px solid rgba(0,0,0,.0784313725)}.dialogNew .mat-error{margin-top:-10px}.dialog-title{align-items:center;display:flex}.flex{display:flex}.flex-col{display:flex;flex-direction:column}.mr-5{margin-right:1.5rem}.flex-1{flex:1 1}.margin-remove-bottom{margin-bottom:0}::ng-deep .custom-dialog-container{max-height:90vh}::ng-deep .custom-dialog-container .mat-dialog-container{padding:0;border-radius:0;background:#00000014}@media only screen and (max-width: 1024px){::ng-deep .cdk-overlay-pane{width:40%!important}}@media only screen and (max-width: 992px){::ng-deep .cdk-overlay-pane{width:45%!important}}@media only screen and (max-width: 1024px){.dialog{font-size:12px}.dialog .dialog-title{font-size:24px;height:1em}.dialog button{font-size:12px;line-height:3.5em}.dialog .mat-raised-button{padding:0 3em}}.flex-align{align-items:center;justify-content:flex-start}::ng-deep mat-form-field .mat-form-field-infix .mat-form-field-label,::ng-deep mat-form-field .mat-form-field-infix .mat-select-value{line-height:normal!important}ws-widget-btn-page-back-admin{margin-left:-270px}.max-wid{max-width:400px}::ng-deep .mat-form-field.mat-focused .mat-form-field-label{color:#333232!important}.margin-right-10{margin-right:10px!important}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}::ng-deep .mat-tab-header{margin:0 3rem}.heading{color:#222}.heading.mt-10{margin-top:2.5rem!important}.img-column{flex:100px 0 0}.input-column{flex:auto}.radio-toolbar input[type=radio]{opacity:0;position:fixed;width:0}.radio-toolbar{padding:10px 0}.radio-toolbar label{display:inline-block;padding:7px 21px;font-size:14px;background:#fff 0% 0% no-repeat padding-box;border:1px solid #5F5F5F;border-radius:4px;margin:0 10px 10px 0;color:#5f5f5f;cursor:pointer;transition:all .125s ease-in-out}.radio-toolbar input[type=radio]:checked+label{background:#0074b6 0% 0% no-repeat padding-box;border-radius:6px;border-color:#0074b6;color:#fff}.radio-toolbar input[type=radio]:focus+label{background:#0074b6 0% 0% no-repeat padding-box;border-radius:6px;border-color:#0074b6;color:#fff}.mar{margin-left:30px;min-width:175px}.radio-toolbar label:hover{background:none;border-color:#0074b6;color:#0074b6}::ng-deep .mat-form-field{width:100%}::ng-deep .mat-form-field.full-width{max-width:100%}::ng-deep .mat-form-field.no-pb .mat-form-field-wrapper{padding-bottom:0}.combined-field{width:100%}.w-full-imp{width:100%!important}.btn-success{background-color:#0075b7!important;border-radius:4px;width:240px;box-shadow:none;margin-right:16px}.btn-success.btn-responsive{width:100%}.btn-success:disabled,.btn-success[disabled]{opacity:.6}.btn-danger{height:30px;width:30px}.color-danger{font-size:30px;height:30px;width:30px;color:#e44}::ng-deep .mat-form-field-outline{min-height:40px;background:#fff;border-radius:4px}::ng-deep .mat-form-field-outline .mat-form-field-outline-start{border:1px solid rgba(112,112,112,.4117647059);border-radius:4px 0 0 4px;min-width:8px;border-right-style:none}::ng-deep .mat-form-field-outline .mat-form-field-outline-gap{border:1px solid currentColor;border-radius:82px;border-left-style:none;border-right-style:none}::ng-deep .mat-form-field-outline .mat-form-field-outline-end{border:1px solid rgba(112,112,112,.4117647059);border-left-style:none;border-radius:0 4px 4px 0}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick{min-height:40px;background:#fff;border-radius:4px}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-start{border-radius:4px 0 0 4px;min-width:8px;border:1px solid currentColor;border-right-style:none}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-gap{border-width:1px;border:1px solid currentColor;border-radius:4px;border-left-style:none;border-right-style:none}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-end{border-width:1px;border-radius:0 4px 4px 0;border:1px solid currentColor;border-left-style:none}::ng-deep .mat-form-field-disabled .mat-form-field-outline{background:#ebebeb!important}::ng-deep .mat-form-field-infix{padding:0;margin:0;border:none}::ng-deep .mat-form-field-flex{min-height:40px;align-items:center}::ng-deep .mat-form-field-infix{padding:0;margin:8px 0 0;border:none}.form-label{color:#222;font-size:14px;margin-bottom:.5rem;font-weight:700;font-family:Lato}.form-input{font-size:14px;font-weight:400;font-family:Lato}input.mat-input-element{color:#5f5f5f}::ng-deep .mat-radio-group{padding-bottom:1.34375em}::ng-deep .mat-chip-list-wrapper{margin:0!important}::ng-deep .mat-chip{font-weight:400;background:#f1f9ff 0% 0% no-repeat padding-box!important;border-radius:12px!important;color:#0074b6!important}::ng-deep .mat-chip:hover{filter:brightness(90%)}::ng-deep .mat-chip .mat-chip-remove{opacity:1!important;color:#0074b6!important;border-radius:50%}::ng-deeptextarea .mat-input-element{padding:8px 0}::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}::ng-deep .mat-checkbox .mat-checkbox-frame{border-radius:4px!important}::ng-deep .mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:none!important}::ng-deep .mat-tab-label-container .mat-tab-list .mat-tab-labels .mat-tab-label{font-size:18px;color:#222}::ng-deep .mat-tab-label-container .mat-tab-list .mat-tab-labels .mat-tab-label-active .mat-tab-label-content{color:#0074b6}::ng-deep .mat-tab-label-container .mat-tab-list .mat-ink-bar{height:3px;background-color:#0074b6!important}.form-control{background:#fff 0% 0% no-repeat padding-box;border:1px solid rgba(112,112,112,.4117647059);border-radius:4px;display:block}.form-control::placeholder{color:#bebebe;font-size:14px}.form-control:focus{border:2px solid #0074b6;outline:none}.input-wrapper{flex:1;display:flex;flex-wrap:wrap;flex-direction:column}::ng-deep .mat-checkbox-inner-container{height:23px!important;width:23px!important}.flex-expand{flex:1!important}.heading{font-weight:600;font-family:Montserrat;font-size:1.25rem;display:block;padding:0px 0px 1rem 0}::ng-deep .multiselect-dropdown{margin-bottom:20px}::ng-deep .multiselect-dropdown .dropdown-btn{border:1px solid #ccc!important;width:92%!important}::ng-deep .multiselect-dropdown .dropdown-list .filter-textbox input{width:90%!important}.organisation{color:#212529;font-weight:700;font-size:14px;font-family:Lato}.org-name{height:50px;border:1px solid #e2e2e2;border-radius:5px;background-color:#ebebeb;font-size:14px}.add-designation{height:25px;color:#1b4ca1!important;font-weight:500;font-size:14px;font-family:Lato;cursor:pointer}.add-designation .add-icon{color:#1b4ca1!important;height:24px;width:24px;font-size:24px}.info-icon{width:14px;height:14px;font-size:14px;color:#a7a9ae!important}.themDesignation{max-height:90vh;overflow-y:auto}.designation-panel{margin-bottom:0!important;background-color:#eef1f7!important;border:1px solid #DBE0E9;box-shadow:none!important}.designation-panel .deletDesignation{font-size:18px;width:14px;height:14px;color:#5f6063}.designation-panel .saveDesignaton{color:#fff;height:40px;width:80px;background-color:#1b4ca1;border:1px solid #1B4CA1;font-weight:700;font-size:14px;font-family:Lato}.designation-footer{padding:1rem;border-top:1px solid #efefef}.cancel{width:93px;height:40px;font-weight:700;font-size:14px;font-family:Lato;border:1px solid #eee;color:#363636}.addBtn{color:#fff!important;height:40px;width:80px;background-color:#1b4ca1!important;border:1px solid #1B4CA1;font-weight:700;font-size:14px;font-family:Lato}.info-icon{color:#0009;font-size:19px;position:relative;top:3px}::ng-deep .tooltip-sec{background-color:0!important;font-size:12px!important;font-family:500!important;color:#fff!important}.assigneeSearch{height:50px!important;font-size:15px;padding-left:12px;box-sizing:border-box}.disabled-div{pointer-events:none;opacity:.5;background-color:#f9f9f9}.loader-bg{background:#ffffffcf;inset:0;transform:translate(-50% -50%);pointer-events:unset;z-index:999999;display:flex;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i6.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i7.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i7.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i10.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i11.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i11.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i11.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i11.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i13.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i14.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i14.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i15.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "component", type: i16.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i17.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i17.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i18.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i19.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }] }); }
|
|
839
839
|
}
|
|
840
|
+
export { CreateTermComponent };
|
|
840
841
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateTermComponent, decorators: [{
|
|
841
842
|
type: Component,
|
|
842
843
|
args: [{ selector: 'lib-create-term', template: "<ng-container [ngSwitch]=\"data?.columnInfo?.code || 'defaultCreate'\">\n <ng-container *ngIf=\"disableMultiCreate\">\n <div class=\"flex flex-col flex-1 w-100 absolute loader-bg items-center pt-5 text-center\">\n <mat-spinner class=\"display-inline-block mb-5\" [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n <!-- <p>{{loaderMsg}}</p> -->\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault [ngTemplateOutlet]=\"themeCreate\"></ng-container>\n <ng-container *ngSwitchCase=\"'theme'\" [ngTemplateOutlet]=\"themeCreate\"></ng-container>\n <ng-container *ngSwitchCase=\"'subtheme'\" [ngTemplateOutlet]=\"themeCreate\"></ng-container>\n <ng-container *ngSwitchCase=\"'designation'\" [ngTemplateOutlet]=\"themeDesignation\"></ng-container>\n <ng-container *ngSwitchCase=\"'competency'\" [ngTemplateOutlet]=\"compTheme\"></ng-container>\n</ng-container>\n\n<ng-template #modalTitle>\n <!-- <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>{{data.columnInfo.name === 'Theme' ? app_strings.addCompetency : app_strings.createNew}} {{data.columnInfo.name}}</div>\n </ng-container> -->\n <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>Add {{data?.columnInfo?.config?.categoryDisplayName || data.columnInfo.name }} </div>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'view'\">\n <div class=\"dialog-title\" mat-dialog-title></div>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <div class=\"dialog-title\" mat-dialog-title>{{app_strings.edit}} {{data?.columnInfo?.config?.categoryDisplayName || data.columnInfo.name}}</div>\n </ng-container>\n</ng-template>\n\n<ng-template #defaultCreate>\n <div class=\"dialog\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <form [formGroup]=\"createTermForm\" novalidate (ngSubmit)=\"disableCreate?updateTermAssociations():saveTerm()\"\n class=\"defaultForm\">\n <mat-form-field appearance=\"outline\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <input matInput formControlName=\"name\" placeholder=\"{{app_strings.name}}\" [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onSelect($event.option, createTermForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name }}\n </mat-option>\n </mat-autocomplete>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <textarea matInput formControlName=\"description\" placeholder=\"{{app_strings.description}}\" maxlength=\"2000\"></textarea>\n </mat-form-field>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n *ngIf=\"!disableCreate || disableMultiCreate\">{{app_strings.create}}</button>\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n *ngIf=\"disableCreate\">{{app_strings.update}}</button>\n </footer>\n </form>\n </div>\n</ng-template>\n\n<ng-template #themeCreate >\n <div class=\"dialogNew\" [ngClass]=\"{'disabled-div': disableMultiCreate}\" >\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <div class=\"flex gap-4\">\n <ng-container *ngFor=\"let term of data?.selectedParentTerms\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{getCategoryName(term.category,term)}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput name=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [value]=\"term.name\" disabled>\n </mat-form-field>\n </div>\n </ng-container>\n </div>\n <div class=\"row-divider\"></div>\n <ng-container *ngIf=\"data?.mode !== 'multi-create'\">\n <form class=\"themeForm\" [formGroup]=\"createThemeForm\" novalidate\n (ngSubmit)=\"disableCreate?updateTermAssociations():saveThemeTerm()\">\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \" *ngIf=\"data.columnInfo?.code !== 'competencyarea' && data.mode === 'view'\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Name\n </label>\n \n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select placeholder=\"{{app_strings?.name}}\" formControlName=\"name\" id=\"name\" #name (selectionChange)=\"change($event,createThemeForm)\">\n <input #search autocomplete=\"off\" placeholder=\"Search\" class=\"assigneeSearch\"\n (keydown.space)=\"$event.stopPropagation()\" (keyup)=\"onKey($event)\" matInput>\n <mat-option *ngFor=\"let option of filteredMasterList\" (blur)=\"updateDname(option?.title, createThemeForm)\" [disabled]=\"onDisableTheme(option)\" [value]=\"option\">{{option.title}}</mat-option>\n <mat-option *ngIf=\"filteredMasterList.length === 0\" disabled>\n No results found!\n </mat-option>\n </mat-select>\n\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name\n placeholder=\"{{app_strings.name}}\"\n (blur)=\"updateDname(name.value, createThemeForm)\" maxlength=\"70\"> -->\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </div>\n <div class=\"flex-1 flex-col\">\n \n <div class=\"flex\">\n\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Display Name\n </label>\n <mat-icon class=\"info-icon cursor-pointer\" [matTooltip]=\"toolTipText\" \n matTooltipClass=\"tooltip-sec\">info_outline</mat-icon>\n \n </div>\n \n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"dname\" id=\"dname\" #dname \n placeholder=\"Field automatically generated from the name field.\" maxlength=\"70\" >\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\"> -->\n <!-- <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n <!-- <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error> -->\n </mat-form-field>\n </div>\n </div>\n <div class=\"flex gap-4 \" *ngIf=\"data.columnInfo?.code === 'competencyarea' && data.mode === 'view'\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Name\n </label>\n \n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input autocomplete=\"off\" \n matInput [value]=\"data?.childrenData?.name\" disabled>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n Description\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <textarea matInput [cdkTextareaAutosize] [cdkAutosizeMaxRows]=\"10\"\n [cdkAutosizeMinRows]=\"3\" formControlName=\"description\"\n placeholder=\"{{app_strings.description}}\" maxlength=\"2000\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"createThemeForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(createThemeForm, data)\" [disabled]=\"createThemeForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </form>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <form class=\"themeForm\" [formGroup]=\"createThemeFormMulti\" novalidate\n (ngSubmit)=\"disableCreate?updateTermAssociations():saveThemeTerm()\">\n <div class=\"flex flex-end mb-4\">\n <button type=\"button\" class=\"mat-button flex items-center \" *ngIf=\"data.mode === 'multi-create'\" (click)=\"addThemeFields()\">\n <mat-icon class=\"mr-2 mat-icon-custom \">add_circle_outline</mat-icon>\n Add more\n </button>\n </div>\n <mat-accordion formArrayName=\"themeFields\">\n <mat-expansion-panel #mep=\"matExpansionPanel\" *ngFor=\"let field of themeFieldsControls; let i = index; let isFirst = first\" \n class=\"margin-bottom-l\" [formGroupName]=\"i\" [expanded]=\"isFirst\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n {{getExpansionTitle(field)}} \n </mat-panel-title>\n <button mat-button type=\"button\" *ngIf=\"data.mode === 'multi-create'\"\n (click)=\"removeThemeFields(i)\">\n <mat-icon class=\"mat-icon-custom \">delete</mat-icon>\n </button>\n </mat-expansion-panel-header>\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Name\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name\n placeholder=\"{{app_strings.name}}\"\n (blur)=\"updateDname(name.value, createThemeFormMulti, i)\" maxlength=\"70\"> -->\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n \n <mat-select placeholder=\"{{app_strings?.name}}\" formControlName=\"name\" id=\"name\" #name (selectionChange)=\"change($event,createThemeFormMulti, i )\">\n <input #search autocomplete=\"off\" placeholder=\"Search\" class=\"assigneeSearch\"\n (keydown.space)=\"$event.stopPropagation()\" (keyup)=\"onKey($event)\" matInput>\n <mat-option *ngFor=\"let option of filteredMasterList\" (blur)=\"updateDname(option?.title, createThemeFormMulti, i)\" [disabled]=\"onDisableTheme(option)\" [value]=\"option\">{{option.title}} </mat-option>\n <mat-option *ngIf=\"filteredMasterList.length === 0\" disabled>\n No results found!\n </mat-option>\n \n </mat-select>\n \n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings?.alreadyExist}}</mat-error>\n </div>\n <div class=\"flex-1 flex-col\">\n <div class=\"flex\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Display Name\n </label>\n \n \n <mat-icon class=\"info-icon cursor-pointer\" [matTooltip]=\"toolTipText\" \n matTooltipClass=\"tooltip-sec\">info_outline</mat-icon>\n \n \n \n \n \n </div>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"dname\" id=\"dname\" #dname\n placeholder=\"Field automatically generated from the name field.\" maxlength=\"70\" [disabled]=\"name?.value?.length === 0\">\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\"> -->\n <!-- <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n <!-- <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error> -->\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n Description\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <textarea matInput [cdkTextareaAutosize] [cdkAutosizeMaxRows]=\"10\"\n [cdkAutosizeMinRows]=\"3\" formControlName=\"description\"\n placeholder=\"{{app_strings.description}}\" maxlength=\"2000\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div class=\"flex flex-end\">\n <button mat-raised-button color=\"primary\" type=\"button\" (click)=\"mep.expanded = false\"\n [disabled]=\"createThemeFormMulti?.get('themeFields')['controls'][i].invalid\">\n Save\n </button>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"createThemeForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.add_btn}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"createThemeFormMulti.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreate(createThemeFormMulti, data)\">\n {{app_strings.add_btn}}\n </button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(createThemeForm, data)\"\n [disabled]=\"createThemeForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </form>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #themeDesignation>\n <div class=\"themDesignation\">\n <div class=\"dialogNew\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <div class=\"mb-2\">\n <span class=\"organisation\">Organisation</span>\n <div class=\"org-name pl-4 flex items-center\">\n <!-- <span>Department of Fisheries</span> -->\n <span>{{data?.columnInfo?.name}}</span>\n </div>\n </div>\n <div class=\"row-divider\"></div>\n <div class=\"flex w-full items-center justify-end mt-4\">\n <a class=\"add-designation flex justify-center items-center\" (click)=\"addDesignation()\">\n <mat-icon class=\"add-icon mr-2\">add_circle_outline</mat-icon>\n <span>Add Designations</span>\n </a>\n </div>\n <div class=\"mt-5\">\n <form [formGroup]=\"createThemeForm\">\n <mat-accordion class=\"flex flex-col gap-2\" formArrayName=\"designations\">\n <ng-container *ngFor=\"let designation of designationControls; let i = index\">\n <mat-expansion-panel [formGroupName]=\"i\" class=\"designation-panel\" [expanded]=\"panelOpenState[i]\">\n <mat-expansion-panel-header>\n <div class=\"flex w-full items-center justify-end\">\n <mat-icon class=\"deletDesignation mr-4\" (click)=\"deleteDesignation(i)\">delete</mat-icon>\n </div>\n </mat-expansion-panel-header>\n <div class=\"flex flex-col gap-2 \">\n <div class=\"w-full\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\">\n Designation Name <mat-icon class=\"info-icon\">info</mat-icon>\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"name\" placeholder=\"Type here\" [matAutocomplete]=\"auto\" (change)=\"clearSelectedDesignaionOnChange(i, $event)\">\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onSelect($event.option, designation)\">\n <mat-option *ngFor=\"let option of getFilteredDesignationList(i)\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete>\n <!-- <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error> -->\n </mat-form-field>\n <!-- <mat-error>{{app_strings.alreadyExist}}</mat-error> -->\n </div>\n <div class=\"w-full\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\">\n Description <mat-icon class=\"info-icon\">info</mat-icon>\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <textarea matInput formControlName=\"designationDescription\"\n placeholder=\"Type the decription in fewer than 600 characters\"></textarea>\n </mat-form-field>\n </div>\n \n <div class=\"w-full flex justify-end items-center\">\n <button mat-raised-button class=\"saveDesignaton flex justify-center items-center\"\n (click)=\"saveDesignation(i)\">Save</button>\n </div>\n </div>\n </mat-expansion-panel>\n </ng-container>\n </mat-accordion>\n </form>\n </div>\n </div>\n <div class=\"flex justify-end items-center gap-4 mt-5 designation-footer\">\n <button mat-raised-button class=\"cancel flex justify-center items-center\"\n (click)=\"cancel()\">Cancel</button>\n <button mat-raised-button [disabled]=\"!enableAddBtn\" class=\"addBtn flex justify-center items-center\" (click)=\"submitDesignation()\">Add</button>\n </div>\n </div>\n</ng-template>\n<ng-template #compTheme>\n <div class=\"dialogNew\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <div class=\"flex gap-4\">\n <ng-container *ngFor=\"let term of data?.selectedParentTerms\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{term.category}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput name=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [value]=\"term.name\" disabled>\n </mat-form-field>\n </div>\n </ng-container>\n </div>\n <div class=\"row-divider\"></div>\n <form [formGroup]=\"competencyForm\">\n <div class=\"title-text\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{'Select Area'}}\n </label>\n <div class=\"mt-5\">\n <mat-radio-group aria-label=\"Select an option\" formControlName=\"compArea\">\n <mat-radio-button class=\"learning-section\" *ngFor=\"let item of allCompetency\" [value]=\"item\" (change)=\"onSelectionArea(item)\">{{item.name}}</mat-radio-button>\n \n </mat-radio-group>\n </div>\n </div>\n \n <ng-container *ngIf=\"data?.mode !== 'multi-create'\">\n <form class=\"themeForm\" [formGroup]=\"createThemeForm\" novalidate\n (ngSubmit)=\"disableCreate?updateTermAssociations():saveThemeTerm()\">\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Add Name\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"name\" id=\"name\" #name\n placeholder=\"{{app_strings.name}}\"\n (blur)=\"updateDname(name.value, createThemeForm)\">\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </div>\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Display Name\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"dname\" id=\"dname\" #dname\n placeholder=\"Competency display name\">\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\"> -->\n <!-- <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n <!-- <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error> -->\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label required\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n Description\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <textarea matInput [cdkTextareaAutosize] [cdkAutosizeMaxRows]=\"10\"\n [cdkAutosizeMinRows]=\"3\" formControlName=\"description\"\n placeholder=\"{{app_strings.description}}\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"createThemeForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(createThemeForm, data)\" [disabled]=\"createThemeForm?.invalid\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </form>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n \n <div class=\"flex flex-end mb-4\">\n <button type=\"button\" class=\"mat-button flex items-center \" *ngIf=\"data.mode === 'multi-create'\" (click)=\"addCompetencyTheme()\">\n <mat-icon class=\"mr-2 mat-icon-custom \">add_circle_outline</mat-icon>\n Add {{data.columnInfo.name}}\n </button>\n </div>\n <mat-accordion formArrayName=\"compThemeFields\">\n <mat-expansion-panel *ngFor=\"let field of competencyForm?.get('compThemeFields')['controls']; let i = index; let isFirst = first\" \n class=\"margin-bottom-l\" [formGroupName]=\"i\" [expanded]=\"isFirst\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <!-- {{name?.value}} -->\n </mat-panel-title>\n <button mat-button type=\"button\" *ngIf=\"data.mode === 'multi-create'\"\n (click)=\"removeCompFields(i)\">\n <mat-icon class=\"mat-icon-custom \">delete</mat-icon>\n </button>\n </mat-expansion-panel-header>\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Select Competency Theme\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select placeholder=\"Choose the Competency Theme\" formControlName=\"competencyTheme\">\n <!-- <input #search autocomplete=\"off\" placeholder=\"Search\" class=\"assigneeSearch\"\n (keydown.space)=\"$event.stopPropagation()\" formControlName=\"assigneeText\" matInput> -->\n <mat-option *ngFor=\"let option of filteredallCompetencyTheme\" [value]=\"option\" (onSelectionChange)=\"OnThemeSelection($event)\" >{{option.name}}</mat-option>\n </mat-select>\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </div>\n <!-- <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Display Name\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"dname\" id=\"dname\" #dname\n placeholder=\"Competency display name\">\n </mat-form-field>\n </div> -->\n </div>\n\n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label required\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n Select Competency Sub-Theme\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <mat-select placeholder=\"Choose the Competency Theme\" formControlName=\"competencySubTheme\">\n <!-- <input #search autocomplete=\"off\" placeholder=\"Search\" class=\"assigneeSearch\"\n (keydown.space)=\"$event.stopPropagation()\" formControlName=\"assigneeText\" matInput> -->\n <mat-option *ngFor=\"let option of filteredallCompetencySubTheme\" [value]=\"option\">{{option.name}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"createThemeForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"createThemeFormMulti.invalid\" *ngIf=\"!disableCreate\" (click)=\"multiCreate(createThemeFormMulti, data)\">\n {{app_strings.create}}\n </button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(createThemeForm, data)\"\n [disabled]=\"createThemeForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </ng-container>\n </form>\n \n </div>\n</ng-template>", styles: [".gap-3{gap:1.25rem}.gap-4{gap:1.5rem}.row-divider{width:100%;border-top:1px solid rgba(0,0,0,.08);margin:1rem 0}.defaultForm{padding:16px;display:flex;gap:16px;flex-direction:column}.theme-actions{display:flex;justify-content:right;padding:1em 0;gap:16px;margin-top:30px;border-top:1px solid rgba(0,0,0,.0784313725)}.dialog .mat-dialog-title{padding:1em;margin-bottom:0;background:#00000014}.dialog .mat-form-field{padding:0;background:#fff;border-radius:2px}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper{padding-bottom:0}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper .mat-form-field-infix{padding:15px;margin-top:0;border-top:0}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper .mat-form-field-infix textarea{resize:none}.dialog .mat-form-field-disabled{background:#00000014}.dialog .actions{display:flex;flex-direction:row;justify-content:space-between;padding:0 1em 1em}.dialog .mat-error{padding:0 25px;margin-top:-10px}.dialogNew{padding:0 1rem}.dialogNew .mat-dialog-title{padding:1em;margin-bottom:0}.dialogNew .actions{display:flex;justify-content:right;padding:1em 0;gap:16px;margin-top:16px;border-top:1px solid rgba(0,0,0,.0784313725)}.dialogNew .mat-error{margin-top:-10px}.dialog-title{align-items:center;display:flex}.flex{display:flex}.flex-col{display:flex;flex-direction:column}.mr-5{margin-right:1.5rem}.flex-1{flex:1 1}.margin-remove-bottom{margin-bottom:0}::ng-deep .custom-dialog-container{max-height:90vh}::ng-deep .custom-dialog-container .mat-dialog-container{padding:0;border-radius:0;background:#00000014}@media only screen and (max-width: 1024px){::ng-deep .cdk-overlay-pane{width:40%!important}}@media only screen and (max-width: 992px){::ng-deep .cdk-overlay-pane{width:45%!important}}@media only screen and (max-width: 1024px){.dialog{font-size:12px}.dialog .dialog-title{font-size:24px;height:1em}.dialog button{font-size:12px;line-height:3.5em}.dialog .mat-raised-button{padding:0 3em}}.flex-align{align-items:center;justify-content:flex-start}::ng-deep mat-form-field .mat-form-field-infix .mat-form-field-label,::ng-deep mat-form-field .mat-form-field-infix .mat-select-value{line-height:normal!important}ws-widget-btn-page-back-admin{margin-left:-270px}.max-wid{max-width:400px}::ng-deep .mat-form-field.mat-focused .mat-form-field-label{color:#333232!important}.margin-right-10{margin-right:10px!important}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}::ng-deep .mat-tab-header{margin:0 3rem}.heading{color:#222}.heading.mt-10{margin-top:2.5rem!important}.img-column{flex:100px 0 0}.input-column{flex:auto}.radio-toolbar input[type=radio]{opacity:0;position:fixed;width:0}.radio-toolbar{padding:10px 0}.radio-toolbar label{display:inline-block;padding:7px 21px;font-size:14px;background:#fff 0% 0% no-repeat padding-box;border:1px solid #5F5F5F;border-radius:4px;margin:0 10px 10px 0;color:#5f5f5f;cursor:pointer;transition:all .125s ease-in-out}.radio-toolbar input[type=radio]:checked+label{background:#0074b6 0% 0% no-repeat padding-box;border-radius:6px;border-color:#0074b6;color:#fff}.radio-toolbar input[type=radio]:focus+label{background:#0074b6 0% 0% no-repeat padding-box;border-radius:6px;border-color:#0074b6;color:#fff}.mar{margin-left:30px;min-width:175px}.radio-toolbar label:hover{background:none;border-color:#0074b6;color:#0074b6}::ng-deep .mat-form-field{width:100%}::ng-deep .mat-form-field.full-width{max-width:100%}::ng-deep .mat-form-field.no-pb .mat-form-field-wrapper{padding-bottom:0}.combined-field{width:100%}.w-full-imp{width:100%!important}.btn-success{background-color:#0075b7!important;border-radius:4px;width:240px;box-shadow:none;margin-right:16px}.btn-success.btn-responsive{width:100%}.btn-success:disabled,.btn-success[disabled]{opacity:.6}.btn-danger{height:30px;width:30px}.color-danger{font-size:30px;height:30px;width:30px;color:#e44}::ng-deep .mat-form-field-outline{min-height:40px;background:#fff;border-radius:4px}::ng-deep .mat-form-field-outline .mat-form-field-outline-start{border:1px solid rgba(112,112,112,.4117647059);border-radius:4px 0 0 4px;min-width:8px;border-right-style:none}::ng-deep .mat-form-field-outline .mat-form-field-outline-gap{border:1px solid currentColor;border-radius:82px;border-left-style:none;border-right-style:none}::ng-deep .mat-form-field-outline .mat-form-field-outline-end{border:1px solid rgba(112,112,112,.4117647059);border-left-style:none;border-radius:0 4px 4px 0}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick{min-height:40px;background:#fff;border-radius:4px}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-start{border-radius:4px 0 0 4px;min-width:8px;border:1px solid currentColor;border-right-style:none}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-gap{border-width:1px;border:1px solid currentColor;border-radius:4px;border-left-style:none;border-right-style:none}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-end{border-width:1px;border-radius:0 4px 4px 0;border:1px solid currentColor;border-left-style:none}::ng-deep .mat-form-field-disabled .mat-form-field-outline{background:#ebebeb!important}::ng-deep .mat-form-field-infix{padding:0;margin:0;border:none}::ng-deep .mat-form-field-flex{min-height:40px;align-items:center}::ng-deep .mat-form-field-infix{padding:0;margin:8px 0 0;border:none}.form-label{color:#222;font-size:14px;margin-bottom:.5rem;font-weight:700;font-family:Lato}.form-input{font-size:14px;font-weight:400;font-family:Lato}input.mat-input-element{color:#5f5f5f}::ng-deep .mat-radio-group{padding-bottom:1.34375em}::ng-deep .mat-chip-list-wrapper{margin:0!important}::ng-deep .mat-chip{font-weight:400;background:#f1f9ff 0% 0% no-repeat padding-box!important;border-radius:12px!important;color:#0074b6!important}::ng-deep .mat-chip:hover{filter:brightness(90%)}::ng-deep .mat-chip .mat-chip-remove{opacity:1!important;color:#0074b6!important;border-radius:50%}::ng-deeptextarea .mat-input-element{padding:8px 0}::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}::ng-deep .mat-checkbox .mat-checkbox-frame{border-radius:4px!important}::ng-deep .mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:none!important}::ng-deep .mat-tab-label-container .mat-tab-list .mat-tab-labels .mat-tab-label{font-size:18px;color:#222}::ng-deep .mat-tab-label-container .mat-tab-list .mat-tab-labels .mat-tab-label-active .mat-tab-label-content{color:#0074b6}::ng-deep .mat-tab-label-container .mat-tab-list .mat-ink-bar{height:3px;background-color:#0074b6!important}.form-control{background:#fff 0% 0% no-repeat padding-box;border:1px solid rgba(112,112,112,.4117647059);border-radius:4px;display:block}.form-control::placeholder{color:#bebebe;font-size:14px}.form-control:focus{border:2px solid #0074b6;outline:none}.input-wrapper{flex:1;display:flex;flex-wrap:wrap;flex-direction:column}::ng-deep .mat-checkbox-inner-container{height:23px!important;width:23px!important}.flex-expand{flex:1!important}.heading{font-weight:600;font-family:Montserrat;font-size:1.25rem;display:block;padding:0px 0px 1rem 0}::ng-deep .multiselect-dropdown{margin-bottom:20px}::ng-deep .multiselect-dropdown .dropdown-btn{border:1px solid #ccc!important;width:92%!important}::ng-deep .multiselect-dropdown .dropdown-list .filter-textbox input{width:90%!important}.organisation{color:#212529;font-weight:700;font-size:14px;font-family:Lato}.org-name{height:50px;border:1px solid #e2e2e2;border-radius:5px;background-color:#ebebeb;font-size:14px}.add-designation{height:25px;color:#1b4ca1!important;font-weight:500;font-size:14px;font-family:Lato;cursor:pointer}.add-designation .add-icon{color:#1b4ca1!important;height:24px;width:24px;font-size:24px}.info-icon{width:14px;height:14px;font-size:14px;color:#a7a9ae!important}.themDesignation{max-height:90vh;overflow-y:auto}.designation-panel{margin-bottom:0!important;background-color:#eef1f7!important;border:1px solid #DBE0E9;box-shadow:none!important}.designation-panel .deletDesignation{font-size:18px;width:14px;height:14px;color:#5f6063}.designation-panel .saveDesignaton{color:#fff;height:40px;width:80px;background-color:#1b4ca1;border:1px solid #1B4CA1;font-weight:700;font-size:14px;font-family:Lato}.designation-footer{padding:1rem;border-top:1px solid #efefef}.cancel{width:93px;height:40px;font-weight:700;font-size:14px;font-family:Lato;border:1px solid #eee;color:#363636}.addBtn{color:#fff!important;height:40px;width:80px;background-color:#1b4ca1!important;border:1px solid #1B4CA1;font-weight:700;font-size:14px;font-family:Lato}.info-icon{color:#0009;font-size:19px;position:relative;top:3px}::ng-deep .tooltip-sec{background-color:0!important;font-size:12px!important;font-family:500!important;color:#fff!important}.assigneeSearch{height:50px!important;font-size:15px;padding-left:12px;box-sizing:border-box}.disabled-div{pointer-events:none;opacity:.5;background-color:#f9f9f9}.loader-bg{background:#ffffffcf;inset:0;transform:translate(-50% -50%);pointer-events:unset;z-index:999999;display:flex;align-items:center;justify-content:center}\n"] }]
|
|
@@ -844,4 +845,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
844
845
|
type: Inject,
|
|
845
846
|
args: [MAT_DIALOG_DATA]
|
|
846
847
|
}] }, { type: i2.FrameworkService }, { type: i3.UntypedFormBuilder }, { type: i4.OdcsService }, { type: i5.MatLegacySnackBar }, { type: i0.ChangeDetectorRef }]; } });
|
|
847
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXRlcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RyZWUtaGllcmFyY2h5L3NyYy9saWIvY29tcG9uZW50cy9jcmVhdGUtdGVybS9jcmVhdGUtdGVybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL2NyZWF0ZS10ZXJtL2NyZWF0ZS10ZXJtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQXNDLHNCQUFzQixJQUFJLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhJLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUEwRCxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwRyxPQUFPLEtBQUssWUFBWSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUk5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUTNCLE1BQU0sT0FBTyxtQkFBbUI7SUF3QzlCLFlBQ1MsU0FBNEMsRUFDbkIsSUFBUyxFQUNqQyxnQkFBa0MsRUFDbEMsRUFBc0IsRUFDdEIsV0FBd0IsRUFDeEIsU0FBc0IsRUFDdEIsR0FBcUI7UUFOdEIsY0FBUyxHQUFULFNBQVMsQ0FBbUM7UUFDbkIsU0FBSSxHQUFKLElBQUksQ0FBSztRQUNqQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQ3RCLGdC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Q0FBQTtvQkFLMUIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO2lCQUNkO3FCQUFNO29CQUNMLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO2lCQUNyQjtZQUNILENBQUMsRUFBRSxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLGlDQUFpQyxDQUFDLENBQUE7WUFDbkYsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNILENBQUM7K0dBaGpDVSxtQkFBbUIsb0RBMENwQixlQUFlO21HQTFDZCxtQkFBbUIsdURDcEJoQyxzenlDQXVsQmM7OzRGRG5rQkQsbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLGlCQUFpQjs7MEJBK0N4QixNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0TGVnYWN5RGlhbG9nUmVmIGFzIE1hdERpYWxvZ1JlZiwgTUFUX0xFR0FDWV9ESUFMT0dfREFUQSBhcyBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJztcbmltcG9ydCB7IEZyYW1ld29ya1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mcmFtZXdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBzdGFydFdpdGgsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFVudHlwZWRGb3JtQXJyYXksIFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbi8vIGltcG9ydCB7IElkZW50aWZpZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xuaW1wb3J0IHsgTlNGcmFtZXdvcmsgfSBmcm9tICcuLi8uLi9tb2RlbHMvZnJhbWV3b3JrLm1vZGVsJztcbmltcG9ydCAqIGFzIGFwcENvbnN0YW50cyBmcm9tICcuLi8uLi9jb25zdGFudHMvYXBwLWNvbnN0YW50JztcbmltcG9ydCB7IGxhYmVscyB9IGZyb20gJy4uLy4uL2xhYmVscy9zdHJpbmdzJztcbmltcG9ydCB7IENhcmQgfSBmcm9tICcuLi8uLi9tb2RlbHMvdmFyaWFibGUtdHlwZS5tb2RlbCc7XG5pbXBvcnQgeyBPZGNzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL29kY3Muc2VydmljZSc7XG5pbXBvcnQgeyBNYXRMZWdhY3lTbmFja0JhciBhcyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1zbmFjay1iYXInO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jcmVhdGUtdGVybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jcmVhdGUtdGVybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NyZWF0ZS10ZXJtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVUZXJtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgbmFtZTogc3RyaW5nID0gJyc7XG4gIHRlcm1MaXN0czogQXJyYXk8Q2FyZD4gPSBbXTtcbiAgZmlsdGVkVGVybUxpc3RzOiBhbnk7XG4gIGNyZWF0ZVRlcm1Gb3JtOiBhbnlcbiAgY3JlYXRlVGhlbWVGb3JtOiBVbnR5cGVkRm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gIGNyZWF0ZVRoZW1lRm9ybU11bHRpOiBVbnR5cGVkRm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gIGRpc2FibGVDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZGlzYWJsZVVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBkaXNhYmxlTXVsdGlDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNUZXJtRXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2VsZWN0ZWRUZXJtOiBDYXJkID0ge307XG4gIGFwcF9zdHJpbmdzID0gbGFiZWxzO1xuICBjb2xDb2RlID0gJydcbiAgc2F2ZWREZXNpZ25hdGlvbnM6IGFueSA9IFtdXG4gIGFkZGVkRGVzaWduYXRpb25Db3VudCA9IDBcbiAgZGVzaWduYXRpb25zTGlzdCA9IFtdXG4gIHBhbmVsT3BlblN0YXRlOiBhbnlbXSA9IFtdO1xuICBhbGxDb21wZXRlbmN5OmFueVtdPVtdXG4gIHNlbGV0ZWRDb21wZXRlbmN5QXJlYTogYW55XG4gIGFsbENvbXBldGVuY3lUaGVtZTphbnlbXT1bXVxuICBmaWx0ZXJlZGFsbENvbXBldGVuY3lUaGVtZTphbnlbXT1bXVxuICBhbGxDb21wZXRlbmN5U3VidGhlbWU6YW55W109W11cbiAgZmlsdGVyZWRhbGxDb21wZXRlbmN5U3ViVGhlbWU6YW55W109W11cbiAgY29tcGV0ZW5jeUZvcm06IFVudHlwZWRGb3JtR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHt9KVxuICBjb21wTGFiZWx0ZXh0OnN0cmluZyA9ICcnXG4gIG1hc3Rlckxpc3Q6YW55W109W107XG4gIGZpbHRlcmVkTWFzdGVyTGlzdDphbnlbXT1bXTtcbiAgZXhwYW5zaW9uVGl0bGU6c3RyaW5nID0gJydcbiAgcHJpdmF0ZSBkZWJvdW5jZVRpbWVvdXQ6IGFueTtcbiAgcHJpdmF0ZSBkZWJvdW5jZURlbGF5OiBudW1iZXIgPSA1MDA7XG4gIHZhbHVlcz0gJydcbiAgdG9vbFRpcFRleHQgPSBgWW91IGNhbiBjdXN0b21pemUgdGhpcyBkaXNwbGF5IG5hbWUgZm9yIGxlYXJuZXJzIHRvIHNlZSwgYXMgaXQncyB3aGF0IHRoZXkgd2lsbCB2aWV3LmBcbiAgcHJldmlvdXNDYXRlZ29yeUNvZGU6c3RyaW5nID0gJyc7XG4gIHByZXZpb3VzVGVybUNvZGU6c3RyaW5nID0gJyc7XG4gIHByZXZpb3VzQ2F0Q29kZTpzdHJpbmcgPSAnJztcbiAgcHJldmlvdXNUZXJtQ2F0Q29kZTpzdHJpbmc9JydcbiAgc2VsZWN0ZWRUZXJtQXJyYXk6IGFueT0gW11cblxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxDcmVhdGVUZXJtQ29tcG9uZW50PixcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueSxcbiAgICBwcml2YXRlIGZyYW1lV29ya1NlcnZpY2U6IEZyYW1ld29ya1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBmYjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgb2Rjc1NlcnZpY2U6IE9kY3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgX3NuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBwcml2YXRlIGNkcjpDaGFuZ2VEZXRlY3RvclJlZlxuICApIHsgXG4gICAgdGhpcy5nZXRLY21TZWFyY2goKVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgXG4gICAgdGhpcy50ZXJtTGlzdHMgPSB0aGlzLmRhdGEuY29sdW1uSW5mby5jaGlsZHJlblxuICAgIHRoaXMuY29tcExhYmVsdGV4dCA9IHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvbmZpZy5sYWJlbE5hbWVcbiAgICBcbiAgICB0aGlzLmluaXRUZXJtRm9ybSgpXG4gICAgXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXG4gIH1cblxuICBpbml0VGVybUZvcm0oKSB7XG4gICAgdGhpcy5jcmVhdGVUZXJtRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgbmFtZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgZGVzY3JpcHRpb246IFsnJ11cbiAgICB9KVxuICAgIHRoaXMuY3JlYXRlVGhlbWVGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBuYW1lOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBkbmFtZTogW3t2YWx1ZTogJycsIGRpc2FibGVkOiB0cnVlfSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGRlc2NyaXB0aW9uOiBbJyddXG4gICAgfSlcbiAgICAvLyB0aGlzLmNyZWF0ZVRoZW1lRm9ybS5jb250cm9sc1snZG5hbWUnXS5kaXNhYmxlKClcbiAgICAvLyB0aGlzLmNyZWF0ZVRoZW1lRm9ybS5jb250cm9sc1snbmFtZSddLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKT0+e1xuICAgIC8vICAgaWYodmFsdWUubGVuZ3RoKXtcbiAgICAvLyAgICB0aGlzLmNyZWF0ZVRoZW1lRm9ybS5jb250cm9sc1snZG5hbWUnXS5lbmFibGUoKVxuICAgIC8vICAgfVxuICAgIC8vIH0pXG4gICAgdGhpcy5jcmVhdGVUaGVtZUZvcm1NdWx0aSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgdGhlbWVGaWVsZHM6dGhpcy5mYi5hcnJheShbdGhpcy5jcmVhdGVUaGVtZUZpZWxkcygpXSlcbiAgICB9KVxuICAgIC8vIHRoaXMuaW5pdGlhbGl6ZVZhbHVlQ2hhbmdlcygpXG4gICAgdGhpcy5maWx0ZWRUZXJtTGlzdHMgPSB0aGlzLmNyZWF0ZVRlcm1Gb3JtLmdldCgnbmFtZScpLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgc3RhcnRXaXRoKCcnKSxcbiAgICAgIG1hcCh2YWx1ZSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0aGlzLmNyZWF0ZVRlcm1Gb3JtLmNvbnRyb2xzLmRuYW1lKSB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVUZXJtRm9ybS5jb250cm9scy5kbmFtZS5lbmFibGUoKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3JlYXRlVGVybUZvcm0uY29udHJvbHMuZG5hbWUpIHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZVRlcm1Gb3JtLmNvbnRyb2xzLmRuYW1lLmRpc2FibGUoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXIodmFsdWUgfHwgJycpXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gaWYgbW9kZSBpcyBcInZpZXdcIiB0aGVuIGNoZWNrIGZvciB3aGljaCB0eXBlIG9mIGZvcm0gaGFzIHRvIGJlIHVzZWQgYW5kIHRoZW4gYXBwZW5kIHRoZSB2YWx1ZXMgaW4gZm9ybVxuICAgIGlmIChcbiAgICAgIHRoaXMuZGF0YSAmJlxuICAgICAgKHRoaXMuZGF0YS5tb2RlID09PSAndmlldycpXG4gICAgKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpIHtcbiAgICAgICAgY2FzZSAndGhlbWUnOiB0aGlzLnVwZGF0ZUZvcm1WaWV3KHRoaXMuY3JlYXRlVGhlbWVGb3JtLCB0aGlzLmRhdGEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnc3VidGhlbWUnOiB0aGlzLnVwZGF0ZUZvcm1WaWV3KHRoaXMuY3JlYXRlVGhlbWVGb3JtLCB0aGlzLmRhdGEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDogdGhpcy51cGRhdGVGb3JtVmlldyh0aGlzLmNyZWF0ZVRoZW1lRm9ybSwgdGhpcy5kYXRhKVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICB0aGlzLmRpc2FibGVDcmVhdGUgPSB0cnVlXG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGEgJiZcbiAgICAgICh0aGlzLmRhdGEubW9kZSA9PT0gJ2VkaXQnKSkge1xuICAgICAgc3dpdGNoICh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKSB7XG4gICAgICAgIGNhc2UgJ3RoZW1lJzogdGhpcy51cGRhdGVGb3JtRWRpdCh0aGlzLmNyZWF0ZVRoZW1lRm9ybSwgdGhpcy5kYXRhKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3N1YnRoZW1lJzogdGhpcy51cGRhdGVGb3JtRWRpdCh0aGlzLmNyZWF0ZVRoZW1lRm9ybSwgdGhpcy5kYXRhKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6IHRoaXMudXBkYXRlRm9ybUVkaXQodGhpcy5jcmVhdGVUaGVtZUZvcm0sIHRoaXMuZGF0YSlcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhICYmXG4gICAgICAodGhpcy5kYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnKSkge1xuICAgICAgLy8gc3dpdGNoICh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKSB7XG4gICAgICAvLyAgIGNhc2UgJ3RoZW1lJzogdGhpcy51cGRhdGVGb3JtRWRpdCh0aGlzLmNyZWF0ZVRoZW1lRm9ybSwgdGhpcy5kYXRhKVxuICAgICAgLy8gICAgIGJyZWFrXG4gICAgICAvLyAgIGNhc2UgJ3N1YnRoZW1lJzogdGhpcy51cGRhdGVGb3JtRWRpdCh0aGlzLmNyZWF0ZVRoZW1lRm9ybSwgdGhpcy5kYXRhKVxuICAgICAgLy8gICAgIGJyZWFrXG4gICAgICAvLyAgIGRlZmF1bHQ6IHRoaXMudXBkYXRlRm9ybUVkaXQodGhpcy5jcmVhdGVUaGVtZUZvcm0sIHRoaXMuZGF0YSlcbiAgICAgIC8vICAgICBicmVha1xuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIGdldENvbXB0ZW5jeURhdGEoKXtcbiAgICAvLyBjb25zdCBmaWx0ZXJPYmogPSB7XG4gICAgLy8gICBzZWFyY2g6IHtcbiAgICAvLyAgICAgdHlwZTogJ0NvbXBldGVuY3kgQXJlYScsXG4gICAgLy8gICB9LFxuICAgIC8vICAgZmlsdGVyOiB7XG4gICAgLy8gICAgIGlzRGV0YWlsOiB0cnVlLFxuICAgIC8vICAgfSxcbiAgICAvLyB9XG4gICAgLy8gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldEZpbHRlckVudGl0eShmaWx0ZXJPYmopLnN1YnNjcmliZSgoZGF0YSk9PntcbiAgICBcbiAgICAvLyAgaWYoZGF0YSAmJiBkYXRhLmxlbmd0aCl7XG4gICAgLy8gICB0aGlzLmFsbENvbXBldGVuY3kgPSBkYXRhXG4gICAgLy8gIH1cbiAgICAvLyB9KVxuICB9XG4gIC8vIGluaXRpYWxpemVWYWx1ZUNoYW5nZXMoKSB7XG4gIC8vICAgdGhpcy50aGVtZUZpZWxkcy5jb250cm9scy5mb3JFYWNoKChncm91cDogRm9ybUdyb3VwKSA9PiB7XG4gIC8vICAgICB0aGlzLnNldFVwVmFsdWVDaGFuZ2VzKGdyb3VwKTtcbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIC8vIHNldFVwVmFsdWVDaGFuZ2VzKGdyb3VwOiBGb3JtR3JvdXApIHtcbiAgLy8gICBncm91cC5jb250cm9sc1snbmFtZSddLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAvLyAgICAgY29uc3QgZG5hbWVDb250cm9sID0gZ3JvdXAuY29udHJvbHNbJ2RuYW1lJ107XG4gIC8vICAgICBkbmFtZUNvbnRyb2wuZGlzYWJsZSgpO1xuICAvLyAgICAgaWYgKHZhbHVlLnRyaW0oKS5sZW5ndGgpIHtcbiAgLy8gICAgICAgZG5hbWVDb250cm9sLmVuYWJsZSgpO1xuICAvLyAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgZG5hbWVDb250cm9sLmRpc2FibGUoKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIGdldCB0aGVtZUZpZWxkcygpOiBVbnR5cGVkRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVUaGVtZUZvcm1NdWx0aS5nZXQoJ3RoZW1lRmllbGRzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgfVxuXG4gIGdldCB0aGVtZUZpZWxkc0NvbnRyb2xzKCkge1xuICAgIGNvbnN0IHRoZW1lRmllbGRzID0gdGhpcy5jcmVhdGVUaGVtZUZvcm1NdWx0aS5nZXQoJ3RoZW1lRmllbGRzJylcbiAgICByZXR1cm4gKDxhbnk+dGhlbWVGaWVsZHMpWydjb250cm9scyddXG4gIH1cblxuICBjcmVhdGVUaGVtZUZpZWxkcygpOiBVbnR5cGVkRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cCh7XG4gICAgICBuYW1lOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBkbmFtZTogW3t2YWx1ZTogJycsIGRpc2FibGVkOiB0cnVlfSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGRlc2NyaXB0aW9uOiBbJycsXVxuICAgIH0pO1xuICB9XG5cbiAgYWRkVGhlbWVGaWVsZHMoKSB7XG4gICAgdGhpcy52YWx1ZXMgPSAnJ1xuICAgIHRoaXMuZmlsdGVyZWRNYXN0ZXJMaXN0ID0gWy4uLnRoaXMubWFzdGVyTGlzdF1cbiAgICBpZiAodGhpcy5kYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnKSB7XG4gICAgICAvLyB0aGlzLnRoZW1lRmllbGRzLnB1c2godGhpcy5jcmVhdGVUaGVtZUZpZWxkcygpKTtcbiAgICAgIHRoaXMudGhlbWVGaWVsZHMuaW5zZXJ0KDAsIHRoaXMuY3JlYXRlVGhlbWVGaWVsZHMoKSk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlVGhlbWVGaWVsZHMoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScpIHtcbiAgICAgIHRoaXMudGhlbWVGaWVsZHMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIH1cbiAgfVxuICBnZXRDcmVhdGVOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICBzd2l0Y2gobmFtZSl7XG4gICAgY2FzZSAnVGhlbWUnOlxuICAgICAgcmV0dXJuIGBBZGQgQ29tcGV0ZW5jeSAke25hbWV9YDtcbiAgICBjYXNlICdTdWIgVGhlbWUnOlxuICAgICAgcmV0dXJuIGBBZGQgQ29tcGV0ZW5jeSAke25hbWV9YDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGBBZGQgJHtuYW1lfWA7XG4gICB9XG4gIH1cblxuICBnZXRDYXRlZ29yeU5hbWUoY2F0ZWdvcnlOYW1lOmFueSwgdGVybTphbnkpe1xuICAgIHRoaXMucHJldmlvdXNDYXRlZ29yeUNvZGUgPSBjYXRlZ29yeU5hbWU7XG4gICAgdGhpcy5wcmV2aW91c1Rlcm1Db2RlID0gdGVybS5jb2RlXG4gICAgXG4gICAgc3dpdGNoKGNhdGVnb3J5TmFtZSl7XG4gICAgICBjYXNlICdjb21wZXRlbmN5YXJlYSc6XG4gICAgICAgIHJldHVybiAnQ29tcGV0ZW5jeSBBcmVhJztcbiAgICAgIGNhc2UgJ3RoZW1lJzpcbiAgICAgICAgcmV0dXJuICdDb21wZXRlbmN5IFRoZW1lJztcbiAgICAgIGNhc2UgJ3N1YnRoZW1lJzpcbiAgICAgICAgcmV0dXJuICdDb21wZXRlbmN5IFN1YiBUaGVtZSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gY2F0ZWdvcnlOYW1lOyAvLyBEZWZhdWx0IHJldHVybiB0byBoYW5kbGUgYW55IHVubWF0Y2hlZCBjYXNlXG4gICAgIH1cbiAgfVxuXG5cbiAgZ2V0TmFtZShpdGVtOmFueSl7XG4gIHJldHVybiBpdGVtLnRvVXBwZXJDYXNlKClcbiAgfVxuXG4gIGdldExhYmVsTmFtZShsYWJlbE5hbWU6c3RyaW5nKTogc3RyaW5nIHtcbiAgICBcbiAgIHN3aXRjaChsYWJlbE5hbWUpe1xuICAgIGNhc2UgJ1RoZW1lJzpcbiAgICAgIHJldHVybiBgQ29tcGV0ZW5jeSAke2xhYmVsTmFtZX0gbmFtZWA7XG4gICAgICBjYXNlICdTdWIgVGhlbWUnOlxuICAgICAgcmV0dXJuIGBDb21wZXRlbmN5ICR7bGFiZWxOYW1lfSBuYW1lYFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxhYmVsTmFtZTsgLy8gRGVmYXVsdCByZXR1cm4gdG8gaGFuZGxlIGFueSB1bm1hdGNoZWQgY2FzZVxuICAgfVxuICB9XG5cbiBcblxuICBjcmVhdGVDb21wVGhlbWVGaWVsZHMoKTpVbnR5cGVkRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cCh7XG4gICAgICBjb21wZXRlbmN5VGhlbWU6WycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgY29tcGV0ZW5jeVN1YlRoZW1lOlsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXVxuICAgIH0pXG4gIH1cblxuICBhZGRDb21wZXRlbmN5VGhlbWUoKXtcbiAgICBpZiAodGhpcy5kYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnKSB7XG4gICAgICB0aGlzLmNvbXBUaGVtZUZpZWxkcy5wdXNoKHRoaXMuY3JlYXRlQ29tcFRoZW1lRmllbGRzKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUNvbXBGaWVsZHMoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScpIHtcbiAgICAgIHRoaXMuY29tcFRoZW1lRmllbGRzLnJlbW92ZUF0KGluZGV4KTtcbiAgICB9XG4gIH1cblxuICBnZXQgY29tcFRoZW1lRmllbGRzKCk6IFVudHlwZWRGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmNvbXBldGVuY3lGb3JtLmdldCgnY29tcFRoZW1lRmllbGRzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgfVxuXG4gIC8vIGdldCBjb21wVGhlbWVGaWVsZHNDb250cm9scygpIHtcbiAgLy8gICBjb25zdCBjcmVhdGVDb21wVGhlbWVGaWVsZHMgPSB0aGlzLmNvbXBldGVuY3lGb3JtLmdldCgnY3JlYXRlQ29tcFRoZW1lRmllbGRzJylcbiAgLy8gICByZXR1cm4gKDxhbnk+Y3JlYXRlQ29tcFRoZW1lRmllbGRzKVsnY29udHJvbHMnXVxuICAvLyB9XG5cblxuICB1cGRhdGVGb3JtVmlldyhmb3JtOmFueSwgZGF0YTphbnkpIHtcbiAgICBpZihkYXRhICYmIGRhdGEuY2hpbGRyZW5EYXRhICYmIGRhdGEuY2hpbGRyZW5EYXRhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzICYmIGRhdGEuY2hpbGRyZW5EYXRhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmRpc3BsYXlOYW1lKXtcbiAgICAgIGZvcm0uZ2V0KCdkbmFtZScpLnBhdGNoVmFsdWUoZGF0YS5jaGlsZHJlbkRhdGEuYWRkaXRpb25hbFByb3BlcnRpZXMuZGlzcGxheU5hbWUpXG4gICAgfVxuICAgIGZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpLnBhdGNoVmFsdWUoZGF0YS5jaGlsZHJlbkRhdGEuZGVzY3JpcHRpb24pICAgIFxuICAgIFxuICAgICAgaWYgKGRhdGEuY2hpbGRyZW5EYXRhLm5hbWUgJiYgdGhpcy5tYXN0ZXJMaXN0Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBhc3NpZ25OYW1lID0gdGhpcy5tYXN0ZXJMaXN0LmZpbmQob3B0aW9uID0+XG4gICAgICAgICAgZGF0YS5jaGlsZHJlbkRhdGEucmVmSWQgPT09IG9wdGlvbi5pZFxuICAgICAgICApXG4gICAgICAgIGlmIChhc3NpZ25OYW1lKSB7XG4gICAgICAgICAgZm9ybS5jb250cm9sc1snbmFtZSddLnNldFZhbHVlKGFzc2lnbk5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICB9XG4gIFxuICAgIFxuICAgIC8vIGZvcm0uZ2V0KCduYW1lJykucGF0Y2hWYWx1ZShkYXRhLmNoaWxkcmVuRGF0YS5uYW1lKVxuICAgIFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZm9ybS5nZXQoJ25hbWUnKS5kaXNhYmxlKClcbiAgICAgIGZvcm0uZ2V0KCdkbmFtZScpLmRpc2FibGUoKVxuICAgICAgZm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJykuZGlzYWJsZSgpXG4gICAgICBcbiAgICAgIFxuICAgIH0pXG4gIH1cblxuICB1cGRhdGVGb3JtRWRpdChmb3JtOmFueSwgZGF0YTphbnkpIHtcbiAgICBmb3JtLmdldCgnZG5hbWUnKS5wYXRjaFZhbHVlKGRhdGEuY2hpbGRyZW5EYXRhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmRpc3BsYXlOYW1lKVxuICAgIGZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpLnBhdGNoVmFsdWUoZGF0YS5jaGlsZHJlbkRhdGEuZGVzY3JpcHRpb24pXG4gICAgaWYgKGRhdGEuY2hpbGRyZW5EYXRhLm5hbWUgJiYgdGhpcy5tYXN0ZXJMaXN0Lmxlbmd0aCkge1xuICAgICAgY29uc3QgYXNzaWduTmFtZSA9IHRoaXMubWFzdGVyTGlzdC5maW5kKG9wdGlvbiA9PlxuICAgICAgICBkYXRhLmNoaWxkcmVuRGF0YS5uYW1lID09PSBvcHRpb24udGl0bGVcbiAgICAgIClcbiAgICAgIGlmIChhc3NpZ25OYW1lKSB7XG4gICAgICAgIGZvcm0uY29udHJvbHNbJ25hbWUnXS5zZXRWYWx1ZShhc3NpZ25OYW1lKVxuICAgICAgfVxuICAgICAgXG4gICAgfVxuICAgIC8vIGZvcm0uZ2V0KCduYW1lJykucGF0Y2hWYWx1ZShkYXRhLmNoaWxkcmVuRGF0YS5uYW1lKVxuICAgXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBmb3JtLmdldCgnbmFtZScpLmRpc2FibGUoKVxuICAgICAgZm9ybS5nZXQoJ2RuYW1lJykuZW5hYmxlKClcbiAgICB9KVxuICB9XG5cbiAgb25LZXkoZXZlbnQ6YW55KXtcbiAgICAvLyAgdGhpcy52YWx1ZXMgPSBldmVudC50YXJnZXQudmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAvLyAgdGhpcy5maWx0ZXJlZE1hc3Rlckxpc3QgPSB0aGlzLmZpbHRlck9yZ1ZhbHVlcyh0aGlzLnZhbHVlcywgdGhpcy5tYXN0ZXJMaXN0KVxuXG4gICAgIGNsZWFyVGltZW91dCh0aGlzLmRlYm91bmNlVGltZW91dCk7XG4gICAgXG4gICAgIC8vIFNldCB0aGUgbmV3IHRpbWVvdXRcbiAgICAgdGhpcy5kZWJvdW5jZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICB0aGlzLnZhbHVlcyA9IGV2ZW50LnRhcmdldC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgIHRoaXMuZmlsdGVyZWRNYXN0ZXJMaXN0ID0gdGhpcy5maWx0ZXJPcmdWYWx1ZXModGhpcy52YWx1ZXMsIHRoaXMubWFzdGVyTGlzdCk7XG4gICAgIH0sIHRoaXMuZGVib3VuY2VEZWxheSk7XG4gIH1cblxuIFxuXG4gIGZpbHRlck9yZ1ZhbHVlcyhzZWFyY2hWYWx1ZTogc3RyaW5nLCBhcnJheTogYW55KSB7XG4gICAgcmV0dXJuIGFycmF5LmZpbHRlcigodmFsdWU6IGFueSkgPT5cbiAgICAgIHZhbHVlLnRpdGxlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVmFsdWUudG9Mb3dlckNhc2UoKSkpXG4gIH1cblxuICBnZXRLY21TZWFyY2goKXtcbiAgICBjb25zdCByZXF1ZXN0T2JqID0ge1xuICAgICAgZmlsdGVyQ3JpdGVyaWFNYXA6IHtcbiAgICAgICAgc3RhdHVzOiBcIkxpdmVcIixcbiAgICAgICAgaXNBY3RpdmU6IHRydWVcbiAgICB9LFxuICAgIHJlcXVlc3RlZEZpZWxkczogW10sXG4gICAgcGFnZU51bWJlcjogMCxcbiAgICBwYWdlU2l6ZToxMDAwXG4gICAgfVxuICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRLY21TZWFyY2hMaXN0KHJlcXVlc3RPYmosdGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSkuc3Vic2NyaWJlKChyZXNwb25zZTphbnkpPT57XG4gICAgICBpZihyZXNwb25zZS5kYXRhICYmIHJlc3BvbnNlLmRhdGEubGVuZ3RoKXtcbiAgICAgICAgdGhpcy5tYXN0ZXJMaXN0ID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgdGhpcy5maWx0ZXJlZE1hc3Rlckxpc3QgPSBbLi4udGhpcy5tYXN0ZXJMaXN0XVxuICAgICAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgICAgaWYodGhpcy5kYXRhICYmXG4gICAgICAgICAgICAodGhpcy5kYXRhLm1vZGUgPT09ICdlZGl0Jykpe1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1FZGl0KHRoaXMuY3JlYXRlVGhlbWVGb3JtLCB0aGlzLmRhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKHRoaXMuZGF0YSAmJlxuICAgICAgICAgICAgICAodGhpcy5kYXRhLm1vZGUgPT09ICd2aWV3Jykpe1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybVZpZXcodGhpcy5jcmVhdGVUaGVtZUZvcm0sIHRoaXMuZGF0YSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIFxuICAgICAgICB9LDEwMDApXG4gICAgICAgXG5cbiAgICAgIH1cbiAgICB9KVxuICAgXG4gICAgXG4gIH1cblxuICBvbkRpc2FibGVUaGVtZShvcHRpb246IGFueSl7XG4gICAgbGV0IHBhcmVudENvbFxuICAgIGNvbnN0IHBhcmVudENvbHVtbkNvbmZpZ0RhdGEgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeSh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKVxuICAgIGlmKHBhcmVudENvbHVtbkNvbmZpZ0RhdGEpIHtcbiAgICAgIHBhcmVudENvbCA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChwYXJlbnRDb2x1bW5Db25maWdEYXRhLmNvZGUpXG4gICAgfVxuICAgIGxldCByZXN1bHQgPSAtMVxuICAgIGlmKHBhcmVudENvbCAmJiBwYXJlbnRDb2wuY2hpbGRyZW4gJiYgcGFyZW50Q29sLmNoaWxkcmVuLmxlbmd0aCl7XG4gICAgICByZXN1bHQgPSBwYXJlbnRDb2wuY2hpbGRyZW4uZmluZEluZGV4KChlbGU6IGFueSkgPT4ge1xuICAgICAgICBpZiggKGVsZS5yZWZUeXBlID09PSAndGhlbWUnfHwgZWxlLnJlZlR5cGUgPT09ICdzdWJ0aGVtZScpICkge1xuICAgICAgICAgIHJldHVybiBlbGUubmFtZS50b0xvd2VyQ2FzZSgpID09PSBvcHRpb24udGl0bGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KVxuICAgICAgXG4gICBcbiAgICAgIFxuICAgIH1cbiAgICBpZihyZXN1bHQgPCAwKXtcbiAgICAgIGxldCBmb3JtQXJyYXkgPSB0aGlzLmNyZWF0ZVRoZW1lRm9ybU11bHRpLmdldCgndGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgcmVzdWx0ID0gZm9ybUFycmF5LnZhbHVlLmZpbmRJbmRleCgoZm9ybUVsZTogYW55KSA9PiB7XG4gICAgICAgIGlmKGZvcm1FbGUubmFtZSAmJiBmb3JtRWxlLm5hbWUuaWQpe1xuICAgICAgICAgIHJldHVybiBmb3JtRWxlLm5hbWUuaWQgPT09IG9wdGlvbi5pZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgfVxuICAgIC8vXG4gICAgXG4gICAgcmV0dXJuIHJlc3VsdCA+PSAwID8gdHJ1ZTogZmFsc2VcbiAgfVxuXG4gIG11bHRpQ3JlYXRlKGZvcm06YW55LCBfZGF0YTphbnkpIHtcbiAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IHRydWVcbiAgICBsZXQgY291bnRlciA9IDBcbiAgICBsZXQgY3JlYXRlZFRlcm1zOmFueSA9IFtdXG4gICAgaWYoZm9ybS52YWxpZCkge1xuICAgICAgXG4gICAgICBjb25zdCB0aGVtZUZpZWxkcyA9IGZvcm0gJiYgZm9ybS52YWx1ZSAmJiBmb3JtLnZhbHVlLnRoZW1lRmllbGRzXG4gICAgICBcbiAgICAgIGlmKHRoZW1lRmllbGRzICYmIHRoZW1lRmllbGRzLmxlbmd0aCkge1xuICAgICAgICB0aGVtZUZpZWxkcy5mb3JFYWNoKCh2YWw6YW55LCBfaTphbnkpID0+e1xuICAgICAgICAgIGNvbnN0IHRlcm06IE5TRnJhbWV3b3JrLklDcmVhdGVUZXJtID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFV1aWQoKSxcbiAgICAgICAgICAgIG5hbWU6IF8uZ2V0KHZhbCwgJ25hbWUudGl0bGUnKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWwuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBjYXRlZ29yeTogdGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSxcbiAgICAgICAgICAgIHN0YXR1czogYXBwQ29uc3RhbnRzLkxJVkUsXG4gICAgICAgICAgICByZWZJZDp2YWwubmFtZS5pZCxcbiAgICAgICAgICAgIHJlZlR5cGU6dGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSxcbiAgICAgICAgICAgIC8vIGZyYW1ld29yazp0aGlzLmRhdGEuZnJhbWV3b3JrSWQsXG4gICAgICAgICAgICAvLyBhcHByb3ZhbFN0YXR1czphcHBDb25zdGFudHMuRFJBRlQsXG4gICAgICAgICAgICBwYXJlbnRzOiBbXG4gICAgICAgICAgICAgIHsgaWRlbnRpZmllcjogYCR7dGhpcy5kYXRhLmZyYW1ld29ya0lkLnRvTG93ZXJDYXNlKCl9XyR7dGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZX1gIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczoge1xuICAgICAgICAgICAgICBkaXNwbGF5TmFtZTp2YWwuZG5hbWUsXG4gICAgICAgICAgICAgIHRpbWVTdGFtcDogbmV3IERhdGUoKS5nZXRUaW1lKCksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5OiBhbnkgPSB7XG4gICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIHRlcm06IHRlcm1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmNyZWF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLCByZXF1ZXN0Qm9keSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtWydpZGVudGlmaWVyJ10gPSByZXMucmVzdWx0Lm5vZGVfaWRbMF1cbiAgICAgICAgICAgIGNyZWF0ZWRUZXJtcy5wdXNoKHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybSlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY291bnRlcisrXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKGNvdW50ZXIgPT09IHRoZW1lRmllbGRzLmxlbmd0aCl7XG5cblxuICAgICAgICAgICAgICBjb25zdCBwYXJlbnRDb2x1bW46YW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSlcbiAgICAgICAgICAgICAgbGV0IHBhcmVudENvbDogYW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHBhcmVudENvbHVtbi5jb2RlKVxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnNNdWx0aVYyKGNyZWF0ZWRUZXJtcyAsIHBhcmVudENvbClcbiAgICAgICAgICAgICAgLy8gdGhpcy51cGRhdGVUZXJtQXNzb2NpYXRpb25zTXVsdGkoY3JlYXRlZFRlcm1zKVxuICAgICAgICAgICAgICAvLyB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogY3JlYXRlZFRlcm1zLCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlVGVybUFzc29jaWF0aW9uc011bHRpKGNyZWF0ZWRUZXJtczogYW55W10pIHtcbiAgICAgbGV0IHBhcmVudDogYW55XG4gICAgaWYoY3JlYXRlZFRlcm1zICYmIGNyZWF0ZWRUZXJtcy5sZW5ndGgpIHtcbiAgICAgIGxldCBjcmVhdGVkVGVybXNDb3VudGVyID0gMFxuICAgICAgZm9yKGxldCBjcmVhdGVkVGVybSBvZiBjcmVhdGVkVGVybXMpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlcm0gPSBjcmVhdGVkVGVybVxuICAgICAgICBsZXQgYXNzb2NpYXRpb25zID0gW11cbiAgICAgICAgbGV0IHRlbXBcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAwXG4gICAgICAgIGZvcihjb25zdCBbdmFsdWVdIG9mIHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0KXtcbiAgICAgICAgICAgcGFyZW50ID0gdmFsdWVcbiAgICAgICAgICBjb3VudGVyKytcbiAgICAgICAgICB0ZW1wID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLmZpbHRlcigoY2hpbGQ6IGFueSkgPT4gY2hpbGQuaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgOiBudWxsXG4gICAgICAgICAgYXNzb2NpYXRpb25zID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLm1hcCgoYzphbnkpID0+IHtcbiAgICAgICAgICAgIC8vIHJldHVybiB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciwgYXBwcm92YWxTdGF0dXM6IGMuYXNzb2NpYXRpb25Qcm9wZXJ0aWVzP2MuYXNzb2NpYXRpb25Qcm9wZXJ0aWVzLmFwcHJvdmFsU3RhdHVzOiAnRHJhZnQnIH1cbiAgICAgICAgICAgIHJldHVybiBjLmlkZW50aWZpZXIgPyAgeyBpZGVudGlmaWVyOiBjLmlkZW50aWZpZXIgfSA6IG51bGxcbiAgICAgICAgICB9KSA6IFtdXG4gICAgICAgICAgaWYgKHRlbXAgJiYgdGVtcC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuaXNUZXJtRXhpc3QgPSB0cnVlXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhc3NvY2lhdGlvbnMucHVzaCh7IGlkZW50aWZpZXI6IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIgfSlcbiAgICAgICAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IGZhbHNlXG4gICAgICAgICAgICAgIC8vIGlmKGNyZWF0ZWRUZXJtc0NvdW50ZXIgPT09IChjcmVhdGVkVGVybXMubGVuZ3RoLTEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVndWVzdEJvZHkgPSB7XG4gICAgICAgICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi4oYXNzb2NpYXRpb25zICYmIGFzc29jaWF0aW9ucy5sZW5ndGgpID8ge2Fzc29jaWF0aW9uczogWy4uLmFzc29jaWF0aW9uc119IDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogdGhpcy5zZWxlY3RlZFRlcm0sIGNyZWF0ZWQ6IHRydWUgfSlcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNhbGxVcGRhdGVBc3NvY2lhdGlvbnMoY291bnRlciwgcGFyZW50LCByZWd1ZXN0Qm9keSlcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjcmVhdGVkVGVybXNDb3VudGVyKytcbiAgICAgICAgaWYoY3JlYXRlZFRlcm1zQ291bnRlciA9PT0gY3JlYXRlZFRlcm1zLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVGcmFtZXdvcmtMaXN0KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsIHBhcmVudCwgY3JlYXRlZFRlcm1zIClcbiAgICAgICAgICB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogW3RoaXMuc2VsZWN0ZWRUZXJtXSwgY3JlYXRlZDogdHJ1ZSwgbXVsdGk6dHJ1ZSB9KVxuICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID1mYWxzZTtcbiAgICAgICAgICBpZihjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnkgPT09ICd0aGVtZScpe1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke2NyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoY3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5ID09PSAnc3VidGhlbWUnKXtcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYENvbXBldGVuY3kgJHtjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnl9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2FsbFVwZGF0ZUFzc29jaWF0aW9ucyhjb3VudGVyOmFueSwgcGFyZW50OmFueSwgcmVndWVzdEJvZHk6YW55KTogUHJvbWlzZTxhbnk+e1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCBwYXJlbnQuY2F0ZWdvcnksIHBhcmVudC5jb2RlLCByZWd1ZXN0Qm9keSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgcGFyZW50WydjaGlsZHJlbiddID0gcGFyZW50ICYmIHBhcmVudC5jaGlsZHJlbiA/Wy4uLnBhcmVudC5jaGlsZHJlbiwgLi4uW3RoaXMuc2VsZWN0ZWRUZXJtXV06W3RoaXMuc2VsZWN0ZWRUZXJtXVxuXG4gICAgICAgIGlmIChjb3VudGVyID09PSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5zaXplKSB7XG4gICAgICAgICAgLy8gdGhpcy5zZWxlY3RlZFRlcm1bJ2Fzc29jaWF0aW9uUHJvcGVydGllcyddWydhcHByb3ZhbFN0YXR1cyddID0gJ0RyYWZ0JztcbiAgXG4gICAgICAgICAgLy8gdGhpcyB2YWx1ZSBpcyBmb3Igc2VsZWN0ZWQgdGVybSBpbiBjYXNlIG9mIGNyZWF0ZSBzY2VuYXJpbywgaW4gY2FzZSBvZiBlZGl0IHNjZW5hcmlvIHRoaXMgd29uJ3QgYmUgYXZhaWFibGUgXG4gICAgICAgICAgLy8gc28gdGVybSBpcyBzZXQgZnJvbSBjaGlsZGRhdGEgd2hpY2ggaXMgcmVjZWl2ZWQgZnJvbSBwYXJhbXMgaW4gdXBkYXRlRGF0YVxuICAgICAgICAgIC8vIGNvbnN0IHZhbHVlID0gKHRoaXMuc2VsZWN0ZWRUZXJtICYmIHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpID8gdGhpcy5zZWxlY3RlZFRlcm0gOiB7fVxuICAgICAgICAgIC8vIGNvbnN0IGZvdW5kID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLmZpbmQoYz0+IGMuaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgOiBmYWxzZVxuICAgICAgICAgIC8vIGlmKCFmb3VuZCkge1xuICAgICAgICAgIC8vICAgcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcy5zZWxlY3RlZFRlcm0pIDogcGFyZW50WydjaGlsZHJlbiddID0gW3RoaXMuc2VsZWN0ZWRUZXJtXVxuICAgICAgICAgIC8vIH1cbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGRhdGUgPSBmYWxzZVxuICAgICAgICAgIC8vIHRoaXMuZnJhbWVXb3JrU2VydmljZS5wdWJsaXNoRnJhbWV3b3JrKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgLy8gICAvLyB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0ZXJtKVxuICAgICAgICAgIFxuICAgICAgICAgIC8vICAgcmV0dXJuIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfSwgKF9lcnI6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFZGl0ICR7dGhpcy5kYXRhLmNvbHVtbkluZm8ubmFtZX0gZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyYClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHVwZGF0ZURuYW1lKF9uYW1lOiBhbnksIF9mb3JtOmFueSwgX2k/OmFueSkge1xuICAgIC8vIGlmKHRoaXMuZGF0YS5tb2RlID09PSAnY3JlYXRlJyAmJiAhZm9ybS5jb250cm9sc1snZG5hbWUnXS52YWx1ZS50cmltKCkubGVuZ3RoKXtcbiAgICAvLyAgIGZvcm0uZ2V0KCdkbmFtZScpLnBhdGNoVmFsdWUobmFtZSlcbiAgICAvLyB9XG4gICAgLy8gaWYodGhpcy5kYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnICYmICFmb3JtLmNvbnRyb2xzLnRoZW1lRmllbGRzLmNvbnRyb2xzW2ldLmNvbnRyb2xzWydkbmFtZSddLnZhbHVlLnRyaW0oKS5sZW5ndGgpe1xuICAgIC8vICAgZm9ybS5jb250cm9scy50aGVtZUZpZWxkcy5jb250cm9sc1tpXS5jb250cm9sc1snZG5hbWUnXS5wYXRjaFZhbHVlKG5hbWUpXG4gICAgLy8gfVxuICB9XG4gIGNoYW5nZShldmVudDogYW55LGZvcm06IGFueSwgaT86IGFueSl7XG4gICAgaWYodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5tb2RlKSB7IFxuICAgICAgaWYodGhpcy5kYXRhLm1vZGUgPT09ICdjcmVhdGUnKXtcbiAgICAgICAgZm9ybS5nZXQoJ2RuYW1lJykucGF0Y2hWYWx1ZShldmVudC5zb3VyY2UudmFsdWUudGl0bGUpXG4gICAgICAgIHRoaXMuZXhwYW5zaW9uVGl0bGUgPSBldmVudC5zb3VyY2UudmFsdWUudGl0bGVcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXG5cbiAgICAgIH1cbiAgICAgIGlmKHRoaXMuZGF0YS5tb2RlID09PSAnbXVsdGktY3JlYXRlJyl7XG4gICAgICAgIGNvbnN0IGZvcm1Ub1VwZGF0ZSA9IGZvcm0uY29udHJvbHMudGhlbWVGaWVsZHMuY29udHJvbHNbaV1cbiAgICAgICAgZm9ybVRvVXBkYXRlLmNvbnRyb2xzWydkbmFtZSddLnBhdGNoVmFsdWUoZXZlbnQuc291cmNlLnZhbHVlLnRpdGxlKVxuICAgICAgICB0aGlzLmV4cGFuc2lvblRpdGxlID0gZXZlbnQuc291cmNlLnZhbHVlLnRpdGxlXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKVxuICAgICAgICBpZihmb3JtVG9VcGRhdGUuY29udHJvbHMubmFtZS52YWxpZCAmJiBmb3JtVG9VcGRhdGUuY29udHJvbHMuZG5hbWUpIHtcbiAgICAgICAgICBmb3JtVG9VcGRhdGUuY29udHJvbHMuZG5hbWUuZW5hYmxlKClcbiAgICAgICAgfSBlbHNlIGlmKGZvcm1Ub1VwZGF0ZS5jb250cm9scy5kbmFtZSkge1xuICAgICAgICAgIGZvcm1Ub1VwZGF0ZS5jb250cm9scy5kbmFtZS5kaXNhYmxlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgIFxuICB9XG5cbiAgZ2V0RXhwYW5zaW9uVGl0bGUoZm9ybTogYW55KSB7XG4gICAgY29uc3QgZGV0YWlscyA9IGZvcm0uZ2V0KCduYW1lJykudmFsdWVcbiAgICByZXR1cm4gXy5nZXQoZGV0YWlscywgJ3RpdGxlJywgJycpXG4gIH1cbiAgXG5cbiAgLy8jcmVnaW9uIChkZXNpZ25hdGlvbnMpXG5cbiAgZ2V0IGRlc2lnbmF0aW9uQ29udHJvbHMoKSB7XG4gICAgcmV0dXJuICh0aGlzLmNyZWF0ZVRoZW1lRm9ybS5nZXQoJ2Rlc2lnbmF0aW9ucycpIGFzIFVudHlwZWRGb3JtQXJyYXkpLmNvbnRyb2xzO1xuICB9XG5cbiAgbG9hZERlc2lnbmF0aW9ucygpIHtcbiAgICB0aGlzLm9kY3NTZXJ2aWNlLmdldERlc2lnbmF0aW9ucyh7fSkuc3Vic2NyaWJlKFxuICAgICAgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmRlc2lnbmF0aW9uc0xpc3QgPSBkYXRhLnJlc3BvbnNlRGF0YVxuICAgICAgfSxcbiAgICAgIChfZXJyOiBhbnkpID0+IHtcbiAgICAgIH0pXG4gIH1cblxuICBnZXRGaWx0ZXJlZERlc2lnbmF0aW9uTGlzdChpbmRleDogc3RyaW5nKSB7XG4gICAgY29uc3QgZmlsdGVyS2V5ID0gdGhpcy5jcmVhdGVUaGVtZUZvcm0udmFsdWUuZGVzaWduYXRpb25zW2luZGV4XS5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICBpZihmaWx0ZXJLZXkgJiYgdGhpcy5kZXNpZ25hdGlvbnNMaXN0KSB7XG4gICAgICBjb25zdCBmaWx0ZXJlZExpc3QgPSB0aGlzLmRlc2lnbmF0aW9uc0xpc3QuZmlsdGVyKChkZXNpZ25hdGlvbjogYW55KSA9PiBkZXNpZ25hdGlvbi5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyS2V5KSlcbiAgICAgIHJldHVybiBmaWx0ZXJlZExpc3RcbiAgICB9XG5cbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGFkZERlc2lnbmF0aW9uKCkge1xuICAgIGNvbnN0IG5ld0Rlc2lnbmF0aW9uID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBuYW1lOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgaWQ6W251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgZGVzaWduYXRpb25EZXNjcmlwdGlvbjogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNjAwKV1dLFxuICAgICAgaXNTYXZlZDogW2ZhbHNlXSwgLy8gaXNTYXZlZCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgYnV0dG9uIHRleHQgZnJvbSBzYXZlIHRvIHVwZGF0ZSBpZiBuZWVkZWRcbiAgICAgIGNyZWF0aW9uSWQ6IHRoaXMuYWRkZWREZXNpZ25hdGlvbkNvdW50IC8vIGNyZWF0aW9uSWQgaXMgY3JlYXRlZCB0byB1c2UgbG9jYWxseSB0byBnaXZlIHVuaXF1ZSBpZCB0byBhZGRlZCByZWNvcmRzXG4gICAgfSk7XG4gICAgdGhpcy5hZGRlZERlc2lnbmF0aW9uQ291bnQgPSB0aGlzLmFkZGVkRGVzaWduYXRpb25Db3VudCArIDE7XG4gICAgKHRoaXMuY3JlYXRlVGhlbWVGb3JtLmdldCgnZGVzaWduYXRpb25zJykgYXMgVW50eXBlZEZvcm1BcnJheSkuaW5zZXJ0KDAsIG5ld0Rlc2lnbmF0aW9uKTtcbiAgICAvLyB0aGlzLnBhbmVsT3BlblN0YXRlLmluc2VydCgwLCB0cnVlKVxuICAgIHRoaXMucGFuZWxPcGVuU3RhdGUuc3BsaWNlKDAsIDAsIHRydWUpO1xuICB9XG5cbiAgY2xlYXJTZWxlY3RlZERlc2lnbmFpb25PbkNoYW5nZShpbmRleDphbnksIGV2ZW50OmFueSkge1xuICAgIGNvbnN0IHNlbGVjdGVkTmFtZSA9IHRoaXMuY3JlYXRlVGhlbWVGb3JtLnZhbHVlLmRlc2lnbmF0aW9uc1tpbmRleF0ubmFtZVxuICAgIGlmKHNlbGVjdGVkTmFtZSAhPT0gZXZlbnQudmFsdWUpIHtcbiAgICAgIGNvbnN0IGRlc2lnbmF0aW9uc1RvUmVzZXQ6YW55ID0gdGhpcy5kZXNpZ25hdGlvbkNvbnRyb2xzW2luZGV4XVxuICAgICAgZGVzaWduYXRpb25zVG9SZXNldC5nZXQoJ2lkJykucmVzZXQoKVxuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZURlc2lnbmF0aW9uKGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCByZW92ZWRDcmVhdGlvbklkID0gdGhpcy5kZXNpZ25hdGlvbkNvbnRyb2xzW2luZGV4XS52YWx1ZS5jcmVhdGlvbklkO1xuICAgICh0aGlzLmNyZWF0ZVRoZW1lRm9ybS5nZXQoJ2Rlc2lnbmF0aW9ucycpIGFzIFVudHlwZWRGb3JtQXJyYXkpLnJlbW92ZUF0KGluZGV4KTtcbiAgICB0aGlzLnNhdmVkRGVzaWduYXRpb25zID0gdGhpcy5zYXZlZERlc2lnbmF0aW9ucy5maWx0ZXIoKHNhdmVkRGVzaWduYXRpb246IGFueSkgPT4gc2F2ZWREZXNpZ25hdGlvbi5jcmVhdGlvbklkICE9PSByZW92ZWRDcmVhdGlvbklkKVxuICB9XG5cbiAgc2F2ZURlc2lnbmF0aW9uKGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBkZXNpZ25hdGlvbnMgPSB0aGlzLmRlc2lnbmF0aW9uQ29udHJvbHNcbiAgICBjb25zdCBkZXNpZ25hdGlvblRvU2F2ZSA9IGRlc2lnbmF0aW9uc1tpbmRleF1cbiAgICBpZiAoZGVzaWduYXRpb25Ub1NhdmUudmFsaWQpIHtcbiAgICAgIGRlc2lnbmF0aW9uVG9TYXZlLnZhbHVlLmlzU2F2ZWQgPSB0cnVlXG4gICAgICBjb25zdCBzYXZlZERlc2lnbmF0aW9uSW5kZXggPSB0aGlzLnNhdmVkRGVzaWduYXRpb25zLmZpbmRJbmRleCgoZTphbnkpID0+IGUuY3JlYXRpb25JZCA9PT0gZGVzaWduYXRpb25Ub1NhdmUudmFsdWUuY3JlYXRpb25JZClcbiAgICAgIGlmIChzYXZlZERlc2lnbmF0aW9uSW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLnNhdmVkRGVzaWduYXRpb25zW3NhdmVkRGVzaWduYXRpb25JbmRleF0gPSBkZXNpZ25hdGlvblRvU2F2ZS52YWx1ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zYXZlZERlc2lnbmF0aW9ucy5wdXNoKGRlc2lnbmF0aW9uVG9TYXZlLnZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN1Ym1pdERlc2lnbmF0aW9uKCkge1xuICAgIFxuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKClcbiAgfVxuXG4gIGdldCBlbmFibGVBZGRCdG4oKSB7XG4gICAgaWYodGhpcy5jb2xDb2RlID09PSAnZGVzaWduYXRpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZXNpZ25hdGlvbkNvbnRyb2xzLmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyNlbmRyZWdpb25cbiAgXG4gIHByaXZhdGUgX2ZpbHRlcihzZWFyY2hUeHQ6IGFueSk6IENhcmRbXSB7XG4gICAgbGV0IGlzRXhpc3Q7XG4gICAgdGhpcy5kaXNhYmxlQ3JlYXRlID0gZmFsc2VcbiAgICB0aGlzLmlzVGVybUV4aXN0ID0gZmFsc2VcbiAgICB0aGlzLmNyZWF0ZVRlcm1Gb3JtLmdldCgnZGVzY3JpcHRpb24nKS5lbmFibGUoKVxuICAgIC8vIHRoaXMuY3JlYXRlVGVybUZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpLnBhdGNoVmFsdWUoJycpXG4gICAgY29uc3QgZmlsdGVyVmFsdWUgPSB0eXBlb2YgKHNlYXJjaFR4dCkgPT09ICdvYmplY3QnID8gdGhpcy5fbm9ybWFsaXplVmFsdWUoc2VhcmNoVHh0Lm5hbWUpIDogdGhpcy5fbm9ybWFsaXplVmFsdWUoc2VhcmNoVHh0KTtcbiAgICBpc0V4aXN0ID0gdGhpcy50ZXJtTGlzdHMuZmlsdGVyKCh0ZXJtOmFueSkgPT4gdGhpcy5fbm9ybWFsaXplVmFsdWUodGVybS5uYW1lKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpO1xuICAgIHJldHVybiBpc0V4aXN0XG4gIH1cblxuICBwcml2YXRlIF9ub3JtYWxpemVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25BcmVhKG9wdGlvbjphbnkpe1xuICAgIHRoaXMuYWxsQ29tcGV0ZW5jeS5mb3JFYWNoKCh2YWw6YW55KT0+e1xuICAgICAgaWYgKG9wdGlvbi5uYW1lID09PSB2YWwubmFtZSkge1xuICAgICAgICB0aGlzLnNlbGV0ZWRDb21wZXRlbmN5QXJlYSA9IHZhbFxuICAgICAgICB0aGlzLmFsbENvbXBldGVuY3lUaGVtZSA9IHZhbC5jaGlsZHJlblxuICAgICAgICB0aGlzLmZpbHRlcmVkYWxsQ29tcGV0ZW5jeVRoZW1lID0gdGhpcy5hbGxDb21wZXRlbmN5VGhlbWVcblxuICAgICAgfVxuICAgIH0pXG4gICBcbiAgfVxuXG4gIE9uVGhlbWVTZWxlY3Rpb24oZXZlbnQ6YW55KSB7XG4gICAgXG4gICAgY29uc3Qgc2VsZWN0ZWRUaGVtZSA9IGV2ZW50LnNvdXJjZS52YWx1ZVxuICAgIHRoaXMuZmlsdGVyZWRhbGxDb21wZXRlbmN5VGhlbWUuZm9yRWFjaCgodmFsOiBhbnkpID0+IHtcbiAgICAgIGlmIChzZWxlY3RlZFRoZW1lLm5hbWUgPT09IHZhbC5uYW1lKSB7XG4gICAgICAgIHRoaXMuYWxsQ29tcGV0ZW5jeVN1YnRoZW1lID0gdmFsLmNoaWxkcmVuXG4gICAgICAgIHRoaXMuZmlsdGVyZWRhbGxDb21wZXRlbmN5U3ViVGhlbWUgPSB0aGlzLmFsbENvbXBldGVuY3lTdWJ0aGVtZVxuICAgICAgfVxuXG4gICAgfSlcblxuXG4gIH1cblxuICAvLyBjb21wQXJlYVNlbGVjdGVkKG9wdGlvbjogYW55KSB7XG4gIC8vICAgdGhpcy5yZXNldENvbXBTdWJmaWVsZHMoKVxuICAvLyAgIHRoaXMuYWxsQ29tcGV0ZW5jaWVzLmZvckVhY2goKHZhbDogYW55KSA9PiB7XG4gIC8vICAgICBpZiAob3B0aW9uLm5hbWUgPT09IHZhbC5uYW1lKSB7XG4gIC8vICAgICAgIHRoaXMuc2VsZXRlZENvbXBldGVuY3lBcmVhID0gdmFsXG4gIC8vICAgICAgIHRoaXMuYWxsQ29tcGV0ZW5jeVRoZW1lID0gdmFsLmNoaWxkcmVuXG4gIC8vICAgICAgIHRoaXMuZmlsdGVyZWRhbGxDb21wZXRlbmN5VGhlbWUgPSB0aGlzLmFsbENvbXBldGVuY3lUaGVtZVxuICBcbiAgLy8gICAgIH1cbiAgLy8gICB9KVxuICAvLyB9XG5cbiAgb25TZWxlY3QodGVybTphbnksIGZvcm06YW55KSB7XG4gICAgc3dpdGNoICh0aGlzLmNvbENvZGUpIHtcbiAgICAgIGNhc2UgJ2Rlc2lnbmF0aW9uJzpcbiAgICAgICAgZm9ybS5nZXQoJ25hbWUnKS5wYXRjaFZhbHVlKHRlcm0udmFsdWUubmFtZSlcbiAgICAgICAgZm9ybS5nZXQoJ2lkJykucGF0Y2hWYWx1ZSh0ZXJtLnZhbHVlLmlkKVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXJtID0gdGVybS52YWx1ZVxuICAgICAgICBmb3JtLmdldCgnbmFtZScpLnBhdGNoVmFsdWUodGVybS52YWx1ZS5uYW1lKVxuICAgICAgICBmb3JtLmdldCgnZG5hbWUnKS5wYXRjaCh0ZXJtLnZhbHVlLmRuYW1lKVxuICAgICAgICBmb3JtLmdldCgnZGVzY3JpcHRpb24nKS5wYXRjaFZhbHVlKHRlcm0udmFsdWUuZGVzY3JpcHRpb24pXG4gICAgICAgIGZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpLmRpc2FibGUoKVxuICAgICAgICB0aGlzLmRpc2FibGVDcmVhdGUgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgc2F2ZVRlcm0oKSB7XG4gICAgaWYgKHRoaXMuX2ZpbHRlcih0aGlzLmNyZWF0ZVRlcm1Gb3JtLnZhbHVlLm5hbWUpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaXNUZXJtRXhpc3QgPSB0cnVlXG4gICAgICBcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGhpcy5jcmVhdGVUZXJtRm9ybS52YWxpZCkge1xuICAgICAgY29uc3QgdGVybTogTlNGcmFtZXdvcmsuSUNyZWF0ZVRlcm0gPSB7XG4gICAgICAgIGNvZGU6IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRVdWlkKCksXG4gICAgICAgIG5hbWU6IHRoaXMuY3JlYXRlVGVybUZvcm0udmFsdWUubmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuY3JlYXRlVGVybUZvcm0udmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICAgIGNhdGVnb3J5OiB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLFxuICAgICAgICBzdGF0dXM6IGFwcENvbnN0YW50cy5MSVZFLFxuICAgICAgICAvLyBmcmFtZXdvcms6dGhpcy5kYXRhLmZyYW1ld29ya0lkLFxuICAgICAgICAvLyBhcHByb3ZhbFN0YXR1czphcHBDb25zdGFudHMuRFJBRlQsXG4gICAgICAgIHBhcmVudHM6IFtcbiAgICAgICAgICB7IGlkZW50aWZpZXI6IGAke3RoaXMuZGF0YS5mcmFtZXdvcmtJZC50b0xvd2VyQ2FzZSgpfV8ke3RoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGV9YCB9XG4gICAgICAgIF0sXG4gICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMuY3JlYXRlVGVybUZvcm0udmFsdWUuZG5hbWUsXG4gICAgICAgICAgdGltZVN0YW1wOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcmVxdWVzdEJvZHk6YW55ID0ge1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgdGVybTogdGVybVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5jcmVhdGVUZXJtKHRoaXMuZGF0YS5mcmFtZXdvcmtJZCwgdGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgcmVxdWVzdEJvZHkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtWydpZGVudGlmaWVyJ10gPSByZXMucmVzdWx0Lm5vZGVfaWRbMF1cbiAgICAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybSwgY3JlYXRlZDogdHJ1ZSB9KVxuICAgICAgICB0aGlzLnNlbGVjdGVkVGVybSA9IHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybVxuICAgICAgICB0aGlzLnVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnMoKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICB1cGRhdGVUZXJtRGF0YShmb3JtOmFueSwgZGF0YTphbnkpIHtcbiAgICBsZXQgYWRkaXRpb25hbFByb3BlcnRpZXMgPSAgZGF0YS5jaGlsZHJlbkRhdGEuYWRkaXRpb25hbFByb3BlcnRpZXNcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllc1snZGlzcGxheU5hbWUnXSA9IHRoaXMuY3JlYXRlVGhlbWVGb3JtLnZhbHVlLmRuYW1lXG4gICAgZm9ybS52YWx1ZS5hZGRpdGlvbmFsUHJvcGVydGllcyA9IGFkZGl0aW9uYWxQcm9wZXJ0aWVzXG4gICAgXG4gICAgZm9ybS52YWx1ZS5kaXNwbGF5TmFtZSA9IGZvcm0udmFsdWUuZG5hbWVcbiAgICBcbiAgICB0aGlzLmRpc2FibGVVcGRhdGUgPSB0cnVlXG4gICAgY29uc3QgZm9ybURhdGEgPSB7XG4gICAgICAvLyB1c2UgdGhpcyBpZiB5b3UgbmVlZCBkaXNhYmxlZCBmaWVsZCB2YWx1ZXMgOiBmb3JtLmdldFJhd1ZhbHVlKClcbiAgICAgIC4uLmZvcm0udmFsdWUsXG4gICAgICAvLyBkaXNwbGF5TmFtZTp7Li4uZm9ybS52YWx1ZS5kbmFtZX1cbiAgICB9XG4gICAgY29uc3QgdXBkYXRlRGF0YSA9IHtcbiAgICAgIGZvcm1EYXRhLFxuICAgICAgdXBkYXRlVGVybURhdGE6IGRhdGEuY2hpbGRyZW5EYXRhXG4gICAgfVxuICAgIHRoaXMudXBkYXRlVGVybURhdGFBc3NvY2lhdGlvbnModXBkYXRlRGF0YSlcbiAgfVxuXG5cbiAgdXBkYXRlVGVybURhdGFBc3NvY2lhdGlvbnModXBkYXRlRGF0YTphbnkpIHtcbiAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IHRydWVcbiAgICBsZXQgc2VsZWN0aW9uRGF0YSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldCh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKVxuICAgIGlmKCFzZWxlY3Rpb25EYXRhICkge1xuICAgICAgc2VsZWN0aW9uRGF0YSA9IHRoaXMuZGF0YS5jaGlsZHJlbkRhdGFcbiAgICB9XG4gICAgY29uc3QgbGlzdFRobWUgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UubGlzdC5nZXQodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSlcbiAgICBsZXQgdGhlbUFzc29jaWF0aW9uczogYW55XG4gICAgaWYobGlzdFRobWUgJiYgbGlzdFRobWUuY2hpbGRyZW4gJiYgbGlzdFRobWUuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBkYXRhID0gbGlzdFRobWUuY2hpbGRyZW4uZmluZCgoYykgPT4gYy5pZGVudGlmaWVyID09PSBzZWxlY3Rpb25EYXRhLmlkZW50aWZpZXIpXG4gICAgICB0aGVtQXNzb2NpYXRpb25zID0gZGF0YS5hc3NvY2lhdGlvbnMgPyBkYXRhLmFzc29jaWF0aW9ucy5tYXAoKGM6YW55KSA9PiB7XG4gICAgICAgIC8vIHJldHVybiB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciwgYXBwcm92YWxTdGF0dXM6IGMuYXNzb2NpYXRpb25Qcm9wZXJ0aWVzP2MuYXNzb2NpYXRpb25Qcm9wZXJ0aWVzLmFwcHJvdmFsU3RhdHVzOiAnRHJhZnQnIH1cbiAgICAgICAgcmV0dXJuIGMuaWRlbnRpZmllciA/ICB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciB9IDogbnVsbFxuICAgICAgfSkgOiBbXVxuICAgIH1cbiAgICBjb25zdCByZWd1ZXN0Qm9keSA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgdGVybToge1xuICAgICAgICAgIC4uLnVwZGF0ZURhdGEuZm9ybURhdGEsXG4gICAgICAgICAgLi4uKHRoZW1Bc3NvY2lhdGlvbnMgJiYgdGhlbUFzc29jaWF0aW9ucy5sZW5ndGgpID8ge2Fzc29jaWF0aW9uczogdGhlbUFzc29jaWF0aW9uc30gOiBudWxsLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVUZXJtKHRoaXMuZGF0YS5mcmFtZXdvcmtJZCwgc2VsZWN0aW9uRGF0YS5jYXRlZ29yeSwgc2VsZWN0aW9uRGF0YS5jb2RlLCByZWd1ZXN0Qm9keSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gdGhpcy5zZWxlY3RlZFRlcm1bJ2Fzc29jaWF0aW9uUHJvcGVydGllcyddWydhcHByb3ZhbFN0YXR1cyddID0gJ0RyYWZ0JztcblxuICAgICAgICAvLyB0aGlzIHZhbHVlIGlzIGZvciBzZWxlY3RlZCB0ZXJtIGluIGNhc2Ugb2YgY3JlYXRlIHNjZW5hcmlvLCBpbiBjYXNlIG9mIGVkaXQgc2NlbmFyaW8gdGhpcyB3b24ndCBiZSBhdmFpYWJsZSBcbiAgICAgICAgLy8gc28gdGVybSBpcyBzZXQgZnJvbSBjaGlsZGRhdGEgd2hpY2ggaXMgcmVjZWl2ZWQgZnJvbSBwYXJhbXMgaW4gdXBkYXRlRGF0YVxuICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLnNlbGVjdGVkVGVybSAmJiB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA/IHRoaXMuc2VsZWN0ZWRUZXJtIDogKHVwZGF0ZURhdGEpID8gey4uLnVwZGF0ZURhdGEudXBkYXRlVGVybURhdGEsIC4uLnVwZGF0ZURhdGEuZm9ybURhdGF9IDoge31cbiAgICAgICAgXG4gICAgICAgIHRoaXMuZGlzYWJsZVVwZGF0ZSA9IGZhbHNlXG4gICAgICAgIFxuICAgICAgICAvLyBjb25zdCBzZWxlY3Rpb25EYXRhID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpXG4gICAgICAgIHNlbGVjdGlvbkRhdGFbJ2Rlc2NyaXB0aW9uJ10gPSByZWd1ZXN0Qm9keS5yZXF1ZXN0LnRlcm0uZGVzY3JpcHRpb25cbiAgICAgICAgc2VsZWN0aW9uRGF0YVsnYWRkaXRpb25hbFByb3BlcnRpZXMnXSA9IHJlZ3Vlc3RCb2R5LnJlcXVlc3QudGVybS5hZGRpdGlvbmFsUHJvcGVydGllc1xuICAgICAgICBzZWxlY3Rpb25EYXRhWydhc3NvY2lhdGlvbnMnXSA9IHRoZW1Bc3NvY2lhdGlvbnNcbiAgICAgICAgXG5cbiAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke3ZhbHVlLmNhdGVnb3J5fSB1cGRhdGVkIHN1Y2Nlc3NmdWxseWApXG4gICAgICAgIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiB7IC4uLnZhbHVlIH0sIGNyZWF0ZWQ6IHRydWUgfSlcbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUZ1bGxUZXJtRGF0YUxvY2FsTWFwKHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsIHNlbGVjdGlvbkRhdGEpXG4gICAgfSwgKF9lcnI6IGFueSkgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihgRWRpdCAke3RoaXMuZGF0YS5jb2x1bW5JbmZvLm5hbWV9IGZhaWxlZCwgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlcmApXG4gICAgfSlcbiAgfVxuXG4gIHVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnModXBkYXRlRGF0YT86IGFueSkge1xuICAgIGxldCBhc3NvY2lhdGlvbnMgPSBbXVxuICAgIGxldCB0ZW1wXG4gICAgbGV0IGNvdW50ZXIgPSAwXG4gICAgLy8gbGV0IGxvY2FsSXNFeGlzdCA9IGZhbHNlXG4gICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZm9yRWFjaCgocGFyZW50KSA9PiB7XG4gICAgICBjb3VudGVyKytcbiAgICAgIHRlbXAgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4uZmlsdGVyKChjaGlsZDphbnkpID0+IGNoaWxkLmlkZW50aWZpZXIgPT09IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpIDogbnVsbFxuICAgICAgYXNzb2NpYXRpb25zID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLm1hcCgoYzphbnkpID0+IHtcbiAgICAgICAgLy8gcmV0dXJuIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyLCBhcHByb3ZhbFN0YXR1czogYy5hc3NvY2lhdGlvblByb3BlcnRpZXM/Yy5hc3NvY2lhdGlvblByb3BlcnRpZXMuYXBwcm92YWxTdGF0dXM6ICdEcmFmdCcgfVxuICAgICAgICByZXR1cm4gYy5pZGVudGlmaWVyID8gIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyIH0gOiBudWxsXG4gICAgICB9KSA6IFtdXG4gICAgICBpZiAodGVtcCAmJiB0ZW1wLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmlzVGVybUV4aXN0ID0gdHJ1ZVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFzc29jaWF0aW9ucy5wdXNoKHsgaWRlbnRpZmllcjogdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllciwgYXBwcm92YWxTdGF0dXM6IGFwcENvbnN0YW50cy5EUkFGVCB9KVxuICAgICAgICBpZih0aGlzLnNlbGVjdGVkVGVybSAmJiB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgYXNzb2NpYXRpb25zLnB1c2goeyBpZGVudGlmaWVyOiB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IGZhbHNlXG4gICAgICAgIGNvbnN0IHJlZ3Vlc3RCb2R5ID0ge1xuICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgLi4uKHVwZGF0ZURhdGEgJiYgdXBkYXRlRGF0YS5mb3JtRGF0YSAmJiB1cGRhdGVEYXRhLnVwZGF0ZVRlcm1EYXRhLmNvZGUgPT09IHBhcmVudC5jb2RlKSA/IHsuLi51cGRhdGVEYXRhLmZvcm1EYXRhfTogbnVsbCxcbiAgICAgICAgICAgICAgLi4uKGFzc29jaWF0aW9ucyAmJiBhc3NvY2lhdGlvbnMubGVuZ3RoKSA/IHthc3NvY2lhdGlvbnM6IFsuLi5hc3NvY2lhdGlvbnNdfSA6IG51bGwsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogdGhpcy5zZWxlY3RlZFRlcm0sIGNyZWF0ZWQ6IHRydWUgfSlcbiAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCBwYXJlbnQuY2F0ZWdvcnksIHBhcmVudC5jb2RlLCByZWd1ZXN0Qm9keSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBpZiAoY291bnRlciA9PT0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3Quc2l6ZSkge1xuICAgICAgICAgICAgLy8gdGhpcy5zZWxlY3RlZFRlcm1bJ2Fzc29jaWF0aW9uUHJvcGVydGllcyddWydhcHByb3ZhbFN0YXR1cyddID0gJ0RyYWZ0JztcblxuICAgICAgICAgICAgLy8gdGhpcyB2YWx1ZSBpcyBmb3Igc2VsZWN0ZWQgdGVybSBpbiBjYXNlIG9mIGNyZWF0ZSBzY2VuYXJpbywgaW4gY2FzZSBvZiBlZGl0IHNjZW5hcmlvIHRoaXMgd29uJ3QgYmUgYXZhaWFibGUgXG4gICAgICAgICAgICAvLyBzbyB0ZXJtIGlzIHNldCBmcm9tIGNoaWxkZGF0YSB3aGljaCBpcyByZWNlaXZlZCBmcm9tIHBhcmFtcyBpbiB1cGRhdGVEYXRhXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLnNlbGVjdGVkVGVybSAmJiB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA/IHRoaXMuc2VsZWN0ZWRUZXJtIDogKHVwZGF0ZURhdGEpID8gey4uLnVwZGF0ZURhdGEudXBkYXRlVGVybURhdGEsIC4uLnVwZGF0ZURhdGEuZm9ybURhdGF9IDoge31cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlVXBkYXRlID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYENvbXBldGVuY3kgJHt2YWx1ZS5jYXRlZ29yeX0gdXBkYXRlZCBzdWNjZXNzZnVsbHlgKVxuICAgICAgICAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IHsgLi4udmFsdWUgfSwgY3JlYXRlZDogdHJ1ZSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgKF9lcnI6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVkaXQgJHt0aGlzLmRhdGEuY29sdW1uSW5mby5uYW1lfSBmYWlsZWQsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXJgKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBzYXZlVGhlbWVUZXJtKCkge1xuICAgIGlmICh0aGlzLl9maWx0ZXIodGhpcy5jcmVhdGVUaGVtZUZvcm0udmFsdWUubmFtZSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGhpcy5jcmVhdGVUaGVtZUZvcm0udmFsaWQpIHtcbiAgICAgIGNvbnN0IHRlcm06IE5TRnJhbWV3b3JrLklDcmVhdGVUZXJtID0ge1xuICAgICAgICBjb2RlOiB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0VXVpZCgpLFxuICAgICAgICBuYW1lOiB0aGlzLmNyZWF0ZVRoZW1lRm9ybS52YWx1ZS5uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5jcmVhdGVUaGVtZUZvcm0udmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICAgXG4gICAgICAgIGNhdGVnb3J5OiB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLFxuICAgICAgICBzdGF0dXM6IGFwcENvbnN0YW50cy5MSVZFLFxuICAgICAgICAvLyBhcHByb3ZhbFN0YXR1czphcHBDb25zdGFudHMuRFJBRlQsXG4gICAgICAgIHBhcmVudHM6IFtcbiAgICAgICAgICB7IGlkZW50aWZpZXI6IGAke3RoaXMuZGF0YS5mcmFtZXdvcmtJZC50b0xvd2VyQ2FzZSgpfV8ke3RoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGV9YCB9XG4gICAgICAgIF0sXG4gICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgZGlzcGxheU5hbWU6dGhpcy5jcmVhdGVUZXJtRm9ybS52YWx1ZS5kbmFtZSxcbiAgICAgICAgICB0aW1lU3RhbXA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByZXF1ZXN0Qm9keTphbnkgPSB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICB0ZXJtOiB0ZXJtXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmNyZWF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLCByZXF1ZXN0Qm9keSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm1bJ2lkZW50aWZpZXInXSA9IHJlcy5yZXN1bHQubm9kZV9pZFswXVxuICAgICAgICB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtLCBjcmVhdGVkOiB0cnVlIH0pXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXJtID0gcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtXG4gICAgICAgIHRoaXMudXBkYXRlVGVybUFzc29jaWF0aW9ucygpXG4gICAgICB9LCAoX2VycjogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENyZWF0ZSAke3RoaXMuZGF0YS5jb2x1bW5JbmZvLm5hbWV9IGZhaWxlZCwgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlcmApXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGRpYWxvZ0Nsb3NlKHRlcm06IGFueSkge1xuICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5wdWJsaXNoRnJhbWV3b3JrKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRlcm0pXG4gICAgfSk7XG4gIH1cblxuXG4gIGFzeW5jIHVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnNNdWx0aVYyKGNyZWF0ZWRUZXJtczogYW55W10sIHBhcmVudFNlbGVjdGVkVGVybT86YW55KSB7XG4gICBcbiAgICB0aGlzLnNlbGVjdGVkVGVybUFycmF5ID0gW11cbiAgICAvLyBsZXQgY3JlYXRlZFRlcm1zQ291bnRlciA9IDBcbiAgICBsZXQgY3JlYXRlZFRlcm1zSWRlbnRpZmllcnMgPSBbXVxuICAgIHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXkgPSBjcmVhdGVkVGVybXNcbiAgICB0aGlzLnNlbGVjdGVkVGVybSA9IGNyZWF0ZWRUZXJtc1tjcmVhdGVkVGVybXMubGVuZ3RoIC0xXVxuICAgIGZvcihsZXQgY3JlYXRlZFRlcm0gb2YgY3JlYXRlZFRlcm1zKSB7XG4gICAgICBjcmVhdGVkVGVybXNJZGVudGlmaWVycy5wdXNoKHsgaWRlbnRpZmllcjogY3JlYXRlZFRlcm0uaWRlbnRpZmllciB9KVxuICAgIH1cbiAgICBsZXQgYXNzb2NpYXRpb25zID0gW11cbiAgICBsZXQgY291bnRlciA9IDBcbiAgIGlmKGNyZWF0ZWRUZXJtcyAmJiBjcmVhdGVkVGVybXMubGVuZ3RoKSB7XG4gICAgICBsZXQgcGFyZW50OiBhbnlcbiAgICAgbGV0IGNyZWF0ZWRUZXJtc0NvdW50ZXIgPSAwXG4gICAgIGlmKCFwYXJlbnRTZWxlY3RlZFRlcm0pIHtcbiAgICAgIGZvcihsZXQgY3JlYXRlZFRlcm0gb2YgY3JlYXRlZFRlcm1zKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXJtID0gY3JlYXRlZFRlcm1cbiAgICAgICAgbGV0IHRlbXBcbiAgICAgICAgZm9yKGNvbnN0IFt2YWx1ZV0gb2YgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3Qpe1xuICAgICAgICAgICBwYXJlbnQgPSB2YWx1ZVxuICAgICAgICAgIGNvdW50ZXIrK1xuICAgICAgICAgIHRlbXAgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4uZmlsdGVyKChjaGlsZDogYW55KSA9PiBjaGlsZC5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA6IG51bGxcbiAgICAgICAgICBhc3NvY2lhdGlvbnMgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ubWFwKChjOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vIHJldHVybiB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciwgYXBwcm92YWxTdGF0dXM6IGMuYXNzb2NpYXRpb25Qcm9wZXJ0aWVzP2MuYXNzb2NpYXRpb25Qcm9wZXJ0aWVzLmFwcHJvdmFsU3RhdHVzOiAnRHJhZnQnIH1cbiAgICAgICAgICAgIHJldHVybiBjLmlkZW50aWZpZXIgPyAgeyBpZGVudGlmaWVyOiBjLmlkZW50aWZpZXIgfSA6IG51bGxcbiAgICAgICAgICB9KSA6IFtdXG4gICAgICAgICAgaWYgKHRlbXAgJiYgdGVtcC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuaXNUZXJtRXhpc3QgPSB0cnVlXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhc3NvY2lhdGlvbnMucHVzaCh7IGlkZW50aWZpZXI6IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIgfSlcbiAgICAgICAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IGZhbHNlXG4gICAgICAgICAgICAgIC8vIGlmKGNyZWF0ZWRUZXJtc0NvdW50ZXIgPT09IChjcmVhdGVkVGVybXMubGVuZ3RoLTEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVndWVzdEJvZHkgPSB7XG4gICAgICAgICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi4oYXNzb2NpYXRpb25zICYmIGFzc29jaWF0aW9ucy5sZW5ndGgpID8ge2Fzc29jaWF0aW9uczogWy4uLmFzc29jaWF0aW9uc119IDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogdGhpcy5zZWxlY3RlZFRlcm0sIGNyZWF0ZWQ6IHRydWUgfSlcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNhbGxVcGRhdGVBc3NvY2lhdGlvbnMoY291bnRlciwgcGFyZW50LCByZWd1ZXN0Qm9keSlcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjcmVhdGVkVGVybXNDb3VudGVyKytcbiAgICAgICAgaWYoY3JlYXRlZFRlcm1zQ291bnRlciA9PT0gY3JlYXRlZFRlcm1zLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVGcmFtZXdvcmtMaXN0KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsIHBhcmVudCwgY3JlYXRlZFRlcm1zIClcbiAgICAgICAgICB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogW3RoaXMuc2VsZWN0ZWRUZXJtXSwgY3JlYXRlZDogdHJ1ZSwgbXVsdGk6dHJ1ZSB9KVxuICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID1mYWxzZTtcbiAgICAgICAgICBpZihjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnkgPT09ICd0aGVtZScpe1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke2NyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoY3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5ID09PSAnc3VidGhlbWUnKXtcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYENvbXBldGVuY3kgJHtjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnl9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRTZWxlY3RlZFRlcm1cbiAgICAgIGFzc29jaWF0aW9ucyA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5tYXAoKGM6YW55KSA9PiB7XG4gICAgICAgIHJldHVybiBjLmlkZW50aWZpZXIgPyAgeyBpZGVudGlmaWVyOiBjLmlkZW50aWZpZXIgfSA6IG51bGxcbiAgICAgIH0pIDogW11cbiAgICAgICAgYXNzb2NpYXRpb25zID0gWy4uLmFzc29jaWF0aW9ucywgLi4uY3JlYXRlZFRlcm1zSWRlbnRpZmllcnNdXG4gICAgICAgIHRoaXMuaXNUZXJtRXhpc3QgPSBmYWxzZVxuICAgICAgICBjb25zdCByZWd1ZXN0Qm9keSA9IHtcbiAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICB0ZXJtOiB7XG4gICAgICAgICAgICAgIC4uLihhc3NvY2lhdGlvbnMgJiYgYXNzb2NpYXRpb25zLmxlbmd0aCkgPyB7YXNzb2NpYXRpb25zOiBbLi4uYXNzb2NpYXRpb25zXX0gOiBudWxsLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmNhbGxVcGRhdGVBc3NvY2lhdGlvbnNWMihjb3VudGVyLCBwYXJlbnQsIHJlZ3Vlc3RCb2R5KVxuXG4gICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUZyYW1ld29ya0xpc3QodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgcGFyZW50LCBjcmVhdGVkVGVybXMgKVxuICAgICAgICAgIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiB0aGlzLnNlbGVjdGVkVGVybUFycmF5LCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlIH0pXG4gICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPWZhbHNlO1xuICAgICAgICAgIGlmKGNyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeSA9PT0gJ3RoZW1lJyl7XG4gICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5ICR7Y3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5fSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnkgPT09ICdzdWJ0aGVtZScpe1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke2NyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICB9XG4gICAgIH1cbiAgIH1cbiB9XG5cbiBhc3luYyBjYWxsVXBkYXRlQXNzb2NpYXRpb25zVjIoY291bnRlcjphbnksIHBhcmVudDphbnksIHJlZ3Vlc3RCb2R5IDphbnkpOiBQcm9taXNlPGFueT57XG4gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHBhcmVudC5jYXRlZ29yeSwgcGFyZW50LmNvZGUsIHJlZ3Vlc3RCb2R5KS5zdWJzY3JpYmUoYXN5bmMgKCkgPT4ge1xuICAgICAgcGFyZW50WydjaGlsZHJlbiddID0gcGFyZW50ICYmIHBhcmVudC5jaGlsZHJlbiA/Wy4uLnBhcmVudC5jaGlsZHJlbiwgLi4udGhpcy5zZWxlY3RlZFRlcm1BcnJheV06dGhpcy5zZWxlY3RlZFRlcm1BcnJheVxuICAgICAgICBsZXQgbGlzdERhdGEgOiBhbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UubGlzdC5nZXQodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSlcbiAgICAgICAgbGV0IGRpZmZlcmVuY2VEYXRhID0gW11cbiAgICAgICAgaWYobGlzdERhdGEgJiYgbGlzdERhdGEuY2hpbGRyZW4gJiYgbGlzdERhdGEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgZGlmZmVyZW5jZURhdGEgID0gXy5kaWZmZXJlbmNlQnkodGhpcy5zZWxlY3RlZFRlcm1BcnJheSxsaXN0RGF0YS5jaGlsZHJlbiwgJ2lkZW50aWZpZXInKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaWZmZXJlbmNlRGF0YSA9IHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXlcbiAgICAgICAgfVxuICAgICAgICBsaXN0RGF0YVsnYXNzb2NpYXRpb25zJ10gPSBsaXN0RGF0YSAmJiBsaXN0RGF0YS5hc3NvY2lhdGlvbnMgP1suLi5saXN0RGF0YS5hc3NvY2lhdGlvbnMsIC4uLmRpZmZlcmVuY2VEYXRhXTpkaWZmZXJlbmNlRGF0YVxuICAgICAgICBsaXN0RGF0YVsnY2hpbGRyZW4nXSA9IGxpc3REYXRhICYmIGxpc3REYXRhLmNoaWxkcmVuID9bLi4ubGlzdERhdGEuY2hpbGRyZW4sIC4uLmRpZmZlcmVuY2VEYXRhXTpkaWZmZXJlbmNlRGF0YVxuXG4gICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmZvckVhY2goKHNlbGVjdGVkRGF0YTogYW55KT0+IHtcbiAgICAgICAgICBsZXQgbGlzdERhdGEgOiBhbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UubGlzdC5nZXQoc2VsZWN0ZWREYXRhLmNhdGVnb3J5KVxuICAgICAgICAgIGlmKGxpc3REYXRhICYmIGxpc3REYXRhLmNoaWxkcmVuICYmIGxpc3REYXRhLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUxvY2FsTGlzdChsaXN0RGF0YSxwYXJlbnQsIHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXksICdjcmVhdGUnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSkgXG4gICAgICAgaWYgKGNvdW50ZXIgPT09IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LnNpemUpIHtcbiAgICAgICAgIC8vIHRoaXMuc2VsZWN0ZWRUZXJtWydhc3NvY2lhdGlvblByb3BlcnRpZXMnXVsnYXBwcm92YWxTdGF0dXMnXSA9ICdEcmFmdCc7XG4gXG4gICAgICAgICAvLyB0aGlzIHZhbHVlIGlzIGZvciBzZWxlY3RlZCB0ZXJtIGluIGNhc2Ugb2YgY3JlYXRlIHNjZW5hcmlvLCBpbiBjYXNlIG9mIGVkaXQgc2NlbmFyaW8gdGhpcyB3b24ndCBiZSBhdmFpYWJsZSBcbiAgICAgICAgIC8vIHNvIHRlcm0gaXMgc2V0IGZyb20gY2hpbGRkYXRhIHdoaWNoIGlzIHJlY2VpdmVkIGZyb20gcGFyYW1zIGluIHVwZGF0ZURhdGFcbiAgICAgICAgLy8gIGNvbnN0IHZhbHVlID0gKHRoaXMuc2VsZWN0ZWRUZXJtICYmIHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpID8gdGhpcy5zZWxlY3RlZFRlcm0gOiB7fVxuICAgICAgICAvLyAgY29uc3QgZm91bmQgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4uZmluZChjPT4gYy5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA6IGZhbHNlXG4gICAgICAgICAvLyBpZighZm91bmQpIHtcbiAgICAgICAgIC8vICAgcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcy5zZWxlY3RlZFRlcm0pIDogcGFyZW50WydjaGlsZHJlbiddID0gW3RoaXMuc2VsZWN0ZWRUZXJtXVxuICAgICAgICAgLy8gfVxuICAgICAgICAgdGhpcy5kaXNhYmxlVXBkYXRlID0gZmFsc2VcbiAgICAgICAgIC8vIHRoaXMuZnJhbWVXb3JrU2VydmljZS5wdWJsaXNoRnJhbWV3b3JrKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAvLyAgIC8vIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRlcm0pXG4gICAgICAgICAvLyAgIHJldHVybiByZXNvbHZlKHRydWUpXG4gICAgICAgICAvLyB9KTtcbiAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICB9IGVsc2Uge1xuICAgICAgICAgcmV0dXJuIHJlc29sdmUodHJ1ZSlcbiAgICAgICB9XG4gICAgIH0sIChfZXJyOiBhbnkpID0+IHtcbiAgICAgICBjb25zb2xlLmVycm9yKGBFZGl0ICR7dGhpcy5kYXRhLmNvbHVtbkluZm8ubmFtZX0gZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyYClcbiAgICAgfSlcbiAgIH0pXG4gIH1cblxufSIsIjxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImRhdGE/LmNvbHVtbkluZm8/LmNvZGUgfHwgJ2RlZmF1bHRDcmVhdGUnXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc2FibGVNdWx0aUNyZWF0ZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LTEgdy0xMDAgYWJzb2x1dGUgbG9hZGVyLWJnIGl0ZW1zLWNlbnRlciBwdC01IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPG1hdC1zcGlubmVyIGNsYXNzPVwiZGlzcGxheS1pbmxpbmUtYmxvY2sgbWItNVwiIFtkaWFtZXRlcl09XCI1MFwiIFtzdHJva2VXaWR0aF09XCIzXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICA8IS0tIDxwPnt7bG9hZGVyTXNnfX08L3A+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdCBbbmdUZW1wbGF0ZU91dGxldF09XCJ0aGVtZUNyZWF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0aGVtZSdcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJ0aGVtZUNyZWF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdWJ0aGVtZSdcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJ0aGVtZUNyZWF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkZXNpZ25hdGlvbidcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJ0aGVtZURlc2lnbmF0aW9uXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NvbXBldGVuY3knXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29tcFRoZW1lXCI+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNtb2RhbFRpdGxlPlxuICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdjcmVhdGUnIHx8IGRhdGE/Lm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGVcIiBtYXQtZGlhbG9nLXRpdGxlPnt7ZGF0YS5jb2x1bW5JbmZvLm5hbWUgPT09ICdUaGVtZScgPyBhcHBfc3RyaW5ncy5hZGRDb21wZXRlbmN5IDogYXBwX3N0cmluZ3MuY3JlYXRlTmV3fX0ge3tkYXRhLmNvbHVtbkluZm8ubmFtZX19PC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+IC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnY3JlYXRlJyB8fCBkYXRhPy5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlXCIgbWF0LWRpYWxvZy10aXRsZT5BZGQge3tkYXRhPy5jb2x1bW5JbmZvPy5jb25maWc/LmNhdGVnb3J5RGlzcGxheU5hbWUgfHwgZGF0YS5jb2x1bW5JbmZvLm5hbWUgfX0gPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICd2aWV3J1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlXCIgbWF0LWRpYWxvZy10aXRsZT48L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2VkaXQnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGVcIiBtYXQtZGlhbG9nLXRpdGxlPnt7YXBwX3N0cmluZ3MuZWRpdH19IHt7ZGF0YT8uY29sdW1uSW5mbz8uY29uZmlnPy5jYXRlZ29yeURpc3BsYXlOYW1lIHx8IGRhdGEuY29sdW1uSW5mby5uYW1lfX08L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdENyZWF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibW9kYWxUaXRsZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNyZWF0ZVRlcm1Gb3JtXCIgbm92YWxpZGF0ZSAobmdTdWJtaXQpPVwiZGlzYWJsZUNyZWF0ZT91cGRhdGVUZXJtQXNzb2NpYXRpb25zKCk6c2F2ZVRlcm0oKVwiXG4gICAgICAgICAgICBjbGFzcz1cImRlZmF1bHRGb3JtXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICA8IS0tIDxtYXQtbGFiZWw+RW50ZXIge3tkYXRhLm5hbWV9fSBuYW1lPC9tYXQtbGFiZWw+IC0tPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCIgKG9wdGlvblNlbGVjdGVkKT1cIm9uU2VsZWN0KCRldmVudC5vcHRpb24sIGNyZWF0ZVRlcm1Gb3JtKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlZFRlcm1MaXN0cyB8IGFzeW5jXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc1Rlcm1FeGlzdFwiPnt7YXBwX3N0cmluZ3MuYWxyZWFkeUV4aXN0fX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICA8IS0tIDxtYXQtbGFiZWw+RW50ZXIge3tkYXRhLm5hbWV9fSBuYW1lPC9tYXQtbGFiZWw+IC0tPlxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5kZXNjcmlwdGlvbn19XCIgbWF4bGVuZ3RoPVwiMjAwMFwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPGZvb3RlciBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwiZGVmYXVsdFwiIHR5cGU9XCJyZXNldFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkaWFsb2dDbG9zZSgnJylcIj57e2FwcF9zdHJpbmdzLmNhbmNlbH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwic3VibWl0XCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWRpc2FibGVDcmVhdGUgfHwgZGlzYWJsZU11bHRpQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy5jcmVhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRpc2FibGVDcmVhdGVcIj57e2FwcF9zdHJpbmdzLnVwZGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICA8L2Zvb3Rlcj5cbiAgICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0aGVtZUNyZWF0ZSA+XG4gICAgPGRpdiBjbGFzcz1cImRpYWxvZ05ld1wiIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQtZGl2JzogZGlzYWJsZU11bHRpQ3JlYXRlfVwiID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJtb2RhbFRpdGxlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0ZXJtIG9mIGRhdGE/LnNlbGVjdGVkUGFyZW50VGVybXNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsXCIgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7Z2V0Q2F0ZWdvcnlOYW1lKHRlcm0uY2F0ZWdvcnksdGVybSl9fVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IG5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlcm0ubmFtZVwiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgIT09ICdtdWx0aS1jcmVhdGUnXCI+XG4gICAgICAgICAgICA8Zm9ybSBjbGFzcz1cInRoZW1lRm9ybVwiIFtmb3JtR3JvdXBdPVwiY3JlYXRlVGhlbWVGb3JtXCIgbm92YWxpZGF0ZVxuICAgICAgICAgICAgICAgIChuZ1N1Ym1pdCk9XCJkaXNhYmxlQ3JlYXRlP3VwZGF0ZVRlcm1Bc3NvY2lhdGlvbnMoKTpzYXZlVGhlbWVUZXJtKClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyIG1hcmdpbi10b3Atc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTQgXCIgKm5nSWY9XCJkYXRhLmNvbHVtbkluZm8/LmNvZGUgIT09ICdjb21wZXRlbmN5YXJlYScgJiYgZGF0YS5tb2RlID09PSAndmlldydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncz8ubmFtZX19XCIgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lIChzZWxlY3Rpb25DaGFuZ2UpPVwiY2hhbmdlKCRldmVudCxjcmVhdGVUaGVtZUZvcm0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICNzZWFyY2ggYXV0b2NvbXBsZXRlPVwib2ZmXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiBjbGFzcz1cImFzc2lnbmVlU2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiICAoa2V5dXApPVwib25LZXkoJGV2ZW50KVwiIG1hdElucHV0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRNYXN0ZXJMaXN0XCIgICAgKGJsdXIpPVwidXBkYXRlRG5hbWUob3B0aW9uPy50aXRsZSwgY3JlYXRlVGhlbWVGb3JtKVwiIFtkaXNhYmxlZF09XCJvbkRpc2FibGVUaGVtZShvcHRpb24pXCIgW3ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9uLnRpdGxlfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJmaWx0ZXJlZE1hc3Rlckxpc3QubGVuZ3RoID09PSAwXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIHJlc3VsdHMgZm91bmQhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJ1cGRhdGVEbmFtZShuYW1lLnZhbHVlLCBjcmVhdGVUaGVtZUZvcm0pXCIgbWF4bGVuZ3RoPVwiNzBcIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQub3B0aW9uLCBjcmVhdGVUaGVtZUZvcm0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZWRUZXJtTGlzdHMgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc1Rlcm1FeGlzdFwiPnt7YXBwX3N0cmluZ3MuYWxyZWFkeUV4aXN0fX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpbmZvLWljb24gY3Vyc29yLXBvaW50ZXJcIiBbbWF0VG9vbHRpcF09XCJ0b29sVGlwVGV4dFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBDbGFzcz1cInRvb2x0aXAtc2VjXCI+aW5mb19vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkbmFtZVwiIGlkPVwiZG5hbWVcIiAjZG5hbWUgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJGaWVsZCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIHRoZSBuYW1lIGZpZWxkLlwiIG1heGxlbmd0aD1cIjcwXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQub3B0aW9uLCBjcmVhdGVUaGVtZUZvcm0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZWRUZXJtTGlzdHMgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTQgXCIgKm5nSWY9XCJkYXRhLmNvbHVtbkluZm8/LmNvZGUgPT09ICdjb21wZXRlbmN5YXJlYScgJiYgZGF0YS5tb2RlID09PSAndmlldydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0IFt2YWx1ZV09XCJkYXRhPy5jaGlsZHJlbkRhdGE/Lm5hbWVcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmbmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG49XCJGaXJzdCBOYW1lIGxhYmVsfExhYmVsIHdoaWNoIGV4cGxhaW5zIHRoZSB1c2VyIHRvIGVudGVyIGZpcnN0IG5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuLWFyaWEtbGFiZWwgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1sYWJlbD5FbnRlciB7e2RhdGEubmFtZX19IG5hbWU8L21hdC1sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBbY2RrVGV4dGFyZWFBdXRvc2l6ZV0gW2Nka0F1dG9zaXplTWF4Um93c109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2RrQXV0b3NpemVNaW5Sb3dzXT1cIjNcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MuZGVzY3JpcHRpb259fVwiIG1heGxlbmd0aD1cIjIwMDBcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGZvb3RlciBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cImRlZmF1bHRcIiB0eXBlPVwicmVzZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRpYWxvZ0Nsb3NlKCcnKVwiPnt7YXBwX3N0cmluZ3MuY2FuY2VsfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdjcmVhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJzdWJtaXRcIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtPy5pbnZhbGlkXCIgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiPnt7YXBwX3N0cmluZ3MuY3JlYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnZWRpdCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVUZXJtRGF0YShjcmVhdGVUaGVtZUZvcm0sIGRhdGEpXCIgW2Rpc2FibGVkXT1cImNyZWF0ZVRoZW1lRm9ybT8uaW52YWxpZCB8fCBkaXNhYmxlVXBkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy51cGRhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Zvb3Rlcj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiPlxuICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJ0aGVtZUZvcm1cIiBbZm9ybUdyb3VwXT1cImNyZWF0ZVRoZW1lRm9ybU11bHRpXCIgbm92YWxpZGF0ZVxuICAgICAgICAgICAgICAgIChuZ1N1Ym1pdCk9XCJkaXNhYmxlQ3JlYXRlP3VwZGF0ZVRlcm1Bc3NvY2lhdGlvbnMoKTpzYXZlVGhlbWVUZXJtKClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWVuZCBtYi00XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWF0LWJ1dHRvbiBmbGV4IGl0ZW1zLWNlbnRlciBcIiAqbmdJZj1cImRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIiAoY2xpY2spPVwiYWRkVGhlbWVGaWVsZHMoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibXItMiBtYXQtaWNvbi1jdXN0b20gXCI+YWRkX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBtb3JlXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxtYXQtYWNjb3JkaW9uIGZvcm1BcnJheU5hbWU9XCJ0aGVtZUZpZWxkc1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCAjbWVwPVwibWF0RXhwYW5zaW9uUGFuZWxcIiAqbmdGb3I9XCJsZXQgZmllbGQgb2YgdGhlbWVGaWVsZHNDb250cm9sczsgbGV0IGkgPSBpbmRleDsgbGV0IGlzRmlyc3QgPSBmaXJzdFwiIFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hcmdpbi1ib3R0b20tbFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBbZXhwYW5kZWRdPVwiaXNGaXJzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Z2V0RXhwYW5zaW9uVGl0bGUoZmllbGQpfX0gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtcGFuZWwtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVRoZW1lRmllbGRzKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1jdXN0b20gXCI+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXIgbWFyZ2luLXRvcC1zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00IFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJ1cGRhdGVEbmFtZShuYW1lLnZhbHVlLCBjcmVhdGVUaGVtZUZvcm1NdWx0aSwgaSlcIiBtYXhsZW5ndGg9XCI3MFwiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50Lm9wdGlvbiwgY3JlYXRlVGhlbWVGb3JtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVkVGVybUxpc3RzIHwgYXN5bmNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uLm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncz8ubmFtZX19XCIgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lIChzZWxlY3Rpb25DaGFuZ2UpPVwiY2hhbmdlKCRldmVudCxjcmVhdGVUaGVtZUZvcm1NdWx0aSwgaSApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjc2VhcmNoIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgY2xhc3M9XCJhc3NpZ25lZVNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgICAoa2V5dXApPVwib25LZXkoJGV2ZW50KVwiIG1hdElucHV0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkTWFzdGVyTGlzdFwiICAgIChibHVyKT1cInVwZGF0ZURuYW1lKG9wdGlvbj8udGl0bGUsIGNyZWF0ZVRoZW1lRm9ybU11bHRpLCBpKVwiIFtkaXNhYmxlZF09XCJvbkRpc2FibGVUaGVtZShvcHRpb24pXCIgIFt2YWx1ZV09XCJvcHRpb25cIj57e29wdGlvbi50aXRsZX19IDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJmaWx0ZXJlZE1hc3Rlckxpc3QubGVuZ3RoID09PSAwXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyByZXN1bHRzIGZvdW5kIVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc1Rlcm1FeGlzdFwiPnt7YXBwX3N0cmluZ3M/LmFscmVhZHlFeGlzdH19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaW5mby1pY29uIGN1cnNvci1wb2ludGVyXCIgW21hdFRvb2x0aXBdPVwidG9vbFRpcFRleHRcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcENsYXNzPVwidG9vbHRpcC1zZWNcIj5pbmZvX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZG5hbWVcIiBpZD1cImRuYW1lXCIgI2RuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZpZWxkIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gdGhlIG5hbWUgZmllbGQuXCIgbWF4bGVuZ3RoPVwiNzBcIiBbZGlzYWJsZWRdPVwibmFtZT8udmFsdWU/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50Lm9wdGlvbiwgY3JlYXRlVGhlbWVGb3JtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVkVGVybUxpc3RzIHwgYXN5bmNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uLm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG49XCJGaXJzdCBOYW1lIGxhYmVsfExhYmVsIHdoaWNoIGV4cGxhaW5zIHRoZSB1c2VyIHRvIGVudGVyIGZpcnN0IG5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tYXJpYS1sYWJlbCBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtbGFiZWw+RW50ZXIge3tkYXRhLm5hbWV9fSBuYW1lPC9tYXQtbGFiZWw+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBbY2RrVGV4dGFyZWFBdXRvc2l6ZV0gW2Nka0F1dG9zaXplTWF4Um93c109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZGtBdXRvc2l6ZU1pblJvd3NdPVwiM1wiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLmRlc2NyaXB0aW9ufX1cIiBtYXhsZW5ndGg9XCIyMDAwXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJtZXAuZXhwYW5kZWQgPSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNyZWF0ZVRoZW1lRm9ybU11bHRpPy5nZXQoJ3RoZW1lRmllbGRzJylbJ2NvbnRyb2xzJ11baV0uaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICAgICAgICAgIDwvbWF0LWFjY29yZGlvbj5cbiAgICAgICAgICAgICAgICA8Zm9vdGVyIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwiZGVmYXVsdFwiIHR5cGU9XCJyZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGlhbG9nQ2xvc2UoJycpXCI+e3thcHBfc3RyaW5ncy5jYW5jZWx9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2NyZWF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjcmVhdGVUaGVtZUZvcm0/LmludmFsaWRcIiAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy5hZGRfYnRufX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNyZWF0ZVRoZW1lRm9ybU11bHRpLmludmFsaWQgfHwgZGlzYWJsZU11bHRpQ3JlYXRlXCIgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiIChjbGljayk9XCJtdWx0aUNyZWF0ZShjcmVhdGVUaGVtZUZvcm1NdWx0aSwgZGF0YSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FwcF9zdHJpbmdzLmFkZF9idG59fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2VkaXQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVGVybURhdGEoY3JlYXRlVGhlbWVGb3JtLCBkYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNyZWF0ZVRoZW1lRm9ybT8uaW52YWxpZCB8fCBkaXNhYmxlVXBkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy51cGRhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Zvb3Rlcj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RoZW1lRGVzaWduYXRpb24+XG4gICAgPGRpdiBjbGFzcz1cInRoZW1EZXNpZ25hdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nTmV3XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm1vZGFsVGl0bGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbmlzYXRpb25cIj5PcmdhbmlzYXRpb248L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9yZy1uYW1lIHBsLTQgZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3Bhbj5EZXBhcnRtZW50IG9mIEZpc2hlcmllczwvc3Bhbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ZGF0YT8uY29sdW1uSW5mbz8ubmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmQgbXQtNFwiPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYWRkLWRlc2lnbmF0aW9uIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyXCIgKGNsaWNrKT1cImFkZERlc2lnbmF0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWRkLWljb24gbXItMlwiPmFkZF9jaXJjbGVfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkFkZCBEZXNpZ25hdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNVwiPlxuICAgICAgICAgICAgICAgIDxmb3JtICBbZm9ybUdyb3VwXT1cImNyZWF0ZVRoZW1lRm9ybVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWFjY29yZGlvbiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTJcIiBmb3JtQXJyYXlOYW1lPVwiZGVzaWduYXRpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkZXNpZ25hdGlvbiBvZiBkZXNpZ25hdGlvbkNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiICBjbGFzcz1cImRlc2lnbmF0aW9uLXBhbmVsXCIgW2V4cGFuZGVkXT1cInBhbmVsT3BlblN0YXRlW2ldXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJkZWxldERlc2lnbmF0aW9uIG1yLTRcIiAoY2xpY2spPVwiZGVsZXRlRGVzaWduYXRpb24oaSlcIj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2lnbmF0aW9uIE5hbWUgPG1hdC1pY29uIGNsYXNzPVwiaW5mby1pY29uXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIHBsYWNlaG9sZGVyPVwiVHlwZSBoZXJlXCIgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCIgKGNoYW5nZSk9XCJjbGVhclNlbGVjdGVkRGVzaWduYWlvbk9uQ2hhbmdlKGksICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50Lm9wdGlvbiwgZGVzaWduYXRpb24pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGdldEZpbHRlcmVkRGVzaWduYXRpb25MaXN0KGkpXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uLm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1lcnJvcj57e2FwcF9zdHJpbmdzLmFscmVhZHlFeGlzdH19PC9tYXQtZXJyb3I+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPG1hdC1pY29uIGNsYXNzPVwiaW5mby1pY29uXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZGVzaWduYXRpb25EZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGUgdGhlIGRlY3JpcHRpb24gaW4gZmV3ZXIgdGhhbiA2MDAgY2hhcmFjdGVyc1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBqdXN0aWZ5LWVuZCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNsYXNzPVwic2F2ZURlc2lnbmF0b24gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZURlc2lnbmF0aW9uKGkpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1hY2NvcmRpb24+XG4gICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBpdGVtcy1jZW50ZXIgZ2FwLTQgbXQtNSBkZXNpZ25hdGlvbi1mb290ZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY2xhc3M9XCJjYW5jZWwgZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwiIWVuYWJsZUFkZEJ0blwiIGNsYXNzPVwiYWRkQnRuIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyXCIgKGNsaWNrKT1cInN1Ym1pdERlc2lnbmF0aW9uKClcIj5BZGQ8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNjb21wVGhlbWU+XG4gICAgPGRpdiBjbGFzcz1cImRpYWxvZ05ld1wiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm1vZGFsVGl0bGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRlcm0gb2YgZGF0YT8uc2VsZWN0ZWRQYXJlbnRUZXJtc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWxcIiBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3t0ZXJtLmNhdGVnb3J5fX1cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBuYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0ZXJtLm5hbWVcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1kaXZpZGVyXCI+PC9kaXY+XG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiY29tcGV0ZW5jeUZvcm1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLXRleHRcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsXCIgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICB7eydTZWxlY3QgQXJlYSd9fVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC01XCI+XG4gICAgICAgICAgICA8bWF0LXJhZGlvLWdyb3VwIGFyaWEtbGFiZWw9XCJTZWxlY3QgYW4gb3B0aW9uXCIgZm9ybUNvbnRyb2xOYW1lPVwiY29tcEFyZWFcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cImxlYXJuaW5nLXNlY3Rpb25cIiAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYWxsQ29tcGV0ZW5jeVwiIFt2YWx1ZV09XCJpdGVtXCIgKGNoYW5nZSk9XCJvblNlbGVjdGlvbkFyZWEoaXRlbSlcIj57e2l0ZW0ubmFtZX19PC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgIFxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSAhPT0gJ211bHRpLWNyZWF0ZSdcIj5cbiAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwidGhlbWVGb3JtXCIgW2Zvcm1Hcm91cF09XCJjcmVhdGVUaGVtZUZvcm1cIiBub3ZhbGlkYXRlXG4gICAgICAgICAgICAgICAgKG5nU3VibWl0KT1cImRpc2FibGVDcmVhdGU/dXBkYXRlVGVybUFzc29jaWF0aW9ucygpOnNhdmVUaGVtZVRlcm0oKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXIgbWFyZ2luLXRvcC1zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cInVwZGF0ZURuYW1lKG5hbWUudmFsdWUsIGNyZWF0ZVRoZW1lRm9ybSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZSBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIm9uU2VsZWN0KCRldmVudC5vcHRpb24sIGNyZWF0ZVRoZW1lRm9ybSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlZFRlcm1MaXN0cyB8IGFzeW5jXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e29wdGlvbi5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImRuYW1lXCIgaWQ9XCJkbmFtZVwiICNkbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29tcGV0ZW5jeSBkaXNwbGF5IG5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZSBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50Lm9wdGlvbiwgY3JlYXRlVGhlbWVGb3JtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVkVGVybUxpc3RzIHwgYXN5bmNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uLm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtZXJyb3IgKm5nSWY9XCJpc1Rlcm1FeGlzdFwiPnt7YXBwX3N0cmluZ3MuYWxyZWFkeUV4aXN0fX08L21hdC1lcnJvcj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuPVwiRmlyc3QgTmFtZSBsYWJlbHxMYWJlbCB3aGljaCBleHBsYWlucyB0aGUgdXNlciB0byBlbnRlciBmaXJzdCBuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1hcmlhLWxhYmVsIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtbGFiZWw+RW50ZXIge3tkYXRhLm5hbWV9fSBuYW1lPC9tYXQtbGFiZWw+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgW2Nka1RleHRhcmVhQXV0b3NpemVdIFtjZGtBdXRvc2l6ZU1heFJvd3NdPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nka0F1dG9zaXplTWluUm93c109XCIzXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLmRlc2NyaXB0aW9ufX1cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGZvb3RlciBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cImRlZmF1bHRcIiB0eXBlPVwicmVzZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRpYWxvZ0Nsb3NlKCcnKVwiPnt7YXBwX3N0cmluZ3MuY2FuY2VsfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdjcmVhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJzdWJtaXRcIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtPy5pbnZhbGlkXCIgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiPnt7YXBwX3N0cmluZ3MuY3JlYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnZWRpdCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVUZXJtRGF0YShjcmVhdGVUaGVtZUZvcm0sIGRhdGEpXCIgW2Rpc2FibGVkXT1cImNyZWF0ZVRoZW1lRm9ybT8uaW52YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiPnt7YXBwX3N0cmluZ3MudXBkYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9mb290ZXI+XG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIj5cbiAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1lbmQgbWItNFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1hdC1idXR0b24gZmxleCBpdGVtcy1jZW50ZXIgXCIgKm5nSWY9XCJkYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCIgKGNsaWNrKT1cImFkZENvbXBldGVuY3lUaGVtZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtci0yIG1hdC1pY29uLWN1c3RvbSBcIj5hZGRfY2lyY2xlX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgQWRkIHt7ZGF0YS5jb2x1bW5JbmZvLm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bWF0LWFjY29yZGlvbiBmb3JtQXJyYXlOYW1lPVwiY29tcFRoZW1lRmllbGRzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBjb21wZXRlbmN5Rm9ybT8uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKVsnY29udHJvbHMnXTsgbGV0IGkgPSBpbmRleDsgbGV0IGlzRmlyc3QgPSBmaXJzdFwiIFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hcmdpbi1ib3R0b20tbFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBbZXhwYW5kZWRdPVwiaXNGaXJzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ge3tuYW1lPy52YWx1ZX19ICAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiZGF0YS5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ29tcEZpZWxkcyhpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LWljb24tY3VzdG9tIFwiPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyIG1hcmdpbi10b3Atc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBDb21wZXRlbmN5IFRoZW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBwbGFjZWhvbGRlcj1cIkNob29zZSB0aGUgQ29tcGV0ZW5jeSBUaGVtZVwiIGZvcm1Db250cm9sTmFtZT1cImNvbXBldGVuY3lUaGVtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgI3NlYXJjaCBhdXRvY29tcGxldGU9XCJvZmZcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaFwiIGNsYXNzPVwiYXNzaWduZWVTZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAgZm9ybUNvbnRyb2xOYW1lPVwiYXNzaWduZWVUZXh0XCIgbWF0SW5wdXQ+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZGFsbENvbXBldGVuY3lUaGVtZVwiIFt2YWx1ZV09XCJvcHRpb25cIiAob25TZWxlY3Rpb25DaGFuZ2UpPVwiT25UaGVtZVNlbGVjdGlvbigkZXZlbnQpXCIgID57e29wdGlvbi5uYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50Lm9wdGlvbiwgY3JlYXRlVGhlbWVGb3JtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVkVGVybUxpc3RzIHwgYXN5bmNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uLm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImRuYW1lXCIgaWQ9XCJkbmFtZVwiICNkbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDb21wZXRlbmN5IGRpc3BsYXkgbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG49XCJGaXJzdCBOYW1lIGxhYmVsfExhYmVsIHdoaWNoIGV4cGxhaW5zIHRoZSB1c2VyIHRvIGVudGVyIGZpcnN0IG5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tYXJpYS1sYWJlbCBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBDb21wZXRlbmN5IFN1Yi1UaGVtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWxhYmVsPkVudGVyIHt7ZGF0YS5uYW1lfX0gbmFtZTwvbWF0LWxhYmVsPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBwbGFjZWhvbGRlcj1cIkNob29zZSB0aGUgQ29tcGV0ZW5jeSBUaGVtZVwiIGZvcm1Db250cm9sTmFtZT1cImNvbXBldGVuY3lTdWJUaGVtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCAjc2VhcmNoIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgY2xhc3M9XCJhc3NpZ25lZVNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgIGZvcm1Db250cm9sTmFtZT1cImFzc2lnbmVlVGV4dFwiIG1hdElucHV0PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZGFsbENvbXBldGVuY3lTdWJUaGVtZVwiIFt2YWx1ZV09XCJvcHRpb25cIj57e29wdGlvbi5uYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICAgICAgICAgIDwvbWF0LWFjY29yZGlvbj5cbiAgICAgICAgICAgICAgICA8Zm9vdGVyIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwiZGVmYXVsdFwiIHR5cGU9XCJyZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGlhbG9nQ2xvc2UoJycpXCI+e3thcHBfc3RyaW5ncy5jYW5jZWx9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2NyZWF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjcmVhdGVUaGVtZUZvcm0/LmludmFsaWRcIiAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy5jcmVhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtTXVsdGkuaW52YWxpZFwiICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIiAoY2xpY2spPVwibXVsdGlDcmVhdGUoY3JlYXRlVGhlbWVGb3JtTXVsdGksIGRhdGEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3thcHBfc3RyaW5ncy5jcmVhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2VkaXQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVGVybURhdGEoY3JlYXRlVGhlbWVGb3JtLCBkYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNyZWF0ZVRoZW1lRm9ybT8uaW52YWxpZCB8fCBkaXNhYmxlVXBkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy51cGRhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Zvb3Rlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Zvcm0+XG4gICAgICAgIFxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT4iXX0=
|
|
848
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXRlcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RyZWUtaGllcmFyY2h5L3NyYy9saWIvY29tcG9uZW50cy9jcmVhdGUtdGVybS9jcmVhdGUtdGVybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL2NyZWF0ZS10ZXJtL2NyZWF0ZS10ZXJtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQXNDLHNCQUFzQixJQUFJLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhJLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUEwRCxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwRyxPQUFPLEtBQUssWUFBWSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUk5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTNCLE1BTWEsbUJBQW1CO0lBd0M5QixZQUNTLFNBQTRDLEVBQ25CLElBQVMsRUFDakMsZ0JBQWtDLEVBQ2xDLEVBQXNCLEVBQ3RCLFdBQXdCLEVBQ3hCLFNBQXNCLEVBQ3RCLEdBQXFCO1FBTnRCLGNBQVMsR0FBVCxTQUFTLENBQW1DO1FBQ25CLFNBQUksR0FBSixJQUFJLENBQUs7UUFDakMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxPQUFFLEdBQUYsRUFBRSxDQUFvQjtRQUN0QixnQkFBVyxH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b0JBSzFCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtpQkFDZDtxQkFBTTtvQkFDTCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtpQkFDckI7WUFDSCxDQUFDLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxpQ0FBaUMsQ0FBQyxDQUFBO1lBQ25GLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7SUFDSCxDQUFDOytHQWhqQ1UsbUJBQW1CLG9EQTBDcEIsZUFBZTttR0ExQ2QsbUJBQW1CLHVEQ3BCaEMsc3p5Q0F1bEJjOztTRG5rQkQsbUJBQW1COzRGQUFuQixtQkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0UsaUJBQWlCOzswQkErQ3hCLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRMZWdhY3lEaWFsb2dSZWYgYXMgTWF0RGlhbG9nUmVmLCBNQVRfTEVHQUNZX0RJQUxPR19EQVRBIGFzIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1kaWFsb2cnO1xuaW1wb3J0IHsgRnJhbWV3b3JrU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZyYW1ld29yay5zZXJ2aWNlJztcbmltcG9ydCB7IHN0YXJ0V2l0aCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1BcnJheSwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuLy8gaW1wb3J0IHsgSWRlbnRpZmllcnMgfSBmcm9tICdAYW5ndWxhci9jb21waWxlcic7XG5pbXBvcnQgeyBOU0ZyYW1ld29yayB9IGZyb20gJy4uLy4uL21vZGVscy9mcmFtZXdvcmsubW9kZWwnO1xuaW1wb3J0ICogYXMgYXBwQ29uc3RhbnRzIGZyb20gJy4uLy4uL2NvbnN0YW50cy9hcHAtY29uc3RhbnQnO1xuaW1wb3J0IHsgbGFiZWxzIH0gZnJvbSAnLi4vLi4vbGFiZWxzL3N0cmluZ3MnO1xuaW1wb3J0IHsgQ2FyZCB9IGZyb20gJy4uLy4uL21vZGVscy92YXJpYWJsZS10eXBlLm1vZGVsJztcbmltcG9ydCB7IE9kY3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb2Rjcy5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdExlZ2FjeVNuYWNrQmFyIGFzIE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LXNuYWNrLWJhcic7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWNyZWF0ZS10ZXJtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NyZWF0ZS10ZXJtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3JlYXRlLXRlcm0uY29tcG9uZW50LnNjc3MnXVxufSlcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVRlcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBuYW1lOiBzdHJpbmcgPSAnJztcbiAgdGVybUxpc3RzOiBBcnJheTxDYXJkPiA9IFtdO1xuICBmaWx0ZWRUZXJtTGlzdHM6IGFueTtcbiAgY3JlYXRlVGVybUZvcm06IGFueVxuICBjcmVhdGVUaGVtZUZvcm06IFVudHlwZWRGb3JtR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgY3JlYXRlVGhlbWVGb3JtTXVsdGk6IFVudHlwZWRGb3JtR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgZGlzYWJsZUNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBkaXNhYmxlVXBkYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIGRpc2FibGVNdWx0aUNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1Rlcm1FeGlzdDogYm9vbGVhbiA9IGZhbHNlO1xuICBzZWxlY3RlZFRlcm06IENhcmQgPSB7fTtcbiAgYXBwX3N0cmluZ3MgPSBsYWJlbHM7XG4gIGNvbENvZGUgPSAnJ1xuICBzYXZlZERlc2lnbmF0aW9uczogYW55ID0gW11cbiAgYWRkZWREZXNpZ25hdGlvbkNvdW50ID0gMFxuICBkZXNpZ25hdGlvbnNMaXN0ID0gW11cbiAgcGFuZWxPcGVuU3RhdGU6IGFueVtdID0gW107XG4gIGFsbENvbXBldGVuY3k6YW55W109W11cbiAgc2VsZXRlZENvbXBldGVuY3lBcmVhOiBhbnlcbiAgYWxsQ29tcGV0ZW5jeVRoZW1lOmFueVtdPVtdXG4gIGZpbHRlcmVkYWxsQ29tcGV0ZW5jeVRoZW1lOmFueVtdPVtdXG4gIGFsbENvbXBldGVuY3lTdWJ0aGVtZTphbnlbXT1bXVxuICBmaWx0ZXJlZGFsbENvbXBldGVuY3lTdWJUaGVtZTphbnlbXT1bXVxuICBjb21wZXRlbmN5Rm9ybTogVW50eXBlZEZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe30pXG4gIGNvbXBMYWJlbHRleHQ6c3RyaW5nID0gJydcbiAgbWFzdGVyTGlzdDphbnlbXT1bXTtcbiAgZmlsdGVyZWRNYXN0ZXJMaXN0OmFueVtdPVtdO1xuICBleHBhbnNpb25UaXRsZTpzdHJpbmcgPSAnJ1xuICBwcml2YXRlIGRlYm91bmNlVGltZW91dDogYW55O1xuICBwcml2YXRlIGRlYm91bmNlRGVsYXk6IG51bWJlciA9IDUwMDtcbiAgdmFsdWVzPSAnJ1xuICB0b29sVGlwVGV4dCA9IGBZb3UgY2FuIGN1c3RvbWl6ZSB0aGlzIGRpc3BsYXkgbmFtZSBmb3IgbGVhcm5lcnMgdG8gc2VlLCBhcyBpdCdzIHdoYXQgdGhleSB3aWxsIHZpZXcuYFxuICBwcmV2aW91c0NhdGVnb3J5Q29kZTpzdHJpbmcgPSAnJztcbiAgcHJldmlvdXNUZXJtQ29kZTpzdHJpbmcgPSAnJztcbiAgcHJldmlvdXNDYXRDb2RlOnN0cmluZyA9ICcnO1xuICBwcmV2aW91c1Rlcm1DYXRDb2RlOnN0cmluZz0nJ1xuICBzZWxlY3RlZFRlcm1BcnJheTogYW55PSBbXVxuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPENyZWF0ZVRlcm1Db21wb25lbnQ+LFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55LFxuICAgIHByaXZhdGUgZnJhbWVXb3JrU2VydmljZTogRnJhbWV3b3JrU2VydmljZSxcbiAgICBwcml2YXRlIGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBvZGNzU2VydmljZTogT2Rjc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBfc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgY2RyOkNoYW5nZURldGVjdG9yUmVmXG4gICkgeyBcbiAgICB0aGlzLmdldEtjbVNlYXJjaCgpXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBcbiAgICB0aGlzLnRlcm1MaXN0cyA9IHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNoaWxkcmVuXG4gICAgdGhpcy5jb21wTGFiZWx0ZXh0ID0gdGhpcy5kYXRhLmNvbHVtbkluZm8uY29uZmlnLmxhYmVsTmFtZVxuICAgIFxuICAgIHRoaXMuaW5pdFRlcm1Gb3JtKClcbiAgICBcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcbiAgfVxuXG4gIGluaXRUZXJtRm9ybSgpIHtcbiAgICB0aGlzLmNyZWF0ZVRlcm1Gb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBuYW1lOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBkZXNjcmlwdGlvbjogWycnXVxuICAgIH0pXG4gICAgdGhpcy5jcmVhdGVUaGVtZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGRuYW1lOiBbe3ZhbHVlOiAnJywgZGlzYWJsZWQ6IHRydWV9LCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgZGVzY3JpcHRpb246IFsnJ11cbiAgICB9KVxuICAgIC8vIHRoaXMuY3JlYXRlVGhlbWVGb3JtLmNvbnRyb2xzWydkbmFtZSddLmRpc2FibGUoKVxuICAgIC8vIHRoaXMuY3JlYXRlVGhlbWVGb3JtLmNvbnRyb2xzWyduYW1lJ10udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpPT57XG4gICAgLy8gICBpZih2YWx1ZS5sZW5ndGgpe1xuICAgIC8vICAgIHRoaXMuY3JlYXRlVGhlbWVGb3JtLmNvbnRyb2xzWydkbmFtZSddLmVuYWJsZSgpXG4gICAgLy8gICB9XG4gICAgLy8gfSlcbiAgICB0aGlzLmNyZWF0ZVRoZW1lRm9ybU11bHRpID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICB0aGVtZUZpZWxkczp0aGlzLmZiLmFycmF5KFt0aGlzLmNyZWF0ZVRoZW1lRmllbGRzKCldKVxuICAgIH0pXG4gICAgLy8gdGhpcy5pbml0aWFsaXplVmFsdWVDaGFuZ2VzKClcbiAgICB0aGlzLmZpbHRlZFRlcm1MaXN0cyA9IHRoaXMuY3JlYXRlVGVybUZvcm0uZ2V0KCduYW1lJykudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICBzdGFydFdpdGgoJycpLFxuICAgICAgbWFwKHZhbHVlID0+IHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHRoaXMuY3JlYXRlVGVybUZvcm0uY29udHJvbHMuZG5hbWUpIHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZVRlcm1Gb3JtLmNvbnRyb2xzLmRuYW1lLmVuYWJsZSgpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jcmVhdGVUZXJtRm9ybS5jb250cm9scy5kbmFtZSkge1xuICAgICAgICAgIHRoaXMuY3JlYXRlVGVybUZvcm0uY29udHJvbHMuZG5hbWUuZGlzYWJsZSgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcih2YWx1ZSB8fCAnJylcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBpZiBtb2RlIGlzIFwidmlld1wiIHRoZW4gY2hlY2sgZm9yIHdoaWNoIHR5cGUgb2YgZm9ybSBoYXMgdG8gYmUgdXNlZCBhbmQgdGhlbiBhcHBlbmQgdGhlIHZhbHVlcyBpbiBmb3JtXG4gICAgaWYgKFxuICAgICAgdGhpcy5kYXRhICYmXG4gICAgICAodGhpcy5kYXRhLm1vZGUgPT09ICd2aWV3JylcbiAgICApIHtcbiAgICAgIHN3aXRjaCAodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSkge1xuICAgICAgICBjYXNlICd0aGVtZSc6IHRoaXMudXBkYXRlRm9ybVZpZXcodGhpcy5jcmVhdGVUaGVtZUZvcm0sIHRoaXMuZGF0YSlcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdzdWJ0aGVtZSc6IHRoaXMudXBkYXRlRm9ybVZpZXcodGhpcy5jcmVhdGVUaGVtZUZvcm0sIHRoaXMuZGF0YSlcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OiB0aGlzLnVwZGF0ZUZvcm1WaWV3KHRoaXMuY3JlYXRlVGhlbWVGb3JtLCB0aGlzLmRhdGEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlzYWJsZUNyZWF0ZSA9IHRydWVcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YSAmJlxuICAgICAgKHRoaXMuZGF0YS5tb2RlID09PSAnZWRpdCcpKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpIHtcbiAgICAgICAgY2FzZSAndGhlbWUnOiB0aGlzLnVwZGF0ZUZvcm1FZGl0KHRoaXMuY3JlYXRlVGhlbWVGb3JtLCB0aGlzLmRhdGEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnc3VidGhlbWUnOiB0aGlzLnVwZGF0ZUZvcm1FZGl0KHRoaXMuY3JlYXRlVGhlbWVGb3JtLCB0aGlzLmRhdGEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDogdGhpcy51cGRhdGVGb3JtRWRpdCh0aGlzLmNyZWF0ZVRoZW1lRm9ybSwgdGhpcy5kYXRhKVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGEgJiZcbiAgICAgICh0aGlzLmRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScpKSB7XG4gICAgICAvLyBzd2l0Y2ggKHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpIHtcbiAgICAgIC8vICAgY2FzZSAndGhlbWUnOiB0aGlzLnVwZGF0ZUZvcm1FZGl0KHRoaXMuY3JlYXRlVGhlbWVGb3JtLCB0aGlzLmRhdGEpXG4gICAgICAvLyAgICAgYnJlYWtcbiAgICAgIC8vICAgY2FzZSAnc3VidGhlbWUnOiB0aGlzLnVwZGF0ZUZvcm1FZGl0KHRoaXMuY3JlYXRlVGhlbWVGb3JtLCB0aGlzLmRhdGEpXG4gICAgICAvLyAgICAgYnJlYWtcbiAgICAgIC8vICAgZGVmYXVsdDogdGhpcy51cGRhdGVGb3JtRWRpdCh0aGlzLmNyZWF0ZVRoZW1lRm9ybSwgdGhpcy5kYXRhKVxuICAgICAgLy8gICAgIGJyZWFrXG4gICAgICAvLyB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29tcHRlbmN5RGF0YSgpe1xuICAgIC8vIGNvbnN0IGZpbHRlck9iaiA9IHtcbiAgICAvLyAgIHNlYXJjaDoge1xuICAgIC8vICAgICB0eXBlOiAnQ29tcGV0ZW5jeSBBcmVhJyxcbiAgICAvLyAgIH0sXG4gICAgLy8gICBmaWx0ZXI6IHtcbiAgICAvLyAgICAgaXNEZXRhaWw6IHRydWUsXG4gICAgLy8gICB9LFxuICAgIC8vIH1cbiAgICAvLyB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0RmlsdGVyRW50aXR5KGZpbHRlck9iaikuc3Vic2NyaWJlKChkYXRhKT0+e1xuICAgIFxuICAgIC8vICBpZihkYXRhICYmIGRhdGEubGVuZ3RoKXtcbiAgICAvLyAgIHRoaXMuYWxsQ29tcGV0ZW5jeSA9IGRhdGFcbiAgICAvLyAgfVxuICAgIC8vIH0pXG4gIH1cbiAgLy8gaW5pdGlhbGl6ZVZhbHVlQ2hhbmdlcygpIHtcbiAgLy8gICB0aGlzLnRoZW1lRmllbGRzLmNvbnRyb2xzLmZvckVhY2goKGdyb3VwOiBGb3JtR3JvdXApID0+IHtcbiAgLy8gICAgIHRoaXMuc2V0VXBWYWx1ZUNoYW5nZXMoZ3JvdXApO1xuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgLy8gc2V0VXBWYWx1ZUNoYW5nZXMoZ3JvdXA6IEZvcm1Hcm91cCkge1xuICAvLyAgIGdyb3VwLmNvbnRyb2xzWyduYW1lJ10udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gIC8vICAgICBjb25zdCBkbmFtZUNvbnRyb2wgPSBncm91cC5jb250cm9sc1snZG5hbWUnXTtcbiAgLy8gICAgIGRuYW1lQ29udHJvbC5kaXNhYmxlKCk7XG4gIC8vICAgICBpZiAodmFsdWUudHJpbSgpLmxlbmd0aCkge1xuICAvLyAgICAgICBkbmFtZUNvbnRyb2wuZW5hYmxlKCk7XG4gIC8vICAgICB9IGVsc2Uge1xuICAvLyAgICAgICBkbmFtZUNvbnRyb2wuZGlzYWJsZSgpO1xuICAvLyAgICAgfVxuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgZ2V0IHRoZW1lRmllbGRzKCk6IFVudHlwZWRGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVRoZW1lRm9ybU11bHRpLmdldCgndGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICB9XG5cbiAgZ2V0IHRoZW1lRmllbGRzQ29udHJvbHMoKSB7XG4gICAgY29uc3QgdGhlbWVGaWVsZHMgPSB0aGlzLmNyZWF0ZVRoZW1lRm9ybU11bHRpLmdldCgndGhlbWVGaWVsZHMnKVxuICAgIHJldHVybiAoPGFueT50aGVtZUZpZWxkcylbJ2NvbnRyb2xzJ11cbiAgfVxuXG4gIGNyZWF0ZVRoZW1lRmllbGRzKCk6IFVudHlwZWRGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGRuYW1lOiBbe3ZhbHVlOiAnJywgZGlzYWJsZWQ6IHRydWV9LCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgZGVzY3JpcHRpb246IFsnJyxdXG4gICAgfSk7XG4gIH1cblxuICBhZGRUaGVtZUZpZWxkcygpIHtcbiAgICB0aGlzLnZhbHVlcyA9ICcnXG4gICAgdGhpcy5maWx0ZXJlZE1hc3Rlckxpc3QgPSBbLi4udGhpcy5tYXN0ZXJMaXN0XVxuICAgIGlmICh0aGlzLmRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScpIHtcbiAgICAgIC8vIHRoaXMudGhlbWVGaWVsZHMucHVzaCh0aGlzLmNyZWF0ZVRoZW1lRmllbGRzKCkpO1xuICAgICAgdGhpcy50aGVtZUZpZWxkcy5pbnNlcnQoMCwgdGhpcy5jcmVhdGVUaGVtZUZpZWxkcygpKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVUaGVtZUZpZWxkcyhpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZGF0YS5tb2RlID09PSAnbXVsdGktY3JlYXRlJykge1xuICAgICAgdGhpcy50aGVtZUZpZWxkcy5yZW1vdmVBdChpbmRleCk7XG4gICAgfVxuICB9XG4gIGdldENyZWF0ZU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgIHN3aXRjaChuYW1lKXtcbiAgICBjYXNlICdUaGVtZSc6XG4gICAgICByZXR1cm4gYEFkZCBDb21wZXRlbmN5ICR7bmFtZX1gO1xuICAgIGNhc2UgJ1N1YiBUaGVtZSc6XG4gICAgICByZXR1cm4gYEFkZCBDb21wZXRlbmN5ICR7bmFtZX1gO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gYEFkZCAke25hbWV9YDtcbiAgIH1cbiAgfVxuXG4gIGdldENhdGVnb3J5TmFtZShjYXRlZ29yeU5hbWU6YW55LCB0ZXJtOmFueSl7XG4gICAgdGhpcy5wcmV2aW91c0NhdGVnb3J5Q29kZSA9IGNhdGVnb3J5TmFtZTtcbiAgICB0aGlzLnByZXZpb3VzVGVybUNvZGUgPSB0ZXJtLmNvZGVcbiAgICBcbiAgICBzd2l0Y2goY2F0ZWdvcnlOYW1lKXtcbiAgICAgIGNhc2UgJ2NvbXBldGVuY3lhcmVhJzpcbiAgICAgICAgcmV0dXJuICdDb21wZXRlbmN5IEFyZWEnO1xuICAgICAgY2FzZSAndGhlbWUnOlxuICAgICAgICByZXR1cm4gJ0NvbXBldGVuY3kgVGhlbWUnO1xuICAgICAgY2FzZSAnc3VidGhlbWUnOlxuICAgICAgICByZXR1cm4gJ0NvbXBldGVuY3kgU3ViIFRoZW1lJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBjYXRlZ29yeU5hbWU7IC8vIERlZmF1bHQgcmV0dXJuIHRvIGhhbmRsZSBhbnkgdW5tYXRjaGVkIGNhc2VcbiAgICAgfVxuICB9XG5cblxuICBnZXROYW1lKGl0ZW06YW55KXtcbiAgcmV0dXJuIGl0ZW0udG9VcHBlckNhc2UoKVxuICB9XG5cbiAgZ2V0TGFiZWxOYW1lKGxhYmVsTmFtZTpzdHJpbmcpOiBzdHJpbmcge1xuICAgIFxuICAgc3dpdGNoKGxhYmVsTmFtZSl7XG4gICAgY2FzZSAnVGhlbWUnOlxuICAgICAgcmV0dXJuIGBDb21wZXRlbmN5ICR7bGFiZWxOYW1lfSBuYW1lYDtcbiAgICAgIGNhc2UgJ1N1YiBUaGVtZSc6XG4gICAgICByZXR1cm4gYENvbXBldGVuY3kgJHtsYWJlbE5hbWV9IG5hbWVgXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbGFiZWxOYW1lOyAvLyBEZWZhdWx0IHJldHVybiB0byBoYW5kbGUgYW55IHVubWF0Y2hlZCBjYXNlXG4gICB9XG4gIH1cblxuIFxuXG4gIGNyZWF0ZUNvbXBUaGVtZUZpZWxkcygpOlVudHlwZWRGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGNvbXBldGVuY3lUaGVtZTpbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBjb21wZXRlbmN5U3ViVGhlbWU6WycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dXG4gICAgfSlcbiAgfVxuXG4gIGFkZENvbXBldGVuY3lUaGVtZSgpe1xuICAgIGlmICh0aGlzLmRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScpIHtcbiAgICAgIHRoaXMuY29tcFRoZW1lRmllbGRzLnB1c2godGhpcy5jcmVhdGVDb21wVGhlbWVGaWVsZHMoKSk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlQ29tcEZpZWxkcyhpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZGF0YS5tb2RlID09PSAnbXVsdGktY3JlYXRlJykge1xuICAgICAgdGhpcy5jb21wVGhlbWVGaWVsZHMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjb21wVGhlbWVGaWVsZHMoKTogVW50eXBlZEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICB9XG5cbiAgLy8gZ2V0IGNvbXBUaGVtZUZpZWxkc0NvbnRyb2xzKCkge1xuICAvLyAgIGNvbnN0IGNyZWF0ZUNvbXBUaGVtZUZpZWxkcyA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjcmVhdGVDb21wVGhlbWVGaWVsZHMnKVxuICAvLyAgIHJldHVybiAoPGFueT5jcmVhdGVDb21wVGhlbWVGaWVsZHMpWydjb250cm9scyddXG4gIC8vIH1cblxuXG4gIHVwZGF0ZUZvcm1WaWV3KGZvcm06YW55LCBkYXRhOmFueSkge1xuICAgIGlmKGRhdGEgJiYgZGF0YS5jaGlsZHJlbkRhdGEgJiYgZGF0YS5jaGlsZHJlbkRhdGEuYWRkaXRpb25hbFByb3BlcnRpZXMgJiYgZGF0YS5jaGlsZHJlbkRhdGEuYWRkaXRpb25hbFByb3BlcnRpZXMuZGlzcGxheU5hbWUpe1xuICAgICAgZm9ybS5nZXQoJ2RuYW1lJykucGF0Y2hWYWx1ZShkYXRhLmNoaWxkcmVuRGF0YS5hZGRpdGlvbmFsUHJvcGVydGllcy5kaXNwbGF5TmFtZSlcbiAgICB9XG4gICAgZm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJykucGF0Y2hWYWx1ZShkYXRhLmNoaWxkcmVuRGF0YS5kZXNjcmlwdGlvbikgICAgXG4gICAgXG4gICAgICBpZiAoZGF0YS5jaGlsZHJlbkRhdGEubmFtZSAmJiB0aGlzLm1hc3Rlckxpc3QubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGFzc2lnbk5hbWUgPSB0aGlzLm1hc3Rlckxpc3QuZmluZChvcHRpb24gPT5cbiAgICAgICAgICBkYXRhLmNoaWxkcmVuRGF0YS5yZWZJZCA9PT0gb3B0aW9uLmlkXG4gICAgICAgIClcbiAgICAgICAgaWYgKGFzc2lnbk5hbWUpIHtcbiAgICAgICAgICBmb3JtLmNvbnRyb2xzWyduYW1lJ10uc2V0VmFsdWUoYXNzaWduTmFtZSlcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgIH1cbiAgXG4gICAgXG4gICAgLy8gZm9ybS5nZXQoJ25hbWUnKS5wYXRjaFZhbHVlKGRhdGEuY2hpbGRyZW5EYXRhLm5hbWUpXG4gICAgXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBmb3JtLmdldCgnbmFtZScpLmRpc2FibGUoKVxuICAgICAgZm9ybS5nZXQoJ2RuYW1lJykuZGlzYWJsZSgpXG4gICAgICBmb3JtLmdldCgnZGVzY3JpcHRpb24nKS5kaXNhYmxlKClcbiAgICAgIFxuICAgICAgXG4gICAgfSlcbiAgfVxuXG4gIHVwZGF0ZUZvcm1FZGl0KGZvcm06YW55LCBkYXRhOmFueSkge1xuICAgIGZvcm0uZ2V0KCdkbmFtZScpLnBhdGNoVmFsdWUoZGF0YS5jaGlsZHJlbkRhdGEuYWRkaXRpb25hbFByb3BlcnRpZXMuZGlzcGxheU5hbWUpXG4gICAgZm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJykucGF0Y2hWYWx1ZShkYXRhLmNoaWxkcmVuRGF0YS5kZXNjcmlwdGlvbilcbiAgICBpZiAoZGF0YS5jaGlsZHJlbkRhdGEubmFtZSAmJiB0aGlzLm1hc3Rlckxpc3QubGVuZ3RoKSB7XG4gICAgICBjb25zdCBhc3NpZ25OYW1lID0gdGhpcy5tYXN0ZXJMaXN0LmZpbmQob3B0aW9uID0+XG4gICAgICAgIGRhdGEuY2hpbGRyZW5EYXRhLm5hbWUgPT09IG9wdGlvbi50aXRsZVxuICAgICAgKVxuICAgICAgaWYgKGFzc2lnbk5hbWUpIHtcbiAgICAgICAgZm9ybS5jb250cm9sc1snbmFtZSddLnNldFZhbHVlKGFzc2lnbk5hbWUpXG4gICAgICB9XG4gICAgICBcbiAgICB9XG4gICAgLy8gZm9ybS5nZXQoJ25hbWUnKS5wYXRjaFZhbHVlKGRhdGEuY2hpbGRyZW5EYXRhLm5hbWUpXG4gICBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGZvcm0uZ2V0KCduYW1lJykuZGlzYWJsZSgpXG4gICAgICBmb3JtLmdldCgnZG5hbWUnKS5lbmFibGUoKVxuICAgIH0pXG4gIH1cblxuICBvbktleShldmVudDphbnkpe1xuICAgIC8vICB0aGlzLnZhbHVlcyA9IGV2ZW50LnRhcmdldC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIC8vICB0aGlzLmZpbHRlcmVkTWFzdGVyTGlzdCA9IHRoaXMuZmlsdGVyT3JnVmFsdWVzKHRoaXMudmFsdWVzLCB0aGlzLm1hc3Rlckxpc3QpXG5cbiAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZGVib3VuY2VUaW1lb3V0KTtcbiAgICBcbiAgICAgLy8gU2V0IHRoZSBuZXcgdGltZW91dFxuICAgICB0aGlzLmRlYm91bmNlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgIHRoaXMudmFsdWVzID0gZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgdGhpcy5maWx0ZXJlZE1hc3Rlckxpc3QgPSB0aGlzLmZpbHRlck9yZ1ZhbHVlcyh0aGlzLnZhbHVlcywgdGhpcy5tYXN0ZXJMaXN0KTtcbiAgICAgfSwgdGhpcy5kZWJvdW5jZURlbGF5KTtcbiAgfVxuXG4gXG5cbiAgZmlsdGVyT3JnVmFsdWVzKHNlYXJjaFZhbHVlOiBzdHJpbmcsIGFycmF5OiBhbnkpIHtcbiAgICByZXR1cm4gYXJyYXkuZmlsdGVyKCh2YWx1ZTogYW55KSA9PlxuICAgICAgdmFsdWUudGl0bGUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpKSlcbiAgfVxuXG4gIGdldEtjbVNlYXJjaCgpe1xuICAgIGNvbnN0IHJlcXVlc3RPYmogPSB7XG4gICAgICBmaWx0ZXJDcml0ZXJpYU1hcDoge1xuICAgICAgICBzdGF0dXM6IFwiTGl2ZVwiLFxuICAgICAgICBpc0FjdGl2ZTogdHJ1ZVxuICAgIH0sXG4gICAgcmVxdWVzdGVkRmllbGRzOiBbXSxcbiAgICBwYWdlTnVtYmVyOiAwLFxuICAgIHBhZ2VTaXplOjEwMDBcbiAgICB9XG4gICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldEtjbVNlYXJjaExpc3QocmVxdWVzdE9iaix0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKS5zdWJzY3JpYmUoKHJlc3BvbnNlOmFueSk9PntcbiAgICAgIGlmKHJlc3BvbnNlLmRhdGEgJiYgcmVzcG9uc2UuZGF0YS5sZW5ndGgpe1xuICAgICAgICB0aGlzLm1hc3Rlckxpc3QgPSByZXNwb25zZS5kYXRhO1xuICAgICAgICB0aGlzLmZpbHRlcmVkTWFzdGVyTGlzdCA9IFsuLi50aGlzLm1hc3Rlckxpc3RdXG4gICAgICAgIHNldFRpbWVvdXQoKCk9PntcbiAgICAgICAgICBpZih0aGlzLmRhdGEgJiZcbiAgICAgICAgICAgICh0aGlzLmRhdGEubW9kZSA9PT0gJ2VkaXQnKSl7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybUVkaXQodGhpcy5jcmVhdGVUaGVtZUZvcm0sIHRoaXMuZGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYodGhpcy5kYXRhICYmXG4gICAgICAgICAgICAgICh0aGlzLmRhdGEubW9kZSA9PT0gJ3ZpZXcnKSl7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtVmlldyh0aGlzLmNyZWF0ZVRoZW1lRm9ybSwgdGhpcy5kYXRhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgXG4gICAgICAgIH0sMTAwMClcbiAgICAgICBcblxuICAgICAgfVxuICAgIH0pXG4gICBcbiAgICBcbiAgfVxuXG4gIG9uRGlzYWJsZVRoZW1lKG9wdGlvbjogYW55KXtcbiAgICBsZXQgcGFyZW50Q29sXG4gICAgY29uc3QgcGFyZW50Q29sdW1uQ29uZmlnRGF0YSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRQcmV2aW91c0NhdGVnb3J5KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpXG4gICAgaWYocGFyZW50Q29sdW1uQ29uZmlnRGF0YSkge1xuICAgICAgcGFyZW50Q29sID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHBhcmVudENvbHVtbkNvbmZpZ0RhdGEuY29kZSlcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IC0xXG4gICAgaWYocGFyZW50Q29sICYmIHBhcmVudENvbC5jaGlsZHJlbiAmJiBwYXJlbnRDb2wuY2hpbGRyZW4ubGVuZ3RoKXtcbiAgICAgIHJlc3VsdCA9IHBhcmVudENvbC5jaGlsZHJlbi5maW5kSW5kZXgoKGVsZTogYW55KSA9PiB7XG4gICAgICAgIGlmKCAoZWxlLnJlZlR5cGUgPT09ICd0aGVtZSd8fCBlbGUucmVmVHlwZSA9PT0gJ3N1YnRoZW1lJykgKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IG9wdGlvbi50aXRsZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pXG4gICAgICBcbiAgIFxuICAgICAgXG4gICAgfVxuICAgIGlmKHJlc3VsdCA8IDApe1xuICAgICAgbGV0IGZvcm1BcnJheSA9IHRoaXMuY3JlYXRlVGhlbWVGb3JtTXVsdGkuZ2V0KCd0aGVtZUZpZWxkcycpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgICByZXN1bHQgPSBmb3JtQXJyYXkudmFsdWUuZmluZEluZGV4KChmb3JtRWxlOiBhbnkpID0+IHtcbiAgICAgICAgaWYoZm9ybUVsZS5uYW1lICYmIGZvcm1FbGUubmFtZS5pZCl7XG4gICAgICAgICAgcmV0dXJuIGZvcm1FbGUubmFtZS5pZCA9PT0gb3B0aW9uLmlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgICB9XG4gICAgLy9cbiAgICBcbiAgICByZXR1cm4gcmVzdWx0ID49IDAgPyB0cnVlOiBmYWxzZVxuICB9XG5cbiAgbXVsdGlDcmVhdGUoZm9ybTphbnksIF9kYXRhOmFueSkge1xuICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gdHJ1ZVxuICAgIGxldCBjb3VudGVyID0gMFxuICAgIGxldCBjcmVhdGVkVGVybXM6YW55ID0gW11cbiAgICBpZihmb3JtLnZhbGlkKSB7XG4gICAgICBcbiAgICAgIGNvbnN0IHRoZW1lRmllbGRzID0gZm9ybSAmJiBmb3JtLnZhbHVlICYmIGZvcm0udmFsdWUudGhlbWVGaWVsZHNcbiAgICAgIFxuICAgICAgaWYodGhlbWVGaWVsZHMgJiYgdGhlbWVGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgIHRoZW1lRmllbGRzLmZvckVhY2goKHZhbDphbnksIF9pOmFueSkgPT57XG4gICAgICAgICAgY29uc3QgdGVybTogTlNGcmFtZXdvcmsuSUNyZWF0ZVRlcm0gPSB7XG4gICAgICAgICAgICBjb2RlOiB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0VXVpZCgpLFxuICAgICAgICAgICAgbmFtZTogXy5nZXQodmFsLCAnbmFtZS50aXRsZScpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbC5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLFxuICAgICAgICAgICAgc3RhdHVzOiBhcHBDb25zdGFudHMuTElWRSxcbiAgICAgICAgICAgIHJlZklkOnZhbC5uYW1lLmlkLFxuICAgICAgICAgICAgcmVmVHlwZTp0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLFxuICAgICAgICAgICAgLy8gZnJhbWV3b3JrOnRoaXMuZGF0YS5mcmFtZXdvcmtJZCxcbiAgICAgICAgICAgIC8vIGFwcHJvdmFsU3RhdHVzOmFwcENvbnN0YW50cy5EUkFGVCxcbiAgICAgICAgICAgIHBhcmVudHM6IFtcbiAgICAgICAgICAgICAgeyBpZGVudGlmaWVyOiBgJHt0aGlzLmRhdGEuZnJhbWV3b3JrSWQudG9Mb3dlckNhc2UoKX1fJHt0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlfWAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIGRpc3BsYXlOYW1lOnZhbC5kbmFtZSxcbiAgICAgICAgICAgICAgdGltZVN0YW1wOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVxdWVzdEJvZHk6IGFueSA9IHtcbiAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgdGVybTogdGVybVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UuY3JlYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsIHJlcXVlc3RCb2R5KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm1bJ2lkZW50aWZpZXInXSA9IHJlcy5yZXN1bHQubm9kZV9pZFswXVxuICAgICAgICAgICAgY3JlYXRlZFRlcm1zLnB1c2gocmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb3VudGVyKytcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYoY291bnRlciA9PT0gdGhlbWVGaWVsZHMubGVuZ3RoKXtcblxuXG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudENvbHVtbjphbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeSh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKVxuICAgICAgICAgICAgICBsZXQgcGFyZW50Q29sOiBhbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQocGFyZW50Q29sdW1uLmNvZGUpXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlVGVybUFzc29jaWF0aW9uc011bHRpVjIoY3JlYXRlZFRlcm1zICwgcGFyZW50Q29sKVxuICAgICAgICAgICAgICAvLyB0aGlzLnVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnNNdWx0aShjcmVhdGVkVGVybXMpXG4gICAgICAgICAgICAgIC8vIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiBjcmVhdGVkVGVybXMsIGNyZWF0ZWQ6IHRydWUsIG11bHRpOnRydWUgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVUZXJtQXNzb2NpYXRpb25zTXVsdGkoY3JlYXRlZFRlcm1zOiBhbnlbXSkge1xuICAgICBsZXQgcGFyZW50OiBhbnlcbiAgICBpZihjcmVhdGVkVGVybXMgJiYgY3JlYXRlZFRlcm1zLmxlbmd0aCkge1xuICAgICAgbGV0IGNyZWF0ZWRUZXJtc0NvdW50ZXIgPSAwXG4gICAgICBmb3IobGV0IGNyZWF0ZWRUZXJtIG9mIGNyZWF0ZWRUZXJtcykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGVybSA9IGNyZWF0ZWRUZXJtXG4gICAgICAgIGxldCBhc3NvY2lhdGlvbnMgPSBbXVxuICAgICAgICBsZXQgdGVtcFxuICAgICAgICBsZXQgY291bnRlciA9IDBcbiAgICAgICAgZm9yKGNvbnN0IFt2YWx1ZV0gb2YgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3Qpe1xuICAgICAgICAgICBwYXJlbnQgPSB2YWx1ZVxuICAgICAgICAgIGNvdW50ZXIrK1xuICAgICAgICAgIHRlbXAgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4uZmlsdGVyKChjaGlsZDogYW55KSA9PiBjaGlsZC5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA6IG51bGxcbiAgICAgICAgICBhc3NvY2lhdGlvbnMgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ubWFwKChjOmFueSkgPT4ge1xuICAgICAgICAgICAgLy8gcmV0dXJuIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyLCBhcHByb3ZhbFN0YXR1czogYy5hc3NvY2lhdGlvblByb3BlcnRpZXM/Yy5hc3NvY2lhdGlvblByb3BlcnRpZXMuYXBwcm92YWxTdGF0dXM6ICdEcmFmdCcgfVxuICAgICAgICAgICAgcmV0dXJuIGMuaWRlbnRpZmllciA/ICB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciB9IDogbnVsbFxuICAgICAgICAgIH0pIDogW11cbiAgICAgICAgICBpZiAodGVtcCAmJiB0ZW1wLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IHRydWVcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFzc29jaWF0aW9ucy5wdXNoKHsgaWRlbnRpZmllcjogdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllciB9KVxuICAgICAgICAgICAgICB0aGlzLmlzVGVybUV4aXN0ID0gZmFsc2VcbiAgICAgICAgICAgICAgLy8gaWYoY3JlYXRlZFRlcm1zQ291bnRlciA9PT0gKGNyZWF0ZWRUZXJtcy5sZW5ndGgtMSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWd1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgdGVybToge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLihhc3NvY2lhdGlvbnMgJiYgYXNzb2NpYXRpb25zLmxlbmd0aCkgPyB7YXNzb2NpYXRpb25zOiBbLi4uYXNzb2NpYXRpb25zXX0gOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiB0aGlzLnNlbGVjdGVkVGVybSwgY3JlYXRlZDogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FsbFVwZGF0ZUFzc29jaWF0aW9ucyhjb3VudGVyLCBwYXJlbnQsIHJlZ3Vlc3RCb2R5KVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNyZWF0ZWRUZXJtc0NvdW50ZXIrK1xuICAgICAgICBpZihjcmVhdGVkVGVybXNDb3VudGVyID09PSBjcmVhdGVkVGVybXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUZyYW1ld29ya0xpc3QodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgcGFyZW50LCBjcmVhdGVkVGVybXMgKVxuICAgICAgICAgIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiBbdGhpcy5zZWxlY3RlZFRlcm1dLCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlIH0pXG4gICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPWZhbHNlO1xuICAgICAgICAgIGlmKGNyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeSA9PT0gJ3RoZW1lJyl7XG4gICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5ICR7Y3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5fSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnkgPT09ICdzdWJ0aGVtZScpe1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke2NyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjYWxsVXBkYXRlQXNzb2NpYXRpb25zKGNvdW50ZXI6YW55LCBwYXJlbnQ6YW55LCByZWd1ZXN0Qm9keTphbnkpOiBQcm9taXNlPGFueT57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHBhcmVudC5jYXRlZ29yeSwgcGFyZW50LmNvZGUsIHJlZ3Vlc3RCb2R5KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBwYXJlbnRbJ2NoaWxkcmVuJ10gPSBwYXJlbnQgJiYgcGFyZW50LmNoaWxkcmVuID9bLi4ucGFyZW50LmNoaWxkcmVuLCAuLi5bdGhpcy5zZWxlY3RlZFRlcm1dXTpbdGhpcy5zZWxlY3RlZFRlcm1dXG5cbiAgICAgICAgaWYgKGNvdW50ZXIgPT09IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LnNpemUpIHtcbiAgICAgICAgICAvLyB0aGlzLnNlbGVjdGVkVGVybVsnYXNzb2NpYXRpb25Qcm9wZXJ0aWVzJ11bJ2FwcHJvdmFsU3RhdHVzJ10gPSAnRHJhZnQnO1xuICBcbiAgICAgICAgICAvLyB0aGlzIHZhbHVlIGlzIGZvciBzZWxlY3RlZCB0ZXJtIGluIGNhc2Ugb2YgY3JlYXRlIHNjZW5hcmlvLCBpbiBjYXNlIG9mIGVkaXQgc2NlbmFyaW8gdGhpcyB3b24ndCBiZSBhdmFpYWJsZSBcbiAgICAgICAgICAvLyBzbyB0ZXJtIGlzIHNldCBmcm9tIGNoaWxkZGF0YSB3aGljaCBpcyByZWNlaXZlZCBmcm9tIHBhcmFtcyBpbiB1cGRhdGVEYXRhXG4gICAgICAgICAgLy8gY29uc3QgdmFsdWUgPSAodGhpcy5zZWxlY3RlZFRlcm0gJiYgdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgPyB0aGlzLnNlbGVjdGVkVGVybSA6IHt9XG4gICAgICAgICAgLy8gY29uc3QgZm91bmQgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4uZmluZChjPT4gYy5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA6IGZhbHNlXG4gICAgICAgICAgLy8gaWYoIWZvdW5kKSB7XG4gICAgICAgICAgLy8gICBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzLnNlbGVjdGVkVGVybSkgOiBwYXJlbnRbJ2NoaWxkcmVuJ10gPSBbdGhpcy5zZWxlY3RlZFRlcm1dXG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIHRoaXMuZGlzYWJsZVVwZGF0ZSA9IGZhbHNlXG4gICAgICAgICAgLy8gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnB1Ymxpc2hGcmFtZXdvcmsoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAvLyAgIC8vIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRlcm0pXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gICByZXR1cm4gcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKVxuICAgICAgICB9XG4gICAgICB9LCAoX2VycjogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVkaXQgJHt0aGlzLmRhdGEuY29sdW1uSW5mby5uYW1lfSBmYWlsZWQsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXJgKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdXBkYXRlRG5hbWUoX25hbWU6IGFueSwgX2Zvcm06YW55LCBfaT86YW55KSB7XG4gICAgLy8gaWYodGhpcy5kYXRhLm1vZGUgPT09ICdjcmVhdGUnICYmICFmb3JtLmNvbnRyb2xzWydkbmFtZSddLnZhbHVlLnRyaW0oKS5sZW5ndGgpe1xuICAgIC8vICAgZm9ybS5nZXQoJ2RuYW1lJykucGF0Y2hWYWx1ZShuYW1lKVxuICAgIC8vIH1cbiAgICAvLyBpZih0aGlzLmRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScgJiYgIWZvcm0uY29udHJvbHMudGhlbWVGaWVsZHMuY29udHJvbHNbaV0uY29udHJvbHNbJ2RuYW1lJ10udmFsdWUudHJpbSgpLmxlbmd0aCl7XG4gICAgLy8gICBmb3JtLmNvbnRyb2xzLnRoZW1lRmllbGRzLmNvbnRyb2xzW2ldLmNvbnRyb2xzWydkbmFtZSddLnBhdGNoVmFsdWUobmFtZSlcbiAgICAvLyB9XG4gIH1cbiAgY2hhbmdlKGV2ZW50OiBhbnksZm9ybTogYW55LCBpPzogYW55KXtcbiAgICBpZih0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLm1vZGUpIHsgXG4gICAgICBpZih0aGlzLmRhdGEubW9kZSA9PT0gJ2NyZWF0ZScpe1xuICAgICAgICBmb3JtLmdldCgnZG5hbWUnKS5wYXRjaFZhbHVlKGV2ZW50LnNvdXJjZS52YWx1ZS50aXRsZSlcbiAgICAgICAgdGhpcy5leHBhbnNpb25UaXRsZSA9IGV2ZW50LnNvdXJjZS52YWx1ZS50aXRsZVxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcblxuICAgICAgfVxuICAgICAgaWYodGhpcy5kYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnKXtcbiAgICAgICAgY29uc3QgZm9ybVRvVXBkYXRlID0gZm9ybS5jb250cm9scy50aGVtZUZpZWxkcy5jb250cm9sc1tpXVxuICAgICAgICBmb3JtVG9VcGRhdGUuY29udHJvbHNbJ2RuYW1lJ10ucGF0Y2hWYWx1ZShldmVudC5zb3VyY2UudmFsdWUudGl0bGUpXG4gICAgICAgIHRoaXMuZXhwYW5zaW9uVGl0bGUgPSBldmVudC5zb3VyY2UudmFsdWUudGl0bGVcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgIGlmKGZvcm1Ub1VwZGF0ZS5jb250cm9scy5uYW1lLnZhbGlkICYmIGZvcm1Ub1VwZGF0ZS5jb250cm9scy5kbmFtZSkge1xuICAgICAgICAgIGZvcm1Ub1VwZGF0ZS5jb250cm9scy5kbmFtZS5lbmFibGUoKVxuICAgICAgICB9IGVsc2UgaWYoZm9ybVRvVXBkYXRlLmNvbnRyb2xzLmRuYW1lKSB7XG4gICAgICAgICAgZm9ybVRvVXBkYXRlLmNvbnRyb2xzLmRuYW1lLmRpc2FibGUoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgXG4gIH1cblxuICBnZXRFeHBhbnNpb25UaXRsZShmb3JtOiBhbnkpIHtcbiAgICBjb25zdCBkZXRhaWxzID0gZm9ybS5nZXQoJ25hbWUnKS52YWx1ZVxuICAgIHJldHVybiBfLmdldChkZXRhaWxzLCAndGl0bGUnLCAnJylcbiAgfVxuICBcblxuICAvLyNyZWdpb24gKGRlc2lnbmF0aW9ucylcblxuICBnZXQgZGVzaWduYXRpb25Db250cm9scygpIHtcbiAgICByZXR1cm4gKHRoaXMuY3JlYXRlVGhlbWVGb3JtLmdldCgnZGVzaWduYXRpb25zJykgYXMgVW50eXBlZEZvcm1BcnJheSkuY29udHJvbHM7XG4gIH1cblxuICBsb2FkRGVzaWduYXRpb25zKCkge1xuICAgIHRoaXMub2Rjc1NlcnZpY2UuZ2V0RGVzaWduYXRpb25zKHt9KS5zdWJzY3JpYmUoXG4gICAgICAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGVzaWduYXRpb25zTGlzdCA9IGRhdGEucmVzcG9uc2VEYXRhXG4gICAgICB9LFxuICAgICAgKF9lcnI6IGFueSkgPT4ge1xuICAgICAgfSlcbiAgfVxuXG4gIGdldEZpbHRlcmVkRGVzaWduYXRpb25MaXN0KGluZGV4OiBzdHJpbmcpIHtcbiAgICBjb25zdCBmaWx0ZXJLZXkgPSB0aGlzLmNyZWF0ZVRoZW1lRm9ybS52YWx1ZS5kZXNpZ25hdGlvbnNbaW5kZXhdLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgIGlmKGZpbHRlcktleSAmJiB0aGlzLmRlc2lnbmF0aW9uc0xpc3QpIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkTGlzdCA9IHRoaXMuZGVzaWduYXRpb25zTGlzdC5maWx0ZXIoKGRlc2lnbmF0aW9uOiBhbnkpID0+IGRlc2lnbmF0aW9uLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJLZXkpKVxuICAgICAgcmV0dXJuIGZpbHRlcmVkTGlzdFxuICAgIH1cblxuICAgIHJldHVybiBbXVxuICB9XG5cbiAgYWRkRGVzaWduYXRpb24oKSB7XG4gICAgY29uc3QgbmV3RGVzaWduYXRpb24gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBpZDpbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBkZXNpZ25hdGlvbkRlc2NyaXB0aW9uOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCg2MDApXV0sXG4gICAgICBpc1NhdmVkOiBbZmFsc2VdLCAvLyBpc1NhdmVkIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSBidXR0b24gdGV4dCBmcm9tIHNhdmUgdG8gdXBkYXRlIGlmIG5lZWRlZFxuICAgICAgY3JlYXRpb25JZDogdGhpcy5hZGRlZERlc2lnbmF0aW9uQ291bnQgLy8gY3JlYXRpb25JZCBpcyBjcmVhdGVkIHRvIHVzZSBsb2NhbGx5IHRvIGdpdmUgdW5pcXVlIGlkIHRvIGFkZGVkIHJlY29yZHNcbiAgICB9KTtcbiAgICB0aGlzLmFkZGVkRGVzaWduYXRpb25Db3VudCA9IHRoaXMuYWRkZWREZXNpZ25hdGlvbkNvdW50ICsgMTtcbiAgICAodGhpcy5jcmVhdGVUaGVtZUZvcm0uZ2V0KCdkZXNpZ25hdGlvbnMnKSBhcyBVbnR5cGVkRm9ybUFycmF5KS5pbnNlcnQoMCwgbmV3RGVzaWduYXRpb24pO1xuICAgIC8vIHRoaXMucGFuZWxPcGVuU3RhdGUuaW5zZXJ0KDAsIHRydWUpXG4gICAgdGhpcy5wYW5lbE9wZW5TdGF0ZS5zcGxpY2UoMCwgMCwgdHJ1ZSk7XG4gIH1cblxuICBjbGVhclNlbGVjdGVkRGVzaWduYWlvbk9uQ2hhbmdlKGluZGV4OmFueSwgZXZlbnQ6YW55KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWROYW1lID0gdGhpcy5jcmVhdGVUaGVtZUZvcm0udmFsdWUuZGVzaWduYXRpb25zW2luZGV4XS5uYW1lXG4gICAgaWYoc2VsZWN0ZWROYW1lICE9PSBldmVudC52YWx1ZSkge1xuICAgICAgY29uc3QgZGVzaWduYXRpb25zVG9SZXNldDphbnkgPSB0aGlzLmRlc2lnbmF0aW9uQ29udHJvbHNbaW5kZXhdXG4gICAgICBkZXNpZ25hdGlvbnNUb1Jlc2V0LmdldCgnaWQnKS5yZXNldCgpXG4gICAgfVxuICB9XG5cbiAgZGVsZXRlRGVzaWduYXRpb24oaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHJlb3ZlZENyZWF0aW9uSWQgPSB0aGlzLmRlc2lnbmF0aW9uQ29udHJvbHNbaW5kZXhdLnZhbHVlLmNyZWF0aW9uSWQ7XG4gICAgKHRoaXMuY3JlYXRlVGhlbWVGb3JtLmdldCgnZGVzaWduYXRpb25zJykgYXMgVW50eXBlZEZvcm1BcnJheSkucmVtb3ZlQXQoaW5kZXgpO1xuICAgIHRoaXMuc2F2ZWREZXNpZ25hdGlvbnMgPSB0aGlzLnNhdmVkRGVzaWduYXRpb25zLmZpbHRlcigoc2F2ZWREZXNpZ25hdGlvbjogYW55KSA9PiBzYXZlZERlc2lnbmF0aW9uLmNyZWF0aW9uSWQgIT09IHJlb3ZlZENyZWF0aW9uSWQpXG4gIH1cblxuICBzYXZlRGVzaWduYXRpb24oaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGRlc2lnbmF0aW9ucyA9IHRoaXMuZGVzaWduYXRpb25Db250cm9sc1xuICAgIGNvbnN0IGRlc2lnbmF0aW9uVG9TYXZlID0gZGVzaWduYXRpb25zW2luZGV4XVxuICAgIGlmIChkZXNpZ25hdGlvblRvU2F2ZS52YWxpZCkge1xuICAgICAgZGVzaWduYXRpb25Ub1NhdmUudmFsdWUuaXNTYXZlZCA9IHRydWVcbiAgICAgIGNvbnN0IHNhdmVkRGVzaWduYXRpb25JbmRleCA9IHRoaXMuc2F2ZWREZXNpZ25hdGlvbnMuZmluZEluZGV4KChlOmFueSkgPT4gZS5jcmVhdGlvbklkID09PSBkZXNpZ25hdGlvblRvU2F2ZS52YWx1ZS5jcmVhdGlvbklkKVxuICAgICAgaWYgKHNhdmVkRGVzaWduYXRpb25JbmRleCA+PSAwKSB7XG4gICAgICAgIHRoaXMuc2F2ZWREZXNpZ25hdGlvbnNbc2F2ZWREZXNpZ25hdGlvbkluZGV4XSA9IGRlc2lnbmF0aW9uVG9TYXZlLnZhbHVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNhdmVkRGVzaWduYXRpb25zLnB1c2goZGVzaWduYXRpb25Ub1NhdmUudmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3VibWl0RGVzaWduYXRpb24oKSB7XG4gICAgXG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKVxuICB9XG5cbiAgZ2V0IGVuYWJsZUFkZEJ0bigpIHtcbiAgICBpZih0aGlzLmNvbENvZGUgPT09ICdkZXNpZ25hdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlc2lnbmF0aW9uQ29udHJvbHMubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxuICBcbiAgcHJpdmF0ZSBfZmlsdGVyKHNlYXJjaFR4dDogYW55KTogQ2FyZFtdIHtcbiAgICBsZXQgaXNFeGlzdDtcbiAgICB0aGlzLmRpc2FibGVDcmVhdGUgPSBmYWxzZVxuICAgIHRoaXMuaXNUZXJtRXhpc3QgPSBmYWxzZVxuICAgIHRoaXMuY3JlYXRlVGVybUZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpLmVuYWJsZSgpXG4gICAgLy8gdGhpcy5jcmVhdGVUZXJtRm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJykucGF0Y2hWYWx1ZSgnJylcbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHR5cGVvZiAoc2VhcmNoVHh0KSA9PT0gJ29iamVjdCcgPyB0aGlzLl9ub3JtYWxpemVWYWx1ZShzZWFyY2hUeHQubmFtZSkgOiB0aGlzLl9ub3JtYWxpemVWYWx1ZShzZWFyY2hUeHQpO1xuICAgIGlzRXhpc3QgPSB0aGlzLnRlcm1MaXN0cy5maWx0ZXIoKHRlcm06YW55KSA9PiB0aGlzLl9ub3JtYWxpemVWYWx1ZSh0ZXJtLm5hbWUpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSk7XG4gICAgcmV0dXJuIGlzRXhpc3RcbiAgfVxuXG4gIHByaXZhdGUgX25vcm1hbGl6ZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gIH1cblxuICBvblNlbGVjdGlvbkFyZWEob3B0aW9uOmFueSl7XG4gICAgdGhpcy5hbGxDb21wZXRlbmN5LmZvckVhY2goKHZhbDphbnkpPT57XG4gICAgICBpZiAob3B0aW9uLm5hbWUgPT09IHZhbC5uYW1lKSB7XG4gICAgICAgIHRoaXMuc2VsZXRlZENvbXBldGVuY3lBcmVhID0gdmFsXG4gICAgICAgIHRoaXMuYWxsQ29tcGV0ZW5jeVRoZW1lID0gdmFsLmNoaWxkcmVuXG4gICAgICAgIHRoaXMuZmlsdGVyZWRhbGxDb21wZXRlbmN5VGhlbWUgPSB0aGlzLmFsbENvbXBldGVuY3lUaGVtZVxuXG4gICAgICB9XG4gICAgfSlcbiAgIFxuICB9XG5cbiAgT25UaGVtZVNlbGVjdGlvbihldmVudDphbnkpIHtcbiAgICBcbiAgICBjb25zdCBzZWxlY3RlZFRoZW1lID0gZXZlbnQuc291cmNlLnZhbHVlXG4gICAgdGhpcy5maWx0ZXJlZGFsbENvbXBldGVuY3lUaGVtZS5mb3JFYWNoKCh2YWw6IGFueSkgPT4ge1xuICAgICAgaWYgKHNlbGVjdGVkVGhlbWUubmFtZSA9PT0gdmFsLm5hbWUpIHtcbiAgICAgICAgdGhpcy5hbGxDb21wZXRlbmN5U3VidGhlbWUgPSB2YWwuY2hpbGRyZW5cbiAgICAgICAgdGhpcy5maWx0ZXJlZGFsbENvbXBldGVuY3lTdWJUaGVtZSA9IHRoaXMuYWxsQ29tcGV0ZW5jeVN1YnRoZW1lXG4gICAgICB9XG5cbiAgICB9KVxuXG5cbiAgfVxuXG4gIC8vIGNvbXBBcmVhU2VsZWN0ZWQob3B0aW9uOiBhbnkpIHtcbiAgLy8gICB0aGlzLnJlc2V0Q29tcFN1YmZpZWxkcygpXG4gIC8vICAgdGhpcy5hbGxDb21wZXRlbmNpZXMuZm9yRWFjaCgodmFsOiBhbnkpID0+IHtcbiAgLy8gICAgIGlmIChvcHRpb24ubmFtZSA9PT0gdmFsLm5hbWUpIHtcbiAgLy8gICAgICAgdGhpcy5zZWxldGVkQ29tcGV0ZW5jeUFyZWEgPSB2YWxcbiAgLy8gICAgICAgdGhpcy5hbGxDb21wZXRlbmN5VGhlbWUgPSB2YWwuY2hpbGRyZW5cbiAgLy8gICAgICAgdGhpcy5maWx0ZXJlZGFsbENvbXBldGVuY3lUaGVtZSA9IHRoaXMuYWxsQ29tcGV0ZW5jeVRoZW1lXG4gIFxuICAvLyAgICAgfVxuICAvLyAgIH0pXG4gIC8vIH1cblxuICBvblNlbGVjdCh0ZXJtOmFueSwgZm9ybTphbnkpIHtcbiAgICBzd2l0Y2ggKHRoaXMuY29sQ29kZSkge1xuICAgICAgY2FzZSAnZGVzaWduYXRpb24nOlxuICAgICAgICBmb3JtLmdldCgnbmFtZScpLnBhdGNoVmFsdWUodGVybS52YWx1ZS5uYW1lKVxuICAgICAgICBmb3JtLmdldCgnaWQnKS5wYXRjaFZhbHVlKHRlcm0udmFsdWUuaWQpXG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlcm0gPSB0ZXJtLnZhbHVlXG4gICAgICAgIGZvcm0uZ2V0KCduYW1lJykucGF0Y2hWYWx1ZSh0ZXJtLnZhbHVlLm5hbWUpXG4gICAgICAgIGZvcm0uZ2V0KCdkbmFtZScpLnBhdGNoKHRlcm0udmFsdWUuZG5hbWUpXG4gICAgICAgIGZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpLnBhdGNoVmFsdWUodGVybS52YWx1ZS5kZXNjcmlwdGlvbilcbiAgICAgICAgZm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJykuZGlzYWJsZSgpXG4gICAgICAgIHRoaXMuZGlzYWJsZUNyZWF0ZSA9IHRydWVcbiAgICB9XG4gIH1cblxuICBzYXZlVGVybSgpIHtcbiAgICBpZiAodGhpcy5fZmlsdGVyKHRoaXMuY3JlYXRlVGVybUZvcm0udmFsdWUubmFtZSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IHRydWVcbiAgICAgIFxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0aGlzLmNyZWF0ZVRlcm1Gb3JtLnZhbGlkKSB7XG4gICAgICBjb25zdCB0ZXJtOiBOU0ZyYW1ld29yay5JQ3JlYXRlVGVybSA9IHtcbiAgICAgICAgY29kZTogdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFV1aWQoKSxcbiAgICAgICAgbmFtZTogdGhpcy5jcmVhdGVUZXJtRm9ybS52YWx1ZS5uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5jcmVhdGVUZXJtRm9ybS52YWx1ZS5kZXNjcmlwdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsXG4gICAgICAgIHN0YXR1czogYXBwQ29uc3RhbnRzLkxJVkUsXG4gICAgICAgIC8vIGZyYW1ld29yazp0aGlzLmRhdGEuZnJhbWV3b3JrSWQsXG4gICAgICAgIC8vIGFwcHJvdmFsU3RhdHVzOmFwcENvbnN0YW50cy5EUkFGVCxcbiAgICAgICAgcGFyZW50czogW1xuICAgICAgICAgIHsgaWRlbnRpZmllcjogYCR7dGhpcy5kYXRhLmZyYW1ld29ya0lkLnRvTG93ZXJDYXNlKCl9XyR7dGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZX1gIH1cbiAgICAgICAgXSxcbiAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICBkaXNwbGF5TmFtZTogdGhpcy5jcmVhdGVUZXJtRm9ybS52YWx1ZS5kbmFtZSxcbiAgICAgICAgICB0aW1lU3RhbXA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByZXF1ZXN0Qm9keTphbnkgPSB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICB0ZXJtOiB0ZXJtXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmNyZWF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLCByZXF1ZXN0Qm9keSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm1bJ2lkZW50aWZpZXInXSA9IHJlcy5yZXN1bHQubm9kZV9pZFswXVxuICAgICAgICB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtLCBjcmVhdGVkOiB0cnVlIH0pXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXJtID0gcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtXG4gICAgICAgIHRoaXMudXBkYXRlVGVybUFzc29jaWF0aW9ucygpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVRlcm1EYXRhKGZvcm06YW55LCBkYXRhOmFueSkge1xuICAgIGxldCBhZGRpdGlvbmFsUHJvcGVydGllcyA9ICBkYXRhLmNoaWxkcmVuRGF0YS5hZGRpdGlvbmFsUHJvcGVydGllc1xuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzWydkaXNwbGF5TmFtZSddID0gdGhpcy5jcmVhdGVUaGVtZUZvcm0udmFsdWUuZG5hbWVcbiAgICBmb3JtLnZhbHVlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gYWRkaXRpb25hbFByb3BlcnRpZXNcbiAgICBcbiAgICBmb3JtLnZhbHVlLmRpc3BsYXlOYW1lID0gZm9ybS52YWx1ZS5kbmFtZVxuICAgIFxuICAgIHRoaXMuZGlzYWJsZVVwZGF0ZSA9IHRydWVcbiAgICBjb25zdCBmb3JtRGF0YSA9IHtcbiAgICAgIC8vIHVzZSB0aGlzIGlmIHlvdSBuZWVkIGRpc2FibGVkIGZpZWxkIHZhbHVlcyA6IGZvcm0uZ2V0UmF3VmFsdWUoKVxuICAgICAgLi4uZm9ybS52YWx1ZSxcbiAgICAgIC8vIGRpc3BsYXlOYW1lOnsuLi5mb3JtLnZhbHVlLmRuYW1lfVxuICAgIH1cbiAgICBjb25zdCB1cGRhdGVEYXRhID0ge1xuICAgICAgZm9ybURhdGEsXG4gICAgICB1cGRhdGVUZXJtRGF0YTogZGF0YS5jaGlsZHJlbkRhdGFcbiAgICB9XG4gICAgdGhpcy51cGRhdGVUZXJtRGF0YUFzc29jaWF0aW9ucyh1cGRhdGVEYXRhKVxuICB9XG5cblxuICB1cGRhdGVUZXJtRGF0YUFzc29jaWF0aW9ucyh1cGRhdGVEYXRhOmFueSkge1xuICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gdHJ1ZVxuICAgIGxldCBzZWxlY3Rpb25EYXRhID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpXG4gICAgaWYoIXNlbGVjdGlvbkRhdGEgKSB7XG4gICAgICBzZWxlY3Rpb25EYXRhID0gdGhpcy5kYXRhLmNoaWxkcmVuRGF0YVxuICAgIH1cbiAgICBjb25zdCBsaXN0VGhtZSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5saXN0LmdldCh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKVxuICAgIGxldCB0aGVtQXNzb2NpYXRpb25zOiBhbnlcbiAgICBpZihsaXN0VGhtZSAmJiBsaXN0VGhtZS5jaGlsZHJlbiAmJiBsaXN0VGhtZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBsaXN0VGhtZS5jaGlsZHJlbi5maW5kKChjKSA9PiBjLmlkZW50aWZpZXIgPT09IHNlbGVjdGlvbkRhdGEuaWRlbnRpZmllcilcbiAgICAgIHRoZW1Bc3NvY2lhdGlvbnMgPSBkYXRhLmFzc29jaWF0aW9ucyA/IGRhdGEuYXNzb2NpYXRpb25zLm1hcCgoYzphbnkpID0+IHtcbiAgICAgICAgLy8gcmV0dXJuIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyLCBhcHByb3ZhbFN0YXR1czogYy5hc3NvY2lhdGlvblByb3BlcnRpZXM/Yy5hc3NvY2lhdGlvblByb3BlcnRpZXMuYXBwcm92YWxTdGF0dXM6ICdEcmFmdCcgfVxuICAgICAgICByZXR1cm4gYy5pZGVudGlmaWVyID8gIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyIH0gOiBudWxsXG4gICAgICB9KSA6IFtdXG4gICAgfVxuICAgIGNvbnN0IHJlZ3Vlc3RCb2R5ID0ge1xuICAgICAgcmVxdWVzdDoge1xuICAgICAgICB0ZXJtOiB7XG4gICAgICAgICAgLi4udXBkYXRlRGF0YS5mb3JtRGF0YSxcbiAgICAgICAgICAuLi4odGhlbUFzc29jaWF0aW9ucyAmJiB0aGVtQXNzb2NpYXRpb25zLmxlbmd0aCkgPyB7YXNzb2NpYXRpb25zOiB0aGVtQXNzb2NpYXRpb25zfSA6IG51bGwsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCBzZWxlY3Rpb25EYXRhLmNhdGVnb3J5LCBzZWxlY3Rpb25EYXRhLmNvZGUsIHJlZ3Vlc3RCb2R5KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAvLyB0aGlzLnNlbGVjdGVkVGVybVsnYXNzb2NpYXRpb25Qcm9wZXJ0aWVzJ11bJ2FwcHJvdmFsU3RhdHVzJ10gPSAnRHJhZnQnO1xuXG4gICAgICAgIC8vIHRoaXMgdmFsdWUgaXMgZm9yIHNlbGVjdGVkIHRlcm0gaW4gY2FzZSBvZiBjcmVhdGUgc2NlbmFyaW8sIGluIGNhc2Ugb2YgZWRpdCBzY2VuYXJpbyB0aGlzIHdvbid0IGJlIGF2YWlhYmxlIFxuICAgICAgICAvLyBzbyB0ZXJtIGlzIHNldCBmcm9tIGNoaWxkZGF0YSB3aGljaCBpcyByZWNlaXZlZCBmcm9tIHBhcmFtcyBpbiB1cGRhdGVEYXRhXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKHRoaXMuc2VsZWN0ZWRUZXJtICYmIHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpID8gdGhpcy5zZWxlY3RlZFRlcm0gOiAodXBkYXRlRGF0YSkgPyB7Li4udXBkYXRlRGF0YS51cGRhdGVUZXJtRGF0YSwgLi4udXBkYXRlRGF0YS5mb3JtRGF0YX0gOiB7fVxuICAgICAgICBcbiAgICAgICAgdGhpcy5kaXNhYmxlVXBkYXRlID0gZmFsc2VcbiAgICAgICAgXG4gICAgICAgIC8vIGNvbnN0IHNlbGVjdGlvbkRhdGEgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSlcbiAgICAgICAgc2VsZWN0aW9uRGF0YVsnZGVzY3JpcHRpb24nXSA9IHJlZ3Vlc3RCb2R5LnJlcXVlc3QudGVybS5kZXNjcmlwdGlvblxuICAgICAgICBzZWxlY3Rpb25EYXRhWydhZGRpdGlvbmFsUHJvcGVydGllcyddID0gcmVndWVzdEJvZHkucmVxdWVzdC50ZXJtLmFkZGl0aW9uYWxQcm9wZXJ0aWVzXG4gICAgICAgIHNlbGVjdGlvbkRhdGFbJ2Fzc29jaWF0aW9ucyddID0gdGhlbUFzc29jaWF0aW9uc1xuICAgICAgICBcblxuICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5ICR7dmFsdWUuY2F0ZWdvcnl9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5YClcbiAgICAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IHsgLi4udmFsdWUgfSwgY3JlYXRlZDogdHJ1ZSB9KVxuICAgICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlRnVsbFRlcm1EYXRhTG9jYWxNYXAodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgc2VsZWN0aW9uRGF0YSlcbiAgICB9LCAoX2VycjogYW55KSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKGBFZGl0ICR7dGhpcy5kYXRhLmNvbHVtbkluZm8ubmFtZX0gZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyYClcbiAgICB9KVxuICB9XG5cbiAgdXBkYXRlVGVybUFzc29jaWF0aW9ucyh1cGRhdGVEYXRhPzogYW55KSB7XG4gICAgbGV0IGFzc29jaWF0aW9ucyA9IFtdXG4gICAgbGV0IHRlbXBcbiAgICBsZXQgY291bnRlciA9IDBcbiAgICAvLyBsZXQgbG9jYWxJc0V4aXN0ID0gZmFsc2VcbiAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5mb3JFYWNoKChwYXJlbnQpID0+IHtcbiAgICAgIGNvdW50ZXIrK1xuICAgICAgdGVtcCA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoKGNoaWxkOmFueSkgPT4gY2hpbGQuaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgOiBudWxsXG4gICAgICBhc3NvY2lhdGlvbnMgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ubWFwKChjOmFueSkgPT4ge1xuICAgICAgICAvLyByZXR1cm4geyBpZGVudGlmaWVyOiBjLmlkZW50aWZpZXIsIGFwcHJvdmFsU3RhdHVzOiBjLmFzc29jaWF0aW9uUHJvcGVydGllcz9jLmFzc29jaWF0aW9uUHJvcGVydGllcy5hcHByb3ZhbFN0YXR1czogJ0RyYWZ0JyB9XG4gICAgICAgIHJldHVybiBjLmlkZW50aWZpZXIgPyAgeyBpZGVudGlmaWVyOiBjLmlkZW50aWZpZXIgfSA6IG51bGxcbiAgICAgIH0pIDogW11cbiAgICAgIGlmICh0ZW1wICYmIHRlbXAubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuaXNUZXJtRXhpc3QgPSB0cnVlXG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYXNzb2NpYXRpb25zLnB1c2goeyBpZGVudGlmaWVyOiB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyLCBhcHByb3ZhbFN0YXR1czogYXBwQ29uc3RhbnRzLkRSQUZUIH0pXG4gICAgICAgIGlmKHRoaXMuc2VsZWN0ZWRUZXJtICYmIHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpIHtcbiAgICAgICAgICBhc3NvY2lhdGlvbnMucHVzaCh7IGlkZW50aWZpZXI6IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzVGVybUV4aXN0ID0gZmFsc2VcbiAgICAgICAgY29uc3QgcmVndWVzdEJvZHkgPSB7XG4gICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgdGVybToge1xuICAgICAgICAgICAgICAuLi4odXBkYXRlRGF0YSAmJiB1cGRhdGVEYXRhLmZvcm1EYXRhICYmIHVwZGF0ZURhdGEudXBkYXRlVGVybURhdGEuY29kZSA9PT0gcGFyZW50LmNvZGUpID8gey4uLnVwZGF0ZURhdGEuZm9ybURhdGF9OiBudWxsLFxuICAgICAgICAgICAgICAuLi4oYXNzb2NpYXRpb25zICYmIGFzc29jaWF0aW9ucy5sZW5ndGgpID8ge2Fzc29jaWF0aW9uczogWy4uLmFzc29jaWF0aW9uc119IDogbnVsbCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiB0aGlzLnNlbGVjdGVkVGVybSwgY3JlYXRlZDogdHJ1ZSB9KVxuICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHBhcmVudC5jYXRlZ29yeSwgcGFyZW50LmNvZGUsIHJlZ3Vlc3RCb2R5KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmIChjb3VudGVyID09PSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5zaXplKSB7XG4gICAgICAgICAgICAvLyB0aGlzLnNlbGVjdGVkVGVybVsnYXNzb2NpYXRpb25Qcm9wZXJ0aWVzJ11bJ2FwcHJvdmFsU3RhdHVzJ10gPSAnRHJhZnQnO1xuXG4gICAgICAgICAgICAvLyB0aGlzIHZhbHVlIGlzIGZvciBzZWxlY3RlZCB0ZXJtIGluIGNhc2Ugb2YgY3JlYXRlIHNjZW5hcmlvLCBpbiBjYXNlIG9mIGVkaXQgc2NlbmFyaW8gdGhpcyB3b24ndCBiZSBhdmFpYWJsZSBcbiAgICAgICAgICAgIC8vIHNvIHRlcm0gaXMgc2V0IGZyb20gY2hpbGRkYXRhIHdoaWNoIGlzIHJlY2VpdmVkIGZyb20gcGFyYW1zIGluIHVwZGF0ZURhdGFcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKHRoaXMuc2VsZWN0ZWRUZXJtICYmIHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpID8gdGhpcy5zZWxlY3RlZFRlcm0gOiAodXBkYXRlRGF0YSkgPyB7Li4udXBkYXRlRGF0YS51cGRhdGVUZXJtRGF0YSwgLi4udXBkYXRlRGF0YS5mb3JtRGF0YX0gOiB7fVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVVcGRhdGUgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke3ZhbHVlLmNhdGVnb3J5fSB1cGRhdGVkIHN1Y2Nlc3NmdWxseWApXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogeyAuLi52YWx1ZSB9LCBjcmVhdGVkOiB0cnVlIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9LCAoX2VycjogYW55KSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRWRpdCAke3RoaXMuZGF0YS5jb2x1bW5JbmZvLm5hbWV9IGZhaWxlZCwgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlcmApXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHNhdmVUaGVtZVRlcm0oKSB7XG4gICAgaWYgKHRoaXMuX2ZpbHRlcih0aGlzLmNyZWF0ZVRoZW1lRm9ybS52YWx1ZS5uYW1lKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmlzVGVybUV4aXN0ID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0aGlzLmNyZWF0ZVRoZW1lRm9ybS52YWxpZCkge1xuICAgICAgY29uc3QgdGVybTogTlNGcmFtZXdvcmsuSUNyZWF0ZVRlcm0gPSB7XG4gICAgICAgIGNvZGU6IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRVdWlkKCksXG4gICAgICAgIG5hbWU6IHRoaXMuY3JlYXRlVGhlbWVGb3JtLnZhbHVlLm5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmNyZWF0ZVRoZW1lRm9ybS52YWx1ZS5kZXNjcmlwdGlvbixcbiAgICAgICBcbiAgICAgICAgY2F0ZWdvcnk6IHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsXG4gICAgICAgIHN0YXR1czogYXBwQ29uc3RhbnRzLkxJVkUsXG4gICAgICAgIC8vIGFwcHJvdmFsU3RhdHVzOmFwcENvbnN0YW50cy5EUkFGVCxcbiAgICAgICAgcGFyZW50czogW1xuICAgICAgICAgIHsgaWRlbnRpZmllcjogYCR7dGhpcy5kYXRhLmZyYW1ld29ya0lkLnRvTG93ZXJDYXNlKCl9XyR7dGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZX1gIH1cbiAgICAgICAgXSxcbiAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICBkaXNwbGF5TmFtZTp0aGlzLmNyZWF0ZVRlcm1Gb3JtLnZhbHVlLmRuYW1lLFxuICAgICAgICAgIHRpbWVTdGFtcDogbmV3IERhdGUoKS5nZXRUaW1lKCksXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcXVlc3RCb2R5OmFueSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIHRlcm06IHRlcm1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UuY3JlYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsIHJlcXVlc3RCb2R5KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgIHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybVsnaWRlbnRpZmllciddID0gcmVzLnJlc3VsdC5ub2RlX2lkWzBdXG4gICAgICAgIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm0sIGNyZWF0ZWQ6IHRydWUgfSlcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlcm0gPSByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm1cbiAgICAgICAgdGhpcy51cGRhdGVUZXJtQXNzb2NpYXRpb25zKClcbiAgICAgIH0sIChfZXJyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ3JlYXRlICR7dGhpcy5kYXRhLmNvbHVtbkluZm8ubmFtZX0gZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyYClcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZGlhbG9nQ2xvc2UodGVybTogYW55KSB7XG4gICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnB1Ymxpc2hGcmFtZXdvcmsoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodGVybSlcbiAgICB9KTtcbiAgfVxuXG5cbiAgYXN5bmMgdXBkYXRlVGVybUFzc29jaWF0aW9uc011bHRpVjIoY3JlYXRlZFRlcm1zOiBhbnlbXSwgcGFyZW50U2VsZWN0ZWRUZXJtPzphbnkpIHtcbiAgIFxuICAgIHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXkgPSBbXVxuICAgIC8vIGxldCBjcmVhdGVkVGVybXNDb3VudGVyID0gMFxuICAgIGxldCBjcmVhdGVkVGVybXNJZGVudGlmaWVycyA9IFtdXG4gICAgdGhpcy5zZWxlY3RlZFRlcm1BcnJheSA9IGNyZWF0ZWRUZXJtc1xuICAgIHRoaXMuc2VsZWN0ZWRUZXJtID0gY3JlYXRlZFRlcm1zW2NyZWF0ZWRUZXJtcy5sZW5ndGggLTFdXG4gICAgZm9yKGxldCBjcmVhdGVkVGVybSBvZiBjcmVhdGVkVGVybXMpIHtcbiAgICAgIGNyZWF0ZWRUZXJtc0lkZW50aWZpZXJzLnB1c2goeyBpZGVudGlmaWVyOiBjcmVhdGVkVGVybS5pZGVudGlmaWVyIH0pXG4gICAgfVxuICAgIGxldCBhc3NvY2lhdGlvbnMgPSBbXVxuICAgIGxldCBjb3VudGVyID0gMFxuICAgaWYoY3JlYXRlZFRlcm1zICYmIGNyZWF0ZWRUZXJtcy5sZW5ndGgpIHtcbiAgICAgIGxldCBwYXJlbnQ6IGFueVxuICAgICBsZXQgY3JlYXRlZFRlcm1zQ291bnRlciA9IDBcbiAgICAgaWYoIXBhcmVudFNlbGVjdGVkVGVybSkge1xuICAgICAgZm9yKGxldCBjcmVhdGVkVGVybSBvZiBjcmVhdGVkVGVybXMpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlcm0gPSBjcmVhdGVkVGVybVxuICAgICAgICBsZXQgdGVtcFxuICAgICAgICBmb3IoY29uc3QgW3ZhbHVlXSBvZiB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdCl7XG4gICAgICAgICAgIHBhcmVudCA9IHZhbHVlXG4gICAgICAgICAgY291bnRlcisrXG4gICAgICAgICAgdGVtcCA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoKGNoaWxkOiBhbnkpID0+IGNoaWxkLmlkZW50aWZpZXIgPT09IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpIDogbnVsbFxuICAgICAgICAgIGFzc29jaWF0aW9ucyA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5tYXAoKGM6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gcmV0dXJuIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyLCBhcHByb3ZhbFN0YXR1czogYy5hc3NvY2lhdGlvblByb3BlcnRpZXM/Yy5hc3NvY2lhdGlvblByb3BlcnRpZXMuYXBwcm92YWxTdGF0dXM6ICdEcmFmdCcgfVxuICAgICAgICAgICAgcmV0dXJuIGMuaWRlbnRpZmllciA/ICB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciB9IDogbnVsbFxuICAgICAgICAgIH0pIDogW11cbiAgICAgICAgICBpZiAodGVtcCAmJiB0ZW1wLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IHRydWVcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFzc29jaWF0aW9ucy5wdXNoKHsgaWRlbnRpZmllcjogdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllciB9KVxuICAgICAgICAgICAgICB0aGlzLmlzVGVybUV4aXN0ID0gZmFsc2VcbiAgICAgICAgICAgICAgLy8gaWYoY3JlYXRlZFRlcm1zQ291bnRlciA9PT0gKGNyZWF0ZWRUZXJtcy5sZW5ndGgtMSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWd1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgdGVybToge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLihhc3NvY2lhdGlvbnMgJiYgYXNzb2NpYXRpb25zLmxlbmd0aCkgPyB7YXNzb2NpYXRpb25zOiBbLi4uYXNzb2NpYXRpb25zXX0gOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiB0aGlzLnNlbGVjdGVkVGVybSwgY3JlYXRlZDogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FsbFVwZGF0ZUFzc29jaWF0aW9ucyhjb3VudGVyLCBwYXJlbnQsIHJlZ3Vlc3RCb2R5KVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNyZWF0ZWRUZXJtc0NvdW50ZXIrK1xuICAgICAgICBpZihjcmVhdGVkVGVybXNDb3VudGVyID09PSBjcmVhdGVkVGVybXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUZyYW1ld29ya0xpc3QodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgcGFyZW50LCBjcmVhdGVkVGVybXMgKVxuICAgICAgICAgIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiBbdGhpcy5zZWxlY3RlZFRlcm1dLCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlIH0pXG4gICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPWZhbHNlO1xuICAgICAgICAgIGlmKGNyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeSA9PT0gJ3RoZW1lJyl7XG4gICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5ICR7Y3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5fSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnkgPT09ICdzdWJ0aGVtZScpe1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke2NyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudFNlbGVjdGVkVGVybVxuICAgICAgYXNzb2NpYXRpb25zID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLm1hcCgoYzphbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGMuaWRlbnRpZmllciA/ICB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciB9IDogbnVsbFxuICAgICAgfSkgOiBbXVxuICAgICAgICBhc3NvY2lhdGlvbnMgPSBbLi4uYXNzb2NpYXRpb25zLCAuLi5jcmVhdGVkVGVybXNJZGVudGlmaWVyc11cbiAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IGZhbHNlXG4gICAgICAgIGNvbnN0IHJlZ3Vlc3RCb2R5ID0ge1xuICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgLi4uKGFzc29jaWF0aW9ucyAmJiBhc3NvY2lhdGlvbnMubGVuZ3RoKSA/IHthc3NvY2lhdGlvbnM6IFsuLi5hc3NvY2lhdGlvbnNdfSA6IG51bGwsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuY2FsbFVwZGF0ZUFzc29jaWF0aW9uc1YyKGNvdW50ZXIsIHBhcmVudCwgcmVndWVzdEJvZHkpXG5cbiAgICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlRnJhbWV3b3JrTGlzdCh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLCBwYXJlbnQsIGNyZWF0ZWRUZXJtcyApXG4gICAgICAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXksIGNyZWF0ZWQ6IHRydWUsIG11bHRpOnRydWUgfSlcbiAgICAgICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9ZmFsc2U7XG4gICAgICAgICAgaWYoY3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5ID09PSAndGhlbWUnKXtcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYENvbXBldGVuY3kgJHtjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnl9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmApXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGNyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeSA9PT0gJ3N1YnRoZW1lJyl7XG4gICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5ICR7Y3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5fSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgICAgICAgIH1cbiAgICAgfVxuICAgfVxuIH1cblxuIGFzeW5jIGNhbGxVcGRhdGVBc3NvY2lhdGlvbnNWMihjb3VudGVyOmFueSwgcGFyZW50OmFueSwgcmVndWVzdEJvZHkgOmFueSk6IFByb21pc2U8YW55PntcbiAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVUZXJtKHRoaXMuZGF0YS5mcmFtZXdvcmtJZCwgcGFyZW50LmNhdGVnb3J5LCBwYXJlbnQuY29kZSwgcmVndWVzdEJvZHkpLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICBwYXJlbnRbJ2NoaWxkcmVuJ10gPSBwYXJlbnQgJiYgcGFyZW50LmNoaWxkcmVuID9bLi4ucGFyZW50LmNoaWxkcmVuLCAuLi50aGlzLnNlbGVjdGVkVGVybUFycmF5XTp0aGlzLnNlbGVjdGVkVGVybUFycmF5XG4gICAgICAgIGxldCBsaXN0RGF0YSA6IGFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5saXN0LmdldCh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKVxuICAgICAgICBsZXQgZGlmZmVyZW5jZURhdGEgPSBbXVxuICAgICAgICBpZihsaXN0RGF0YSAmJiBsaXN0RGF0YS5jaGlsZHJlbiAmJiBsaXN0RGF0YS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICBkaWZmZXJlbmNlRGF0YSAgPSBfLmRpZmZlcmVuY2VCeSh0aGlzLnNlbGVjdGVkVGVybUFycmF5LGxpc3REYXRhLmNoaWxkcmVuLCAnaWRlbnRpZmllcicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpZmZlcmVuY2VEYXRhID0gdGhpcy5zZWxlY3RlZFRlcm1BcnJheVxuICAgICAgICB9XG4gICAgICAgIGxpc3REYXRhWydhc3NvY2lhdGlvbnMnXSA9IGxpc3REYXRhICYmIGxpc3REYXRhLmFzc29jaWF0aW9ucyA/Wy4uLmxpc3REYXRhLmFzc29jaWF0aW9ucywgLi4uZGlmZmVyZW5jZURhdGFdOmRpZmZlcmVuY2VEYXRhXG4gICAgICAgIGxpc3REYXRhWydjaGlsZHJlbiddID0gbGlzdERhdGEgJiYgbGlzdERhdGEuY2hpbGRyZW4gP1suLi5saXN0RGF0YS5jaGlsZHJlbiwgLi4uZGlmZmVyZW5jZURhdGFdOmRpZmZlcmVuY2VEYXRhXG5cbiAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZm9yRWFjaCgoc2VsZWN0ZWREYXRhOiBhbnkpPT4ge1xuICAgICAgICAgIGxldCBsaXN0RGF0YSA6IGFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5saXN0LmdldChzZWxlY3RlZERhdGEuY2F0ZWdvcnkpXG4gICAgICAgICAgaWYobGlzdERhdGEgJiYgbGlzdERhdGEuY2hpbGRyZW4gJiYgbGlzdERhdGEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlTG9jYWxMaXN0KGxpc3REYXRhLHBhcmVudCwgdGhpcy5zZWxlY3RlZFRlcm1BcnJheSwgJ2NyZWF0ZScpXG4gICAgICAgICAgfVxuICAgICAgICB9KSBcbiAgICAgICBpZiAoY291bnRlciA9PT0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3Quc2l6ZSkge1xuICAgICAgICAgLy8gdGhpcy5zZWxlY3RlZFRlcm1bJ2Fzc29jaWF0aW9uUHJvcGVydGllcyddWydhcHByb3ZhbFN0YXR1cyddID0gJ0RyYWZ0JztcbiBcbiAgICAgICAgIC8vIHRoaXMgdmFsdWUgaXMgZm9yIHNlbGVjdGVkIHRlcm0gaW4gY2FzZSBvZiBjcmVhdGUgc2NlbmFyaW8sIGluIGNhc2Ugb2YgZWRpdCBzY2VuYXJpbyB0aGlzIHdvbid0IGJlIGF2YWlhYmxlIFxuICAgICAgICAgLy8gc28gdGVybSBpcyBzZXQgZnJvbSBjaGlsZGRhdGEgd2hpY2ggaXMgcmVjZWl2ZWQgZnJvbSBwYXJhbXMgaW4gdXBkYXRlRGF0YVxuICAgICAgICAvLyAgY29uc3QgdmFsdWUgPSAodGhpcy5zZWxlY3RlZFRlcm0gJiYgdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgPyB0aGlzLnNlbGVjdGVkVGVybSA6IHt9XG4gICAgICAgIC8vICBjb25zdCBmb3VuZCA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5maW5kKGM9PiBjLmlkZW50aWZpZXIgPT09IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpIDogZmFsc2VcbiAgICAgICAgIC8vIGlmKCFmb3VuZCkge1xuICAgICAgICAgLy8gICBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzLnNlbGVjdGVkVGVybSkgOiBwYXJlbnRbJ2NoaWxkcmVuJ10gPSBbdGhpcy5zZWxlY3RlZFRlcm1dXG4gICAgICAgICAvLyB9XG4gICAgICAgICB0aGlzLmRpc2FibGVVcGRhdGUgPSBmYWxzZVxuICAgICAgICAgLy8gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnB1Ymxpc2hGcmFtZXdvcmsoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgIC8vICAgLy8gdGhpcy5kaWFsb2dSZWYuY2xvc2UodGVybSlcbiAgICAgICAgIC8vICAgcmV0dXJuIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgIC8vIH0pO1xuICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgIH0gZWxzZSB7XG4gICAgICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKVxuICAgICAgIH1cbiAgICAgfSwgKF9lcnI6IGFueSkgPT4ge1xuICAgICAgIGNvbnNvbGUuZXJyb3IoYEVkaXQgJHt0aGlzLmRhdGEuY29sdW1uSW5mby5uYW1lfSBmYWlsZWQsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXJgKVxuICAgICB9KVxuICAgfSlcbiAgfVxuXG59IiwiPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZGF0YT8uY29sdW1uSW5mbz8uY29kZSB8fCAnZGVmYXVsdENyZWF0ZSdcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzYWJsZU11bHRpQ3JlYXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtMSB3LTEwMCBhYnNvbHV0ZSBsb2FkZXItYmcgaXRlbXMtY2VudGVyIHB0LTUgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICA8bWF0LXNwaW5uZXIgY2xhc3M9XCJkaXNwbGF5LWlubGluZS1ibG9jayBtYi01XCIgW2RpYW1ldGVyXT1cIjUwXCIgW3N0cm9rZVdpZHRoXT1cIjNcIj48L21hdC1zcGlubmVyPlxuICAgICAgICAgIDwhLS0gPHA+e3tsb2FkZXJNc2d9fTwvcD4gLS0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0IFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRoZW1lQ3JlYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RoZW1lJ1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRoZW1lQ3JlYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N1YnRoZW1lJ1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRoZW1lQ3JlYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Rlc2lnbmF0aW9uJ1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRoZW1lRGVzaWduYXRpb25cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY29tcGV0ZW5jeSdcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJjb21wVGhlbWVcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI21vZGFsVGl0bGU+XG4gICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2NyZWF0ZScgfHwgZGF0YT8ubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy10aXRsZVwiIG1hdC1kaWFsb2ctdGl0bGU+e3tkYXRhLmNvbHVtbkluZm8ubmFtZSA9PT0gJ1RoZW1lJyA/IGFwcF9zdHJpbmdzLmFkZENvbXBldGVuY3kgOiBhcHBfc3RyaW5ncy5jcmVhdGVOZXd9fSB7e2RhdGEuY29sdW1uSW5mby5uYW1lfX08L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdjcmVhdGUnIHx8IGRhdGE/Lm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGVcIiBtYXQtZGlhbG9nLXRpdGxlPkFkZCB7e2RhdGE/LmNvbHVtbkluZm8/LmNvbmZpZz8uY2F0ZWdvcnlEaXNwbGF5TmFtZSB8fCBkYXRhLmNvbHVtbkluZm8ubmFtZSB9fSA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ3ZpZXcnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGVcIiBtYXQtZGlhbG9nLXRpdGxlPjwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnZWRpdCdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy10aXRsZVwiIG1hdC1kaWFsb2ctdGl0bGU+e3thcHBfc3RyaW5ncy5lZGl0fX0ge3tkYXRhPy5jb2x1bW5JbmZvPy5jb25maWc/LmNhdGVnb3J5RGlzcGxheU5hbWUgfHwgZGF0YS5jb2x1bW5JbmZvLm5hbWV9fTwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0Q3JlYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2dcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJtb2RhbFRpdGxlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiY3JlYXRlVGVybUZvcm1cIiBub3ZhbGlkYXRlIChuZ1N1Ym1pdCk9XCJkaXNhYmxlQ3JlYXRlP3VwZGF0ZVRlcm1Bc3NvY2lhdGlvbnMoKTpzYXZlVGVybSgpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZGVmYXVsdEZvcm1cIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1sYWJlbD5FbnRlciB7e2RhdGEubmFtZX19IG5hbWU8L21hdC1sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCIgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50Lm9wdGlvbiwgY3JlYXRlVGVybUZvcm0pXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVkVGVybUxpc3RzIHwgYXN5bmNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e29wdGlvbi5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1sYWJlbD5FbnRlciB7e2RhdGEubmFtZX19IG5hbWU8L21hdC1sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCIgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLmRlc2NyaXB0aW9ufX1cIiBtYXhsZW5ndGg9XCIyMDAwXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8Zm9vdGVyIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJkZWZhdWx0XCIgdHlwZT1cInJlc2V0XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRpYWxvZ0Nsb3NlKCcnKVwiPnt7YXBwX3N0cmluZ3MuY2FuY2VsfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJzdWJtaXRcIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZSB8fCBkaXNhYmxlTXVsdGlDcmVhdGVcIj57e2FwcF9zdHJpbmdzLmNyZWF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwic3VibWl0XCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGlzYWJsZUNyZWF0ZVwiPnt7YXBwX3N0cmluZ3MudXBkYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZm9vdGVyPlxuICAgICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RoZW1lQ3JlYXRlID5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nTmV3XCIgW25nQ2xhc3NdPVwieydkaXNhYmxlZC1kaXYnOiBkaXNhYmxlTXVsdGlDcmVhdGV9XCIgPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm1vZGFsVGl0bGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRlcm0gb2YgZGF0YT8uc2VsZWN0ZWRQYXJlbnRUZXJtc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWxcIiBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRDYXRlZ29yeU5hbWUodGVybS5jYXRlZ29yeSx0ZXJtKX19XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgbmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZSBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGVybS5uYW1lXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctZGl2aWRlclwiPjwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSAhPT0gJ211bHRpLWNyZWF0ZSdcIj5cbiAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwidGhlbWVGb3JtXCIgW2Zvcm1Hcm91cF09XCJjcmVhdGVUaGVtZUZvcm1cIiBub3ZhbGlkYXRlXG4gICAgICAgICAgICAgICAgKG5nU3VibWl0KT1cImRpc2FibGVDcmVhdGU/dXBkYXRlVGVybUFzc29jaWF0aW9ucygpOnNhdmVUaGVtZVRlcm0oKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXIgbWFyZ2luLXRvcC1zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBcIiAqbmdJZj1cImRhdGEuY29sdW1uSW5mbz8uY29kZSAhPT0gJ2NvbXBldGVuY3lhcmVhJyAmJiBkYXRhLm1vZGUgPT09ICd2aWV3J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzPy5uYW1lfX1cIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgKHNlbGVjdGlvbkNoYW5nZSk9XCJjaGFuZ2UoJGV2ZW50LGNyZWF0ZVRoZW1lRm9ybSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgI3NlYXJjaCBhdXRvY29tcGxldGU9XCJvZmZcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaFwiIGNsYXNzPVwiYXNzaWduZWVTZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgIChrZXl1cCk9XCJvbktleSgkZXZlbnQpXCIgbWF0SW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE1hc3Rlckxpc3RcIiAgICAoYmx1cik9XCJ1cGRhdGVEbmFtZShvcHRpb24/LnRpdGxlLCBjcmVhdGVUaGVtZUZvcm0pXCIgW2Rpc2FibGVkXT1cIm9uRGlzYWJsZVRoZW1lKG9wdGlvbilcIiBbdmFsdWVdPVwib3B0aW9uXCI+e3tvcHRpb24udGl0bGV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cImZpbHRlcmVkTWFzdGVyTGlzdC5sZW5ndGggPT09IDBcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gcmVzdWx0cyBmb3VuZCFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cInVwZGF0ZURuYW1lKG5hbWUudmFsdWUsIGNyZWF0ZVRoZW1lRm9ybSlcIiBtYXhsZW5ndGg9XCI3MFwiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZSBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIm9uU2VsZWN0KCRldmVudC5vcHRpb24sIGNyZWF0ZVRoZW1lRm9ybSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlZFRlcm1MaXN0cyB8IGFzeW5jXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e29wdGlvbi5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImluZm8taWNvbiBjdXJzb3ItcG9pbnRlclwiIFttYXRUb29sdGlwXT1cInRvb2xUaXBUZXh0XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcENsYXNzPVwidG9vbHRpcC1zZWNcIj5pbmZvX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImRuYW1lXCIgaWQ9XCJkbmFtZVwiICNkbmFtZSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZpZWxkIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gdGhlIG5hbWUgZmllbGQuXCIgbWF4bGVuZ3RoPVwiNzBcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIm9uU2VsZWN0KCRldmVudC5vcHRpb24sIGNyZWF0ZVRoZW1lRm9ybSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlZFRlcm1MaXN0cyB8IGFzeW5jXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e29wdGlvbi5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWVycm9yICpuZ0lmPVwiaXNUZXJtRXhpc3RcIj57e2FwcF9zdHJpbmdzLmFscmVhZHlFeGlzdH19PC9tYXQtZXJyb3I+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBcIiAqbmdJZj1cImRhdGEuY29sdW1uSW5mbz8uY29kZSA9PT0gJ2NvbXBldGVuY3lhcmVhJyAmJiBkYXRhLm1vZGUgPT09ICd2aWV3J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXQgW3ZhbHVlXT1cImRhdGE/LmNoaWxkcmVuRGF0YT8ubmFtZVwiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bj1cIkZpcnN0IE5hbWUgbGFiZWx8TGFiZWwgd2hpY2ggZXhwbGFpbnMgdGhlIHVzZXIgdG8gZW50ZXIgZmlyc3QgbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tYXJpYS1sYWJlbCBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWxhYmVsPkVudGVyIHt7ZGF0YS5uYW1lfX0gbmFtZTwvbWF0LWxhYmVsPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG1hdElucHV0IFtjZGtUZXh0YXJlYUF1dG9zaXplXSBbY2RrQXV0b3NpemVNYXhSb3dzXT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZGtBdXRvc2l6ZU1pblJvd3NdPVwiM1wiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5kZXNjcmlwdGlvbn19XCIgbWF4bGVuZ3RoPVwiMjAwMFwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8Zm9vdGVyIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwiZGVmYXVsdFwiIHR5cGU9XCJyZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGlhbG9nQ2xvc2UoJycpXCI+e3thcHBfc3RyaW5ncy5jYW5jZWx9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2NyZWF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjcmVhdGVUaGVtZUZvcm0/LmludmFsaWRcIiAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy5jcmVhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdlZGl0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVRlcm1EYXRhKGNyZWF0ZVRoZW1lRm9ybSwgZGF0YSlcIiBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtPy5pbnZhbGlkIHx8IGRpc2FibGVVcGRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIj57e2FwcF9zdHJpbmdzLnVwZGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZm9vdGVyPlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCI+XG4gICAgICAgICAgICA8Zm9ybSBjbGFzcz1cInRoZW1lRm9ybVwiIFtmb3JtR3JvdXBdPVwiY3JlYXRlVGhlbWVGb3JtTXVsdGlcIiBub3ZhbGlkYXRlXG4gICAgICAgICAgICAgICAgKG5nU3VibWl0KT1cImRpc2FibGVDcmVhdGU/dXBkYXRlVGVybUFzc29jaWF0aW9ucygpOnNhdmVUaGVtZVRlcm0oKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtZW5kIG1iLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYXQtYnV0dG9uIGZsZXggaXRlbXMtY2VudGVyIFwiICpuZ0lmPVwiZGF0YS5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiIChjbGljayk9XCJhZGRUaGVtZUZpZWxkcygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtci0yIG1hdC1pY29uLWN1c3RvbSBcIj5hZGRfY2lyY2xlX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgQWRkIG1vcmVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG1hdC1hY2NvcmRpb24gZm9ybUFycmF5TmFtZT1cInRoZW1lRmllbGRzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsICNtZXA9XCJtYXRFeHBhbnNpb25QYW5lbFwiICpuZ0Zvcj1cImxldCBmaWVsZCBvZiB0aGVtZUZpZWxkc0NvbnRyb2xzOyBsZXQgaSA9IGluZGV4OyBsZXQgaXNGaXJzdCA9IGZpcnN0XCIgXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWFyZ2luLWJvdHRvbS1sXCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIFtleHBhbmRlZF09XCJpc0ZpcnN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRFeHBhbnNpb25UaXRsZShmaWVsZCl9fSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiZGF0YS5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlVGhlbWVGaWVsZHMoaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1pY29uLWN1c3RvbSBcIj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlciBtYXJnaW4tdG9wLXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTQgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cInVwZGF0ZURuYW1lKG5hbWUudmFsdWUsIGNyZWF0ZVRoZW1lRm9ybU11bHRpLCBpKVwiIG1heGxlbmd0aD1cIjcwXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQub3B0aW9uLCBjcmVhdGVUaGVtZUZvcm0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZWRUZXJtTGlzdHMgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzPy5uYW1lfX1cIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgKHNlbGVjdGlvbkNoYW5nZSk9XCJjaGFuZ2UoJGV2ZW50LGNyZWF0ZVRoZW1lRm9ybU11bHRpLCBpIClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICNzZWFyY2ggYXV0b2NvbXBsZXRlPVwib2ZmXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiBjbGFzcz1cImFzc2lnbmVlU2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAgIChrZXl1cCk9XCJvbktleSgkZXZlbnQpXCIgbWF0SW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRNYXN0ZXJMaXN0XCIgICAgKGJsdXIpPVwidXBkYXRlRG5hbWUob3B0aW9uPy50aXRsZSwgY3JlYXRlVGhlbWVGb3JtTXVsdGksIGkpXCIgW2Rpc2FibGVkXT1cIm9uRGlzYWJsZVRoZW1lKG9wdGlvbilcIiAgW3ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9uLnRpdGxlfX0gPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cImZpbHRlcmVkTWFzdGVyTGlzdC5sZW5ndGggPT09IDBcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIHJlc3VsdHMgZm91bmQhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncz8uYWxyZWFkeUV4aXN0fX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpbmZvLWljb24gY3Vyc29yLXBvaW50ZXJcIiBbbWF0VG9vbHRpcF09XCJ0b29sVGlwVGV4dFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwQ2xhc3M9XCJ0b29sdGlwLXNlY1wiPmluZm9fb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkbmFtZVwiIGlkPVwiZG5hbWVcIiAjZG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmllbGQgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgbmFtZSBmaWVsZC5cIiBtYXhsZW5ndGg9XCI3MFwiIFtkaXNhYmxlZF09XCJuYW1lPy52YWx1ZT8ubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZSBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQub3B0aW9uLCBjcmVhdGVUaGVtZUZvcm0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZWRUZXJtTGlzdHMgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWVycm9yICpuZ0lmPVwiaXNUZXJtRXhpc3RcIj57e2FwcF9zdHJpbmdzLmFscmVhZHlFeGlzdH19PC9tYXQtZXJyb3I+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmbmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bj1cIkZpcnN0IE5hbWUgbGFiZWx8TGFiZWwgd2hpY2ggZXhwbGFpbnMgdGhlIHVzZXIgdG8gZW50ZXIgZmlyc3QgbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1hcmlhLWxhYmVsIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1sYWJlbD5FbnRlciB7e2RhdGEubmFtZX19IG5hbWU8L21hdC1sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG1hdElucHV0IFtjZGtUZXh0YXJlYUF1dG9zaXplXSBbY2RrQXV0b3NpemVNYXhSb3dzXT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nka0F1dG9zaXplTWluUm93c109XCIzXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MuZGVzY3JpcHRpb259fVwiIG1heGxlbmd0aD1cIjIwMDBcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm1lcC5leHBhbmRlZCA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtTXVsdGk/LmdldCgndGhlbWVGaWVsZHMnKVsnY29udHJvbHMnXVtpXS5pbnZhbGlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgICAgICAgICAgPC9tYXQtYWNjb3JkaW9uPlxuICAgICAgICAgICAgICAgIDxmb290ZXIgY2xhc3M9XCJhY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJkZWZhdWx0XCIgdHlwZT1cInJlc2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkaWFsb2dDbG9zZSgnJylcIj57e2FwcF9zdHJpbmdzLmNhbmNlbH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnY3JlYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwic3VibWl0XCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNyZWF0ZVRoZW1lRm9ybT8uaW52YWxpZFwiICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIj57e2FwcF9zdHJpbmdzLmFkZF9idG59fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtTXVsdGkuaW52YWxpZCB8fCBkaXNhYmxlTXVsdGlDcmVhdGVcIiAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCIgKGNsaWNrKT1cIm11bHRpQ3JlYXRlKGNyZWF0ZVRoZW1lRm9ybU11bHRpLCBkYXRhKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXBwX3N0cmluZ3MuYWRkX2J0bn19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnZWRpdCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVUZXJtRGF0YShjcmVhdGVUaGVtZUZvcm0sIGRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtPy5pbnZhbGlkIHx8IGRpc2FibGVVcGRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIj57e2FwcF9zdHJpbmdzLnVwZGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZm9vdGVyPlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGhlbWVEZXNpZ25hdGlvbj5cbiAgICA8ZGl2IGNsYXNzPVwidGhlbURlc2lnbmF0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2dOZXdcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibW9kYWxUaXRsZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXNhdGlvblwiPk9yZ2FuaXNhdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3JnLW5hbWUgcGwtNCBmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuPkRlcGFydG1lbnQgb2YgRmlzaGVyaWVzPC9zcGFuPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tkYXRhPy5jb2x1bW5JbmZvPy5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctZGl2aWRlclwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZCBtdC00XCI+XG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJhZGQtZGVzaWduYXRpb24gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIiAoY2xpY2spPVwiYWRkRGVzaWduYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhZGQtaWNvbiBtci0yXCI+YWRkX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+QWRkIERlc2lnbmF0aW9uczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC01XCI+XG4gICAgICAgICAgICAgICAgPGZvcm0gIFtmb3JtR3JvdXBdPVwiY3JlYXRlVGhlbWVGb3JtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYWNjb3JkaW9uIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiIGZvcm1BcnJheU5hbWU9XCJkZXNpZ25hdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRlc2lnbmF0aW9uIG9mIGRlc2lnbmF0aW9uQ29udHJvbHM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCBbZm9ybUdyb3VwTmFtZV09XCJpXCIgIGNsYXNzPVwiZGVzaWduYXRpb24tcGFuZWxcIiBbZXhwYW5kZWRdPVwicGFuZWxPcGVuU3RhdGVbaV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImRlbGV0RGVzaWduYXRpb24gbXItNFwiIChjbGljayk9XCJkZWxldGVEZXNpZ25hdGlvbihpKVwiPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTIgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzaWduYXRpb24gTmFtZSA8bWF0LWljb24gY2xhc3M9XCJpbmZvLWljb25cIj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgcGxhY2Vob2xkZXI9XCJUeXBlIGhlcmVcIiBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIiAoY2hhbmdlKT1cImNsZWFyU2VsZWN0ZWREZXNpZ25haW9uT25DaGFuZ2UoaSwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiIChvcHRpb25TZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQub3B0aW9uLCBkZXNpZ25hdGlvbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZ2V0RmlsdGVyZWREZXNpZ25hdGlvbkxpc3QoaSlcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWVycm9yICpuZ0lmPVwiaXNUZXJtRXhpc3RcIj57e2FwcF9zdHJpbmdzLmFscmVhZHlFeGlzdH19PC9tYXQtZXJyb3I+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWVycm9yPnt7YXBwX3N0cmluZ3MuYWxyZWFkeUV4aXN0fX08L21hdC1lcnJvcj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA8bWF0LWljb24gY2xhc3M9XCJpbmZvLWljb25cIj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkZXNpZ25hdGlvbkRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSB0aGUgZGVjcmlwdGlvbiBpbiBmZXdlciB0aGFuIDYwMCBjaGFyYWN0ZXJzXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGp1c3RpZnktZW5kIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY2xhc3M9XCJzYXZlRGVzaWduYXRvbiBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlRGVzaWduYXRpb24oaSlcIj5TYXZlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWFjY29yZGlvbj5cbiAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kIGl0ZW1zLWNlbnRlciBnYXAtNCBtdC01IGRlc2lnbmF0aW9uLWZvb3RlclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjbGFzcz1cImNhbmNlbCBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIFtkaXNhYmxlZF09XCIhZW5hYmxlQWRkQnRuXCIgY2xhc3M9XCJhZGRCdG4gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIiAoY2xpY2spPVwic3VibWl0RGVzaWduYXRpb24oKVwiPkFkZDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2NvbXBUaGVtZT5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nTmV3XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibW9kYWxUaXRsZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGVybSBvZiBkYXRhPy5zZWxlY3RlZFBhcmVudFRlcm1zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbFwiIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e3Rlcm0uY2F0ZWdvcnl9fVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IG5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlcm0ubmFtZVwiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJjb21wZXRlbmN5Rm9ybVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtdGV4dFwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWxcIiBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuICAgICAgICAgICAgICAgIHt7J1NlbGVjdCBBcmVhJ319XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTVcIj5cbiAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgYXJpYS1sYWJlbD1cIlNlbGVjdCBhbiBvcHRpb25cIiBmb3JtQ29udHJvbE5hbWU9XCJjb21wQXJlYVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIGNsYXNzPVwibGVhcm5pbmctc2VjdGlvblwiICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhbGxDb21wZXRlbmN5XCIgW3ZhbHVlXT1cIml0ZW1cIiAoY2hhbmdlKT1cIm9uU2VsZWN0aW9uQXJlYShpdGVtKVwiPnt7aXRlbS5uYW1lfX08L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlICE9PSAnbXVsdGktY3JlYXRlJ1wiPlxuICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJ0aGVtZUZvcm1cIiBbZm9ybUdyb3VwXT1cImNyZWF0ZVRoZW1lRm9ybVwiIG5vdmFsaWRhdGVcbiAgICAgICAgICAgICAgICAobmdTdWJtaXQpPVwiZGlzYWJsZUNyZWF0ZT91cGRhdGVUZXJtQXNzb2NpYXRpb25zKCk6c2F2ZVRoZW1lVGVybSgpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlciBtYXJnaW4tdG9wLXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00IFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwidXBkYXRlRG5hbWUobmFtZS52YWx1ZSwgY3JlYXRlVGhlbWVGb3JtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50Lm9wdGlvbiwgY3JlYXRlVGhlbWVGb3JtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVkVGVybUxpc3RzIHwgYXN5bmNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uLm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNUZXJtRXhpc3RcIj57e2FwcF9zdHJpbmdzLmFscmVhZHlFeGlzdH19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSBOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZG5hbWVcIiBpZD1cImRuYW1lXCIgI2RuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDb21wZXRlbmN5IGRpc3BsYXkgbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQub3B0aW9uLCBjcmVhdGVUaGVtZUZvcm0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZWRUZXJtTGlzdHMgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmbmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG49XCJGaXJzdCBOYW1lIGxhYmVsfExhYmVsIHdoaWNoIGV4cGxhaW5zIHRoZSB1c2VyIHRvIGVudGVyIGZpcnN0IG5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuLWFyaWEtbGFiZWwgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1sYWJlbD5FbnRlciB7e2RhdGEubmFtZX19IG5hbWU8L21hdC1sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBbY2RrVGV4dGFyZWFBdXRvc2l6ZV0gW2Nka0F1dG9zaXplTWF4Um93c109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2RrQXV0b3NpemVNaW5Sb3dzXT1cIjNcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MuZGVzY3JpcHRpb259fVwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8Zm9vdGVyIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwiZGVmYXVsdFwiIHR5cGU9XCJyZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGlhbG9nQ2xvc2UoJycpXCI+e3thcHBfc3RyaW5ncy5jYW5jZWx9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2NyZWF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjcmVhdGVUaGVtZUZvcm0/LmludmFsaWRcIiAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy5jcmVhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdlZGl0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVRlcm1EYXRhKGNyZWF0ZVRoZW1lRm9ybSwgZGF0YSlcIiBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy51cGRhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Zvb3Rlcj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiPlxuICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWVuZCBtYi00XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWF0LWJ1dHRvbiBmbGV4IGl0ZW1zLWNlbnRlciBcIiAqbmdJZj1cImRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIiAoY2xpY2spPVwiYWRkQ29tcGV0ZW5jeVRoZW1lKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1yLTIgbWF0LWljb24tY3VzdG9tIFwiPmFkZF9jaXJjbGVfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICBBZGQge3tkYXRhLmNvbHVtbkluZm8ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxtYXQtYWNjb3JkaW9uIGZvcm1BcnJheU5hbWU9XCJjb21wVGhlbWVGaWVsZHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGNvbXBldGVuY3lGb3JtPy5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpWydjb250cm9scyddOyBsZXQgaSA9IGluZGV4OyBsZXQgaXNGaXJzdCA9IGZpcnN0XCIgXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWFyZ2luLWJvdHRvbS1sXCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIFtleHBhbmRlZF09XCJpc0ZpcnN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB7e25hbWU/LnZhbHVlfX0gIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXBhbmVsLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJkYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDb21wRmllbGRzKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1jdXN0b20gXCI+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXIgbWFyZ2luLXRvcC1zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00IFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IENvbXBldGVuY3kgVGhlbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwiQ2hvb3NlIHRoZSBDb21wZXRlbmN5IFRoZW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGV0ZW5jeVRoZW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCAjc2VhcmNoIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgY2xhc3M9XCJhc3NpZ25lZVNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiICBmb3JtQ29udHJvbE5hbWU9XCJhc3NpZ25lZVRleHRcIiBtYXRJbnB1dD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkYWxsQ29tcGV0ZW5jeVRoZW1lXCIgW3ZhbHVlXT1cIm9wdGlvblwiIChvblNlbGVjdGlvbkNoYW5nZSk9XCJPblRoZW1lU2VsZWN0aW9uKCRldmVudClcIiAgPnt7b3B0aW9uLm5hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQub3B0aW9uLCBjcmVhdGVUaGVtZUZvcm0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZWRUZXJtTGlzdHMgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNUZXJtRXhpc3RcIj57e2FwcF9zdHJpbmdzLmFscmVhZHlFeGlzdH19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSBOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZG5hbWVcIiBpZD1cImRuYW1lXCIgI2RuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNvbXBldGVuY3kgZGlzcGxheSBuYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmbmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bj1cIkZpcnN0IE5hbWUgbGFiZWx8TGFiZWwgd2hpY2ggZXhwbGFpbnMgdGhlIHVzZXIgdG8gZW50ZXIgZmlyc3QgbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1hcmlhLWxhYmVsIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IENvbXBldGVuY3kgU3ViLVRoZW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtbGFiZWw+RW50ZXIge3tkYXRhLm5hbWV9fSBuYW1lPC9tYXQtbGFiZWw+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwiQ2hvb3NlIHRoZSBDb21wZXRlbmN5IFRoZW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGV0ZW5jeVN1YlRoZW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0ICNzZWFyY2ggYXV0b2NvbXBsZXRlPVwib2ZmXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiBjbGFzcz1cImFzc2lnbmVlU2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAgZm9ybUNvbnRyb2xOYW1lPVwiYXNzaWduZWVUZXh0XCIgbWF0SW5wdXQ+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkYWxsQ29tcGV0ZW5jeVN1YlRoZW1lXCIgW3ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9uLm5hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgICAgICAgICAgPC9tYXQtYWNjb3JkaW9uPlxuICAgICAgICAgICAgICAgIDxmb290ZXIgY2xhc3M9XCJhY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJkZWZhdWx0XCIgdHlwZT1cInJlc2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkaWFsb2dDbG9zZSgnJylcIj57e2FwcF9zdHJpbmdzLmNhbmNlbH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnY3JlYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwic3VibWl0XCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNyZWF0ZVRoZW1lRm9ybT8uaW52YWxpZFwiICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIj57e2FwcF9zdHJpbmdzLmNyZWF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjcmVhdGVUaGVtZUZvcm1NdWx0aS5pbnZhbGlkXCIgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiIChjbGljayk9XCJtdWx0aUNyZWF0ZShjcmVhdGVUaGVtZUZvcm1NdWx0aSwgZGF0YSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FwcF9zdHJpbmdzLmNyZWF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnZWRpdCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVUZXJtRGF0YShjcmVhdGVUaGVtZUZvcm0sIGRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtPy5pbnZhbGlkIHx8IGRpc2FibGVVcGRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIj57e2FwcF9zdHJpbmdzLnVwZGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZm9vdGVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZm9ybT5cbiAgICAgICAgXG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPiJdfQ==
|