ngx-material-entity 18.1.0 → 18.2.1
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/README.md +10 -13
- package/components/create-page/create-page.component.d.ts +3 -0
- package/components/edit-page/edit-page.component.d.ts +3 -0
- package/components/input/file/file-default-input/file-default-input.component.d.ts +1 -1
- package/components/input/file/file-image-input/file-image-input.component.d.ts +3 -0
- package/components/input/file/file-input/file-input.component.d.ts +8 -2
- package/components/input/input.component.d.ts +2 -0
- package/components/input/number/number-dropdown-input/number-dropdown-input.component.d.ts +2 -0
- package/components/input/relations/references-many-input/references-many-input.component.d.ts +2 -0
- package/components/input/string/string-dropdown-input/string-dropdown-input.component.d.ts +2 -0
- package/components/input/string/string-password-input/string-password-input.component.d.ts +3 -0
- package/components/tooltip/tooltip.component.d.ts +2 -0
- package/decorators/array/array-decorator-internal.data.d.ts +3 -2
- package/decorators/array/array-decorator.data.d.ts +7 -6
- package/decorators/base/property-decorator.data.d.ts +2 -2
- package/decorators/file/file-decorator-internal.data.d.ts +3 -2
- package/decorators/file/file-decorator.data.d.ts +4 -3
- package/esm2022/components/confirm-dialog/confirm-dialog.component.mjs +4 -4
- package/esm2022/components/create-page/create-page.component.mjs +18 -8
- package/esm2022/components/custom-table/custom-table.component.mjs +4 -4
- package/esm2022/components/edit-page/edit-page.component.mjs +18 -8
- package/esm2022/components/form/form.component.mjs +5 -5
- package/esm2022/components/input/array/array-date-input/array-date-input.component.mjs +5 -5
- package/esm2022/components/input/array/array-date-range-input/array-date-range-input.component.mjs +3 -3
- package/esm2022/components/input/array/array-date-time-input/array-date-time-input.component.mjs +3 -3
- package/esm2022/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +8 -6
- package/esm2022/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +8 -6
- package/esm2022/components/input/array/array-table.class.mjs +3 -3
- package/esm2022/components/input/base-input.component.mjs +3 -3
- package/esm2022/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.mjs +4 -4
- package/esm2022/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.mjs +3 -3
- package/esm2022/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.mjs +4 -4
- package/esm2022/components/input/custom/custom.component.mjs +3 -3
- package/esm2022/components/input/date/date-input/date-input.component.mjs +3 -3
- package/esm2022/components/input/date/date-range-input/date-range-input.component.mjs +3 -3
- package/esm2022/components/input/date/date-time-input/date-time-input.component.mjs +3 -3
- package/esm2022/components/input/file/file-default-input/file-default-input.component.mjs +5 -5
- package/esm2022/components/input/file/file-image-input/file-image-input.component.mjs +9 -5
- package/esm2022/components/input/file/file-input/file-input.component.mjs +25 -12
- package/esm2022/components/input/input.component.mjs +23 -12
- package/esm2022/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +10 -6
- package/esm2022/components/input/number/number-input/number-input.component.mjs +3 -3
- package/esm2022/components/input/number/number-slider-input/number-slider-input.component.mjs +4 -4
- package/esm2022/components/input/relations/references-many-input/references-many-input.component.mjs +10 -6
- package/esm2022/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +3 -3
- package/esm2022/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +10 -6
- package/esm2022/components/input/string/string-input/string-input.component.mjs +3 -3
- package/esm2022/components/input/string/string-password-input/string-password-input.component.mjs +11 -6
- package/esm2022/components/input/string/string-textbox-input/string-textbox-input.component.mjs +3 -3
- package/esm2022/components/table/create-dialog/create-entity-dialog.component.mjs +9 -6
- package/esm2022/components/table/display-column-value/base-display-column-value.component.mjs +3 -3
- package/esm2022/components/table/display-column-value/display-column-value.component.mjs +3 -3
- package/esm2022/components/table/edit-dialog/edit-data.builder.mjs +1 -1
- package/esm2022/components/table/edit-dialog/edit-entity-dialog.component.mjs +9 -7
- package/esm2022/components/table/table-data.builder.mjs +3 -1
- package/esm2022/components/table/table-data.mjs +1 -1
- package/esm2022/components/table/table.component.mjs +5 -11
- package/esm2022/components/tooltip/tooltip.component.mjs +9 -5
- package/esm2022/decorators/array/array-decorator-internal.data.mjs +5 -3
- package/esm2022/decorators/array/array-decorator.data.mjs +1 -1
- package/esm2022/decorators/array/array.decorator.mjs +15 -8
- package/esm2022/decorators/base/property-decorator.data.mjs +2 -2
- package/esm2022/decorators/file/file-decorator-internal.data.mjs +4 -3
- package/esm2022/decorators/file/file-decorator.data.mjs +3 -3
- package/esm2022/decorators/file/file.decorator.mjs +7 -4
- package/esm2022/decorators/number/number.decorator.mjs +7 -4
- package/esm2022/decorators/object/object.decorator.mjs +5 -3
- package/esm2022/decorators/string/string-decorator-internal.data.mjs +2 -1
- package/esm2022/decorators/string/string.decorator.mjs +11 -6
- package/esm2022/directives/drag-drop.directive.mjs +3 -3
- package/esm2022/directives/dynamic-style-class.directive.mjs +3 -3
- package/esm2022/directives/included-in.directive.mjs +3 -3
- package/esm2022/directives/number.directive.mjs +3 -3
- package/esm2022/directives/password-match.directive.mjs +3 -3
- package/esm2022/directives/tooltip.directive.mjs +3 -3
- package/esm2022/functions/dropdown-values-to-function.function.mjs +2 -1
- package/esm2022/functions/table-column-value-to-sort-value.function.mjs +9 -5
- package/esm2022/utilities/date.utilities.mjs +1 -1
- package/esm2022/utilities/entity.utilities.mjs +36 -21
- package/esm2022/utilities/file.utilities.mjs +7 -4
- package/esm2022/utilities/validation.utilities.mjs +41 -21
- package/fesm2022/ngx-material-entity.mjs +367 -254
- package/fesm2022/ngx-material-entity.mjs.map +1 -1
- package/package.json +4 -2
- package/utilities/entity.utilities.d.ts +4 -4
|
@@ -17,6 +17,8 @@ import { MatSort, MatSortModule } from '@angular/material/sort';
|
|
|
17
17
|
import { MatTableDataSource, MatTableModule } from '@angular/material/table';
|
|
18
18
|
import { MatTabsModule } from '@angular/material/tabs';
|
|
19
19
|
import { Router } from '@angular/router';
|
|
20
|
+
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
|
|
21
|
+
import { faSearch } from '@fortawesome/free-solid-svg-icons';
|
|
20
22
|
import { firstValueFrom } from 'rxjs';
|
|
21
23
|
import { ArrayDateInputComponent } from './array/array-date-input/array-date-input.component';
|
|
22
24
|
import { ArrayDateRangeInputComponent } from './array/array-date-range-input/array-date-range-input.component';
|
|
@@ -99,6 +101,8 @@ export class NgxMatEntityInputComponent {
|
|
|
99
101
|
defaultGetValidationErrorMessage;
|
|
100
102
|
globalConfig;
|
|
101
103
|
http;
|
|
104
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
105
|
+
faSearch = faSearch;
|
|
102
106
|
/**
|
|
103
107
|
* The entity on which the property exists. Used in conjunction with the "propertyKey"
|
|
104
108
|
* to determine the property for which the input should be generated.
|
|
@@ -455,23 +459,29 @@ export class NgxMatEntityInputComponent {
|
|
|
455
459
|
}
|
|
456
460
|
this.metadata = foundMetadata;
|
|
457
461
|
switch (this.type) {
|
|
458
|
-
case DecoratorTypes.OBJECT_DROPDOWN:
|
|
462
|
+
case DecoratorTypes.OBJECT_DROPDOWN: {
|
|
459
463
|
void this.initDropdownObjectInput();
|
|
460
464
|
break;
|
|
461
|
-
|
|
465
|
+
}
|
|
466
|
+
case DecoratorTypes.OBJECT: {
|
|
462
467
|
this.initObjectInput();
|
|
463
468
|
break;
|
|
464
|
-
|
|
469
|
+
}
|
|
470
|
+
case DecoratorTypes.ARRAY: {
|
|
465
471
|
this.initEntityArray();
|
|
466
472
|
break;
|
|
467
|
-
|
|
473
|
+
}
|
|
474
|
+
case DecoratorTypes.HAS_MANY: {
|
|
468
475
|
this.initHasMany();
|
|
469
476
|
break;
|
|
470
|
-
|
|
477
|
+
}
|
|
478
|
+
case DecoratorTypes.REFERENCES_ONE: {
|
|
471
479
|
void this.initReferencesOne();
|
|
472
480
|
break;
|
|
473
|
-
|
|
481
|
+
}
|
|
482
|
+
default: {
|
|
474
483
|
break;
|
|
484
|
+
}
|
|
475
485
|
}
|
|
476
486
|
}
|
|
477
487
|
async initReferencesOne() {
|
|
@@ -1204,10 +1214,10 @@ export class NgxMatEntityInputComponent {
|
|
|
1204
1214
|
SelectionUtilities.remove(this.entityArrayTableContext.$implicit.selection, this.entity[this.propertyKey], this.entityArrayTableContext.$implicit.dataSource);
|
|
1205
1215
|
this.emitChange();
|
|
1206
1216
|
}
|
|
1207
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.
|
|
1208
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: NgxMatEntityInputComponent, isStandalone: true, selector: "ngx-mat-entity-input", inputs: { entity: "entity", propertyKey: "propertyKey", getValidationErrorMessage: "getValidationErrorMessage", hideOmitForCreate: "hideOmitForCreate", hideOmitForEdit: "hideOmitForEdit", validEmpty: "validEmpty", isReadOnly: "isReadOnly" }, outputs: { inputChangeEvent: "inputChangeEvent" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "addArrayItemDialog", first: true, predicate: ["addArrayItemDialog"], descendants: true }, { propertyName: "editArrayItemDialog", first: true, predicate: ["editArrayItemDialog"], descendants: true }, { propertyName: "createHasManyDialog", first: true, predicate: ["createHasManyDialog"], descendants: true }, { propertyName: "editHasManyDialog", first: true, predicate: ["editHasManyDialog"], descendants: true }], ngImport: i0, template: "<!-- eslint-disable angular/no-call-expression -->\n \n@if(!(hideOmitForCreate && metadata.omitForCreate) && !(hideOmitForEdit && metadata.omitForUpdate)) {\n @switch (type) {\n <!-------------------------------------------->\n <!-----------------Strings-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.STRING) {\n <string-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-input>\n }\n @case (DecoratorTypes.STRING_TEXTBOX) {\n <string-textbox-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-textbox-input>\n }\n @case (DecoratorTypes.STRING_AUTOCOMPLETE) {\n <string-autocomplete-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-autocomplete-input>\n }\n @case (DecoratorTypes.STRING_DROPDOWN) {\n <string-dropdown-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-dropdown-input>\n }\n @case (DecoratorTypes.STRING_PASSWORD) {\n <string-password-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-password-input>\n }\n <!-------------------------------------------->\n <!-----------------Booleans------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.BOOLEAN_CHECKBOX) {\n <boolean-checkbox-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </boolean-checkbox-input>\n }\n @case (DecoratorTypes.BOOLEAN_TOGGLE) {\n <boolean-toggle-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </boolean-toggle-input>\n }\n @case (DecoratorTypes.BOOLEAN_DROPDOWN) {\n <boolean-dropdown-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </boolean-dropdown-input>\n }\n <!-------------------------------------------->\n <!------------------Numbers------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.NUMBER) {\n <number-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </number-input>\n }\n @case (DecoratorTypes.NUMBER_DROPDOWN) {\n <number-dropdown-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </number-dropdown-input>\n }\n @case (DecoratorTypes.NUMBER_SLIDER) {\n <number-slider-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </number-slider-input>\n }\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.ARRAY_DATE) {\n <array-date-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-date-input>\n }\n @case (DecoratorTypes.ARRAY_DATE_TIME) {\n <array-date-time-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-date-time-input>\n }\n @case (DecoratorTypes.ARRAY_DATE_RANGE) {\n <array-date-range-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-date-range-input>\n }\n @case (DecoratorTypes.ARRAY_STRING_CHIPS) {\n <array-string-chips-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-string-chips-input>\n }\n @case (DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS) {\n <array-string-autocomplete-chips\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-string-autocomplete-chips>\n }\n <!-------------------------------------------->\n <!-------------------Dates-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.DATE) {\n <date-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </date-input>\n }\n @case (DecoratorTypes.DATE_RANGE) {\n <date-range-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </date-range-input>\n }\n @case (DecoratorTypes.DATE_TIME) {\n <date-time-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </date-time-input>\n }\n <!-------------------------------------------->\n <!-------------------Files-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.FILE_DEFAULT) {\n <file-default-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </file-default-input>\n }\n @case (DecoratorTypes.FILE_IMAGE) {\n <file-image-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </file-image-input>\n }\n <!-------------------------------------------->\n <!-------------- references many ------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.REFERENCES_MANY) {\n <references-many-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </references-many-input>\n }\n <!-------------------------------------------->\n <!-------------------Custom------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.CUSTOM) {\n <custom-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </custom-input>\n }\n <!-------------------------------------------->\n <!-------------------Object------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.OBJECT) {\n <b>{{metadataDefaultObject.displayName}}</b>\n <!-- iterates over the object properties -->\n <ng-container *ngTemplateOutlet=\"form; context: objectFormContext\"></ng-container>\n }\n <!-------------------------------------------->\n <!---------------Object Dropdown-------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.OBJECT_DROPDOWN) {\n <mat-form-field class=\"object-dropdown\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select #model=\"ngModel\"\n [name]=\"objectDropdownName\"\n [required]=\"metadata.required(entity)\"\n [disabled]=\"internalIsReadOnly\"\n [compareWith]=\"compareObjectsBound\"\n [(ngModel)]=\"entity[propertyKey]\"\n (selectionChange)=\"emitChange()\"\n (opened)=\"selectSearchInput.focus()\"\n >\n <mat-form-field class=\"select-search-input\">\n <!-- eslint-disable-next-line angular/no-any -->\n <input #selectSearchInput matInput (keyup)=\"filterObjectDropdownValues($any($event.target).value)\">\n <i matSuffix class=\"fas fa-search\"></i>\n </mat-form-field>\n @if (!metadata.required(entity)) {\n <mat-option>-</mat-option>\n }\n @if (shouldDisplayCurrentObjectDropdownValue) {\n <mat-option [value]=\"currentObjectDropdownValue?.value\">{{currentObjectDropdownValue?.displayName}}</mat-option>\n }\n @for (value of filteredObjectDropdownValues; track $index) {\n <mat-option [value]=\"value.value\">{{value.displayName}}</mat-option>\n }\n </mat-select>\n <mat-error>{{internalGetValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n }\n <!-------------------------------------------->\n <!-------------- references one -------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.REFERENCES_ONE) {\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select #inputModel=\"ngModel\"\n [name]=\"referencesOneName\"\n [disabled]=\"internalIsReadOnly\"\n [required]=\"metadata.required(entity)\"\n [(ngModel)]=\"entity[propertyKey]\"\n (selectionChange)=\"setReferencesOneObject()\"\n (opened)=\"selectSearchInput.focus()\"\n >\n <mat-form-field class=\"select-search-input\">\n <!-- eslint-disable-next-line angular/no-any -->\n <input #selectSearchInput matInput (keyup)=\"filterReferencesOneValues($any($event.target).value)\">\n <i matSuffix class=\"fas fa-search\"></i>\n </mat-form-field>\n @if (!metadata.required(entity)) {\n <mat-option>-</mat-option>\n }\n @if (shouldDisplayCurrentReferencesOneDropdownValue) {\n <mat-option [value]=\"currentReferencesOneDropdownValue?.value\">{{currentReferencesOneDropdownValue?.displayName}}</mat-option>\n }\n @for (value of filteredReferencesOneDropdownValues; track $index) {\n <mat-option [value]=\"value.value\">{{value.displayName}}</mat-option>\n }\n </mat-select>\n <mat-error>{{internalGetValidationErrorMessage(inputModel)}}</mat-error>\n </mat-form-field>\n <!-- iterates over the references one properties -->\n @if (referencesOneFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: referencesOneFormContext\"></ng-container>\n }\n }\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.ARRAY) {\n <div class=\"entityArray\">\n <div class=\"mat-elevation-z8 elevation-container\">\n <div class=\"array-headline\">\n <b>{{metadataEntityArray.displayName}}</b>\n </div>\n @if (metadataEntityArray.createInline && !internalIsReadOnly && addArrayItemFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: addArrayItemFormContext\"></ng-container>\n }\n @if (!internalIsReadOnly && entityArrayTableContext) {\n <div class=\"buttons\">\n <button type=\"button\" mat-raised-button\n [disabled]=\"metadataEntityArray.createInline && !isArrayItemValid\"\n (click)=\"addEntity()\">\n {{metadataEntityArray.addButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button\n [disabled]=\"!entityArrayTableContext.$implicit.selection.selected.length\"\n (click)=\"removeFromEntityArray()\">\n {{metadataEntityArray.removeButtonLabel}}\n </button>\n </div>\n }\n @if (entityArrayTableContext) {\n <ng-container *ngTemplateOutlet=\"table; context: entityArrayTableContext\"></ng-container>\n }\n </div>\n </div>\n }\n <!-------------------------------------------->\n <!------------------ has many ---------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.HAS_MANY) {\n <div class=\"hasMany\">\n <h2 class=\"title\">{{metadataHasMany.tableData.baseData.title}}</h2>\n <div class=\"row\">\n <mat-form-field class=\"col-lg-8 col-md-6 col-sm-12\">\n <mat-label>{{metadataHasMany.tableData.baseData.searchLabel}}</mat-label>\n <input matInput (keyup)=\"applyHasManyFilter($event)\">\n </mat-form-field>\n @if (metadataHasMany.tableData.baseData.tableActions.length) {\n <div\n [class.col-lg-2]=\"hasManyAllowCreate\"\n [class.col-lg-4]=\"!hasManyAllowCreate\"\n [class.col-md-3]=\"hasManyAllowCreate\"\n [class.col-md-6]=\"!hasManyAllowCreate\"\n [class.col-sm-6]=\"hasManyAllowCreate\"\n [class.col-sm-12]=\"!hasManyAllowCreate\"\n >\n <button type=\"button\" class=\"actions-button\" mat-raised-button [matMenuTriggerFor]=\"menu\">\n {{metadataHasMany.tableData.baseData.tableActionsLabel}}\n </button>\n </div>\n }\n <mat-menu #menu=\"matMenu\">\n @if (metadataHasMany.tableData.baseData.allowJsonImport) {\n <button type=\"button\" mat-menu-item [disabled]=\"hasManyTableActionDisabled(hasManyImportAction)\" (click)=\"runHasManyTableAction(hasManyImportAction)\">\n {{hasManyImportAction.displayName}}\n </button>\n }\n @for (action of metadataHasMany.tableData.baseData.tableActions; track $index) {\n <button type=\"button\" mat-menu-item [disabled]=\"hasManyTableActionDisabled(action)\" (click)=\"runHasManyTableAction(action)\">\n {{action.displayName}}\n </button>\n }\n </mat-menu>\n @if (hasManyAllowCreate) {\n <div\n [class.col-lg-2]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-lg-4]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-md-3]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-md-6]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-sm-6]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-sm-12]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n >\n <button type=\"button\" class=\"create-button\" mat-raised-button (click)=\"createHasManyEntity()\">\n {{metadataHasMany.tableData.baseData.createButtonLabel}}\n </button>\n </div>\n }\n </div>\n \n <div class=\"mat-elevation-z8 elevation-container\">\n @if (hasManyTableContext) {\n <ng-container *ngTemplateOutlet=\"table; context: hasManyTableContext\"></ng-container>\n }\n </div>\n </div>\n }\n \n @default {\n <div>ERROR: The type {{type}} is not known.</div>\n }\n }\n}\n\n\n<ng-template #table let-context>\n <mat-table matSort [dataSource]=\"context.dataSource\" [class.table-with-error-slot]=\"context.shouldShowMissingError\">\n <!-- select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox [checked]=\"context.selection.hasValue() && SelectionUtilities.isAllSelected(context.selection, context.dataSource)\"\n [indeterminate]=\"context.selection.hasValue() && !SelectionUtilities.isAllSelected(context.selection, context.dataSource)\"\n (change)=\"$event ? SelectionUtilities.masterToggle(context.selection, context.dataSource) : null\">\n </mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let value\" [dynamicStyleClasses]=\"context.dynamicRowStyleClasses\" [value]=\"value\">\n <mat-checkbox [checked]=\"context.selection.isSelected(value)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? context.selection.toggle(value) : null\">\n </mat-checkbox>\n </mat-cell>\n </ng-container>\n\n @for (dCol of context.displayColumns; track $index) {\n <ng-container [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell *matCellDef=\"let value\" [class.enabled]=\"!dCol.disableClick && context.allowClick(value)\"\n [dynamicStyleClasses]=\"context.dynamicRowStyleClasses\" [value]=\"value\"\n (click)=\"clickCell(value, dCol, context)\"\n >\n @if (dCol.Component) {\n <display-column-value [entity]=\"value\" [ComponentClass]=\"dCol.Component\"></display-column-value>\n }\n @else {\n {{getDisplayColumnValue(value, dCol)}}\n }\n </mat-cell>\n </ng-container>\n }\n\n <mat-header-row *matHeaderRowDef=\"context.displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: context.displayedColumns\"></mat-row>\n </mat-table>\n\n @if (context.displayLoadingSpinner && context.isLoading) {\n <mat-spinner>\n </mat-spinner>\n }\n @else if (context.shouldShowMissingError && !context.dataSource.data.length) {\n <div class=\"table-error\">{{context.emptyErrorMessage}}</div>\n }\n\n <mat-paginator [length]=\"context.dataSource.filteredData.length\" [pageIndex]=\"0\" [pageSize]=\"10\" [pageSizeOptions]=\"[5, 10, 25, 50]\"></mat-paginator>\n</ng-template>\n\n<!--------------------------------------------------------->\n<!---------------------------Form-------------------------->\n<!--------------------------------------------------------->\n<ng-template #form let-context>\n <!-- eslint-disable angular/no-call-expression -->\n @if (context.tabs.length > 1) {\n <mat-tab-group preserveContent>\n @for (tab of context.tabs; track $index) {\n <mat-tab [label]=\"tab.tabName\">\n @for (row of tab.rows; track $index) {\n <div class=\"row\">\n @for (key of row.keys; track key) {\n <ngx-mat-entity-input\n [entity]=\"context.entity\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [validEmpty]=\"context.validEmpty?.()\"\n [isReadOnly]=\"context.isReadOnly?.(context.entity, key)\"\n [class]=\"EntityUtilities.getWidthClasses(context.entity, key)\"\n [hideOmitForEdit]=\"context.hideOmitForEdit\"\n [hideOmitForCreate]=\"context.hideOmitForCreate\"\n (inputChangeEvent)=\"context.inputChangeEvent()\"\n >\n </ngx-mat-entity-input>\n }\n </div>\n }\n </mat-tab>\n }\n </mat-tab-group>\n }\n @else {\n @if (!context.tabs.length) {\n <span class=\"no-entity-tabs\">\n ERROR: No Inputs. Did you correctly assign all values in the model constructor?\n </span>\n }\n @else {\n @for (row of context.tabs[0].rows; track $index) {\n <div class=\"row\">\n @for (key of row.keys; track key) {\n <ngx-mat-entity-input\n [entity]=\"context.entity\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [validEmpty]=\"context.validEmpty?.()\"\n [isReadOnly]=\"context.isReadOnly?.(context.entity, key)\"\n [class]=\"EntityUtilities.getWidthClasses(context.entity, key)\"\n [hideOmitForEdit]=\"context.hideOmitForEdit\"\n [hideOmitForCreate]=\"context.hideOmitForCreate\"\n (inputChangeEvent)=\"context.inputChangeEvent()\"\n >\n </ngx-mat-entity-input>\n }\n </div>\n }\n }\n }\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Add Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #addArrayItemDialog>\n <div class=\"mat-dialog-title\">\n <div>{{addArrayItemDialogData.title}}</div>\n </div>\n\n <form>\n <mat-dialog-content>\n @if (addArrayItemFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: addArrayItemFormContext\"></ng-container>\n }\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <div class=\"d-flex align-items-center gap-3\" style=\"margin-top: 10px;\">\n <button type=\"submit\" mat-raised-button matBadgeColor=\"warn\"\n [disabled]=\"!isArrayItemValid\"\n [matBadge]=\"arrayItemValidationErrors.length\"\n [matBadgeHidden]=\"!arrayItemValidationErrors.length\"\n (click)=\"addArrayItem()\"\n >\n {{addArrayItemDialogData.createButtonLabel}}\n </button>\n @if (arrayItemValidationErrors.length) {\n <ngx-mat-entity-tooltip [tooltipContent]=\"arrayItemTooltipContent\"></ngx-mat-entity-tooltip>\n }\n </div>\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"closeAddArrayItemDialog()\">\n {{addArrayItemDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Edit Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #editArrayItemDialog>\n <div class=\"mat-dialog-title\">\n <div>{{editArrayItemDialogData.title(arrayItemPriorChanges)}}</div>\n </div>\n \n <form>\n <mat-dialog-content>\n @if (editArrayItemFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: editArrayItemFormContext\"></ng-container>\n }\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <div class=\"d-flex align-items-center gap-3\" style=\"margin-top: 10px;\">\n <button type=\"submit\" mat-raised-button matBadgeColor=\"warn\"\n [class.badge-changes]=\"!arrayItemValidationErrors.length\"\n [disabled]=\"internalIsReadOnly || !isArrayItemValid || !isArrayItemDirty\"\n [matBadge]=\"arrayItemValidationErrors.length > 0 ? arrayItemValidationErrors.length : arrayItemChanges.length\"\n [matBadgeHidden]=\"!arrayItemValidationErrors.length && !arrayItemChanges.length\"\n (click)=\"saveArrayItem()\"\n >\n {{editArrayItemDialogData.confirmButtonLabel}}\n </button>\n @if (arrayItemValidationErrors.length || arrayItemChanges.length) {\n <ngx-mat-entity-tooltip [tooltipContent]=\"arrayItemTooltipContent\"></ngx-mat-entity-tooltip>\n }\n </div>\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"closeEditArrayItemDialog()\">\n {{editArrayItemDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Create Has Many Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #createHasManyDialog>\n <div class=\"mat-dialog-title\">\n <div>{{metadataHasMany.tableData.createData.title}}</div>\n </div>\n \n <form>\n <mat-dialog-content>\n @if (hasManyCreateFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: hasManyCreateFormContext\"></ng-container>\n }\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <div class=\"d-flex align-items-center gap-3\" style=\"margin-top: 10px;\">\n <button type=\"submit\" mat-raised-button matBadgeColor=\"warn\"\n [disabled]=\"!isHasManyEntityValid\"\n [matBadge]=\"hasManyValidationErrors.length\"\n [matBadgeHidden]=\"!hasManyValidationErrors.length\"\n (click)=\"dialogCreateHasMany()\"\n >\n {{metadataHasMany.tableData.createData.createButtonLabel}}\n </button>\n @if (hasManyValidationErrors.length) {\n <ngx-mat-entity-tooltip [tooltipContent]=\"hasManyTooltipContent\"></ngx-mat-entity-tooltip>\n }\n </div>\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"dialogCancelCreateHasMany()\">\n {{metadataHasMany.tableData.createData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n \n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Edit Has Many Dialog----------------->\n<!--------------------------------------------------------->\n<ng-template #editHasManyDialog>\n <div class=\"mat-dialog-title\">\n <div>{{metadataHasMany.tableData.editData.title(hasManyEntityPriorChanges)}}</div>\n\n <div class=\"actions-container\">\n @if (metadataHasMany.tableData.editData.actions.length) {\n <button type=\"button\" mat-raised-button [matMenuTriggerFor]=\"menu\">\n {{metadataHasMany.tableData.editData.actionsLabel}}\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (action of metadataHasMany.tableData.editData.actions; track $index) {\n <button type=\"button\" mat-menu-item [disabled]=\"hasManyEditActionDisabled(action)\" (click)=\"hasManyRunEditAction(action)\">\n {{action.displayName}}\n </button>\n }\n </mat-menu>\n \n @if (hasManyAllowDelete(hasManyEntity)) {\n <button type=\"button\" mat-raised-button color=\"warn\" class=\"delete-button\" tabindex=\"-1\" (click)=\"deleteHasManyEntity()\">\n {{metadataHasMany.tableData.editData.deleteButtonLabel}}\n </button>\n }\n </div>\n </div>\n \n <form>\n <mat-dialog-content>\n @if (hasManyEditFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: hasManyEditFormContext\"></ng-container>\n }\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <div class=\"d-flex align-items-center gap-3\" style=\"margin-top: 10px;\">\n <button type=\"submit\" mat-raised-button matBadgeColor=\"warn\"\n [class.badge-changes]=\"!hasManyValidationErrors.length\"\n [disabled]=\"internalIsReadOnly || !isHasManyEntityValid || !isHasManyEntityDirty\"\n [matBadge]=\"hasManyValidationErrors.length > 0 ? hasManyValidationErrors.length : hasManyChanges.length\"\n [matBadgeHidden]=\"!hasManyValidationErrors.length && !hasManyChanges.length\"\n (click)=\"dialogEditHasMany()\"\n >\n {{metadataHasMany.tableData.editData.confirmButtonLabel}}\n </button>\n @if (hasManyValidationErrors.length || hasManyChanges.length) {\n <ngx-mat-entity-tooltip [tooltipContent]=\"hasManyTooltipContent\"></ngx-mat-entity-tooltip>\n }\n </div>\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"dialogCancelEditHasMany()\">\n {{metadataHasMany.tableData.editData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n</ng-template>", styles: ["::ng-deep mat-tab-body{padding-top:10px;padding-left:12px;padding-right:12px}::ng-deep mat-tab-body .mat-mdc-tab-body-content{overflow:initial}::ng-deep .mat-mdc-tab-body-wrapper{margin-left:-12px;margin-right:-12px}::ng-deep .mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-right:16px}::ng-deep .select-search-input{width:100%;margin-top:-8px;margin-bottom:8px}::ng-deep .select-search-input .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .mat-mdc-form-field.mat-form-field-disabled label{color:#0009}::ng-deep .mat-mdc-form-field.mat-form-field-disabled input,::ng-deep .mat-mdc-form-field.mat-form-field-disabled textarea,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-disabled,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-value{color:#000!important}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:not(:checked):not(:indeterminate):not([data-indeterminate=true])~.mdc-checkbox__background{border-color:#707070}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:checked~.mdc-checkbox__background,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:indeterminate~.mdc-checkbox__background,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[data-indeterminate=true][disabled]~.mdc-checkbox__background{background-color:#000}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-chip.mat-mdc-standard-chip.mat-mdc-chip-disabled{opacity:1}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-chip.mat-mdc-standard-chip.mat-mdc-chip-disabled button{opacity:.2}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__icons,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__icons{opacity:1}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__handle:after,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__handle:after{opacity:1;background:#000}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__track,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__track{opacity:.3}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-date-range-input-inner:disabled{color:#000}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled{opacity:1}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled .mdc-slider__input{cursor:default}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mat-mdc-slider,::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mdc-slider__thumb:hover,::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mdc-slider__thumb-knob{background-color:#000;border-color:#000}::ng-deep .mat-mdc-form-field .mat-mdc-slide-toggle{opacity:1}::ng-deep .badge-changes .mat-badge-content{background-color:orange;color:#fff}mat-spinner{margin:10px auto}.mdc-data-table__row:last-child .mdc-data-table__cell{border-bottom:1px solid rgba(0,0,0,.12)}mat-paginator{padding-top:10px;padding-bottom:10px}.actions-container{display:flex;gap:10px}.object-dropdown{width:100%}.table-with-error-slot{border:1px solid #E0E0E0;border-radius:5px;padding-top:5px;padding-bottom:5px}.mat-column-select{flex:0 0 48px;padding-left:0;padding-right:0;justify-content:center}.enabled:hover{cursor:pointer}.table-error{display:flex;align-items:center;justify-content:center;margin-top:-6px;border:1px solid #E0E0E0;background-color:#f8d3d7;color:#721c24;height:fit-content;padding-left:4px;padding-right:4px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.entityArray .elevation-container{border-radius:5px;padding:15px 15px 0;margin-bottom:15px;margin-top:15px}.entityArray .array-headline{padding-bottom:10px}.entityArray .buttons{display:flex;justify-content:space-between;margin-bottom:10px;margin-top:5px;flex-wrap:wrap;gap:10px}.entityArray .buttons button{flex-grow:1}.hasMany button{width:100%;height:56px;line-height:24px;font-size:16px}.hasMany .title{text-align:center}.hasMany .elevation-container{margin-bottom:15px}\n", "::ng-deep .mdc-dialog .mdc-dialog__content{padding:6px 20px!important}mat-dialog-actions{justify-content:space-between;align-items:center;padding-left:20px;padding-right:20px}.mat-dialog-title{padding:12px 20px;display:flex;justify-content:space-between;align-items:center}.mat-dialog-title div{font-size:var(--mdc-dialog-subhead-size, 14px);font-weight:var(--mdc-dialog-subhead-weight, 500)}\n"], dependencies: [{ kind: "component", type: NgxMatEntityInputComponent, selector: "ngx-mat-entity-input", inputs: ["entity", "propertyKey", "getValidationErrorMessage", "hideOmitForCreate", "hideOmitForEdit", "validEmpty", "isReadOnly"], outputs: ["inputChangeEvent"] }, { kind: "component", type: DisplayColumnValueComponent, selector: "display-column-value", inputs: ["entity", "ComponentClass"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i5.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i5.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i7.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i9.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i9.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i10.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i11.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: "ngmodule", type: MatMenuModule }, { kind: "component", type: i12.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i12.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i13.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i14.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i15.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i15.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i15.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i15.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i15.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i15.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i15.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i15.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i15.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i15.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i16.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i17.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: TooltipComponent, selector: "ngx-mat-entity-tooltip", inputs: ["tooltipContent"] }, { kind: "component", type: StringInputComponent, selector: "string-input" }, { kind: "component", type: StringTextboxInputComponent, selector: "string-textbox-input" }, { kind: "component", type: StringAutocompleteInputComponent, selector: "string-autocomplete-input" }, { kind: "component", type: StringDropdownInputComponent, selector: "string-dropdown-input" }, { kind: "component", type: StringPasswordInputComponent, selector: "string-password-input" }, { kind: "component", type: BooleanCheckboxInputComponent, selector: "boolean-checkbox-input" }, { kind: "component", type: BooleanToggleInputComponent, selector: "boolean-toggle-input" }, { kind: "component", type: BooleanDropdownInputComponent, selector: "boolean-dropdown-input" }, { kind: "component", type: NumberInputComponent, selector: "number-input" }, { kind: "component", type: NumberDropdownInputComponent, selector: "number-dropdown-input" }, { kind: "component", type: NumberSliderInputComponent, selector: "number-slider-input" }, { kind: "component", type: ArrayDateInputComponent, selector: "array-date-input" }, { kind: "component", type: ArrayDateRangeInputComponent, selector: "array-date-range-input" }, { kind: "component", type: ArrayDateTimeInputComponent, selector: "array-date-time-input" }, { kind: "component", type: ArrayStringAutocompleteChipsComponent, selector: "array-string-autocomplete-chips" }, { kind: "component", type: ArrayStringChipsInputComponent, selector: "array-string-chips-input" }, { kind: "component", type: DateInputComponent, selector: "date-input" }, { kind: "component", type: DateRangeInputComponent, selector: "date-range-input" }, { kind: "component", type: DateTimeInputComponent, selector: "date-time-input" }, { kind: "component", type: FileDefaultInputComponent, selector: "file-default-input" }, { kind: "component", type: FileImageInputComponent, selector: "file-image-input" }, { kind: "component", type: ReferencesManyInputComponent, selector: "references-many-input" }, { kind: "component", type: CustomInputComponent, selector: "custom-input" }, { kind: "directive", type: DynamicStyleClassDirective, selector: "[dynamicStyleClasses]", inputs: ["dynamicStyleClasses", "value"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i18.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i18.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }] });
|
|
1217
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.7", ngImport: i0, type: NgxMatEntityInputComponent, deps: [{ token: i1.MatDialog }, { token: i0.EnvironmentInjector }, { token: i2.Router }, { token: NGX_GET_VALIDATION_ERROR_MESSAGE }, { token: NGX_COMPLETE_GLOBAL_DEFAULT_VALUES }, { token: i3.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
|
|
1218
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.7", type: NgxMatEntityInputComponent, isStandalone: true, selector: "ngx-mat-entity-input", inputs: { entity: "entity", propertyKey: "propertyKey", getValidationErrorMessage: "getValidationErrorMessage", hideOmitForCreate: "hideOmitForCreate", hideOmitForEdit: "hideOmitForEdit", validEmpty: "validEmpty", isReadOnly: "isReadOnly" }, outputs: { inputChangeEvent: "inputChangeEvent" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "addArrayItemDialog", first: true, predicate: ["addArrayItemDialog"], descendants: true }, { propertyName: "editArrayItemDialog", first: true, predicate: ["editArrayItemDialog"], descendants: true }, { propertyName: "createHasManyDialog", first: true, predicate: ["createHasManyDialog"], descendants: true }, { propertyName: "editHasManyDialog", first: true, predicate: ["editHasManyDialog"], descendants: true }], ngImport: i0, template: "<!-- eslint-disable angular/no-call-expression -->\n \n@if(!(hideOmitForCreate && metadata.omitForCreate) && !(hideOmitForEdit && metadata.omitForUpdate)) {\n @switch (type) {\n <!-------------------------------------------->\n <!-----------------Strings-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.STRING) {\n <string-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-input>\n }\n @case (DecoratorTypes.STRING_TEXTBOX) {\n <string-textbox-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-textbox-input>\n }\n @case (DecoratorTypes.STRING_AUTOCOMPLETE) {\n <string-autocomplete-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-autocomplete-input>\n }\n @case (DecoratorTypes.STRING_DROPDOWN) {\n <string-dropdown-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-dropdown-input>\n }\n @case (DecoratorTypes.STRING_PASSWORD) {\n <string-password-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-password-input>\n }\n <!-------------------------------------------->\n <!-----------------Booleans------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.BOOLEAN_CHECKBOX) {\n <boolean-checkbox-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </boolean-checkbox-input>\n }\n @case (DecoratorTypes.BOOLEAN_TOGGLE) {\n <boolean-toggle-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </boolean-toggle-input>\n }\n @case (DecoratorTypes.BOOLEAN_DROPDOWN) {\n <boolean-dropdown-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </boolean-dropdown-input>\n }\n <!-------------------------------------------->\n <!------------------Numbers------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.NUMBER) {\n <number-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </number-input>\n }\n @case (DecoratorTypes.NUMBER_DROPDOWN) {\n <number-dropdown-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </number-dropdown-input>\n }\n @case (DecoratorTypes.NUMBER_SLIDER) {\n <number-slider-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </number-slider-input>\n }\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.ARRAY_DATE) {\n <array-date-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-date-input>\n }\n @case (DecoratorTypes.ARRAY_DATE_TIME) {\n <array-date-time-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-date-time-input>\n }\n @case (DecoratorTypes.ARRAY_DATE_RANGE) {\n <array-date-range-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-date-range-input>\n }\n @case (DecoratorTypes.ARRAY_STRING_CHIPS) {\n <array-string-chips-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-string-chips-input>\n }\n @case (DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS) {\n <array-string-autocomplete-chips\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-string-autocomplete-chips>\n }\n <!-------------------------------------------->\n <!-------------------Dates-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.DATE) {\n <date-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </date-input>\n }\n @case (DecoratorTypes.DATE_RANGE) {\n <date-range-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </date-range-input>\n }\n @case (DecoratorTypes.DATE_TIME) {\n <date-time-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </date-time-input>\n }\n <!-------------------------------------------->\n <!-------------------Files-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.FILE_DEFAULT) {\n <file-default-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </file-default-input>\n }\n @case (DecoratorTypes.FILE_IMAGE) {\n <file-image-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </file-image-input>\n }\n <!-------------------------------------------->\n <!-------------- references many ------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.REFERENCES_MANY) {\n <references-many-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </references-many-input>\n }\n <!-------------------------------------------->\n <!-------------------Custom------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.CUSTOM) {\n <custom-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </custom-input>\n }\n <!-------------------------------------------->\n <!-------------------Object------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.OBJECT) {\n <b>{{metadataDefaultObject.displayName}}</b>\n <!-- iterates over the object properties -->\n <ng-container *ngTemplateOutlet=\"form; context: objectFormContext\"></ng-container>\n }\n <!-------------------------------------------->\n <!---------------Object Dropdown-------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.OBJECT_DROPDOWN) {\n <mat-form-field class=\"object-dropdown\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select #model=\"ngModel\"\n [name]=\"objectDropdownName\"\n [required]=\"metadata.required(entity)\"\n [disabled]=\"internalIsReadOnly\"\n [compareWith]=\"compareObjectsBound\"\n [(ngModel)]=\"entity[propertyKey]\"\n (selectionChange)=\"emitChange()\"\n (opened)=\"selectSearchInput.focus()\"\n >\n <mat-form-field class=\"select-search-input\">\n <!-- eslint-disable-next-line angular/no-any -->\n <input #selectSearchInput matInput (keyup)=\"filterObjectDropdownValues($any($event.target).value)\">\n <fa-icon matSuffix [icon]=\"faSearch\"></fa-icon>\n </mat-form-field>\n @if (!metadata.required(entity)) {\n <mat-option>-</mat-option>\n }\n @if (shouldDisplayCurrentObjectDropdownValue) {\n <mat-option [value]=\"currentObjectDropdownValue?.value\">{{currentObjectDropdownValue?.displayName}}</mat-option>\n }\n @for (value of filteredObjectDropdownValues; track $index) {\n <mat-option [value]=\"value.value\">{{value.displayName}}</mat-option>\n }\n </mat-select>\n <mat-error>{{internalGetValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n }\n <!-------------------------------------------->\n <!-------------- references one -------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.REFERENCES_ONE) {\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select #inputModel=\"ngModel\"\n [name]=\"referencesOneName\"\n [disabled]=\"internalIsReadOnly\"\n [required]=\"metadata.required(entity)\"\n [(ngModel)]=\"entity[propertyKey]\"\n (selectionChange)=\"setReferencesOneObject()\"\n (opened)=\"selectSearchInput.focus()\"\n >\n <mat-form-field class=\"select-search-input\">\n <!-- eslint-disable-next-line angular/no-any -->\n <input #selectSearchInput matInput (keyup)=\"filterReferencesOneValues($any($event.target).value)\">\n <fa-icon matSuffix [icon]=\"faSearch\"></fa-icon>\n </mat-form-field>\n @if (!metadata.required(entity)) {\n <mat-option>-</mat-option>\n }\n @if (shouldDisplayCurrentReferencesOneDropdownValue) {\n <mat-option [value]=\"currentReferencesOneDropdownValue?.value\">{{currentReferencesOneDropdownValue?.displayName}}</mat-option>\n }\n @for (value of filteredReferencesOneDropdownValues; track $index) {\n <mat-option [value]=\"value.value\">{{value.displayName}}</mat-option>\n }\n </mat-select>\n <mat-error>{{internalGetValidationErrorMessage(inputModel)}}</mat-error>\n </mat-form-field>\n <!-- iterates over the references one properties -->\n @if (referencesOneFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: referencesOneFormContext\"></ng-container>\n }\n }\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.ARRAY) {\n <div class=\"entityArray\">\n <div class=\"mat-elevation-z8 elevation-container\">\n <div class=\"array-headline\">\n <b>{{metadataEntityArray.displayName}}</b>\n </div>\n @if (metadataEntityArray.createInline && !internalIsReadOnly && addArrayItemFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: addArrayItemFormContext\"></ng-container>\n }\n @if (!internalIsReadOnly && entityArrayTableContext) {\n <div class=\"buttons\">\n <button type=\"button\" mat-raised-button\n [disabled]=\"metadataEntityArray.createInline && !isArrayItemValid\"\n (click)=\"addEntity()\">\n {{metadataEntityArray.addButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button\n [disabled]=\"!entityArrayTableContext.$implicit.selection.selected.length\"\n (click)=\"removeFromEntityArray()\">\n {{metadataEntityArray.removeButtonLabel}}\n </button>\n </div>\n }\n @if (entityArrayTableContext) {\n <ng-container *ngTemplateOutlet=\"table; context: entityArrayTableContext\"></ng-container>\n }\n </div>\n </div>\n }\n <!-------------------------------------------->\n <!------------------ has many ---------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.HAS_MANY) {\n <div class=\"hasMany\">\n <h2 class=\"title\">{{metadataHasMany.tableData.baseData.title}}</h2>\n <div class=\"grid grid-cols-12\" style=\"column-gap: 24px;\">\n <mat-form-field class=\"lg:col-span-8 md:col-span-6 col-span-12\">\n <mat-label>{{metadataHasMany.tableData.baseData.searchLabel}}</mat-label>\n <input matInput (keyup)=\"applyHasManyFilter($event)\">\n </mat-form-field>\n @if (metadataHasMany.tableData.baseData.tableActions.length) {\n <div\n [class.lg:col-span-2]=\"hasManyAllowCreate\"\n [class.lg:col-span-4]=\"!hasManyAllowCreate\"\n [class.md:col-span-3]=\"hasManyAllowCreate\"\n [class.md:col-span-6]=\"!hasManyAllowCreate\"\n [class.col-span-6]=\"hasManyAllowCreate\"\n [class.col-span-12]=\"!hasManyAllowCreate\"\n >\n <button type=\"button\" class=\"actions-button\" mat-raised-button [matMenuTriggerFor]=\"menu\">\n {{metadataHasMany.tableData.baseData.tableActionsLabel}}\n </button>\n </div>\n }\n <mat-menu #menu=\"matMenu\">\n @if (metadataHasMany.tableData.baseData.allowJsonImport) {\n <button type=\"button\" mat-menu-item [disabled]=\"hasManyTableActionDisabled(hasManyImportAction)\" (click)=\"runHasManyTableAction(hasManyImportAction)\">\n {{hasManyImportAction.displayName}}\n </button>\n }\n @for (action of metadataHasMany.tableData.baseData.tableActions; track $index) {\n <button type=\"button\" mat-menu-item [disabled]=\"hasManyTableActionDisabled(action)\" (click)=\"runHasManyTableAction(action)\">\n {{action.displayName}}\n </button>\n }\n </mat-menu>\n @if (hasManyAllowCreate) {\n <div\n [class.lg:col-span-2]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.lg:col-span-4]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n [class.md:col-span-3]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.md:col-span-6]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-span-6]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-span-12]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n >\n <button type=\"button\" class=\"create-button\" mat-raised-button (click)=\"createHasManyEntity()\">\n {{metadataHasMany.tableData.baseData.createButtonLabel}}\n </button>\n </div>\n }\n </div>\n \n <div class=\"mat-elevation-z8 elevation-container\">\n @if (hasManyTableContext) {\n <ng-container *ngTemplateOutlet=\"table; context: hasManyTableContext\"></ng-container>\n }\n </div>\n </div>\n }\n \n @default {\n <div>ERROR: The type {{type}} is not known.</div>\n }\n }\n}\n\n\n<ng-template #table let-context>\n <mat-table matSort [dataSource]=\"context.dataSource\" [class.table-with-error-slot]=\"context.shouldShowMissingError\">\n <!-- select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox [checked]=\"context.selection.hasValue() && SelectionUtilities.isAllSelected(context.selection, context.dataSource)\"\n [indeterminate]=\"context.selection.hasValue() && !SelectionUtilities.isAllSelected(context.selection, context.dataSource)\"\n (change)=\"$event ? SelectionUtilities.masterToggle(context.selection, context.dataSource) : null\">\n </mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let value\" [dynamicStyleClasses]=\"context.dynamicRowStyleClasses\" [value]=\"value\">\n <mat-checkbox [checked]=\"context.selection.isSelected(value)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? context.selection.toggle(value) : null\">\n </mat-checkbox>\n </mat-cell>\n </ng-container>\n\n @for (dCol of context.displayColumns; track $index) {\n <ng-container [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell *matCellDef=\"let value\" [class.enabled]=\"!dCol.disableClick && context.allowClick(value)\"\n [dynamicStyleClasses]=\"context.dynamicRowStyleClasses\" [value]=\"value\"\n (click)=\"clickCell(value, dCol, context)\"\n >\n @if (dCol.Component) {\n <display-column-value [entity]=\"value\" [ComponentClass]=\"dCol.Component\"></display-column-value>\n }\n @else {\n {{getDisplayColumnValue(value, dCol)}}\n }\n </mat-cell>\n </ng-container>\n }\n\n <mat-header-row *matHeaderRowDef=\"context.displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: context.displayedColumns\"></mat-row>\n </mat-table>\n\n @if (context.displayLoadingSpinner && context.isLoading) {\n <mat-spinner>\n </mat-spinner>\n }\n @else if (context.shouldShowMissingError && !context.dataSource.data.length) {\n <div class=\"table-error\">{{context.emptyErrorMessage}}</div>\n }\n\n <mat-paginator [length]=\"context.dataSource.filteredData.length\" [pageIndex]=\"0\" [pageSize]=\"10\" [pageSizeOptions]=\"[5, 10, 25, 50]\"></mat-paginator>\n</ng-template>\n\n<!--------------------------------------------------------->\n<!---------------------------Form-------------------------->\n<!--------------------------------------------------------->\n<ng-template #form let-context>\n <!-- eslint-disable angular/no-call-expression -->\n @if (context.tabs.length > 1) {\n <mat-tab-group preserveContent>\n @for (tab of context.tabs; track $index) {\n <mat-tab [label]=\"tab.tabName\">\n @for (row of tab.rows; track $index) {\n <div class=\"grid grid-cols-12\" style=\"column-gap: 24px;\">\n @for (key of row.keys; track key) {\n <ngx-mat-entity-input\n [entity]=\"context.entity\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [validEmpty]=\"context.validEmpty?.()\"\n [isReadOnly]=\"context.isReadOnly?.(context.entity, key)\"\n [class]=\"EntityUtilities.getWidthClasses(context.entity, key)\"\n [hideOmitForEdit]=\"context.hideOmitForEdit\"\n [hideOmitForCreate]=\"context.hideOmitForCreate\"\n (inputChangeEvent)=\"context.inputChangeEvent()\"\n >\n </ngx-mat-entity-input>\n }\n </div>\n }\n </mat-tab>\n }\n </mat-tab-group>\n }\n @else {\n @if (!context.tabs.length) {\n <span class=\"no-entity-tabs\">\n ERROR: No Inputs. Did you correctly assign all values in the model constructor?\n </span>\n }\n @else {\n @for (row of context.tabs[0].rows; track $index) {\n <div class=\"grid grid-cols-12\" style=\"column-gap: 24px;\">\n @for (key of row.keys; track key) {\n <ngx-mat-entity-input\n [entity]=\"context.entity\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [validEmpty]=\"context.validEmpty?.()\"\n [isReadOnly]=\"context.isReadOnly?.(context.entity, key)\"\n [class]=\"EntityUtilities.getWidthClasses(context.entity, key)\"\n [hideOmitForEdit]=\"context.hideOmitForEdit\"\n [hideOmitForCreate]=\"context.hideOmitForCreate\"\n (inputChangeEvent)=\"context.inputChangeEvent()\"\n >\n </ngx-mat-entity-input>\n }\n </div>\n }\n }\n }\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Add Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #addArrayItemDialog>\n <div class=\"mat-dialog-title\">\n <div>{{addArrayItemDialogData.title}}</div>\n </div>\n\n <form (ngSubmit)=\"addArrayItem()\">\n <mat-dialog-content>\n @if (addArrayItemFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: addArrayItemFormContext\"></ng-container>\n }\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <div class=\"dialog-button-with-info-icon\">\n <button type=\"submit\" mat-raised-button matBadgeColor=\"warn\"\n [disabled]=\"!isArrayItemValid\"\n [matBadge]=\"arrayItemValidationErrors.length\"\n [matBadgeHidden]=\"!arrayItemValidationErrors.length\"\n >\n {{addArrayItemDialogData.createButtonLabel}}\n </button>\n @if (arrayItemValidationErrors.length) {\n <ngx-mat-entity-tooltip [tooltipContent]=\"arrayItemTooltipContent\"></ngx-mat-entity-tooltip>\n }\n </div>\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"closeAddArrayItemDialog()\">\n {{addArrayItemDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Edit Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #editArrayItemDialog>\n <div class=\"mat-dialog-title\">\n <div>{{editArrayItemDialogData.title(arrayItemPriorChanges)}}</div>\n </div>\n \n <form (ngSubmit)=\"saveArrayItem()\">\n <mat-dialog-content>\n @if (editArrayItemFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: editArrayItemFormContext\"></ng-container>\n }\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <div class=\"dialog-button-with-info-icon\">\n <button type=\"submit\" mat-raised-button matBadgeColor=\"warn\"\n [class.badge-changes]=\"!arrayItemValidationErrors.length\"\n [disabled]=\"internalIsReadOnly || !isArrayItemValid || !isArrayItemDirty\"\n [matBadge]=\"arrayItemValidationErrors.length > 0 ? arrayItemValidationErrors.length : arrayItemChanges.length\"\n [matBadgeHidden]=\"!arrayItemValidationErrors.length && !arrayItemChanges.length\"\n >\n {{editArrayItemDialogData.confirmButtonLabel}}\n </button>\n @if (arrayItemValidationErrors.length || arrayItemChanges.length) {\n <ngx-mat-entity-tooltip [tooltipContent]=\"arrayItemTooltipContent\"></ngx-mat-entity-tooltip>\n }\n </div>\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"closeEditArrayItemDialog()\">\n {{editArrayItemDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Create Has Many Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #createHasManyDialog>\n <div class=\"mat-dialog-title\">\n <div>{{metadataHasMany.tableData.createData.title}}</div>\n </div>\n \n <form (ngSubmit)=\"dialogCreateHasMany()\">\n <mat-dialog-content>\n @if (hasManyCreateFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: hasManyCreateFormContext\"></ng-container>\n }\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <div class=\"dialog-button-with-info-icon\">\n <button type=\"submit\" mat-raised-button matBadgeColor=\"warn\"\n [disabled]=\"!isHasManyEntityValid\"\n [matBadge]=\"hasManyValidationErrors.length\"\n [matBadgeHidden]=\"!hasManyValidationErrors.length\"\n >\n {{metadataHasMany.tableData.createData.createButtonLabel}}\n </button>\n @if (hasManyValidationErrors.length) {\n <ngx-mat-entity-tooltip [tooltipContent]=\"hasManyTooltipContent\"></ngx-mat-entity-tooltip>\n }\n </div>\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"dialogCancelCreateHasMany()\">\n {{metadataHasMany.tableData.createData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n \n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Edit Has Many Dialog----------------->\n<!--------------------------------------------------------->\n<ng-template #editHasManyDialog>\n <div class=\"mat-dialog-title\">\n <div>{{metadataHasMany.tableData.editData.title(hasManyEntityPriorChanges)}}</div>\n\n <div class=\"actions-container\">\n @if (metadataHasMany.tableData.editData.actions.length) {\n <button type=\"button\" mat-raised-button [matMenuTriggerFor]=\"menu\">\n {{metadataHasMany.tableData.editData.actionsLabel}}\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (action of metadataHasMany.tableData.editData.actions; track $index) {\n <button type=\"button\" mat-menu-item [disabled]=\"hasManyEditActionDisabled(action)\" (click)=\"hasManyRunEditAction(action)\">\n {{action.displayName}}\n </button>\n }\n </mat-menu>\n \n @if (hasManyAllowDelete(hasManyEntity)) {\n <button type=\"button\" mat-raised-button color=\"warn\" class=\"delete-button\" tabindex=\"-1\" (click)=\"deleteHasManyEntity()\">\n {{metadataHasMany.tableData.editData.deleteButtonLabel}}\n </button>\n }\n </div>\n </div>\n \n <form (ngSubmit)=\"dialogEditHasMany()\">\n <mat-dialog-content>\n @if (hasManyEditFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: hasManyEditFormContext\"></ng-container>\n }\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <div class=\"dialog-button-with-info-icon\">\n <button type=\"submit\" mat-raised-button matBadgeColor=\"warn\"\n [class.badge-changes]=\"!hasManyValidationErrors.length\"\n [disabled]=\"internalIsReadOnly || !isHasManyEntityValid || !isHasManyEntityDirty\"\n [matBadge]=\"hasManyValidationErrors.length > 0 ? hasManyValidationErrors.length : hasManyChanges.length\"\n [matBadgeHidden]=\"!hasManyValidationErrors.length && !hasManyChanges.length\"\n >\n {{metadataHasMany.tableData.editData.confirmButtonLabel}}\n </button>\n @if (hasManyValidationErrors.length || hasManyChanges.length) {\n <ngx-mat-entity-tooltip [tooltipContent]=\"hasManyTooltipContent\"></ngx-mat-entity-tooltip>\n }\n </div>\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"dialogCancelEditHasMany()\">\n {{metadataHasMany.tableData.editData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n</ng-template>", styles: ["::ng-deep mat-tab-body{padding-top:10px;padding-left:12px;padding-right:12px}::ng-deep mat-tab-body .mat-mdc-tab-body-content{overflow:initial}::ng-deep .mat-mdc-tab-body-wrapper{margin-left:-12px;margin-right:-12px}::ng-deep .mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-right:16px}::ng-deep .select-search-input{width:100%;margin-top:-8px;margin-bottom:8px}::ng-deep .select-search-input .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .mat-mdc-form-field.mat-form-field-disabled label{color:#0009}::ng-deep .mat-mdc-form-field.mat-form-field-disabled input,::ng-deep .mat-mdc-form-field.mat-form-field-disabled textarea,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-disabled,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-value{color:#000!important}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:not(:checked):not(:indeterminate):not([data-indeterminate=true])~.mdc-checkbox__background{border-color:#707070}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:checked~.mdc-checkbox__background,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:indeterminate~.mdc-checkbox__background,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[data-indeterminate=true][disabled]~.mdc-checkbox__background{background-color:#000}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-chip.mat-mdc-standard-chip.mat-mdc-chip-disabled{opacity:1}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-chip.mat-mdc-standard-chip.mat-mdc-chip-disabled button{opacity:.2}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__icons,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__icons{opacity:1}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__handle:after,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__handle:after{opacity:1;background:#000}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__track,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__track{opacity:.3}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-date-range-input-inner:disabled{color:#000}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled{opacity:1}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled .mdc-slider__input{cursor:default}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mat-mdc-slider,::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mdc-slider__thumb:hover,::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mdc-slider__thumb-knob{background-color:#000;border-color:#000}::ng-deep .mat-mdc-form-field .mat-mdc-slide-toggle{opacity:1}::ng-deep .badge-changes .mat-badge-content{background-color:orange;color:#fff}mat-spinner{margin:10px auto}.mdc-data-table__row:last-child .mdc-data-table__cell{border-bottom:1px solid rgba(0,0,0,.12)}mat-paginator{padding-top:10px;padding-bottom:10px}.dialog-button-with-info-icon{margin-top:10px;gap:12px;display:flex;align-items:center}.actions-container{display:flex;gap:10px}.object-dropdown{width:100%}.table-with-error-slot{border:1px solid #E0E0E0;border-radius:5px;padding-top:5px;padding-bottom:5px}.mat-column-select{flex:0 0 48px;padding-left:0;padding-right:0;justify-content:center}.enabled:hover{cursor:pointer}.table-error{display:flex;align-items:center;justify-content:center;margin-top:-6px;border:1px solid #E0E0E0;background-color:#f8d3d7;color:#721c24;height:fit-content;padding-left:4px;padding-right:4px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.entityArray .elevation-container{border-radius:5px;padding:15px 15px 0;margin-bottom:15px;margin-top:15px}.entityArray .array-headline{padding-bottom:10px}.entityArray .buttons{display:flex;justify-content:space-between;margin-bottom:10px;margin-top:5px;flex-wrap:wrap;gap:10px}.entityArray .buttons button{flex-grow:1}.hasMany button{width:100%;height:56px;line-height:24px;font-size:16px}.hasMany .title{text-align:center}.hasMany .elevation-container{margin-bottom:15px}\n", "::ng-deep .mdc-dialog .mdc-dialog__content{padding:6px 20px!important}mat-dialog-actions{justify-content:space-between;align-items:center;padding-left:20px;padding-right:20px}.mat-dialog-title{padding:12px 20px;display:flex;justify-content:space-between;align-items:center}.mat-dialog-title div{font-size:var(--mdc-dialog-subhead-size, 14px);font-weight:var(--mdc-dialog-subhead-weight, 500)}\n", ".grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid{display:grid}@media (min-width: 1024px){.lg\\:col-span-12{grid-column:span 12/span 12!important}.lg\\:col-span-11{grid-column:span 11/span 11!important}.lg\\:col-span-10{grid-column:span 10/span 10!important}.lg\\:col-span-9{grid-column:span 9/span 9!important}.lg\\:col-span-8{grid-column:span 8/span 8!important}.lg\\:col-span-7{grid-column:span 7/span 7!important}.lg\\:col-span-6{grid-column:span 6/span 6!important}.lg\\:col-span-5{grid-column:span 5/span 5!important}.lg\\:col-span-4{grid-column:span 4/span 4!important}.lg\\:col-span-3{grid-column:span 3/span 3!important}.lg\\:col-span-2{grid-column:span 2/span 2!important}.lg\\:col-span-1{grid-column:span 1/span 1!important}}@media (min-width: 768px) and (max-width: 1023px){.md\\:col-span-12{grid-column:span 12/span 12!important}.md\\:col-span-11{grid-column:span 11/span 11!important}.md\\:col-span-10{grid-column:span 10/span 10!important}.md\\:col-span-9{grid-column:span 9/span 9!important}.md\\:col-span-8{grid-column:span 8/span 8!important}.md\\:col-span-7{grid-column:span 7/span 7!important}.md\\:col-span-6{grid-column:span 6/span 6!important}.md\\:col-span-5{grid-column:span 5/span 5!important}.md\\:col-span-4{grid-column:span 4/span 4!important}.md\\:col-span-3{grid-column:span 3/span 3!important}.md\\:col-span-2{grid-column:span 2/span 2!important}.md\\:col-span-1{grid-column:span 1/span 1!important}}.col-span-12{grid-column:span 12/span 12}.col-span-11{grid-column:span 11/span 11}.col-span-10{grid-column:span 10/span 10}.col-span-9{grid-column:span 9/span 9}.col-span-8{grid-column:span 8/span 8}.col-span-7{grid-column:span 7/span 7}.col-span-6{grid-column:span 6/span 6}.col-span-5{grid-column:span 5/span 5}.col-span-4{grid-column:span 4/span 4}.col-span-3{grid-column:span 3/span 3}.col-span-2{grid-column:span 2/span 2}.col-span-1{grid-column:span 1/span 1}\n"], dependencies: [{ kind: "component", type: NgxMatEntityInputComponent, selector: "ngx-mat-entity-input", inputs: ["entity", "propertyKey", "getValidationErrorMessage", "hideOmitForCreate", "hideOmitForEdit", "validEmpty", "isReadOnly"], outputs: ["inputChangeEvent"] }, { kind: "component", type: DisplayColumnValueComponent, selector: "display-column-value", inputs: ["entity", "ComponentClass"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i5.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i5.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i7.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i9.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i9.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i10.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i11.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: "ngmodule", type: MatMenuModule }, { kind: "component", type: i12.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i12.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i13.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i14.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i15.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i15.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i15.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i15.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i15.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i15.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i15.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i15.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i15.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i15.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i16.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i17.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: TooltipComponent, selector: "ngx-mat-entity-tooltip", inputs: ["tooltipContent"] }, { kind: "component", type: StringInputComponent, selector: "string-input" }, { kind: "component", type: StringTextboxInputComponent, selector: "string-textbox-input" }, { kind: "component", type: StringAutocompleteInputComponent, selector: "string-autocomplete-input" }, { kind: "component", type: StringDropdownInputComponent, selector: "string-dropdown-input" }, { kind: "component", type: StringPasswordInputComponent, selector: "string-password-input" }, { kind: "component", type: BooleanCheckboxInputComponent, selector: "boolean-checkbox-input" }, { kind: "component", type: BooleanToggleInputComponent, selector: "boolean-toggle-input" }, { kind: "component", type: BooleanDropdownInputComponent, selector: "boolean-dropdown-input" }, { kind: "component", type: NumberInputComponent, selector: "number-input" }, { kind: "component", type: NumberDropdownInputComponent, selector: "number-dropdown-input" }, { kind: "component", type: NumberSliderInputComponent, selector: "number-slider-input" }, { kind: "component", type: ArrayDateInputComponent, selector: "array-date-input" }, { kind: "component", type: ArrayDateRangeInputComponent, selector: "array-date-range-input" }, { kind: "component", type: ArrayDateTimeInputComponent, selector: "array-date-time-input" }, { kind: "component", type: ArrayStringAutocompleteChipsComponent, selector: "array-string-autocomplete-chips" }, { kind: "component", type: ArrayStringChipsInputComponent, selector: "array-string-chips-input" }, { kind: "component", type: DateInputComponent, selector: "date-input" }, { kind: "component", type: DateRangeInputComponent, selector: "date-range-input" }, { kind: "component", type: DateTimeInputComponent, selector: "date-time-input" }, { kind: "component", type: FileDefaultInputComponent, selector: "file-default-input" }, { kind: "component", type: FileImageInputComponent, selector: "file-image-input" }, { kind: "component", type: ReferencesManyInputComponent, selector: "references-many-input" }, { kind: "component", type: CustomInputComponent, selector: "custom-input" }, { kind: "directive", type: DynamicStyleClassDirective, selector: "[dynamicStyleClasses]", inputs: ["dynamicStyleClasses", "value"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i18.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i18.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }] });
|
|
1209
1219
|
}
|
|
1210
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.
|
|
1220
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.7", ngImport: i0, type: NgxMatEntityInputComponent, decorators: [{
|
|
1211
1221
|
type: Component,
|
|
1212
1222
|
args: [{ selector: 'ngx-mat-entity-input', standalone: true, imports: [
|
|
1213
1223
|
DisplayColumnValueComponent,
|
|
@@ -1250,8 +1260,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImpor
|
|
|
1250
1260
|
ReferencesManyInputComponent,
|
|
1251
1261
|
CustomInputComponent,
|
|
1252
1262
|
DynamicStyleClassDirective,
|
|
1253
|
-
MatSortModule
|
|
1254
|
-
], template: "<!-- eslint-disable angular/no-call-expression -->\n \n@if(!(hideOmitForCreate && metadata.omitForCreate) && !(hideOmitForEdit && metadata.omitForUpdate)) {\n @switch (type) {\n <!-------------------------------------------->\n <!-----------------Strings-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.STRING) {\n <string-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-input>\n }\n @case (DecoratorTypes.STRING_TEXTBOX) {\n <string-textbox-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-textbox-input>\n }\n @case (DecoratorTypes.STRING_AUTOCOMPLETE) {\n <string-autocomplete-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-autocomplete-input>\n }\n @case (DecoratorTypes.STRING_DROPDOWN) {\n <string-dropdown-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-dropdown-input>\n }\n @case (DecoratorTypes.STRING_PASSWORD) {\n <string-password-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-password-input>\n }\n <!-------------------------------------------->\n <!-----------------Booleans------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.BOOLEAN_CHECKBOX) {\n <boolean-checkbox-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </boolean-checkbox-input>\n }\n @case (DecoratorTypes.BOOLEAN_TOGGLE) {\n <boolean-toggle-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </boolean-toggle-input>\n }\n @case (DecoratorTypes.BOOLEAN_DROPDOWN) {\n <boolean-dropdown-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </boolean-dropdown-input>\n }\n <!-------------------------------------------->\n <!------------------Numbers------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.NUMBER) {\n <number-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </number-input>\n }\n @case (DecoratorTypes.NUMBER_DROPDOWN) {\n <number-dropdown-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </number-dropdown-input>\n }\n @case (DecoratorTypes.NUMBER_SLIDER) {\n <number-slider-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </number-slider-input>\n }\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.ARRAY_DATE) {\n <array-date-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-date-input>\n }\n @case (DecoratorTypes.ARRAY_DATE_TIME) {\n <array-date-time-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-date-time-input>\n }\n @case (DecoratorTypes.ARRAY_DATE_RANGE) {\n <array-date-range-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-date-range-input>\n }\n @case (DecoratorTypes.ARRAY_STRING_CHIPS) {\n <array-string-chips-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-string-chips-input>\n }\n @case (DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS) {\n <array-string-autocomplete-chips\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-string-autocomplete-chips>\n }\n <!-------------------------------------------->\n <!-------------------Dates-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.DATE) {\n <date-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </date-input>\n }\n @case (DecoratorTypes.DATE_RANGE) {\n <date-range-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </date-range-input>\n }\n @case (DecoratorTypes.DATE_TIME) {\n <date-time-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </date-time-input>\n }\n <!-------------------------------------------->\n <!-------------------Files-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.FILE_DEFAULT) {\n <file-default-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </file-default-input>\n }\n @case (DecoratorTypes.FILE_IMAGE) {\n <file-image-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </file-image-input>\n }\n <!-------------------------------------------->\n <!-------------- references many ------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.REFERENCES_MANY) {\n <references-many-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </references-many-input>\n }\n <!-------------------------------------------->\n <!-------------------Custom------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.CUSTOM) {\n <custom-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </custom-input>\n }\n <!-------------------------------------------->\n <!-------------------Object------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.OBJECT) {\n <b>{{metadataDefaultObject.displayName}}</b>\n <!-- iterates over the object properties -->\n <ng-container *ngTemplateOutlet=\"form; context: objectFormContext\"></ng-container>\n }\n <!-------------------------------------------->\n <!---------------Object Dropdown-------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.OBJECT_DROPDOWN) {\n <mat-form-field class=\"object-dropdown\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select #model=\"ngModel\"\n [name]=\"objectDropdownName\"\n [required]=\"metadata.required(entity)\"\n [disabled]=\"internalIsReadOnly\"\n [compareWith]=\"compareObjectsBound\"\n [(ngModel)]=\"entity[propertyKey]\"\n (selectionChange)=\"emitChange()\"\n (opened)=\"selectSearchInput.focus()\"\n >\n <mat-form-field class=\"select-search-input\">\n <!-- eslint-disable-next-line angular/no-any -->\n <input #selectSearchInput matInput (keyup)=\"filterObjectDropdownValues($any($event.target).value)\">\n <i matSuffix class=\"fas fa-search\"></i>\n </mat-form-field>\n @if (!metadata.required(entity)) {\n <mat-option>-</mat-option>\n }\n @if (shouldDisplayCurrentObjectDropdownValue) {\n <mat-option [value]=\"currentObjectDropdownValue?.value\">{{currentObjectDropdownValue?.displayName}}</mat-option>\n }\n @for (value of filteredObjectDropdownValues; track $index) {\n <mat-option [value]=\"value.value\">{{value.displayName}}</mat-option>\n }\n </mat-select>\n <mat-error>{{internalGetValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n }\n <!-------------------------------------------->\n <!-------------- references one -------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.REFERENCES_ONE) {\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select #inputModel=\"ngModel\"\n [name]=\"referencesOneName\"\n [disabled]=\"internalIsReadOnly\"\n [required]=\"metadata.required(entity)\"\n [(ngModel)]=\"entity[propertyKey]\"\n (selectionChange)=\"setReferencesOneObject()\"\n (opened)=\"selectSearchInput.focus()\"\n >\n <mat-form-field class=\"select-search-input\">\n <!-- eslint-disable-next-line angular/no-any -->\n <input #selectSearchInput matInput (keyup)=\"filterReferencesOneValues($any($event.target).value)\">\n <i matSuffix class=\"fas fa-search\"></i>\n </mat-form-field>\n @if (!metadata.required(entity)) {\n <mat-option>-</mat-option>\n }\n @if (shouldDisplayCurrentReferencesOneDropdownValue) {\n <mat-option [value]=\"currentReferencesOneDropdownValue?.value\">{{currentReferencesOneDropdownValue?.displayName}}</mat-option>\n }\n @for (value of filteredReferencesOneDropdownValues; track $index) {\n <mat-option [value]=\"value.value\">{{value.displayName}}</mat-option>\n }\n </mat-select>\n <mat-error>{{internalGetValidationErrorMessage(inputModel)}}</mat-error>\n </mat-form-field>\n <!-- iterates over the references one properties -->\n @if (referencesOneFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: referencesOneFormContext\"></ng-container>\n }\n }\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.ARRAY) {\n <div class=\"entityArray\">\n <div class=\"mat-elevation-z8 elevation-container\">\n <div class=\"array-headline\">\n <b>{{metadataEntityArray.displayName}}</b>\n </div>\n @if (metadataEntityArray.createInline && !internalIsReadOnly && addArrayItemFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: addArrayItemFormContext\"></ng-container>\n }\n @if (!internalIsReadOnly && entityArrayTableContext) {\n <div class=\"buttons\">\n <button type=\"button\" mat-raised-button\n [disabled]=\"metadataEntityArray.createInline && !isArrayItemValid\"\n (click)=\"addEntity()\">\n {{metadataEntityArray.addButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button\n [disabled]=\"!entityArrayTableContext.$implicit.selection.selected.length\"\n (click)=\"removeFromEntityArray()\">\n {{metadataEntityArray.removeButtonLabel}}\n </button>\n </div>\n }\n @if (entityArrayTableContext) {\n <ng-container *ngTemplateOutlet=\"table; context: entityArrayTableContext\"></ng-container>\n }\n </div>\n </div>\n }\n <!-------------------------------------------->\n <!------------------ has many ---------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.HAS_MANY) {\n <div class=\"hasMany\">\n <h2 class=\"title\">{{metadataHasMany.tableData.baseData.title}}</h2>\n <div class=\"row\">\n <mat-form-field class=\"col-lg-8 col-md-6 col-sm-12\">\n <mat-label>{{metadataHasMany.tableData.baseData.searchLabel}}</mat-label>\n <input matInput (keyup)=\"applyHasManyFilter($event)\">\n </mat-form-field>\n @if (metadataHasMany.tableData.baseData.tableActions.length) {\n <div\n [class.col-lg-2]=\"hasManyAllowCreate\"\n [class.col-lg-4]=\"!hasManyAllowCreate\"\n [class.col-md-3]=\"hasManyAllowCreate\"\n [class.col-md-6]=\"!hasManyAllowCreate\"\n [class.col-sm-6]=\"hasManyAllowCreate\"\n [class.col-sm-12]=\"!hasManyAllowCreate\"\n >\n <button type=\"button\" class=\"actions-button\" mat-raised-button [matMenuTriggerFor]=\"menu\">\n {{metadataHasMany.tableData.baseData.tableActionsLabel}}\n </button>\n </div>\n }\n <mat-menu #menu=\"matMenu\">\n @if (metadataHasMany.tableData.baseData.allowJsonImport) {\n <button type=\"button\" mat-menu-item [disabled]=\"hasManyTableActionDisabled(hasManyImportAction)\" (click)=\"runHasManyTableAction(hasManyImportAction)\">\n {{hasManyImportAction.displayName}}\n </button>\n }\n @for (action of metadataHasMany.tableData.baseData.tableActions; track $index) {\n <button type=\"button\" mat-menu-item [disabled]=\"hasManyTableActionDisabled(action)\" (click)=\"runHasManyTableAction(action)\">\n {{action.displayName}}\n </button>\n }\n </mat-menu>\n @if (hasManyAllowCreate) {\n <div\n [class.col-lg-2]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-lg-4]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-md-3]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-md-6]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-sm-6]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-sm-12]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n >\n <button type=\"button\" class=\"create-button\" mat-raised-button (click)=\"createHasManyEntity()\">\n {{metadataHasMany.tableData.baseData.createButtonLabel}}\n </button>\n </div>\n }\n </div>\n \n <div class=\"mat-elevation-z8 elevation-container\">\n @if (hasManyTableContext) {\n <ng-container *ngTemplateOutlet=\"table; context: hasManyTableContext\"></ng-container>\n }\n </div>\n </div>\n }\n \n @default {\n <div>ERROR: The type {{type}} is not known.</div>\n }\n }\n}\n\n\n<ng-template #table let-context>\n <mat-table matSort [dataSource]=\"context.dataSource\" [class.table-with-error-slot]=\"context.shouldShowMissingError\">\n <!-- select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox [checked]=\"context.selection.hasValue() && SelectionUtilities.isAllSelected(context.selection, context.dataSource)\"\n [indeterminate]=\"context.selection.hasValue() && !SelectionUtilities.isAllSelected(context.selection, context.dataSource)\"\n (change)=\"$event ? SelectionUtilities.masterToggle(context.selection, context.dataSource) : null\">\n </mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let value\" [dynamicStyleClasses]=\"context.dynamicRowStyleClasses\" [value]=\"value\">\n <mat-checkbox [checked]=\"context.selection.isSelected(value)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? context.selection.toggle(value) : null\">\n </mat-checkbox>\n </mat-cell>\n </ng-container>\n\n @for (dCol of context.displayColumns; track $index) {\n <ng-container [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell *matCellDef=\"let value\" [class.enabled]=\"!dCol.disableClick && context.allowClick(value)\"\n [dynamicStyleClasses]=\"context.dynamicRowStyleClasses\" [value]=\"value\"\n (click)=\"clickCell(value, dCol, context)\"\n >\n @if (dCol.Component) {\n <display-column-value [entity]=\"value\" [ComponentClass]=\"dCol.Component\"></display-column-value>\n }\n @else {\n {{getDisplayColumnValue(value, dCol)}}\n }\n </mat-cell>\n </ng-container>\n }\n\n <mat-header-row *matHeaderRowDef=\"context.displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: context.displayedColumns\"></mat-row>\n </mat-table>\n\n @if (context.displayLoadingSpinner && context.isLoading) {\n <mat-spinner>\n </mat-spinner>\n }\n @else if (context.shouldShowMissingError && !context.dataSource.data.length) {\n <div class=\"table-error\">{{context.emptyErrorMessage}}</div>\n }\n\n <mat-paginator [length]=\"context.dataSource.filteredData.length\" [pageIndex]=\"0\" [pageSize]=\"10\" [pageSizeOptions]=\"[5, 10, 25, 50]\"></mat-paginator>\n</ng-template>\n\n<!--------------------------------------------------------->\n<!---------------------------Form-------------------------->\n<!--------------------------------------------------------->\n<ng-template #form let-context>\n <!-- eslint-disable angular/no-call-expression -->\n @if (context.tabs.length > 1) {\n <mat-tab-group preserveContent>\n @for (tab of context.tabs; track $index) {\n <mat-tab [label]=\"tab.tabName\">\n @for (row of tab.rows; track $index) {\n <div class=\"row\">\n @for (key of row.keys; track key) {\n <ngx-mat-entity-input\n [entity]=\"context.entity\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [validEmpty]=\"context.validEmpty?.()\"\n [isReadOnly]=\"context.isReadOnly?.(context.entity, key)\"\n [class]=\"EntityUtilities.getWidthClasses(context.entity, key)\"\n [hideOmitForEdit]=\"context.hideOmitForEdit\"\n [hideOmitForCreate]=\"context.hideOmitForCreate\"\n (inputChangeEvent)=\"context.inputChangeEvent()\"\n >\n </ngx-mat-entity-input>\n }\n </div>\n }\n </mat-tab>\n }\n </mat-tab-group>\n }\n @else {\n @if (!context.tabs.length) {\n <span class=\"no-entity-tabs\">\n ERROR: No Inputs. Did you correctly assign all values in the model constructor?\n </span>\n }\n @else {\n @for (row of context.tabs[0].rows; track $index) {\n <div class=\"row\">\n @for (key of row.keys; track key) {\n <ngx-mat-entity-input\n [entity]=\"context.entity\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [validEmpty]=\"context.validEmpty?.()\"\n [isReadOnly]=\"context.isReadOnly?.(context.entity, key)\"\n [class]=\"EntityUtilities.getWidthClasses(context.entity, key)\"\n [hideOmitForEdit]=\"context.hideOmitForEdit\"\n [hideOmitForCreate]=\"context.hideOmitForCreate\"\n (inputChangeEvent)=\"context.inputChangeEvent()\"\n >\n </ngx-mat-entity-input>\n }\n </div>\n }\n }\n }\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Add Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #addArrayItemDialog>\n <div class=\"mat-dialog-title\">\n <div>{{addArrayItemDialogData.title}}</div>\n </div>\n\n <form>\n <mat-dialog-content>\n @if (addArrayItemFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: addArrayItemFormContext\"></ng-container>\n }\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <div class=\"d-flex align-items-center gap-3\" style=\"margin-top: 10px;\">\n <button type=\"submit\" mat-raised-button matBadgeColor=\"warn\"\n [disabled]=\"!isArrayItemValid\"\n [matBadge]=\"arrayItemValidationErrors.length\"\n [matBadgeHidden]=\"!arrayItemValidationErrors.length\"\n (click)=\"addArrayItem()\"\n >\n {{addArrayItemDialogData.createButtonLabel}}\n </button>\n @if (arrayItemValidationErrors.length) {\n <ngx-mat-entity-tooltip [tooltipContent]=\"arrayItemTooltipContent\"></ngx-mat-entity-tooltip>\n }\n </div>\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"closeAddArrayItemDialog()\">\n {{addArrayItemDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Edit Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #editArrayItemDialog>\n <div class=\"mat-dialog-title\">\n <div>{{editArrayItemDialogData.title(arrayItemPriorChanges)}}</div>\n </div>\n \n <form>\n <mat-dialog-content>\n @if (editArrayItemFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: editArrayItemFormContext\"></ng-container>\n }\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <div class=\"d-flex align-items-center gap-3\" style=\"margin-top: 10px;\">\n <button type=\"submit\" mat-raised-button matBadgeColor=\"warn\"\n [class.badge-changes]=\"!arrayItemValidationErrors.length\"\n [disabled]=\"internalIsReadOnly || !isArrayItemValid || !isArrayItemDirty\"\n [matBadge]=\"arrayItemValidationErrors.length > 0 ? arrayItemValidationErrors.length : arrayItemChanges.length\"\n [matBadgeHidden]=\"!arrayItemValidationErrors.length && !arrayItemChanges.length\"\n (click)=\"saveArrayItem()\"\n >\n {{editArrayItemDialogData.confirmButtonLabel}}\n </button>\n @if (arrayItemValidationErrors.length || arrayItemChanges.length) {\n <ngx-mat-entity-tooltip [tooltipContent]=\"arrayItemTooltipContent\"></ngx-mat-entity-tooltip>\n }\n </div>\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"closeEditArrayItemDialog()\">\n {{editArrayItemDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Create Has Many Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #createHasManyDialog>\n <div class=\"mat-dialog-title\">\n <div>{{metadataHasMany.tableData.createData.title}}</div>\n </div>\n \n <form>\n <mat-dialog-content>\n @if (hasManyCreateFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: hasManyCreateFormContext\"></ng-container>\n }\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <div class=\"d-flex align-items-center gap-3\" style=\"margin-top: 10px;\">\n <button type=\"submit\" mat-raised-button matBadgeColor=\"warn\"\n [disabled]=\"!isHasManyEntityValid\"\n [matBadge]=\"hasManyValidationErrors.length\"\n [matBadgeHidden]=\"!hasManyValidationErrors.length\"\n (click)=\"dialogCreateHasMany()\"\n >\n {{metadataHasMany.tableData.createData.createButtonLabel}}\n </button>\n @if (hasManyValidationErrors.length) {\n <ngx-mat-entity-tooltip [tooltipContent]=\"hasManyTooltipContent\"></ngx-mat-entity-tooltip>\n }\n </div>\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"dialogCancelCreateHasMany()\">\n {{metadataHasMany.tableData.createData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n \n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Edit Has Many Dialog----------------->\n<!--------------------------------------------------------->\n<ng-template #editHasManyDialog>\n <div class=\"mat-dialog-title\">\n <div>{{metadataHasMany.tableData.editData.title(hasManyEntityPriorChanges)}}</div>\n\n <div class=\"actions-container\">\n @if (metadataHasMany.tableData.editData.actions.length) {\n <button type=\"button\" mat-raised-button [matMenuTriggerFor]=\"menu\">\n {{metadataHasMany.tableData.editData.actionsLabel}}\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (action of metadataHasMany.tableData.editData.actions; track $index) {\n <button type=\"button\" mat-menu-item [disabled]=\"hasManyEditActionDisabled(action)\" (click)=\"hasManyRunEditAction(action)\">\n {{action.displayName}}\n </button>\n }\n </mat-menu>\n \n @if (hasManyAllowDelete(hasManyEntity)) {\n <button type=\"button\" mat-raised-button color=\"warn\" class=\"delete-button\" tabindex=\"-1\" (click)=\"deleteHasManyEntity()\">\n {{metadataHasMany.tableData.editData.deleteButtonLabel}}\n </button>\n }\n </div>\n </div>\n \n <form>\n <mat-dialog-content>\n @if (hasManyEditFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: hasManyEditFormContext\"></ng-container>\n }\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <div class=\"d-flex align-items-center gap-3\" style=\"margin-top: 10px;\">\n <button type=\"submit\" mat-raised-button matBadgeColor=\"warn\"\n [class.badge-changes]=\"!hasManyValidationErrors.length\"\n [disabled]=\"internalIsReadOnly || !isHasManyEntityValid || !isHasManyEntityDirty\"\n [matBadge]=\"hasManyValidationErrors.length > 0 ? hasManyValidationErrors.length : hasManyChanges.length\"\n [matBadgeHidden]=\"!hasManyValidationErrors.length && !hasManyChanges.length\"\n (click)=\"dialogEditHasMany()\"\n >\n {{metadataHasMany.tableData.editData.confirmButtonLabel}}\n </button>\n @if (hasManyValidationErrors.length || hasManyChanges.length) {\n <ngx-mat-entity-tooltip [tooltipContent]=\"hasManyTooltipContent\"></ngx-mat-entity-tooltip>\n }\n </div>\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"dialogCancelEditHasMany()\">\n {{metadataHasMany.tableData.editData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n</ng-template>", styles: ["::ng-deep mat-tab-body{padding-top:10px;padding-left:12px;padding-right:12px}::ng-deep mat-tab-body .mat-mdc-tab-body-content{overflow:initial}::ng-deep .mat-mdc-tab-body-wrapper{margin-left:-12px;margin-right:-12px}::ng-deep .mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-right:16px}::ng-deep .select-search-input{width:100%;margin-top:-8px;margin-bottom:8px}::ng-deep .select-search-input .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .mat-mdc-form-field.mat-form-field-disabled label{color:#0009}::ng-deep .mat-mdc-form-field.mat-form-field-disabled input,::ng-deep .mat-mdc-form-field.mat-form-field-disabled textarea,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-disabled,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-value{color:#000!important}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:not(:checked):not(:indeterminate):not([data-indeterminate=true])~.mdc-checkbox__background{border-color:#707070}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:checked~.mdc-checkbox__background,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:indeterminate~.mdc-checkbox__background,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[data-indeterminate=true][disabled]~.mdc-checkbox__background{background-color:#000}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-chip.mat-mdc-standard-chip.mat-mdc-chip-disabled{opacity:1}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-chip.mat-mdc-standard-chip.mat-mdc-chip-disabled button{opacity:.2}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__icons,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__icons{opacity:1}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__handle:after,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__handle:after{opacity:1;background:#000}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__track,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__track{opacity:.3}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-date-range-input-inner:disabled{color:#000}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled{opacity:1}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled .mdc-slider__input{cursor:default}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mat-mdc-slider,::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mdc-slider__thumb:hover,::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mdc-slider__thumb-knob{background-color:#000;border-color:#000}::ng-deep .mat-mdc-form-field .mat-mdc-slide-toggle{opacity:1}::ng-deep .badge-changes .mat-badge-content{background-color:orange;color:#fff}mat-spinner{margin:10px auto}.mdc-data-table__row:last-child .mdc-data-table__cell{border-bottom:1px solid rgba(0,0,0,.12)}mat-paginator{padding-top:10px;padding-bottom:10px}.actions-container{display:flex;gap:10px}.object-dropdown{width:100%}.table-with-error-slot{border:1px solid #E0E0E0;border-radius:5px;padding-top:5px;padding-bottom:5px}.mat-column-select{flex:0 0 48px;padding-left:0;padding-right:0;justify-content:center}.enabled:hover{cursor:pointer}.table-error{display:flex;align-items:center;justify-content:center;margin-top:-6px;border:1px solid #E0E0E0;background-color:#f8d3d7;color:#721c24;height:fit-content;padding-left:4px;padding-right:4px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.entityArray .elevation-container{border-radius:5px;padding:15px 15px 0;margin-bottom:15px;margin-top:15px}.entityArray .array-headline{padding-bottom:10px}.entityArray .buttons{display:flex;justify-content:space-between;margin-bottom:10px;margin-top:5px;flex-wrap:wrap;gap:10px}.entityArray .buttons button{flex-grow:1}.hasMany button{width:100%;height:56px;line-height:24px;font-size:16px}.hasMany .title{text-align:center}.hasMany .elevation-container{margin-bottom:15px}\n", "::ng-deep .mdc-dialog .mdc-dialog__content{padding:6px 20px!important}mat-dialog-actions{justify-content:space-between;align-items:center;padding-left:20px;padding-right:20px}.mat-dialog-title{padding:12px 20px;display:flex;justify-content:space-between;align-items:center}.mat-dialog-title div{font-size:var(--mdc-dialog-subhead-size, 14px);font-weight:var(--mdc-dialog-subhead-weight, 500)}\n"] }]
|
|
1263
|
+
MatSortModule,
|
|
1264
|
+
FaIconComponent
|
|
1265
|
+
], template: "<!-- eslint-disable angular/no-call-expression -->\n \n@if(!(hideOmitForCreate && metadata.omitForCreate) && !(hideOmitForEdit && metadata.omitForUpdate)) {\n @switch (type) {\n <!-------------------------------------------->\n <!-----------------Strings-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.STRING) {\n <string-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-input>\n }\n @case (DecoratorTypes.STRING_TEXTBOX) {\n <string-textbox-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-textbox-input>\n }\n @case (DecoratorTypes.STRING_AUTOCOMPLETE) {\n <string-autocomplete-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-autocomplete-input>\n }\n @case (DecoratorTypes.STRING_DROPDOWN) {\n <string-dropdown-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-dropdown-input>\n }\n @case (DecoratorTypes.STRING_PASSWORD) {\n <string-password-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </string-password-input>\n }\n <!-------------------------------------------->\n <!-----------------Booleans------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.BOOLEAN_CHECKBOX) {\n <boolean-checkbox-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </boolean-checkbox-input>\n }\n @case (DecoratorTypes.BOOLEAN_TOGGLE) {\n <boolean-toggle-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </boolean-toggle-input>\n }\n @case (DecoratorTypes.BOOLEAN_DROPDOWN) {\n <boolean-dropdown-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </boolean-dropdown-input>\n }\n <!-------------------------------------------->\n <!------------------Numbers------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.NUMBER) {\n <number-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </number-input>\n }\n @case (DecoratorTypes.NUMBER_DROPDOWN) {\n <number-dropdown-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </number-dropdown-input>\n }\n @case (DecoratorTypes.NUMBER_SLIDER) {\n <number-slider-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </number-slider-input>\n }\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.ARRAY_DATE) {\n <array-date-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-date-input>\n }\n @case (DecoratorTypes.ARRAY_DATE_TIME) {\n <array-date-time-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-date-time-input>\n }\n @case (DecoratorTypes.ARRAY_DATE_RANGE) {\n <array-date-range-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-date-range-input>\n }\n @case (DecoratorTypes.ARRAY_STRING_CHIPS) {\n <array-string-chips-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-string-chips-input>\n }\n @case (DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS) {\n <array-string-autocomplete-chips\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </array-string-autocomplete-chips>\n }\n <!-------------------------------------------->\n <!-------------------Dates-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.DATE) {\n <date-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </date-input>\n }\n @case (DecoratorTypes.DATE_RANGE) {\n <date-range-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </date-range-input>\n }\n @case (DecoratorTypes.DATE_TIME) {\n <date-time-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </date-time-input>\n }\n <!-------------------------------------------->\n <!-------------------Files-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.FILE_DEFAULT) {\n <file-default-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </file-default-input>\n }\n @case (DecoratorTypes.FILE_IMAGE) {\n <file-image-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </file-image-input>\n }\n <!-------------------------------------------->\n <!-------------- references many ------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.REFERENCES_MANY) {\n <references-many-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </references-many-input>\n }\n <!-------------------------------------------->\n <!-------------------Custom------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.CUSTOM) {\n <custom-input\n [entity]=\"entity\"\n [key]=\"propertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </custom-input>\n }\n <!-------------------------------------------->\n <!-------------------Object------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.OBJECT) {\n <b>{{metadataDefaultObject.displayName}}</b>\n <!-- iterates over the object properties -->\n <ng-container *ngTemplateOutlet=\"form; context: objectFormContext\"></ng-container>\n }\n <!-------------------------------------------->\n <!---------------Object Dropdown-------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.OBJECT_DROPDOWN) {\n <mat-form-field class=\"object-dropdown\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select #model=\"ngModel\"\n [name]=\"objectDropdownName\"\n [required]=\"metadata.required(entity)\"\n [disabled]=\"internalIsReadOnly\"\n [compareWith]=\"compareObjectsBound\"\n [(ngModel)]=\"entity[propertyKey]\"\n (selectionChange)=\"emitChange()\"\n (opened)=\"selectSearchInput.focus()\"\n >\n <mat-form-field class=\"select-search-input\">\n <!-- eslint-disable-next-line angular/no-any -->\n <input #selectSearchInput matInput (keyup)=\"filterObjectDropdownValues($any($event.target).value)\">\n <fa-icon matSuffix [icon]=\"faSearch\"></fa-icon>\n </mat-form-field>\n @if (!metadata.required(entity)) {\n <mat-option>-</mat-option>\n }\n @if (shouldDisplayCurrentObjectDropdownValue) {\n <mat-option [value]=\"currentObjectDropdownValue?.value\">{{currentObjectDropdownValue?.displayName}}</mat-option>\n }\n @for (value of filteredObjectDropdownValues; track $index) {\n <mat-option [value]=\"value.value\">{{value.displayName}}</mat-option>\n }\n </mat-select>\n <mat-error>{{internalGetValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n }\n <!-------------------------------------------->\n <!-------------- references one -------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.REFERENCES_ONE) {\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select #inputModel=\"ngModel\"\n [name]=\"referencesOneName\"\n [disabled]=\"internalIsReadOnly\"\n [required]=\"metadata.required(entity)\"\n [(ngModel)]=\"entity[propertyKey]\"\n (selectionChange)=\"setReferencesOneObject()\"\n (opened)=\"selectSearchInput.focus()\"\n >\n <mat-form-field class=\"select-search-input\">\n <!-- eslint-disable-next-line angular/no-any -->\n <input #selectSearchInput matInput (keyup)=\"filterReferencesOneValues($any($event.target).value)\">\n <fa-icon matSuffix [icon]=\"faSearch\"></fa-icon>\n </mat-form-field>\n @if (!metadata.required(entity)) {\n <mat-option>-</mat-option>\n }\n @if (shouldDisplayCurrentReferencesOneDropdownValue) {\n <mat-option [value]=\"currentReferencesOneDropdownValue?.value\">{{currentReferencesOneDropdownValue?.displayName}}</mat-option>\n }\n @for (value of filteredReferencesOneDropdownValues; track $index) {\n <mat-option [value]=\"value.value\">{{value.displayName}}</mat-option>\n }\n </mat-select>\n <mat-error>{{internalGetValidationErrorMessage(inputModel)}}</mat-error>\n </mat-form-field>\n <!-- iterates over the references one properties -->\n @if (referencesOneFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: referencesOneFormContext\"></ng-container>\n }\n }\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.ARRAY) {\n <div class=\"entityArray\">\n <div class=\"mat-elevation-z8 elevation-container\">\n <div class=\"array-headline\">\n <b>{{metadataEntityArray.displayName}}</b>\n </div>\n @if (metadataEntityArray.createInline && !internalIsReadOnly && addArrayItemFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: addArrayItemFormContext\"></ng-container>\n }\n @if (!internalIsReadOnly && entityArrayTableContext) {\n <div class=\"buttons\">\n <button type=\"button\" mat-raised-button\n [disabled]=\"metadataEntityArray.createInline && !isArrayItemValid\"\n (click)=\"addEntity()\">\n {{metadataEntityArray.addButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button\n [disabled]=\"!entityArrayTableContext.$implicit.selection.selected.length\"\n (click)=\"removeFromEntityArray()\">\n {{metadataEntityArray.removeButtonLabel}}\n </button>\n </div>\n }\n @if (entityArrayTableContext) {\n <ng-container *ngTemplateOutlet=\"table; context: entityArrayTableContext\"></ng-container>\n }\n </div>\n </div>\n }\n <!-------------------------------------------->\n <!------------------ has many ---------------->\n <!-------------------------------------------->\n @case (DecoratorTypes.HAS_MANY) {\n <div class=\"hasMany\">\n <h2 class=\"title\">{{metadataHasMany.tableData.baseData.title}}</h2>\n <div class=\"grid grid-cols-12\" style=\"column-gap: 24px;\">\n <mat-form-field class=\"lg:col-span-8 md:col-span-6 col-span-12\">\n <mat-label>{{metadataHasMany.tableData.baseData.searchLabel}}</mat-label>\n <input matInput (keyup)=\"applyHasManyFilter($event)\">\n </mat-form-field>\n @if (metadataHasMany.tableData.baseData.tableActions.length) {\n <div\n [class.lg:col-span-2]=\"hasManyAllowCreate\"\n [class.lg:col-span-4]=\"!hasManyAllowCreate\"\n [class.md:col-span-3]=\"hasManyAllowCreate\"\n [class.md:col-span-6]=\"!hasManyAllowCreate\"\n [class.col-span-6]=\"hasManyAllowCreate\"\n [class.col-span-12]=\"!hasManyAllowCreate\"\n >\n <button type=\"button\" class=\"actions-button\" mat-raised-button [matMenuTriggerFor]=\"menu\">\n {{metadataHasMany.tableData.baseData.tableActionsLabel}}\n </button>\n </div>\n }\n <mat-menu #menu=\"matMenu\">\n @if (metadataHasMany.tableData.baseData.allowJsonImport) {\n <button type=\"button\" mat-menu-item [disabled]=\"hasManyTableActionDisabled(hasManyImportAction)\" (click)=\"runHasManyTableAction(hasManyImportAction)\">\n {{hasManyImportAction.displayName}}\n </button>\n }\n @for (action of metadataHasMany.tableData.baseData.tableActions; track $index) {\n <button type=\"button\" mat-menu-item [disabled]=\"hasManyTableActionDisabled(action)\" (click)=\"runHasManyTableAction(action)\">\n {{action.displayName}}\n </button>\n }\n </mat-menu>\n @if (hasManyAllowCreate) {\n <div\n [class.lg:col-span-2]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.lg:col-span-4]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n [class.md:col-span-3]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.md:col-span-6]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-span-6]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-span-12]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n >\n <button type=\"button\" class=\"create-button\" mat-raised-button (click)=\"createHasManyEntity()\">\n {{metadataHasMany.tableData.baseData.createButtonLabel}}\n </button>\n </div>\n }\n </div>\n \n <div class=\"mat-elevation-z8 elevation-container\">\n @if (hasManyTableContext) {\n <ng-container *ngTemplateOutlet=\"table; context: hasManyTableContext\"></ng-container>\n }\n </div>\n </div>\n }\n \n @default {\n <div>ERROR: The type {{type}} is not known.</div>\n }\n }\n}\n\n\n<ng-template #table let-context>\n <mat-table matSort [dataSource]=\"context.dataSource\" [class.table-with-error-slot]=\"context.shouldShowMissingError\">\n <!-- select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox [checked]=\"context.selection.hasValue() && SelectionUtilities.isAllSelected(context.selection, context.dataSource)\"\n [indeterminate]=\"context.selection.hasValue() && !SelectionUtilities.isAllSelected(context.selection, context.dataSource)\"\n (change)=\"$event ? SelectionUtilities.masterToggle(context.selection, context.dataSource) : null\">\n </mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let value\" [dynamicStyleClasses]=\"context.dynamicRowStyleClasses\" [value]=\"value\">\n <mat-checkbox [checked]=\"context.selection.isSelected(value)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? context.selection.toggle(value) : null\">\n </mat-checkbox>\n </mat-cell>\n </ng-container>\n\n @for (dCol of context.displayColumns; track $index) {\n <ng-container [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell *matCellDef=\"let value\" [class.enabled]=\"!dCol.disableClick && context.allowClick(value)\"\n [dynamicStyleClasses]=\"context.dynamicRowStyleClasses\" [value]=\"value\"\n (click)=\"clickCell(value, dCol, context)\"\n >\n @if (dCol.Component) {\n <display-column-value [entity]=\"value\" [ComponentClass]=\"dCol.Component\"></display-column-value>\n }\n @else {\n {{getDisplayColumnValue(value, dCol)}}\n }\n </mat-cell>\n </ng-container>\n }\n\n <mat-header-row *matHeaderRowDef=\"context.displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: context.displayedColumns\"></mat-row>\n </mat-table>\n\n @if (context.displayLoadingSpinner && context.isLoading) {\n <mat-spinner>\n </mat-spinner>\n }\n @else if (context.shouldShowMissingError && !context.dataSource.data.length) {\n <div class=\"table-error\">{{context.emptyErrorMessage}}</div>\n }\n\n <mat-paginator [length]=\"context.dataSource.filteredData.length\" [pageIndex]=\"0\" [pageSize]=\"10\" [pageSizeOptions]=\"[5, 10, 25, 50]\"></mat-paginator>\n</ng-template>\n\n<!--------------------------------------------------------->\n<!---------------------------Form-------------------------->\n<!--------------------------------------------------------->\n<ng-template #form let-context>\n <!-- eslint-disable angular/no-call-expression -->\n @if (context.tabs.length > 1) {\n <mat-tab-group preserveContent>\n @for (tab of context.tabs; track $index) {\n <mat-tab [label]=\"tab.tabName\">\n @for (row of tab.rows; track $index) {\n <div class=\"grid grid-cols-12\" style=\"column-gap: 24px;\">\n @for (key of row.keys; track key) {\n <ngx-mat-entity-input\n [entity]=\"context.entity\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [validEmpty]=\"context.validEmpty?.()\"\n [isReadOnly]=\"context.isReadOnly?.(context.entity, key)\"\n [class]=\"EntityUtilities.getWidthClasses(context.entity, key)\"\n [hideOmitForEdit]=\"context.hideOmitForEdit\"\n [hideOmitForCreate]=\"context.hideOmitForCreate\"\n (inputChangeEvent)=\"context.inputChangeEvent()\"\n >\n </ngx-mat-entity-input>\n }\n </div>\n }\n </mat-tab>\n }\n </mat-tab-group>\n }\n @else {\n @if (!context.tabs.length) {\n <span class=\"no-entity-tabs\">\n ERROR: No Inputs. Did you correctly assign all values in the model constructor?\n </span>\n }\n @else {\n @for (row of context.tabs[0].rows; track $index) {\n <div class=\"grid grid-cols-12\" style=\"column-gap: 24px;\">\n @for (key of row.keys; track key) {\n <ngx-mat-entity-input\n [entity]=\"context.entity\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [validEmpty]=\"context.validEmpty?.()\"\n [isReadOnly]=\"context.isReadOnly?.(context.entity, key)\"\n [class]=\"EntityUtilities.getWidthClasses(context.entity, key)\"\n [hideOmitForEdit]=\"context.hideOmitForEdit\"\n [hideOmitForCreate]=\"context.hideOmitForCreate\"\n (inputChangeEvent)=\"context.inputChangeEvent()\"\n >\n </ngx-mat-entity-input>\n }\n </div>\n }\n }\n }\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Add Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #addArrayItemDialog>\n <div class=\"mat-dialog-title\">\n <div>{{addArrayItemDialogData.title}}</div>\n </div>\n\n <form (ngSubmit)=\"addArrayItem()\">\n <mat-dialog-content>\n @if (addArrayItemFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: addArrayItemFormContext\"></ng-container>\n }\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <div class=\"dialog-button-with-info-icon\">\n <button type=\"submit\" mat-raised-button matBadgeColor=\"warn\"\n [disabled]=\"!isArrayItemValid\"\n [matBadge]=\"arrayItemValidationErrors.length\"\n [matBadgeHidden]=\"!arrayItemValidationErrors.length\"\n >\n {{addArrayItemDialogData.createButtonLabel}}\n </button>\n @if (arrayItemValidationErrors.length) {\n <ngx-mat-entity-tooltip [tooltipContent]=\"arrayItemTooltipContent\"></ngx-mat-entity-tooltip>\n }\n </div>\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"closeAddArrayItemDialog()\">\n {{addArrayItemDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Edit Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #editArrayItemDialog>\n <div class=\"mat-dialog-title\">\n <div>{{editArrayItemDialogData.title(arrayItemPriorChanges)}}</div>\n </div>\n \n <form (ngSubmit)=\"saveArrayItem()\">\n <mat-dialog-content>\n @if (editArrayItemFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: editArrayItemFormContext\"></ng-container>\n }\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <div class=\"dialog-button-with-info-icon\">\n <button type=\"submit\" mat-raised-button matBadgeColor=\"warn\"\n [class.badge-changes]=\"!arrayItemValidationErrors.length\"\n [disabled]=\"internalIsReadOnly || !isArrayItemValid || !isArrayItemDirty\"\n [matBadge]=\"arrayItemValidationErrors.length > 0 ? arrayItemValidationErrors.length : arrayItemChanges.length\"\n [matBadgeHidden]=\"!arrayItemValidationErrors.length && !arrayItemChanges.length\"\n >\n {{editArrayItemDialogData.confirmButtonLabel}}\n </button>\n @if (arrayItemValidationErrors.length || arrayItemChanges.length) {\n <ngx-mat-entity-tooltip [tooltipContent]=\"arrayItemTooltipContent\"></ngx-mat-entity-tooltip>\n }\n </div>\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"closeEditArrayItemDialog()\">\n {{editArrayItemDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Create Has Many Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #createHasManyDialog>\n <div class=\"mat-dialog-title\">\n <div>{{metadataHasMany.tableData.createData.title}}</div>\n </div>\n \n <form (ngSubmit)=\"dialogCreateHasMany()\">\n <mat-dialog-content>\n @if (hasManyCreateFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: hasManyCreateFormContext\"></ng-container>\n }\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <div class=\"dialog-button-with-info-icon\">\n <button type=\"submit\" mat-raised-button matBadgeColor=\"warn\"\n [disabled]=\"!isHasManyEntityValid\"\n [matBadge]=\"hasManyValidationErrors.length\"\n [matBadgeHidden]=\"!hasManyValidationErrors.length\"\n >\n {{metadataHasMany.tableData.createData.createButtonLabel}}\n </button>\n @if (hasManyValidationErrors.length) {\n <ngx-mat-entity-tooltip [tooltipContent]=\"hasManyTooltipContent\"></ngx-mat-entity-tooltip>\n }\n </div>\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"dialogCancelCreateHasMany()\">\n {{metadataHasMany.tableData.createData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n \n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Edit Has Many Dialog----------------->\n<!--------------------------------------------------------->\n<ng-template #editHasManyDialog>\n <div class=\"mat-dialog-title\">\n <div>{{metadataHasMany.tableData.editData.title(hasManyEntityPriorChanges)}}</div>\n\n <div class=\"actions-container\">\n @if (metadataHasMany.tableData.editData.actions.length) {\n <button type=\"button\" mat-raised-button [matMenuTriggerFor]=\"menu\">\n {{metadataHasMany.tableData.editData.actionsLabel}}\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (action of metadataHasMany.tableData.editData.actions; track $index) {\n <button type=\"button\" mat-menu-item [disabled]=\"hasManyEditActionDisabled(action)\" (click)=\"hasManyRunEditAction(action)\">\n {{action.displayName}}\n </button>\n }\n </mat-menu>\n \n @if (hasManyAllowDelete(hasManyEntity)) {\n <button type=\"button\" mat-raised-button color=\"warn\" class=\"delete-button\" tabindex=\"-1\" (click)=\"deleteHasManyEntity()\">\n {{metadataHasMany.tableData.editData.deleteButtonLabel}}\n </button>\n }\n </div>\n </div>\n \n <form (ngSubmit)=\"dialogEditHasMany()\">\n <mat-dialog-content>\n @if (hasManyEditFormContext) {\n <ng-container *ngTemplateOutlet=\"form; context: hasManyEditFormContext\"></ng-container>\n }\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <div class=\"dialog-button-with-info-icon\">\n <button type=\"submit\" mat-raised-button matBadgeColor=\"warn\"\n [class.badge-changes]=\"!hasManyValidationErrors.length\"\n [disabled]=\"internalIsReadOnly || !isHasManyEntityValid || !isHasManyEntityDirty\"\n [matBadge]=\"hasManyValidationErrors.length > 0 ? hasManyValidationErrors.length : hasManyChanges.length\"\n [matBadgeHidden]=\"!hasManyValidationErrors.length && !hasManyChanges.length\"\n >\n {{metadataHasMany.tableData.editData.confirmButtonLabel}}\n </button>\n @if (hasManyValidationErrors.length || hasManyChanges.length) {\n <ngx-mat-entity-tooltip [tooltipContent]=\"hasManyTooltipContent\"></ngx-mat-entity-tooltip>\n }\n </div>\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"dialogCancelEditHasMany()\">\n {{metadataHasMany.tableData.editData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n</ng-template>", styles: ["::ng-deep mat-tab-body{padding-top:10px;padding-left:12px;padding-right:12px}::ng-deep mat-tab-body .mat-mdc-tab-body-content{overflow:initial}::ng-deep .mat-mdc-tab-body-wrapper{margin-left:-12px;margin-right:-12px}::ng-deep .mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-right:16px}::ng-deep .select-search-input{width:100%;margin-top:-8px;margin-bottom:8px}::ng-deep .select-search-input .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .mat-mdc-form-field.mat-form-field-disabled label{color:#0009}::ng-deep .mat-mdc-form-field.mat-form-field-disabled input,::ng-deep .mat-mdc-form-field.mat-form-field-disabled textarea,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-disabled,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-value{color:#000!important}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:not(:checked):not(:indeterminate):not([data-indeterminate=true])~.mdc-checkbox__background{border-color:#707070}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:checked~.mdc-checkbox__background,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:indeterminate~.mdc-checkbox__background,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[data-indeterminate=true][disabled]~.mdc-checkbox__background{background-color:#000}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-chip.mat-mdc-standard-chip.mat-mdc-chip-disabled{opacity:1}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-chip.mat-mdc-standard-chip.mat-mdc-chip-disabled button{opacity:.2}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__icons,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__icons{opacity:1}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__handle:after,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__handle:after{opacity:1;background:#000}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__track,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__track{opacity:.3}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-date-range-input-inner:disabled{color:#000}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled{opacity:1}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled .mdc-slider__input{cursor:default}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mat-mdc-slider,::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mdc-slider__thumb:hover,::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mdc-slider__thumb-knob{background-color:#000;border-color:#000}::ng-deep .mat-mdc-form-field .mat-mdc-slide-toggle{opacity:1}::ng-deep .badge-changes .mat-badge-content{background-color:orange;color:#fff}mat-spinner{margin:10px auto}.mdc-data-table__row:last-child .mdc-data-table__cell{border-bottom:1px solid rgba(0,0,0,.12)}mat-paginator{padding-top:10px;padding-bottom:10px}.dialog-button-with-info-icon{margin-top:10px;gap:12px;display:flex;align-items:center}.actions-container{display:flex;gap:10px}.object-dropdown{width:100%}.table-with-error-slot{border:1px solid #E0E0E0;border-radius:5px;padding-top:5px;padding-bottom:5px}.mat-column-select{flex:0 0 48px;padding-left:0;padding-right:0;justify-content:center}.enabled:hover{cursor:pointer}.table-error{display:flex;align-items:center;justify-content:center;margin-top:-6px;border:1px solid #E0E0E0;background-color:#f8d3d7;color:#721c24;height:fit-content;padding-left:4px;padding-right:4px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.entityArray .elevation-container{border-radius:5px;padding:15px 15px 0;margin-bottom:15px;margin-top:15px}.entityArray .array-headline{padding-bottom:10px}.entityArray .buttons{display:flex;justify-content:space-between;margin-bottom:10px;margin-top:5px;flex-wrap:wrap;gap:10px}.entityArray .buttons button{flex-grow:1}.hasMany button{width:100%;height:56px;line-height:24px;font-size:16px}.hasMany .title{text-align:center}.hasMany .elevation-container{margin-bottom:15px}\n", "::ng-deep .mdc-dialog .mdc-dialog__content{padding:6px 20px!important}mat-dialog-actions{justify-content:space-between;align-items:center;padding-left:20px;padding-right:20px}.mat-dialog-title{padding:12px 20px;display:flex;justify-content:space-between;align-items:center}.mat-dialog-title div{font-size:var(--mdc-dialog-subhead-size, 14px);font-weight:var(--mdc-dialog-subhead-weight, 500)}\n", ".grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid{display:grid}@media (min-width: 1024px){.lg\\:col-span-12{grid-column:span 12/span 12!important}.lg\\:col-span-11{grid-column:span 11/span 11!important}.lg\\:col-span-10{grid-column:span 10/span 10!important}.lg\\:col-span-9{grid-column:span 9/span 9!important}.lg\\:col-span-8{grid-column:span 8/span 8!important}.lg\\:col-span-7{grid-column:span 7/span 7!important}.lg\\:col-span-6{grid-column:span 6/span 6!important}.lg\\:col-span-5{grid-column:span 5/span 5!important}.lg\\:col-span-4{grid-column:span 4/span 4!important}.lg\\:col-span-3{grid-column:span 3/span 3!important}.lg\\:col-span-2{grid-column:span 2/span 2!important}.lg\\:col-span-1{grid-column:span 1/span 1!important}}@media (min-width: 768px) and (max-width: 1023px){.md\\:col-span-12{grid-column:span 12/span 12!important}.md\\:col-span-11{grid-column:span 11/span 11!important}.md\\:col-span-10{grid-column:span 10/span 10!important}.md\\:col-span-9{grid-column:span 9/span 9!important}.md\\:col-span-8{grid-column:span 8/span 8!important}.md\\:col-span-7{grid-column:span 7/span 7!important}.md\\:col-span-6{grid-column:span 6/span 6!important}.md\\:col-span-5{grid-column:span 5/span 5!important}.md\\:col-span-4{grid-column:span 4/span 4!important}.md\\:col-span-3{grid-column:span 3/span 3!important}.md\\:col-span-2{grid-column:span 2/span 2!important}.md\\:col-span-1{grid-column:span 1/span 1!important}}.col-span-12{grid-column:span 12/span 12}.col-span-11{grid-column:span 11/span 11}.col-span-10{grid-column:span 10/span 10}.col-span-9{grid-column:span 9/span 9}.col-span-8{grid-column:span 8/span 8}.col-span-7{grid-column:span 7/span 7}.col-span-6{grid-column:span 6/span 6}.col-span-5{grid-column:span 5/span 5}.col-span-4{grid-column:span 4/span 4}.col-span-3{grid-column:span 3/span 3}.col-span-2{grid-column:span 2/span 2}.col-span-1{grid-column:span 1/span 1}\n"] }]
|
|
1255
1266
|
}], ctorParameters: () => [{ type: i1.MatDialog }, { type: i0.EnvironmentInjector }, { type: i2.Router }, { type: undefined, decorators: [{
|
|
1256
1267
|
type: Inject,
|
|
1257
1268
|
args: [NGX_GET_VALIDATION_ERROR_MESSAGE]
|
|
@@ -1292,4 +1303,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImpor
|
|
|
1292
1303
|
type: ViewChild,
|
|
1293
1304
|
args: ['editHasManyDialog']
|
|
1294
1305
|
}] } });
|
|
1295
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9pbnB1dC9pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2lucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25LLE9BQU8sRUFBRSxXQUFXLEVBQVcsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFnQixNQUFNLDBCQUEwQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxF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QjtzQkFEakMsU0FBUzt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENvbXBvbmVudCwgRW52aXJvbm1lbnRJbmplY3RvciwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgaW5qZWN0LCBydW5JbkluamVjdGlvbkNvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBOZ01vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QmFkZ2VNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9iYWRnZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ01vZHVsZSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0U29ydCwgTWF0U29ydE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlLCBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IE1hdFRhYnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBBcnJheURhdGVJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vYXJyYXkvYXJyYXktZGF0ZS1pbnB1dC9hcnJheS1kYXRlLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBcnJheURhdGVSYW5nZUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9hcnJheS9hcnJheS1kYXRlLXJhbmdlLWlucHV0L2FycmF5LWRhdGUtcmFuZ2UtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEFycmF5RGF0ZVRpbWVJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vYXJyYXkvYXJyYXktZGF0ZS10aW1lLWlucHV0L2FycmF5LWRhdGUtdGltZS1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXJyYXlTdHJpbmdBdXRvY29tcGxldGVDaGlwc0NvbXBvbmVudCB9IGZyb20gJy4vYXJyYXkvYXJyYXktc3RyaW5nLWF1dG9jb21wbGV0ZS1jaGlwcy9hcnJheS1zdHJpbmctYXV0b2NvbXBsZXRlLWNoaXBzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBcnJheVN0cmluZ0NoaXBzSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL2FycmF5L2FycmF5LXN0cmluZy1jaGlwcy1pbnB1dC9hcnJheS1zdHJpbmctY2hpcHMtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEJvb2xlYW5DaGVja2JveElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9ib29sZWFuL2Jvb2xlYW4tY2hlY2tib3gtaW5wdXQvYm9vbGVhbi1jaGVja2JveC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQm9vbGVhbkRyb3Bkb3duSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL2Jvb2xlYW4vYm9vbGVhbi1kcm9wZG93bi1pbnB1dC9ib29sZWFuLWRyb3Bkb3duLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCb29sZWFuVG9nZ2xlSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL2Jvb2xlYW4vYm9vbGVhbi10b2dnbGUtaW5wdXQvYm9vbGVhbi10b2dnbGUtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEN1c3RvbUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9jdXN0b20vY3VzdG9tLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRlSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL2RhdGUvZGF0ZS1pbnB1dC9kYXRlLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vZGF0ZS9kYXRlLXJhbmdlLWlucHV0L2RhdGUtcmFuZ2UtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVUaW1lSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL2RhdGUvZGF0ZS10aW1lLWlucHV0L2RhdGUtdGltZS1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRmlsZURlZmF1bHRJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vZmlsZS9maWxlLWRlZmF1bHQtaW5wdXQvZmlsZS1kZWZhdWx0LWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGaWxlSW1hZ2VJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vZmlsZS9maWxlLWltYWdlLWlucHV0L2ZpbGUtaW1hZ2UtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IE51bWJlckRyb3Bkb3duSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL251bWJlci9udW1iZXItZHJvcGRvd24taW5wdXQvbnVtYmVyLWRyb3Bkb3duLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOdW1iZXJJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vbnVtYmVyL251bWJlci1pbnB1dC9udW1iZXItaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IE51bWJlclNsaWRlcklucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9udW1iZXIvbnVtYmVyLXNsaWRlci1pbnB1dC9udW1iZXItc2xpZGVyLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWZlcmVuY2VzTWFueUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9yZWxhdGlvbnMvcmVmZXJlbmNlcy1tYW55LWlucHV0L3JlZmVyZW5jZXMtbWFueS1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3RyaW5nQXV0b2NvbXBsZXRlSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL3N0cmluZy9zdHJpbmctYXV0b2NvbXBsZXRlLWlucHV0L3N0cmluZy1hdXRvY29tcGxldGUtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IFN0cmluZ0Ryb3Bkb3duSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL3N0cmluZy9zdHJpbmctZHJvcGRvd24taW5wdXQvc3RyaW5nLWRyb3Bkb3duLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdHJpbmdJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vc3RyaW5nL3N0cmluZy1pbnB1dC9zdHJpbmctaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IFN0cmluZ1Bhc3N3b3JkSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL3N0cmluZy9zdHJpbmctcGFzc3dvcmQtaW5wdXQvc3RyaW5nLXBhc3N3b3JkLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdHJpbmdUZXh0Ym94SW5wdXRDb21wb25lbnQgfSBmcm9tICcuL3N0cmluZy9zdHJpbmctdGV4dGJveC1pbnB1dC9zdHJpbmctdGV4dGJveC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQmFzZUVudGl0eVR5cGUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBFZGl0QXJyYXlJdGVtRGlhbG9nRGF0YUludGVybmFsLCBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9hcnJheS9hcnJheS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEZWNvcmF0b3JUeXBlcyB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvYmFzZS9kZWNvcmF0b3ItdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBEcm9wZG93blZhbHVlIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9iYXNlL2Ryb3Bkb3duLXZhbHVlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9iYXNlL3Byb3BlcnR5LWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IEhhc01hbnlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvaGFzLW1hbnkvaGFzLW1hbnktZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgRGVmYXVsdE9iamVjdERlY29yYXRvckNvbmZpZ0ludGVybmFsLCBEcm9wZG93bk9iamVjdERlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9vYmplY3Qvb2JqZWN0LWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IFJlZmVyZW5jZXNPbmVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvcmVmZXJlbmNlcy1vbmUvcmVmZXJlbmNlcy1vbmUtZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgRHluYW1pY1N0eWxlQ2xhc3NEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2R5bmFtaWMtc3R5bGUtY2xhc3MuZGlyZWN0aXZlJztcbmltcG9ydCB7IExvZGFzaFV0aWxpdGllcyB9IGZyb20gJy4uLy4uL2VuY2Fwc3VsYXRpb24vbG9kYXNoLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBSZWZsZWN0VXRpbGl0aWVzIH0gZnJvbSAnLi4vLi4vZW5jYXBzdWxhdGlvbi9yZWZsZWN0LnV0aWxpdGllcyc7XG5pbXBvcnQgeyBVVUlEVXRpbGl0aWVzIH0gZnJvbSAnLi4vLi4vZW5jYXBzdWxhdGlvbi91dWlkLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBkZWZhdWx0RmFsc2UgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvZGVmYXVsdC1mYWxzZS5mdW5jdGlvbic7XG5pbXBvcnQgeyBnZXRDaGFuZ2VzVG9vbHRpcENvbnRlbnQgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvZ2V0LWNoYW5nZXMtdG9vbHRpcC1jb250ZW50LmZ1bmN0aW9uJztcbmltcG9ydCB7IE5HWF9HRVRfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL2dldC12YWxpZGF0aW9uLWVycm9yLW1lc3NhZ2UuZnVuY3Rpb24nO1xuaW1wb3J0IHsgZ2V0VmFsaWRhdGlvbkVycm9yc1Rvb2x0aXBDb250ZW50IH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL2dldC12YWxpZGF0aW9uLWVycm9ycy10b29sdGlwLWNvbnRlbnQuZnVuY3Rpb24nO1xuaW1wb3J0IHsgdGFibGVDb2x1bW5WYWx1ZVRvU29ydFZhbHVlIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL3RhYmxlLWNvbHVtbi12YWx1ZS10by1zb3J0LXZhbHVlLmZ1bmN0aW9uJztcbmltcG9ydCB7IE5HWF9DT01QTEVURV9HTE9CQUxfREVGQVVMVF9WQUxVRVMsIE5neEdsb2JhbERlZmF1bHRWYWx1ZXMgfSBmcm9tICcuLi8uLi9nbG9iYWwtY29uZmlndXJhdGlvbi12YWx1ZXMnO1xuaW1wb3J0IHsgRW50aXR5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VudGl0eS5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvZGF0ZS51dGlsaXRpZXMnO1xuaW1wb3J0IHsgRGlmZmVyZW5jZSwgRW50aXR5VGFiLCBFbnRpdHlVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvZW50aXR5LnV0aWxpdGllcyc7XG5pbXBvcnQgeyBTZWxlY3Rpb25VdGlsaXRpZXMgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2VsZWN0aW9uLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IsIFZhbGlkYXRpb25VdGlsaXRpZXMgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvdmFsaWRhdGlvbi51dGlsaXRpZXMnO1xuaW1wb3J0IHsgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyLCBDb25maXJtRGlhbG9nRGF0YUludGVybmFsIH0gZnJvbSAnLi4vY29uZmlybS1kaWFsb2cvY29uZmlybS1kaWFsb2ctZGF0YS5idWlsZGVyJztcbmltcG9ydCB7IE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW50ZXJuYWxDdXN0b21UYWJsZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9jdXN0b20tdGFibGUvY3VzdG9tLXRhYmxlLWNvbmZpZ3VyYXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgQ3JlYXRlRGF0YUJ1aWxkZXIsIENyZWF0ZURhdGFJbnRlcm5hbCB9IGZyb20gJy4uL3RhYmxlL2NyZWF0ZS1kaWFsb2cvY3JlYXRlLWRhdGEuYnVpbGRlcic7XG5pbXBvcnQgeyBEaXNwbGF5Q29sdW1uVmFsdWVDb21wb25lbnQgfSBmcm9tICcuLi90YWJsZS9kaXNwbGF5LWNvbHVtbi12YWx1ZS9kaXNwbGF5LWNvbHVtbi12YWx1ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRWRpdEFjdGlvbkludGVybmFsIH0gZnJvbSAnLi4vdGFibGUvZWRpdC1kaWFsb2cvZWRpdC1kYXRhLmJ1aWxkZXInO1xuaW1wb3J0IHsgRGlzcGxheUNvbHVtbiwgRHluYW1pY1N0eWxlQ2xhc3NlcyB9IGZyb20gJy4uL3RhYmxlL3RhYmxlLWRhdGEnO1xuaW1wb3J0IHsgQmFzZVRhYmxlQWN0aW9uSW50ZXJuYWwsIFRhYmxlQWN0aW9uSW50ZXJuYWwgfSBmcm9tICcuLi90YWJsZS90YWJsZS1kYXRhLmJ1aWxkZXInO1xuaW1wb3J0IHsgVG9vbHRpcENvbXBvbmVudCB9IGZyb20gJy4uL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQnO1xuXG4vKipcbiAqIEdlbmVyaWMgdHlwZSBmb3IgY29udGV4dHMgdGhhdCBjYW4gZmlsbCBhbiBpbmxpbmUgdGVtcGxhdGUuXG4gKi9cbnR5cGUgVGVtcGxhdGVDb250ZXh0PFQ+ID0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY3R1YWwgdmFsdWUuIFRoZSAkaW1wbGljaXQgaXMgbmVlZGVkIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IGEga2V5IHdoZW4gd3JpdGluZyBcImxldC1jb250ZXh0XCIgaW4gdGhlIGh0bWwgdGVtcGxhdGUuXG4gICAgICovXG4gICAgJGltcGxpY2l0OiBUXG59O1xuXG4vKipcbiAqIEEgZm9ybSBjb250ZXh0IHRoYXQgaXMgdXNlZCB0byBmaWxsIGFuIGlubGluZSB0ZW1wbGF0ZS5cbiAqIFRoaXMgaXMgdXNlZCB0byBnbyBhcm91bmQgdGhlIGxpbWl0YXRpb25zIG9mIGhhdmluZyBldmVyeXRoaW5nIGluIHRoZSBzYW1lIGZpbGUgZHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY2llcy5cbiAqIFRoZSBmb3JtcyBhcmUgdXNlZCBmb3Igb2JqZWN0LCBoYXNNYW55LCByZWZlcmVuY2VzTWFueSBhbmQgdGhlIGRpYWxvZ3MuXG4gKi9cbnR5cGUgRm9ybUNvbnRleHQ8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PiA9IHtcbiAgICAvKipcbiAgICAgKiBUaGUgZW50aXR5IHRvIGJ1aWxkIHRoZSBmb3JtIGZvci5cbiAgICAgKi9cbiAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgLyoqXG4gICAgICogVGhlIHRhYnMgdG8gZGlzcGxheS5cbiAgICAgKi9cbiAgICB0YWJzOiBFbnRpdHlUYWI8RW50aXR5VHlwZT5bXSxcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCBlZGl0IHZhbHVlcyBzaG91bGQgYmUgb21pdHRlZC5cbiAgICAgKi9cbiAgICBoaWRlT21pdEZvckVkaXQ/OiBib29sZWFuLFxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IGNyZWF0ZSB2YWx1ZXMgc2hvdWxkIGJlIG9taXR0ZWQuXG4gICAgICovXG4gICAgaGlkZU9taXRGb3JDcmVhdGU/OiBib29sZWFuLFxuICAgIC8qKlxuICAgICAqIFdoYXQgaGFwcGVucyB3aGVuIHRoZSBpbnB1dCBjaGFuZ2VzLlxuICAgICAqL1xuICAgIGlucHV0Q2hhbmdlRXZlbnQ6ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+LFxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBpbnB1dCBpcyByZWFkb25seS5cbiAgICAgKi9cbiAgICBpc1JlYWRPbmx5PzogKHByb3BlcnR5OiBFbnRpdHlUeXBlLCBrZXk6IGtleW9mIEVudGl0eVR5cGUpID0+IGJvb2xlYW4sXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIGlucHV0IGlzIHZhbGlkIGVtcHR5LlxuICAgICAqL1xuICAgIHZhbGlkRW1wdHk/OiAoKSA9PiBib29sZWFuXG59O1xuXG4vKipcbiAqIEEgdGFibGUgY29udGV4dCB0aGF0IGlzIHVzZWQgdG8gZmlsbCBhbiBpbmxpbmUgdGVtcGxhdGUuXG4gKiBUaGlzIGlzIHVzZWQgdG8gZ28gYXJvdW5kIHRoZSBsaW1pdGF0aW9ucyBvZiBoYXZpbmcgZXZlcnl0aGluZyBpbiB0aGUgc2FtZSBmaWxlIGR1ZSB0byBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gKiBUaGUgdGFibGUgaXMgdXNlZCBmb3IgZW50aXR5IGFycmF5IGFuZCBoYXNNYW55LlxuICovXG50eXBlIFRhYmxlQ29udGV4dDxUPiA9IEludGVybmFsQ3VzdG9tVGFibGVDb25maWd1cmF0aW9uICYge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIHNvdXJjZSBvZiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgZGF0YVNvdXJjZTogTWF0VGFibGVEYXRhU291cmNlPFQ+LFxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IGEgZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gd2hlbiB0aGUgdGFibGUgaXMgZW1wdHkuXG4gICAgICovXG4gICAgc2hvdWxkU2hvd01pc3NpbmdFcnJvcjogYm9vbGVhbixcbiAgICAvKipcbiAgICAgKiBUaGUgc2VsZWN0aW9uIG9mIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBzZWxlY3Rpb246IFNlbGVjdGlvbk1vZGVsPFQ+LFxuICAgIC8qKlxuICAgICAqIFdoYXQgaGFwcGVucyB3aGVuIGEgY2VsbCBpcyBjbGlja2VkLlxuICAgICAqL1xuICAgIGNsaWNrQ2VsbDogKHZhbHVlOiBULCBkaXNwbGF5Q29sdW1uOiBEaXNwbGF5Q29sdW1uPFQ+KSA9PiB2b2lkLFxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBkYXRhIGZvciB0aGUgdGFibGUgaXMgY3VycmVudGx5IGJlaW5nIGxvYWRlZC5cbiAgICAgKi9cbiAgICBpc0xvYWRpbmc6IGJvb2xlYW4sXG4gICAgLyoqXG4gICAgICogQWxsIGNvbHVtbnMgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkLlxuICAgICAqL1xuICAgIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdXG59O1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGlucHV0IGNvbXBvbmVudC4gSXQgZ2V0cyB0aGUgbWV0YWRhdGEgb2YgdGhlIHByb3BlcnR5IGZyb20gdGhlIGdpdmVuIEBJbnB1dCBcImVudGl0eVwiIGFuZCBASW5wdXQgXCJwcm9wZXJ0eUtleVwiXG4gKiBhbmQgZGlzcGxheXMgdGhlIGlucHV0IGZpZWxkIGFjY29yZGluZ2x5LlxuICpcbiAqIFlvdSBjYW4gYWxzbyBkZWZpbmUgYSBtZXRob2QgdGhhdCBnZW5lcmF0ZXMgZXJyb3ItbWVzc2FnZXMgYW5kIGlmIHRoZSBpbnB1dCBzaG91bGQgYmUgaGlkZGVuIHdoZW4gaXRzIG1ldGFkYXRhIHNheXNcbiAqIHRoYXQgaXQgc2hvdWxkIGJlIG9taXR0ZWQgZm9yIGNyZWF0aW5nIG9yIHVwZGF0aW5nLlxuICogVGhlIGxhc3QgcGFydCBiZWluZyBtb3N0bHkgcmVsZXZhbnQgaWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgY29tcG9uZW50IGluc2lkZSBhbiBuZ0Zvci5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3gtbWF0LWVudGl0eS1pbnB1dCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9pbnB1dC5jb21wb25lbnQuc2NzcycsICcuLi8uLi9zY3NzL2RpYWxvZy1zdHlsZXMuc2NzcyddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBEaXNwbGF5Q29sdW1uVmFsdWVDb21wb25lbnQsXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgTWF0VGFic01vZHVsZSxcbiAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgICAgICBNYXRTZWxlY3RNb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBNYXREaWFsb2dNb2R1bGUsXG4gICAgICAgIE1hdEJhZGdlTW9kdWxlLFxuICAgICAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICAgICAgTWF0TWVudU1vZHVsZSxcbiAgICAgICAgTWF0UGFnaW5hdG9yTW9kdWxlLFxuICAgICAgICBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsXG4gICAgICAgIE1hdFRhYmxlTW9kdWxlLFxuICAgICAgICBNYXRDaGVja2JveE1vZHVsZSxcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgICAgICBUb29sdGlwQ29tcG9uZW50LFxuICAgICAgICBTdHJpbmdJbnB1dENvbXBvbmVudCxcbiAgICAgICAgU3RyaW5nVGV4dGJveElucHV0Q29tcG9uZW50LFxuICAgICAgICBTdHJpbmdBdXRvY29tcGxldGVJbnB1dENvbXBvbmVudCxcbiAgICAgICAgU3RyaW5nRHJvcGRvd25JbnB1dENvbXBvbmVudCxcbiAgICAgICAgU3RyaW5nUGFzc3dvcmRJbnB1dENvbXBvbmVudCxcbiAgICAgICAgQm9vbGVhbkNoZWNrYm94SW5wdXRDb21wb25lbnQsXG4gICAgICAgIEJvb2xlYW5Ub2dnbGVJbnB1dENvbXBvbmVudCxcbiAgICAgICAgQm9vbGVhbkRyb3Bkb3duSW5wdXRDb21wb25lbnQsXG4gICAgICAgIE51bWJlcklucHV0Q29tcG9uZW50LFxuICAgICAgICBOdW1iZXJEcm9wZG93bklucHV0Q29tcG9uZW50LFxuICAgICAgICBOdW1iZXJTbGlkZXJJbnB1dENvbXBvbmVudCxcbiAgICAgICAgQXJyYXlEYXRlSW5wdXRDb21wb25lbnQsXG4gICAgICAgIEFycmF5RGF0ZVJhbmdlSW5wdXRDb21wb25lbnQsXG4gICAgICAgIEFycmF5RGF0ZVRpbWVJbnB1dENvbXBvbmVudCxcbiAgICAgICAgQXJyYXlTdHJpbmdBdXRvY29tcGxldGVDaGlwc0NvbXBvbmVudCxcbiAgICAgICAgQXJyYXlTdHJpbmdDaGlwc0lucHV0Q29tcG9uZW50LFxuICAgICAgICBEYXRlSW5wdXRDb21wb25lbnQsXG4gICAgICAgIERhdGVSYW5nZUlucHV0Q29tcG9uZW50LFxuICAgICAgICBEYXRlVGltZUlucHV0Q29tcG9uZW50LFxuICAgICAgICBGaWxlRGVmYXVsdElucHV0Q29tcG9uZW50LFxuICAgICAgICBGaWxlSW1hZ2VJbnB1dENvbXBvbmVudCxcbiAgICAgICAgUmVmZXJlbmNlc01hbnlJbnB1dENvbXBvbmVudCxcbiAgICAgICAgQ3VzdG9tSW5wdXRDb21wb25lbnQsXG4gICAgICAgIER5bmFtaWNTdHlsZUNsYXNzRGlyZWN0aXZlLFxuICAgICAgICBNYXRTb3J0TW9kdWxlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hNYXRFbnRpdHlJbnB1dENvbXBvbmVudDxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgZW50aXR5IG9uIHdoaWNoIHRoZSBwcm9wZXJ0eSBleGlzdHMuIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgXCJwcm9wZXJ0eUtleVwiXG4gICAgICogdG8gZGV0ZXJtaW5lIHRoZSBwcm9wZXJ0eSBmb3Igd2hpY2ggdGhlIGlucHV0IHNob3VsZCBiZSBnZW5lcmF0ZWQuXG4gICAgICovXG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgICBlbnRpdHkhOiBFbnRpdHlUeXBlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGdlbmVyYXRlIHRoZSBpbnB1dCBmb3IuIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgXCJlbnRpdHlcIi5cbiAgICAgKi9cbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICAgIHByb3BlcnR5S2V5IToga2V5b2YgRW50aXR5VHlwZTtcblxuICAgIC8qKlxuICAgICAqIChvcHRpb25hbCkgQSBjdXN0b20gZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIGVycm9yLW1lc3NhZ2UgZm9yIGludmFsaWQgaW5wdXRzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZT86IChtb2RlbDogTmdNb2RlbCkgPT4gc3RyaW5nO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG4gICAgaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlITogKG1vZGVsOiBOZ01vZGVsKSA9PiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGhpZGUgYSB2YWx1ZSBpZiBpdCBpcyBvbWl0dGVkIGZvciBjcmVhdGlvbi5cbiAgICAgKiBJcyB1c2VkIGludGVybmFsbHkgZm9yIHRoZSBvYmplY3QgcHJvcGVydHkuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGhpZGVPbWl0Rm9yQ3JlYXRlPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gaGlkZSBhIHZhbHVlIGlmIGl0IGlzIG9taXR0ZWQgZm9yIGVkaXRpbmcuXG4gICAgICogSXMgdXNlZCBpbnRlcm5hbGx5IGZvciB0aGUgb2JqZWN0IHByb3BlcnR5LlxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBoaWRlT21pdEZvckVkaXQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgYW4gZW1wdHkgdmFsdWUgc2hvdWxkIGJlIHZhbGlkLlxuICAgICAqIElzIHVzZWQgaW50ZXJuYWxseSBmb3IgdGhlIG9iamVjdCBwcm9wZXJ0eS5cbiAgICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHZhbGlkRW1wdHk/OiBib29sZWFuOyAvLyBUT0RPXG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgaW5wdXQgc2hvdWxkIGJlIHJlYWRvbmx5LlxuICAgICAqIEluIHRoYXQgY2FzZSBpdCBpcyBkaXNhYmxlZCwgYnV0IG1vc3Qgb2YgdGhlIGRlZmF1bHQgc3R5bGluZyBpcyBvdmVyd3JpdHRlbi5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaXNSZWFkT25seT86IGJvb2xlYW47XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbiAgICBpbnRlcm5hbElzUmVhZE9ubHkhOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgd2hlbiB0aGUgaW5wdXQgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBpbnB1dENoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIGhhcyBtYW55IHNvcnQuXG4gICAgICogSXMgbmVlZGVkIGJlY2F1c2UgdGhlIHNvcnQgaXMgaW5zaWRlIGEgc3dpdGNoIGNhc2UsXG4gICAgICogd2hpY2ggbWVhbnMgdGhhdCBhdCBuZ09uSW5pdCBpdCBjYW4ndCBiZSBpbml0aWFsaXplZC5cbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKE1hdFNvcnQpXG4gICAgcHJpdmF0ZSBzZXQgc29ydChzb3J0OiBNYXRTb3J0KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L3N0cmljdC1ib29sZWFuLWV4cHJlc3Npb25zXG4gICAgICAgIGlmICh0aGlzLmhhc01hbnlUYWJsZUNvbnRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzTWFueVRhYmxlQ29udGV4dC4kaW1wbGljaXQuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5oYXNNYW55VGFibGVDb250ZXh0LiRpbXBsaWNpdC5kYXRhU291cmNlLnNvcnQgPz8gc29ydDtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9zdHJpY3QtYm9vbGVhbi1leHByZXNzaW9uc1xuICAgICAgICBpZiAodGhpcy5lbnRpdHlBcnJheVRhYmxlQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5lbnRpdHlBcnJheVRhYmxlQ29udGV4dC4kaW1wbGljaXQuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5lbnRpdHlBcnJheVRhYmxlQ29udGV4dC4kaW1wbGljaXQuZGF0YVNvdXJjZS5zb3J0ID8/IHNvcnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgZGVjb3JhdG9yIGZvciB0aGlzIGlucHV0LlxuICAgICAqL1xuICAgIHR5cGUhOiBEZWNvcmF0b3JUeXBlcztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvcGVydHkgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGVjb3JhdG9yLlxuICAgICAqL1xuICAgIG1ldGFkYXRhITogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDx1bmtub3duPjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtZXRhZGF0YSBvZiBhbiBvYmplY3QgcHJvcGVydHkuXG4gICAgICovXG4gICAgbWV0YWRhdGFEZWZhdWx0T2JqZWN0ITogRGVmYXVsdE9iamVjdERlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+O1xuICAgIC8qKlxuICAgICAqIFRoZSBmb3JtIGNvbnRleHQgZm9yIGFuIG9iamVjdCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBvYmplY3RGb3JtQ29udGV4dCE6IFRlbXBsYXRlQ29udGV4dDxGb3JtQ29udGV4dDxFbnRpdHlUeXBlPj47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWV0YWRhdGEgb2YgYW4gZHJvcGRvd24gb2JqZWN0IHByb3BlcnR5LlxuICAgICAqL1xuICAgIG1ldGFkYXRhRHJvcGRvd25PYmplY3QhOiBEcm9wZG93bk9iamVjdERlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+O1xuICAgIC8qKlxuICAgICAqIEFsbCBwb3NzaWJsZSBkcm9wZG93biB2YWx1ZXMgZm9yIHRoZSBvYmplY3QgcHJvcGVydHkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBvYmplY3REcm9wZG93blZhbHVlczogRHJvcGRvd25WYWx1ZTxFbnRpdHlUeXBlIHwgdW5kZWZpbmVkPltdID0gW107XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaW5wdXQgbmFtZSBmb3IgdGhlIHJlZmVyZW5jZXMgb25lIHByb3BlcnR5LlxuICAgICAqL1xuICAgIG9iamVjdERyb3Bkb3duTmFtZSE6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbGwgY3VycmVudGx5IHNob3duIGRyb3Bkb3duIHZhbHVlcyBmb3IgdGhlIG9iamVjdCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBmaWx0ZXJlZE9iamVjdERyb3Bkb3duVmFsdWVzOiBEcm9wZG93blZhbHVlPEVudGl0eVR5cGUgfCB1bmRlZmluZWQ+W10gPSBbXTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvYmplY3QgYXMgYSBkcm9wIGRvd24gdmFsdWUuXG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnRPYmplY3REcm9wZG93blZhbHVlKCk6IERyb3Bkb3duVmFsdWU8RW50aXR5VHlwZSB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCB2YWx1ZTogRHJvcGRvd25WYWx1ZTxFbnRpdHlUeXBlIHwgdW5kZWZpbmVkPltdID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLm9iamVjdERyb3Bkb3duVmFsdWVzID8/IFtdKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmZpbmQodiA9PiBMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbCh2LnZhbHVlLCB0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSkpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIGN1cnJlbnQgb2JqZWN0IGRyb3Bkb3duIHZhbHVlIHNob3VsZCBiZSBzaG93biBpbiB0aGUgZHJvcGRvd24uXG4gICAgICovXG4gICAgZ2V0IHNob3VsZERpc3BsYXlDdXJyZW50T2JqZWN0RHJvcGRvd25WYWx1ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5jdXJyZW50T2JqZWN0RHJvcGRvd25WYWx1ZVxuICAgICAgICAgICAgJiYgIXRoaXMuZmlsdGVyZWRPYmplY3REcm9wZG93blZhbHVlcy5maW5kKHYgPT4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwodi52YWx1ZSwgdGhpcy5jdXJyZW50T2JqZWN0RHJvcGRvd25WYWx1ZT8udmFsdWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBjb21wYXJlV2l0aCBtZXRob2QgZm9yIHRoZSBzZWxlY3QuXG4gICAgICogVXNlcyBiaW5kLlxuICAgICAqL1xuICAgIGNvbXBhcmVPYmplY3RzQm91bmQ6ICh2YWx1ZTE/OiBFbnRpdHlUeXBlLCB2YWx1ZTI/OiBFbnRpdHlUeXBlKSA9PiBib29sZWFuID0gdGhpcy5jb21wYXJlT2JqZWN0cy5iaW5kKHRoaXMpO1xuXG4gICAgQFZpZXdDaGlsZCgnYWRkQXJyYXlJdGVtRGlhbG9nJylcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFkZEFycmF5SXRlbURpYWxvZyE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICAgIHByaXZhdGUgYWRkQXJyYXlJdGVtRGlhbG9nUmVmITogTWF0RGlhbG9nUmVmPHVua25vd24+O1xuICAgIEBWaWV3Q2hpbGQoJ2VkaXRBcnJheUl0ZW1EaWFsb2cnKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgZWRpdEFycmF5SXRlbURpYWxvZyE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICAgIHByaXZhdGUgZWRpdEFycmF5SXRlbURpYWxvZ1JlZiE6IE1hdERpYWxvZ1JlZjx1bmtub3duPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWV0YWRhdGEgb2YgYW4gZW50aXR5IGFycmF5IHByb3BlcnR5LlxuICAgICAqL1xuICAgIG1ldGFkYXRhRW50aXR5QXJyYXkhOiBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0YWJsZSBjb250ZXh0IGZvciB0aGUgZW50aXR5IGFycmF5IGlucHV0LlxuICAgICAqL1xuICAgIGVudGl0eUFycmF5VGFibGVDb250ZXh0ITogVGVtcGxhdGVDb250ZXh0PFRhYmxlQ29udGV4dDxFbnRpdHlUeXBlPj47XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgYXJyYXkgaXRlbSB0byBiZSBhZGRlZCBvciB1cGRhdGVkLlxuICAgICAqL1xuICAgIGFycmF5SXRlbSE6IEVudGl0eVR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFycmF5IGl0ZW0gYmVmb3JlIGFueSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLiBVc2VkIHRvIGNoZWNrIGlmIHRoZSBmb3JtIGlzIGRpcnR5LlxuICAgICAqL1xuICAgIGFycmF5SXRlbVByaW9yQ2hhbmdlcyE6IEVudGl0eVR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGZvcm0gY29udGV4dCBmb3IgYWRkaW5nIGFuIGFycmF5IGl0ZW0uXG4gICAgICovXG4gICAgYWRkQXJyYXlJdGVtRm9ybUNvbnRleHQhOiBUZW1wbGF0ZUNvbnRleHQ8Rm9ybUNvbnRleHQ8RW50aXR5VHlwZT4+O1xuICAgIC8qKlxuICAgICAqIFRoZSBmb3JtIGNvbnRleHQgZm9yIGVkaXRpbmcgYW4gYXJyYXkgaXRlbS5cbiAgICAgKi9cbiAgICBlZGl0QXJyYXlJdGVtRm9ybUNvbnRleHQhOiBUZW1wbGF0ZUNvbnRleHQ8Rm9ybUNvbnRleHQ8RW50aXR5VHlwZT4+O1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBhcnJheSBpdGVtIGlzIHZhbGlkLlxuICAgICAqL1xuICAgIGlzQXJyYXlJdGVtVmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgYXJyYXkgaXRlbSBpcyBkaXJ0eS5cbiAgICAgKi9cbiAgICBpc0FycmF5SXRlbURpcnR5OiBib29sZWFuID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBhcnJheSBpdGVtIHRoYXQgaXMgYmVpbmcgZWRpdGVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5kZXhPZkVkaXRlZEFycmF5SXRlbSE6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBDb25maWcgZm9yIHRoZSBkaWFsb2cgdGhhdCBhZGRzIGEgbmV3IGFycmF5IGl0ZW0uXG4gICAgICovXG4gICAgYWRkQXJyYXlJdGVtRGlhbG9nRGF0YSE6IENyZWF0ZURhdGFJbnRlcm5hbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGFicyB0byBkaXNwbGF5IGluc2lkZSB0aGUgZWRpdCBhcnJheSBpdGVtIGRpYWxvZy5cbiAgICAgKi9cbiAgICBlZGl0QXJyYXlJdGVtRGlhbG9nRGF0YSE6IEVkaXRBcnJheUl0ZW1EaWFsb2dEYXRhSW50ZXJuYWw8RW50aXR5VHlwZT47XG4gICAgLyoqXG4gICAgICogQWxsIHZhbGlkYXRpb24gZXJyb3JzIGZvciB0aGUgYXJyYXkgaXRlbS5cbiAgICAgKi9cbiAgICBhcnJheUl0ZW1WYWxpZGF0aW9uRXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JbXSA9IFtdO1xuICAgIC8qKlxuICAgICAqIEFsbCB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBkb25lIHRvIHRoZSBhcnJheSBpdGVtLlxuICAgICAqL1xuICAgIGFycmF5SXRlbUNoYW5nZXM6IERpZmZlcmVuY2U8RW50aXR5VHlwZT5bXSA9IFtdO1xuICAgIC8qKlxuICAgICAqIFdoYXQgdG8gZGlzcGxheSBpbnNpZGUgdGhlIGFycmF5IGl0ZW0gdG9vbHRpcC5cbiAgICAgKi9cbiAgICBhcnJheUl0ZW1Ub29sdGlwQ29udGVudDogc3RyaW5nID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiBNZXRhZGF0YSBvZiBhIGhhcyBtYW55IHByb3BlcnR5LlxuICAgICAqL1xuICAgIG1ldGFkYXRhSGFzTWFueSE6IEhhc01hbnlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlLCBFbnRpdHlUeXBlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGFibGUgY29udGV4dCBmb3IgdGhlIGhhcyBtYW55IGlucHV0LlxuICAgICAqL1xuICAgIGhhc01hbnlUYWJsZUNvbnRleHQhOiBUZW1wbGF0ZUNvbnRleHQ8VGFibGVDb250ZXh0PEVudGl0eVR5cGU+PjtcbiAgICAvKipcbiAgICAgKiBUaGUgaGFzIG1hbnkgaW1wb3J0IGFjdGlvbi5cbiAgICAgKi9cbiAgICBoYXNNYW55SW1wb3J0QWN0aW9uITogQmFzZVRhYmxlQWN0aW9uSW50ZXJuYWw7XG4gICAgcHJpdmF0ZSBoYXNNYW55RW50aXR5U2VydmljZSE6IEVudGl0eVNlcnZpY2U8RW50aXR5VHlwZT47XG4gICAgQFZpZXdDaGlsZCgnY3JlYXRlSGFzTWFueURpYWxvZycpXG4gICAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVIYXNNYW55RGlhbG9nITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG4gICAgcHJpdmF0ZSBjcmVhdGVIYXNNYW55RGlhbG9nUmVmITogTWF0RGlhbG9nUmVmPHVua25vd24+O1xuICAgIEBWaWV3Q2hpbGQoJ2VkaXRIYXNNYW55RGlhbG9nJylcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVkaXRIYXNNYW55RGlhbG9nITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG4gICAgcHJpdmF0ZSBlZGl0SGFzTWFueURpYWxvZ1JlZiE6IE1hdERpYWxvZ1JlZjx1bmtub3duPjtcbiAgICAvKipcbiAgICAgKiBBIHNpbmdsZSBoYXMgbWFueSBlbnRpdHkuXG4gICAgICovXG4gICAgaGFzTWFueUVudGl0eSE6IEVudGl0eVR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIHNpbmdsZSBoYXMgbWFueSBlbnRpdHkgYmVmb3JlIGFueSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLiBJcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgZm9ybSBpcyBkaXJ0eS5cbiAgICAgKi9cbiAgICBoYXNNYW55RW50aXR5UHJpb3JDaGFuZ2VzITogRW50aXR5VHlwZTtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgaGFzIG1hbnkgZW50aXR5IGlzIHZhbGlkLlxuICAgICAqL1xuICAgIGlzSGFzTWFueUVudGl0eVZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQWxsIHZhbGlkYXRpb24gZXJyb3JzIG9mIHRoZSBoYXMgbWFueSBlbnRpdHkuXG4gICAgICovXG4gICAgaGFzTWFueVZhbGlkYXRpb25FcnJvcnM6IFZhbGlkYXRpb25FcnJvcltdID0gW107XG4gICAgLyoqXG4gICAgICogQWxsIHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGRvbmUgdG8gdGhlIGhhcyBtYW55IGVudGl0eS5cbiAgICAgKi9cbiAgICBoYXNNYW55Q2hhbmdlczogRGlmZmVyZW5jZTxFbnRpdHlUeXBlPltdID0gW107XG4gICAgLyoqXG4gICAgICogV2hhdCB0byBkaXNwbGF5IGluc2lkZSB0aGUgaGFzIG1hbnkgdG9vbHRpcC5cbiAgICAgKi9cbiAgICBoYXNNYW55VG9vbHRpcENvbnRlbnQ6IHN0cmluZyA9ICcnO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBoYXMgbWFueSBlbnRpdHkgaXMgZGlydHkuXG4gICAgICovXG4gICAgaXNIYXNNYW55RW50aXR5RGlydHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCB1c2VyIGlzIGFsbG93ZWQgdG8gY3JlYXRlIGEgaGFzIG1hbnkgZW50aXR5LlxuICAgICAqL1xuICAgIGhhc01hbnlBbGxvd0NyZWF0ZSE6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGZvcm0gY29udGV4dCBmb3IgY3JlYXRpbmcgYW4gaGFzIG1hbnkgZW50aXR5LlxuICAgICAqL1xuICAgIGhhc01hbnlDcmVhdGVGb3JtQ29udGV4dCE6IFRlbXBsYXRlQ29udGV4dDxGb3JtQ29udGV4dDxFbnRpdHlUeXBlPj47XG4gICAgLyoqXG4gICAgICogVGhlIGZvcm0gY29udGV4dCBmb3IgZWRpdGluZyBhbiBoYXMgbWFueSBlbnRpdHkuXG4gICAgICovXG4gICAgaGFzTWFueUVkaXRGb3JtQ29udGV4dCE6IFRlbXBsYXRlQ29udGV4dDxGb3JtQ29udGV4dDxFbnRpdHlUeXBlPj47XG4gICAgcHJpdmF0ZSBoYXNNYW55Q3JlYXRlQmFzZVVybCE6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBtZXRhZGF0YSBmb3IgYSByZWZlcmVuY2VzIG9uZSBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBtZXRhZGF0YVJlZmVyZW5jZXNPbmUhOiBSZWZlcmVuY2VzT25lRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZT47XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlcyB0aGF0IGNhbiBiZSBwb3NzaWJseSByZWZlcmVuY2VkLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVmZXJlbmNlc09uZUFsbFJlZmVyZW5jZWRFbnRpdGllcyE6IEVudGl0eVR5cGVbXTtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zc2libGUgcmVmZXJlbmNlcyBvbmUgZHJvcGRvd24gdmFsdWVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWVzITogRHJvcGRvd25WYWx1ZTxzdHJpbmc+W107XG4gICAgLyoqXG4gICAgICogVGhlIGZpbHRlcmVkIGRyb3Bkb3duIHZhbHVlcyB0aGF0IGdldCBkaXNwbGF5ZWQgaW4gdGhlIHJlZmVyZW5jZXMgb25lIGRyb3Bkb3duIGlucHV0LlxuICAgICAqL1xuICAgIGZpbHRlcmVkUmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWVzITogRHJvcGRvd25WYWx1ZTxzdHJpbmc+W107XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaW5wdXQgbmFtZSBmb3IgdGhlIHJlZmVyZW5jZXMgb25lIHByb3BlcnR5LlxuICAgICAqL1xuICAgIHJlZmVyZW5jZXNPbmVOYW1lITogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmb3JtIGNvbnRleHQgZm9yIGFuIG9iamVjdCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICByZWZlcmVuY2VzT25lRm9ybUNvbnRleHQhOiBUZW1wbGF0ZUNvbnRleHQ8Rm9ybUNvbnRleHQ8RW50aXR5VHlwZT4+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVudW0gVmFsdWVzIGZvciBhbGwgdGhlIGRpZmZlcmVudCBEZWNvcmF0b3JUeXBlcy5cbiAgICAgKi9cbiAgICByZWFkb25seSBEZWNvcmF0b3JUeXBlczogdHlwZW9mIERlY29yYXRvclR5cGVzID0gRGVjb3JhdG9yVHlwZXM7XG4gICAgLyoqXG4gICAgICogQ29udGFpbnMgSGVscGVyTWV0aG9kcyBhcm91bmQgaGFuZGxpbmcgRW50aXRpZXMgYW5kIHRoZWlyIHByb3BlcnR5LW1ldGFkYXRhLlxuICAgICAqL1xuICAgIEVudGl0eVV0aWxpdGllczogdHlwZW9mIEVudGl0eVV0aWxpdGllcyA9IEVudGl0eVV0aWxpdGllcztcbiAgICAvKipcbiAgICAgKiBDb250YWlucyBIZWxwZXIgRnVuY3Rpb25zIGZvciBoYW5kbGluZyBkYXRlIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgRGF0ZVV0aWxpdGllczogdHlwZW9mIERhdGVVdGlsaXRpZXMgPSBEYXRlVXRpbGl0aWVzO1xuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgYXJvdW5kIG1hdGVyaWFsIHNlbGVjdGlvbnMgaW5zaWRlIG9mIHRhYmxlcy5cbiAgICAgKi9cbiAgICBTZWxlY3Rpb25VdGlsaXRpZXM6IHR5cGVvZiBTZWxlY3Rpb25VdGlsaXRpZXMgPSBTZWxlY3Rpb25VdGlsaXRpZXM7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGRyb3Bkb3duIHZhbHVlIGZvciByZWZlcmVuY2VzIG9uZS5cbiAgICAgKiBJcyBuZWVkZWQgc28gdGhhdCB0aGUgZHJvcGRvd24gdmFsdWUgd2lsbCBzdGlsbCBiZSBkaXNwbGF5ZWQsXG4gICAgICogZXZlbiB3aGVuIHRoZSBmaWx0ZXIgbWV0aG9kIHJlbW92ZXMgdGhlIHZhbHVlIGZyb20gdGhlIHNlbGVjdGFibGUgZHJvcGRvd24gdmFsdWVzLlxuICAgICAqL1xuICAgIGdldCBjdXJyZW50UmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWUoKTogRHJvcGRvd25WYWx1ZTxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodGhpcy5yZWZlcmVuY2VzT25lRHJvcGRvd25WYWx1ZXMgPz8gW10pXG4gICAgICAgICAgICAuZmluZCh2ID0+IHYudmFsdWUgPT09IHRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByZWZlcmVuY2VzIG9uZSB2YWx1ZSBzaG91bGQgYmUgc2hvd24sXG4gICAgICogYWx0aG91Z2ggaXQgd291bGQgaGF2ZSBiZWVuIGZpbHRlcmVkIG91dCBieSB0aGUgc2VhcmNoLlxuICAgICAqL1xuICAgIGdldCBzaG91bGREaXNwbGF5Q3VycmVudFJlZmVyZW5jZXNPbmVEcm9wZG93blZhbHVlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmN1cnJlbnRSZWZlcmVuY2VzT25lRHJvcGRvd25WYWx1ZVxuICAgICAgICAgICAgJiYgIXRoaXMuZmlsdGVyZWRSZWZlcmVuY2VzT25lRHJvcGRvd25WYWx1ZXMuZmluZCh2ID0+IHYudmFsdWUgPT09IHRoaXMuY3VycmVudFJlZmVyZW5jZXNPbmVEcm9wZG93blZhbHVlPy52YWx1ZSk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIEBJbmplY3QoTkdYX0dFVF9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UpXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0R2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZTogKG1vZGVsOiBOZ01vZGVsKSA9PiBzdHJpbmcsXG4gICAgICAgIEBJbmplY3QoTkdYX0NPTVBMRVRFX0dMT0JBTF9ERUZBVUxUX1ZBTFVFUylcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdsb2JhbENvbmZpZzogTmd4R2xvYmFsRGVmYXVsdFZhbHVlcyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBodHRwOiBIdHRwQ2xpZW50XG4gICAgKSB7fVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBpbnB1dCB3aXRoIHRoZSBnaXZlbiBrZXkgb24gdGhlIGdpdmVuIHByb3BlcnR5IGlzIHJlYWRvbmx5LlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBvbiB3aGljaCB0byBjaGVjayB0aGUgaW5wdXQuXG4gICAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgZm9yIHRoZSBpbnB1dCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgaW5wdXQgaXMgcmVhZG9ubHkuXG4gICAgICovXG4gICAgaXNQcm9wZXJ0eVJlYWRPbmx5KHByb3BlcnR5OiBFbnRpdHlUeXBlLCBrZXk6IGtleW9mIEVudGl0eVR5cGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcm5hbElzUmVhZE9ubHkgfHwgdGhpcy5tZXRhZGF0YURlZmF1bHRPYmplY3Q/LmlzUmVhZE9ubHkocHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKHByb3BlcnR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKCFtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gbWV0YWRhdGEgd2FzIGZvdW5kIGZvciB0aGUga2V5IFwiJHtTdHJpbmcoa2V5KX1cImApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLmlzUmVhZE9ubHkocHJvcGVydHkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSB0byBkaXNwbGF5IGluIHRoZSBjb2x1bW4uXG4gICAgICogUnVucyBpbiBlbnZpcm9ubWVudCBjb250ZXh0IHRvIGVuYWJsZSBpbmplY3Rpb24uXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tLlxuICAgICAqIEBwYXJhbSBkaXNwbGF5Q29sdW1uIC0gVGhlIGRpc3BsYXkgY29sdW1uIHRvIGdldCB0aGUgdmFsdWUgZnJvbS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIGRpc3BsYXkgY29sdW1uLlxuICAgICAqL1xuICAgIGdldERpc3BsYXlDb2x1bW5WYWx1ZShlbnRpdHk6IEVudGl0eVR5cGUsIGRpc3BsYXlDb2x1bW46IERpc3BsYXlDb2x1bW48RW50aXR5VHlwZT4pOiB1bmtub3duIHtcbiAgICAgICAgcmV0dXJuIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCAoKSA9PiBkaXNwbGF5Q29sdW1uLnZhbHVlKGVudGl0eSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGEgY2VsbENsaWNrZWQgZXZlbnQgd2hlbiB0aGUgY2xpY2tlZCBjb2x1bW4gaXMgZW5hYmxlZCBhbmQgY2xpY2tpbmcgaXMgYWxsb3dlZCBieSB0aGUgY29uZmlndXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIHJvdyB0aGF0IHdhcyBjbGlja2VkLlxuICAgICAqIEBwYXJhbSBkQ29sIC0gVGhlIGRpc3BsYXkgY29sdW1uIG9mIHRoZSByb3cgdGhhdCB3YXMgY2xpY2tlZC5cbiAgICAgKiBAcGFyYW0gY29udGV4dCAtIFRoZSBjb250ZXh0IG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2VsbCB3YXMgY2xpY2tlZC5cbiAgICAgKi9cbiAgICBjbGlja0NlbGw8VD4odmFsdWU6IFQsIGRDb2w6IERpc3BsYXlDb2x1bW48VD4sIGNvbnRleHQ6IFRhYmxlQ29udGV4dDxUPik6IHZvaWQge1xuICAgICAgICBpZiAoZENvbC5kaXNhYmxlQ2xpY2sgPT0gdHJ1ZSB8fCAhY29udGV4dC5hbGxvd0NsaWNrKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuY2xpY2tDZWxsKHZhbHVlLCBkQ29sKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UgPSB0aGlzLmdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UgPz8gdGhpcy5kZWZhdWx0R2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbElzUmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHkgPz8gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgZm91bmRUeXBlOiBEZWNvcmF0b3JUeXBlcyB8IHVuZGVmaW5lZCA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eVR5cGUodGhpcy5lbnRpdHksIHRoaXMucHJvcGVydHlLZXkpO1xuICAgICAgICBpZiAoZm91bmRUeXBlID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB0eXBlIHdhcyBmb3VuZCBmb3IgdGhlIGtleSBcIiR7U3RyaW5nKHRoaXMucHJvcGVydHlLZXkpfVwiYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50eXBlID0gZm91bmRUeXBlO1xuICAgICAgICBpZiAodGhpcy52YWxpZEVtcHR5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50TWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gPSBSZWZsZWN0VXRpbGl0aWVzLmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICAgICdtZXRhZGF0YScsXG4gICAgICAgICAgICAgICAgdGhpcy5lbnRpdHksXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eUtleVxuICAgICAgICAgICAgKSBhcyBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+O1xuICAgICAgICAgICAgUmVmbGVjdFV0aWxpdGllcy5kZWZpbmVNZXRhZGF0YSgnbWV0YWRhdGEnLCB7IC4uLmN1cnJlbnRNZXRhZGF0YSwgcmVxdWlyZWQ6IGRlZmF1bHRGYWxzZSB9LCB0aGlzLmVudGl0eSwgdGhpcy5wcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb3VuZE1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoXG4gICAgICAgICAgICB0aGlzLmVudGl0eSxcbiAgICAgICAgICAgIHRoaXMucHJvcGVydHlLZXksXG4gICAgICAgICAgICB0aGlzLnR5cGVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFmb3VuZE1ldGFkYXRhKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG1ldGFkYXRhIHdhcyBmb3VuZCBmb3IgdGhlIGtleSBcIiR7U3RyaW5nKHRoaXMucHJvcGVydHlLZXkpfVwiYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IGZvdW5kTWV0YWRhdGE7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuT0JKRUNUX0RST1BET1dOOlxuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5pbml0RHJvcGRvd25PYmplY3RJbnB1dCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5PQkpFQ1Q6XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0T2JqZWN0SW5wdXQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVk6XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0RW50aXR5QXJyYXkoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuSEFTX01BTlk6XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0SGFzTWFueSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5SRUZFUkVOQ0VTX09ORTpcbiAgICAgICAgICAgICAgICB2b2lkIHRoaXMuaW5pdFJlZmVyZW5jZXNPbmUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGluaXRSZWZlcmVuY2VzT25lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLm1ldGFkYXRhUmVmZXJlbmNlc09uZSA9IHRoaXMubWV0YWRhdGEgYXMgUmVmZXJlbmNlc09uZURlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+O1xuICAgICAgICB0aGlzLnJlZmVyZW5jZXNPbmVOYW1lID0gdGhpcy5wcm9wZXJ0eUtleS50b1N0cmluZygpICsgJ2lucHV0JyArIFVVSURVdGlsaXRpZXMuY3JlYXRlKCk7XG5cbiAgICAgICAgYXdhaXQgcnVuSW5JbmplY3Rpb25Db250ZXh0KFxuICAgICAgICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZXNPbmVBbGxSZWZlcmVuY2VkRW50aXRpZXMgPSBhd2FpdCB0aGlzLm1ldGFkYXRhUmVmZXJlbmNlc09uZS5nZXRSZWZlcmVuY2VkRW50aXRpZXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZXNPbmVEcm9wZG93blZhbHVlcyA9IHRoaXMubWV0YWRhdGFSZWZlcmVuY2VzT25lLmdldERyb3Bkb3duVmFsdWVzKFxuICAgICAgICAgICAgICAgICAgICBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHRoaXMucmVmZXJlbmNlc09uZUFsbFJlZmVyZW5jZWRFbnRpdGllcylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRSZWZlcmVuY2VzT25lRHJvcGRvd25WYWx1ZXMgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHRoaXMucmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJlZmVyZW5jZXNPbmVPYmplY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIHRoZSByZWZlcmVuY2VzIG9uZSBkcm9wZG93biB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHNlYXJjaElucHV0IC0gVGhlIHNlYXJjaCBpbnB1dCB0byBmaWx0ZXIgZm9yLlxuICAgICAqL1xuICAgIGZpbHRlclJlZmVyZW5jZXNPbmVWYWx1ZXMoc2VhcmNoSW5wdXQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWx0ZXI6IHN0cmluZyA9IHNlYXJjaElucHV0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRSZWZlcmVuY2VzT25lRHJvcGRvd25WYWx1ZXMgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHRoaXMucmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWVzKS5maWx0ZXIob3B0aW9uID0+IHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24uZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIpIHx8IG9wdGlvbi52YWx1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEhhc01hbnkoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBuZXcgSGFzTWFueURlY29yYXRvckNvbmZpZ0ludGVybmFsKFxuICAgICAgICAgICAgdGhpcy5tZXRhZGF0YSBhcyBIYXNNYW55RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZSwgRW50aXR5VHlwZT4sXG4gICAgICAgICAgICB0aGlzLmdsb2JhbENvbmZpZ1xuICAgICAgICApO1xuICAgICAgICBSZWZsZWN0VXRpbGl0aWVzLmRlZmluZU1ldGFkYXRhKCdtZXRhZGF0YScsIHRoaXMubWV0YWRhdGEsIHRoaXMuZW50aXR5LCB0aGlzLnByb3BlcnR5S2V5KTtcbiAgICAgICAgdGhpcy5tZXRhZGF0YUhhc01hbnkgPSB0aGlzLm1ldGFkYXRhIGFzIEhhc01hbnlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlLCBFbnRpdHlUeXBlPjtcbiAgICAgICAgdGhpcy5oYXNNYW55SW1wb3J0QWN0aW9uID0gbmV3IEJhc2VUYWJsZUFjdGlvbkludGVybmFsKHtcbiAgICAgICAgICAgIC4uLnRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5pbXBvcnRBY3Rpb25EYXRhLFxuICAgICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLnN0YXJ0SW1wb3J0SnNvbigpXG4gICAgICAgIH0sIHRoaXMuZ2xvYmFsQ29uZmlnKTtcblxuICAgICAgICBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYXNNYW55QWxsb3dDcmVhdGUgPSB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuYWxsb3dDcmVhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuaGFzTWFueUVudGl0eVNlcnZpY2UgPSBpbmplY3Q8RW50aXR5U2VydmljZTxFbnRpdHlUeXBlPj4odGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLkVudGl0eVNlcnZpY2VDbGFzcyk7XG4gICAgICAgICAgICB0aGlzLmhhc01hbnlDcmVhdGVCYXNlVXJsID0gdGhpcy5tZXRhZGF0YUhhc01hbnkuY3JlYXRlQmFzZVVybCh0aGlzLmVudGl0eSwgdGhpcy5tZXRhZGF0YUhhc01hbnkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBnaXZlbkRpc3BsYXlDb2x1bW5zOiBzdHJpbmdbXSA9IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5kaXNwbGF5Q29sdW1ucy5tYXAoKHYpID0+IHYuZGlzcGxheU5hbWUpO1xuICAgICAgICBpZiAoZ2l2ZW5EaXNwbGF5Q29sdW1ucy5maW5kKHMgPT4gcyA9PT0gJ3NlbGVjdCcpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFRoZSBuYW1lIFwic2VsZWN0XCIgZm9yIGEgZGlzcGxheSBjb2x1bW4gaXMgcmVzZXJ2ZWQuXG4gICAgICAgICAgICAgICAgUGxlYXNlIGNob29zZSBhIGRpZmZlcmVudCBuYW1lLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYXNNYW55VGFibGVDb250ZXh0ID0ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiB7XG4gICAgICAgICAgICAgICAgLi4ubmV3IEludGVybmFsQ3VzdG9tVGFibGVDb25maWd1cmF0aW9uKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNvbHVtbnM6IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5kaXNwbGF5Q29sdW1ucyBhcyBEaXNwbGF5Q29sdW1uPHVua25vd24+W10sXG4gICAgICAgICAgICAgICAgICAgICAgICB3aXRoU2VsZWN0aW9uOiAhdGhpcy5pbnRlcm5hbElzUmVhZE9ubHksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3R5bGlzdGljL21heC1sZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNSb3dTdHlsZUNsYXNzZXM6IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5keW5hbWljUm93U3R5bGVDbGFzc2VzIGFzIER5bmFtaWNTdHlsZUNsYXNzZXM8dW5rbm93bj4sXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0NsaWNrOiAoKGVudGl0eTogRW50aXR5VHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuYWxsb3dSZWFkKGVudGl0eSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmFsbG93VXBkYXRlKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSBhcyAodmFsdWU6IHVua25vd24pID0+IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TG9hZGluZ1NwaW5uZXI6IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5kaXNwbGF5TG9hZGluZ1NwaW5uZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hTdHJpbmdGb3JSb3c6IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5zZWFyY2hTdHJpbmcgYXMgKHZhbHVlOiB1bmtub3duKSA9PiBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgZGlzcGxheWVkQ29sdW1uczogIXRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMuZmlsdGVyKHRBID0+IHRBLnR5cGUgPT09ICdtdWx0aS1zZWxlY3QnKS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyBnaXZlbkRpc3BsYXlDb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgIDogWydzZWxlY3QnXS5jb25jYXQoZ2l2ZW5EaXNwbGF5Q29sdW1ucyksXG4gICAgICAgICAgICAgICAgZGF0YVNvdXJjZTogbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSgpLFxuICAgICAgICAgICAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzaG91bGRTaG93TWlzc2luZ0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb246IG5ldyBTZWxlY3Rpb25Nb2RlbDxFbnRpdHlUeXBlPih0cnVlLCBbXSksXG4gICAgICAgICAgICAgICAgY2xpY2tDZWxsOiAoZW50aXR5LCBkQ29sKSA9PiB0aGlzLmVkaXRIYXNNYW55RW50aXR5KGVudGl0eSwgZENvbClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmhhc01hbnlUYWJsZUNvbnRleHQuJGltcGxpY2l0LmRhdGFTb3VyY2Uuc29ydGluZ0RhdGFBY2Nlc3NvciA9IChlbnRpdHk6IEVudGl0eVR5cGUsIGhlYWRlcjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuaW5qZWN0b3IsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5Q29sdW1uOiBEaXNwbGF5Q29sdW1uPEVudGl0eVR5cGU+ID0gdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmRpc3BsYXlDb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgIC5maW5kKChkcCkgPT4gZHAuZGlzcGxheU5hbWUgPT09IGhlYWRlcikgYXMgRGlzcGxheUNvbHVtbjxFbnRpdHlUeXBlPjtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFibGVDb2x1bW5WYWx1ZVRvU29ydFZhbHVlKGRpc3BsYXlDb2x1bW4udmFsdWUoZW50aXR5KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYXNNYW55VGFibGVDb250ZXh0LiRpbXBsaWNpdC5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZSA9IChlbnRpdHk6IEVudGl0eVR5cGUsIGZpbHRlcjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWFyY2hTdHI6IHN0cmluZyA9IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5zZWFyY2hTdHJpbmcoZW50aXR5KTtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFNlYXJjaFN0cmluZzogc3RyaW5nID0gc2VhcmNoU3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRGaWx0ZXJTdHJpbmc6IHN0cmluZyA9IGZpbHRlci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlZFNlYXJjaFN0cmluZy5pbmNsdWRlcyhmb3JtYXR0ZWRGaWx0ZXJTdHJpbmcpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuaGFzTWFueUVudGl0eVNlcnZpY2UuZW50aXRpZXNTdWJqZWN0LnN1YnNjcmliZSgoZW50aXRpZXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFzTWFueVRhYmxlQ29udGV4dC4kaW1wbGljaXQuZGF0YVNvdXJjZS5kYXRhID0gZW50aXRpZXM7XG4gICAgICAgICAgICB0aGlzLmhhc01hbnlUYWJsZUNvbnRleHQuJGltcGxpY2l0LnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB9KTtcbiAgICAgICAgdm9pZCBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVhZEJhc2VVcmw6IHN0cmluZyA9IHRoaXMubWV0YWRhdGFIYXNNYW55LnJlYWRCYXNlVXJsKHRoaXMuZW50aXR5LCB0aGlzLm1ldGFkYXRhSGFzTWFueSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlLnJlYWQocmVhZEJhc2VVcmwpO1xuICAgICAgICAgICAgdGhpcy5oYXNNYW55VGFibGVDb250ZXh0LiRpbXBsaWNpdC5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0RW50aXR5QXJyYXkoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBuZXcgRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbChcbiAgICAgICAgICAgIHRoaXMubWV0YWRhdGEgYXMgRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlPixcbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsQ29uZmlnXG4gICAgICAgICk7XG4gICAgICAgIFJlZmxlY3RVdGlsaXRpZXMuZGVmaW5lTWV0YWRhdGEoJ21ldGFkYXRhJywgdGhpcy5tZXRhZGF0YSwgdGhpcy5lbnRpdHksIHRoaXMucHJvcGVydHlLZXkpO1xuICAgICAgICB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkgPSB0aGlzLm1ldGFkYXRhIGFzIEVudGl0eUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZT47XG4gICAgICAgIGlmICh0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICh0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyBFbnRpdHlUeXBlW10pID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlSW5saW5lICYmICF0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlRGlhbG9nRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LmNyZWF0ZURpYWxvZ0RhdGEgPSB7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdBZGQnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdpdmVuRGlzcGxheUNvbHVtbnM6IHN0cmluZ1tdID0gdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LmRpc3BsYXlDb2x1bW5zLm1hcCgodikgPT4gdi5kaXNwbGF5TmFtZSk7XG4gICAgICAgIGlmIChnaXZlbkRpc3BsYXlDb2x1bW5zLmZpbmQocyA9PiBzID09PSAnc2VsZWN0JykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgVGhlIG5hbWUgXCJzZWxlY3RcIiBmb3IgYSBkaXNwbGF5IGNvbHVtbiBpcyByZXNlcnZlZC5cbiAgICAgICAgICAgICAgICBQbGVhc2UgY2hvb3NlIGEgZGlmZmVyZW50IG5hbWUuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVudGl0eUFycmF5VGFibGVDb250ZXh0ID0ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiB7XG4gICAgICAgICAgICAgICAgLi4ubmV3IEludGVybmFsQ3VzdG9tVGFibGVDb25maWd1cmF0aW9uKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNvbHVtbnM6IHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5kaXNwbGF5Q29sdW1ucyBhcyBEaXNwbGF5Q29sdW1uPHVua25vd24+W10sXG4gICAgICAgICAgICAgICAgICAgICAgICB3aXRoU2VsZWN0aW9uOiAhdGhpcy5pbnRlcm5hbElzUmVhZE9ubHksXG4gICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljUm93U3R5bGVDbGFzc2VzOiB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuZHluYW1pY1Jvd1N0eWxlQ2xhc3NlcyBhcyBEeW5hbWljU3R5bGVDbGFzc2VzPHVua25vd24+LFxuICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlFcnJvck1lc3NhZ2U6IHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5taXNzaW5nRXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGRpc3BsYXllZENvbHVtbnM6IHRoaXMuaW50ZXJuYWxJc1JlYWRPbmx5ID8gZ2l2ZW5EaXNwbGF5Q29sdW1ucyA6IFsnc2VsZWN0J10uY29uY2F0KGdpdmVuRGlzcGxheUNvbHVtbnMpLFxuICAgICAgICAgICAgICAgIGRhdGFTb3VyY2U6IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoKSxcbiAgICAgICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNob3VsZFNob3dNaXNzaW5nRXJyb3I6IHRydWUsXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBuZXcgU2VsZWN0aW9uTW9kZWw8RW50aXR5VHlwZT4odHJ1ZSwgW10pLFxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLW1pc3VzZWQtcHJvbWlzZXNcbiAgICAgICAgICAgICAgICBjbGlja0NlbGw6IChlbnRpdHksIGRDb2wpID0+IHRoaXMuZWRpdEFycmF5SXRlbShlbnRpdHksIGRDb2wpXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZW50aXR5QXJyYXlUYWJsZUNvbnRleHQuJGltcGxpY2l0LmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldIGFzIEVudGl0eVR5cGVbXTtcblxuICAgICAgICB0aGlzLmFycmF5SXRlbSA9IG5ldyB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuRW50aXR5Q2xhc3MoKTtcbiAgICAgICAgdGhpcy5hcnJheUl0ZW1QcmlvckNoYW5nZXMgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHRoaXMuYXJyYXlJdGVtKTtcbiAgICAgICAgRW50aXR5VXRpbGl0aWVzLnNldERlZmF1bHRWYWx1ZXModGhpcy5hcnJheUl0ZW0pO1xuXG4gICAgICAgIHRoaXMuYWRkQXJyYXlJdGVtRm9ybUNvbnRleHQgPSB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHtcbiAgICAgICAgICAgICAgICBlbnRpdHk6IHRoaXMuYXJyYXlJdGVtLFxuICAgICAgICAgICAgICAgIHRhYnM6IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlUYWJzKHRoaXMuYXJyYXlJdGVtLCB0aGlzLmluamVjdG9yLCB0cnVlKSxcbiAgICAgICAgICAgICAgICBpbnB1dENoYW5nZUV2ZW50OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5jaGVja0lzQXJyYXlJdGVtVmFsaWQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRBcnJheUl0ZW1Gb3JtQ29udGV4dC4kaW1wbGljaXQudGFicyA9IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlUYWJzKHRoaXMuYXJyYXlJdGVtLCB0aGlzLmluamVjdG9yLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhpZGVPbWl0Rm9yQ3JlYXRlOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYWRkQXJyYXlJdGVtRGlhbG9nRGF0YSA9IG5ldyBDcmVhdGVEYXRhQnVpbGRlcih0aGlzLmdsb2JhbENvbmZpZywgdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LmNyZWF0ZURpYWxvZ0RhdGEpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ2NyZWF0ZUJ1dHRvbkxhYmVsJywgdGhpcy5nbG9iYWxDb25maWcuYWRkTGFiZWwpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ3RpdGxlJywgdGhpcy5nbG9iYWxDb25maWcuYWRkQXJyYXlJdGVtVGl0bGUpXG4gICAgICAgICAgICAuZ2V0UmVzdWx0KCk7XG5cbiAgICAgICAgdGhpcy5lZGl0QXJyYXlJdGVtRm9ybUNvbnRleHQgPSB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHtcbiAgICAgICAgICAgICAgICBlbnRpdHk6IHRoaXMuYXJyYXlJdGVtLFxuICAgICAgICAgICAgICAgIHRhYnM6IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlUYWJzKHRoaXMuYXJyYXlJdGVtLCB0aGlzLmluamVjdG9yLCB0cnVlKSxcbiAgICAgICAgICAgICAgICBpc1JlYWRPbmx5OiAocHJvcGVydHksIGtleSkgPT4gdGhpcy5pc1Byb3BlcnR5UmVhZE9ubHkocHJvcGVydHksIGtleSksXG4gICAgICAgICAgICAgICAgaW5wdXRDaGFuZ2VFdmVudDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2b2lkIHRoaXMuY2hlY2tBcnJheUl0ZW0oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0QXJyYXlJdGVtRm9ybUNvbnRleHQuJGltcGxpY2l0LnRhYnMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5VGFicyh0aGlzLmFycmF5SXRlbSwgdGhpcy5pbmplY3RvciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoaWRlT21pdEZvckVkaXQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lZGl0QXJyYXlJdGVtRGlhbG9nRGF0YSA9IHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5lZGl0RGlhbG9nRGF0YTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGluaXREcm9wZG93bk9iamVjdElucHV0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLm1ldGFkYXRhRHJvcGRvd25PYmplY3QgPSB0aGlzLm1ldGFkYXRhIGFzIERyb3Bkb3duT2JqZWN0RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZT47XG4gICAgICAgIHRoaXMub2JqZWN0RHJvcGRvd25OYW1lID0gdGhpcy5wcm9wZXJ0eUtleS50b1N0cmluZygpICsgJ2lucHV0JyArIFVVSURVdGlsaXRpZXMuY3JlYXRlKCk7XG5cbiAgICAgICAgYXdhaXQgcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuaW5qZWN0b3IsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub2JqZWN0RHJvcGRvd25WYWx1ZXMgPSBhd2FpdCB0aGlzLm1ldGFkYXRhRHJvcGRvd25PYmplY3QuZHJvcGRvd25WYWx1ZXModGhpcy5lbnRpdHkpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZE9iamVjdERyb3Bkb3duVmFsdWVzID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLm9iamVjdERyb3Bkb3duVmFsdWVzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0T2JqZWN0SW5wdXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWV0YWRhdGFEZWZhdWx0T2JqZWN0ID0gdGhpcy5tZXRhZGF0YSBhcyBEZWZhdWx0T2JqZWN0RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZT47XG4gICAgICAgIGNvbnN0IG9iamVjdFByb3BlcnR5OiBFbnRpdHlUeXBlID0gdGhpcy5lbnRpdHlbdGhpcy5wcm9wZXJ0eUtleV0gYXMgRW50aXR5VHlwZTtcbiAgICAgICAgY29uc3Qgb2JqZWN0UHJvcGVydHlUYWJzOiBFbnRpdHlUYWI8RW50aXR5VHlwZT5bXSA9IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlUYWJzKFxuICAgICAgICAgICAgb2JqZWN0UHJvcGVydHksXG4gICAgICAgICAgICB0aGlzLmluamVjdG9yLFxuICAgICAgICAgICAgdGhpcy5oaWRlT21pdEZvckNyZWF0ZSxcbiAgICAgICAgICAgIHRoaXMuaGlkZU9taXRGb3JFZGl0LFxuICAgICAgICAgICAgdGhpcy5tZXRhZGF0YURlZmF1bHRPYmplY3Qub21pdFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm9iamVjdEZvcm1Db250ZXh0ID0ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiB7XG4gICAgICAgICAgICAgICAgZW50aXR5OiBvYmplY3RQcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICB0YWJzOiBvYmplY3RQcm9wZXJ0eVRhYnMsXG4gICAgICAgICAgICAgICAgaGlkZU9taXRGb3JDcmVhdGU6IHRoaXMuaGlkZU9taXRGb3JDcmVhdGUsXG4gICAgICAgICAgICAgICAgaGlkZU9taXRGb3JFZGl0OiB0aGlzLmhpZGVPbWl0Rm9yRWRpdCxcbiAgICAgICAgICAgICAgICBpc1JlYWRPbmx5OiAocHJvcGVydHksIGtleSkgPT4gdGhpcy5pc1Byb3BlcnR5UmVhZE9ubHkocHJvcGVydHksIGtleSksXG4gICAgICAgICAgICAgICAgaW5wdXRDaGFuZ2VFdmVudDogKCkgPT4gdGhpcy5lbWl0Q2hhbmdlKCksXG4gICAgICAgICAgICAgICAgdmFsaWRFbXB0eTogKCkgPT4gIXRoaXMubWV0YWRhdGEucmVxdWlyZWQodGhpcy5lbnRpdHkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydEltcG9ydEpzb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0OiBIVE1MSW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgaW5wdXQudHlwZSA9ICdmaWxlJztcbiAgICAgICAgaW5wdXQuYWNjZXB0ID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuICAgICAgICBpbnB1dC5vbmNoYW5nZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5maWxlcykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaW1wb3J0SnNvbihpbnB1dC5maWxlc1swXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlucHV0LmNsaWNrKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbXBvcnRKc29uKGZpbGU6IEZpbGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN0eWxpc3RpYy9tYXgtbGVuXG4gICAgICAgIGNvbnN0IGRpYWxvZ0RhdGE6IENvbmZpcm1EaWFsb2dEYXRhSW50ZXJuYWwgPSBuZXcgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyKHRoaXMuZ2xvYmFsQ29uZmlnLCB0aGlzLmhhc01hbnlJbXBvcnRBY3Rpb24uY29uZmlybURpYWxvZ0RhdGEpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ3RleHQnLCB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuaW1wb3J0QWN0aW9uRGF0YS5jb25maXJtRGlhbG9nRGF0YT8udGV4dClcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGl0bGUnLCB0aGlzLmhhc01hbnlJbXBvcnRBY3Rpb24uZGlzcGxheU5hbWUpXG4gICAgICAgICAgICAuZ2V0UmVzdWx0KCk7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIGJvb2xlYW4+ID0gdGhpcy5kaWFsb2cub3BlbihOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiBkaWFsb2dEYXRhLFxuICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlczogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpKTtcbiAgICAgICAgaWYgKHJlcyA9PSB0cnVlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlLmltcG9ydChmaWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0d28gb2JqZWN0cyBhcmUgZXF1YWwuIElzIG5lZWRlZCBmb3IgdGhlIGRyb3Bkb3duLlxuICAgICAqIEBwYXJhbSB2YWx1ZTEgLSBUaGUgZmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHZhbHVlMiAtIFRoZSBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIG9iamVjdHMgYXJlIHRoZSBzYW1lLlxuICAgICAqL1xuICAgIHByaXZhdGUgY29tcGFyZU9iamVjdHModmFsdWUxPzogRW50aXR5VHlwZSwgdmFsdWUyPzogRW50aXR5VHlwZSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB2YWx1ZU9iamVjdDE6IEVudGl0eVR5cGUgPSBuZXcgdGhpcy5tZXRhZGF0YURyb3Bkb3duT2JqZWN0LkVudGl0eUNsYXNzKHZhbHVlMSk7XG4gICAgICAgIGNvbnN0IHZhbHVlT2JqZWN0MjogRW50aXR5VHlwZSA9IG5ldyB0aGlzLm1ldGFkYXRhRHJvcGRvd25PYmplY3QuRW50aXR5Q2xhc3ModmFsdWUyKTtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKHZhbHVlT2JqZWN0MSwgdmFsdWVPYmplY3QyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIHRoZSBkcm9wZG93biB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHNlYXJjaElucHV0IC0gVGhlIHNlYXJjaCBpbnB1dCB0byBmaWx0ZXIgZm9yLlxuICAgICAqL1xuICAgIGZpbHRlck9iamVjdERyb3Bkb3duVmFsdWVzKHNlYXJjaElucHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmlsdGVyOiBzdHJpbmcgPSBzZWFyY2hJbnB1dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB0aGlzLmZpbHRlcmVkT2JqZWN0RHJvcGRvd25WYWx1ZXMgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHRoaXMub2JqZWN0RHJvcGRvd25WYWx1ZXMpLmZpbHRlcihvcHRpb24gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbi5kaXNwbGF5TmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlcikgfHwgSlNPTi5zdHJpbmdpZnkob3B0aW9uLnZhbHVlKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLmluY2x1ZGVzKGZpbHRlcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJlZmVyZW5jZXMgb25lIG9iamVjdCB1c2luZyB0aGUgaW5wdXQgaWQuXG4gICAgICovXG4gICAgc2V0UmVmZXJlbmNlc09uZU9iamVjdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZm91bmRFbnRpdHk6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQgPSB0aGlzLm1ldGFkYXRhUmVmZXJlbmNlc09uZS5nZXRFbnRpdHlGb3JJZChcbiAgICAgICAgICAgIHRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldIGFzIHN0cmluZyxcbiAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlc09uZUFsbFJlZmVyZW5jZWRFbnRpdGllc1xuICAgICAgICApO1xuICAgICAgICBjb25zdCByZWZlcmVuY2VzT25lT2JqZWN0OiBFbnRpdHlUeXBlID0gbmV3IHRoaXMubWV0YWRhdGFSZWZlcmVuY2VzT25lLkVudGl0eUNsYXNzKGZvdW5kRW50aXR5KTtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlc09uZVByb3BlcnR5VGFiczogRW50aXR5VGFiPEVudGl0eVR5cGU+W10gPSBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5VGFicyhyZWZlcmVuY2VzT25lT2JqZWN0LCB0aGlzLmluamVjdG9yKTtcblxuICAgICAgICB0aGlzLnJlZmVyZW5jZXNPbmVGb3JtQ29udGV4dCA9IHtcbiAgICAgICAgICAgICRpbXBsaWNpdDoge1xuICAgICAgICAgICAgICAgIGVudGl0eTogcmVmZXJlbmNlc09uZU9iamVjdCxcbiAgICAgICAgICAgICAgICB0YWJzOiByZWZlcmVuY2VzT25lUHJvcGVydHlUYWJzLFxuICAgICAgICAgICAgICAgIGhpZGVPbWl0Rm9yQ3JlYXRlOiB0aGlzLmhpZGVPbWl0Rm9yQ3JlYXRlLFxuICAgICAgICAgICAgICAgIGhpZGVPbWl0Rm9yRWRpdDogdGhpcy5oaWRlT21pdEZvckVkaXQsXG4gICAgICAgICAgICAgICAgaXNSZWFkT25seTogKCkgPT4gdHJ1ZSxcbiAgICAgICAgICAgICAgICBpbnB1dENoYW5nZUV2ZW50OiAoKSA9PiB0aGlzLmVtaXRDaGFuZ2UoKSxcbiAgICAgICAgICAgICAgICB2YWxpZEVtcHR5OiAoKSA9PiAhdGhpcy5tZXRhZGF0YS5yZXF1aXJlZCh0aGlzLmVudGl0eSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFZGl0cyBhbiBlbnRpdHkuIFRoaXMgZWl0aGVyIGNhbGxzIHRoZSBlZGl0LU1ldGhvZCBwcm92aWRlZCBieSB0aGUgdXNlciBvciB1c2VzIGEgZGVmYXVsdCBlZGl0LWRpYWxvZy5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0aGF0IHNob3VsZCBiZSB1cGRhdGVkLlxuICAgICAqIEBwYXJhbSBkQ29sIC0gVGhlIGRpc3BsYXkgY29sdW1uIHRoYXQgd2FzIGNsaWNrZWQgb24uXG4gICAgICogQHRocm93cyBXaGVuIG5vIEVudGl0eUNsYXNzIHdhcyBwcm92aWRlZCwgYXMgYSBuZXcgY2FsbCBpcyBuZWVkZWQgdG8gaW5pdGlhbGl6ZSBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBlZGl0SGFzTWFueUVudGl0eShlbnRpdHk6IEVudGl0eVR5cGUsIGRDb2w6IERpc3BsYXlDb2x1bW48RW50aXR5VHlwZT4pOiB2b2lkIHtcbiAgICAgICAgaWYgKChkQ29sLmRpc2FibGVDbGljayA9PT0gdHJ1ZSkgfHwgKCF0aGlzLmhhc01hbnlBbGxvd1VwZGF0ZShlbnRpdHkpICYmICF0aGlzLmhhc01hbnlBbGxvd1JlYWQoZW50aXR5KSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5FbnRpdHlDbGFzcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBcIkVudGl0eUNsYXNzXCIgc3BlY2lmaWVkIGZvciB0aGlzIHRhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5lZGl0KSB7XG4gICAgICAgICAgICB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuZWRpdChuZXcgdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLkVudGl0eUNsYXNzKGVudGl0eSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuZGVmYXVsdEVkaXQgPT0gJ3BhZ2UnKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRIYXNNYW55RGVmYXVsdFBhZ2UobmV3IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5FbnRpdHlDbGFzcyhlbnRpdHkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2b2lkIHRoaXMuZWRpdEhhc01hbnlEZWZhdWx0RGlhbG9nKG5ldyB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuRW50aXR5Q2xhc3MoZW50aXR5KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB1cGRhdGluZyB0aGUgcHJvdmlkZWQgZW50aXR5IGZyb20gdGhlIGhhcyBtYW55IHByb3BlcnR5IGlzIGFsbG93ZWQuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIEEgc2luZ2xlIHZhbHVlIG9mIHRoZSBoYXMgbWFueSBwcm9wZXJ0eSB0aGF0IHRoZSB1c2VyIHdhbnRzIHRvIGVkaXQuXG4gICAgICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSB1c2VyIGNhbiBlZGl0IHRoZSBwcm92aWRlZCBlbnRpdHkgYW5kIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBoYXNNYW55QWxsb3dVcGRhdGUoZW50aXR5OiBFbnRpdHlUeXBlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5hbGxvd1VwZGF0ZShlbnRpdHkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHZpZXdpbmcgdGhlIHByb3ZpZGVkIGVudGl0eSBmcm9tIHRoZSBoYXMgbWFueSBwcm9wZXJ0eSBpcyBhbGxvd2VkLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBBIHNpbmdsZSB2YWx1ZSBvZiB0aGUgaGFzIG1hbnkgcHJvcGVydHkgdGhhdCB0aGUgdXNlciB3YW50cyB0byB2aWV3LlxuICAgICAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgdXNlciBjYW4gdmlldyB0aGUgcHJvdmlkZWQgZW50aXR5IGFuZCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaGFzTWFueUFsbG93UmVhZChlbnRpdHk6IEVudGl0eVR5cGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmFsbG93UmVhZChlbnRpdHkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIGRlbGV0aW5nIHRoZSBwcm92aWRlZCBlbnRpdHkgZnJvbSB0aGUgaGFzIG1hbnkgcHJvcGVydHkgaXMgYWxsb3dlZC5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gQSBzaW5nbGUgdmFsdWUgb2YgdGhlIGhhcyBtYW55IHByb3BlcnR5IHRoYXQgdGhlIHVzZXIgd2FudHMgdG8gZGVsZXRlLlxuICAgICAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgdXNlciBjYW4gZGVsZXRlIHRoZSBwcm92aWRlZCBlbnRpdHkgYW5kIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBoYXNNYW55QWxsb3dEZWxldGUoZW50aXR5OiBFbnRpdHlUeXBlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5hbGxvd0RlbGV0ZShlbnRpdHkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYW4gRWRpdEFjdGlvbiBpcyBkaXNhYmxlZCAoZS5nLiBCZWNhdXNlIHRoZSBjdXJyZW50IGVudHJ5IGRvZXNuJ3QgZnVsbGZpbCB0aGUgcmVxdWlyZW1lbnRzKS5cbiAgICAgKiBAcGFyYW0gYWN0aW9uIC0gVGhlIEVkaXRBY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIEFjdGlvbiBjYW4gYmUgdXNlZC5cbiAgICAgKi9cbiAgICBoYXNNYW55RWRpdEFjdGlvbkRpc2FibGVkKGFjdGlvbjogRWRpdEFjdGlvbkludGVybmFsPEVudGl0eVR5cGU+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFhY3Rpb24uZW5hYmxlZCh0aGlzLmhhc01hbnlFbnRpdHlQcmlvckNoYW5nZXMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW5zIHRoZSBlZGl0IGFjdGlvbiBvbiB0aGUgZW50aXR5LlxuICAgICAqIEBwYXJhbSBhY3Rpb24gLSBUaGUgYWN0aW9uIHRvIHJ1bi5cbiAgICAgKi9cbiAgICBhc3luYyBoYXNNYW55UnVuRWRpdEFjdGlvbihhY3Rpb246IEVkaXRBY3Rpb25JbnRlcm5hbDxFbnRpdHlUeXBlPik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCByZXF1aXJlQ29uZmlybURpYWxvZzogYm9vbGVhbiA9IHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJlcXVpcmVDb25maXJtRGlhbG9nKHRoaXMuaGFzTWFueUVudGl0eVByaW9yQ2hhbmdlcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcmVxdWlyZUNvbmZpcm1EaWFsb2cpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29uZmlybUhhc01hbnlSdW5FZGl0QWN0aW9uKGFjdGlvbik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwgYm9vbGVhbj4gPSB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IGFjdGlvbi5jb25maXJtRGlhbG9nRGF0YSxcbiAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXM6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKSk7XG4gICAgICAgIGlmIChyZXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25maXJtSGFzTWFueVJ1bkVkaXRBY3Rpb24oYWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29uZmlybUhhc01hbnlSdW5FZGl0QWN0aW9uKGFjdGlvbjogRWRpdEFjdGlvbkludGVybmFsPEVudGl0eVR5cGU+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBhY3Rpb24uYWN0aW9uKHRoaXMuaGFzTWFueUVudGl0eSwgdGhpcy5oYXNNYW55RW50aXR5UHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tIYXNNYW55RW50aXR5KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZWRpdEhhc01hbnlEZWZhdWx0UGFnZShlbnRpdHk6IEVudGl0eVR5cGUpOiB2b2lkIHtcbiAgICAgICAgdm9pZCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJycsIHRoaXMuaGFzTWFueUVudGl0eVNlcnZpY2UuZWRpdEJhc2VSb3V0ZSwgZW50aXR5W3RoaXMuaGFzTWFueUVudGl0eVNlcnZpY2UuaWRLZXldXSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBlZGl0SGFzTWFueURlZmF1bHREaWFsb2coZW50aXR5OiBFbnRpdHlUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuaGFzTWFueUVudGl0eSA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAoZW50aXR5KTtcbiAgICAgICAgdGhpcy5oYXNNYW55RW50aXR5UHJpb3JDaGFuZ2VzID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLmhhc01hbnlFbnRpdHkpO1xuICAgICAgICB0aGlzLmhhc01hbnlFZGl0Rm9ybUNvbnRleHQgPSB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHtcbiAgICAgICAgICAgICAgICBlbnRpdHk6IHRoaXMuaGFzTWFueUVudGl0eSxcbiAgICAgICAgICAgICAgICBoaWRlT21pdEZvckVkaXQ6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNSZWFkT25seTogKHByb3BlcnR5LCBrZXkpID0+IHRoaXMuaXNQcm9wZXJ0eVJlYWRPbmx5KHByb3BlcnR5LCBrZXkpLFxuICAgICAgICAgICAgICAgIGlucHV0Q2hhbmdlRXZlbnQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdm9pZCB0aGlzLmNoZWNrSGFzTWFueUVudGl0eSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc01hbnlFZGl0Rm9ybUNvbnRleHQuJGltcGxpY2l0LnRhYnMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5VGFicyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzTWFueUVudGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRhYnM6IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlUYWJzKHRoaXMuaGFzTWFueUVudGl0eSwgdGhpcy5pbmplY3RvciwgZmFsc2UsIHRydWUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tIYXNNYW55RW50aXR5KCk7XG4gICAgICAgIHRoaXMuZWRpdEhhc01hbnlEaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFxuICAgICAgICAgICAgdGhpcy5lZGl0SGFzTWFueURpYWxvZyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtaW5XaWR0aDogJzYwJScsXG4gICAgICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlczogbnVtYmVyID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5lZGl0SGFzTWFueURpYWxvZ1JlZi5hZnRlckNsb3NlZCgpKSBhcyBudW1iZXI7XG4gICAgICAgIGlmIChyZXMgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGE6IEVudGl0eVR5cGVbXSA9IHRoaXMuaGFzTWFueVRhYmxlQ29udGV4dC4kaW1wbGljaXQuZGF0YVNvdXJjZS5kYXRhO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN0eWxpc3RpYy9tYXgtbGVuXG4gICAgICAgICAgICBkYXRhW3RoaXMuaGFzTWFueVRhYmxlQ29udGV4dC4kaW1wbGljaXQuZGF0YVNvdXJjZS5kYXRhLmZpbmRJbmRleCgoZSkgPT4gZVt0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlLmlkS2V5XSA9PT0gZW50aXR5W3RoaXMuaGFzTWFueUVudGl0eVNlcnZpY2UuaWRLZXldKV0gPSBlbnRpdHk7XG4gICAgICAgICAgICB0aGlzLmhhc01hbnlUYWJsZUNvbnRleHQuJGltcGxpY2l0LmRhdGFTb3VyY2UuZGF0YSA9IGRhdGE7XG4gICAgICAgICAgICB0aGlzLmhhc01hbnlUYWJsZUNvbnRleHQuJGltcGxpY2l0LnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gc2F2ZSB0aGUgY2hhbmdlcyBhbmQgY2xvc2UgdGhlIGRpYWxvZyBhZnRlcndhcmRzLlxuICAgICAqIEFsc28gaGFuZGxlcyB0aGUgY29uZmlybWF0aW9uIGlmIHJlcXVpcmVkLlxuICAgICAqL1xuICAgIGFzeW5jIGRpYWxvZ0VkaXRIYXNNYW55KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbElzUmVhZE9ubHkgfHwgIXRoaXMuaXNIYXNNYW55RW50aXR5VmFsaWQgfHwgIXRoaXMuaXNIYXNNYW55RW50aXR5RGlydHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5lZGl0RGF0YS5lZGl0UmVxdWlyZXNDb25maXJtRGlhbG9nKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRpYWxvZ0NvbmZpcm1FZGl0SGFzTWFueSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN0eWxpc3RpYy9tYXgtbGVuXG4gICAgICAgIGNvbnN0IGRpYWxvZ0RhdGE6IENvbmZpcm1EaWFsb2dEYXRhSW50ZXJuYWwgPSBuZXcgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyKHRoaXMuZ2xvYmFsQ29uZmlnLCB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEuY29uZmlybUVkaXREaWFsb2dEYXRhKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0ZXh0JywgdGhpcy5nbG9iYWxDb25maWcuY29uZmlybVNhdmVUZXh0KVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCdjb25maXJtQnV0dG9uTGFiZWwnLCB0aGlzLmdsb2JhbENvbmZpZy5zYXZlTGFiZWwpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ3RpdGxlJywgdGhpcy5nbG9iYWxDb25maWcuZWRpdExhYmVsKVxuICAgICAgICAgICAgLmdldFJlc3VsdCgpO1xuICAgICAgICBjb25zdCBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCBib29sZWFuPiA9IHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgZGF0YTogZGlhbG9nRGF0YSxcbiAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXM6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKSk7XG4gICAgICAgIGlmIChyZXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5kaWFsb2dDb25maXJtRWRpdEhhc01hbnkoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGRpYWxvZ0NvbmZpcm1FZGl0SGFzTWFueSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYXNNYW55RW50aXR5U2VydmljZS51cGRhdGUodGhpcy5oYXNNYW55RW50aXR5LCB0aGlzLmhhc01hbnlFbnRpdHlQcmlvckNoYW5nZXMpO1xuICAgICAgICB0aGlzLmVkaXRIYXNNYW55RGlhbG9nUmVmLmNsb3NlKDEpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmllcyB0byBkZWxldGUgdGhlIGVudGl0eSBhbmQgY2xvc2UgdGhlIGRpYWxvZyBhZnRlcndhcmRzLlxuICAgICAqIEFsc28gaGFuZGxlcyB0aGUgY29uZmlybWF0aW9uIGlmIHJlcXVpcmVkLlxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZUhhc01hbnlFbnRpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmVkaXREYXRhLmRlbGV0ZVJlcXVpcmVzQ29uZmlybURpYWxvZykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25maXJtRGVsZXRlSGFzTWFueUVudGl0eSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN0eWxpc3RpYy9tYXgtbGVuXG4gICAgICAgIGNvbnN0IGRpYWxvZ0RhdGE6IENvbmZpcm1EaWFsb2dEYXRhSW50ZXJuYWwgPSBuZXcgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyKHRoaXMuZ2xvYmFsQ29uZmlnLCB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEuY29uZmlybURlbGV0ZURpYWxvZ0RhdGEpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ3RleHQnLCB0aGlzLmdsb2JhbENvbmZpZy5jb25maXJtRGVsZXRlVGV4dClcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndHlwZScsICdkZWxldGUnKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCdjb25maXJtQnV0dG9uTGFiZWwnLCB0aGlzLmdsb2JhbENvbmZpZy5kZWxldGVMYWJlbClcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGl0bGUnLCB0aGlzLmdsb2JhbENvbmZpZy5kZWxldGVMYWJlbClcbiAgICAgICAgICAgIC5nZXRSZXN1bHQoKTtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwgYm9vbGVhbj4gPSB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVzOiBib29sZWFuIHwgdW5kZWZpbmVkID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkpO1xuICAgICAgICBpZiAocmVzID09IHRydWUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29uZmlybURlbGV0ZUhhc01hbnlFbnRpdHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29uZmlybURlbGV0ZUhhc01hbnlFbnRpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFzTWFueUVudGl0eVNlcnZpY2UuZGVsZXRlKHRoaXMuaGFzTWFueUVudGl0eVByaW9yQ2hhbmdlcyk7XG4gICAgICAgIHRoaXMuZWRpdEhhc01hbnlEaWFsb2dSZWYuY2xvc2UoMik7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbmNlbHMgdGhlIGVkaXRpbmcgb2YgdGhlIGhhcyBtYW55IGVudGl0eSBhbmQgY2xvc2VzIHRoZSBkaWFsb2cuXG4gICAgICovXG4gICAgZGlhbG9nQ2FuY2VsRWRpdEhhc01hbnkoKTogdm9pZCB7XG4gICAgICAgIEVudGl0eVV0aWxpdGllcy5yZXNldENoYW5nZXNPbkVudGl0eSh0aGlzLmhhc01hbnlFbnRpdHksIHRoaXMuaGFzTWFueUVudGl0eVByaW9yQ2hhbmdlcyk7XG4gICAgICAgIHRoaXMuZWRpdEhhc01hbnlEaWFsb2dSZWYuY2xvc2UoMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBFbnRpdHkuIFRoaXMgZWl0aGVyIGNhbGxzIHRoZSBjcmVhdGUtTWV0aG9kIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIG9yIHVzZXMgYSBkZWZhdWx0IGNyZWF0ZS1kaWFsb2cuXG4gICAgICogQHRocm93cyBXaGVuIG5vIEVudGl0eUNsYXNzIHdhcyBwcm92aWRlZCwgYXMgYSBuZXcgY2FsbCBpcyBuZWVkZWQgdG8gaW5pdGlhbGl6ZSBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBjcmVhdGVIYXNNYW55RW50aXR5KCk6IHZvaWQge1xuICAgICAgICB2b2lkIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmFsbG93Q3JlYXRlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5FbnRpdHlDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFwiRW50aXR5Q2xhc3NcIiBzcGVjaWZpZWQgZm9yIHRoaXMgdGFibGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5jcmVhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmNyZWF0ZShuZXcgdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLkVudGl0eUNsYXNzKCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eTogRW50aXR5VHlwZSA9IG5ldyB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuRW50aXR5Q2xhc3MoKTtcbiAgICAgICAgICAgICAgICBFbnRpdHlVdGlsaXRpZXMuc2V0RGVmYXVsdFZhbHVlcyhlbnRpdHkpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuZGVmYXVsdENyZWF0ZSA9PSAncGFnZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVIYXNNYW55RGVmYXVsdFBhZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUhhc01hbnlEZWZhdWx0RGlhbG9nKGVudGl0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlSGFzTWFueURlZmF1bHRQYWdlKCk6IHZvaWQge1xuICAgICAgICB2b2lkIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodGhpcy5oYXNNYW55RW50aXR5U2VydmljZS5jcmVhdGVCYXNlUm91dGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlSGFzTWFueURlZmF1bHREaWFsb2coZW50aXR5OiBFbnRpdHlUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuaGFzTWFueUVudGl0eSA9IGVudGl0eTtcbiAgICAgICAgdGhpcy5oYXNNYW55Q3JlYXRlRm9ybUNvbnRleHQgPSB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHtcbiAgICAgICAgICAgICAgICBlbnRpdHk6IHRoaXMuaGFzTWFueUVudGl0eSxcbiAgICAgICAgICAgICAgICBoaWRlT21pdEZvckNyZWF0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpbnB1dENoYW5nZUV2ZW50OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5jaGVja0lzSGFzTWFueUVudGl0eVZhbGlkKCdjcmVhdGUnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNNYW55Q3JlYXRlRm9ybUNvbnRleHQuJGltcGxpY2l0LnRhYnMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5VGFicyh0aGlzLmhhc01hbnlFbnRpdHksIHRoaXMuaW5qZWN0b3IsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGFiczogRW50aXR5VXRpbGl0aWVzLmdldEVudGl0eVRhYnModGhpcy5oYXNNYW55RW50aXR5LCB0aGlzLmluamVjdG9yLCB0cnVlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSXNIYXNNYW55RW50aXR5VmFsaWQoJ2NyZWF0ZScpO1xuICAgICAgICB0aGlzLmNyZWF0ZUhhc01hbnlEaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVIYXNNYW55RGlhbG9nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1pbldpZHRoOiAnNjAlJyxcbiAgICAgICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBoYXMgbWFueSBlbnRpdHkgb3ZlciB0aGUgZGlhbG9nLlxuICAgICAqL1xuICAgIGFzeW5jIGRpYWxvZ0NyZWF0ZUhhc01hbnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5pc0hhc01hbnlFbnRpdHlWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmNyZWF0ZURhdGEuY3JlYXRlUmVxdWlyZXNDb25maXJtRGlhbG9nKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRpYWxvZ0NvbmZpcm1DcmVhdGVIYXNNYW55KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3R5bGlzdGljL21heC1sZW5cbiAgICAgICAgY29uc3QgZGlhbG9nRGF0YTogQ29uZmlybURpYWxvZ0RhdGFJbnRlcm5hbCA9IG5ldyBDb25maXJtRGlhbG9nRGF0YUJ1aWxkZXIodGhpcy5nbG9iYWxDb25maWcsIHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5jcmVhdGVEYXRhLmNvbmZpcm1DcmVhdGVEaWFsb2dEYXRhKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0ZXh0JywgdGhpcy5nbG9iYWxDb25maWcuY29uZmlybUNyZWF0ZVRleHQpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ2NvbmZpcm1CdXR0b25MYWJlbCcsIHRoaXMuZ2xvYmFsQ29uZmlnLmNyZWF0ZUxhYmVsKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0aXRsZScsIHRoaXMuZ2xvYmFsQ29uZmlnLmNyZWF0ZUxhYmVsKVxuICAgICAgICAgICAgLmdldFJlc3VsdCgpO1xuICAgICAgICBjb25zdCBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCBib29sZWFuPiA9IHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgZGF0YTogZGlhbG9nRGF0YSxcbiAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXM6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKSk7XG4gICAgICAgIGlmIChyZXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5kaWFsb2dDb25maXJtQ3JlYXRlSGFzTWFueSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZGlhbG9nQ29uZmlybUNyZWF0ZUhhc01hbnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFzTWFueUVudGl0eVNlcnZpY2UuY3JlYXRlKHRoaXMuaGFzTWFueUVudGl0eSwgdGhpcy5oYXNNYW55Q3JlYXRlQmFzZVVybCk7XG4gICAgICAgIHRoaXMuY3JlYXRlSGFzTWFueURpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIHRoZSBjcmVhdGluZyBvZiB0aGUgaGFzIG1hbnkgZW50aXR5IGFuZCBjbG9zZXMgdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBkaWFsb2dDYW5jZWxDcmVhdGVIYXNNYW55KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNyZWF0ZUhhc01hbnlEaWFsb2dSZWYuY2xvc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW5zIHRoZSBUYWJsZUFjdGlvbiBmb3IgYWxsIHNlbGVjdGVkIGVudHJpZXMuXG4gICAgICogQWxzbyBoYW5kbGVzIGNvbmZpcm1hdGlvbiB3aXRoIGFuIGFkZGl0aW9uYWwgZGlhbCNvZyBpZiBjb25maWd1cmVkLlxuICAgICAqIEBwYXJhbSBhY3Rpb24gLSBUaGUgVGFibGVBY3Rpb24gdG8gcnVuLlxuICAgICAqL1xuICAgIGFzeW5jIHJ1bkhhc01hbnlUYWJsZUFjdGlvbihhY3Rpb246IFRhYmxlQWN0aW9uSW50ZXJuYWw8RW50aXR5VHlwZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVxdWlyZUNvbmZpcm1EaWFsb2c6IGJvb2xlYW4gPSBydW5JbkluamVjdGlvbkNvbnRleHQoXG4gICAgICAgICAgICB0aGlzLmluamVjdG9yLFxuICAgICAgICAgICAgKCkgPT4gYWN0aW9uLnJlcXVpcmVDb25maXJtRGlhbG9nKHRoaXMuaGFzTWFueVRhYmxlQ29udGV4dC4kaW1wbGljaXQuc2VsZWN0aW9uLnNlbGVjdGVkKVxuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlcXVpcmVDb25maXJtRGlhbG9nKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpcm1SdW5IYXNNYW55VGFibGVBY3Rpb24oYWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRUZXh0OiBzdHJpbmdbXSA9IGFjdGlvbi50eXBlID09PSAnbXVsdGktc2VsZWN0J1xuICAgICAgICAgICAgPyB0aGlzLmdsb2JhbENvbmZpZy5jb25maXJtTXVsdGlTZWxlY3RBY3Rpb25UZXh0KHRoaXMuaGFzTWFueVRhYmxlQ29udGV4dC4kaW1wbGljaXQuc2VsZWN0aW9uLnNlbGVjdGVkKVxuICAgICAgICAgICAgOiB0aGlzLmdsb2JhbENvbmZpZy5jb25maXJtQmFzZUFjdGlvblRleHQ7XG4gICAgICAgIGNvbnN0IGRpYWxvZ0RhdGE6IENvbmZpcm1EaWFsb2dEYXRhSW50ZXJuYWwgPSBuZXcgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyKHRoaXMuZ2xvYmFsQ29uZmlnLCBhY3Rpb24uY29uZmlybURpYWxvZ0RhdGEpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ3RleHQnLCBkZWZhdWx0VGV4dClcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGl0bGUnLCBhY3Rpb24uZGlzcGxheU5hbWUpXG4gICAgICAgICAgICAuZ2V0UmVzdWx0KCk7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIGJvb2xlYW4+ID0gdGhpcy5kaWFsb2cub3BlbihOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiBkaWFsb2dEYXRhLFxuICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlczogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpKTtcbiAgICAgICAgaWYgKHJlcyA9PSB0cnVlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpcm1SdW5IYXNNYW55VGFibGVBY3Rpb24oYWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29uZmlybVJ1bkhhc01hbnlUYWJsZUFjdGlvbihhY3Rpb246IFRhYmxlQWN0aW9uSW50ZXJuYWw8RW50aXR5VHlwZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuaW5qZWN0b3IsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGFjdGlvbi5hY3Rpb24odGhpcy5oYXNNYW55VGFibGVDb250ZXh0LiRpbXBsaWNpdC5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICAgICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbiBUYWJsZUFjdGlvbiBpcyBkaXNhYmxlZCAoZS5nLiBCZWNhdXNlIG5vIGVudHJpZXMgaGF2ZSBiZWVuIHNlbGVjdGVkKS5cbiAgICAgKiBAcGFyYW0gYWN0aW9uIC0gVGhlIFRhYmxlQWN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBBY3Rpb24gY2FuIGJlIHVzZWQuXG4gICAgICovXG4gICAgaGFzTWFueVRhYmxlQWN0aW9uRGlzYWJsZWQoYWN0aW9uOiBUYWJsZUFjdGlvbkludGVybmFsPEVudGl0eVR5cGU+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFhY3Rpb24uZW5hYmxlZCh0aGlzLmhhc01hbnlUYWJsZUNvbnRleHQuJGltcGxpY2l0LnNlbGVjdGlvbi5zZWxlY3RlZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIHNlYXJjaCBpbnB1dCB0byBmaWx0ZXIgdGhlIHRhYmxlIGVudHJpZXMuXG4gICAgICogQHBhcmFtIGV2ZW50IC0gVGhlIGtleXVwLWV2ZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBzZWFyY2gtc3RyaW5nIG9mIHRoZSB1c2VyLlxuICAgICAqL1xuICAgIGFwcGx5SGFzTWFueUZpbHRlcihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmlsdGVyVmFsdWU6IHN0cmluZyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIHRoaXMuaGFzTWFueVRhYmxlQ29udGV4dC4kaW1wbGljaXQuZGF0YVNvdXJjZS5maWx0ZXIgPSBmaWx0ZXJWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGVudGl0eSBpcyB2YWxpZCBmb3IgdXBkYXRpbmcgYW5kIGlmIGl0IGlzIGRpcnR5LlxuICAgICAqL1xuICAgIGFzeW5jIGNoZWNrSGFzTWFueUVudGl0eSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lzSGFzTWFueUVudGl0eVZhbGlkKCd1cGRhdGUnKTtcbiAgICAgICAgdGhpcy5oYXNNYW55Q2hhbmdlcyA9IGF3YWl0IEVudGl0eVV0aWxpdGllcy5nZXREaWZmZXJlbmNlc0JldHdlZW5FbnRpdGllcyhcbiAgICAgICAgICAgIHRoaXMuaGFzTWFueUVudGl0eSxcbiAgICAgICAgICAgIHRoaXMuaGFzTWFueUVudGl0eVByaW9yQ2hhbmdlcyxcbiAgICAgICAgICAgIHRoaXMuaHR0cCxcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0b3JcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCF0aGlzLmhhc01hbnlWYWxpZGF0aW9uRXJyb3JzLmxlbmd0aCAmJiB0aGlzLmhhc01hbnlDaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5oYXNNYW55VG9vbHRpcENvbnRlbnQgPSBydW5JbkluamVjdGlvbkNvbnRleHQoXG4gICAgICAgICAgICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgICAgICAgICAgICAoKSA9PiBnZXRDaGFuZ2VzVG9vbHRpcENvbnRlbnQodGhpcy5oYXNNYW55Q2hhbmdlcylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0hhc01hbnlFbnRpdHlEaXJ0eSA9ICEhdGhpcy5oYXNNYW55Q2hhbmdlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbnRpdHkgaXMgdmFsaWQuXG4gICAgICogQHBhcmFtIG9taXQgLSBXaGV0aGVyIHZhbHVlcyBvbWl0dGVkIGZvciBjcmVhdGUgb3IgdXBkYXRlIHNob3VsZCBiZSBsZWZ0IG91dC5cbiAgICAgKi9cbiAgICBhc3luYyBjaGVja0lzSGFzTWFueUVudGl0eVZhbGlkKG9taXQ6ICdjcmVhdGUnIHwgJ3VwZGF0ZScpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5oYXNNYW55VmFsaWRhdGlvbkVycm9ycyA9IGF3YWl0IFZhbGlkYXRpb25VdGlsaXRpZXMuZ2V0RW50aXR5VmFsaWRhdGlvbkVycm9ycyh0aGlzLmhhc01hbnlFbnRpdHksIHRoaXMuaW5qZWN0b3IsIG9taXQpO1xuICAgICAgICBpZiAodGhpcy5oYXNNYW55VmFsaWRhdGlvbkVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzTWFueVRvb2x0aXBDb250ZW50ID0gcnVuSW5JbmplY3Rpb25Db250ZXh0KFxuICAgICAgICAgICAgICAgIHRoaXMuaW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgKCkgPT4gZ2V0VmFsaWRhdGlvbkVycm9yc1Rvb2x0aXBDb250ZW50KHRoaXMuaGFzTWFueVZhbGlkYXRpb25FcnJvcnMpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNIYXNNYW55RW50aXR5VmFsaWQgPSB0aGlzLmhhc01hbnlWYWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgYXJyYXkgaXRlbSBpcyB2YWxpZCBhbmQgaWYgdGhlIGFycmF5IGl0ZW0gaXMgZGlydHkuXG4gICAgICovXG4gICAgYXN5bmMgY2hlY2tBcnJheUl0ZW0oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJc0FycmF5SXRlbVZhbGlkKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJc0FycmF5SXRlbURpcnR5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBhcnJheSBpdGVtIGlzIGRpcnR5LlxuICAgICAqL1xuICAgIGFzeW5jIGNoZWNrSXNBcnJheUl0ZW1EaXJ0eSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5hcnJheUl0ZW1DaGFuZ2VzID0gYXdhaXQgRW50aXR5VXRpbGl0aWVzLmdldERpZmZlcmVuY2VzQmV0d2VlbkVudGl0aWVzKFxuICAgICAgICAgICAgdGhpcy5hcnJheUl0ZW0sXG4gICAgICAgICAgICB0aGlzLmFycmF5SXRlbVByaW9yQ2hhbmdlcyxcbiAgICAgICAgICAgIHRoaXMuaHR0cCxcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0b3JcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCF0aGlzLmFycmF5SXRlbVZhbGlkYXRpb25FcnJvcnMubGVuZ3RoICYmIHRoaXMuYXJyYXlJdGVtQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlJdGVtVG9vbHRpcENvbnRlbnQgPSBydW5JbkluamVjdGlvbkNvbnRleHQoXG4gICAgICAgICAgICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgICAgICAgICAgICAoKSA9PiBnZXRDaGFuZ2VzVG9vbHRpcENvbnRlbnQodGhpcy5hcnJheUl0ZW1DaGFuZ2VzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQXJyYXlJdGVtRGlydHkgPSAhIXRoaXMuYXJyYXlJdGVtQ2hhbmdlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBhcnJheUl0ZW0gaXMgdmFsaWQuXG4gICAgICovXG4gICAgYXN5bmMgY2hlY2tJc0FycmF5SXRlbVZhbGlkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmFycmF5SXRlbVZhbGlkYXRpb25FcnJvcnMgPSBhd2FpdCBWYWxpZGF0aW9uVXRpbGl0aWVzLmdldEVudGl0eVZhbGlkYXRpb25FcnJvcnModGhpcy5hcnJheUl0ZW0sIHRoaXMuaW5qZWN0b3IsICdjcmVhdGUnKTtcbiAgICAgICAgaWYgKHRoaXMuYXJyYXlJdGVtVmFsaWRhdGlvbkVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlJdGVtVG9vbHRpcENvbnRlbnQgPSBydW5JbkluamVjdGlvbkNvbnRleHQoXG4gICAgICAgICAgICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgICAgICAgICAgICAoKSA9PiBnZXRWYWxpZGF0aW9uRXJyb3JzVG9vbHRpcENvbnRlbnQodGhpcy5hcnJheUl0ZW1WYWxpZGF0aW9uRXJyb3JzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQXJyYXlJdGVtVmFsaWQgPSB0aGlzLmFycmF5SXRlbVZhbGlkYXRpb25FcnJvcnMubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRzIHRoYXQgYSB0aGUgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICAgKi9cbiAgICBlbWl0Q2hhbmdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0Q2hhbmdlRXZlbnQuZW1pdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIGFkZCBhbiBpdGVtIHRvIHRoZSBlbnRpdHkgYXJyYXkuXG4gICAgICogRG9lcyB0aGlzIGVpdGhlciBpbmxpbmUgaWYgdGhlIFwiY3JlYXRlSW5saW5lXCItbWV0YWRhdGEgaXMgc2V0IHRvIHRydWVcbiAgICAgKiBvciBpbiBhIHNlcGFyYXRlIGRpYWxvZyBpZiBpdCBpcyBzZXQgdG8gZmFsc2UuXG4gICAgICovXG4gICAgYXN5bmMgYWRkRW50aXR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSXNBcnJheUl0ZW1WYWxpZCgpO1xuICAgICAgICBpZiAoIXRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5jcmVhdGVJbmxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQXJyYXlJdGVtRGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEFycmF5SXRlbURpYWxvZyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiAnNjAlJyxcbiAgICAgICAgICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuYWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdGhpcy5lbnRpdHlBcnJheVRhYmxlQ29udGV4dC4kaW1wbGljaXQuZGF0YVNvdXJjZS5kYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF3YWl0IEVudGl0eVV0aWxpdGllcy5pc0VxdWFsKHRoaXMuYXJyYXlJdGVtLCB2LCB0aGlzLm1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuaXRlbVR5cGUsIHRoaXMuaHR0cCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2cub3BlbihOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuZHVwbGljYXRlc0Vycm9yRGlhbG9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgKHRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldIGFzIEVudGl0eVR5cGVbXSkucHVzaChMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHRoaXMuYXJyYXlJdGVtKSk7XG4gICAgICAgIHRoaXMuZW50aXR5QXJyYXlUYWJsZUNvbnRleHQuJGltcGxpY2l0LmRhdGFTb3VyY2UuZGF0YSA9ICh0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyBFbnRpdHlUeXBlW10pO1xuICAgICAgICBFbnRpdHlVdGlsaXRpZXMucmVzZXRDaGFuZ2VzT25FbnRpdHkodGhpcy5hcnJheUl0ZW0sIHRoaXMuYXJyYXlJdGVtUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgRW50aXR5VXRpbGl0aWVzLnNldERlZmF1bHRWYWx1ZXModGhpcy5hcnJheUl0ZW0pO1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSXNBcnJheUl0ZW1WYWxpZCgpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBhcnJheSBpdGVtIGRlZmluZWQgaW4gdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBhc3luYyBhZGRBcnJheUl0ZW0oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5pc0FycmF5SXRlbVZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgKHRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldIGFzIEVudGl0eVR5cGVbXSkucHVzaChMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHRoaXMuYXJyYXlJdGVtKSk7XG4gICAgICAgIHRoaXMuZW50aXR5QXJyYXlUYWJsZUNvbnRleHQuJGltcGxpY2l0LmRhdGFTb3VyY2UuZGF0YSA9ICh0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyBFbnRpdHlUeXBlW10pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY2xvc2VBZGRBcnJheUl0ZW1EaWFsb2coKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIGFkZGluZyB0aGUgYXJyYXkgaXRlbSBkZWZpbmVkIGluIHRoZSBkaWFsb2cuXG4gICAgICovXG4gICAgYXN5bmMgY2xvc2VBZGRBcnJheUl0ZW1EaWFsb2coKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuYWRkQXJyYXlJdGVtRGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICAgIEVudGl0eVV0aWxpdGllcy5yZXNldENoYW5nZXNPbkVudGl0eSh0aGlzLmFycmF5SXRlbSwgdGhpcy5hcnJheUl0ZW1QcmlvckNoYW5nZXMpO1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSXNBcnJheUl0ZW1WYWxpZCgpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFZGl0cyBhbiBlbnRpdHkgYXJyYXkgaXRlbS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0aGF0IGhhcyBiZWVuIGNsaWNrZWQuXG4gICAgICogQHBhcmFtIGRDb2wgLSBUaGUgZGlzcGxheSBjb2x1bW4gdGhhdCB3YXMgY2xpY2tlZCBvbi5cbiAgICAgKi9cbiAgICBhc3luYyBlZGl0QXJyYXlJdGVtKGVudGl0eTogRW50aXR5VHlwZSwgZENvbDogRGlzcGxheUNvbHVtbjxFbnRpdHlUeXBlPik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoZENvbC5kaXNhYmxlQ2xpY2sgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGV4T2ZFZGl0ZWRBcnJheUl0ZW0gPSB0aGlzLmVudGl0eUFycmF5VGFibGVDb250ZXh0LiRpbXBsaWNpdC5kYXRhU291cmNlLmRhdGEuaW5kZXhPZihlbnRpdHkpO1xuICAgICAgICB0aGlzLmFycmF5SXRlbSA9IG5ldyB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuRW50aXR5Q2xhc3MoZW50aXR5KTtcbiAgICAgICAgdGhpcy5hcnJheUl0ZW1QcmlvckNoYW5nZXMgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHRoaXMuYXJyYXlJdGVtKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXJyYXlJdGVtKCk7XG5cbiAgICAgICAgdGhpcy5lZGl0QXJyYXlJdGVtRGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihcbiAgICAgICAgICAgIHRoaXMuZWRpdEFycmF5SXRlbURpYWxvZyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtaW5XaWR0aDogJzYwJScsXG4gICAgICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZXMgY2hhbmdlcyBvbiB0aGUgYXJyYXkgaXRlbSBpbiB0aGUgZGlhbG9nLlxuICAgICAqL1xuICAgIHNhdmVBcnJheUl0ZW0oKTogdm9pZCB7XG4gICAgICAgICh0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyBFbnRpdHlUeXBlW10pW3RoaXMuaW5kZXhPZkVkaXRlZEFycmF5SXRlbV0gPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHRoaXMuYXJyYXlJdGVtKTtcbiAgICAgICAgdGhpcy5lbnRpdHlBcnJheVRhYmxlQ29udGV4dC4kaW1wbGljaXQuZGF0YVNvdXJjZS5kYXRhID0gKHRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldIGFzIEVudGl0eVR5cGVbXSk7XG5cbiAgICAgICAgdm9pZCB0aGlzLmNsb3NlRWRpdEFycmF5SXRlbURpYWxvZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgZWRpdCBhcnJheSBpdGVtIGRpYWxvZyBhbmQgcmVzZXRzIGNoYW5nZXMuXG4gICAgICovXG4gICAgYXN5bmMgY2xvc2VFZGl0QXJyYXlJdGVtRGlhbG9nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVkaXRBcnJheUl0ZW1EaWFsb2dSZWYuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5hcnJheUl0ZW0gPSBuZXcgdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LkVudGl0eUNsYXNzKCk7XG4gICAgICAgIHRoaXMuYXJyYXlJdGVtUHJpb3JDaGFuZ2VzID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLmFycmF5SXRlbSk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcnJheUl0ZW0oKTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgc2VsZWN0ZWQgZW50cmllcyBmcm9tIHRoZSBlbnRpdHkgYXJyYXkuXG4gICAgICovXG4gICAgcmVtb3ZlRnJvbUVudGl0eUFycmF5KCk6IHZvaWQge1xuICAgICAgICBTZWxlY3Rpb25VdGlsaXRpZXMucmVtb3ZlKFxuICAgICAgICAgICAgdGhpcy5lbnRpdHlBcnJheVRhYmxlQ29udGV4dC4kaW1wbGljaXQuc2VsZWN0aW9uLFxuICAgICAgICAgICAgdGhpcy5lbnRpdHlbdGhpcy5wcm9wZXJ0eUtleV0gYXMgRW50aXR5VHlwZVtdLFxuICAgICAgICAgICAgdGhpcy5lbnRpdHlBcnJheVRhYmxlQ29udGV4dC4kaW1wbGljaXQuZGF0YVNvdXJjZVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG59IiwiPCEtLSBlc2xpbnQtZGlzYWJsZSBhbmd1bGFyL25vLWNhbGwtZXhwcmVzc2lvbiAtLT5cbiBcbkBpZighKGhpZGVPbWl0Rm9yQ3JlYXRlICYmIG1ldGFkYXRhLm9taXRGb3JDcmVhdGUpICYmICEoaGlkZU9taXRGb3JFZGl0ICYmIG1ldGFkYXRhLm9taXRGb3JVcGRhdGUpKSB7XG4gICAgQHN3aXRjaCAodHlwZSkge1xuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tU3RyaW5ncy0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuU1RSSU5HKSB7XG4gICAgICAgICAgICA8c3RyaW5nLWlucHV0XG4gICAgICAgICAgICAgICAgW2VudGl0eV09XCJlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtrZXldPVwicHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9zdHJpbmctaW5wdXQ+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLlNUUklOR19URVhUQk9YKSB7XG4gICAgICAgICAgICA8c3RyaW5nLXRleHRib3gtaW5wdXRcbiAgICAgICAgICAgICAgICBbZW50aXR5XT1cImVudGl0eVwiXG4gICAgICAgICAgICAgICAgW2tleV09XCJwcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3N0cmluZy10ZXh0Ym94LWlucHV0PlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5TVFJJTkdfQVVUT0NPTVBMRVRFKSB7XG4gICAgICAgICAgICA8c3RyaW5nLWF1dG9jb21wbGV0ZS1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvc3RyaW5nLWF1dG9jb21wbGV0ZS1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuU1RSSU5HX0RST1BET1dOKSB7XG4gICAgICAgICAgICA8c3RyaW5nLWRyb3Bkb3duLWlucHV0XG4gICAgICAgICAgICAgICAgW2VudGl0eV09XCJlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtrZXldPVwicHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9zdHJpbmctZHJvcGRvd24taW5wdXQ+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLlNUUklOR19QQVNTV09SRCkge1xuICAgICAgICAgICAgPHN0cmluZy1wYXNzd29yZC1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvc3RyaW5nLXBhc3N3b3JkLWlucHV0PlxuICAgICAgICB9XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS1Cb29sZWFucy0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5CT09MRUFOX0NIRUNLQk9YKSB7XG4gICAgICAgICAgICA8Ym9vbGVhbi1jaGVja2JveC1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvYm9vbGVhbi1jaGVja2JveC1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuQk9PTEVBTl9UT0dHTEUpIHtcbiAgICAgICAgICAgIDxib29sZWFuLXRvZ2dsZS1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvYm9vbGVhbi10b2dnbGUtaW5wdXQ+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLkJPT0xFQU5fRFJPUERPV04pIHtcbiAgICAgICAgICAgIDxib29sZWFuLWRyb3Bkb3duLWlucHV0XG4gICAgICAgICAgICAgICAgW2VudGl0eV09XCJlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtrZXldPVwicHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9ib29sZWFuLWRyb3Bkb3duLWlucHV0PlxuICAgICAgICB9XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tTnVtYmVycy0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5OVU1CRVIpIHtcbiAgICAgICAgICAgIDxudW1iZXItaW5wdXRcbiAgICAgICAgICAgICAgICBbZW50aXR5XT1cImVudGl0eVwiXG4gICAgICAgICAgICAgICAgW2tleV09XCJwcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L251bWJlci1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuTlVNQkVSX0RST1BET1dOKSB7XG4gICAgICAgICAgICA8bnVtYmVyLWRyb3Bkb3duLWlucHV0XG4gICAgICAgICAgICAgICAgW2VudGl0eV09XCJlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtrZXldPVwicHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9udW1iZXItZHJvcGRvd24taW5wdXQ+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLk5VTUJFUl9TTElERVIpIHtcbiAgICAgICAgICAgIDxudW1iZXItc2xpZGVyLWlucHV0XG4gICAgICAgICAgICAgICAgW2VudGl0eV09XCJlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtrZXldPVwicHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9udW1iZXItc2xpZGVyLWlucHV0PlxuICAgICAgICB9XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLUFycmF5LS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5BUlJBWV9EQVRFKSB7XG4gICAgICAgICAgICA8YXJyYXktZGF0ZS1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvYXJyYXktZGF0ZS1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURV9USU1FKSB7XG4gICAgICAgICAgICA8YXJyYXktZGF0ZS10aW1lLWlucHV0XG4gICAgICAgICAgICAgICAgW2VudGl0eV09XCJlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtrZXldPVwicHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9hcnJheS1kYXRlLXRpbWUtaW5wdXQ+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLkFSUkFZX0RBVEVfUkFOR0UpIHtcbiAgICAgICAgICAgIDxhcnJheS1kYXRlLXJhbmdlLWlucHV0XG4gICAgICAgICAgICAgICAgW2VudGl0eV09XCJlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtrZXldPVwicHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9hcnJheS1kYXRlLXJhbmdlLWlucHV0PlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5BUlJBWV9TVFJJTkdfQ0hJUFMpIHtcbiAgICAgICAgICAgIDxhcnJheS1zdHJpbmctY2hpcHMtaW5wdXRcbiAgICAgICAgICAgICAgICBbZW50aXR5XT1cImVudGl0eVwiXG4gICAgICAgICAgICAgICAgW2tleV09XCJwcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2FycmF5LXN0cmluZy1jaGlwcy1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuQVJSQVlfU1RSSU5HX0FVVE9DT01QTEVURV9DSElQUykge1xuICAgICAgICAgICAgPGFycmF5LXN0cmluZy1hdXRvY29tcGxldGUtY2hpcHNcbiAgICAgICAgICAgICAgICBbZW50aXR5XT1cImVudGl0eVwiXG4gICAgICAgICAgICAgICAgW2tleV09XCJwcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2FycmF5LXN0cmluZy1hdXRvY29tcGxldGUtY2hpcHM+XG4gICAgICAgIH1cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tRGF0ZXMtLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLkRBVEUpIHtcbiAgICAgICAgICAgIDxkYXRlLWlucHV0XG4gICAgICAgICAgICAgICAgW2VudGl0eV09XCJlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtrZXldPVwicHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9kYXRlLWlucHV0PlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5EQVRFX1JBTkdFKSB7XG4gICAgICAgICAgICA8ZGF0ZS1yYW5nZS1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGF0ZS1yYW5nZS1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuREFURV9USU1FKSB7XG4gICAgICAgICAgICA8ZGF0ZS10aW1lLWlucHV0XG4gICAgICAgICAgICAgICAgW2VudGl0eV09XCJlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtrZXldPVwicHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9kYXRlLXRpbWUtaW5wdXQ+XG4gICAgICAgIH1cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tRmlsZXMtLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLkZJTEVfREVGQVVMVCkge1xuICAgICAgICAgICAgPGZpbGUtZGVmYXVsdC1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZmlsZS1kZWZhdWx0LWlucHV0PlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5GSUxFX0lNQUdFKSB7XG4gICAgICAgICAgICA8ZmlsZS1pbWFnZS1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZmlsZS1pbWFnZS1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tIHJlZmVyZW5jZXMgbWFueSAtLS0tLS0tLS0tLS0tPlxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuUkVGRVJFTkNFU19NQU5ZKSB7XG4gICAgICAgICAgICA8cmVmZXJlbmNlcy1tYW55LWlucHV0XG4gICAgICAgICAgICAgICAgW2VudGl0eV09XCJlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtrZXldPVwicHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9yZWZlcmVuY2VzLW1hbnktaW5wdXQ+XG4gICAgICAgIH1cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tQ3VzdG9tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLkNVU1RPTSkge1xuICAgICAgICAgICAgPGN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvY3VzdG9tLWlucHV0PlxuICAgICAgICB9XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLU9iamVjdC0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5PQkpFQ1QpIHtcbiAgICAgICAgICAgIDxiPnt7bWV0YWRhdGFEZWZhdWx0T2JqZWN0LmRpc3BsYXlOYW1lfX08L2I+XG4gICAgICAgICAgICA8IS0tIGl0ZXJhdGVzIG92ZXIgdGhlIG9iamVjdCBwcm9wZXJ0aWVzIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvcm07IGNvbnRleHQ6IG9iamVjdEZvcm1Db250ZXh0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS1PYmplY3QgRHJvcGRvd24tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLk9CSkVDVF9EUk9QRE9XTikge1xuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwib2JqZWN0LWRyb3Bkb3duXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e21ldGFkYXRhLmRpc3BsYXlOYW1lfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCAjbW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwib2JqZWN0RHJvcGRvd25OYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkKGVudGl0eSlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbXBhcmVXaXRoXT1cImNvbXBhcmVPYmplY3RzQm91bmRcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIlxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgICAgICAgIChvcGVuZWQpPVwic2VsZWN0U2VhcmNoSW5wdXQuZm9jdXMoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJzZWxlY3Qtc2VhcmNoLWlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBhbmd1bGFyL25vLWFueSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjc2VsZWN0U2VhcmNoSW5wdXQgbWF0SW5wdXQgKGtleXVwKT1cImZpbHRlck9iamVjdERyb3Bkb3duVmFsdWVzKCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBtYXRTdWZmaXggY2xhc3M9XCJmYXMgZmEtc2VhcmNoXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKCFtZXRhZGF0YS5yZXF1aXJlZChlbnRpdHkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbj4tPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvdWxkRGlzcGxheUN1cnJlbnRPYmplY3REcm9wZG93blZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiY3VycmVudE9iamVjdERyb3Bkb3duVmFsdWU/LnZhbHVlXCI+e3tjdXJyZW50T2JqZWN0RHJvcGRvd25WYWx1ZT8uZGlzcGxheU5hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAZm9yICh2YWx1ZSBvZiBmaWx0ZXJlZE9iamVjdERyb3Bkb3duVmFsdWVzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJ2YWx1ZS52YWx1ZVwiPnt7dmFsdWUuZGlzcGxheU5hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yPnt7aW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICB9XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0gcmVmZXJlbmNlcyBvbmUgLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5SRUZFUkVOQ0VTX09ORSkge1xuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgI2lucHV0TW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwicmVmZXJlbmNlc09uZU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkKGVudGl0eSlcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIlxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cInNldFJlZmVyZW5jZXNPbmVPYmplY3QoKVwiXG4gICAgICAgICAgICAgICAgICAgIChvcGVuZWQpPVwic2VsZWN0U2VhcmNoSW5wdXQuZm9jdXMoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJzZWxlY3Qtc2VhcmNoLWlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBhbmd1bGFyL25vLWFueSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjc2VsZWN0U2VhcmNoSW5wdXQgbWF0SW5wdXQgKGtleXVwKT1cImZpbHRlclJlZmVyZW5jZXNPbmVWYWx1ZXMoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIG1hdFN1ZmZpeCBjbGFzcz1cImZhcyBmYS1zZWFyY2hcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoIW1ldGFkYXRhLnJlcXVpcmVkKGVudGl0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uPi08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzaG91bGREaXNwbGF5Q3VycmVudFJlZmVyZW5jZXNPbmVEcm9wZG93blZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiY3VycmVudFJlZmVyZW5jZXNPbmVEcm9wZG93blZhbHVlPy52YWx1ZVwiPnt7Y3VycmVudFJlZmVyZW5jZXNPbmVEcm9wZG93blZhbHVlPy5kaXNwbGF5TmFtZX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHZhbHVlIG9mIGZpbHRlcmVkUmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWVzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJ2YWx1ZS52YWx1ZVwiPnt7dmFsdWUuZGlzcGxheU5hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yPnt7aW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKGlucHV0TW9kZWwpfX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8IS0tIGl0ZXJhdGVzIG92ZXIgdGhlIHJlZmVyZW5jZXMgb25lIHByb3BlcnRpZXMgLS0+XG4gICAgICAgICAgICBAaWYgKHJlZmVyZW5jZXNPbmVGb3JtQ29udGV4dCkge1xuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb3JtOyBjb250ZXh0OiByZWZlcmVuY2VzT25lRm9ybUNvbnRleHRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS1BcnJheS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuQVJSQVkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbnRpdHlBcnJheVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtZWxldmF0aW9uLXo4IGVsZXZhdGlvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycmF5LWhlYWRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Yj57e21ldGFkYXRhRW50aXR5QXJyYXkuZGlzcGxheU5hbWV9fTwvYj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAobWV0YWRhdGFFbnRpdHlBcnJheS5jcmVhdGVJbmxpbmUgJiYgIWludGVybmFsSXNSZWFkT25seSAmJiBhZGRBcnJheUl0ZW1Gb3JtQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvcm07IGNvbnRleHQ6IGFkZEFycmF5SXRlbUZvcm1Db250ZXh0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmICghaW50ZXJuYWxJc1JlYWRPbmx5ICYmIGVudGl0eUFycmF5VGFibGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZXRhZGF0YUVudGl0eUFycmF5LmNyZWF0ZUlubGluZSAmJiAhaXNBcnJheUl0ZW1WYWxpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRFbnRpdHkoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e21ldGFkYXRhRW50aXR5QXJyYXkuYWRkQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZW50aXR5QXJyYXlUYWJsZUNvbnRleHQuJGltcGxpY2l0LnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlRnJvbUVudGl0eUFycmF5KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ttZXRhZGF0YUVudGl0eUFycmF5LnJlbW92ZUJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoZW50aXR5QXJyYXlUYWJsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZTsgY29udGV4dDogZW50aXR5QXJyYXlUYWJsZUNvbnRleHRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0gaGFzIG1hbnkgLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLkhBU19NQU5ZKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGFzTWFueVwiPlxuICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cInRpdGxlXCI+e3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLnRpdGxlfX08L2gyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiY29sLWxnLTggY29sLW1kLTYgY29sLXNtLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7bWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5zZWFyY2hMYWJlbH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgKGtleXVwKT1cImFwcGx5SGFzTWFueUZpbHRlcigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAobWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmNvbC1sZy0yXT1cImhhc01hbnlBbGxvd0NyZWF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmNvbC1sZy00XT1cIiFoYXNNYW55QWxsb3dDcmVhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jb2wtbWQtM109XCJoYXNNYW55QWxsb3dDcmVhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jb2wtbWQtNl09XCIhaGFzTWFueUFsbG93Q3JlYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY29sLXNtLTZdPVwiaGFzTWFueUFsbG93Q3JlYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY29sLXNtLTEyXT1cIiFoYXNNYW55QWxsb3dDcmVhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYWN0aW9ucy1idXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGFibGVBY3Rpb25zTGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmFsbG93SnNvbkltcG9ydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cImhhc01hbnlUYWJsZUFjdGlvbkRpc2FibGVkKGhhc01hbnlJbXBvcnRBY3Rpb24pXCIgKGNsaWNrKT1cInJ1bkhhc01hbnlUYWJsZUFjdGlvbihoYXNNYW55SW1wb3J0QWN0aW9uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2hhc01hbnlJbXBvcnRBY3Rpb24uZGlzcGxheU5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoYWN0aW9uIG9mIG1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGFibGVBY3Rpb25zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJoYXNNYW55VGFibGVBY3Rpb25EaXNhYmxlZChhY3Rpb24pXCIgKGNsaWNrKT1cInJ1bkhhc01hbnlUYWJsZUFjdGlvbihhY3Rpb24pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YWN0aW9uLmRpc3BsYXlOYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChoYXNNYW55QWxsb3dDcmVhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY29sLWxnLTJdPVwibWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY29sLWxnLTRdPVwiIW1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGFibGVBY3Rpb25zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmNvbC1tZC0zXT1cIm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGFibGVBY3Rpb25zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmNvbC1tZC02XT1cIiFtZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jb2wtc20tNl09XCJtZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jb2wtc20tMTJdPVwiIW1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGFibGVBY3Rpb25zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjcmVhdGUtYnV0dG9uXCIgbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cImNyZWF0ZUhhc01hbnlFbnRpdHkoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuY3JlYXRlQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejggZWxldmF0aW9uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGhhc01hbnlUYWJsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZTsgY29udGV4dDogaGFzTWFueVRhYmxlQ29udGV4dFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgPGRpdj5FUlJPUjogVGhlIHR5cGUge3t0eXBlfX0gaXMgbm90IGtub3duLjwvZGl2PlxuICAgICAgICB9XG4gICAgfVxufVxuXG5cbjxuZy10ZW1wbGF0ZSAjdGFibGUgbGV0LWNvbnRleHQ+XG4gICAgPG1hdC10YWJsZSBtYXRTb3J0IFtkYXRhU291cmNlXT1cImNvbnRleHQuZGF0YVNvdXJjZVwiIFtjbGFzcy50YWJsZS13aXRoLWVycm9yLXNsb3RdPVwiY29udGV4dC5zaG91bGRTaG93TWlzc2luZ0Vycm9yXCI+XG4gICAgICAgIDwhLS0gc2VsZWN0IENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIj5cbiAgICAgICAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBbY2hlY2tlZF09XCJjb250ZXh0LnNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIFNlbGVjdGlvblV0aWxpdGllcy5pc0FsbFNlbGVjdGVkKGNvbnRleHQuc2VsZWN0aW9uLCBjb250ZXh0LmRhdGFTb3VyY2UpXCJcbiAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiY29udGV4dC5zZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhU2VsZWN0aW9uVXRpbGl0aWVzLmlzQWxsU2VsZWN0ZWQoY29udGV4dC5zZWxlY3Rpb24sIGNvbnRleHQuZGF0YVNvdXJjZSlcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IFNlbGVjdGlvblV0aWxpdGllcy5tYXN0ZXJUb2dnbGUoY29udGV4dC5zZWxlY3Rpb24sIGNvbnRleHQuZGF0YVNvdXJjZSkgOiBudWxsXCI+XG4gICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICA8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCB2YWx1ZVwiIFtkeW5hbWljU3R5bGVDbGFzc2VzXT1cImNvbnRleHQuZHluYW1pY1Jvd1N0eWxlQ2xhc3Nlc1wiIFt2YWx1ZV09XCJ2YWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggW2NoZWNrZWRdPVwiY29udGV4dC5zZWxlY3Rpb24uaXNTZWxlY3RlZCh2YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBjb250ZXh0LnNlbGVjdGlvbi50b2dnbGUodmFsdWUpIDogbnVsbFwiPlxuICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgPC9tYXQtY2VsbD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgQGZvciAoZENvbCBvZiBjb250ZXh0LmRpc3BsYXlDb2x1bW5zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJkQ29sLmRpc3BsYXlOYW1lXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIHt7ZENvbC5kaXNwbGF5TmFtZX19XG4gICAgICAgICAgICAgICAgPC9tYXQtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICAgICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHZhbHVlXCIgW2NsYXNzLmVuYWJsZWRdPVwiIWRDb2wuZGlzYWJsZUNsaWNrICYmIGNvbnRleHQuYWxsb3dDbGljayh2YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICBbZHluYW1pY1N0eWxlQ2xhc3Nlc109XCJjb250ZXh0LmR5bmFtaWNSb3dTdHlsZUNsYXNzZXNcIiBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tDZWxsKHZhbHVlLCBkQ29sLCBjb250ZXh0KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGRDb2wuQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGlzcGxheS1jb2x1bW4tdmFsdWUgW2VudGl0eV09XCJ2YWx1ZVwiIFtDb21wb25lbnRDbGFzc109XCJkQ29sLkNvbXBvbmVudFwiPjwvZGlzcGxheS1jb2x1bW4tdmFsdWU+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAge3tnZXREaXNwbGF5Q29sdW1uVmFsdWUodmFsdWUsIGRDb2wpfX1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbWF0LWNlbGw+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29udGV4dC5kaXNwbGF5ZWRDb2x1bW5zXCI+PC9tYXQtaGVhZGVyLXJvdz5cbiAgICAgICAgPG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGNvbnRleHQuZGlzcGxheWVkQ29sdW1uc1wiPjwvbWF0LXJvdz5cbiAgICA8L21hdC10YWJsZT5cblxuICAgIEBpZiAoY29udGV4dC5kaXNwbGF5TG9hZGluZ1NwaW5uZXIgJiYgY29udGV4dC5pc0xvYWRpbmcpIHtcbiAgICAgICAgPG1hdC1zcGlubmVyPlxuICAgICAgICA8L21hdC1zcGlubmVyPlxuICAgIH1cbiAgICBAZWxzZSBpZiAoY29udGV4dC5zaG91bGRTaG93TWlzc2luZ0Vycm9yICYmICFjb250ZXh0LmRhdGFTb3VyY2UuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWVycm9yXCI+e3tjb250ZXh0LmVtcHR5RXJyb3JNZXNzYWdlfX08L2Rpdj5cbiAgICB9XG5cbiAgICA8bWF0LXBhZ2luYXRvciBbbGVuZ3RoXT1cImNvbnRleHQuZGF0YVNvdXJjZS5maWx0ZXJlZERhdGEubGVuZ3RoXCIgW3BhZ2VJbmRleF09XCIwXCIgW3BhZ2VTaXplXT1cIjEwXCIgW3BhZ2VTaXplT3B0aW9uc109XCJbNSwgMTAsIDI1LCA1MF1cIj48L21hdC1wYWdpbmF0b3I+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRm9ybS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG48bmctdGVtcGxhdGUgI2Zvcm0gbGV0LWNvbnRleHQ+XG4gICAgIDwhLS0gZXNsaW50LWRpc2FibGUgYW5ndWxhci9uby1jYWxsLWV4cHJlc3Npb24gLS0+XG4gICAgQGlmIChjb250ZXh0LnRhYnMubGVuZ3RoID4gMSkge1xuICAgICAgICA8bWF0LXRhYi1ncm91cCBwcmVzZXJ2ZUNvbnRlbnQ+XG4gICAgICAgICAgICBAZm9yICh0YWIgb2YgY29udGV4dC50YWJzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICA8bWF0LXRhYiBbbGFiZWxdPVwidGFiLnRhYk5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAocm93IG9mIHRhYi5yb3dzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChrZXkgb2Ygcm93LmtleXM7IHRyYWNrIGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiY29udGV4dC5lbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkRW1wdHldPVwiY29udGV4dC52YWxpZEVtcHR5Py4oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJjb250ZXh0LmlzUmVhZE9ubHk/Lihjb250ZXh0LmVudGl0eSwga2V5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiRW50aXR5VXRpbGl0aWVzLmdldFdpZHRoQ2xhc3Nlcyhjb250ZXh0LmVudGl0eSwga2V5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZU9taXRGb3JFZGl0XT1cImNvbnRleHQuaGlkZU9taXRGb3JFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckNyZWF0ZV09XCJjb250ZXh0LmhpZGVPbWl0Rm9yQ3JlYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImNvbnRleHQuaW5wdXRDaGFuZ2VFdmVudCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1tYXQtZW50aXR5LWlucHV0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L21hdC10YWItZ3JvdXA+XG4gICAgfVxuICAgIEBlbHNlIHtcbiAgICAgICAgQGlmICghY29udGV4dC50YWJzLmxlbmd0aCkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuby1lbnRpdHktdGFic1wiPlxuICAgICAgICAgICAgICAgIEVSUk9SOiBObyBJbnB1dHMuIERpZCB5b3UgY29ycmVjdGx5IGFzc2lnbiBhbGwgdmFsdWVzIGluIHRoZSBtb2RlbCBjb25zdHJ1Y3Rvcj9cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICBAZm9yIChyb3cgb2YgY29udGV4dC50YWJzWzBdLnJvd3M7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoa2V5IG9mIHJvdy5rZXlzOyB0cmFjayBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtbWF0LWVudGl0eS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiY29udGV4dC5lbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkRW1wdHldPVwiY29udGV4dC52YWxpZEVtcHR5Py4oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiY29udGV4dC5pc1JlYWRPbmx5Py4oY29udGV4dC5lbnRpdHksIGtleSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGhDbGFzc2VzKGNvbnRleHQuZW50aXR5LCBrZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZU9taXRGb3JFZGl0XT1cImNvbnRleHQuaGlkZU9taXRGb3JFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZU9taXRGb3JDcmVhdGVdPVwiY29udGV4dC5oaWRlT21pdEZvckNyZWF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY29udGV4dC5pbnB1dENoYW5nZUV2ZW50KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtbWF0LWVudGl0eS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tQWRkIEFycmF5IEl0ZW0gRGlhbG9nLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPG5nLXRlbXBsYXRlICNhZGRBcnJheUl0ZW1EaWFsb2c+XG4gICAgPGRpdiBjbGFzcz1cIm1hdC1kaWFsb2ctdGl0bGVcIj5cbiAgICAgICAgPGRpdj57e2FkZEFycmF5SXRlbURpYWxvZ0RhdGEudGl0bGV9fTwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGZvcm0+XG4gICAgICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgICAgICAgICBAaWYgKGFkZEFycmF5SXRlbUZvcm1Db250ZXh0KSB7XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvcm07IGNvbnRleHQ6IGFkZEFycmF5SXRlbUZvcm1Db250ZXh0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICAgIFxuICAgICAgICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgbWF0LXJhaXNlZC1idXR0b24gbWF0QmFkZ2VDb2xvcj1cIndhcm5cIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQXJyYXlJdGVtVmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VdPVwiYXJyYXlJdGVtVmFsaWRhdGlvbkVycm9ycy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwiIWFycmF5SXRlbVZhbGlkYXRpb25FcnJvcnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFycmF5SXRlbSgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7YWRkQXJyYXlJdGVtRGlhbG9nRGF0YS5jcmVhdGVCdXR0b25MYWJlbH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgQGlmIChhcnJheUl0ZW1WYWxpZGF0aW9uRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktdG9vbHRpcCBbdG9vbHRpcENvbnRlbnRdPVwiYXJyYXlJdGVtVG9vbHRpcENvbnRlbnRcIj48L25neC1tYXQtZW50aXR5LXRvb2x0aXA+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiBjbGFzcz1cImNhbmNlbC1idXR0b25cIiAoY2xpY2spPVwiY2xvc2VBZGRBcnJheUl0ZW1EaWFsb2coKVwiPlxuICAgICAgICAgICAgICAgIHt7YWRkQXJyYXlJdGVtRGlhbG9nRGF0YS5jYW5jZWxCdXR0b25MYWJlbH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPC9mb3JtPlxuXG48L25nLXRlbXBsYXRlPlxuXG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS1FZGl0IEFycmF5IEl0ZW0gRGlhbG9nLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPG5nLXRlbXBsYXRlICNlZGl0QXJyYXlJdGVtRGlhbG9nPlxuICAgIDxkaXYgY2xhc3M9XCJtYXQtZGlhbG9nLXRpdGxlXCI+XG4gICAgICAgIDxkaXY+e3tlZGl0QXJyYXlJdGVtRGlhbG9nRGF0YS50aXRsZShhcnJheUl0ZW1QcmlvckNoYW5nZXMpfX08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8Zm9ybT5cbiAgICAgICAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICAgICAgICAgIEBpZiAoZWRpdEFycmF5SXRlbUZvcm1Db250ZXh0KSB7XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvcm07IGNvbnRleHQ6IGVkaXRBcnJheUl0ZW1Gb3JtQ29udGV4dFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgICAgICAgXG4gICAgICAgIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTBweDtcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBtYXQtcmFpc2VkLWJ1dHRvbiBtYXRCYWRnZUNvbG9yPVwid2FyblwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iYWRnZS1jaGFuZ2VzXT1cIiFhcnJheUl0ZW1WYWxpZGF0aW9uRXJyb3JzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpbnRlcm5hbElzUmVhZE9ubHkgfHwgIWlzQXJyYXlJdGVtVmFsaWQgfHwgIWlzQXJyYXlJdGVtRGlydHlcIlxuICAgICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VdPVwiYXJyYXlJdGVtVmFsaWRhdGlvbkVycm9ycy5sZW5ndGggPiAwID8gYXJyYXlJdGVtVmFsaWRhdGlvbkVycm9ycy5sZW5ndGggOiBhcnJheUl0ZW1DaGFuZ2VzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRCYWRnZUhpZGRlbl09XCIhYXJyYXlJdGVtVmFsaWRhdGlvbkVycm9ycy5sZW5ndGggJiYgIWFycmF5SXRlbUNoYW5nZXMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNhdmVBcnJheUl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7e2VkaXRBcnJheUl0ZW1EaWFsb2dEYXRhLmNvbmZpcm1CdXR0b25MYWJlbH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgQGlmIChhcnJheUl0ZW1WYWxpZGF0aW9uRXJyb3JzLmxlbmd0aCB8fCBhcnJheUl0ZW1DaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktdG9vbHRpcCBbdG9vbHRpcENvbnRlbnRdPVwiYXJyYXlJdGVtVG9vbHRpcENvbnRlbnRcIj48L25neC1tYXQtZW50aXR5LXRvb2x0aXA+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiBjbGFzcz1cImNhbmNlbC1idXR0b25cIiAoY2xpY2spPVwiY2xvc2VFZGl0QXJyYXlJdGVtRGlhbG9nKClcIj5cbiAgICAgICAgICAgICAgICB7e2VkaXRBcnJheUl0ZW1EaWFsb2dEYXRhLmNhbmNlbEJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICA8L2Zvcm0+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS1DcmVhdGUgSGFzIE1hbnkgRGlhbG9nLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPG5nLXRlbXBsYXRlICNjcmVhdGVIYXNNYW55RGlhbG9nPlxuICAgIDxkaXYgY2xhc3M9XCJtYXQtZGlhbG9nLXRpdGxlXCI+XG4gICAgICAgIDxkaXY+e3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmNyZWF0ZURhdGEudGl0bGV9fTwvZGl2PlxuICAgIDwvZGl2PlxuICAgIFxuICAgIDxmb3JtPlxuICAgICAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICAgICAgQGlmIChoYXNNYW55Q3JlYXRlRm9ybUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9ybTsgY29udGV4dDogaGFzTWFueUNyZWF0ZUZvcm1Db250ZXh0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICBcbiAgICAgICAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMHB4O1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIG1hdC1yYWlzZWQtYnV0dG9uIG1hdEJhZGdlQ29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0hhc01hbnlFbnRpdHlWYWxpZFwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRCYWRnZV09XCJoYXNNYW55VmFsaWRhdGlvbkVycm9ycy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwiIWhhc01hbnlWYWxpZGF0aW9uRXJyb3JzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkaWFsb2dDcmVhdGVIYXNNYW55KClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmNyZWF0ZURhdGEuY3JlYXRlQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIEBpZiAoaGFzTWFueVZhbGlkYXRpb25FcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZ3gtbWF0LWVudGl0eS10b29sdGlwIFt0b29sdGlwQ29udGVudF09XCJoYXNNYW55VG9vbHRpcENvbnRlbnRcIj48L25neC1tYXQtZW50aXR5LXRvb2x0aXA+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiBjbGFzcz1cImNhbmNlbC1idXR0b25cIiAoY2xpY2spPVwiZGlhbG9nQ2FuY2VsQ3JlYXRlSGFzTWFueSgpXCI+XG4gICAgICAgICAgICAgICAge3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmNyZWF0ZURhdGEuY2FuY2VsQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvZm9ybT5cbiAgICBcbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPCEtLS0tLS0tLS0tLS0tLS0tLS0tLUVkaXQgSGFzIE1hbnkgRGlhbG9nLS0tLS0tLS0tLS0tLS0tLS0+XG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjxuZy10ZW1wbGF0ZSAjZWRpdEhhc01hbnlEaWFsb2c+XG4gICAgPGRpdiBjbGFzcz1cIm1hdC1kaWFsb2ctdGl0bGVcIj5cbiAgICAgICAgPGRpdj57e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEudGl0bGUoaGFzTWFueUVudGl0eVByaW9yQ2hhbmdlcyl9fTwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgQGlmIChtZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmVkaXREYXRhLmFjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LXJhaXNlZC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAge3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmVkaXREYXRhLmFjdGlvbnNMYWJlbH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgICAgICAgICAgQGZvciAoYWN0aW9uIG9mIG1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEuYWN0aW9uczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cImhhc01hbnlFZGl0QWN0aW9uRGlzYWJsZWQoYWN0aW9uKVwiIChjbGljayk9XCJoYXNNYW55UnVuRWRpdEFjdGlvbihhY3Rpb24pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2FjdGlvbi5kaXNwbGF5TmFtZX19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgIFxuICAgICAgICAgICAgQGlmIChoYXNNYW55QWxsb3dEZWxldGUoaGFzTWFueUVudGl0eSkpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiBjbGFzcz1cImRlbGV0ZS1idXR0b25cIiB0YWJpbmRleD1cIi0xXCIgKGNsaWNrKT1cImRlbGV0ZUhhc01hbnlFbnRpdHkoKVwiPlxuICAgICAgICAgICAgICAgICAgICB7e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEuZGVsZXRlQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8Zm9ybT5cbiAgICAgICAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICAgICAgICAgIEBpZiAoaGFzTWFueUVkaXRGb3JtQ29udGV4dCkge1xuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb3JtOyBjb250ZXh0OiBoYXNNYW55RWRpdEZvcm1Db250ZXh0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICBcbiAgICAgICAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMHB4O1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIG1hdC1yYWlzZWQtYnV0dG9uIG1hdEJhZGdlQ29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJhZGdlLWNoYW5nZXNdPVwiIWhhc01hbnlWYWxpZGF0aW9uRXJyb3JzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpbnRlcm5hbElzUmVhZE9ubHkgfHwgIWlzSGFzTWFueUVudGl0eVZhbGlkIHx8ICFpc0hhc01hbnlFbnRpdHlEaXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRCYWRnZV09XCJoYXNNYW55VmFsaWRhdGlvbkVycm9ycy5sZW5ndGggPiAwID8gaGFzTWFueVZhbGlkYXRpb25FcnJvcnMubGVuZ3RoIDogaGFzTWFueUNoYW5nZXMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdEJhZGdlSGlkZGVuXT1cIiFoYXNNYW55VmFsaWRhdGlvbkVycm9ycy5sZW5ndGggJiYgIWhhc01hbnlDaGFuZ2VzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkaWFsb2dFZGl0SGFzTWFueSgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7bWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5lZGl0RGF0YS5jb25maXJtQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIEBpZiAoaGFzTWFueVZhbGlkYXRpb25FcnJvcnMubGVuZ3RoIHx8IGhhc01hbnlDaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktdG9vbHRpcCBbdG9vbHRpcENvbnRlbnRdPVwiaGFzTWFueVRvb2x0aXBDb250ZW50XCI+PC9uZ3gtbWF0LWVudGl0eS10b29sdGlwPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LXJhaXNlZC1idXR0b24gY2xhc3M9XCJjYW5jZWwtYnV0dG9uXCIgKGNsaWNrKT1cImRpYWxvZ0NhbmNlbEVkaXRIYXNNYW55KClcIj5cbiAgICAgICAgICAgICAgICB7e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEuY2FuY2VsQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvZm9ybT5cbjwvbmctdGVtcGxhdGU+Il19
|
|
1306
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9pbnB1dC9pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2lucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25LLE9BQU8sRUFBRSxXQUFXLEVBQVcsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFnQixNQUFNLDBCQUEwQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLGVBQWUsRUFBa0IsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDN0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUM5RixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUMvRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUM1RyxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSxtRkFBbUYsQ0FBQztBQUMxSSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQztBQUNySCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxtRUFBbUUsQ0FBQztBQUNsSCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxtRUFBbUUsQ0FBQztBQUNsSCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUM1RyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUM3RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUMxRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNuRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUM3RixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUM5RyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUN4RyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxtRUFBbUUsQ0FBQztBQUNqSCxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSx3RUFBd0UsQ0FBQztBQUMxSCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUM5RyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUM5RyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUUzRyxPQUFPLEVBQW1DLGtDQUFrQyxFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDM0ksT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRzVFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBRzVHLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQzVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ25ILE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxrQ0FBa0MsRUFBMEIsTUFBTSxtQ0FBbUMsQ0FBQztBQUUvRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDL0QsT0FBTyxFQUF5QixlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN6RSxPQUFPLEVBQW1CLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDNUYsT0FBTyxFQUFFLHdCQUF3QixFQUE2QixNQUFNLCtDQUErQyxDQUFDO0FBQ3BILE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxpQkFBaUIsRUFBc0IsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUczRyxPQUFPLEVBQUUsdUJBQXVCLEVBQXVCLE1BQU0sNkJBQTZCLENBQUM7QUFDM0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0ZoRTs7Ozs7OztHQU9HO0FBbURILE1BQU0sT0FBTywwQkFBMEI7SUF1VWQ7SUFDQTtJQUNBO0lBRUU7SUFFQTtJQUNGO0lBNVVyQiwrQ0FBK0M7SUFDL0MsUUFBUSxHQUFtQixRQUFRLENBQUM7SUFFcEM7OztPQUdHO0lBRUgsTUFBTSxDQUFjO0lBRXBCOztPQUVHO0lBRUgsV0FBVyxDQUFvQjtJQUUvQjs7T0FFRztJQUVILHlCQUF5QixDQUE4QjtJQUN2RCwrQ0FBK0M7SUFDL0MsaUNBQWlDLENBQThCO0lBRS9EOzs7O09BSUc7SUFFSCxpQkFBaUIsQ0FBVztJQUU1Qjs7OztPQUlHO0lBRUgsZUFBZSxDQUFXO0lBRTFCOzs7O09BSUc7SUFFSCxVQUFVLENBQVcsQ0FBQyxPQUFPO0lBRTdCOzs7O09BSUc7SUFFSCxVQUFVLENBQVc7SUFDckIsK0NBQStDO0lBQy9DLGtCQUFrQixDQUFXO0lBRTdCOztPQUVHO0lBRU0sZ0JBQWdCLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7SUFFekU7Ozs7T0FJRztJQUNILElBQ1ksSUFBSSxDQUFDLElBQWE7UUFDMUIsaUVBQWlFO1FBQ2pFLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7UUFDcEgsQ0FBQztRQUNELGlFQUFpRTtRQUNqRSxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO1FBQzVILENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLENBQWtCO0lBQ3RCOztPQUVHO0lBQ0gsUUFBUSxDQUE0QztJQUVwRDs7T0FFRztJQUNILHFCQUFxQixDQUFvRDtJQUN6RTs7T0FFRztJQUNILGlCQUFpQixDQUE0QztJQUU3RDs7T0FFRztJQUNILHNCQUFzQixDQUFxRDtJQUMzRTs7T0FFRztJQUNLLG9CQUFvQixHQUE0QyxFQUFFLENBQUM7SUFDM0U7O09BRUc7SUFDSCxrQkFBa0IsQ0FBVTtJQUM1Qjs7T0FFRztJQUNILDRCQUE0QixHQUE0QyxFQUFFLENBQUM7SUFDM0UsaURBQWlEO0lBQ2pEOztPQUVHO0lBQ0gsSUFBSSwwQkFBMEI7UUFDMUIsTUFBTSxLQUFLLEdBQTRDLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xILE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUNELGlEQUFpRDtJQUNqRDs7T0FFRztJQUNILElBQUksdUNBQXVDO1FBQ3ZDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQywwQkFBMEI7ZUFDakMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xJLENBQUM7SUFDRDs7O09BR0c7SUFDSCxtQkFBbUIsR0FBMEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFHM0Ysa0JBQWtCLENBQXdCO0lBQ25ELHFCQUFxQixDQUF5QjtJQUVyQyxtQkFBbUIsQ0FBd0I7SUFDcEQsc0JBQXNCLENBQXlCO0lBQ3ZEOztPQUVHO0lBQ0gsbUJBQW1CLENBQWtEO0lBQ3JFOztPQUVHO0lBQ0gsdUJBQXVCLENBQTZDO0lBQ3BFOztPQUVHO0lBQ0gsU0FBUyxDQUFjO0lBQ3ZCOztPQUVHO0lBQ0gscUJBQXFCLENBQWM7SUFDbkM7O09BRUc7SUFDSCx1QkFBdUIsQ0FBNEM7SUFDbkU7O09BRUc7SUFDSCx3QkFBd0IsQ0FBNEM7SUFDcEU7O09BRUc7SUFDSCxnQkFBZ0IsR0FBWSxLQUFLLENBQUM7SUFDbEM7O09BRUc7SUFDSCxnQkFBZ0IsR0FBWSxLQUFLLENBQUM7SUFDbEM7O09BRUc7SUFDSyxzQkFBc0IsQ0FBVTtJQUN4Qzs7T0FFRztJQUNILHNCQUFzQixDQUFzQjtJQUM1Qzs7T0FFRztJQUNILHVCQUF1QixDQUErQztJQUN0RTs7T0FFRztJQUNILHlCQUF5QixHQUFzQixFQUFFLENBQUM7SUFDbEQ7O09BRUc7SUFDSCxnQkFBZ0IsR0FBNkIsRUFBRSxDQUFDO0lBQ2hEOztPQUVHO0lBQ0gsdUJBQXVCLEdBQVcsRUFBRSxDQUFDO0lBRXJDOztPQUVHO0lBQ0gsZUFBZSxDQUEwRDtJQUN6RTs7T0FFRztJQUNILG1CQUFtQixDQUE2QztJQUNoRTs7T0FFRztJQUNILG1CQUFtQixDQUEyQjtJQUN0QyxvQkFBb0IsQ0FBNkI7SUFFeEMsbUJBQW1CLENBQXdCO0lBQ3BELHNCQUFzQixDQUF5QjtJQUV0QyxpQkFBaUIsQ0FBd0I7SUFDbEQsb0JBQW9CLENBQXlCO0lBQ3JEOztPQUVHO0lBQ0gsYUFBYSxDQUFjO0lBQzNCOztPQUVHO0lBQ0gseUJBQXlCLENBQWM7SUFDdkM7O09BRUc7SUFDSCxvQkFBb0IsR0FBWSxLQUFLLENBQUM7SUFDdEM7O09BRUc7SUFDSCx1QkFBdUIsR0FBc0IsRUFBRSxDQUFDO0lBQ2hEOztPQUVHO0lBQ0gsY0FBYyxHQUE2QixFQUFFLENBQUM7SUFDOUM7O09BRUc7SUFDSCxxQkFBcUIsR0FBVyxFQUFFLENBQUM7SUFDbkM7O09BRUc7SUFDSCxvQkFBb0IsR0FBWSxLQUFLLENBQUM7SUFDdEM7O09BRUc7SUFDSCxrQkFBa0IsQ0FBVztJQUM3Qjs7T0FFRztJQUNILHdCQUF3QixDQUE0QztJQUNwRTs7T0FFRztJQUNILHNCQUFzQixDQUE0QztJQUMxRCxvQkFBb0IsQ0FBVTtJQUV0Qzs7T0FFRztJQUNILHFCQUFxQixDQUFvRDtJQUN6RTs7T0FFRztJQUNLLGtDQUFrQyxDQUFnQjtJQUMxRDs7T0FFRztJQUNLLDJCQUEyQixDQUEyQjtJQUM5RDs7T0FFRztJQUNILG1DQUFtQyxDQUEyQjtJQUM5RDs7T0FFRztJQUNILGlCQUFpQixDQUFVO0lBQzNCOztPQUVHO0lBQ0gsd0JBQXdCLENBQTRDO0lBRXBFOztPQUVHO0lBQ00sY0FBYyxHQUEwQixjQUFjLENBQUM7SUFDaEU7O09BRUc7SUFDSCxlQUFlLEdBQTJCLGVBQWUsQ0FBQztJQUMxRDs7T0FFRztJQUNILGFBQWEsR0FBeUIsYUFBYSxDQUFDO0lBQ3BEOztPQUVHO0lBQ0gsa0JBQWtCLEdBQThCLGtCQUFrQixDQUFDO0lBRW5FLGlEQUFpRDtJQUNqRDs7OztPQUlHO0lBQ0gsSUFBSSxpQ0FBaUM7UUFDakMsT0FBTyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQywyQkFBMkIsSUFBSSxFQUFFLENBQUM7YUFDbkUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxpREFBaUQ7SUFDakQ7OztPQUdHO0lBQ0gsSUFBSSw4Q0FBOEM7UUFDOUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGlDQUFpQztlQUN4QyxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMxSCxDQUFDO0lBRUQsWUFDcUIsTUFBaUIsRUFDakIsUUFBNkIsRUFDN0IsTUFBYyxFQUVaLGdDQUE0RCxFQUU1RCxZQUFvQyxFQUN0QyxJQUFnQjtRQVBoQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLGFBQVEsR0FBUixRQUFRLENBQXFCO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFFWixxQ0FBZ0MsR0FBaEMsZ0NBQWdDLENBQTRCO1FBRTVELGlCQUFZLEdBQVosWUFBWSxDQUF3QjtRQUN0QyxTQUFJLEdBQUosSUFBSSxDQUFZO0lBQ2xDLENBQUM7SUFFSjs7Ozs7T0FLRztJQUNILGtCQUFrQixDQUFDLFFBQW9CLEVBQUUsR0FBcUI7UUFDMUQsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtZQUM3QyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzlFLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7WUFDRCxNQUFNLFFBQVEsR0FBeUQsZUFBZSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMxSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxRSxDQUFDO1lBQ0QsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILHFCQUFxQixDQUFDLE1BQWtCLEVBQUUsYUFBd0M7UUFDOUUsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTLENBQUksS0FBUSxFQUFFLElBQXNCLEVBQUUsT0FBd0I7UUFDbkUsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxRCxPQUFPO1FBQ1gsQ0FBQztRQUNELE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLGlDQUFpQyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsSUFBSSxJQUFJLENBQUMsZ0NBQWdDLENBQUM7UUFDakgsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDO1FBRW5ELE1BQU0sU0FBUyxHQUErQixlQUFlLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdHLElBQUksU0FBUyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25GLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDM0IsTUFBTSxlQUFlLEdBQTZDLGdCQUFnQixDQUFDLFdBQVcsQ0FDMUYsVUFBVSxFQUNWLElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxDQUFDLFdBQVcsQ0FDeUIsQ0FBQztZQUM5QyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLEVBQUUsR0FBRyxlQUFlLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9ILENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBeUQsZUFBZSxDQUFDLG1CQUFtQixDQUMzRyxJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxJQUFJLENBQ1osQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2RixDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUM7UUFFOUIsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEIsS0FBSyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztnQkFDbEMsS0FBSyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztnQkFDcEMsTUFBTTtZQUNWLENBQUM7WUFDRCxLQUFLLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU07WUFDVixDQUFDO1lBQ0QsS0FBSyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN2QixNQUFNO1lBQ1YsQ0FBQztZQUNELEtBQUssY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsTUFBTTtZQUNWLENBQUM7WUFDRCxLQUFLLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUNqQyxLQUFLLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUM5QixNQUFNO1lBQ1YsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ04sTUFBTTtZQUNWLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxpQkFBaUI7UUFDM0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxRQUE0RCxDQUFDO1FBQy9GLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxHQUFHLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFeEYsTUFBTSxxQkFBcUIsQ0FDdkIsSUFBSSxDQUFDLFFBQVEsRUFDYixLQUFLLElBQUksRUFBRTtZQUNQLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ25HLElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQzNFLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLENBQ3JFLENBQUM7WUFDRixJQUFJLENBQUMsbUNBQW1DLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUN2RyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNsQyxDQUFDLENBQ0osQ0FBQztJQUNOLENBQUM7SUFFRDs7O09BR0c7SUFDSCx5QkFBeUIsQ0FBQyxXQUFtQjtRQUN6QyxNQUFNLE1BQU0sR0FBVyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLG1DQUFtQyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ25ILE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUcsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sV0FBVztRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSw4QkFBOEIsQ0FDOUMsSUFBSSxDQUFDLFFBQWtFLEVBQ3ZFLElBQUksQ0FBQyxZQUFZLENBQ3BCLENBQUM7UUFDRixnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBa0UsQ0FBQztRQUMvRixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQztZQUNuRCxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0I7WUFDM0QsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7U0FDdkMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFdEIscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsTUFBTSxDQUE0QixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUMxSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdEcsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLG1CQUFtQixHQUFhLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkgsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxNQUFNLElBQUksS0FBSyxDQUNYO2dEQUNnQyxDQUNuQyxDQUFDO1FBQ04sQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsR0FBRztZQUN2QixTQUFTLEVBQUU7Z0JBQ1AsR0FBRyxJQUFJLGdDQUFnQyxDQUNuQyxJQUFJLENBQUMsWUFBWSxFQUNqQjtvQkFDSSxjQUFjLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQTBDO29CQUNsRyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCO29CQUN2Qyw2Q0FBNkM7b0JBQzdDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0Q7b0JBQ3RILFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBa0IsRUFBRSxFQUFFO3dCQUNoQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDOytCQUN6RCxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN2RSxDQUFDLENBQWdDO29CQUNqQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMscUJBQXFCO29CQUNwRixrQkFBa0IsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsWUFBMEM7aUJBQ3pHLENBQ0o7Z0JBQ0QsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDLENBQUMsTUFBTTtvQkFDbkgsQ0FBQyxDQUFDLG1CQUFtQjtvQkFDckIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDO2dCQUM1QyxVQUFVLEVBQUUsSUFBSSxrQkFBa0IsRUFBRTtnQkFDcEMsU0FBUyxFQUFFLElBQUk7Z0JBQ2Ysc0JBQXNCLEVBQUUsS0FBSztnQkFDN0IsU0FBUyxFQUFFLElBQUksY0FBYyxDQUFhLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ25ELFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO2FBQ3BFO1NBQ0osQ0FBQztRQUVGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLG1CQUFtQixHQUFHLENBQUMsTUFBa0IsRUFBRSxNQUFjLEVBQUUsRUFBRTtZQUN2RyxPQUFPLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUM3QyxNQUFNLGFBQWEsR0FBOEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWM7cUJBQ2xHLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsS0FBSyxNQUFNLENBQThCLENBQUM7Z0JBQzFFLE9BQU8sMkJBQTJCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsZUFBZSxHQUFHLENBQUMsTUFBa0IsRUFBRSxNQUFjLEVBQUUsRUFBRTtZQUNuRyxNQUFNLFNBQVMsR0FBVyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZGLE1BQU0scUJBQXFCLEdBQVcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzlELE1BQU0scUJBQXFCLEdBQVcsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzNELE9BQU8scUJBQXFCLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM3RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1lBQzlELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2pELE1BQU0sV0FBVyxHQUFXLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2hHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sZUFBZTtRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksa0NBQWtDLENBQ2xELElBQUksQ0FBQyxRQUEwRCxFQUMvRCxJQUFJLENBQUMsWUFBWSxDQUNwQixDQUFDO1FBQ0YsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFGLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBMEQsQ0FBQztRQUMzRixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBa0IsR0FBRyxFQUFFLENBQUM7UUFDekQsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdkYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixHQUFHO2dCQUN4QyxLQUFLLEVBQUUsS0FBSzthQUNmLENBQUM7UUFDTixDQUFDO1FBQ0QsTUFBTSxtQkFBbUIsR0FBYSxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hHLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FDWDtnREFDZ0MsQ0FDbkMsQ0FBQztRQUNOLENBQUM7UUFDRCxJQUFJLENBQUMsdUJBQXVCLEdBQUc7WUFDM0IsU0FBUyxFQUFFO2dCQUNQLEdBQUcsSUFBSSxnQ0FBZ0MsQ0FDbkMsSUFBSSxDQUFDLFlBQVksRUFDakI7b0JBQ0ksY0FBYyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUEwQztvQkFDbkYsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQjtvQkFDdkMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHNCQUFzRDtvQkFDdkcsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQjtpQkFDbEUsQ0FDSjtnQkFDRCxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztnQkFDeEcsVUFBVSxFQUFFLElBQUksa0JBQWtCLEVBQUU7Z0JBQ3BDLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixzQkFBc0IsRUFBRSxJQUFJO2dCQUM1QixTQUFTLEVBQUUsSUFBSSxjQUFjLENBQWEsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDbkQsMERBQTBEO2dCQUMxRCxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7YUFDaEU7U0FDSixDQUFDO1FBQ0YsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBaUIsQ0FBQztRQUV2RyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyx1QkFBdUIsR0FBRztZQUMzQixTQUFTLEVBQUU7Z0JBQ1AsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN0QixJQUFJLEVBQUUsZUFBZSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDO2dCQUN4RSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7b0JBQ25CLEtBQUssSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7b0JBQ2xDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNySCxDQUFDO2dCQUNELGlCQUFpQixFQUFFLElBQUk7YUFDMUI7U0FDSixDQUFDO1FBQ0YsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUM7YUFDNUcsV0FBVyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO2FBQzVELFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQzthQUN6RCxTQUFTLEVBQUUsQ0FBQztRQUVqQixJQUFJLENBQUMsd0JBQXdCLEdBQUc7WUFDNUIsU0FBUyxFQUFFO2dCQUNQLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDdEIsSUFBSSxFQUFFLGVBQWUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQztnQkFDeEUsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUM7Z0JBQ3JFLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtvQkFDbkIsS0FBSyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQzNCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN0SCxDQUFDO2dCQUNELGVBQWUsRUFBRSxJQUFJO2FBQ3hCO1NBQ0osQ0FBQztRQUNGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDO0lBQzNFLENBQUM7SUFFTyxLQUFLLENBQUMsdUJBQXVCO1FBQ2pDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsUUFBNkQsQ0FBQztRQUNqRyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxPQUFPLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRXpGLE1BQU0scUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNsRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxRixJQUFJLENBQUMsNEJBQTRCLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUM3RixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxlQUFlO1FBQ25CLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsUUFBNEQsQ0FBQztRQUMvRixNQUFNLGNBQWMsR0FBZSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQWUsQ0FBQztRQUMvRSxNQUFNLGtCQUFrQixHQUE0QixlQUFlLENBQUMsYUFBYSxDQUM3RSxjQUFjLEVBQ2QsSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLElBQUksQ0FBQyxlQUFlLEVBQ3BCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQ2xDLENBQUM7UUFDRixJQUFJLENBQUMsaUJBQWlCLEdBQUc7WUFDckIsU0FBUyxFQUFFO2dCQUNQLE1BQU0sRUFBRSxjQUFjO2dCQUN0QixJQUFJLEVBQUUsa0JBQWtCO2dCQUN4QixpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO2dCQUN6QyxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7Z0JBQ3JDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO2dCQUNyRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUN6QyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQ3pEO1NBQ0osQ0FBQztJQUNOLENBQUM7SUFFTyxlQUFlO1FBQ25CLE1BQU0sS0FBSyxHQUFxQixRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hFLEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO1FBQ3BCLEtBQUssQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUM7UUFDbEMsS0FBSyxDQUFDLFFBQVEsR0FBRyxLQUFLLElBQUksRUFBRTtZQUN4QixJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDZCxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFDRixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVPLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBVTtRQUMvQiw2Q0FBNkM7UUFDN0MsTUFBTSxVQUFVLEdBQThCLElBQUksd0JBQXdCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUM7YUFDcEksV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDO2FBQ3JHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQzthQUMxRCxTQUFTLEVBQUUsQ0FBQztRQUNqQixNQUFNLFNBQVMsR0FBOEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEVBQUU7WUFDOUgsSUFBSSxFQUFFLFVBQVU7WUFDaEIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsWUFBWSxFQUFFLEtBQUs7U0FDdEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQXdCLE1BQU0sY0FBYyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxjQUFjLENBQUMsTUFBbUIsRUFBRSxNQUFtQjtRQUMzRCxNQUFNLFlBQVksR0FBZSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckYsTUFBTSxZQUFZLEdBQWUsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JGLE9BQU8sZUFBZSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7T0FHRztJQUNILDBCQUEwQixDQUFDLFdBQW1CO1FBQzFDLE1BQU0sTUFBTSxHQUFXLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsNEJBQTRCLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDckcsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUU7aUJBQ2pHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNILHNCQUFzQjtRQUNsQixNQUFNLFdBQVcsR0FBMkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FDakYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFXLEVBQ3ZDLElBQUksQ0FBQyxrQ0FBa0MsQ0FDMUMsQ0FBQztRQUNGLE1BQU0sbUJBQW1CLEdBQWUsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hHLE1BQU0seUJBQXlCLEdBQTRCLGVBQWUsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdILElBQUksQ0FBQyx3QkFBd0IsR0FBRztZQUM1QixTQUFTLEVBQUU7Z0JBQ1AsTUFBTSxFQUFFLG1CQUFtQjtnQkFDM0IsSUFBSSxFQUFFLHlCQUF5QjtnQkFDL0IsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtnQkFDekMsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO2dCQUNyQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSTtnQkFDdEIsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDekMsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUN6RDtTQUNKLENBQUM7UUFFRixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsaUJBQWlCLENBQUMsTUFBa0IsRUFBRSxJQUErQjtRQUNqRSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2RyxPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkQsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzlHLE9BQU87UUFDWCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ2hFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM3RixPQUFPO1FBQ1gsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsa0JBQWtCLENBQUMsTUFBa0I7UUFDakMsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtZQUM3QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQixDQUFDLE1BQWtCO1FBQy9CLE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDN0MsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxrQkFBa0IsQ0FBQyxNQUFrQjtRQUNqQyxPQUFPLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQzdDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gseUJBQXlCLENBQUMsTUFBc0M7UUFDNUQsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtZQUM3QyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQUMsTUFBc0M7UUFDN0QsTUFBTSxvQkFBb0IsR0FBWSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtZQUM1RSxPQUFPLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9DLE9BQU87UUFDWCxDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQThELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxFQUFFO1lBQzlILElBQUksRUFBRSxNQUFNLENBQUMsaUJBQWlCO1lBQzlCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFlBQVksRUFBRSxLQUFLO1NBQ3RCLENBQUMsQ0FBQztRQUNILE1BQU0sR0FBRyxHQUF3QixNQUFNLGNBQWMsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUMvRSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLDJCQUEyQixDQUFDLE1BQXNDO1FBQzVFLE1BQU0scUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNsRCxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUN4RSxNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE1BQWtCO1FBQzdDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0SCxDQUFDO0lBRU8sS0FBSyxDQUFDLHdCQUF3QixDQUFDLE1BQWtCO1FBQ3JELElBQUksQ0FBQyxhQUFhLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMseUJBQXlCLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLHNCQUFzQixHQUFHO1lBQzFCLFNBQVMsRUFBRTtnQkFDUCxNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWE7Z0JBQzFCLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQztnQkFDckUsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO29CQUNuQixLQUFLLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUMvQixJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxlQUFlLENBQUMsYUFBYSxDQUN0RSxJQUFJLENBQUMsYUFBYSxFQUNsQixJQUFJLENBQUMsUUFBUSxFQUNiLEtBQUssRUFDTCxJQUFJLENBQ1AsQ0FBQztnQkFDTixDQUFDO2dCQUNELElBQUksRUFBRSxlQUFlLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDO2FBQ3RGO1NBQ0osQ0FBQztRQUNGLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN4QyxJQUFJLENBQUMsaUJBQWlCLEVBQ3RCO1lBQ0ksUUFBUSxFQUFFLEtBQUs7WUFDZixTQUFTLEVBQUUsS0FBSztZQUNoQixZQUFZLEVBQUUsS0FBSztTQUN0QixDQUNKLENBQUM7UUFDRixNQUFNLEdBQUcsR0FBVyxNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLENBQVcsQ0FBQztRQUM1RixJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxHQUFpQixJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDOUUsNkNBQTZDO1lBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUNuSyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQzFELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pELENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGlCQUFpQjtRQUNuQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3RGLE9BQU87UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ3JFLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDdEMsT0FBTztRQUNYLENBQUM7UUFFRCw2Q0FBNkM7UUFDN0MsTUFBTSxVQUFVLEdBQThCLElBQUksd0JBQXdCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUM7YUFDdkosV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQzthQUN0RCxXQUFXLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7YUFDOUQsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQzthQUNqRCxTQUFTLEVBQUUsQ0FBQztRQUNqQixNQUFNLFNBQVMsR0FBOEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEVBQUU7WUFDOUgsSUFBSSxFQUFFLFVBQVU7WUFDaEIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsWUFBWSxFQUFFLEtBQUs7U0FDdEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQXdCLE1BQU0sY0FBYyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUMxQyxDQUFDO0lBQ0wsQ0FBQztJQUNPLEtBQUssQ0FBQyx3QkFBd0I7UUFDbEMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDM0YsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxtQkFBbUI7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDeEMsT0FBTztRQUNYLENBQUM7UUFFRCw2Q0FBNkM7UUFDN0MsTUFBTSxVQUFVLEdBQThCLElBQUksd0JBQXdCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUM7YUFDekosV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDO2FBQ3hELFdBQVcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO2FBQzdCLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQzthQUNoRSxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO2FBQ25ELFNBQVMsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sU0FBUyxHQUE4RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsRUFBRTtZQUM5SCxJQUFJLEVBQUUsVUFBVTtZQUNoQixTQUFTLEVBQUUsS0FBSztZQUNoQixZQUFZLEVBQUUsS0FBSztTQUN0QixDQUFDLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBd0IsTUFBTSxjQUFjLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDL0UsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQzVDLENBQUM7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLDBCQUEwQjtRQUNwQyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsdUJBQXVCO1FBQ25CLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7T0FHRztJQUNILG1CQUFtQjtRQUNmLEtBQUsscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNqRCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUN4RCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUN2RCxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7Z0JBQ2pFLENBQUM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2pELElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztvQkFDMUcsT0FBTztnQkFDWCxDQUFDO2dCQUNELE1BQU0sTUFBTSxHQUFlLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNyRixlQUFlLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3pDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDbEUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7b0JBQ2hDLE9BQU87Z0JBQ1gsQ0FBQztnQkFDRCxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sd0JBQXdCO1FBQzVCLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFTyxLQUFLLENBQUMsMEJBQTBCLENBQUMsTUFBa0I7UUFDdkQsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLHdCQUF3QixHQUFHO1lBQzVCLFNBQVMsRUFBRTtnQkFDUCxNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWE7Z0JBQzFCLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtvQkFDbkIsS0FBSyxJQUFJLENBQUMseUJBQXlCLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzlDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMxSCxDQUFDO2dCQUNELElBQUksRUFBRSxlQUFlLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7YUFDL0U7U0FDSixDQUFDO1FBQ0YsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUMxQyxJQUFJLENBQUMsbUJBQW1CLEVBQ3hCO1lBQ0ksUUFBUSxFQUFFLEtBQUs7WUFDZixTQUFTLEVBQUUsS0FBSztZQUNoQixZQUFZLEVBQUUsS0FBSztTQUN0QixDQUNKLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsbUJBQW1CO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM3QixPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUN6RSxNQUFNLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3hDLE9BQU87UUFDWCxDQUFDO1FBRUQsNkNBQTZDO1FBQzdDLE1BQU0sVUFBVSxHQUE4QixJQUFJLHdCQUF3QixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDO2FBQzNKLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQzthQUN4RCxXQUFXLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUM7YUFDaEUsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQzthQUNuRCxTQUFTLEVBQUUsQ0FBQztRQUNqQixNQUFNLFNBQVMsR0FBOEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEVBQUU7WUFDOUgsSUFBSSxFQUFFLFVBQVU7WUFDaEIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsWUFBWSxFQUFFLEtBQUs7U0FDdEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQXdCLE1BQU0sY0FBYyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUM1QyxDQUFDO0lBQ0wsQ0FBQztJQUNPLEtBQUssQ0FBQywwQkFBMEI7UUFDcEMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDdEYsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDSCx5QkFBeUI7UUFDckIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE1BQXVDO1FBQy9ELE1BQU0sb0JBQW9CLEdBQVkscUJBQXFCLENBQ3ZELElBQUksQ0FBQyxRQUFRLEVBQ2IsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUMzRixDQUFDO1FBQ0YsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEQsT0FBTztRQUNYLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBYSxNQUFNLENBQUMsSUFBSSxLQUFLLGNBQWM7WUFDeEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO1lBQ3ZHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDO1FBQzlDLE1BQU0sVUFBVSxHQUE4QixJQUFJLHdCQUF3QixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDO2FBQ2xILFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDO2FBQ2hDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQzthQUN4QyxTQUFTLEVBQUUsQ0FBQztRQUNqQixNQUFNLFNBQVMsR0FBOEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEVBQUU7WUFDOUgsSUFBSSxFQUFFLFVBQVU7WUFDaEIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsWUFBWSxFQUFFLEtBQUs7U0FDdEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQXdCLE1BQU0sY0FBYyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNMLENBQUM7SUFFTyxLQUFLLENBQUMsNEJBQTRCLENBQUMsTUFBdUM7UUFDOUUsTUFBTSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2xELE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDBCQUEwQixDQUFDLE1BQXVDO1FBQzlELE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDN0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEYsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCLENBQUMsS0FBWTtRQUMzQixNQUFNLFdBQVcsR0FBWSxLQUFLLENBQUMsTUFBMkIsQ0FBQyxLQUFLLENBQUM7UUFDckUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM1RixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCO1FBQ3BCLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxlQUFlLENBQUMsNkJBQTZCLENBQ3JFLElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyx5QkFBeUIsRUFDOUIsSUFBSSxDQUFDLElBQUksRUFDVCxJQUFJLENBQUMsUUFBUSxDQUNoQixDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyRSxJQUFJLENBQUMscUJBQXFCLEdBQUcscUJBQXFCLENBQzlDLElBQUksQ0FBQyxRQUFRLEVBQ2IsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUN0RCxDQUFDO1FBQ04sQ0FBQztRQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxJQUF5QjtRQUNyRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUgsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLHFCQUFxQixDQUM5QyxJQUFJLENBQUMsUUFBUSxFQUNiLEdBQUcsRUFBRSxDQUFDLGlDQUFpQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUN4RSxDQUFDO1FBQ04sQ0FBQztRQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsY0FBYztRQUNoQixNQUFNLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQjtRQUN2QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxlQUFlLENBQUMsNkJBQTZCLENBQ3ZFLElBQUksQ0FBQyxTQUFTLEVBQ2QsSUFBSSxDQUFDLHFCQUFxQixFQUMxQixJQUFJLENBQUMsSUFBSSxFQUNULElBQUksQ0FBQyxRQUFRLENBQ2hCLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekUsSUFBSSxDQUFDLHVCQUF1QixHQUFHLHFCQUFxQixDQUNoRCxJQUFJLENBQUMsUUFBUSxFQUNiLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUN4RCxDQUFDO1FBQ04sQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztJQUMzRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMscUJBQXFCO1FBQ3ZCLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxNQUFNLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5SCxJQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcscUJBQXFCLENBQ2hELElBQUksQ0FBQyxRQUFRLEVBQ2IsR0FBRyxFQUFFLENBQUMsaUNBQWlDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQzFFLENBQUM7UUFDTixDQUFDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFDTixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsU0FBUztRQUNYLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3pDLElBQUksQ0FBQyxrQkFBa0IsRUFDdkI7Z0JBQ0ksUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLFlBQVksRUFBRSxLQUFLO2FBQ3RCLENBQ0osQ0FBQztZQUNGLE9BQU87UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM1QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNyRSxJQUFJLE1BQU0sZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ2hILElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxFQUFFO3dCQUNqRCxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHFCQUFxQjt3QkFDcEQsU0FBUyxFQUFFLEtBQUs7d0JBQ2hCLFlBQVksRUFBRSxLQUFLO3FCQUN0QixDQUFDLENBQUM7b0JBQ0gsT0FBTztnQkFDWCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFDQSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQWtCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDaEcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBa0IsQ0FBQztRQUN6RyxlQUFlLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNqRixlQUFlLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxZQUFZO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pCLE9BQU87UUFDWCxDQUFDO1FBQ0EsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFrQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksR0FBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQWtCLENBQUM7UUFFekcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsdUJBQXVCO1FBQ3pCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNqRixNQUFNLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBa0IsRUFBRSxJQUErQjtRQUNuRSxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDN0IsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMscUJBQXFCLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFdkUsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFNUIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUMxQyxJQUFJLENBQUMsbUJBQW1CLEVBQ3hCO1lBQ0ksUUFBUSxFQUFFLEtBQUs7WUFDZixTQUFTLEVBQUUsS0FBSztZQUNoQixZQUFZLEVBQUUsS0FBSztTQUN0QixDQUNKLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhO1FBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFrQixDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pILElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksR0FBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQWtCLENBQUM7UUFFekcsS0FBSyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsd0JBQXdCO1FBQzFCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RSxNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gscUJBQXFCO1FBQ2pCLGtCQUFrQixDQUFDLE1BQU0sQ0FDckIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBaUIsRUFDN0MsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQ3BELENBQUM7UUFDRixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQzt1R0F6eENRLDBCQUEwQixvR0EwVXZCLGdDQUFnQyxhQUVoQyxrQ0FBa0M7MkZBNVVyQywwQkFBMEIsMlpBdUV4QixPQUFPLDhkQzlSdEIsbzRrQ0Fzc0JjLHV4TkQvZUQsMEJBQTBCLG9PQTVDL0IsMkJBQTJCLHNHQUMzQixZQUFZLHFNQUNaLGFBQWEsNG9CQUNiLGtCQUFrQix3Z0JBQ2xCLGVBQWUsbXJCQUNmLFdBQVcsby9CQUNYLGVBQWUseVNBQ2YsY0FBYyw0UEFDZCxjQUFjLDJXQUNkLGFBQWEsZ3dCQUNiLGtCQUFrQixvU0FDbEIsd0JBQXdCLG1PQUN4QixjQUFjLGdoQ0FDZCxpQkFBaUIscVlBQ2pCLGVBQWUsNk5BQ2YsZ0JBQWdCLCtGQUNoQixvQkFBb0IseURBQ3BCLDJCQUEyQixpRUFDM0IsZ0NBQWdDLHNFQUNoQyw0QkFBNEIsa0VBQzVCLDRCQUE0QixrRUFDNUIsNkJBQTZCLG1FQUM3QiwyQkFBMkIsaUVBQzNCLDZCQUE2QixtRUFDN0Isb0JBQW9CLHlEQUNwQiw0QkFBNEIsa0VBQzVCLDBCQUEwQixnRUFDMUIsdUJBQXVCLDZEQUN2Qiw0QkFBNEIsbUVBQzVCLDJCQUEyQixrRUFDM0IscUNBQXFDLDRFQUNyQyw4QkFBOEIscUVBQzlCLGtCQUFrQix1REFDbEIsdUJBQXVCLDZEQUN2QixzQkFBc0IsNERBQ3RCLHlCQUF5QiwrREFDekIsdUJBQXVCLDZEQUN2Qiw0QkFBNEIsa0VBQzVCLG9CQUFvQix5REFDcEIsMEJBQTBCLDJHQUMxQixhQUFhLG9kQUNiLGVBQWU7OzJGQUdWLDBCQUEwQjtrQkFsRHRDLFNBQVM7K0JBQ0ksc0JBQXNCLGNBR3BCLElBQUksV0FDUDt3QkFDTCwyQkFBMkI7d0JBQzNCLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixrQkFBa0I7d0JBQ2xCLGVBQWU7d0JBQ2YsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGNBQWM7d0JBQ2QsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLGtCQUFrQjt3QkFDbEIsd0JBQXdCO3dCQUN4QixjQUFjO3dCQUNkLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLG9CQUFvQjt3QkFDcEIsMkJBQTJCO3dCQUMzQixnQ0FBZ0M7d0JBQ2hDLDRCQUE0Qjt3QkFDNUIsNEJBQTRCO3dCQUM1Qiw2QkFBNkI7d0JBQzdCLDJCQUEyQjt3QkFDM0IsNkJBQTZCO3dCQUM3QixvQkFBb0I7d0JBQ3BCLDRCQUE0Qjt3QkFDNUIsMEJBQTBCO3dCQUMxQix1QkFBdUI7d0JBQ3ZCLDRCQUE0Qjt3QkFDNUIsMkJBQTJCO3dCQUMzQixxQ0FBcUM7d0JBQ3JDLDhCQUE4Qjt3QkFDOUIsa0JBQWtCO3dCQUNsQix1QkFBdUI7d0JBQ3ZCLHNCQUFzQjt3QkFDdEIseUJBQXlCO3dCQUN6Qix1QkFBdUI7d0JBQ3ZCLDRCQUE0Qjt3QkFDNUIsb0JBQW9CO3dCQUNwQiwwQkFBMEI7d0JBQzFCLGFBQWE7d0JBQ2IsZUFBZTtxQkFDbEI7OzBCQTRVSSxNQUFNOzJCQUFDLGdDQUFnQzs7MEJBRXZDLE1BQU07MkJBQUMsa0NBQWtDO2tFQWxVOUMsTUFBTTtzQkFETCxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFPekIsV0FBVztzQkFEVixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFPekIseUJBQXlCO3NCQUR4QixLQUFLO2dCQVdOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFTTixlQUFlO3NCQURkLEtBQUs7Z0JBU04sVUFBVTtzQkFEVCxLQUFLO2dCQVNOLFVBQVU7c0JBRFQsS0FBSztnQkFTRyxnQkFBZ0I7c0JBRHhCLE1BQU07Z0JBU0ssSUFBSTtzQkFEZixTQUFTO3VCQUFDLE9BQU87Z0JBcUVELGtCQUFrQjtzQkFEbEMsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBSWQsbUJBQW1CO3NCQURuQyxTQUFTO3VCQUFDLHFCQUFxQjtnQkEwRWYsbUJBQW1CO3NCQURuQyxTQUFTO3VCQUFDLHFCQUFxQjtnQkFJZixpQkFBaUI7c0JBRGpDLFNBQVM7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVudmlyb25tZW50SW5qZWN0b3IsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIGluamVjdCwgcnVuSW5JbmplY3Rpb25Db250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgTmdNb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEJhZGdlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYmFkZ2UnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dNb2R1bGUsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IE1hdFNvcnQsIE1hdFNvcnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRmFJY29uQ29tcG9uZW50LCBJY29uRGVmaW5pdGlvbiB9IGZyb20gJ0Bmb3J0YXdlc29tZS9hbmd1bGFyLWZvbnRhd2Vzb21lJztcbmltcG9ydCB7IGZhU2VhcmNoIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFycmF5RGF0ZUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9hcnJheS9hcnJheS1kYXRlLWlucHV0L2FycmF5LWRhdGUtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEFycmF5RGF0ZVJhbmdlSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL2FycmF5L2FycmF5LWRhdGUtcmFuZ2UtaW5wdXQvYXJyYXktZGF0ZS1yYW5nZS1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXJyYXlEYXRlVGltZUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9hcnJheS9hcnJheS1kYXRlLXRpbWUtaW5wdXQvYXJyYXktZGF0ZS10aW1lLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBcnJheVN0cmluZ0F1dG9jb21wbGV0ZUNoaXBzQ29tcG9uZW50IH0gZnJvbSAnLi9hcnJheS9hcnJheS1zdHJpbmctYXV0b2NvbXBsZXRlLWNoaXBzL2FycmF5LXN0cmluZy1hdXRvY29tcGxldGUtY2hpcHMuY29tcG9uZW50JztcbmltcG9ydCB7IEFycmF5U3RyaW5nQ2hpcHNJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vYXJyYXkvYXJyYXktc3RyaW5nLWNoaXBzLWlucHV0L2FycmF5LXN0cmluZy1jaGlwcy1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQm9vbGVhbkNoZWNrYm94SW5wdXRDb21wb25lbnQgfSBmcm9tICcuL2Jvb2xlYW4vYm9vbGVhbi1jaGVja2JveC1pbnB1dC9ib29sZWFuLWNoZWNrYm94LWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCb29sZWFuRHJvcGRvd25JbnB1dENvbXBvbmVudCB9IGZyb20gJy4vYm9vbGVhbi9ib29sZWFuLWRyb3Bkb3duLWlucHV0L2Jvb2xlYW4tZHJvcGRvd24taW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEJvb2xlYW5Ub2dnbGVJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vYm9vbGVhbi9ib29sZWFuLXRvZ2dsZS1pbnB1dC9ib29sZWFuLXRvZ2dsZS1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3VzdG9tSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL2N1c3RvbS9jdXN0b20uY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vZGF0ZS9kYXRlLWlucHV0L2RhdGUtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVSYW5nZUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9kYXRlL2RhdGUtcmFuZ2UtaW5wdXQvZGF0ZS1yYW5nZS1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0ZVRpbWVJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vZGF0ZS9kYXRlLXRpbWUtaW5wdXQvZGF0ZS10aW1lLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGaWxlRGVmYXVsdElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9maWxlL2ZpbGUtZGVmYXVsdC1pbnB1dC9maWxlLWRlZmF1bHQtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEZpbGVJbWFnZUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9maWxlL2ZpbGUtaW1hZ2UtaW5wdXQvZmlsZS1pbWFnZS1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTnVtYmVyRHJvcGRvd25JbnB1dENvbXBvbmVudCB9IGZyb20gJy4vbnVtYmVyL251bWJlci1kcm9wZG93bi1pbnB1dC9udW1iZXItZHJvcGRvd24taW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IE51bWJlcklucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9udW1iZXIvbnVtYmVyLWlucHV0L251bWJlci1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTnVtYmVyU2xpZGVySW5wdXRDb21wb25lbnQgfSBmcm9tICcuL251bWJlci9udW1iZXItc2xpZGVyLWlucHV0L251bWJlci1zbGlkZXItaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IFJlZmVyZW5jZXNNYW55SW5wdXRDb21wb25lbnQgfSBmcm9tICcuL3JlbGF0aW9ucy9yZWZlcmVuY2VzLW1hbnktaW5wdXQvcmVmZXJlbmNlcy1tYW55LWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdHJpbmdBdXRvY29tcGxldGVJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vc3RyaW5nL3N0cmluZy1hdXRvY29tcGxldGUtaW5wdXQvc3RyaW5nLWF1dG9jb21wbGV0ZS1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3RyaW5nRHJvcGRvd25JbnB1dENvbXBvbmVudCB9IGZyb20gJy4vc3RyaW5nL3N0cmluZy1kcm9wZG93bi1pbnB1dC9zdHJpbmctZHJvcGRvd24taW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IFN0cmluZ0lucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9zdHJpbmcvc3RyaW5nLWlucHV0L3N0cmluZy1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3RyaW5nUGFzc3dvcmRJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vc3RyaW5nL3N0cmluZy1wYXNzd29yZC1pbnB1dC9zdHJpbmctcGFzc3dvcmQtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IFN0cmluZ1RleHRib3hJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vc3RyaW5nL3N0cmluZy10ZXh0Ym94LWlucHV0L3N0cmluZy10ZXh0Ym94LWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCYXNlRW50aXR5VHlwZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7IEVkaXRBcnJheUl0ZW1EaWFsb2dEYXRhSW50ZXJuYWwsIEVudGl0eUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2FycmF5L2FycmF5LWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IERlY29yYXRvclR5cGVzIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9iYXNlL2RlY29yYXRvci10eXBlcy5lbnVtJztcbmltcG9ydCB7IERyb3Bkb3duVmFsdWUgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2Jhc2UvZHJvcGRvd24tdmFsdWUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2Jhc2UvcHJvcGVydHktZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgSGFzTWFueURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9oYXMtbWFueS9oYXMtbWFueS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEZWZhdWx0T2JqZWN0RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwsIERyb3Bkb3duT2JqZWN0RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL29iamVjdC9vYmplY3QtZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgUmVmZXJlbmNlc09uZURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9yZWZlcmVuY2VzLW9uZS9yZWZlcmVuY2VzLW9uZS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEeW5hbWljU3R5bGVDbGFzc0RpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZHluYW1pYy1zdHlsZS1jbGFzcy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTG9kYXNoVXRpbGl0aWVzIH0gZnJvbSAnLi4vLi4vZW5jYXBzdWxhdGlvbi9sb2Rhc2gudXRpbGl0aWVzJztcbmltcG9ydCB7IFJlZmxlY3RVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi9lbmNhcHN1bGF0aW9uL3JlZmxlY3QudXRpbGl0aWVzJztcbmltcG9ydCB7IFVVSURVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi9lbmNhcHN1bGF0aW9uL3V1aWQudXRpbGl0aWVzJztcbmltcG9ydCB7IGRlZmF1bHRGYWxzZSB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucy9kZWZhdWx0LWZhbHNlLmZ1bmN0aW9uJztcbmltcG9ydCB7IGdldENoYW5nZXNUb29sdGlwQ29udGVudCB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucy9nZXQtY2hhbmdlcy10b29sdGlwLWNvbnRlbnQuZnVuY3Rpb24nO1xuaW1wb3J0IHsgTkdYX0dFVF9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvZ2V0LXZhbGlkYXRpb24tZXJyb3ItbWVzc2FnZS5mdW5jdGlvbic7XG5pbXBvcnQgeyBnZXRWYWxpZGF0aW9uRXJyb3JzVG9vbHRpcENvbnRlbnQgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvZ2V0LXZhbGlkYXRpb24tZXJyb3JzLXRvb2x0aXAtY29udGVudC5mdW5jdGlvbic7XG5pbXBvcnQgeyB0YWJsZUNvbHVtblZhbHVlVG9Tb3J0VmFsdWUgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvdGFibGUtY29sdW1uLXZhbHVlLXRvLXNvcnQtdmFsdWUuZnVuY3Rpb24nO1xuaW1wb3J0IHsgTkdYX0NPTVBMRVRFX0dMT0JBTF9ERUZBVUxUX1ZBTFVFUywgTmd4R2xvYmFsRGVmYXVsdFZhbHVlcyB9IGZyb20gJy4uLy4uL2dsb2JhbC1jb25maWd1cmF0aW9uLXZhbHVlcyc7XG5pbXBvcnQgeyBFbnRpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZW50aXR5LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0ZVV0aWxpdGllcyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9kYXRlLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBEaWZmZXJlbmNlLCBFbnRpdHlUYWIsIEVudGl0eVV0aWxpdGllcyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9lbnRpdHkudXRpbGl0aWVzJztcbmltcG9ydCB7IFNlbGVjdGlvblV0aWxpdGllcyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zZWxlY3Rpb24udXRpbGl0aWVzJztcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciwgVmFsaWRhdGlvblV0aWxpdGllcyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy92YWxpZGF0aW9uLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBDb25maXJtRGlhbG9nRGF0YUJ1aWxkZXIsIENvbmZpcm1EaWFsb2dEYXRhSW50ZXJuYWwgfSBmcm9tICcuLi9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy1kYXRhLmJ1aWxkZXInO1xuaW1wb3J0IHsgTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJbnRlcm5hbEN1c3RvbVRhYmxlQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL2N1c3RvbS10YWJsZS9jdXN0b20tdGFibGUtY29uZmlndXJhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBDcmVhdGVEYXRhQnVpbGRlciwgQ3JlYXRlRGF0YUludGVybmFsIH0gZnJvbSAnLi4vdGFibGUvY3JlYXRlLWRpYWxvZy9jcmVhdGUtZGF0YS5idWlsZGVyJztcbmltcG9ydCB7IERpc3BsYXlDb2x1bW5WYWx1ZUNvbXBvbmVudCB9IGZyb20gJy4uL3RhYmxlL2Rpc3BsYXktY29sdW1uLXZhbHVlL2Rpc3BsYXktY29sdW1uLXZhbHVlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFZGl0QWN0aW9uSW50ZXJuYWwgfSBmcm9tICcuLi90YWJsZS9lZGl0LWRpYWxvZy9lZGl0LWRhdGEuYnVpbGRlcic7XG5pbXBvcnQgeyBEaXNwbGF5Q29sdW1uLCBEeW5hbWljU3R5bGVDbGFzc2VzIH0gZnJvbSAnLi4vdGFibGUvdGFibGUtZGF0YSc7XG5pbXBvcnQgeyBCYXNlVGFibGVBY3Rpb25JbnRlcm5hbCwgVGFibGVBY3Rpb25JbnRlcm5hbCB9IGZyb20gJy4uL3RhYmxlL3RhYmxlLWRhdGEuYnVpbGRlcic7XG5pbXBvcnQgeyBUb29sdGlwQ29tcG9uZW50IH0gZnJvbSAnLi4vdG9vbHRpcC90b29sdGlwLmNvbXBvbmVudCc7XG5cbi8qKlxuICogR2VuZXJpYyB0eXBlIGZvciBjb250ZXh0cyB0aGF0IGNhbiBmaWxsIGFuIGlubGluZSB0ZW1wbGF0ZS5cbiAqL1xudHlwZSBUZW1wbGF0ZUNvbnRleHQ8VD4gPSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjdHVhbCB2YWx1ZS4gVGhlICRpbXBsaWNpdCBpcyBuZWVkZWQgc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgYSBrZXkgd2hlbiB3cml0aW5nIFwibGV0LWNvbnRleHRcIiBpbiB0aGUgaHRtbCB0ZW1wbGF0ZS5cbiAgICAgKi9cbiAgICAkaW1wbGljaXQ6IFRcbn07XG5cbi8qKlxuICogQSBmb3JtIGNvbnRleHQgdGhhdCBpcyB1c2VkIHRvIGZpbGwgYW4gaW5saW5lIHRlbXBsYXRlLlxuICogVGhpcyBpcyB1c2VkIHRvIGdvIGFyb3VuZCB0aGUgbGltaXRhdGlvbnMgb2YgaGF2aW5nIGV2ZXJ5dGhpbmcgaW4gdGhlIHNhbWUgZmlsZSBkdWUgdG8gY2lyY3VsYXIgZGVwZW5kZW5jaWVzLlxuICogVGhlIGZvcm1zIGFyZSB1c2VkIGZvciBvYmplY3QsIGhhc01hbnksIHJlZmVyZW5jZXNNYW55IGFuZCB0aGUgZGlhbG9ncy5cbiAqL1xudHlwZSBGb3JtQ29udGV4dDxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+ID0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbnRpdHkgdG8gYnVpbGQgdGhlIGZvcm0gZm9yLlxuICAgICAqL1xuICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAvKipcbiAgICAgKiBUaGUgdGFicyB0byBkaXNwbGF5LlxuICAgICAqL1xuICAgIHRhYnM6IEVudGl0eVRhYjxFbnRpdHlUeXBlPltdLFxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IGVkaXQgdmFsdWVzIHNob3VsZCBiZSBvbWl0dGVkLlxuICAgICAqL1xuICAgIGhpZGVPbWl0Rm9yRWRpdD86IGJvb2xlYW4sXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgY3JlYXRlIHZhbHVlcyBzaG91bGQgYmUgb21pdHRlZC5cbiAgICAgKi9cbiAgICBoaWRlT21pdEZvckNyZWF0ZT86IGJvb2xlYW4sXG4gICAgLyoqXG4gICAgICogV2hhdCBoYXBwZW5zIHdoZW4gdGhlIGlucHV0IGNoYW5nZXMuXG4gICAgICovXG4gICAgaW5wdXRDaGFuZ2VFdmVudDogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4sXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIGlucHV0IGlzIHJlYWRvbmx5LlxuICAgICAqL1xuICAgIGlzUmVhZE9ubHk/OiAocHJvcGVydHk6IEVudGl0eVR5cGUsIGtleToga2V5b2YgRW50aXR5VHlwZSkgPT4gYm9vbGVhbixcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgaW5wdXQgaXMgdmFsaWQgZW1wdHkuXG4gICAgICovXG4gICAgdmFsaWRFbXB0eT86ICgpID0+IGJvb2xlYW5cbn07XG5cbi8qKlxuICogQSB0YWJsZSBjb250ZXh0IHRoYXQgaXMgdXNlZCB0byBmaWxsIGFuIGlubGluZSB0ZW1wbGF0ZS5cbiAqIFRoaXMgaXMgdXNlZCB0byBnbyBhcm91bmQgdGhlIGxpbWl0YXRpb25zIG9mIGhhdmluZyBldmVyeXRoaW5nIGluIHRoZSBzYW1lIGZpbGUgZHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY2llcy5cbiAqIFRoZSB0YWJsZSBpcyB1c2VkIGZvciBlbnRpdHkgYXJyYXkgYW5kIGhhc01hbnkuXG4gKi9cbnR5cGUgVGFibGVDb250ZXh0PFQ+ID0gSW50ZXJuYWxDdXN0b21UYWJsZUNvbmZpZ3VyYXRpb24gJiB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGEgc291cmNlIG9mIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8VD4sXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgYSBlcnJvciBtZXNzYWdlIHNob3VsZCBiZSBzaG93biB3aGVuIHRoZSB0YWJsZSBpcyBlbXB0eS5cbiAgICAgKi9cbiAgICBzaG91bGRTaG93TWlzc2luZ0Vycm9yOiBib29sZWFuLFxuICAgIC8qKlxuICAgICAqIFRoZSBzZWxlY3Rpb24gb2YgdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIHNlbGVjdGlvbjogU2VsZWN0aW9uTW9kZWw8VD4sXG4gICAgLyoqXG4gICAgICogV2hhdCBoYXBwZW5zIHdoZW4gYSBjZWxsIGlzIGNsaWNrZWQuXG4gICAgICovXG4gICAgY2xpY2tDZWxsOiAodmFsdWU6IFQsIGRpc3BsYXlDb2x1bW46IERpc3BsYXlDb2x1bW48VD4pID0+IHZvaWQsXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIGRhdGEgZm9yIHRoZSB0YWJsZSBpcyBjdXJyZW50bHkgYmVpbmcgbG9hZGVkLlxuICAgICAqL1xuICAgIGlzTG9hZGluZzogYm9vbGVhbixcbiAgICAvKipcbiAgICAgKiBBbGwgY29sdW1ucyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW11cbn07XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgaW5wdXQgY29tcG9uZW50LiBJdCBnZXRzIHRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvcGVydHkgZnJvbSB0aGUgZ2l2ZW4gQElucHV0IFwiZW50aXR5XCIgYW5kIEBJbnB1dCBcInByb3BlcnR5S2V5XCJcbiAqIGFuZCBkaXNwbGF5cyB0aGUgaW5wdXQgZmllbGQgYWNjb3JkaW5nbHkuXG4gKlxuICogWW91IGNhbiBhbHNvIGRlZmluZSBhIG1ldGhvZCB0aGF0IGdlbmVyYXRlcyBlcnJvci1tZXNzYWdlcyBhbmQgaWYgdGhlIGlucHV0IHNob3VsZCBiZSBoaWRkZW4gd2hlbiBpdHMgbWV0YWRhdGEgc2F5c1xuICogdGhhdCBpdCBzaG91bGQgYmUgb21pdHRlZCBmb3IgY3JlYXRpbmcgb3IgdXBkYXRpbmcuXG4gKiBUaGUgbGFzdCBwYXJ0IGJlaW5nIG1vc3RseSByZWxldmFudCBpZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBjb21wb25lbnQgaW5zaWRlIGFuIG5nRm9yLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25neC1tYXQtZW50aXR5LWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2lucHV0LmNvbXBvbmVudC5zY3NzJywgJy4uLy4uL3Njc3MvZGlhbG9nLXN0eWxlcy5zY3NzJywgJy4uLy4uL3Njc3MvdGFpbHdpbmQtY2xhc3Nlcy5zY3NzJ10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIERpc3BsYXlDb2x1bW5WYWx1ZUNvbXBvbmVudCxcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBNYXRUYWJzTW9kdWxlLFxuICAgICAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgICAgIE1hdFNlbGVjdE1vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdERpYWxvZ01vZHVsZSxcbiAgICAgICAgTWF0QmFkZ2VNb2R1bGUsXG4gICAgICAgIE1hdElucHV0TW9kdWxlLFxuICAgICAgICBNYXRNZW51TW9kdWxlLFxuICAgICAgICBNYXRQYWdpbmF0b3JNb2R1bGUsXG4gICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICAgICAgTWF0VGFibGVNb2R1bGUsXG4gICAgICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgICAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgICAgIFRvb2x0aXBDb21wb25lbnQsXG4gICAgICAgIFN0cmluZ0lucHV0Q29tcG9uZW50LFxuICAgICAgICBTdHJpbmdUZXh0Ym94SW5wdXRDb21wb25lbnQsXG4gICAgICAgIFN0cmluZ0F1dG9jb21wbGV0ZUlucHV0Q29tcG9uZW50LFxuICAgICAgICBTdHJpbmdEcm9wZG93bklucHV0Q29tcG9uZW50LFxuICAgICAgICBTdHJpbmdQYXNzd29yZElucHV0Q29tcG9uZW50LFxuICAgICAgICBCb29sZWFuQ2hlY2tib3hJbnB1dENvbXBvbmVudCxcbiAgICAgICAgQm9vbGVhblRvZ2dsZUlucHV0Q29tcG9uZW50LFxuICAgICAgICBCb29sZWFuRHJvcGRvd25JbnB1dENvbXBvbmVudCxcbiAgICAgICAgTnVtYmVySW5wdXRDb21wb25lbnQsXG4gICAgICAgIE51bWJlckRyb3Bkb3duSW5wdXRDb21wb25lbnQsXG4gICAgICAgIE51bWJlclNsaWRlcklucHV0Q29tcG9uZW50LFxuICAgICAgICBBcnJheURhdGVJbnB1dENvbXBvbmVudCxcbiAgICAgICAgQXJyYXlEYXRlUmFuZ2VJbnB1dENvbXBvbmVudCxcbiAgICAgICAgQXJyYXlEYXRlVGltZUlucHV0Q29tcG9uZW50LFxuICAgICAgICBBcnJheVN0cmluZ0F1dG9jb21wbGV0ZUNoaXBzQ29tcG9uZW50LFxuICAgICAgICBBcnJheVN0cmluZ0NoaXBzSW5wdXRDb21wb25lbnQsXG4gICAgICAgIERhdGVJbnB1dENvbXBvbmVudCxcbiAgICAgICAgRGF0ZVJhbmdlSW5wdXRDb21wb25lbnQsXG4gICAgICAgIERhdGVUaW1lSW5wdXRDb21wb25lbnQsXG4gICAgICAgIEZpbGVEZWZhdWx0SW5wdXRDb21wb25lbnQsXG4gICAgICAgIEZpbGVJbWFnZUlucHV0Q29tcG9uZW50LFxuICAgICAgICBSZWZlcmVuY2VzTWFueUlucHV0Q29tcG9uZW50LFxuICAgICAgICBDdXN0b21JbnB1dENvbXBvbmVudCxcbiAgICAgICAgRHluYW1pY1N0eWxlQ2xhc3NEaXJlY3RpdmUsXG4gICAgICAgIE1hdFNvcnRNb2R1bGUsXG4gICAgICAgIEZhSWNvbkNvbXBvbmVudFxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4TWF0RW50aXR5SW5wdXRDb21wb25lbnQ8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PiBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuICAgIGZhU2VhcmNoOiBJY29uRGVmaW5pdGlvbiA9IGZhU2VhcmNoO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVudGl0eSBvbiB3aGljaCB0aGUgcHJvcGVydHkgZXhpc3RzLiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFwicHJvcGVydHlLZXlcIlxuICAgICAqIHRvIGRldGVybWluZSB0aGUgcHJvcGVydHkgZm9yIHdoaWNoIHRoZSBpbnB1dCBzaG91bGQgYmUgZ2VuZXJhdGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gICAgZW50aXR5ITogRW50aXR5VHlwZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBnZW5lcmF0ZSB0aGUgaW5wdXQgZm9yLiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFwiZW50aXR5XCIuXG4gICAgICovXG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgICBwcm9wZXJ0eUtleSE6IGtleW9mIEVudGl0eVR5cGU7XG5cbiAgICAvKipcbiAgICAgKiAob3B0aW9uYWwpIEEgY3VzdG9tIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIHRoZSBlcnJvci1tZXNzYWdlIGZvciBpbnZhbGlkIGlucHV0cy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2U/OiAobW9kZWw6IE5nTW9kZWwpID0+IHN0cmluZztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuICAgIGludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZSE6IChtb2RlbDogTmdNb2RlbCkgPT4gc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBoaWRlIGEgdmFsdWUgaWYgaXQgaXMgb21pdHRlZCBmb3IgY3JlYXRpb24uXG4gICAgICogSXMgdXNlZCBpbnRlcm5hbGx5IGZvciB0aGUgb2JqZWN0IHByb3BlcnR5LlxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBoaWRlT21pdEZvckNyZWF0ZT86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGhpZGUgYSB2YWx1ZSBpZiBpdCBpcyBvbWl0dGVkIGZvciBlZGl0aW5nLlxuICAgICAqIElzIHVzZWQgaW50ZXJuYWxseSBmb3IgdGhlIG9iamVjdCBwcm9wZXJ0eS5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaGlkZU9taXRGb3JFZGl0PzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IGFuIGVtcHR5IHZhbHVlIHNob3VsZCBiZSB2YWxpZC5cbiAgICAgKiBJcyB1c2VkIGludGVybmFsbHkgZm9yIHRoZSBvYmplY3QgcHJvcGVydHkuXG4gICAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB2YWxpZEVtcHR5PzogYm9vbGVhbjsgLy8gVE9ET1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIGlucHV0IHNob3VsZCBiZSByZWFkb25seS5cbiAgICAgKiBJbiB0aGF0IGNhc2UgaXQgaXMgZGlzYWJsZWQsIGJ1dCBtb3N0IG9mIHRoZSBkZWZhdWx0IHN0eWxpbmcgaXMgb3ZlcndyaXR0ZW4uXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGlzUmVhZE9ubHk/OiBib29sZWFuO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG4gICAgaW50ZXJuYWxJc1JlYWRPbmx5ITogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIHdoZW4gdGhlIGlucHV0IHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgaW5wdXRDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBoYXMgbWFueSBzb3J0LlxuICAgICAqIElzIG5lZWRlZCBiZWNhdXNlIHRoZSBzb3J0IGlzIGluc2lkZSBhIHN3aXRjaCBjYXNlLFxuICAgICAqIHdoaWNoIG1lYW5zIHRoYXQgYXQgbmdPbkluaXQgaXQgY2FuJ3QgYmUgaW5pdGlhbGl6ZWQuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZChNYXRTb3J0KVxuICAgIHByaXZhdGUgc2V0IHNvcnQoc29ydDogTWF0U29ydCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9zdHJpY3QtYm9vbGVhbi1leHByZXNzaW9uc1xuICAgICAgICBpZiAodGhpcy5oYXNNYW55VGFibGVDb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmhhc01hbnlUYWJsZUNvbnRleHQuJGltcGxpY2l0LmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuaGFzTWFueVRhYmxlQ29udGV4dC4kaW1wbGljaXQuZGF0YVNvdXJjZS5zb3J0ID8/IHNvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvc3RyaWN0LWJvb2xlYW4tZXhwcmVzc2lvbnNcbiAgICAgICAgaWYgKHRoaXMuZW50aXR5QXJyYXlUYWJsZUNvbnRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuZW50aXR5QXJyYXlUYWJsZUNvbnRleHQuJGltcGxpY2l0LmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuZW50aXR5QXJyYXlUYWJsZUNvbnRleHQuJGltcGxpY2l0LmRhdGFTb3VyY2Uuc29ydCA/PyBzb3J0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGRlY29yYXRvciBmb3IgdGhpcyBpbnB1dC5cbiAgICAgKi9cbiAgICB0eXBlITogRGVjb3JhdG9yVHlwZXM7XG4gICAgLyoqXG4gICAgICogVGhlIHByb3BlcnR5IG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRlY29yYXRvci5cbiAgICAgKi9cbiAgICBtZXRhZGF0YSE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWV0YWRhdGEgb2YgYW4gb2JqZWN0IHByb3BlcnR5LlxuICAgICAqL1xuICAgIG1ldGFkYXRhRGVmYXVsdE9iamVjdCE6IERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgZm9ybSBjb250ZXh0IGZvciBhbiBvYmplY3QgcHJvcGVydHkuXG4gICAgICovXG4gICAgb2JqZWN0Rm9ybUNvbnRleHQhOiBUZW1wbGF0ZUNvbnRleHQ8Rm9ybUNvbnRleHQ8RW50aXR5VHlwZT4+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1ldGFkYXRhIG9mIGFuIGRyb3Bkb3duIG9iamVjdCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBtZXRhZGF0YURyb3Bkb3duT2JqZWN0ITogRHJvcGRvd25PYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlPjtcbiAgICAvKipcbiAgICAgKiBBbGwgcG9zc2libGUgZHJvcGRvd24gdmFsdWVzIGZvciB0aGUgb2JqZWN0IHByb3BlcnR5LlxuICAgICAqL1xuICAgIHByaXZhdGUgb2JqZWN0RHJvcGRvd25WYWx1ZXM6IERyb3Bkb3duVmFsdWU8RW50aXR5VHlwZSB8IHVuZGVmaW5lZD5bXSA9IFtdO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlucHV0IG5hbWUgZm9yIHRoZSByZWZlcmVuY2VzIG9uZSBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBvYmplY3REcm9wZG93bk5hbWUhOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQWxsIGN1cnJlbnRseSBzaG93biBkcm9wZG93biB2YWx1ZXMgZm9yIHRoZSBvYmplY3QgcHJvcGVydHkuXG4gICAgICovXG4gICAgZmlsdGVyZWRPYmplY3REcm9wZG93blZhbHVlczogRHJvcGRvd25WYWx1ZTxFbnRpdHlUeXBlIHwgdW5kZWZpbmVkPltdID0gW107XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJuc1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb2JqZWN0IGFzIGEgZHJvcCBkb3duIHZhbHVlLlxuICAgICAqL1xuICAgIGdldCBjdXJyZW50T2JqZWN0RHJvcGRvd25WYWx1ZSgpOiBEcm9wZG93blZhbHVlPEVudGl0eVR5cGUgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgdmFsdWU6IERyb3Bkb3duVmFsdWU8RW50aXR5VHlwZSB8IHVuZGVmaW5lZD5bXSA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodGhpcy5vYmplY3REcm9wZG93blZhbHVlcyA/PyBbXSk7XG4gICAgICAgIHJldHVybiB2YWx1ZS5maW5kKHYgPT4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwodi52YWx1ZSwgdGhpcy5lbnRpdHlbdGhpcy5wcm9wZXJ0eUtleV0pKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJuc1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBjdXJyZW50IG9iamVjdCBkcm9wZG93biB2YWx1ZSBzaG91bGQgYmUgc2hvd24gaW4gdGhlIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIGdldCBzaG91bGREaXNwbGF5Q3VycmVudE9iamVjdERyb3Bkb3duVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuY3VycmVudE9iamVjdERyb3Bkb3duVmFsdWVcbiAgICAgICAgICAgICYmICF0aGlzLmZpbHRlcmVkT2JqZWN0RHJvcGRvd25WYWx1ZXMuZmluZCh2ID0+IExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKHYudmFsdWUsIHRoaXMuY3VycmVudE9iamVjdERyb3Bkb3duVmFsdWU/LnZhbHVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgY29tcGFyZVdpdGggbWV0aG9kIGZvciB0aGUgc2VsZWN0LlxuICAgICAqIFVzZXMgYmluZC5cbiAgICAgKi9cbiAgICBjb21wYXJlT2JqZWN0c0JvdW5kOiAodmFsdWUxPzogRW50aXR5VHlwZSwgdmFsdWUyPzogRW50aXR5VHlwZSkgPT4gYm9vbGVhbiA9IHRoaXMuY29tcGFyZU9iamVjdHMuYmluZCh0aGlzKTtcblxuICAgIEBWaWV3Q2hpbGQoJ2FkZEFycmF5SXRlbURpYWxvZycpXG4gICAgcHJpdmF0ZSByZWFkb25seSBhZGRBcnJheUl0ZW1EaWFsb2chOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcbiAgICBwcml2YXRlIGFkZEFycmF5SXRlbURpYWxvZ1JlZiE6IE1hdERpYWxvZ1JlZjx1bmtub3duPjtcbiAgICBAVmlld0NoaWxkKCdlZGl0QXJyYXlJdGVtRGlhbG9nJylcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVkaXRBcnJheUl0ZW1EaWFsb2chOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcbiAgICBwcml2YXRlIGVkaXRBcnJheUl0ZW1EaWFsb2dSZWYhOiBNYXREaWFsb2dSZWY8dW5rbm93bj47XG4gICAgLyoqXG4gICAgICogVGhlIG1ldGFkYXRhIG9mIGFuIGVudGl0eSBhcnJheSBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBtZXRhZGF0YUVudGl0eUFycmF5ITogRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGFibGUgY29udGV4dCBmb3IgdGhlIGVudGl0eSBhcnJheSBpbnB1dC5cbiAgICAgKi9cbiAgICBlbnRpdHlBcnJheVRhYmxlQ29udGV4dCE6IFRlbXBsYXRlQ29udGV4dDxUYWJsZUNvbnRleHQ8RW50aXR5VHlwZT4+O1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IGFycmF5IGl0ZW0gdG8gYmUgYWRkZWQgb3IgdXBkYXRlZC5cbiAgICAgKi9cbiAgICBhcnJheUl0ZW0hOiBFbnRpdHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhcnJheSBpdGVtIGJlZm9yZSBhbnkgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZS4gVXNlZCB0byBjaGVjayBpZiB0aGUgZm9ybSBpcyBkaXJ0eS5cbiAgICAgKi9cbiAgICBhcnJheUl0ZW1QcmlvckNoYW5nZXMhOiBFbnRpdHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBmb3JtIGNvbnRleHQgZm9yIGFkZGluZyBhbiBhcnJheSBpdGVtLlxuICAgICAqL1xuICAgIGFkZEFycmF5SXRlbUZvcm1Db250ZXh0ITogVGVtcGxhdGVDb250ZXh0PEZvcm1Db250ZXh0PEVudGl0eVR5cGU+PjtcbiAgICAvKipcbiAgICAgKiBUaGUgZm9ybSBjb250ZXh0IGZvciBlZGl0aW5nIGFuIGFycmF5IGl0ZW0uXG4gICAgICovXG4gICAgZWRpdEFycmF5SXRlbUZvcm1Db250ZXh0ITogVGVtcGxhdGVDb250ZXh0PEZvcm1Db250ZXh0PEVudGl0eVR5cGU+PjtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgYXJyYXkgaXRlbSBpcyB2YWxpZC5cbiAgICAgKi9cbiAgICBpc0FycmF5SXRlbVZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIGFycmF5IGl0ZW0gaXMgZGlydHkuXG4gICAgICovXG4gICAgaXNBcnJheUl0ZW1EaXJ0eTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgYXJyYXkgaXRlbSB0aGF0IGlzIGJlaW5nIGVkaXRlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGluZGV4T2ZFZGl0ZWRBcnJheUl0ZW0hOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQ29uZmlnIGZvciB0aGUgZGlhbG9nIHRoYXQgYWRkcyBhIG5ldyBhcnJheSBpdGVtLlxuICAgICAqL1xuICAgIGFkZEFycmF5SXRlbURpYWxvZ0RhdGEhOiBDcmVhdGVEYXRhSW50ZXJuYWw7XG4gICAgLyoqXG4gICAgICogVGhlIHRhYnMgdG8gZGlzcGxheSBpbnNpZGUgdGhlIGVkaXQgYXJyYXkgaXRlbSBkaWFsb2cuXG4gICAgICovXG4gICAgZWRpdEFycmF5SXRlbURpYWxvZ0RhdGEhOiBFZGl0QXJyYXlJdGVtRGlhbG9nRGF0YUludGVybmFsPEVudGl0eVR5cGU+O1xuICAgIC8qKlxuICAgICAqIEFsbCB2YWxpZGF0aW9uIGVycm9ycyBmb3IgdGhlIGFycmF5IGl0ZW0uXG4gICAgICovXG4gICAgYXJyYXlJdGVtVmFsaWRhdGlvbkVycm9yczogVmFsaWRhdGlvbkVycm9yW10gPSBbXTtcbiAgICAvKipcbiAgICAgKiBBbGwgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gZG9uZSB0byB0aGUgYXJyYXkgaXRlbS5cbiAgICAgKi9cbiAgICBhcnJheUl0ZW1DaGFuZ2VzOiBEaWZmZXJlbmNlPEVudGl0eVR5cGU+W10gPSBbXTtcbiAgICAvKipcbiAgICAgKiBXaGF0IHRvIGRpc3BsYXkgaW5zaWRlIHRoZSBhcnJheSBpdGVtIHRvb2x0aXAuXG4gICAgICovXG4gICAgYXJyYXlJdGVtVG9vbHRpcENvbnRlbnQ6IHN0cmluZyA9ICcnO1xuXG4gICAgLyoqXG4gICAgICogTWV0YWRhdGEgb2YgYSBoYXMgbWFueSBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBtZXRhZGF0YUhhc01hbnkhOiBIYXNNYW55RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZSwgRW50aXR5VHlwZT47XG4gICAgLyoqXG4gICAgICogVGhlIHRhYmxlIGNvbnRleHQgZm9yIHRoZSBoYXMgbWFueSBpbnB1dC5cbiAgICAgKi9cbiAgICBoYXNNYW55VGFibGVDb250ZXh0ITogVGVtcGxhdGVDb250ZXh0PFRhYmxlQ29udGV4dDxFbnRpdHlUeXBlPj47XG4gICAgLyoqXG4gICAgICogVGhlIGhhcyBtYW55IGltcG9ydCBhY3Rpb24uXG4gICAgICovXG4gICAgaGFzTWFueUltcG9ydEFjdGlvbiE6IEJhc2VUYWJsZUFjdGlvbkludGVybmFsO1xuICAgIHByaXZhdGUgaGFzTWFueUVudGl0eVNlcnZpY2UhOiBFbnRpdHlTZXJ2aWNlPEVudGl0eVR5cGU+O1xuICAgIEBWaWV3Q2hpbGQoJ2NyZWF0ZUhhc01hbnlEaWFsb2cnKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlSGFzTWFueURpYWxvZyE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICAgIHByaXZhdGUgY3JlYXRlSGFzTWFueURpYWxvZ1JlZiE6IE1hdERpYWxvZ1JlZjx1bmtub3duPjtcbiAgICBAVmlld0NoaWxkKCdlZGl0SGFzTWFueURpYWxvZycpXG4gICAgcHJpdmF0ZSByZWFkb25seSBlZGl0SGFzTWFueURpYWxvZyE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICAgIHByaXZhdGUgZWRpdEhhc01hbnlEaWFsb2dSZWYhOiBNYXREaWFsb2dSZWY8dW5rbm93bj47XG4gICAgLyoqXG4gICAgICogQSBzaW5nbGUgaGFzIG1hbnkgZW50aXR5LlxuICAgICAqL1xuICAgIGhhc01hbnlFbnRpdHkhOiBFbnRpdHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBzaW5nbGUgaGFzIG1hbnkgZW50aXR5IGJlZm9yZSBhbnkgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZS4gSXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGZvcm0gaXMgZGlydHkuXG4gICAgICovXG4gICAgaGFzTWFueUVudGl0eVByaW9yQ2hhbmdlcyE6IEVudGl0eVR5cGU7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIGhhcyBtYW55IGVudGl0eSBpcyB2YWxpZC5cbiAgICAgKi9cbiAgICBpc0hhc01hbnlFbnRpdHlWYWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEFsbCB2YWxpZGF0aW9uIGVycm9ycyBvZiB0aGUgaGFzIG1hbnkgZW50aXR5LlxuICAgICAqL1xuICAgIGhhc01hbnlWYWxpZGF0aW9uRXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JbXSA9IFtdO1xuICAgIC8qKlxuICAgICAqIEFsbCB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBkb25lIHRvIHRoZSBoYXMgbWFueSBlbnRpdHkuXG4gICAgICovXG4gICAgaGFzTWFueUNoYW5nZXM6IERpZmZlcmVuY2U8RW50aXR5VHlwZT5bXSA9IFtdO1xuICAgIC8qKlxuICAgICAqIFdoYXQgdG8gZGlzcGxheSBpbnNpZGUgdGhlIGhhcyBtYW55IHRvb2x0aXAuXG4gICAgICovXG4gICAgaGFzTWFueVRvb2x0aXBDb250ZW50OiBzdHJpbmcgPSAnJztcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgaGFzIG1hbnkgZW50aXR5IGlzIGRpcnR5LlxuICAgICAqL1xuICAgIGlzSGFzTWFueUVudGl0eURpcnR5OiBib29sZWFuID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIGN1cnJlbnQgdXNlciBpcyBhbGxvd2VkIHRvIGNyZWF0ZSBhIGhhcyBtYW55IGVudGl0eS5cbiAgICAgKi9cbiAgICBoYXNNYW55QWxsb3dDcmVhdGUhOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBmb3JtIGNvbnRleHQgZm9yIGNyZWF0aW5nIGFuIGhhcyBtYW55IGVudGl0eS5cbiAgICAgKi9cbiAgICBoYXNNYW55Q3JlYXRlRm9ybUNvbnRleHQhOiBUZW1wbGF0ZUNvbnRleHQ8Rm9ybUNvbnRleHQ8RW50aXR5VHlwZT4+O1xuICAgIC8qKlxuICAgICAqIFRoZSBmb3JtIGNvbnRleHQgZm9yIGVkaXRpbmcgYW4gaGFzIG1hbnkgZW50aXR5LlxuICAgICAqL1xuICAgIGhhc01hbnlFZGl0Rm9ybUNvbnRleHQhOiBUZW1wbGF0ZUNvbnRleHQ8Rm9ybUNvbnRleHQ8RW50aXR5VHlwZT4+O1xuICAgIHByaXZhdGUgaGFzTWFueUNyZWF0ZUJhc2VVcmwhOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWV0YWRhdGEgZm9yIGEgcmVmZXJlbmNlcyBvbmUgcHJvcGVydHkuXG4gICAgICovXG4gICAgbWV0YWRhdGFSZWZlcmVuY2VzT25lITogUmVmZXJlbmNlc09uZURlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+O1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZXMgdGhhdCBjYW4gYmUgcG9zc2libHkgcmVmZXJlbmNlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlZmVyZW5jZXNPbmVBbGxSZWZlcmVuY2VkRW50aXRpZXMhOiBFbnRpdHlUeXBlW107XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3NpYmxlIHJlZmVyZW5jZXMgb25lIGRyb3Bkb3duIHZhbHVlcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlZmVyZW5jZXNPbmVEcm9wZG93blZhbHVlcyE6IERyb3Bkb3duVmFsdWU8c3RyaW5nPltdO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaWx0ZXJlZCBkcm9wZG93biB2YWx1ZXMgdGhhdCBnZXQgZGlzcGxheWVkIGluIHRoZSByZWZlcmVuY2VzIG9uZSBkcm9wZG93biBpbnB1dC5cbiAgICAgKi9cbiAgICBmaWx0ZXJlZFJlZmVyZW5jZXNPbmVEcm9wZG93blZhbHVlcyE6IERyb3Bkb3duVmFsdWU8c3RyaW5nPltdO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlucHV0IG5hbWUgZm9yIHRoZSByZWZlcmVuY2VzIG9uZSBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICByZWZlcmVuY2VzT25lTmFtZSE6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZm9ybSBjb250ZXh0IGZvciBhbiBvYmplY3QgcHJvcGVydHkuXG4gICAgICovXG4gICAgcmVmZXJlbmNlc09uZUZvcm1Db250ZXh0ITogVGVtcGxhdGVDb250ZXh0PEZvcm1Db250ZXh0PEVudGl0eVR5cGU+PjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBlbnVtIFZhbHVlcyBmb3IgYWxsIHRoZSBkaWZmZXJlbnQgRGVjb3JhdG9yVHlwZXMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgRGVjb3JhdG9yVHlwZXM6IHR5cGVvZiBEZWNvcmF0b3JUeXBlcyA9IERlY29yYXRvclR5cGVzO1xuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIEhlbHBlck1ldGhvZHMgYXJvdW5kIGhhbmRsaW5nIEVudGl0aWVzIGFuZCB0aGVpciBwcm9wZXJ0eS1tZXRhZGF0YS5cbiAgICAgKi9cbiAgICBFbnRpdHlVdGlsaXRpZXM6IHR5cGVvZiBFbnRpdHlVdGlsaXRpZXMgPSBFbnRpdHlVdGlsaXRpZXM7XG4gICAgLyoqXG4gICAgICogQ29udGFpbnMgSGVscGVyIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgZGF0ZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIERhdGVVdGlsaXRpZXM6IHR5cGVvZiBEYXRlVXRpbGl0aWVzID0gRGF0ZVV0aWxpdGllcztcbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBmdW5jdGlvbmFsaXR5IGFyb3VuZCBtYXRlcmlhbCBzZWxlY3Rpb25zIGluc2lkZSBvZiB0YWJsZXMuXG4gICAgICovXG4gICAgU2VsZWN0aW9uVXRpbGl0aWVzOiB0eXBlb2YgU2VsZWN0aW9uVXRpbGl0aWVzID0gU2VsZWN0aW9uVXRpbGl0aWVzO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJuc1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBkcm9wZG93biB2YWx1ZSBmb3IgcmVmZXJlbmNlcyBvbmUuXG4gICAgICogSXMgbmVlZGVkIHNvIHRoYXQgdGhlIGRyb3Bkb3duIHZhbHVlIHdpbGwgc3RpbGwgYmUgZGlzcGxheWVkLFxuICAgICAqIGV2ZW4gd2hlbiB0aGUgZmlsdGVyIG1ldGhvZCByZW1vdmVzIHRoZSB2YWx1ZSBmcm9tIHRoZSBzZWxlY3RhYmxlIGRyb3Bkb3duIHZhbHVlcy5cbiAgICAgKi9cbiAgICBnZXQgY3VycmVudFJlZmVyZW5jZXNPbmVEcm9wZG93blZhbHVlKCk6IERyb3Bkb3duVmFsdWU8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHRoaXMucmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWVzID8/IFtdKVxuICAgICAgICAgICAgLmZpbmQodiA9PiB2LnZhbHVlID09PSB0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJuc1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmVmZXJlbmNlcyBvbmUgdmFsdWUgc2hvdWxkIGJlIHNob3duLFxuICAgICAqIGFsdGhvdWdoIGl0IHdvdWxkIGhhdmUgYmVlbiBmaWx0ZXJlZCBvdXQgYnkgdGhlIHNlYXJjaC5cbiAgICAgKi9cbiAgICBnZXQgc2hvdWxkRGlzcGxheUN1cnJlbnRSZWZlcmVuY2VzT25lRHJvcGRvd25WYWx1ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5jdXJyZW50UmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWVcbiAgICAgICAgICAgICYmICF0aGlzLmZpbHRlcmVkUmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWVzLmZpbmQodiA9PiB2LnZhbHVlID09PSB0aGlzLmN1cnJlbnRSZWZlcmVuY2VzT25lRHJvcGRvd25WYWx1ZT8udmFsdWUpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZzogTWF0RGlhbG9nLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgICAgICBASW5qZWN0KE5HWF9HRVRfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFKVxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2U6IChtb2RlbDogTmdNb2RlbCkgPT4gc3RyaW5nLFxuICAgICAgICBASW5qZWN0KE5HWF9DT01QTEVURV9HTE9CQUxfREVGQVVMVF9WQUxVRVMpXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBnbG9iYWxDb25maWc6IE5neEdsb2JhbERlZmF1bHRWYWx1ZXMsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudFxuICAgICkge31cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgaW5wdXQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9uIHRoZSBnaXZlbiBwcm9wZXJ0eSBpcyByZWFkb25seS5cbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgb24gd2hpY2ggdG8gY2hlY2sgdGhlIGlucHV0LlxuICAgICAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IGZvciB0aGUgaW5wdXQgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGlucHV0IGlzIHJlYWRvbmx5LlxuICAgICAqL1xuICAgIGlzUHJvcGVydHlSZWFkT25seShwcm9wZXJ0eTogRW50aXR5VHlwZSwga2V5OiBrZXlvZiBFbnRpdHlUeXBlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxJc1JlYWRPbmx5IHx8IHRoaXMubWV0YWRhdGFEZWZhdWx0T2JqZWN0Py5pc1JlYWRPbmx5KHByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gfCB1bmRlZmluZWQgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShwcm9wZXJ0eSwga2V5KTtcbiAgICAgICAgICAgIGlmICghbWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG1ldGFkYXRhIHdhcyBmb3VuZCBmb3IgdGhlIGtleSBcIiR7U3RyaW5nKGtleSl9XCJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5pc1JlYWRPbmx5KHByb3BlcnR5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgdG8gZGlzcGxheSBpbiB0aGUgY29sdW1uLlxuICAgICAqIFJ1bnMgaW4gZW52aXJvbm1lbnQgY29udGV4dCB0byBlbmFibGUgaW5qZWN0aW9uLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIGdldCB0aGUgdmFsdWUgZnJvbS5cbiAgICAgKiBAcGFyYW0gZGlzcGxheUNvbHVtbiAtIFRoZSBkaXNwbGF5IGNvbHVtbiB0byBnZXQgdGhlIHZhbHVlIGZyb20uXG4gICAgICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHRoZSBkaXNwbGF5IGNvbHVtbi5cbiAgICAgKi9cbiAgICBnZXREaXNwbGF5Q29sdW1uVmFsdWUoZW50aXR5OiBFbnRpdHlUeXBlLCBkaXNwbGF5Q29sdW1uOiBEaXNwbGF5Q29sdW1uPEVudGl0eVR5cGU+KTogdW5rbm93biB7XG4gICAgICAgIHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgKCkgPT4gZGlzcGxheUNvbHVtbi52YWx1ZShlbnRpdHkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhIGNlbGxDbGlja2VkIGV2ZW50IHdoZW4gdGhlIGNsaWNrZWQgY29sdW1uIGlzIGVuYWJsZWQgYW5kIGNsaWNraW5nIGlzIGFsbG93ZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSByb3cgdGhhdCB3YXMgY2xpY2tlZC5cbiAgICAgKiBAcGFyYW0gZENvbCAtIFRoZSBkaXNwbGF5IGNvbHVtbiBvZiB0aGUgcm93IHRoYXQgd2FzIGNsaWNrZWQuXG4gICAgICogQHBhcmFtIGNvbnRleHQgLSBUaGUgY29udGV4dCBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNlbGwgd2FzIGNsaWNrZWQuXG4gICAgICovXG4gICAgY2xpY2tDZWxsPFQ+KHZhbHVlOiBULCBkQ29sOiBEaXNwbGF5Q29sdW1uPFQ+LCBjb250ZXh0OiBUYWJsZUNvbnRleHQ8VD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGRDb2wuZGlzYWJsZUNsaWNrID09IHRydWUgfHwgIWNvbnRleHQuYWxsb3dDbGljayh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmNsaWNrQ2VsbCh2YWx1ZSwgZENvbCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlID0gdGhpcy5nZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlID8/IHRoaXMuZGVmYXVsdEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2U7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxJc1JlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5ID8/IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGZvdW5kVHlwZTogRGVjb3JhdG9yVHlwZXMgfCB1bmRlZmluZWQgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlUeXBlKHRoaXMuZW50aXR5LCB0aGlzLnByb3BlcnR5S2V5KTtcbiAgICAgICAgaWYgKGZvdW5kVHlwZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdHlwZSB3YXMgZm91bmQgZm9yIHRoZSBrZXkgXCIke1N0cmluZyh0aGlzLnByb3BlcnR5S2V5KX1cImApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudHlwZSA9IGZvdW5kVHlwZTtcbiAgICAgICAgaWYgKHRoaXMudmFsaWRFbXB0eSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+ID0gUmVmbGVjdFV0aWxpdGllcy5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgICAnbWV0YWRhdGEnLFxuICAgICAgICAgICAgICAgIHRoaXMuZW50aXR5LFxuICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydHlLZXlcbiAgICAgICAgICAgICkgYXMgUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDx1bmtub3duPjtcbiAgICAgICAgICAgIFJlZmxlY3RVdGlsaXRpZXMuZGVmaW5lTWV0YWRhdGEoJ21ldGFkYXRhJywgeyAuLi5jdXJyZW50TWV0YWRhdGEsIHJlcXVpcmVkOiBkZWZhdWx0RmFsc2UgfSwgdGhpcy5lbnRpdHksIHRoaXMucHJvcGVydHlLZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm91bmRNZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKFxuICAgICAgICAgICAgdGhpcy5lbnRpdHksXG4gICAgICAgICAgICB0aGlzLnByb3BlcnR5S2V5LFxuICAgICAgICAgICAgdGhpcy50eXBlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZm91bmRNZXRhZGF0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBtZXRhZGF0YSB3YXMgZm91bmQgZm9yIHRoZSBrZXkgXCIke1N0cmluZyh0aGlzLnByb3BlcnR5S2V5KX1cImApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBmb3VuZE1ldGFkYXRhO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLk9CSkVDVF9EUk9QRE9XTjoge1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5pbml0RHJvcGRvd25PYmplY3RJbnB1dCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5PQkpFQ1Q6IHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRPYmplY3RJbnB1dCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWToge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdEVudGl0eUFycmF5KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkhBU19NQU5ZOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0SGFzTWFueSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5SRUZFUkVOQ0VTX09ORToge1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5pbml0UmVmZXJlbmNlc09uZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0UmVmZXJlbmNlc09uZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5tZXRhZGF0YVJlZmVyZW5jZXNPbmUgPSB0aGlzLm1ldGFkYXRhIGFzIFJlZmVyZW5jZXNPbmVEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlPjtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VzT25lTmFtZSA9IHRoaXMucHJvcGVydHlLZXkudG9TdHJpbmcoKSArICdpbnB1dCcgKyBVVUlEVXRpbGl0aWVzLmNyZWF0ZSgpO1xuXG4gICAgICAgIGF3YWl0IHJ1bkluSW5qZWN0aW9uQ29udGV4dChcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0b3IsXG4gICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VzT25lQWxsUmVmZXJlbmNlZEVudGl0aWVzID0gYXdhaXQgdGhpcy5tZXRhZGF0YVJlZmVyZW5jZXNPbmUuZ2V0UmVmZXJlbmNlZEVudGl0aWVzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VzT25lRHJvcGRvd25WYWx1ZXMgPSB0aGlzLm1ldGFkYXRhUmVmZXJlbmNlc09uZS5nZXREcm9wZG93blZhbHVlcyhcbiAgICAgICAgICAgICAgICAgICAgTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLnJlZmVyZW5jZXNPbmVBbGxSZWZlcmVuY2VkRW50aXRpZXMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkUmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWVzID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLnJlZmVyZW5jZXNPbmVEcm9wZG93blZhbHVlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSZWZlcmVuY2VzT25lT2JqZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVycyB0aGUgcmVmZXJlbmNlcyBvbmUgZHJvcGRvd24gdmFsdWVzLlxuICAgICAqIEBwYXJhbSBzZWFyY2hJbnB1dCAtIFRoZSBzZWFyY2ggaW5wdXQgdG8gZmlsdGVyIGZvci5cbiAgICAgKi9cbiAgICBmaWx0ZXJSZWZlcmVuY2VzT25lVmFsdWVzKHNlYXJjaElucHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmlsdGVyOiBzdHJpbmcgPSBzZWFyY2hJbnB1dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB0aGlzLmZpbHRlcmVkUmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWVzID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLnJlZmVyZW5jZXNPbmVEcm9wZG93blZhbHVlcykuZmlsdGVyKG9wdGlvbiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uLmRpc3BsYXlOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyKSB8fCBvcHRpb24udmFsdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRIYXNNYW55KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gbmV3IEhhc01hbnlEZWNvcmF0b3JDb25maWdJbnRlcm5hbChcbiAgICAgICAgICAgIHRoaXMubWV0YWRhdGEgYXMgSGFzTWFueURlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGUsIEVudGl0eVR5cGU+LFxuICAgICAgICAgICAgdGhpcy5nbG9iYWxDb25maWdcbiAgICAgICAgKTtcbiAgICAgICAgUmVmbGVjdFV0aWxpdGllcy5kZWZpbmVNZXRhZGF0YSgnbWV0YWRhdGEnLCB0aGlzLm1ldGFkYXRhLCB0aGlzLmVudGl0eSwgdGhpcy5wcm9wZXJ0eUtleSk7XG4gICAgICAgIHRoaXMubWV0YWRhdGFIYXNNYW55ID0gdGhpcy5tZXRhZGF0YSBhcyBIYXNNYW55RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZSwgRW50aXR5VHlwZT47XG4gICAgICAgIHRoaXMuaGFzTWFueUltcG9ydEFjdGlvbiA9IG5ldyBCYXNlVGFibGVBY3Rpb25JbnRlcm5hbCh7XG4gICAgICAgICAgICAuLi50aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuaW1wb3J0QWN0aW9uRGF0YSxcbiAgICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5zdGFydEltcG9ydEpzb24oKVxuICAgICAgICB9LCB0aGlzLmdsb2JhbENvbmZpZyk7XG5cbiAgICAgICAgcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuaW5qZWN0b3IsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFzTWFueUFsbG93Q3JlYXRlID0gdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmFsbG93Q3JlYXRlKCk7XG4gICAgICAgICAgICB0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlID0gaW5qZWN0PEVudGl0eVNlcnZpY2U8RW50aXR5VHlwZT4+KHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5FbnRpdHlTZXJ2aWNlQ2xhc3MpO1xuICAgICAgICAgICAgdGhpcy5oYXNNYW55Q3JlYXRlQmFzZVVybCA9IHRoaXMubWV0YWRhdGFIYXNNYW55LmNyZWF0ZUJhc2VVcmwodGhpcy5lbnRpdHksIHRoaXMubWV0YWRhdGFIYXNNYW55KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZ2l2ZW5EaXNwbGF5Q29sdW1uczogc3RyaW5nW10gPSB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuZGlzcGxheUNvbHVtbnMubWFwKCh2KSA9PiB2LmRpc3BsYXlOYW1lKTtcbiAgICAgICAgaWYgKGdpdmVuRGlzcGxheUNvbHVtbnMuZmluZChzID0+IHMgPT09ICdzZWxlY3QnKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBUaGUgbmFtZSBcInNlbGVjdFwiIGZvciBhIGRpc3BsYXkgY29sdW1uIGlzIHJlc2VydmVkLlxuICAgICAgICAgICAgICAgIFBsZWFzZSBjaG9vc2UgYSBkaWZmZXJlbnQgbmFtZS5gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzTWFueVRhYmxlQ29udGV4dCA9IHtcbiAgICAgICAgICAgICRpbXBsaWNpdDoge1xuICAgICAgICAgICAgICAgIC4uLm5ldyBJbnRlcm5hbEN1c3RvbVRhYmxlQ29uZmlndXJhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nbG9iYWxDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlDb2x1bW5zOiB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuZGlzcGxheUNvbHVtbnMgYXMgRGlzcGxheUNvbHVtbjx1bmtub3duPltdLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFNlbGVjdGlvbjogIXRoaXMuaW50ZXJuYWxJc1JlYWRPbmx5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN0eWxpc3RpYy9tYXgtbGVuXG4gICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljUm93U3R5bGVDbGFzc2VzOiB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuZHluYW1pY1Jvd1N0eWxlQ2xhc3NlcyBhcyBEeW5hbWljU3R5bGVDbGFzc2VzPHVua25vd24+LFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dDbGljazogKChlbnRpdHk6IEVudGl0eVR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmFsbG93UmVhZChlbnRpdHkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5hbGxvd1VwZGF0ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkgYXMgKHZhbHVlOiB1bmtub3duKSA9PiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUxvYWRpbmdTcGlubmVyOiB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuZGlzcGxheUxvYWRpbmdTcGlubmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoU3RyaW5nRm9yUm93OiB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuc2VhcmNoU3RyaW5nIGFzICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGRpc3BsYXllZENvbHVtbnM6ICF0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGFibGVBY3Rpb25zLmZpbHRlcih0QSA9PiB0QS50eXBlID09PSAnbXVsdGktc2VsZWN0JykubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgID8gZ2l2ZW5EaXNwbGF5Q29sdW1uc1xuICAgICAgICAgICAgICAgICAgICA6IFsnc2VsZWN0J10uY29uY2F0KGdpdmVuRGlzcGxheUNvbHVtbnMpLFxuICAgICAgICAgICAgICAgIGRhdGFTb3VyY2U6IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoKSxcbiAgICAgICAgICAgICAgICBpc0xvYWRpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgc2hvdWxkU2hvd01pc3NpbmdFcnJvcjogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBuZXcgU2VsZWN0aW9uTW9kZWw8RW50aXR5VHlwZT4odHJ1ZSwgW10pLFxuICAgICAgICAgICAgICAgIGNsaWNrQ2VsbDogKGVudGl0eSwgZENvbCkgPT4gdGhpcy5lZGl0SGFzTWFueUVudGl0eShlbnRpdHksIGRDb2wpXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5oYXNNYW55VGFibGVDb250ZXh0LiRpbXBsaWNpdC5kYXRhU291cmNlLnNvcnRpbmdEYXRhQWNjZXNzb3IgPSAoZW50aXR5OiBFbnRpdHlUeXBlLCBoZWFkZXI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzcGxheUNvbHVtbjogRGlzcGxheUNvbHVtbjxFbnRpdHlUeXBlPiA9IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5kaXNwbGF5Q29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAuZmluZCgoZHApID0+IGRwLmRpc3BsYXlOYW1lID09PSBoZWFkZXIpIGFzIERpc3BsYXlDb2x1bW48RW50aXR5VHlwZT47XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlQ29sdW1uVmFsdWVUb1NvcnRWYWx1ZShkaXNwbGF5Q29sdW1uLnZhbHVlKGVudGl0eSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFzTWFueVRhYmxlQ29udGV4dC4kaW1wbGljaXQuZGF0YVNvdXJjZS5maWx0ZXJQcmVkaWNhdGUgPSAoZW50aXR5OiBFbnRpdHlUeXBlLCBmaWx0ZXI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VhcmNoU3RyOiBzdHJpbmcgPSB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuc2VhcmNoU3RyaW5nKGVudGl0eSk7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRTZWFyY2hTdHJpbmc6IHN0cmluZyA9IHNlYXJjaFN0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRmlsdGVyU3RyaW5nOiBzdHJpbmcgPSBmaWx0ZXIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZWRTZWFyY2hTdHJpbmcuaW5jbHVkZXMoZm9ybWF0dGVkRmlsdGVyU3RyaW5nKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlLmVudGl0aWVzU3ViamVjdC5zdWJzY3JpYmUoKGVudGl0aWVzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhc01hbnlUYWJsZUNvbnRleHQuJGltcGxpY2l0LmRhdGFTb3VyY2UuZGF0YSA9IGVudGl0aWVzO1xuICAgICAgICAgICAgdGhpcy5oYXNNYW55VGFibGVDb250ZXh0LiRpbXBsaWNpdC5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZvaWQgcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuaW5qZWN0b3IsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWRCYXNlVXJsOiBzdHJpbmcgPSB0aGlzLm1ldGFkYXRhSGFzTWFueS5yZWFkQmFzZVVybCh0aGlzLmVudGl0eSwgdGhpcy5tZXRhZGF0YUhhc01hbnkpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYXNNYW55RW50aXR5U2VydmljZS5yZWFkKHJlYWRCYXNlVXJsKTtcbiAgICAgICAgICAgIHRoaXMuaGFzTWFueVRhYmxlQ29udGV4dC4kaW1wbGljaXQuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEVudGl0eUFycmF5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gbmV3IEVudGl0eUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwoXG4gICAgICAgICAgICB0aGlzLm1ldGFkYXRhIGFzIEVudGl0eUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZT4sXG4gICAgICAgICAgICB0aGlzLmdsb2JhbENvbmZpZ1xuICAgICAgICApO1xuICAgICAgICBSZWZsZWN0VXRpbGl0aWVzLmRlZmluZU1ldGFkYXRhKCdtZXRhZGF0YScsIHRoaXMubWV0YWRhdGEsIHRoaXMuZW50aXR5LCB0aGlzLnByb3BlcnR5S2V5KTtcbiAgICAgICAgdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5ID0gdGhpcy5tZXRhZGF0YSBhcyBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+O1xuICAgICAgICBpZiAodGhpcy5lbnRpdHlbdGhpcy5wcm9wZXJ0eUtleV0gPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAodGhpcy5lbnRpdHlbdGhpcy5wcm9wZXJ0eUtleV0gYXMgRW50aXR5VHlwZVtdKSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LmNyZWF0ZUlubGluZSAmJiAhdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LmNyZWF0ZURpYWxvZ0RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5jcmVhdGVEaWFsb2dEYXRhID0ge1xuICAgICAgICAgICAgICAgIHRpdGxlOiAnQWRkJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBnaXZlbkRpc3BsYXlDb2x1bW5zOiBzdHJpbmdbXSA9IHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5kaXNwbGF5Q29sdW1ucy5tYXAoKHYpID0+IHYuZGlzcGxheU5hbWUpO1xuICAgICAgICBpZiAoZ2l2ZW5EaXNwbGF5Q29sdW1ucy5maW5kKHMgPT4gcyA9PT0gJ3NlbGVjdCcpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFRoZSBuYW1lIFwic2VsZWN0XCIgZm9yIGEgZGlzcGxheSBjb2x1bW4gaXMgcmVzZXJ2ZWQuXG4gICAgICAgICAgICAgICAgUGxlYXNlIGNob29zZSBhIGRpZmZlcmVudCBuYW1lLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbnRpdHlBcnJheVRhYmxlQ29udGV4dCA9IHtcbiAgICAgICAgICAgICRpbXBsaWNpdDoge1xuICAgICAgICAgICAgICAgIC4uLm5ldyBJbnRlcm5hbEN1c3RvbVRhYmxlQ29uZmlndXJhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nbG9iYWxDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlDb2x1bW5zOiB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuZGlzcGxheUNvbHVtbnMgYXMgRGlzcGxheUNvbHVtbjx1bmtub3duPltdLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFNlbGVjdGlvbjogIXRoaXMuaW50ZXJuYWxJc1JlYWRPbmx5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY1Jvd1N0eWxlQ2xhc3NlczogdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LmR5bmFtaWNSb3dTdHlsZUNsYXNzZXMgYXMgRHluYW1pY1N0eWxlQ2xhc3Nlczx1bmtub3duPixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5RXJyb3JNZXNzYWdlOiB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkubWlzc2luZ0Vycm9yTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBkaXNwbGF5ZWRDb2x1bW5zOiB0aGlzLmludGVybmFsSXNSZWFkT25seSA/IGdpdmVuRGlzcGxheUNvbHVtbnMgOiBbJ3NlbGVjdCddLmNvbmNhdChnaXZlbkRpc3BsYXlDb2x1bW5zKSxcbiAgICAgICAgICAgICAgICBkYXRhU291cmNlOiBuZXcgTWF0VGFibGVEYXRhU291cmNlKCksXG4gICAgICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzaG91bGRTaG93TWlzc2luZ0Vycm9yOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogbmV3IFNlbGVjdGlvbk1vZGVsPEVudGl0eVR5cGU+KHRydWUsIFtdKSxcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby1taXN1c2VkLXByb21pc2VzXG4gICAgICAgICAgICAgICAgY2xpY2tDZWxsOiAoZW50aXR5LCBkQ29sKSA9PiB0aGlzLmVkaXRBcnJheUl0ZW0oZW50aXR5LCBkQ29sKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVudGl0eUFycmF5VGFibGVDb250ZXh0LiRpbXBsaWNpdC5kYXRhU291cmNlLmRhdGEgPSB0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyBFbnRpdHlUeXBlW107XG5cbiAgICAgICAgdGhpcy5hcnJheUl0ZW0gPSBuZXcgdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LkVudGl0eUNsYXNzKCk7XG4gICAgICAgIHRoaXMuYXJyYXlJdGVtUHJpb3JDaGFuZ2VzID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLmFycmF5SXRlbSk7XG4gICAgICAgIEVudGl0eVV0aWxpdGllcy5zZXREZWZhdWx0VmFsdWVzKHRoaXMuYXJyYXlJdGVtKTtcblxuICAgICAgICB0aGlzLmFkZEFycmF5SXRlbUZvcm1Db250ZXh0ID0ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiB7XG4gICAgICAgICAgICAgICAgZW50aXR5OiB0aGlzLmFycmF5SXRlbSxcbiAgICAgICAgICAgICAgICB0YWJzOiBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5VGFicyh0aGlzLmFycmF5SXRlbSwgdGhpcy5pbmplY3RvciwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgaW5wdXRDaGFuZ2VFdmVudDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2b2lkIHRoaXMuY2hlY2tJc0FycmF5SXRlbVZhbGlkKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQXJyYXlJdGVtRm9ybUNvbnRleHQuJGltcGxpY2l0LnRhYnMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5VGFicyh0aGlzLmFycmF5SXRlbSwgdGhpcy5pbmplY3RvciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoaWRlT21pdEZvckNyZWF0ZTogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFkZEFycmF5SXRlbURpYWxvZ0RhdGEgPSBuZXcgQ3JlYXRlRGF0YUJ1aWxkZXIodGhpcy5nbG9iYWxDb25maWcsIHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5jcmVhdGVEaWFsb2dEYXRhKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCdjcmVhdGVCdXR0b25MYWJlbCcsIHRoaXMuZ2xvYmFsQ29uZmlnLmFkZExhYmVsKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0aXRsZScsIHRoaXMuZ2xvYmFsQ29uZmlnLmFkZEFycmF5SXRlbVRpdGxlKVxuICAgICAgICAgICAgLmdldFJlc3VsdCgpO1xuXG4gICAgICAgIHRoaXMuZWRpdEFycmF5SXRlbUZvcm1Db250ZXh0ID0ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiB7XG4gICAgICAgICAgICAgICAgZW50aXR5OiB0aGlzLmFycmF5SXRlbSxcbiAgICAgICAgICAgICAgICB0YWJzOiBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5VGFicyh0aGlzLmFycmF5SXRlbSwgdGhpcy5pbmplY3RvciwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgaXNSZWFkT25seTogKHByb3BlcnR5LCBrZXkpID0+IHRoaXMuaXNQcm9wZXJ0eVJlYWRPbmx5KHByb3BlcnR5LCBrZXkpLFxuICAgICAgICAgICAgICAgIGlucHV0Q2hhbmdlRXZlbnQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdm9pZCB0aGlzLmNoZWNrQXJyYXlJdGVtKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdEFycmF5SXRlbUZvcm1Db250ZXh0LiRpbXBsaWNpdC50YWJzID0gRW50aXR5VXRpbGl0aWVzLmdldEVudGl0eVRhYnModGhpcy5hcnJheUl0ZW0sIHRoaXMuaW5qZWN0b3IsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGlkZU9taXRGb3JFZGl0OiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZWRpdEFycmF5SXRlbURpYWxvZ0RhdGEgPSB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuZWRpdERpYWxvZ0RhdGE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0RHJvcGRvd25PYmplY3RJbnB1dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5tZXRhZGF0YURyb3Bkb3duT2JqZWN0ID0gdGhpcy5tZXRhZGF0YSBhcyBEcm9wZG93bk9iamVjdERlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+O1xuICAgICAgICB0aGlzLm9iamVjdERyb3Bkb3duTmFtZSA9IHRoaXMucHJvcGVydHlLZXkudG9TdHJpbmcoKSArICdpbnB1dCcgKyBVVUlEVXRpbGl0aWVzLmNyZWF0ZSgpO1xuXG4gICAgICAgIGF3YWl0IHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9iamVjdERyb3Bkb3duVmFsdWVzID0gYXdhaXQgdGhpcy5tZXRhZGF0YURyb3Bkb3duT2JqZWN0LmRyb3Bkb3duVmFsdWVzKHRoaXMuZW50aXR5KTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRPYmplY3REcm9wZG93blZhbHVlcyA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodGhpcy5vYmplY3REcm9wZG93blZhbHVlcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdE9iamVjdElucHV0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1ldGFkYXRhRGVmYXVsdE9iamVjdCA9IHRoaXMubWV0YWRhdGEgYXMgRGVmYXVsdE9iamVjdERlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+O1xuICAgICAgICBjb25zdCBvYmplY3RQcm9wZXJ0eTogRW50aXR5VHlwZSA9IHRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldIGFzIEVudGl0eVR5cGU7XG4gICAgICAgIGNvbnN0IG9iamVjdFByb3BlcnR5VGFiczogRW50aXR5VGFiPEVudGl0eVR5cGU+W10gPSBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5VGFicyhcbiAgICAgICAgICAgIG9iamVjdFByb3BlcnR5LFxuICAgICAgICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgICAgICAgIHRoaXMuaGlkZU9taXRGb3JDcmVhdGUsXG4gICAgICAgICAgICB0aGlzLmhpZGVPbWl0Rm9yRWRpdCxcbiAgICAgICAgICAgIHRoaXMubWV0YWRhdGFEZWZhdWx0T2JqZWN0Lm9taXRcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5vYmplY3RGb3JtQ29udGV4dCA9IHtcbiAgICAgICAgICAgICRpbXBsaWNpdDoge1xuICAgICAgICAgICAgICAgIGVudGl0eTogb2JqZWN0UHJvcGVydHksXG4gICAgICAgICAgICAgICAgdGFiczogb2JqZWN0UHJvcGVydHlUYWJzLFxuICAgICAgICAgICAgICAgIGhpZGVPbWl0Rm9yQ3JlYXRlOiB0aGlzLmhpZGVPbWl0Rm9yQ3JlYXRlLFxuICAgICAgICAgICAgICAgIGhpZGVPbWl0Rm9yRWRpdDogdGhpcy5oaWRlT21pdEZvckVkaXQsXG4gICAgICAgICAgICAgICAgaXNSZWFkT25seTogKHByb3BlcnR5LCBrZXkpID0+IHRoaXMuaXNQcm9wZXJ0eVJlYWRPbmx5KHByb3BlcnR5LCBrZXkpLFxuICAgICAgICAgICAgICAgIGlucHV0Q2hhbmdlRXZlbnQ6ICgpID0+IHRoaXMuZW1pdENoYW5nZSgpLFxuICAgICAgICAgICAgICAgIHZhbGlkRW1wdHk6ICgpID0+ICF0aGlzLm1ldGFkYXRhLnJlcXVpcmVkKHRoaXMuZW50aXR5KVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhcnRJbXBvcnRKc29uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnB1dDogSFRNTElucHV0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgIGlucHV0LnR5cGUgPSAnZmlsZSc7XG4gICAgICAgIGlucHV0LmFjY2VwdCA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAgICAgICAgaW5wdXQub25jaGFuZ2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuZmlsZXMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmltcG9ydEpzb24oaW5wdXQuZmlsZXNbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpbnB1dC5jbGljaygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaW1wb3J0SnNvbihmaWxlOiBGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdHlsaXN0aWMvbWF4LWxlblxuICAgICAgICBjb25zdCBkaWFsb2dEYXRhOiBDb25maXJtRGlhbG9nRGF0YUludGVybmFsID0gbmV3IENvbmZpcm1EaWFsb2dEYXRhQnVpbGRlcih0aGlzLmdsb2JhbENvbmZpZywgdGhpcy5oYXNNYW55SW1wb3J0QWN0aW9uLmNvbmZpcm1EaWFsb2dEYXRhKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0ZXh0JywgdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmltcG9ydEFjdGlvbkRhdGEuY29uZmlybURpYWxvZ0RhdGE/LnRleHQpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ3RpdGxlJywgdGhpcy5oYXNNYW55SW1wb3J0QWN0aW9uLmRpc3BsYXlOYW1lKVxuICAgICAgICAgICAgLmdldFJlc3VsdCgpO1xuICAgICAgICBjb25zdCBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCBib29sZWFuPiA9IHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgZGF0YTogZGlhbG9nRGF0YSxcbiAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXM6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKSk7XG4gICAgICAgIGlmIChyZXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYXNNYW55RW50aXR5U2VydmljZS5pbXBvcnQoZmlsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdHdvIG9iamVjdHMgYXJlIGVxdWFsLiBJcyBuZWVkZWQgZm9yIHRoZSBkcm9wZG93bi5cbiAgICAgKiBAcGFyYW0gdmFsdWUxIC0gVGhlIGZpcnN0IG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB2YWx1ZTIgLSBUaGUgc2Vjb25kIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBvYmplY3RzIGFyZSB0aGUgc2FtZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbXBhcmVPYmplY3RzKHZhbHVlMT86IEVudGl0eVR5cGUsIHZhbHVlMj86IEVudGl0eVR5cGUpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdmFsdWVPYmplY3QxOiBFbnRpdHlUeXBlID0gbmV3IHRoaXMubWV0YWRhdGFEcm9wZG93bk9iamVjdC5FbnRpdHlDbGFzcyh2YWx1ZTEpO1xuICAgICAgICBjb25zdCB2YWx1ZU9iamVjdDI6IEVudGl0eVR5cGUgPSBuZXcgdGhpcy5tZXRhZGF0YURyb3Bkb3duT2JqZWN0LkVudGl0eUNsYXNzKHZhbHVlMik7XG4gICAgICAgIHJldHVybiBMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbCh2YWx1ZU9iamVjdDEsIHZhbHVlT2JqZWN0Mik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVycyB0aGUgZHJvcGRvd24gdmFsdWVzLlxuICAgICAqIEBwYXJhbSBzZWFyY2hJbnB1dCAtIFRoZSBzZWFyY2ggaW5wdXQgdG8gZmlsdGVyIGZvci5cbiAgICAgKi9cbiAgICBmaWx0ZXJPYmplY3REcm9wZG93blZhbHVlcyhzZWFyY2hJbnB1dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbHRlcjogc3RyaW5nID0gc2VhcmNoSW5wdXQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJlZE9iamVjdERyb3Bkb3duVmFsdWVzID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLm9iamVjdERyb3Bkb3duVmFsdWVzKS5maWx0ZXIob3B0aW9uID0+IHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24uZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIpIHx8IEpTT04uc3RyaW5naWZ5KG9wdGlvbi52YWx1ZSkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIC5pbmNsdWRlcyhmaWx0ZXIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByZWZlcmVuY2VzIG9uZSBvYmplY3QgdXNpbmcgdGhlIGlucHV0IGlkLlxuICAgICAqL1xuICAgIHNldFJlZmVyZW5jZXNPbmVPYmplY3QoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZvdW5kRW50aXR5OiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkID0gdGhpcy5tZXRhZGF0YVJlZmVyZW5jZXNPbmUuZ2V0RW50aXR5Rm9ySWQoXG4gICAgICAgICAgICB0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyBzdHJpbmcsXG4gICAgICAgICAgICB0aGlzLnJlZmVyZW5jZXNPbmVBbGxSZWZlcmVuY2VkRW50aXRpZXNcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlc09uZU9iamVjdDogRW50aXR5VHlwZSA9IG5ldyB0aGlzLm1ldGFkYXRhUmVmZXJlbmNlc09uZS5FbnRpdHlDbGFzcyhmb3VuZEVudGl0eSk7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZXNPbmVQcm9wZXJ0eVRhYnM6IEVudGl0eVRhYjxFbnRpdHlUeXBlPltdID0gRW50aXR5VXRpbGl0aWVzLmdldEVudGl0eVRhYnMocmVmZXJlbmNlc09uZU9iamVjdCwgdGhpcy5pbmplY3Rvcik7XG5cbiAgICAgICAgdGhpcy5yZWZlcmVuY2VzT25lRm9ybUNvbnRleHQgPSB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHtcbiAgICAgICAgICAgICAgICBlbnRpdHk6IHJlZmVyZW5jZXNPbmVPYmplY3QsXG4gICAgICAgICAgICAgICAgdGFiczogcmVmZXJlbmNlc09uZVByb3BlcnR5VGFicyxcbiAgICAgICAgICAgICAgICBoaWRlT21pdEZvckNyZWF0ZTogdGhpcy5oaWRlT21pdEZvckNyZWF0ZSxcbiAgICAgICAgICAgICAgICBoaWRlT21pdEZvckVkaXQ6IHRoaXMuaGlkZU9taXRGb3JFZGl0LFxuICAgICAgICAgICAgICAgIGlzUmVhZE9ubHk6ICgpID0+IHRydWUsXG4gICAgICAgICAgICAgICAgaW5wdXRDaGFuZ2VFdmVudDogKCkgPT4gdGhpcy5lbWl0Q2hhbmdlKCksXG4gICAgICAgICAgICAgICAgdmFsaWRFbXB0eTogKCkgPT4gIXRoaXMubWV0YWRhdGEucmVxdWlyZWQodGhpcy5lbnRpdHkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRWRpdHMgYW4gZW50aXR5LiBUaGlzIGVpdGhlciBjYWxscyB0aGUgZWRpdC1NZXRob2QgcHJvdmlkZWQgYnkgdGhlIHVzZXIgb3IgdXNlcyBhIGRlZmF1bHQgZWRpdC1kaWFsb2cuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdGhhdCBzaG91bGQgYmUgdXBkYXRlZC5cbiAgICAgKiBAcGFyYW0gZENvbCAtIFRoZSBkaXNwbGF5IGNvbHVtbiB0aGF0IHdhcyBjbGlja2VkIG9uLlxuICAgICAqIEB0aHJvd3MgV2hlbiBubyBFbnRpdHlDbGFzcyB3YXMgcHJvdmlkZWQsIGFzIGEgbmV3IGNhbGwgaXMgbmVlZGVkIHRvIGluaXRpYWxpemUgbWV0YWRhdGEuXG4gICAgICovXG4gICAgZWRpdEhhc01hbnlFbnRpdHkoZW50aXR5OiBFbnRpdHlUeXBlLCBkQ29sOiBEaXNwbGF5Q29sdW1uPEVudGl0eVR5cGU+KTogdm9pZCB7XG4gICAgICAgIGlmICgoZENvbC5kaXNhYmxlQ2xpY2sgPT09IHRydWUpIHx8ICghdGhpcy5oYXNNYW55QWxsb3dVcGRhdGUoZW50aXR5KSAmJiAhdGhpcy5oYXNNYW55QWxsb3dSZWFkKGVudGl0eSkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuRW50aXR5Q2xhc3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gXCJFbnRpdHlDbGFzc1wiIHNwZWNpZmllZCBmb3IgdGhpcyB0YWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuZWRpdCkge1xuICAgICAgICAgICAgdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmVkaXQobmV3IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5FbnRpdHlDbGFzcyhlbnRpdHkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmRlZmF1bHRFZGl0ID09ICdwYWdlJykge1xuICAgICAgICAgICAgdGhpcy5lZGl0SGFzTWFueURlZmF1bHRQYWdlKG5ldyB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuRW50aXR5Q2xhc3MoZW50aXR5KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdm9pZCB0aGlzLmVkaXRIYXNNYW55RGVmYXVsdERpYWxvZyhuZXcgdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLkVudGl0eUNsYXNzKGVudGl0eSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdXBkYXRpbmcgdGhlIHByb3ZpZGVkIGVudGl0eSBmcm9tIHRoZSBoYXMgbWFueSBwcm9wZXJ0eSBpcyBhbGxvd2VkLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBBIHNpbmdsZSB2YWx1ZSBvZiB0aGUgaGFzIG1hbnkgcHJvcGVydHkgdGhhdCB0aGUgdXNlciB3YW50cyB0byBlZGl0LlxuICAgICAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgdXNlciBjYW4gZWRpdCB0aGUgcHJvdmlkZWQgZW50aXR5IGFuZCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaGFzTWFueUFsbG93VXBkYXRlKGVudGl0eTogRW50aXR5VHlwZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuaW5qZWN0b3IsICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuYWxsb3dVcGRhdGUoZW50aXR5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB2aWV3aW5nIHRoZSBwcm92aWRlZCBlbnRpdHkgZnJvbSB0aGUgaGFzIG1hbnkgcHJvcGVydHkgaXMgYWxsb3dlZC5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gQSBzaW5nbGUgdmFsdWUgb2YgdGhlIGhhcyBtYW55IHByb3BlcnR5IHRoYXQgdGhlIHVzZXIgd2FudHMgdG8gdmlldy5cbiAgICAgKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIHVzZXIgY2FuIHZpZXcgdGhlIHByb3ZpZGVkIGVudGl0eSBhbmQgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGhhc01hbnlBbGxvd1JlYWQoZW50aXR5OiBFbnRpdHlUeXBlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5hbGxvd1JlYWQoZW50aXR5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBkZWxldGluZyB0aGUgcHJvdmlkZWQgZW50aXR5IGZyb20gdGhlIGhhcyBtYW55IHByb3BlcnR5IGlzIGFsbG93ZWQuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIEEgc2luZ2xlIHZhbHVlIG9mIHRoZSBoYXMgbWFueSBwcm9wZXJ0eSB0aGF0IHRoZSB1c2VyIHdhbnRzIHRvIGRlbGV0ZS5cbiAgICAgKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIHVzZXIgY2FuIGRlbGV0ZSB0aGUgcHJvdmlkZWQgZW50aXR5IGFuZCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaGFzTWFueUFsbG93RGVsZXRlKGVudGl0eTogRW50aXR5VHlwZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuaW5qZWN0b3IsICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuYWxsb3dEZWxldGUoZW50aXR5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGFuIEVkaXRBY3Rpb24gaXMgZGlzYWJsZWQgKGUuZy4gQmVjYXVzZSB0aGUgY3VycmVudCBlbnRyeSBkb2Vzbid0IGZ1bGxmaWwgdGhlIHJlcXVpcmVtZW50cykuXG4gICAgICogQHBhcmFtIGFjdGlvbiAtIFRoZSBFZGl0QWN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBBY3Rpb24gY2FuIGJlIHVzZWQuXG4gICAgICovXG4gICAgaGFzTWFueUVkaXRBY3Rpb25EaXNhYmxlZChhY3Rpb246IEVkaXRBY3Rpb25JbnRlcm5hbDxFbnRpdHlUeXBlPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuaW5qZWN0b3IsICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhYWN0aW9uLmVuYWJsZWQodGhpcy5oYXNNYW55RW50aXR5UHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyB0aGUgZWRpdCBhY3Rpb24gb24gdGhlIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gYWN0aW9uIC0gVGhlIGFjdGlvbiB0byBydW4uXG4gICAgICovXG4gICAgYXN5bmMgaGFzTWFueVJ1bkVkaXRBY3Rpb24oYWN0aW9uOiBFZGl0QWN0aW9uSW50ZXJuYWw8RW50aXR5VHlwZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVxdWlyZUNvbmZpcm1EaWFsb2c6IGJvb2xlYW4gPSBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5yZXF1aXJlQ29uZmlybURpYWxvZyh0aGlzLmhhc01hbnlFbnRpdHlQcmlvckNoYW5nZXMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXJlcXVpcmVDb25maXJtRGlhbG9nKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpcm1IYXNNYW55UnVuRWRpdEFjdGlvbihhY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIGJvb2xlYW4+ID0gdGhpcy5kaWFsb2cub3BlbihOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiBhY3Rpb24uY29uZmlybURpYWxvZ0RhdGEsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVzOiBib29sZWFuIHwgdW5kZWZpbmVkID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkpO1xuICAgICAgICBpZiAocmVzID09IHRydWUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29uZmlybUhhc01hbnlSdW5FZGl0QWN0aW9uKGFjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvbmZpcm1IYXNNYW55UnVuRWRpdEFjdGlvbihhY3Rpb246IEVkaXRBY3Rpb25JbnRlcm5hbDxFbnRpdHlUeXBlPik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgYWN0aW9uLmFjdGlvbih0aGlzLmhhc01hbnlFbnRpdHksIHRoaXMuaGFzTWFueUVudGl0eVByaW9yQ2hhbmdlcyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSGFzTWFueUVudGl0eSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVkaXRIYXNNYW55RGVmYXVsdFBhZ2UoZW50aXR5OiBFbnRpdHlUeXBlKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycnLCB0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlLmVkaXRCYXNlUm91dGUsIGVudGl0eVt0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlLmlkS2V5XV0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZWRpdEhhc01hbnlEZWZhdWx0RGlhbG9nKGVudGl0eTogRW50aXR5VHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmhhc01hbnlFbnRpdHkgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKGVudGl0eSk7XG4gICAgICAgIHRoaXMuaGFzTWFueUVudGl0eVByaW9yQ2hhbmdlcyA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodGhpcy5oYXNNYW55RW50aXR5KTtcbiAgICAgICAgdGhpcy5oYXNNYW55RWRpdEZvcm1Db250ZXh0ID0ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiB7XG4gICAgICAgICAgICAgICAgZW50aXR5OiB0aGlzLmhhc01hbnlFbnRpdHksXG4gICAgICAgICAgICAgICAgaGlkZU9taXRGb3JFZGl0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzUmVhZE9ubHk6IChwcm9wZXJ0eSwga2V5KSA9PiB0aGlzLmlzUHJvcGVydHlSZWFkT25seShwcm9wZXJ0eSwga2V5KSxcbiAgICAgICAgICAgICAgICBpbnB1dENoYW5nZUV2ZW50OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5jaGVja0hhc01hbnlFbnRpdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNNYW55RWRpdEZvcm1Db250ZXh0LiRpbXBsaWNpdC50YWJzID0gRW50aXR5VXRpbGl0aWVzLmdldEVudGl0eVRhYnMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc01hbnlFbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluamVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0YWJzOiBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5VGFicyh0aGlzLmhhc01hbnlFbnRpdHksIHRoaXMuaW5qZWN0b3IsIGZhbHNlLCB0cnVlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSGFzTWFueUVudGl0eSgpO1xuICAgICAgICB0aGlzLmVkaXRIYXNNYW55RGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihcbiAgICAgICAgICAgIHRoaXMuZWRpdEhhc01hbnlEaWFsb2csXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWluV2lkdGg6ICc2MCUnLFxuICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBjb25zdCByZXM6IG51bWJlciA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuZWRpdEhhc01hbnlEaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKSkgYXMgbnVtYmVyO1xuICAgICAgICBpZiAocmVzID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhOiBFbnRpdHlUeXBlW10gPSB0aGlzLmhhc01hbnlUYWJsZUNvbnRleHQuJGltcGxpY2l0LmRhdGFTb3VyY2UuZGF0YTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdHlsaXN0aWMvbWF4LWxlblxuICAgICAgICAgICAgZGF0YVt0aGlzLmhhc01hbnlUYWJsZUNvbnRleHQuJGltcGxpY2l0LmRhdGFTb3VyY2UuZGF0YS5maW5kSW5kZXgoKGUpID0+IGVbdGhpcy5oYXNNYW55RW50aXR5U2VydmljZS5pZEtleV0gPT09IGVudGl0eVt0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlLmlkS2V5XSldID0gZW50aXR5O1xuICAgICAgICAgICAgdGhpcy5oYXNNYW55VGFibGVDb250ZXh0LiRpbXBsaWNpdC5kYXRhU291cmNlLmRhdGEgPSBkYXRhO1xuICAgICAgICAgICAgdGhpcy5oYXNNYW55VGFibGVDb250ZXh0LiRpbXBsaWNpdC5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIHNhdmUgdGhlIGNoYW5nZXMgYW5kIGNsb3NlIHRoZSBkaWFsb2cgYWZ0ZXJ3YXJkcy5cbiAgICAgKiBBbHNvIGhhbmRsZXMgdGhlIGNvbmZpcm1hdGlvbiBpZiByZXF1aXJlZC5cbiAgICAgKi9cbiAgICBhc3luYyBkaWFsb2dFZGl0SGFzTWFueSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxJc1JlYWRPbmx5IHx8ICF0aGlzLmlzSGFzTWFueUVudGl0eVZhbGlkIHx8ICF0aGlzLmlzSGFzTWFueUVudGl0eURpcnR5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEuZWRpdFJlcXVpcmVzQ29uZmlybURpYWxvZykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5kaWFsb2dDb25maXJtRWRpdEhhc01hbnkoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdHlsaXN0aWMvbWF4LWxlblxuICAgICAgICBjb25zdCBkaWFsb2dEYXRhOiBDb25maXJtRGlhbG9nRGF0YUludGVybmFsID0gbmV3IENvbmZpcm1EaWFsb2dEYXRhQnVpbGRlcih0aGlzLmdsb2JhbENvbmZpZywgdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmVkaXREYXRhLmNvbmZpcm1FZGl0RGlhbG9nRGF0YSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGV4dCcsIHRoaXMuZ2xvYmFsQ29uZmlnLmNvbmZpcm1TYXZlVGV4dClcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgnY29uZmlybUJ1dHRvbkxhYmVsJywgdGhpcy5nbG9iYWxDb25maWcuc2F2ZUxhYmVsKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0aXRsZScsIHRoaXMuZ2xvYmFsQ29uZmlnLmVkaXRMYWJlbClcbiAgICAgICAgICAgIC5nZXRSZXN1bHQoKTtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwgYm9vbGVhbj4gPSB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVzOiBib29sZWFuIHwgdW5kZWZpbmVkID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkpO1xuICAgICAgICBpZiAocmVzID09IHRydWUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGlhbG9nQ29uZmlybUVkaXRIYXNNYW55KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBkaWFsb2dDb25maXJtRWRpdEhhc01hbnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFzTWFueUVudGl0eVNlcnZpY2UudXBkYXRlKHRoaXMuaGFzTWFueUVudGl0eSwgdGhpcy5oYXNNYW55RW50aXR5UHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgdGhpcy5lZGl0SGFzTWFueURpYWxvZ1JlZi5jbG9zZSgxKTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gZGVsZXRlIHRoZSBlbnRpdHkgYW5kIGNsb3NlIHRoZSBkaWFsb2cgYWZ0ZXJ3YXJkcy5cbiAgICAgKiBBbHNvIGhhbmRsZXMgdGhlIGNvbmZpcm1hdGlvbiBpZiByZXF1aXJlZC5cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGVIYXNNYW55RW50aXR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5lZGl0RGF0YS5kZWxldGVSZXF1aXJlc0NvbmZpcm1EaWFsb2cpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29uZmlybURlbGV0ZUhhc01hbnlFbnRpdHkoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdHlsaXN0aWMvbWF4LWxlblxuICAgICAgICBjb25zdCBkaWFsb2dEYXRhOiBDb25maXJtRGlhbG9nRGF0YUludGVybmFsID0gbmV3IENvbmZpcm1EaWFsb2dEYXRhQnVpbGRlcih0aGlzLmdsb2JhbENvbmZpZywgdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmVkaXREYXRhLmNvbmZpcm1EZWxldGVEaWFsb2dEYXRhKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0ZXh0JywgdGhpcy5nbG9iYWxDb25maWcuY29uZmlybURlbGV0ZVRleHQpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ3R5cGUnLCAnZGVsZXRlJylcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgnY29uZmlybUJ1dHRvbkxhYmVsJywgdGhpcy5nbG9iYWxDb25maWcuZGVsZXRlTGFiZWwpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ3RpdGxlJywgdGhpcy5nbG9iYWxDb25maWcuZGVsZXRlTGFiZWwpXG4gICAgICAgICAgICAuZ2V0UmVzdWx0KCk7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIGJvb2xlYW4+ID0gdGhpcy5kaWFsb2cub3BlbihOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiBkaWFsb2dEYXRhLFxuICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlczogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpKTtcbiAgICAgICAgaWYgKHJlcyA9PSB0cnVlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpcm1EZWxldGVIYXNNYW55RW50aXR5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvbmZpcm1EZWxldGVIYXNNYW55RW50aXR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlLmRlbGV0ZSh0aGlzLmhhc01hbnlFbnRpdHlQcmlvckNoYW5nZXMpO1xuICAgICAgICB0aGlzLmVkaXRIYXNNYW55RGlhbG9nUmVmLmNsb3NlKDIpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIHRoZSBlZGl0aW5nIG9mIHRoZSBoYXMgbWFueSBlbnRpdHkgYW5kIGNsb3NlcyB0aGUgZGlhbG9nLlxuICAgICAqL1xuICAgIGRpYWxvZ0NhbmNlbEVkaXRIYXNNYW55KCk6IHZvaWQge1xuICAgICAgICBFbnRpdHlVdGlsaXRpZXMucmVzZXRDaGFuZ2VzT25FbnRpdHkodGhpcy5oYXNNYW55RW50aXR5LCB0aGlzLmhhc01hbnlFbnRpdHlQcmlvckNoYW5nZXMpO1xuICAgICAgICB0aGlzLmVkaXRIYXNNYW55RGlhbG9nUmVmLmNsb3NlKDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRW50aXR5LiBUaGlzIGVpdGhlciBjYWxscyB0aGUgY3JlYXRlLU1ldGhvZCBwcm92aWRlZCBieSB0aGUgdXNlciBvciB1c2VzIGEgZGVmYXVsdCBjcmVhdGUtZGlhbG9nLlxuICAgICAqIEB0aHJvd3MgV2hlbiBubyBFbnRpdHlDbGFzcyB3YXMgcHJvdmlkZWQsIGFzIGEgbmV3IGNhbGwgaXMgbmVlZGVkIHRvIGluaXRpYWxpemUgbWV0YWRhdGEuXG4gICAgICovXG4gICAgY3JlYXRlSGFzTWFueUVudGl0eSgpOiB2b2lkIHtcbiAgICAgICAgdm9pZCBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5hbGxvd0NyZWF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuRW50aXR5Q2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBcIkVudGl0eUNsYXNzXCIgc3BlY2lmaWVkIGZvciB0aGlzIHRhYmxlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuY3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5jcmVhdGUobmV3IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5FbnRpdHlDbGFzcygpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHk6IEVudGl0eVR5cGUgPSBuZXcgdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLkVudGl0eUNsYXNzKCk7XG4gICAgICAgICAgICAgICAgRW50aXR5VXRpbGl0aWVzLnNldERlZmF1bHRWYWx1ZXMoZW50aXR5KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmRlZmF1bHRDcmVhdGUgPT0gJ3BhZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlSGFzTWFueURlZmF1bHRQYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVIYXNNYW55RGVmYXVsdERpYWxvZyhlbnRpdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUhhc01hbnlEZWZhdWx0UGFnZSgpOiB2b2lkIHtcbiAgICAgICAgdm9pZCB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuaGFzTWFueUVudGl0eVNlcnZpY2UuY3JlYXRlQmFzZVJvdXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNyZWF0ZUhhc01hbnlEZWZhdWx0RGlhbG9nKGVudGl0eTogRW50aXR5VHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmhhc01hbnlFbnRpdHkgPSBlbnRpdHk7XG4gICAgICAgIHRoaXMuaGFzTWFueUNyZWF0ZUZvcm1Db250ZXh0ID0ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiB7XG4gICAgICAgICAgICAgICAgZW50aXR5OiB0aGlzLmhhc01hbnlFbnRpdHksXG4gICAgICAgICAgICAgICAgaGlkZU9taXRGb3JDcmVhdGU6IHRydWUsXG4gICAgICAgICAgICAgICAgaW5wdXRDaGFuZ2VFdmVudDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2b2lkIHRoaXMuY2hlY2tJc0hhc01hbnlFbnRpdHlWYWxpZCgnY3JlYXRlJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzTWFueUNyZWF0ZUZvcm1Db250ZXh0LiRpbXBsaWNpdC50YWJzID0gRW50aXR5VXRpbGl0aWVzLmdldEVudGl0eVRhYnModGhpcy5oYXNNYW55RW50aXR5LCB0aGlzLmluamVjdG9yLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRhYnM6IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlUYWJzKHRoaXMuaGFzTWFueUVudGl0eSwgdGhpcy5pbmplY3RvciwgdHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lzSGFzTWFueUVudGl0eVZhbGlkKCdjcmVhdGUnKTtcbiAgICAgICAgdGhpcy5jcmVhdGVIYXNNYW55RGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSGFzTWFueURpYWxvZyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtaW5XaWR0aDogJzYwJScsXG4gICAgICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgaGFzIG1hbnkgZW50aXR5IG92ZXIgdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBhc3luYyBkaWFsb2dDcmVhdGVIYXNNYW55KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNIYXNNYW55RW50aXR5VmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5jcmVhdGVEYXRhLmNyZWF0ZVJlcXVpcmVzQ29uZmlybURpYWxvZykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5kaWFsb2dDb25maXJtQ3JlYXRlSGFzTWFueSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN0eWxpc3RpYy9tYXgtbGVuXG4gICAgICAgIGNvbnN0IGRpYWxvZ0RhdGE6IENvbmZpcm1EaWFsb2dEYXRhSW50ZXJuYWwgPSBuZXcgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyKHRoaXMuZ2xvYmFsQ29uZmlnLCB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuY3JlYXRlRGF0YS5jb25maXJtQ3JlYXRlRGlhbG9nRGF0YSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGV4dCcsIHRoaXMuZ2xvYmFsQ29uZmlnLmNvbmZpcm1DcmVhdGVUZXh0KVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCdjb25maXJtQnV0dG9uTGFiZWwnLCB0aGlzLmdsb2JhbENvbmZpZy5jcmVhdGVMYWJlbClcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGl0bGUnLCB0aGlzLmdsb2JhbENvbmZpZy5jcmVhdGVMYWJlbClcbiAgICAgICAgICAgIC5nZXRSZXN1bHQoKTtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwgYm9vbGVhbj4gPSB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVzOiBib29sZWFuIHwgdW5kZWZpbmVkID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkpO1xuICAgICAgICBpZiAocmVzID09IHRydWUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGlhbG9nQ29uZmlybUNyZWF0ZUhhc01hbnkoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGRpYWxvZ0NvbmZpcm1DcmVhdGVIYXNNYW55KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlLmNyZWF0ZSh0aGlzLmhhc01hbnlFbnRpdHksIHRoaXMuaGFzTWFueUNyZWF0ZUJhc2VVcmwpO1xuICAgICAgICB0aGlzLmNyZWF0ZUhhc01hbnlEaWFsb2dSZWYuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VscyB0aGUgY3JlYXRpbmcgb2YgdGhlIGhhcyBtYW55IGVudGl0eSBhbmQgY2xvc2VzIHRoZSBkaWFsb2cuXG4gICAgICovXG4gICAgZGlhbG9nQ2FuY2VsQ3JlYXRlSGFzTWFueSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jcmVhdGVIYXNNYW55RGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyB0aGUgVGFibGVBY3Rpb24gZm9yIGFsbCBzZWxlY3RlZCBlbnRyaWVzLlxuICAgICAqIEFsc28gaGFuZGxlcyBjb25maXJtYXRpb24gd2l0aCBhbiBhZGRpdGlvbmFsIGRpYWwjb2cgaWYgY29uZmlndXJlZC5cbiAgICAgKiBAcGFyYW0gYWN0aW9uIC0gVGhlIFRhYmxlQWN0aW9uIHRvIHJ1bi5cbiAgICAgKi9cbiAgICBhc3luYyBydW5IYXNNYW55VGFibGVBY3Rpb24oYWN0aW9uOiBUYWJsZUFjdGlvbkludGVybmFsPEVudGl0eVR5cGU+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVDb25maXJtRGlhbG9nOiBib29sZWFuID0gcnVuSW5JbmplY3Rpb25Db250ZXh0KFxuICAgICAgICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgICAgICAgICgpID0+IGFjdGlvbi5yZXF1aXJlQ29uZmlybURpYWxvZyh0aGlzLmhhc01hbnlUYWJsZUNvbnRleHQuJGltcGxpY2l0LnNlbGVjdGlvbi5zZWxlY3RlZClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFyZXF1aXJlQ29uZmlybURpYWxvZykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25maXJtUnVuSGFzTWFueVRhYmxlQWN0aW9uKGFjdGlvbik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWZhdWx0VGV4dDogc3RyaW5nW10gPSBhY3Rpb24udHlwZSA9PT0gJ211bHRpLXNlbGVjdCdcbiAgICAgICAgICAgID8gdGhpcy5nbG9iYWxDb25maWcuY29uZmlybU11bHRpU2VsZWN0QWN0aW9uVGV4dCh0aGlzLmhhc01hbnlUYWJsZUNvbnRleHQuJGltcGxpY2l0LnNlbGVjdGlvbi5zZWxlY3RlZClcbiAgICAgICAgICAgIDogdGhpcy5nbG9iYWxDb25maWcuY29uZmlybUJhc2VBY3Rpb25UZXh0O1xuICAgICAgICBjb25zdCBkaWFsb2dEYXRhOiBDb25maXJtRGlhbG9nRGF0YUludGVybmFsID0gbmV3IENvbmZpcm1EaWFsb2dEYXRhQnVpbGRlcih0aGlzLmdsb2JhbENvbmZpZywgYWN0aW9uLmNvbmZpcm1EaWFsb2dEYXRhKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0ZXh0JywgZGVmYXVsdFRleHQpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ3RpdGxlJywgYWN0aW9uLmRpc3BsYXlOYW1lKVxuICAgICAgICAgICAgLmdldFJlc3VsdCgpO1xuICAgICAgICBjb25zdCBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCBib29sZWFuPiA9IHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgZGF0YTogZGlhbG9nRGF0YSxcbiAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXM6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKSk7XG4gICAgICAgIGlmIChyZXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25maXJtUnVuSGFzTWFueVRhYmxlQWN0aW9uKGFjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvbmZpcm1SdW5IYXNNYW55VGFibGVBY3Rpb24oYWN0aW9uOiBUYWJsZUFjdGlvbkludGVybmFsPEVudGl0eVR5cGU+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBhY3Rpb24uYWN0aW9uKHRoaXMuaGFzTWFueVRhYmxlQ29udGV4dC4kaW1wbGljaXQuc2VsZWN0aW9uLnNlbGVjdGVkKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYW4gVGFibGVBY3Rpb24gaXMgZGlzYWJsZWQgKGUuZy4gQmVjYXVzZSBubyBlbnRyaWVzIGhhdmUgYmVlbiBzZWxlY3RlZCkuXG4gICAgICogQHBhcmFtIGFjdGlvbiAtIFRoZSBUYWJsZUFjdGlvbiB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgQWN0aW9uIGNhbiBiZSB1c2VkLlxuICAgICAqL1xuICAgIGhhc01hbnlUYWJsZUFjdGlvbkRpc2FibGVkKGFjdGlvbjogVGFibGVBY3Rpb25JbnRlcm5hbDxFbnRpdHlUeXBlPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuaW5qZWN0b3IsICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhYWN0aW9uLmVuYWJsZWQodGhpcy5oYXNNYW55VGFibGVDb250ZXh0LiRpbXBsaWNpdC5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSBzZWFyY2ggaW5wdXQgdG8gZmlsdGVyIHRoZSB0YWJsZSBlbnRyaWVzLlxuICAgICAqIEBwYXJhbSBldmVudCAtIFRoZSBrZXl1cC1ldmVudCB3aGljaCBjb250YWlucyB0aGUgc2VhcmNoLXN0cmluZyBvZiB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBhcHBseUhhc01hbnlGaWx0ZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbHRlclZhbHVlOiBzdHJpbmcgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgICAgICB0aGlzLmhhc01hbnlUYWJsZUNvbnRleHQuJGltcGxpY2l0LmRhdGFTb3VyY2UuZmlsdGVyID0gZmlsdGVyVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbnRpdHkgaXMgdmFsaWQgZm9yIHVwZGF0aW5nIGFuZCBpZiBpdCBpcyBkaXJ0eS5cbiAgICAgKi9cbiAgICBhc3luYyBjaGVja0hhc01hbnlFbnRpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJc0hhc01hbnlFbnRpdHlWYWxpZCgndXBkYXRlJyk7XG4gICAgICAgIHRoaXMuaGFzTWFueUNoYW5nZXMgPSBhd2FpdCBFbnRpdHlVdGlsaXRpZXMuZ2V0RGlmZmVyZW5jZXNCZXR3ZWVuRW50aXRpZXMoXG4gICAgICAgICAgICB0aGlzLmhhc01hbnlFbnRpdHksXG4gICAgICAgICAgICB0aGlzLmhhc01hbnlFbnRpdHlQcmlvckNoYW5nZXMsXG4gICAgICAgICAgICB0aGlzLmh0dHAsXG4gICAgICAgICAgICB0aGlzLmluamVjdG9yXG4gICAgICAgICk7XG4gICAgICAgIGlmICghdGhpcy5oYXNNYW55VmFsaWRhdGlvbkVycm9ycy5sZW5ndGggJiYgdGhpcy5oYXNNYW55Q2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzTWFueVRvb2x0aXBDb250ZW50ID0gcnVuSW5JbmplY3Rpb25Db250ZXh0KFxuICAgICAgICAgICAgICAgIHRoaXMuaW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgKCkgPT4gZ2V0Q2hhbmdlc1Rvb2x0aXBDb250ZW50KHRoaXMuaGFzTWFueUNoYW5nZXMpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNIYXNNYW55RW50aXR5RGlydHkgPSAhIXRoaXMuaGFzTWFueUNoYW5nZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZW50aXR5IGlzIHZhbGlkLlxuICAgICAqIEBwYXJhbSBvbWl0IC0gV2hldGhlciB2YWx1ZXMgb21pdHRlZCBmb3IgY3JlYXRlIG9yIHVwZGF0ZSBzaG91bGQgYmUgbGVmdCBvdXQuXG4gICAgICovXG4gICAgYXN5bmMgY2hlY2tJc0hhc01hbnlFbnRpdHlWYWxpZChvbWl0OiAnY3JlYXRlJyB8ICd1cGRhdGUnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuaGFzTWFueVZhbGlkYXRpb25FcnJvcnMgPSBhd2FpdCBWYWxpZGF0aW9uVXRpbGl0aWVzLmdldEVudGl0eVZhbGlkYXRpb25FcnJvcnModGhpcy5oYXNNYW55RW50aXR5LCB0aGlzLmluamVjdG9yLCBvbWl0KTtcbiAgICAgICAgaWYgKHRoaXMuaGFzTWFueVZhbGlkYXRpb25FcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmhhc01hbnlUb29sdGlwQ29udGVudCA9IHJ1bkluSW5qZWN0aW9uQ29udGV4dChcbiAgICAgICAgICAgICAgICB0aGlzLmluamVjdG9yLFxuICAgICAgICAgICAgICAgICgpID0+IGdldFZhbGlkYXRpb25FcnJvcnNUb29sdGlwQ29udGVudCh0aGlzLmhhc01hbnlWYWxpZGF0aW9uRXJyb3JzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzSGFzTWFueUVudGl0eVZhbGlkID0gdGhpcy5oYXNNYW55VmFsaWRhdGlvbkVycm9ycy5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGFycmF5IGl0ZW0gaXMgdmFsaWQgYW5kIGlmIHRoZSBhcnJheSBpdGVtIGlzIGRpcnR5LlxuICAgICAqL1xuICAgIGFzeW5jIGNoZWNrQXJyYXlJdGVtKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSXNBcnJheUl0ZW1WYWxpZCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSXNBcnJheUl0ZW1EaXJ0eSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgYXJyYXkgaXRlbSBpcyBkaXJ0eS5cbiAgICAgKi9cbiAgICBhc3luYyBjaGVja0lzQXJyYXlJdGVtRGlydHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuYXJyYXlJdGVtQ2hhbmdlcyA9IGF3YWl0IEVudGl0eVV0aWxpdGllcy5nZXREaWZmZXJlbmNlc0JldHdlZW5FbnRpdGllcyhcbiAgICAgICAgICAgIHRoaXMuYXJyYXlJdGVtLFxuICAgICAgICAgICAgdGhpcy5hcnJheUl0ZW1QcmlvckNoYW5nZXMsXG4gICAgICAgICAgICB0aGlzLmh0dHAsXG4gICAgICAgICAgICB0aGlzLmluamVjdG9yXG4gICAgICAgICk7XG4gICAgICAgIGlmICghdGhpcy5hcnJheUl0ZW1WYWxpZGF0aW9uRXJyb3JzLmxlbmd0aCAmJiB0aGlzLmFycmF5SXRlbUNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFycmF5SXRlbVRvb2x0aXBDb250ZW50ID0gcnVuSW5JbmplY3Rpb25Db250ZXh0KFxuICAgICAgICAgICAgICAgIHRoaXMuaW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgKCkgPT4gZ2V0Q2hhbmdlc1Rvb2x0aXBDb250ZW50KHRoaXMuYXJyYXlJdGVtQ2hhbmdlcylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0FycmF5SXRlbURpcnR5ID0gISF0aGlzLmFycmF5SXRlbUNoYW5nZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgYXJyYXlJdGVtIGlzIHZhbGlkLlxuICAgICAqL1xuICAgIGFzeW5jIGNoZWNrSXNBcnJheUl0ZW1WYWxpZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5hcnJheUl0ZW1WYWxpZGF0aW9uRXJyb3JzID0gYXdhaXQgVmFsaWRhdGlvblV0aWxpdGllcy5nZXRFbnRpdHlWYWxpZGF0aW9uRXJyb3JzKHRoaXMuYXJyYXlJdGVtLCB0aGlzLmluamVjdG9yLCAnY3JlYXRlJyk7XG4gICAgICAgIGlmICh0aGlzLmFycmF5SXRlbVZhbGlkYXRpb25FcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFycmF5SXRlbVRvb2x0aXBDb250ZW50ID0gcnVuSW5JbmplY3Rpb25Db250ZXh0KFxuICAgICAgICAgICAgICAgIHRoaXMuaW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgKCkgPT4gZ2V0VmFsaWRhdGlvbkVycm9yc1Rvb2x0aXBDb250ZW50KHRoaXMuYXJyYXlJdGVtVmFsaWRhdGlvbkVycm9ycylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0FycmF5SXRlbVZhbGlkID0gdGhpcy5hcnJheUl0ZW1WYWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyB0aGF0IGEgdGhlIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQuXG4gICAgICovXG4gICAgZW1pdENoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dENoYW5nZUV2ZW50LmVtaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmllcyB0byBhZGQgYW4gaXRlbSB0byB0aGUgZW50aXR5IGFycmF5LlxuICAgICAqIERvZXMgdGhpcyBlaXRoZXIgaW5saW5lIGlmIHRoZSBcImNyZWF0ZUlubGluZVwiLW1ldGFkYXRhIGlzIHNldCB0byB0cnVlXG4gICAgICogb3IgaW4gYSBzZXBhcmF0ZSBkaWFsb2cgaWYgaXQgaXMgc2V0IHRvIGZhbHNlLlxuICAgICAqL1xuICAgIGFzeW5jIGFkZEVudGl0eSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lzQXJyYXlJdGVtVmFsaWQoKTtcbiAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlSW5saW5lKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEFycmF5SXRlbURpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRBcnJheUl0ZW1EaWFsb2csXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogJzYwJScsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LmFsbG93RHVwbGljYXRlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIHRoaXMuZW50aXR5QXJyYXlUYWJsZUNvbnRleHQuJGltcGxpY2l0LmRhdGFTb3VyY2UuZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChhd2FpdCBFbnRpdHlVdGlsaXRpZXMuaXNFcXVhbCh0aGlzLmFycmF5SXRlbSwgdiwgdGhpcy5tZXRhZGF0YSwgdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5Lml0ZW1UeXBlLCB0aGlzLmh0dHApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LmR1cGxpY2F0ZXNFcnJvckRpYWxvZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICh0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyBFbnRpdHlUeXBlW10pLnB1c2goTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLmFycmF5SXRlbSkpO1xuICAgICAgICB0aGlzLmVudGl0eUFycmF5VGFibGVDb250ZXh0LiRpbXBsaWNpdC5kYXRhU291cmNlLmRhdGEgPSAodGhpcy5lbnRpdHlbdGhpcy5wcm9wZXJ0eUtleV0gYXMgRW50aXR5VHlwZVtdKTtcbiAgICAgICAgRW50aXR5VXRpbGl0aWVzLnJlc2V0Q2hhbmdlc09uRW50aXR5KHRoaXMuYXJyYXlJdGVtLCB0aGlzLmFycmF5SXRlbVByaW9yQ2hhbmdlcyk7XG4gICAgICAgIEVudGl0eVV0aWxpdGllcy5zZXREZWZhdWx0VmFsdWVzKHRoaXMuYXJyYXlJdGVtKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lzQXJyYXlJdGVtVmFsaWQoKTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYXJyYXkgaXRlbSBkZWZpbmVkIGluIHRoZSBkaWFsb2cuXG4gICAgICovXG4gICAgYXN5bmMgYWRkQXJyYXlJdGVtKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNBcnJheUl0ZW1WYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgICh0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyBFbnRpdHlUeXBlW10pLnB1c2goTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLmFycmF5SXRlbSkpO1xuICAgICAgICB0aGlzLmVudGl0eUFycmF5VGFibGVDb250ZXh0LiRpbXBsaWNpdC5kYXRhU291cmNlLmRhdGEgPSAodGhpcy5lbnRpdHlbdGhpcy5wcm9wZXJ0eUtleV0gYXMgRW50aXR5VHlwZVtdKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmNsb3NlQWRkQXJyYXlJdGVtRGlhbG9nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VscyBhZGRpbmcgdGhlIGFycmF5IGl0ZW0gZGVmaW5lZCBpbiB0aGUgZGlhbG9nLlxuICAgICAqL1xuICAgIGFzeW5jIGNsb3NlQWRkQXJyYXlJdGVtRGlhbG9nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmFkZEFycmF5SXRlbURpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgICBFbnRpdHlVdGlsaXRpZXMucmVzZXRDaGFuZ2VzT25FbnRpdHkodGhpcy5hcnJheUl0ZW0sIHRoaXMuYXJyYXlJdGVtUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lzQXJyYXlJdGVtVmFsaWQoKTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRWRpdHMgYW4gZW50aXR5IGFycmF5IGl0ZW0uXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdGhhdCBoYXMgYmVlbiBjbGlja2VkLlxuICAgICAqIEBwYXJhbSBkQ29sIC0gVGhlIGRpc3BsYXkgY29sdW1uIHRoYXQgd2FzIGNsaWNrZWQgb24uXG4gICAgICovXG4gICAgYXN5bmMgZWRpdEFycmF5SXRlbShlbnRpdHk6IEVudGl0eVR5cGUsIGRDb2w6IERpc3BsYXlDb2x1bW48RW50aXR5VHlwZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGRDb2wuZGlzYWJsZUNsaWNrID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRleE9mRWRpdGVkQXJyYXlJdGVtID0gdGhpcy5lbnRpdHlBcnJheVRhYmxlQ29udGV4dC4kaW1wbGljaXQuZGF0YVNvdXJjZS5kYXRhLmluZGV4T2YoZW50aXR5KTtcbiAgICAgICAgdGhpcy5hcnJheUl0ZW0gPSBuZXcgdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LkVudGl0eUNsYXNzKGVudGl0eSk7XG4gICAgICAgIHRoaXMuYXJyYXlJdGVtUHJpb3JDaGFuZ2VzID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLmFycmF5SXRlbSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FycmF5SXRlbSgpO1xuXG4gICAgICAgIHRoaXMuZWRpdEFycmF5SXRlbURpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oXG4gICAgICAgICAgICB0aGlzLmVkaXRBcnJheUl0ZW1EaWFsb2csXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWluV2lkdGg6ICc2MCUnLFxuICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIGNoYW5nZXMgb24gdGhlIGFycmF5IGl0ZW0gaW4gdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBzYXZlQXJyYXlJdGVtKCk6IHZvaWQge1xuICAgICAgICAodGhpcy5lbnRpdHlbdGhpcy5wcm9wZXJ0eUtleV0gYXMgRW50aXR5VHlwZVtdKVt0aGlzLmluZGV4T2ZFZGl0ZWRBcnJheUl0ZW1dID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLmFycmF5SXRlbSk7XG4gICAgICAgIHRoaXMuZW50aXR5QXJyYXlUYWJsZUNvbnRleHQuJGltcGxpY2l0LmRhdGFTb3VyY2UuZGF0YSA9ICh0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyBFbnRpdHlUeXBlW10pO1xuXG4gICAgICAgIHZvaWQgdGhpcy5jbG9zZUVkaXRBcnJheUl0ZW1EaWFsb2coKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGVkaXQgYXJyYXkgaXRlbSBkaWFsb2cgYW5kIHJlc2V0cyBjaGFuZ2VzLlxuICAgICAqL1xuICAgIGFzeW5jIGNsb3NlRWRpdEFycmF5SXRlbURpYWxvZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lZGl0QXJyYXlJdGVtRGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuYXJyYXlJdGVtID0gbmV3IHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5FbnRpdHlDbGFzcygpO1xuICAgICAgICB0aGlzLmFycmF5SXRlbVByaW9yQ2hhbmdlcyA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodGhpcy5hcnJheUl0ZW0pO1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXJyYXlJdGVtKCk7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHNlbGVjdGVkIGVudHJpZXMgZnJvbSB0aGUgZW50aXR5IGFycmF5LlxuICAgICAqL1xuICAgIHJlbW92ZUZyb21FbnRpdHlBcnJheSgpOiB2b2lkIHtcbiAgICAgICAgU2VsZWN0aW9uVXRpbGl0aWVzLnJlbW92ZShcbiAgICAgICAgICAgIHRoaXMuZW50aXR5QXJyYXlUYWJsZUNvbnRleHQuJGltcGxpY2l0LnNlbGVjdGlvbixcbiAgICAgICAgICAgIHRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldIGFzIEVudGl0eVR5cGVbXSxcbiAgICAgICAgICAgIHRoaXMuZW50aXR5QXJyYXlUYWJsZUNvbnRleHQuJGltcGxpY2l0LmRhdGFTb3VyY2VcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxufSIsIjwhLS0gZXNsaW50LWRpc2FibGUgYW5ndWxhci9uby1jYWxsLWV4cHJlc3Npb24gLS0+XG4gXG5AaWYoIShoaWRlT21pdEZvckNyZWF0ZSAmJiBtZXRhZGF0YS5vbWl0Rm9yQ3JlYXRlKSAmJiAhKGhpZGVPbWl0Rm9yRWRpdCAmJiBtZXRhZGF0YS5vbWl0Rm9yVXBkYXRlKSkge1xuICAgIEBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLVN0cmluZ3MtLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLlNUUklORykge1xuICAgICAgICAgICAgPHN0cmluZy1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvc3RyaW5nLWlucHV0PlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5TVFJJTkdfVEVYVEJPWCkge1xuICAgICAgICAgICAgPHN0cmluZy10ZXh0Ym94LWlucHV0XG4gICAgICAgICAgICAgICAgW2VudGl0eV09XCJlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtrZXldPVwicHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9zdHJpbmctdGV4dGJveC1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuU1RSSU5HX0FVVE9DT01QTEVURSkge1xuICAgICAgICAgICAgPHN0cmluZy1hdXRvY29tcGxldGUtaW5wdXRcbiAgICAgICAgICAgICAgICBbZW50aXR5XT1cImVudGl0eVwiXG4gICAgICAgICAgICAgICAgW2tleV09XCJwcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3N0cmluZy1hdXRvY29tcGxldGUtaW5wdXQ+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLlNUUklOR19EUk9QRE9XTikge1xuICAgICAgICAgICAgPHN0cmluZy1kcm9wZG93bi1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvc3RyaW5nLWRyb3Bkb3duLWlucHV0PlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5TVFJJTkdfUEFTU1dPUkQpIHtcbiAgICAgICAgICAgIDxzdHJpbmctcGFzc3dvcmQtaW5wdXRcbiAgICAgICAgICAgICAgICBbZW50aXR5XT1cImVudGl0eVwiXG4gICAgICAgICAgICAgICAgW2tleV09XCJwcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3N0cmluZy1wYXNzd29yZC1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tQm9vbGVhbnMtLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuQk9PTEVBTl9DSEVDS0JPWCkge1xuICAgICAgICAgICAgPGJvb2xlYW4tY2hlY2tib3gtaW5wdXRcbiAgICAgICAgICAgICAgICBbZW50aXR5XT1cImVudGl0eVwiXG4gICAgICAgICAgICAgICAgW2tleV09XCJwcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Jvb2xlYW4tY2hlY2tib3gtaW5wdXQ+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLkJPT0xFQU5fVE9HR0xFKSB7XG4gICAgICAgICAgICA8Ym9vbGVhbi10b2dnbGUtaW5wdXRcbiAgICAgICAgICAgICAgICBbZW50aXR5XT1cImVudGl0eVwiXG4gICAgICAgICAgICAgICAgW2tleV09XCJwcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Jvb2xlYW4tdG9nZ2xlLWlucHV0PlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5CT09MRUFOX0RST1BET1dOKSB7XG4gICAgICAgICAgICA8Ym9vbGVhbi1kcm9wZG93bi1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvYm9vbGVhbi1kcm9wZG93bi1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLU51bWJlcnMtLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuTlVNQkVSKSB7XG4gICAgICAgICAgICA8bnVtYmVyLWlucHV0XG4gICAgICAgICAgICAgICAgW2VudGl0eV09XCJlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtrZXldPVwicHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9udW1iZXItaW5wdXQ+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLk5VTUJFUl9EUk9QRE9XTikge1xuICAgICAgICAgICAgPG51bWJlci1kcm9wZG93bi1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbnVtYmVyLWRyb3Bkb3duLWlucHV0PlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5OVU1CRVJfU0xJREVSKSB7XG4gICAgICAgICAgICA8bnVtYmVyLXNsaWRlci1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbnVtYmVyLXNsaWRlci1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS1BcnJheS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURSkge1xuICAgICAgICAgICAgPGFycmF5LWRhdGUtaW5wdXRcbiAgICAgICAgICAgICAgICBbZW50aXR5XT1cImVudGl0eVwiXG4gICAgICAgICAgICAgICAgW2tleV09XCJwcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2FycmF5LWRhdGUtaW5wdXQ+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLkFSUkFZX0RBVEVfVElNRSkge1xuICAgICAgICAgICAgPGFycmF5LWRhdGUtdGltZS1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvYXJyYXktZGF0ZS10aW1lLWlucHV0PlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5BUlJBWV9EQVRFX1JBTkdFKSB7XG4gICAgICAgICAgICA8YXJyYXktZGF0ZS1yYW5nZS1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvYXJyYXktZGF0ZS1yYW5nZS1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuQVJSQVlfU1RSSU5HX0NISVBTKSB7XG4gICAgICAgICAgICA8YXJyYXktc3RyaW5nLWNoaXBzLWlucHV0XG4gICAgICAgICAgICAgICAgW2VudGl0eV09XCJlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtrZXldPVwicHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9hcnJheS1zdHJpbmctY2hpcHMtaW5wdXQ+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLkFSUkFZX1NUUklOR19BVVRPQ09NUExFVEVfQ0hJUFMpIHtcbiAgICAgICAgICAgIDxhcnJheS1zdHJpbmctYXV0b2NvbXBsZXRlLWNoaXBzXG4gICAgICAgICAgICAgICAgW2VudGl0eV09XCJlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtrZXldPVwicHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9hcnJheS1zdHJpbmctYXV0b2NvbXBsZXRlLWNoaXBzPlxuICAgICAgICB9XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLURhdGVzLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5EQVRFKSB7XG4gICAgICAgICAgICA8ZGF0ZS1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGF0ZS1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuREFURV9SQU5HRSkge1xuICAgICAgICAgICAgPGRhdGUtcmFuZ2UtaW5wdXRcbiAgICAgICAgICAgICAgICBbZW50aXR5XT1cImVudGl0eVwiXG4gICAgICAgICAgICAgICAgW2tleV09XCJwcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2RhdGUtcmFuZ2UtaW5wdXQ+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLkRBVEVfVElNRSkge1xuICAgICAgICAgICAgPGRhdGUtdGltZS1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGF0ZS10aW1lLWlucHV0PlxuICAgICAgICB9XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLUZpbGVzLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5GSUxFX0RFRkFVTFQpIHtcbiAgICAgICAgICAgIDxmaWxlLWRlZmF1bHQtaW5wdXRcbiAgICAgICAgICAgICAgICBbZW50aXR5XT1cImVudGl0eVwiXG4gICAgICAgICAgICAgICAgW2tleV09XCJwcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2ZpbGUtZGVmYXVsdC1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuRklMRV9JTUFHRSkge1xuICAgICAgICAgICAgPGZpbGUtaW1hZ2UtaW5wdXRcbiAgICAgICAgICAgICAgICBbZW50aXR5XT1cImVudGl0eVwiXG4gICAgICAgICAgICAgICAgW2tleV09XCJwcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2ZpbGUtaW1hZ2UtaW5wdXQ+XG4gICAgICAgIH1cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLSByZWZlcmVuY2VzIG1hbnkgLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgQGNhc2UgKERlY29yYXRvclR5cGVzLlJFRkVSRU5DRVNfTUFOWSkge1xuICAgICAgICAgICAgPHJlZmVyZW5jZXMtbWFueS1pbnB1dFxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICBba2V5XT1cInByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvcmVmZXJlbmNlcy1tYW55LWlucHV0PlxuICAgICAgICB9XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLUN1c3RvbS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5DVVNUT00pIHtcbiAgICAgICAgICAgIDxjdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICBbZW50aXR5XT1cImVudGl0eVwiXG4gICAgICAgICAgICAgICAgW2tleV09XCJwcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2N1c3RvbS1pbnB1dD5cbiAgICAgICAgfVxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS1PYmplY3QtLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuT0JKRUNUKSB7XG4gICAgICAgICAgICA8Yj57e21ldGFkYXRhRGVmYXVsdE9iamVjdC5kaXNwbGF5TmFtZX19PC9iPlxuICAgICAgICAgICAgPCEtLSBpdGVyYXRlcyBvdmVyIHRoZSBvYmplY3QgcHJvcGVydGllcyAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb3JtOyBjb250ZXh0OiBvYmplY3RGb3JtQ29udGV4dFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tT2JqZWN0IERyb3Bkb3duLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5PQkpFQ1RfRFJPUERPV04pIHtcbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm9iamVjdC1kcm9wZG93blwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgI21vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIm9iamVjdERyb3Bkb3duTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJtZXRhZGF0YS5yZXF1aXJlZChlbnRpdHkpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb21wYXJlV2l0aF09XCJjb21wYXJlT2JqZWN0c0JvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJlbnRpdHlbcHJvcGVydHlLZXldXCJcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAob3BlbmVkKT1cInNlbGVjdFNlYXJjaElucHV0LmZvY3VzKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwic2VsZWN0LXNlYXJjaC1pbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYW5ndWxhci9uby1hbnkgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgI3NlbGVjdFNlYXJjaElucHV0IG1hdElucHV0IChrZXl1cCk9XCJmaWx0ZXJPYmplY3REcm9wZG93blZhbHVlcygkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gbWF0U3VmZml4IFtpY29uXT1cImZhU2VhcmNoXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKCFtZXRhZGF0YS5yZXF1aXJlZChlbnRpdHkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbj4tPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvdWxkRGlzcGxheUN1cnJlbnRPYmplY3REcm9wZG93blZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiY3VycmVudE9iamVjdERyb3Bkb3duVmFsdWU/LnZhbHVlXCI+e3tjdXJyZW50T2JqZWN0RHJvcGRvd25WYWx1ZT8uZGlzcGxheU5hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAZm9yICh2YWx1ZSBvZiBmaWx0ZXJlZE9iamVjdERyb3Bkb3duVmFsdWVzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJ2YWx1ZS52YWx1ZVwiPnt7dmFsdWUuZGlzcGxheU5hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yPnt7aW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICB9XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0gcmVmZXJlbmNlcyBvbmUgLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5SRUZFUkVOQ0VTX09ORSkge1xuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgI2lucHV0TW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwicmVmZXJlbmNlc09uZU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkKGVudGl0eSlcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIlxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cInNldFJlZmVyZW5jZXNPbmVPYmplY3QoKVwiXG4gICAgICAgICAgICAgICAgICAgIChvcGVuZWQpPVwic2VsZWN0U2VhcmNoSW5wdXQuZm9jdXMoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJzZWxlY3Qtc2VhcmNoLWlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBhbmd1bGFyL25vLWFueSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjc2VsZWN0U2VhcmNoSW5wdXQgbWF0SW5wdXQgKGtleXVwKT1cImZpbHRlclJlZmVyZW5jZXNPbmVWYWx1ZXMoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIG1hdFN1ZmZpeCBbaWNvbl09XCJmYVNlYXJjaFwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgQGlmICghbWV0YWRhdGEucmVxdWlyZWQoZW50aXR5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24+LTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKHNob3VsZERpc3BsYXlDdXJyZW50UmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJjdXJyZW50UmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWU/LnZhbHVlXCI+e3tjdXJyZW50UmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWU/LmRpc3BsYXlOYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGZvciAodmFsdWUgb2YgZmlsdGVyZWRSZWZlcmVuY2VzT25lRHJvcGRvd25WYWx1ZXM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInZhbHVlLnZhbHVlXCI+e3t2YWx1ZS5kaXNwbGF5TmFtZX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxtYXQtZXJyb3I+e3tpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UoaW5wdXRNb2RlbCl9fTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwhLS0gaXRlcmF0ZXMgb3ZlciB0aGUgcmVmZXJlbmNlcyBvbmUgcHJvcGVydGllcyAtLT5cbiAgICAgICAgICAgIEBpZiAocmVmZXJlbmNlc09uZUZvcm1Db250ZXh0KSB7XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvcm07IGNvbnRleHQ6IHJlZmVyZW5jZXNPbmVGb3JtQ29udGV4dFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLUFycmF5LS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICAgIEBjYXNlIChEZWNvcmF0b3JUeXBlcy5BUlJBWSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVudGl0eUFycmF5XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejggZWxldmF0aW9uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyYXktaGVhZGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxiPnt7bWV0YWRhdGFFbnRpdHlBcnJheS5kaXNwbGF5TmFtZX19PC9iPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtZXRhZGF0YUVudGl0eUFycmF5LmNyZWF0ZUlubGluZSAmJiAhaW50ZXJuYWxJc1JlYWRPbmx5ICYmIGFkZEFycmF5SXRlbUZvcm1Db250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9ybTsgY29udGV4dDogYWRkQXJyYXlJdGVtRm9ybUNvbnRleHRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKCFpbnRlcm5hbElzUmVhZE9ubHkgJiYgZW50aXR5QXJyYXlUYWJsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlSW5saW5lICYmICFpc0FycmF5SXRlbVZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEVudGl0eSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bWV0YWRhdGFFbnRpdHlBcnJheS5hZGRCdXR0b25MYWJlbH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFlbnRpdHlBcnJheVRhYmxlQ29udGV4dC4kaW1wbGljaXQuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVGcm9tRW50aXR5QXJyYXkoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e21ldGFkYXRhRW50aXR5QXJyYXkucmVtb3ZlQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChlbnRpdHlBcnJheVRhYmxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlOyBjb250ZXh0OiBlbnRpdHlBcnJheVRhYmxlQ29udGV4dFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLSBoYXMgbWFueSAtLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICBAY2FzZSAoRGVjb3JhdG9yVHlwZXMuSEFTX01BTlkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoYXNNYW55XCI+XG4gICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwidGl0bGVcIj57e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGl0bGV9fTwvaDI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTEyXCIgc3R5bGU9XCJjb2x1bW4tZ2FwOiAyNHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJsZzpjb2wtc3Bhbi04IG1kOmNvbC1zcGFuLTYgY29sLXNwYW4tMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLnNlYXJjaExhYmVsfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCAoa2V5dXApPVwiYXBwbHlIYXNNYW55RmlsdGVyKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubGc6Y29sLXNwYW4tMl09XCJoYXNNYW55QWxsb3dDcmVhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5sZzpjb2wtc3Bhbi00XT1cIiFoYXNNYW55QWxsb3dDcmVhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5tZDpjb2wtc3Bhbi0zXT1cImhhc01hbnlBbGxvd0NyZWF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1kOmNvbC1zcGFuLTZdPVwiIWhhc01hbnlBbGxvd0NyZWF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmNvbC1zcGFuLTZdPVwiaGFzTWFueUFsbG93Q3JlYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY29sLXNwYW4tMTJdPVwiIWhhc01hbnlBbGxvd0NyZWF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhY3Rpb25zLWJ1dHRvblwiIG1hdC1yYWlzZWQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnNMYWJlbH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuYWxsb3dKc29uSW1wb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwiaGFzTWFueVRhYmxlQWN0aW9uRGlzYWJsZWQoaGFzTWFueUltcG9ydEFjdGlvbilcIiAoY2xpY2spPVwicnVuSGFzTWFueVRhYmxlQWN0aW9uKGhhc01hbnlJbXBvcnRBY3Rpb24pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aGFzTWFueUltcG9ydEFjdGlvbi5kaXNwbGF5TmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChhY3Rpb24gb2YgbWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cImhhc01hbnlUYWJsZUFjdGlvbkRpc2FibGVkKGFjdGlvbilcIiAoY2xpY2spPVwicnVuSGFzTWFueVRhYmxlQWN0aW9uKGFjdGlvbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3thY3Rpb24uZGlzcGxheU5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGhhc01hbnlBbGxvd0NyZWF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5sZzpjb2wtc3Bhbi0yXT1cIm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGFibGVBY3Rpb25zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmxnOmNvbC1zcGFuLTRdPVwiIW1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGFibGVBY3Rpb25zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1kOmNvbC1zcGFuLTNdPVwibWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWQ6Y29sLXNwYW4tNl09XCIhbWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY29sLXNwYW4tNl09XCJtZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jb2wtc3Bhbi0xMl09XCIhbWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNyZWF0ZS1idXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiY3JlYXRlSGFzTWFueUVudGl0eSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5jcmVhdGVCdXR0b25MYWJlbH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LWVsZXZhdGlvbi16OCBlbGV2YXRpb24tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoaGFzTWFueVRhYmxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlOyBjb250ZXh0OiBoYXNNYW55VGFibGVDb250ZXh0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICA8ZGl2PkVSUk9SOiBUaGUgdHlwZSB7e3R5cGV9fSBpcyBub3Qga25vd24uPC9kaXY+XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuPG5nLXRlbXBsYXRlICN0YWJsZSBsZXQtY29udGV4dD5cbiAgICA8bWF0LXRhYmxlIG1hdFNvcnQgW2RhdGFTb3VyY2VdPVwiY29udGV4dC5kYXRhU291cmNlXCIgW2NsYXNzLnRhYmxlLXdpdGgtZXJyb3Itc2xvdF09XCJjb250ZXh0LnNob3VsZFNob3dNaXNzaW5nRXJyb3JcIj5cbiAgICAgICAgPCEtLSBzZWxlY3QgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxuICAgICAgICAgICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFtjaGVja2VkXT1cImNvbnRleHQuc2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgU2VsZWN0aW9uVXRpbGl0aWVzLmlzQWxsU2VsZWN0ZWQoY29udGV4dC5zZWxlY3Rpb24sIGNvbnRleHQuZGF0YVNvdXJjZSlcIlxuICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJjb250ZXh0LnNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFTZWxlY3Rpb25VdGlsaXRpZXMuaXNBbGxTZWxlY3RlZChjb250ZXh0LnNlbGVjdGlvbiwgY29udGV4dC5kYXRhU291cmNlKVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gU2VsZWN0aW9uVXRpbGl0aWVzLm1hc3RlclRvZ2dsZShjb250ZXh0LnNlbGVjdGlvbiwgY29udGV4dC5kYXRhU291cmNlKSA6IG51bGxcIj5cbiAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHZhbHVlXCIgW2R5bmFtaWNTdHlsZUNsYXNzZXNdPVwiY29udGV4dC5keW5hbWljUm93U3R5bGVDbGFzc2VzXCIgW3ZhbHVlXT1cInZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBbY2hlY2tlZF09XCJjb250ZXh0LnNlbGVjdGlvbi5pc1NlbGVjdGVkKHZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IGNvbnRleHQuc2VsZWN0aW9uLnRvZ2dsZSh2YWx1ZSkgOiBudWxsXCI+XG4gICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICA8L21hdC1jZWxsPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICBAZm9yIChkQ29sIG9mIGNvbnRleHQuZGlzcGxheUNvbHVtbnM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cImRDb2wuZGlzcGxheU5hbWVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAge3tkQ29sLmRpc3BsYXlOYW1lfX1cbiAgICAgICAgICAgICAgICA8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgdmFsdWVcIiBbY2xhc3MuZW5hYmxlZF09XCIhZENvbC5kaXNhYmxlQ2xpY2sgJiYgY29udGV4dC5hbGxvd0NsaWNrKHZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkeW5hbWljU3R5bGVDbGFzc2VzXT1cImNvbnRleHQuZHluYW1pY1Jvd1N0eWxlQ2xhc3Nlc1wiIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0NlbGwodmFsdWUsIGRDb2wsIGNvbnRleHQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoZENvbC5Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5LWNvbHVtbi12YWx1ZSBbZW50aXR5XT1cInZhbHVlXCIgW0NvbXBvbmVudENsYXNzXT1cImRDb2wuQ29tcG9uZW50XCI+PC9kaXNwbGF5LWNvbHVtbi12YWx1ZT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2dldERpc3BsYXlDb2x1bW5WYWx1ZSh2YWx1ZSwgZENvbCl9fVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9tYXQtY2VsbD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICB9XG5cbiAgICAgICAgPG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJjb250ZXh0LmRpc3BsYXllZENvbHVtbnNcIj48L21hdC1oZWFkZXItcm93PlxuICAgICAgICA8bWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29udGV4dC5kaXNwbGF5ZWRDb2x1bW5zXCI+PC9tYXQtcm93PlxuICAgIDwvbWF0LXRhYmxlPlxuXG4gICAgQGlmIChjb250ZXh0LmRpc3BsYXlMb2FkaW5nU3Bpbm5lciAmJiBjb250ZXh0LmlzTG9hZGluZykge1xuICAgICAgICA8bWF0LXNwaW5uZXI+XG4gICAgICAgIDwvbWF0LXNwaW5uZXI+XG4gICAgfVxuICAgIEBlbHNlIGlmIChjb250ZXh0LnNob3VsZFNob3dNaXNzaW5nRXJyb3IgJiYgIWNvbnRleHQuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtZXJyb3JcIj57e2NvbnRleHQuZW1wdHlFcnJvck1lc3NhZ2V9fTwvZGl2PlxuICAgIH1cblxuICAgIDxtYXQtcGFnaW5hdG9yIFtsZW5ndGhdPVwiY29udGV4dC5kYXRhU291cmNlLmZpbHRlcmVkRGF0YS5sZW5ndGhcIiBbcGFnZUluZGV4XT1cIjBcIiBbcGFnZVNpemVdPVwiMTBcIiBbcGFnZVNpemVPcHRpb25zXT1cIls1LCAxMCwgMjUsIDUwXVwiPjwvbWF0LXBhZ2luYXRvcj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Gb3JtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjxuZy10ZW1wbGF0ZSAjZm9ybSBsZXQtY29udGV4dD5cbiAgICAgPCEtLSBlc2xpbnQtZGlzYWJsZSBhbmd1bGFyL25vLWNhbGwtZXhwcmVzc2lvbiAtLT5cbiAgICBAaWYgKGNvbnRleHQudGFicy5sZW5ndGggPiAxKSB7XG4gICAgICAgIDxtYXQtdGFiLWdyb3VwIHByZXNlcnZlQ29udGVudD5cbiAgICAgICAgICAgIEBmb3IgKHRhYiBvZiBjb250ZXh0LnRhYnM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxtYXQtdGFiIFtsYWJlbF09XCJ0YWIudGFiTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChyb3cgb2YgdGFiLnJvd3M7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTEyXCIgc3R5bGU9XCJjb2x1bW4tZ2FwOiAyNHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGtleSBvZiByb3cua2V5czsgdHJhY2sga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtbWF0LWVudGl0eS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VudGl0eV09XCJjb250ZXh0LmVudGl0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydHlLZXldPVwia2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRFbXB0eV09XCJjb250ZXh0LnZhbGlkRW1wdHk/LigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImNvbnRleHQuaXNSZWFkT25seT8uKGNvbnRleHQuZW50aXR5LCBrZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGhDbGFzc2VzKGNvbnRleHQuZW50aXR5LCBrZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckVkaXRdPVwiY29udGV4dC5oaWRlT21pdEZvckVkaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yQ3JlYXRlXT1cImNvbnRleHQuaGlkZU9taXRGb3JDcmVhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY29udGV4dC5pbnB1dENoYW5nZUV2ZW50KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICB9XG4gICAgQGVsc2Uge1xuICAgICAgICBAaWYgKCFjb250ZXh0LnRhYnMubGVuZ3RoKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vLWVudGl0eS10YWJzXCI+XG4gICAgICAgICAgICAgICAgRVJST1I6IE5vIElucHV0cy4gRGlkIHlvdSBjb3JyZWN0bHkgYXNzaWduIGFsbCB2YWx1ZXMgaW4gdGhlIG1vZGVsIGNvbnN0cnVjdG9yP1xuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICB9XG4gICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBjb250ZXh0LnRhYnNbMF0ucm93czsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTEyXCIgc3R5bGU9XCJjb2x1bW4tZ2FwOiAyNHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChrZXkgb2Ygcm93LmtleXM7IHRyYWNrIGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1tYXQtZW50aXR5LWlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VudGl0eV09XCJjb250ZXh0LmVudGl0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRFbXB0eV09XCJjb250ZXh0LnZhbGlkRW1wdHk/LigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJjb250ZXh0LmlzUmVhZE9ubHk/Lihjb250ZXh0LmVudGl0eSwga2V5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIkVudGl0eVV0aWxpdGllcy5nZXRXaWR0aENsYXNzZXMoY29udGV4dC5lbnRpdHksIGtleSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckVkaXRdPVwiY29udGV4dC5oaWRlT21pdEZvckVkaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckNyZWF0ZV09XCJjb250ZXh0LmhpZGVPbWl0Rm9yQ3JlYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJjb250ZXh0LmlucHV0Q2hhbmdlRXZlbnQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25neC1tYXQtZW50aXR5LWlucHV0PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG48L25nLXRlbXBsYXRlPlxuXG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS1BZGQgQXJyYXkgSXRlbSBEaWFsb2ctLS0tLS0tLS0tLS0tLS0tPlxuPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG48bmctdGVtcGxhdGUgI2FkZEFycmF5SXRlbURpYWxvZz5cbiAgICA8ZGl2IGNsYXNzPVwibWF0LWRpYWxvZy10aXRsZVwiPlxuICAgICAgICA8ZGl2Pnt7YWRkQXJyYXlJdGVtRGlhbG9nRGF0YS50aXRsZX19PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8Zm9ybSAobmdTdWJtaXQpPVwiYWRkQXJyYXlJdGVtKClcIj5cbiAgICAgICAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICAgICAgICAgIEBpZiAoYWRkQXJyYXlJdGVtRm9ybUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9ybTsgY29udGV4dDogYWRkQXJyYXlJdGVtRm9ybUNvbnRleHRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgXG4gICAgICAgIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWJ1dHRvbi13aXRoLWluZm8taWNvblwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIG1hdC1yYWlzZWQtYnV0dG9uIG1hdEJhZGdlQ29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0FycmF5SXRlbVZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdEJhZGdlXT1cImFycmF5SXRlbVZhbGlkYXRpb25FcnJvcnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdEJhZGdlSGlkZGVuXT1cIiFhcnJheUl0ZW1WYWxpZGF0aW9uRXJyb3JzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7e2FkZEFycmF5SXRlbURpYWxvZ0RhdGEuY3JlYXRlQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIEBpZiAoYXJyYXlJdGVtVmFsaWRhdGlvbkVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgPG5neC1tYXQtZW50aXR5LXRvb2x0aXAgW3Rvb2x0aXBDb250ZW50XT1cImFycmF5SXRlbVRvb2x0aXBDb250ZW50XCI+PC9uZ3gtbWF0LWVudGl0eS10b29sdGlwPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LXJhaXNlZC1idXR0b24gY2xhc3M9XCJjYW5jZWwtYnV0dG9uXCIgKGNsaWNrKT1cImNsb3NlQWRkQXJyYXlJdGVtRGlhbG9nKClcIj5cbiAgICAgICAgICAgICAgICB7e2FkZEFycmF5SXRlbURpYWxvZ0RhdGEuY2FuY2VsQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvZm9ybT5cblxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tRWRpdCBBcnJheSBJdGVtIERpYWxvZy0tLS0tLS0tLS0tLS0tLS0+XG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjxuZy10ZW1wbGF0ZSAjZWRpdEFycmF5SXRlbURpYWxvZz5cbiAgICA8ZGl2IGNsYXNzPVwibWF0LWRpYWxvZy10aXRsZVwiPlxuICAgICAgICA8ZGl2Pnt7ZWRpdEFycmF5SXRlbURpYWxvZ0RhdGEudGl0bGUoYXJyYXlJdGVtUHJpb3JDaGFuZ2VzKX19PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgXG4gICAgPGZvcm0gKG5nU3VibWl0KT1cInNhdmVBcnJheUl0ZW0oKVwiPlxuICAgICAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICAgICAgQGlmIChlZGl0QXJyYXlJdGVtRm9ybUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9ybTsgY29udGV4dDogZWRpdEFycmF5SXRlbUZvcm1Db250ZXh0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICBcbiAgICAgICAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctYnV0dG9uLXdpdGgtaW5mby1pY29uXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgbWF0LXJhaXNlZC1idXR0b24gbWF0QmFkZ2VDb2xvcj1cIndhcm5cIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmFkZ2UtY2hhbmdlc109XCIhYXJyYXlJdGVtVmFsaWRhdGlvbkVycm9ycy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaW50ZXJuYWxJc1JlYWRPbmx5IHx8ICFpc0FycmF5SXRlbVZhbGlkIHx8ICFpc0FycmF5SXRlbURpcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgW21hdEJhZGdlXT1cImFycmF5SXRlbVZhbGlkYXRpb25FcnJvcnMubGVuZ3RoID4gMCA/IGFycmF5SXRlbVZhbGlkYXRpb25FcnJvcnMubGVuZ3RoIDogYXJyYXlJdGVtQ2hhbmdlcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwiIWFycmF5SXRlbVZhbGlkYXRpb25FcnJvcnMubGVuZ3RoICYmICFhcnJheUl0ZW1DaGFuZ2VzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7e2VkaXRBcnJheUl0ZW1EaWFsb2dEYXRhLmNvbmZpcm1CdXR0b25MYWJlbH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgQGlmIChhcnJheUl0ZW1WYWxpZGF0aW9uRXJyb3JzLmxlbmd0aCB8fCBhcnJheUl0ZW1DaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktdG9vbHRpcCBbdG9vbHRpcENvbnRlbnRdPVwiYXJyYXlJdGVtVG9vbHRpcENvbnRlbnRcIj48L25neC1tYXQtZW50aXR5LXRvb2x0aXA+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiBjbGFzcz1cImNhbmNlbC1idXR0b25cIiAoY2xpY2spPVwiY2xvc2VFZGl0QXJyYXlJdGVtRGlhbG9nKClcIj5cbiAgICAgICAgICAgICAgICB7e2VkaXRBcnJheUl0ZW1EaWFsb2dEYXRhLmNhbmNlbEJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICA8L2Zvcm0+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS1DcmVhdGUgSGFzIE1hbnkgRGlhbG9nLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPG5nLXRlbXBsYXRlICNjcmVhdGVIYXNNYW55RGlhbG9nPlxuICAgIDxkaXYgY2xhc3M9XCJtYXQtZGlhbG9nLXRpdGxlXCI+XG4gICAgICAgIDxkaXY+e3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmNyZWF0ZURhdGEudGl0bGV9fTwvZGl2PlxuICAgIDwvZGl2PlxuICAgIFxuICAgIDxmb3JtIChuZ1N1Ym1pdCk9XCJkaWFsb2dDcmVhdGVIYXNNYW55KClcIj5cbiAgICAgICAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICAgICAgICAgIEBpZiAoaGFzTWFueUNyZWF0ZUZvcm1Db250ZXh0KSB7XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvcm07IGNvbnRleHQ6IGhhc01hbnlDcmVhdGVGb3JtQ29udGV4dFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgICAgICAgXG4gICAgICAgIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWJ1dHRvbi13aXRoLWluZm8taWNvblwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIG1hdC1yYWlzZWQtYnV0dG9uIG1hdEJhZGdlQ29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0hhc01hbnlFbnRpdHlWYWxpZFwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRCYWRnZV09XCJoYXNNYW55VmFsaWRhdGlvbkVycm9ycy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwiIWhhc01hbnlWYWxpZGF0aW9uRXJyb3JzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuY3JlYXRlRGF0YS5jcmVhdGVCdXR0b25MYWJlbH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgQGlmIChoYXNNYW55VmFsaWRhdGlvbkVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgPG5neC1tYXQtZW50aXR5LXRvb2x0aXAgW3Rvb2x0aXBDb250ZW50XT1cImhhc01hbnlUb29sdGlwQ29udGVudFwiPjwvbmd4LW1hdC1lbnRpdHktdG9vbHRpcD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1yYWlzZWQtYnV0dG9uIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiIChjbGljayk9XCJkaWFsb2dDYW5jZWxDcmVhdGVIYXNNYW55KClcIj5cbiAgICAgICAgICAgICAgICB7e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuY3JlYXRlRGF0YS5jYW5jZWxCdXR0b25MYWJlbH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPC9mb3JtPlxuICAgIFxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tRWRpdCBIYXMgTWFueSBEaWFsb2ctLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPG5nLXRlbXBsYXRlICNlZGl0SGFzTWFueURpYWxvZz5cbiAgICA8ZGl2IGNsYXNzPVwibWF0LWRpYWxvZy10aXRsZVwiPlxuICAgICAgICA8ZGl2Pnt7bWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5lZGl0RGF0YS50aXRsZShoYXNNYW55RW50aXR5UHJpb3JDaGFuZ2VzKX19PC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICBAaWYgKG1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEuYWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiPlxuICAgICAgICAgICAgICAgICAgICB7e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEuYWN0aW9uc0xhYmVsfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChhY3Rpb24gb2YgbWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5lZGl0RGF0YS5hY3Rpb25zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwiaGFzTWFueUVkaXRBY3Rpb25EaXNhYmxlZChhY3Rpb24pXCIgKGNsaWNrKT1cImhhc01hbnlSdW5FZGl0QWN0aW9uKGFjdGlvbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7YWN0aW9uLmRpc3BsYXlOYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgXG4gICAgICAgICAgICBAaWYgKGhhc01hbnlBbGxvd0RlbGV0ZShoYXNNYW55RW50aXR5KSkge1xuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwid2FyblwiIGNsYXNzPVwiZGVsZXRlLWJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIiAoY2xpY2spPVwiZGVsZXRlSGFzTWFueUVudGl0eSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7bWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5lZGl0RGF0YS5kZWxldGVCdXR0b25MYWJlbH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIFxuICAgIDxmb3JtIChuZ1N1Ym1pdCk9XCJkaWFsb2dFZGl0SGFzTWFueSgpXCI+XG4gICAgICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgICAgICAgICBAaWYgKGhhc01hbnlFZGl0Rm9ybUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9ybTsgY29udGV4dDogaGFzTWFueUVkaXRGb3JtQ29udGV4dFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgICAgICAgXG4gICAgICAgIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWJ1dHRvbi13aXRoLWluZm8taWNvblwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIG1hdC1yYWlzZWQtYnV0dG9uIG1hdEJhZGdlQ29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJhZGdlLWNoYW5nZXNdPVwiIWhhc01hbnlWYWxpZGF0aW9uRXJyb3JzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpbnRlcm5hbElzUmVhZE9ubHkgfHwgIWlzSGFzTWFueUVudGl0eVZhbGlkIHx8ICFpc0hhc01hbnlFbnRpdHlEaXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRCYWRnZV09XCJoYXNNYW55VmFsaWRhdGlvbkVycm9ycy5sZW5ndGggPiAwID8gaGFzTWFueVZhbGlkYXRpb25FcnJvcnMubGVuZ3RoIDogaGFzTWFueUNoYW5nZXMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdEJhZGdlSGlkZGVuXT1cIiFoYXNNYW55VmFsaWRhdGlvbkVycm9ycy5sZW5ndGggJiYgIWhhc01hbnlDaGFuZ2VzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEuY29uZmlybUJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICBAaWYgKGhhc01hbnlWYWxpZGF0aW9uRXJyb3JzLmxlbmd0aCB8fCBoYXNNYW55Q2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgPG5neC1tYXQtZW50aXR5LXRvb2x0aXAgW3Rvb2x0aXBDb250ZW50XT1cImhhc01hbnlUb29sdGlwQ29udGVudFwiPjwvbmd4LW1hdC1lbnRpdHktdG9vbHRpcD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1yYWlzZWQtYnV0dG9uIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiIChjbGljayk9XCJkaWFsb2dDYW5jZWxFZGl0SGFzTWFueSgpXCI+XG4gICAgICAgICAgICAgICAge3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmVkaXREYXRhLmNhbmNlbEJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICA8L2Zvcm0+XG48L25nLXRlbXBsYXRlPiJdfQ==
|