@decaf-ts/for-angular 0.0.17 → 0.0.19
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/assets/i18n/en.json +3 -73
- package/assets/i18n/pt.json +5 -74
- package/components/crud-field/crud-field.component.d.ts +12 -3
- package/components/crud-form/crud-form.component.d.ts +36 -14
- package/components/empty-state/empty-state.component.d.ts +9 -10
- package/components/fieldset/fieldset.component.d.ts +9 -0
- package/components/filter/filter.component.d.ts +11 -2
- package/engine/NgxBaseComponent.d.ts +39 -39
- package/engine/NgxCrudFormField.d.ts +2 -1
- package/engine/NgxRenderingEngine.d.ts +44 -16
- package/engine/interfaces.d.ts +10 -0
- package/engine/types.d.ts +8 -0
- package/esm2022/components/crud-field/crud-field.component.mjs +23 -3
- package/esm2022/components/crud-form/crud-form.component.mjs +33 -18
- package/esm2022/components/empty-state/empty-state.component.mjs +11 -10
- package/esm2022/components/fieldset/fieldset.component.mjs +7 -4
- package/esm2022/components/filter/filter.component.mjs +16 -6
- package/esm2022/components/layout/layout.component.mjs +3 -3
- package/esm2022/components/list-item/list-item.component.mjs +4 -4
- package/esm2022/components/pagination/pagination.component.mjs +6 -6
- package/esm2022/engine/NgxBaseComponent.mjs +48 -53
- package/esm2022/engine/NgxCrudFormField.mjs +1 -1
- package/esm2022/engine/NgxRenderingEngine.mjs +20 -4
- package/esm2022/engine/interfaces.mjs +1 -1
- package/esm2022/engine/types.mjs +1 -1
- package/esm2022/helpers/utils.mjs +49 -32
- package/esm2022/i18n/Loader.mjs +82 -0
- package/fesm2022/decaf-ts-for-angular.mjs +288 -134
- package/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
- package/helpers/utils.d.ts +42 -17
- package/i18n/Loader.d.ts +48 -0
- package/package.json +10 -1
|
@@ -10,6 +10,7 @@ import { FormArray } from '@angular/forms';
|
|
|
10
10
|
import { NgxBaseComponent } from '../../engine';
|
|
11
11
|
import { alertCircleOutline, createOutline } from 'ionicons/icons';
|
|
12
12
|
import { TranslateService } from '@ngx-translate/core';
|
|
13
|
+
import { addIcons } from 'ionicons';
|
|
13
14
|
import * as i0 from "@angular/core";
|
|
14
15
|
import * as i1 from "@ionic/angular/standalone";
|
|
15
16
|
import * as i2 from "@angular/common";
|
|
@@ -75,7 +76,7 @@ let FieldsetComponent = class FieldsetComponent extends NgxBaseComponent {
|
|
|
75
76
|
* @memberOf FieldsetComponent
|
|
76
77
|
*/
|
|
77
78
|
constructor() {
|
|
78
|
-
super('FieldsetComponent'
|
|
79
|
+
super('FieldsetComponent');
|
|
79
80
|
/**
|
|
80
81
|
* @description The display name or title of the fieldset section.
|
|
81
82
|
* @summary Sets the legend or header text that appears in the accordion header. This text
|
|
@@ -267,6 +268,7 @@ let FieldsetComponent = class FieldsetComponent extends NgxBaseComponent {
|
|
|
267
268
|
* @memberOf FieldsetComponent
|
|
268
269
|
*/
|
|
269
270
|
this.translateService = inject(TranslateService);
|
|
271
|
+
addIcons({ alertCircleOutline, createOutline });
|
|
270
272
|
}
|
|
271
273
|
/**
|
|
272
274
|
* @description Component initialization lifecycle method.
|
|
@@ -281,6 +283,7 @@ let FieldsetComponent = class FieldsetComponent extends NgxBaseComponent {
|
|
|
281
283
|
if (this.model)
|
|
282
284
|
this._repository = this.repository;
|
|
283
285
|
this.buttonLabel = this.translateService.instant(this.locale + '.add');
|
|
286
|
+
this.buttonCancelLabel = this.translateService.instant(this.locale + '.cancel');
|
|
284
287
|
}
|
|
285
288
|
/**
|
|
286
289
|
* @description Initializes the component state after view and child components are rendered.
|
|
@@ -623,7 +626,7 @@ let FieldsetComponent = class FieldsetComponent extends NgxBaseComponent {
|
|
|
623
626
|
return this.mapper;
|
|
624
627
|
}
|
|
625
628
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FieldsetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
626
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FieldsetComponent, isStandalone: true, selector: "ngx-decaf-fieldset", inputs: { name: "name", childOf: "childOf", uid: "uid", customTypes: "customTypes", operation: "operation", formGroup: "formGroup", title: "title", description: "description", target: "target", multiple: "multiple", value: "value", handlers: "handlers" }, host: { properties: { "attr.id": "overriode " } }, viewQueries: [{ propertyName: "accordionComponent", first: true, predicate: ["accordionComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\n\n<fieldset\n (fieldsetAddGroupEvent)=\"handleCreateItem($event)\"\n (fieldsetRemoveGroupEvent)=\"handleRemoveItem(undefined, $event)\"\n [class]=\"'dcf-fieldset ' + operation\"\n #component>\n <ion-accordion-group [ngClass]=\"{'open': isOpen, 'hasValidationErrors': hasValidationErrors}\" (validationErrorEvent)=\"handleValidationError($event)\" #accordionComponent>\n <ion-accordion value=\"open\">\n <ion-item slot=\"header\" (click)=\"handleAccordionToggle($event)\">\n <div class=\"dcf-grid dcf-grid-collapse dcf-flex dcf-flex-middle dcf-width-1-1\">\n <div class=\"dcf-width-expand\">\n <legend>{{ name | translate }}</legend>\n </div>\n @if(!isRequired && ['create', 'update'].includes(operation)) {\n <div class=\"dcf-width-auto dcf-delete\">\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveComponent($event)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </div>\n }\n </div>\n </ion-item>\n <div slot=\"content\" [attr.aria-hidden]=\"!isOpen\">\n @if(multiple && items.length) {\n <ion-list class=\"dcf-fields-list\">\n <ion-reorder-group [formGroup]=\"formGroup.parent\" [disabled]=\"updatingItem\" (ionItemReorder)=\"handleReorderItems($any($event))\" #accordionComponent>\n @for(item of items; track item.index) {\n <ion-item [ngClass]=\"{'not-unique': item.title === isUniqueError}\" lines=\"full\" [button]=\"false\" [ngClass]=\"{'updating': updatingItem?.[pk] === item.title}\">\n @if(items?.length > 1 && !updatingItem) {\n <ion-reorder slot=\"start\">\n <ion-icon name=\"swap-vertical-outline\"></ion-icon>\n </ion-reorder>\n } @else {\n <div slot=\"start\">\n <ion-icon class=\"dcf-reorder-disabled\" size=\"small\" name=\"swap-vertical-outline\" disabled></ion-icon>\n </div>\n }\n <ion-label [color]=\"item.title === isUniqueError ? 'danger' : ''\">{{ item.index }}. {{ item.title }}\n @if(item.description?.length > 0) {\n <br />\n <ion-text class=\"dcf-subtitle\">{{item.description}}</ion-text>\n }\n </ion-label>\n @if(!updatingItem || updatingItem?.[pk] !== item.title) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleUpdateItem(item.title, $index)\">\n <ion-icon name=\"create-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n\n @if(!updatingItem) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveItem(item.title)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n </ion-item>\n }\n </ion-reorder-group>\n </ion-list>\n }\n\n <ng-content></ng-content>\n @if(multiple && ['create', 'update'].includes(operation)) {\n @if(isUniqueError) {\n <div class=\"dcf-not-unique-container dcf-animation dcf-animation-bottom-small dcf-animation-fast\">\n <div class=\" dcf-grid dcf-grid-collapse dcf-width-1-1 \">\n <div class=\"dcf-auto\" [attr.style]=\"'max-width: 50px'\">\n <ion-icon name=\"alert-circle-outline\"></ion-icon>\n </div>\n <div class=\"dcf-width-expand\">\n <ion-text color=\"danger\" class=\"dcf-text-small\">{{ locale + '.not_unique' | translate : { value: isUniqueError } }}</ion-text>\n </div>\n </div>\n </div>\n }\n <div class=\"dcf-margin-bottom dcf-grid dcf-grid-collapse dcf-flex\">\n @if(updatingItem) {\n <ion-button size=\"small\" fill=\"clear\" color=\"danger\" (click)=\"handleCancelUpdateItem()\">\n {{ locale + '.cancel' | translate }}\n </ion-button>\n }\n <ion-button size=\"small\" fill=\"clear\" color=\"dark\" (click)=\"handleCreateItem()\">\n <ion-icon name=\"add-outline\" slot=\"start\"></ion-icon>\n {{buttonLabel}}\n </ion-button>\n\n </div>\n }\n\n </div>\n </ion-accordion>\n </ion-accordion-group>\n</fieldset>\n\n", styles: ["ion-accordion-group ion-item[slot=header] .dcf-delete{width:30px}ion-accordion-group ion-item[slot=header] .dcf-delete ion-button{transform:translateY(-2px)}ion-accordion-group ion-item[slot=header] .dcf-delete ion-icon{font-size:1.15rem}::ng-deep ion-accordion ngx-decaf-crud-field:last-child ion-item{--inner-border-width: 0px !important;--border-width: 0px !important}.dcf-fieldset{margin-bottom:1.8rem;padding-bottom:0;padding-top:1rem;border:1px solid var(--dcf-color-gray-2);border-radius:8px;height:100%}.dcf-fieldset.read{margin-top:1.25rem;padding-bottom:1rem}.dcf-fieldset.read [slot=content]{padding-top:0!important;background:red}.dcf-fieldset ion-accordion.accordion-collapsing,.dcf-fieldset ion-accordion.accordion-collapsed{margin-bottom:1rem}.dcf-fieldset ion-accordion ion-item[slot=header]{--border-color: transparent;--border-radius: 6px;--inner-border-width: 0;--padding-start: 12px}.dcf-fieldset ion-accordion ion-item[slot=header] legend{font-weight:600;font-size:1rem;color:#333;margin:0}.dcf-fieldset ion-accordion [slot=content]{padding-top:1rem!important;padding-inline:.75rem;background-color:#fff}.dcf-not-unique-container{display:flex;justify-content:center;align-items:center;margin-bottom:1rem;flex:1 1 auto}.dcf-not-unique-container>div{display:flex;justify-content:center;align-items:center}.dcf-not-unique-container ion-icon{transform:translatey(2px);margin-right:5px}.dcf-fields-list{margin-top:-1rem;margin-bottom:1rem;padding:0!important}ion-item{--min-height: 50px;--padding-top: .25rem;--padding-bottom: .25rem;--padding-start: .75rem;--padding-end: .75rem;--inner-padding-start: 0px !important;--inner-padding-end: 0px !important;--border-color: var(--dcf-color-gray-2);border:1px solid transparent;box-sizing:border-box}ion-item ion-icon.dcf-reorder-disabled{width:1rem;transform:translatey(2px);color:var(--dcf-color-gray-4)}ion-item.updating{--background: rgba(var(--dcf-color-primary-rgb), .1) !important}ion-item.not-unique{--background: rgba(var(--dcf-color-danger-rgb), .05) !important}ion-item .dcf-subtitle{font-size:.8rem;color:var(--dcf-color-gray-7)}\n"], dependencies: [{ kind: "ngmodule", type: ForAngularModule }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "component", type: IonAccordionGroup, selector: "ion-accordion-group", inputs: ["animated", "disabled", "expand", "mode", "multiple", "readonly", "value"] }, { kind: "component", type: IonAccordion, selector: "ion-accordion", inputs: ["disabled", "mode", "readonly", "toggleIcon", "toggleIconSlot", "value"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonReorder, selector: "ion-reorder" }, { kind: "component", type: IonReorderGroup, selector: "ion-reorder-group", inputs: ["disabled"] }] }); }
|
|
629
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FieldsetComponent, isStandalone: true, selector: "ngx-decaf-fieldset", inputs: { name: "name", childOf: "childOf", uid: "uid", customTypes: "customTypes", operation: "operation", formGroup: "formGroup", title: "title", description: "description", target: "target", multiple: "multiple", value: "value", handlers: "handlers" }, host: { properties: { "attr.id": "overriode " } }, viewQueries: [{ propertyName: "accordionComponent", first: true, predicate: ["accordionComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\n\n<fieldset\n (fieldsetAddGroupEvent)=\"handleCreateItem($event)\"\n (fieldsetRemoveGroupEvent)=\"handleRemoveItem(undefined, $event)\"\n [class]=\"'dcf-fieldset ' + operation\"\n #component>\n <ion-accordion-group [ngClass]=\"{'open': isOpen, 'hasValidationErrors': hasValidationErrors}\" (validationErrorEvent)=\"handleValidationError($event)\" #accordionComponent>\n <ion-accordion value=\"open\">\n <ion-item slot=\"header\" (click)=\"handleAccordionToggle($event)\">\n <div class=\"dcf-grid dcf-grid-collapse dcf-flex dcf-flex-middle dcf-width-1-1\">\n <div class=\"dcf-width-expand\">\n <legend>{{ name | translate }}</legend>\n </div>\n @if(!isRequired && ['create', 'update'].includes(operation)) {\n <div class=\"dcf-width-auto dcf-delete\">\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveComponent($event)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </div>\n }\n </div>\n </ion-item>\n <div slot=\"content\" [attr.aria-hidden]=\"!isOpen\">\n @if(multiple && items.length) {\n <ion-list class=\"dcf-fields-list\">\n <ion-reorder-group [formGroup]=\"formGroup.parent\" [disabled]=\"updatingItem\" (ionItemReorder)=\"handleReorderItems($any($event))\" #accordionComponent>\n @for(item of items; track item.index) {\n <ion-item [ngClass]=\"{'not-unique': item.title === isUniqueError}\" lines=\"full\" [button]=\"false\" [ngClass]=\"{'updating': updatingItem?.[pk] === item.title}\">\n @if(items?.length > 1 && !updatingItem) {\n <ion-reorder slot=\"start\">\n <ion-icon name=\"swap-vertical-outline\"></ion-icon>\n </ion-reorder>\n } @else {\n <div slot=\"start\">\n <ion-icon class=\"dcf-reorder-disabled\" size=\"small\" name=\"swap-vertical-outline\" disabled></ion-icon>\n </div>\n }\n <ion-label [color]=\"(item.title === isUniqueError && !updatingItem.title === item.title) ? 'danger' : ''\">{{ item.index }}. {{ item.title }}\n @if(item.description?.length > 0) {\n <br />\n <ion-text class=\"dcf-subtitle\">{{item.description}}</ion-text>\n }\n </ion-label>\n @if(!updatingItem || updatingItem?.[pk] !== item.title) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleUpdateItem(item.title, $index)\">\n <ion-icon name=\"create-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n\n @if(!updatingItem) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveItem(item.title)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n </ion-item>\n }\n </ion-reorder-group>\n </ion-list>\n }\n\n <ng-content></ng-content>\n\n @if(multiple && ['create', 'update'].includes(operation)) {\n @if(isUniqueError) {\n <div class=\"dcf-not-unique-container dcf-animation dcf-animation-bottom-small dcf-animation-fast\">\n <div class=\" dcf-grid dcf-grid-collapse dcf-width-1-1 \">\n <div class=\"dcf-auto\" [attr.style]=\"'max-width: 50px'\">\n <ion-icon name=\"alert-circle-outline\"></ion-icon>\n </div>\n <div class=\"dcf-width-expand\">\n <ion-text color=\"danger\" class=\"dcf-text-small\">{{ locale + '.not_unique' | translate : { value: isUniqueError } }}</ion-text>\n </div>\n </div>\n </div>\n }\n <div class=\"dcf-margin-bottom dcf-grid dcf-grid-collapse dcf-flex\">\n @if(updatingItem) {\n <ion-button size=\"small\" fill=\"clear\" color=\"danger\" (click)=\"handleCancelUpdateItem()\">\n {{ buttonCancelLabel }}\n </ion-button>\n }\n <ion-button size=\"small\" fill=\"clear\" class=\"dcf-button-add\" (click)=\"handleCreateItem()\">\n <ion-icon name=\"add-outline\" slot=\"start\"></ion-icon>\n {{buttonLabel}}\n </ion-button>\n\n </div>\n }\n\n </div>\n </ion-accordion>\n </ion-accordion-group>\n</fieldset>\n\n", styles: ["ion-accordion-group ion-item[slot=header] .dcf-delete{width:30px}ion-accordion-group ion-item[slot=header] .dcf-delete ion-button{transform:translateY(-2px)}ion-accordion-group ion-item[slot=header] .dcf-delete ion-icon{font-size:1.15rem}::ng-deep ion-accordion ngx-decaf-crud-field:last-child ion-item{--inner-border-width: 0px !important;--border-width: 0px !important}.dcf-fieldset{margin-bottom:1.8rem;margin-top:1rem;padding-bottom:0;padding-top:1rem;background:var(--dcf-card-background);border-radius:6px;height:100%}@media (prefers-color-scheme: light){.dcf-fieldset{border:1px solid var(--dcf-color-gray-3)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-dark)!important}}@media (prefers-color-scheme: dark){.dcf-fieldset{border:1px solid var(--dcf-color-step-400)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-gray-2)}}.dcf-fieldset.read,.dcf-fieldset.delete{margin-top:1.25rem;padding-bottom:1rem}.dcf-fieldset.read [slot=content],.dcf-fieldset.delete [slot=content]{padding-top:0!important}.dcf-fieldset.read ion-accordion,.dcf-fieldset.delete ion-accordion{margin-bottom:0rem!important}@media (prefers-color-scheme: dark){.dcf-fieldset.read,.dcf-fieldset.delete{border:1px solid var(--dcf-color-gray-6)}}.dcf-fieldset ion-accordion{background:var(--dcf-card-background);margin-bottom:1rem}.dcf-fieldset ion-accordion.accordion-collapsing,.dcf-fieldset ion-accordion.accordion-collapsed{margin-bottom:1rem}.dcf-fieldset ion-accordion ion-item[slot=header]{--border-color: transparent;--border-radius: 6px;--inner-border-width: 0;--padding-start: 12px}.dcf-fieldset ion-accordion ion-item[slot=header] legend{font-weight:600;font-size:1rem;margin:0}@media (prefers-color-scheme: light){.dcf-fieldset ion-accordion ion-item[slot=header] legend{color:var(--dcf-color-gray-7)}}.dcf-fieldset ion-accordion [slot=content]{padding-top:2rem!important;padding-inline:.75rem}.dcf-not-unique-container{display:flex;justify-content:center;align-items:center;margin-bottom:1rem;flex:1 1 auto}.dcf-not-unique-container>div{display:flex;justify-content:center;align-items:center}.dcf-not-unique-container ion-icon{transform:translatey(2px);margin-right:5px}.dcf-fields-list{margin-top:-1rem;margin-bottom:1rem;padding:0!important}.dcf-fields-list ion-item{--min-height: 50px;--padding-top: .25rem;--padding-bottom: .25rem;--padding-start: .75rem;--padding-end: .75rem;--inner-padding-start: 0px !important;--inner-padding-end: 0px !important;--border-color: var(--dcf-color-gray-2) !important;border:1px solid transparent;box-sizing:border-box}.dcf-fields-list ion-item ion-icon.dcf-reorder-disabled{width:1rem;transform:translatey(2px);color:var(--dcf-color-gray-4)}.dcf-fields-list ion-item.updating{--background: rgba(var(--dcf-color-primary-rgb), .1) !important}.dcf-fields-list ion-item.not-unique{--background: rgba(var(--dcf-color-danger-rgb), .05) !important}.dcf-fields-list ion-item .dcf-subtitle{font-size:.8rem;color:var(--dcf-color-gray-7)}\n"], dependencies: [{ kind: "ngmodule", type: ForAngularModule }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "component", type: IonAccordionGroup, selector: "ion-accordion-group", inputs: ["animated", "disabled", "expand", "mode", "multiple", "readonly", "value"] }, { kind: "component", type: IonAccordion, selector: "ion-accordion", inputs: ["disabled", "mode", "readonly", "toggleIcon", "toggleIconSlot", "value"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonReorder, selector: "ion-reorder" }, { kind: "component", type: IonReorderGroup, selector: "ion-reorder-group", inputs: ["disabled"] }] }); }
|
|
627
630
|
};
|
|
628
631
|
FieldsetComponent = __decorate([
|
|
629
632
|
Dynamic(),
|
|
@@ -632,7 +635,7 @@ FieldsetComponent = __decorate([
|
|
|
632
635
|
export { FieldsetComponent };
|
|
633
636
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FieldsetComponent, decorators: [{
|
|
634
637
|
type: Component,
|
|
635
|
-
args: [{ standalone: true, selector: 'ngx-decaf-fieldset', schemas: [CUSTOM_ELEMENTS_SCHEMA], imports: [ForAngularModule, IonAccordionGroup, IonAccordion, IonList, IonItem, IonLabel, IonReorder, IonButton, IonReorderGroup, CollapsableDirective], host: { '[attr.id]': 'overriode ' }, template: "\n\n<fieldset\n (fieldsetAddGroupEvent)=\"handleCreateItem($event)\"\n (fieldsetRemoveGroupEvent)=\"handleRemoveItem(undefined, $event)\"\n [class]=\"'dcf-fieldset ' + operation\"\n #component>\n <ion-accordion-group [ngClass]=\"{'open': isOpen, 'hasValidationErrors': hasValidationErrors}\" (validationErrorEvent)=\"handleValidationError($event)\" #accordionComponent>\n <ion-accordion value=\"open\">\n <ion-item slot=\"header\" (click)=\"handleAccordionToggle($event)\">\n <div class=\"dcf-grid dcf-grid-collapse dcf-flex dcf-flex-middle dcf-width-1-1\">\n <div class=\"dcf-width-expand\">\n <legend>{{ name | translate }}</legend>\n </div>\n @if(!isRequired && ['create', 'update'].includes(operation)) {\n <div class=\"dcf-width-auto dcf-delete\">\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveComponent($event)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </div>\n }\n </div>\n </ion-item>\n <div slot=\"content\" [attr.aria-hidden]=\"!isOpen\">\n @if(multiple && items.length) {\n <ion-list class=\"dcf-fields-list\">\n <ion-reorder-group [formGroup]=\"formGroup.parent\" [disabled]=\"updatingItem\" (ionItemReorder)=\"handleReorderItems($any($event))\" #accordionComponent>\n @for(item of items; track item.index) {\n <ion-item [ngClass]=\"{'not-unique': item.title === isUniqueError}\" lines=\"full\" [button]=\"false\" [ngClass]=\"{'updating': updatingItem?.[pk] === item.title}\">\n @if(items?.length > 1 && !updatingItem) {\n <ion-reorder slot=\"start\">\n <ion-icon name=\"swap-vertical-outline\"></ion-icon>\n </ion-reorder>\n } @else {\n <div slot=\"start\">\n <ion-icon class=\"dcf-reorder-disabled\" size=\"small\" name=\"swap-vertical-outline\" disabled></ion-icon>\n </div>\n }\n <ion-label [color]=\"item.title === isUniqueError ? 'danger' : ''\">{{ item.index }}. {{ item.title }}\n @if(item.description?.length > 0) {\n <br />\n <ion-text class=\"dcf-subtitle\">{{item.description}}</ion-text>\n }\n </ion-label>\n @if(!updatingItem || updatingItem?.[pk] !== item.title) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleUpdateItem(item.title, $index)\">\n <ion-icon name=\"create-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n\n @if(!updatingItem) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveItem(item.title)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n </ion-item>\n }\n </ion-reorder-group>\n </ion-list>\n }\n\n <ng-content></ng-content>\n @if(multiple && ['create', 'update'].includes(operation)) {\n @if(isUniqueError) {\n <div class=\"dcf-not-unique-container dcf-animation dcf-animation-bottom-small dcf-animation-fast\">\n <div class=\" dcf-grid dcf-grid-collapse dcf-width-1-1 \">\n <div class=\"dcf-auto\" [attr.style]=\"'max-width: 50px'\">\n <ion-icon name=\"alert-circle-outline\"></ion-icon>\n </div>\n <div class=\"dcf-width-expand\">\n <ion-text color=\"danger\" class=\"dcf-text-small\">{{ locale + '.not_unique' | translate : { value: isUniqueError } }}</ion-text>\n </div>\n </div>\n </div>\n }\n <div class=\"dcf-margin-bottom dcf-grid dcf-grid-collapse dcf-flex\">\n @if(updatingItem) {\n <ion-button size=\"small\" fill=\"clear\" color=\"danger\" (click)=\"handleCancelUpdateItem()\">\n {{
|
|
638
|
+
args: [{ standalone: true, selector: 'ngx-decaf-fieldset', schemas: [CUSTOM_ELEMENTS_SCHEMA], imports: [ForAngularModule, IonAccordionGroup, IonAccordion, IonList, IonItem, IonLabel, IonReorder, IonButton, IonReorderGroup, CollapsableDirective], host: { '[attr.id]': 'overriode ' }, template: "\n\n<fieldset\n (fieldsetAddGroupEvent)=\"handleCreateItem($event)\"\n (fieldsetRemoveGroupEvent)=\"handleRemoveItem(undefined, $event)\"\n [class]=\"'dcf-fieldset ' + operation\"\n #component>\n <ion-accordion-group [ngClass]=\"{'open': isOpen, 'hasValidationErrors': hasValidationErrors}\" (validationErrorEvent)=\"handleValidationError($event)\" #accordionComponent>\n <ion-accordion value=\"open\">\n <ion-item slot=\"header\" (click)=\"handleAccordionToggle($event)\">\n <div class=\"dcf-grid dcf-grid-collapse dcf-flex dcf-flex-middle dcf-width-1-1\">\n <div class=\"dcf-width-expand\">\n <legend>{{ name | translate }}</legend>\n </div>\n @if(!isRequired && ['create', 'update'].includes(operation)) {\n <div class=\"dcf-width-auto dcf-delete\">\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveComponent($event)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </div>\n }\n </div>\n </ion-item>\n <div slot=\"content\" [attr.aria-hidden]=\"!isOpen\">\n @if(multiple && items.length) {\n <ion-list class=\"dcf-fields-list\">\n <ion-reorder-group [formGroup]=\"formGroup.parent\" [disabled]=\"updatingItem\" (ionItemReorder)=\"handleReorderItems($any($event))\" #accordionComponent>\n @for(item of items; track item.index) {\n <ion-item [ngClass]=\"{'not-unique': item.title === isUniqueError}\" lines=\"full\" [button]=\"false\" [ngClass]=\"{'updating': updatingItem?.[pk] === item.title}\">\n @if(items?.length > 1 && !updatingItem) {\n <ion-reorder slot=\"start\">\n <ion-icon name=\"swap-vertical-outline\"></ion-icon>\n </ion-reorder>\n } @else {\n <div slot=\"start\">\n <ion-icon class=\"dcf-reorder-disabled\" size=\"small\" name=\"swap-vertical-outline\" disabled></ion-icon>\n </div>\n }\n <ion-label [color]=\"(item.title === isUniqueError && !updatingItem.title === item.title) ? 'danger' : ''\">{{ item.index }}. {{ item.title }}\n @if(item.description?.length > 0) {\n <br />\n <ion-text class=\"dcf-subtitle\">{{item.description}}</ion-text>\n }\n </ion-label>\n @if(!updatingItem || updatingItem?.[pk] !== item.title) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleUpdateItem(item.title, $index)\">\n <ion-icon name=\"create-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n\n @if(!updatingItem) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveItem(item.title)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n </ion-item>\n }\n </ion-reorder-group>\n </ion-list>\n }\n\n <ng-content></ng-content>\n\n @if(multiple && ['create', 'update'].includes(operation)) {\n @if(isUniqueError) {\n <div class=\"dcf-not-unique-container dcf-animation dcf-animation-bottom-small dcf-animation-fast\">\n <div class=\" dcf-grid dcf-grid-collapse dcf-width-1-1 \">\n <div class=\"dcf-auto\" [attr.style]=\"'max-width: 50px'\">\n <ion-icon name=\"alert-circle-outline\"></ion-icon>\n </div>\n <div class=\"dcf-width-expand\">\n <ion-text color=\"danger\" class=\"dcf-text-small\">{{ locale + '.not_unique' | translate : { value: isUniqueError } }}</ion-text>\n </div>\n </div>\n </div>\n }\n <div class=\"dcf-margin-bottom dcf-grid dcf-grid-collapse dcf-flex\">\n @if(updatingItem) {\n <ion-button size=\"small\" fill=\"clear\" color=\"danger\" (click)=\"handleCancelUpdateItem()\">\n {{ buttonCancelLabel }}\n </ion-button>\n }\n <ion-button size=\"small\" fill=\"clear\" class=\"dcf-button-add\" (click)=\"handleCreateItem()\">\n <ion-icon name=\"add-outline\" slot=\"start\"></ion-icon>\n {{buttonLabel}}\n </ion-button>\n\n </div>\n }\n\n </div>\n </ion-accordion>\n </ion-accordion-group>\n</fieldset>\n\n", styles: ["ion-accordion-group ion-item[slot=header] .dcf-delete{width:30px}ion-accordion-group ion-item[slot=header] .dcf-delete ion-button{transform:translateY(-2px)}ion-accordion-group ion-item[slot=header] .dcf-delete ion-icon{font-size:1.15rem}::ng-deep ion-accordion ngx-decaf-crud-field:last-child ion-item{--inner-border-width: 0px !important;--border-width: 0px !important}.dcf-fieldset{margin-bottom:1.8rem;margin-top:1rem;padding-bottom:0;padding-top:1rem;background:var(--dcf-card-background);border-radius:6px;height:100%}@media (prefers-color-scheme: light){.dcf-fieldset{border:1px solid var(--dcf-color-gray-3)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-dark)!important}}@media (prefers-color-scheme: dark){.dcf-fieldset{border:1px solid var(--dcf-color-step-400)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-gray-2)}}.dcf-fieldset.read,.dcf-fieldset.delete{margin-top:1.25rem;padding-bottom:1rem}.dcf-fieldset.read [slot=content],.dcf-fieldset.delete [slot=content]{padding-top:0!important}.dcf-fieldset.read ion-accordion,.dcf-fieldset.delete ion-accordion{margin-bottom:0rem!important}@media (prefers-color-scheme: dark){.dcf-fieldset.read,.dcf-fieldset.delete{border:1px solid var(--dcf-color-gray-6)}}.dcf-fieldset ion-accordion{background:var(--dcf-card-background);margin-bottom:1rem}.dcf-fieldset ion-accordion.accordion-collapsing,.dcf-fieldset ion-accordion.accordion-collapsed{margin-bottom:1rem}.dcf-fieldset ion-accordion ion-item[slot=header]{--border-color: transparent;--border-radius: 6px;--inner-border-width: 0;--padding-start: 12px}.dcf-fieldset ion-accordion ion-item[slot=header] legend{font-weight:600;font-size:1rem;margin:0}@media (prefers-color-scheme: light){.dcf-fieldset ion-accordion ion-item[slot=header] legend{color:var(--dcf-color-gray-7)}}.dcf-fieldset ion-accordion [slot=content]{padding-top:2rem!important;padding-inline:.75rem}.dcf-not-unique-container{display:flex;justify-content:center;align-items:center;margin-bottom:1rem;flex:1 1 auto}.dcf-not-unique-container>div{display:flex;justify-content:center;align-items:center}.dcf-not-unique-container ion-icon{transform:translatey(2px);margin-right:5px}.dcf-fields-list{margin-top:-1rem;margin-bottom:1rem;padding:0!important}.dcf-fields-list ion-item{--min-height: 50px;--padding-top: .25rem;--padding-bottom: .25rem;--padding-start: .75rem;--padding-end: .75rem;--inner-padding-start: 0px !important;--inner-padding-end: 0px !important;--border-color: var(--dcf-color-gray-2) !important;border:1px solid transparent;box-sizing:border-box}.dcf-fields-list ion-item ion-icon.dcf-reorder-disabled{width:1rem;transform:translatey(2px);color:var(--dcf-color-gray-4)}.dcf-fields-list ion-item.updating{--background: rgba(var(--dcf-color-primary-rgb), .1) !important}.dcf-fields-list ion-item.not-unique{--background: rgba(var(--dcf-color-danger-rgb), .05) !important}.dcf-fields-list ion-item .dcf-subtitle{font-size:.8rem;color:var(--dcf-color-gray-7)}\n"] }]
|
|
636
639
|
}], ctorParameters: () => [], propDecorators: { accordionComponent: [{
|
|
637
640
|
type: ViewChild,
|
|
638
641
|
args: ['accordionComponent', { static: false }]
|
|
@@ -661,4 +664,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
661
664
|
}], handlers: [{
|
|
662
665
|
type: Input
|
|
663
666
|
}] } });
|
|
664
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2ZpZWxkc2V0L2ZpZWxkc2V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9maWVsZHNldC9maWVsZHNldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFpQixpQkFBaUIsRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pKLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUF5QyxNQUFNLGNBQWMsQ0FBQztBQUM5RixPQUFPLEVBQWtCLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUEwQixlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEssT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakcsT0FBTyxFQUFFLFNBQVMsRUFBMEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFD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QUFFLE9BQU8sME5BQUUsUUFBUSw2RkFBRSxVQUFVLHdEQUFhLGVBQWU7O0FBR3BILGlCQUFpQjtJQVY3QixPQUFPLEVBQUU7O0dBVUcsaUJBQWlCLENBd3JCN0I7OzRGQXhyQlksaUJBQWlCO2tCQVQ3QixTQUFTO2lDQUNJLElBQUksWUFDTixvQkFBb0IsV0FHckIsQ0FBQyxzQkFBc0IsQ0FBQyxXQUN4QixDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQyxRQUNoSixFQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUM7d0RBaUJqQyxrQkFBa0I7c0JBRGpCLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQWdCbEQsSUFBSTtzQkFESCxLQUFLO2dCQWVOLE9BQU87c0JBRE4sS0FBSztnQkFlRyxHQUFHO3NCQURYLEtBQUs7Z0JBY04sV0FBVztzQkFEVixLQUFLO2dCQTBCTixTQUFTO3NCQURSLEtBQUs7Z0JBWU4sU0FBUztzQkFEUixLQUFLO2dCQVlOLEtBQUs7c0JBREosS0FBSztnQkFZTixXQUFXO3NCQURWLEtBQUs7Z0JBZU4sTUFBTTtzQkFETCxLQUFLO2dCQWNOLFFBQVE7c0JBRFAsS0FBSztnQkFhTixLQUFLO3NCQURKLEtBQUs7Z0JBYU4sUUFBUTtzQkFEUCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBpbmplY3QsIElucHV0LCBWaWV3Q2hpbGQsIFJlbmRlcmVyMiwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljLCBFdmVudENvbnN0YW50cywgSGFuZGxlckxpa2UsIEhUTUxGb3JtVGFyZ2V0LCBLZXlWYWx1ZSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBDcnVkT3BlcmF0aW9ucywgT3BlcmF0aW9uS2V5cyB9IGZyb20gJ0BkZWNhZi10cy9kYi1kZWNvcmF0b3JzJztcbmltcG9ydCB7IEZvckFuZ3VsYXJNb2R1bGUgfSBmcm9tICcuLi8uLi9mb3ItYW5ndWxhci5tb2R1bGUnO1xuaW1wb3J0IHsgQ29sbGFwc2FibGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2NvbGxhcHNhYmxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJb25BY2NvcmRpb24sIElvbkFjY29yZGlvbkdyb3VwLCBJb25CdXR0b24sIElvbkl0ZW0sIElvbkxhYmVsLCBJb25MaXN0LCBJdGVtUmVvcmRlckV2ZW50RGV0YWlsLCBJb25SZW9yZGVyR3JvdXAsIElvblJlb3JkZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGNsZWFuU3BhY2VzLCBnZW5lcmF0ZVJhbmRvbVZhbHVlLCBpdGVtTWFwcGVyLCB3aW5kb3dFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi9oZWxwZXJzJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5neEJhc2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgYWxlcnRDaXJjbGVPdXRsaW5lLCBjcmVhdGVPdXRsaW5lIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSUZpZWxkU2V0SXRlbSwgSUZpZWxkU2V0VmFsaWRhdGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lL2ludGVyZmFjZXMnO1xuXG5cblxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEeW5hbWljIGZpZWxkc2V0IGNvbXBvbmVudCB3aXRoIGNvbGxhcHNpYmxlIGFjY29yZGlvbiBmdW5jdGlvbmFsaXR5LlxuICogQHN1bW1hcnkgVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBzb3BoaXN0aWNhdGVkIGZpZWxkc2V0IGNvbnRhaW5lciB0aGF0IGF1dG9tYXRpY2FsbHlcbiAqIGFkYXB0cyBpdHMgYmVoYXZpb3IgYmFzZWQgb24gQ1JVRCBvcGVyYXRpb25zLiBJdCBpbnRlZ3JhdGVzIHNlYW1sZXNzbHkgd2l0aCBJb25pYydzXG4gKiBhY2NvcmRpb24gY29tcG9uZW50cyB0byBjcmVhdGUgZXhwYW5kYWJsZS9jb2xsYXBzaWJsZSBzZWN0aW9ucyBmb3Igb3JnYW5pemluZyBmb3JtXG4gKiBjb250ZW50IGFuZCByZWxhdGVkIGluZm9ybWF0aW9uLiBUaGUgY29tcG9uZW50IGludGVsbGlnZW50bHkgZGV0ZXJtaW5lcyBpdHMgaW5pdGlhbFxuICogc3RhdGUgYmFzZWQgb24gdGhlIG9wZXJhdGlvbiB0eXBlLCBvcGVuaW5nIGF1dG9tYXRpY2FsbHkgZm9yIFJFQUQgYW5kIERFTEVURSBvcGVyYXRpb25zXG4gKiB3aGlsZSByZW1haW5pbmcgY2xvc2VkIGZvciBDUkVBVEUgYW5kIFVQREFURSBvcGVyYXRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8IS0tIEJhc2ljIHVzYWdlIHdpdGggYXV0b21hdGljIHN0YXRlIG1hbmFnZW1lbnQgLS0+XG4gKiA8bmd4LWRlY2FmLWZpZWxkc2V0XG4gKiAgIG5hbWU9XCJQZXJzb25hbCBJbmZvcm1hdGlvblwiXG4gKiAgIFtvcGVyYXRpb25dPVwiT3BlcmF0aW9uS2V5cy5SRUFEXCJcbiAqICAgdGFyZ2V0PVwiX3NlbGZcIj5cbiAqICAgPGlvbi1pbnB1dCBsYWJlbD1cIk5hbWVcIiBwbGFjZWhvbGRlcj1cIkVudGVyIG5hbWVcIj48L2lvbi1pbnB1dD5cbiAqICAgPGlvbi1pbnB1dCBsYWJlbD1cIkVtYWlsXCIgdHlwZT1cImVtYWlsXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBlbWFpbFwiPjwvaW9uLWlucHV0PlxuICogPC9uZ3gtZGVjYWYtZmllbGRzZXQ+XG4gKlxuICogPCEtLSBBZHZhbmNlZCB1c2FnZSB3aXRoIGN1c3RvbSBvcGVyYXRpb24gLS0+XG4gKiA8bmd4LWRlY2FmLWZpZWxkc2V0XG4gKiAgIG5hbWU9XCJDb250YWN0IERldGFpbHNcIlxuICogICBbb3BlcmF0aW9uXT1cImN1cnJlbnRPcGVyYXRpb25cIlxuICogICB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAqICAgPCEtLSBDb21wbGV4IGZvcm0gZmllbGRzIC0tPlxuICogPC9uZ3gtZGVjYWYtZmllbGRzZXQ+XG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICogICBwYXJ0aWNpcGFudCBGIGFzIEZpZWxkc2V0Q29tcG9uZW50XG4gKiAgIHBhcnRpY2lwYW50IEkgYXMgSW9uaWMgQWNjb3JkaW9uXG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRE9NXG4gKlxuICogICBGLT4+RjogbmdBZnRlclZpZXdJbml0KClcbiAqICAgYWx0IG9wZXJhdGlvbiBpcyBSRUFEIG9yIERFTEVURVxuICogICAgIEYtPj5GOiBTZXQgaXNPcGVuID0gdHJ1ZVxuICogICAgIEYtPj5EOiBRdWVyeSBhY2NvcmRpb24gZWxlbWVudFxuICogICAgIEYtPj5JOiBTZXQgdmFsdWUgYXR0cmlidXRlIHRvICdvcGVuJ1xuICogICAgIEYtPj5GOiBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cbiAqICAgZW5kXG4gKiAgIFUtPj5JOiBDbGljayBhY2NvcmRpb24gaGVhZGVyXG4gKiAgIEktPj5GOiBoYW5kbGVDaGFuZ2UoZXZlbnQpXG4gKiAgIEYtPj5GOiBVcGRhdGUgaXNPcGVuIHN0YXRlXG4gKiAgIEYtPj5JOiBSZWZsZWN0IG5ldyBzdGF0ZVxuICpcbiAqIEBtZW1iZXJPZiBGb3JBbmd1bGFyTW9kdWxlXG4gKi9cbkBEeW5hbWljKClcbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ25neC1kZWNhZi1maWVsZHNldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWVsZHNldC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpZWxkc2V0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbiAgaW1wb3J0czogW0ZvckFuZ3VsYXJNb2R1bGUsIElvbkFjY29yZGlvbkdyb3VwLCBJb25BY2NvcmRpb24sIElvbkxpc3QsIElvbkl0ZW0sIElvbkxhYmVsLCBJb25SZW9yZGVyLCBJb25CdXR0b24sIElvblJlb3JkZXJHcm91cCwgQ29sbGFwc2FibGVEaXJlY3RpdmVdLFxuICBob3N0OiB7J1thdHRyLmlkXSc6ICdvdmVycmlvZGUgJ30sXG59KVxuZXhwb3J0IGNsYXNzIEZpZWxkc2V0Q29tcG9uZW50IGV4dGVuZHMgTmd4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG5cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNlIHRvIHRoZSBpb24tYWNjb3JkaW9uLWdyb3VwIGNvbXBvbmVudCBmb3IgcHJvZ3JhbW1hdGljIGNvbnRyb2wuXG4gICAqIEBzdW1tYXJ5IFZpZXdDaGlsZCByZWZlcmVuY2UgdGhhdCBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBJb25pYyBhY2NvcmRpb24gZ3JvdXAgY29tcG9uZW50LlxuICAgKiBUaGlzIGVuYWJsZXMgcHJvZ3JhbW1hdGljIGNvbnRyb2wgb3ZlciB0aGUgYWNjb3JkaW9uJ3MgZXhwYW5kL2NvbGxhcHNlIHN0YXRlLCBhbGxvd2luZ1xuICAgKiB0aGUgY29tcG9uZW50IHRvIG9wZW4vY2xvc2UgdGhlIGFjY29yZGlvbiBiYXNlZCBvbiB2YWxpZGF0aW9uIGVycm9ycywgQ1JVRCBvcGVyYXRpb25zLFxuICAgKiBvciBvdGhlciBidXNpbmVzcyBsb2dpYyByZXF1aXJlbWVudHMuXG4gICAqXG4gICAqIEB0eXBlIHtJb25BY2NvcmRpb25Hcm91cH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBAVmlld0NoaWxkKCdhY2NvcmRpb25Db21wb25lbnQnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgYWNjb3JkaW9uQ29tcG9uZW50ITogSW9uQWNjb3JkaW9uR3JvdXA7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBkaXNwbGF5IG5hbWUgb3IgdGl0bGUgb2YgdGhlIGZpZWxkc2V0IHNlY3Rpb24uXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIGxlZ2VuZCBvciBoZWFkZXIgdGV4dCB0aGF0IGFwcGVhcnMgaW4gdGhlIGFjY29yZGlvbiBoZWFkZXIuIFRoaXMgdGV4dFxuICAgKiBwcm92aWRlcyBhIGNsZWFyIGxhYmVsIGZvciB0aGUgY29sbGFwc2libGUgc2VjdGlvbiwgaGVscGluZyB1c2VycyB1bmRlcnN0YW5kIHdoYXQgY29udGVudFxuICAgKiBpcyBjb250YWluZWQgd2l0aGluLiBUaGUgbmFtZSBpcyBkaXNwbGF5ZWQgcHJvbWluZW50bHkgYW5kIHNlcnZlcyBhcyB0aGUgY2xpY2thYmxlIGFyZWFcbiAgICogZm9yIGV4cGFuZGluZy9jb2xsYXBzaW5nIHRoZSBmaWVsZHNldC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ0NoaWxkJ1xuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG5hbWU6IHN0cmluZyA9ICdDaGlsZCc7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBwYXJlbnQgY29tcG9uZW50IGlkZW50aWZpZXIgZm9yIGhpZXJhcmNoaWNhbCBmaWVsZHNldCByZWxhdGlvbnNoaXBzLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIHBhcmVudCBjb21wb25lbnQgbmFtZSB0aGF0IHRoaXMgZmllbGRzZXQgYmVsb25ncyB0byBpbiBhIGhpZXJhcmNoaWNhbFxuICAgKiBmb3JtIHN0cnVjdHVyZS4gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGZvciBldmVudCBidWJibGluZyBhbmQgZXN0YWJsaXNoaW5nIHBhcmVudC1jaGlsZFxuICAgKiByZWxhdGlvbnNoaXBzIGJldHdlZW4gZmllbGRzZXRzIGluIGNvbXBsZXggZm9ybXMgd2l0aCBuZXN0ZWQgc3RydWN0dXJlcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ0NoaWxkJ1xuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGNoaWxkT2Y6IHN0cmluZyA9ICdDaGlsZCc7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBwYXJlbnQgY29tcG9uZW50IGlkZW50aWZpZXIgZm9yIGhpZXJhcmNoaWNhbCBmaWVsZHNldCByZWxhdGlvbnNoaXBzLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIHBhcmVudCBjb21wb25lbnQgbmFtZSB0aGF0IHRoaXMgZmllbGRzZXQgYmVsb25ncyB0byBpbiBhIGhpZXJhcmNoaWNhbFxuICAgKiBmb3JtIHN0cnVjdHVyZS4gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGZvciBldmVudCBidWJibGluZyBhbmQgZXN0YWJsaXNoaW5nIHBhcmVudC1jaGlsZFxuICAgKiByZWxhdGlvbnNoaXBzIGJldHdlZW4gZmllbGRzZXRzIGluIGNvbXBsZXggZm9ybXMgd2l0aCBuZXN0ZWQgc3RydWN0dXJlcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ0NoaWxkJ1xuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIHVpZDogc3RyaW5nID0gZ2VuZXJhdGVSYW5kb21WYWx1ZSgxMik7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1c3RvbSB0eXBlIGRlZmluaXRpb25zIGZvciBzcGVjaWFsaXplZCBmaWVsZHNldCBiZWhhdmlvci5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBjdXN0b20gZGF0YSB0eXBlcyBvciB2YWxpZGF0aW9uIHJ1bGVzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhpcyBmaWVsZHNldC5cbiAgICogQ2FuIGJlIGEgc2luZ2xlIHR5cGUgc3RyaW5nIG9yIGFycmF5IG9mIHR5cGVzIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgZmllbGRzZXQgaGFuZGxlc1xuICAgKiBkYXRhIHZhbGlkYXRpb24sIGZvcm1hdHRpbmcsIGFuZCBkaXNwbGF5IGJlaGF2aW9yIGZvciBzcGVjaWFsaXplZCB1c2UgY2FzZXMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBjdXN0b21UeXBlcyE6IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGN1cnJlbnQgQ1JVRCBvcGVyYXRpb24gY29udGV4dC5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB0aGUgY29tcG9uZW50J3MgaW5pdGlhbCBiZWhhdmlvciBhbmQgc3RhdGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgb3BlcmF0aW9uLlxuICAgKiBUaGlzIGlucHV0IGlzIGNydWNpYWwgZm9yIGF1dG8tc3RhdGUgbWFuYWdlbWVudDogUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnMgYXV0b21hdGljYWxseVxuICAgKiBvcGVuIHRoZSBmaWVsZHNldCB0byBzaG93IGNvbnRlbnQsIHdoaWxlIENSRUFURSBhbmQgVVBEQVRFIG9wZXJhdGlvbnMga2VlcCBpdCBjbG9zZWRcbiAgICogaW5pdGlhbGx5LiBUaGlzIHByb3ZpZGVzIGFuIGludHVpdGl2ZSB1c2VyIGV4cGVyaWVuY2UgYWxpZ25lZCB3aXRoIG9wZXJhdGlvbiBzZW1hbnRpY3MuXG4gICAqXG4gICAqIEB0eXBlIHtPcGVyYXRpb25LZXlzfVxuICAgKiBAZGVmYXVsdCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBDUlVEIG9wZXJhdGlvbiB0eXBlIGZvciB0aGUgY3VycmVudCBmaWVsZHNldCBjb250ZXh0LlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSBjb21wb25lbnQncyBpbml0aWFsIGJlaGF2aW9yIGFuZCBzdGF0ZSBiYXNlZCBvbiB0aGUgY3VycmVudCBvcGVyYXRpb24uXG4gICAqIFRoaXMgaW5wdXQgaXMgY3J1Y2lhbCBmb3IgYXV0by1zdGF0ZSBtYW5hZ2VtZW50OiBSRUFEIGFuZCBERUxFVEUgb3BlcmF0aW9ucyBhdXRvbWF0aWNhbGx5XG4gICAqIG9wZW4gdGhlIGZpZWxkc2V0IHRvIHNob3cgY29udGVudCwgd2hpbGUgQ1JFQVRFIGFuZCBVUERBVEUgb3BlcmF0aW9ucyBrZWVwIGl0IGNsb3NlZFxuICAgKiBpbml0aWFsbHkuIFRoaXMgcHJvdmlkZXMgYW4gaW50dWl0aXZlIHVzZXIgZXhwZXJpZW5jZSBhbGlnbmVkIHdpdGggb3BlcmF0aW9uIHNlbWFudGljcy5cbiAgICpcbiAgICogQHR5cGUge09wZXJhdGlvbktleXN9XG4gICAqIEBkZWZhdWx0IE9wZXJhdGlvbktleXMuUkVBRFxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyA9IE9wZXJhdGlvbktleXMuUkVBRDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWN0aXZlIGZvcm0gZ3JvdXAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmllbGRzZXQuXG4gICAqIEBzdW1tYXJ5IFRoZSBGb3JtR3JvdXAgaW5zdGFuY2UgdGhhdCBjb250YWlucyBhbGwgZm9ybSBjb250cm9scyB3aXRoaW4gdGhpcyBmaWVsZHNldC5cbiAgICogVXNlZCBmb3IgZm9ybSB2YWxpZGF0aW9uLCB2YWx1ZSBtYW5hZ2VtZW50LCBhbmQgaW50ZWdyYXRpb24gd2l0aCBBbmd1bGFyJ3MgcmVhY3RpdmUgZm9ybXMuXG4gICAqXG4gICAqIEB0eXBlIHtGb3JtR3JvdXB9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZm9ybUdyb3VwITogIEZvcm1BcnJheTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByaW1hcnkgdGl0bGUgdGV4dCBmb3IgdGhlIGZpZWxkc2V0IGNvbnRlbnQuXG4gICAqIEBzdW1tYXJ5IERpc3BsYXkgdGl0bGUgdXNlZCBmb3IgZmllbGRzZXQgaWRlbnRpZmljYXRpb24gYW5kIGNvbnRlbnQgb3JnYW5pemF0aW9uLlxuICAgKiBQcm92aWRlcyBzZW1hbnRpYyBtZWFuaW5nIHRvIHRoZSBncm91cGVkIGZvcm0gZmllbGRzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHRpdGxlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2Vjb25kYXJ5IGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBmaWVsZHNldC5cbiAgICogQHN1bW1hcnkgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IHByb3ZpZGVzIGNvbnRleHQgb3IgaW5zdHJ1Y3Rpb25zXG4gICAqIHJlbGF0ZWQgdG8gdGhlIGZpZWxkc2V0IGNvbnRlbnQgYW5kIHB1cnBvc2UuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZGVzY3JpcHRpb24hOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGb3JtIHRhcmdldCBhdHRyaWJ1dGUgZm9yIG5lc3RlZCBmb3JtIHN1Ym1pc3Npb25zLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hlcmUgdG8gZGlzcGxheSB0aGUgcmVzcG9uc2UgYWZ0ZXIgc3VibWl0dGluZyBmb3JtcyBjb250YWluZWQgd2l0aGluXG4gICAqIHRoZSBmaWVsZHNldC4gVGhpcyBhdHRyaWJ1dGUgbWlycm9ycyB0aGUgSFRNTCBmb3JtIHRhcmdldCBiZWhhdmlvciwgYWxsb3dpbmcgY29udHJvbCBvdmVyXG4gICAqIHdoZXRoZXIgZm9ybSBzdWJtaXNzaW9ucyBvcGVuIGluIHRoZSBzYW1lIHdpbmRvdywgbmV3IHdpbmRvdywgb3Igc3BlY2lmaWMgZnJhbWUuIFVzZWZ1bFxuICAgKiBmb3IgY29tcGxleCBmb3JtIHdvcmtmbG93cyBhbmQgbXVsdGktc3RlcCBwcm9jZXNzZXMuXG4gICAqXG4gICAqIEB0eXBlIHtIVE1MRm9ybVRhcmdldH1cbiAgICogQGRlZmF1bHQgJ19zZWxmJ1xuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHRhcmdldDogSFRNTEZvcm1UYXJnZXQgPSAnX3NlbGYnO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFbmFibGVzIG11bHRpcGxlIGl0ZW0gbWFuYWdlbWVudCB3aXRoaW4gdGhlIGZpZWxkc2V0LlxuICAgKiBAc3VtbWFyeSBCb29sZWFuIGZsYWcgdGhhdCBkZXRlcm1pbmVzIGlmIHRoZSBmaWVsZHNldCBzdXBwb3J0cyBhZGRpbmcgbXVsdGlwbGUgdmFsdWVzLlxuICAgKiBXaGVuIHRydWUsIGRpc3BsYXlzIGEgcmVvcmRlcmFibGUgbGlzdCBvZiBpdGVtcyB3aXRoIGFkZC9yZW1vdmUgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIHJhdyB2YWx1ZXMgc3RvcmVkIGluIHRoZSBmaWVsZHNldC5cbiAgICogQHN1bW1hcnkgQ29udGFpbnMgdGhlIGFjdHVhbCBkYXRhIHZhbHVlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgZmllbGRzZXQuXG4gICAqIFRoaXMgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGZpZWxkc2V0J3MgZGF0YSBzdGF0ZS5cbiAgICpcbiAgICogQHR5cGUge0tleVZhbHVlW119XG4gICAqIEBkZWZhdWx0IFtdXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdmFsdWU6IEtleVZhbHVlW10gPSBbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGZvciBjdXN0b20gZmllbGRzZXQgYWN0aW9ucy5cbiAgICogQHN1bW1hcnkgQSByZWNvcmQgb2YgZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMga2V5ZWQgYnkgZXZlbnQgbmFtZXMgdGhhdCBjYW4gYmUgdHJpZ2dlcmVkXG4gICAqIHdpdGhpbiB0aGUgZmllbGRzZXQuIFRoZXNlIGhhbmRsZXJzIHByb3ZpZGUgZXh0ZW5zaWJpbGl0eSBmb3IgY3VzdG9tIGJ1c2luZXNzIGxvZ2ljXG4gICAqIGFuZCBjYW4gYmUgaW52b2tlZCBmb3IgdmFyaW91cyBmaWVsZHNldCBvcGVyYXRpb25zIGFuZCB1c2VyIGludGVyYWN0aW9ucy5cbiAgICpcbiAgICogQHR5cGUge0hhbmRsZXJMaWtlfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGhhbmRsZXJzITogSGFuZGxlckxpa2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcnJheSBvZiBmb3JtYXR0ZWQgaXRlbXMgZm9yIFVJIGRpc3BsYXkuXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIHRoZSBwcm9jZXNzZWQgaXRlbXMgcmVhZHkgZm9yIGRpc3BsYXkgaW4gdGhlIGNvbXBvbmVudCB0ZW1wbGF0ZS5cbiAgICogVGhlc2UgaXRlbXMgYXJlIG1hcHBlZCBmcm9tIHRoZSByYXcgdmFsdWVzIHVzaW5nIHRoZSBtYXBwZXIgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHR5cGUge0lGaWVsZFNldEl0ZW1bXX1cbiAgICogQGRlZmF1bHQgW11cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBpdGVtczogSUZpZWxkU2V0SXRlbVtdID0gW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBmb3IgdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEhvbGRzIHRoZSBpdGVtIGJlaW5nIGVkaXRlZCB3aGVuIGluIHVwZGF0ZSBtb2RlLiBVc2VkIHRvIHRyYWNrXG4gICAqIHdoaWNoIGl0ZW0gaXMgYmVpbmcgbW9kaWZpZWQgYW5kIGFwcGx5IGNoYW5nZXMgdG8gdGhlIGNvcnJlY3QgaXRlbS5cbiAgICpcbiAgICogQHR5cGUge0lGaWVsZFNldEl0ZW0gfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgdXBkYXRpbmdJdGVtITogSUZpZWxkU2V0SXRlbSB8IHVuZGVmaW5lZDtcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudCBzdGF0ZSBvZiB0aGUgYWNjb3JkaW9uIChleHBhbmRlZCBvciBjb2xsYXBzZWQpLlxuICAgKiBAc3VtbWFyeSBCb29sZWFuIGZsYWcgdGhhdCB0cmFja3Mgd2hldGhlciB0aGUgZmllbGRzZXQgYWNjb3JkaW9uIGlzIGN1cnJlbnRseSBvcGVuIG9yIGNsb3NlZC5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhdXRvbWF0aWNhbGx5IG1hbmFnZWQgYmFzZWQgb24gdXNlciBpbnRlcmFjdGlvbnMgYW5kIGluaXRpYWwgb3BlcmF0aW9uIHN0YXRlLlxuICAgKiBJdCBzZXJ2ZXMgYXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBjb21wb25lbnQncyB2aXNpYmlsaXR5IHN0YXRlIGFuZCBpcyB1c2VkXG4gICAqIHRvIGNvb3JkaW5hdGUgYmV0d2VlbiB1c2VyIGFjdGlvbnMgYW5kIHByb2dyYW1tYXRpYyBzdGF0ZSBjaGFuZ2VzLiBUaGUgdmFsdWUgaXMgYXV0b21hdGljYWxseVxuICAgKiBzZXQgYmFzZWQgb24gQ1JVRCBvcGVyYXRpb25zIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQgdXBkYXRlZCB0aHJvdWdoIHVzZXIgaW50ZXJhY3Rpb25zLlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBpc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZHNldCBjb250YWlucyByZXF1aXJlZCBmb3JtIGZpZWxkcy5cbiAgICogQHN1bW1hcnkgQm9vbGVhbiBmbGFnIHRoYXQgc2lnbmFscyB0aGUgcHJlc2VuY2Ugb2YgbWFuZGF0b3J5IGlucHV0IGZpZWxkcyB3aXRoaW4gdGhlIGZpZWxkc2V0LlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIGF1dG9tYXRpY2FsbHkgc2V0IGJ5IHRoZSBDb2xsYXBzYWJsZURpcmVjdGl2ZSB3aGVuIHJlcXVpcmVkIGZpZWxkcyBhcmUgZGV0ZWN0ZWQsXG4gICAqIGFuZCBjYW4gYmUgdXNlZCB0byBhcHBseSBzcGVjaWFsIHN0eWxpbmcsIHZhbGlkYXRpb24gbG9naWMsIG9yIFVJIGluZGljYXRvcnMgdG8gaGlnaGxpZ2h0XG4gICAqIGZpZWxkc2V0cyB0aGF0IGNvbnRhaW4gbWFuZGF0b3J5IGluZm9ybWF0aW9uLiBJdCBoZWxwcyB3aXRoIGZvcm0gdmFsaWRhdGlvbiBmZWVkYmFjayBhbmRcbiAgICogdXNlciBleHBlcmllbmNlIGJ5IG1ha2luZyByZXF1aXJlZCBzZWN0aW9ucyBtb3JlIHByb21pbmVudC5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaXNSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkc2V0IGNvbnRhaW5zIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKiBAc3VtbWFyeSBCb29sZWFuIGZsYWcgdGhhdCB0cmFja3MgaWYgYW55IGZvcm0gZmllbGRzIHdpdGhpbiB0aGUgZmllbGRzZXQgaGF2ZSB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGNvbnRyb2wgYWNjb3JkaW9uIGJlaGF2aW9yIHdoZW4gZXJyb3JzIGFyZSBwcmVzZW50LCBwcmV2ZW50aW5nXG4gICAqIHVzZXJzIGZyb20gY29sbGFwc2luZyB0aGUgYWNjb3JkaW9uIHdoZW4gdGhleSBuZWVkIHRvIHNlZSBhbmQgYWRkcmVzcyB2YWxpZGF0aW9uIGlzc3Vlcy5cbiAgICogSXQncyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgd2hlbiB2YWxpZGF0aW9uIGVycm9yIGV2ZW50cyBhcmUgcmVjZWl2ZWQgZnJvbSBjaGlsZCBmb3JtIGZpZWxkcy5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFzVmFsaWRhdGlvbkVycm9yczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlIGZvciBkdXBsaWNhdGUgdmFsdWVzLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGVycm9yIG1lc3NhZ2Ugd2hlbiBhIHVzZXIgYXR0ZW1wdHMgdG8gYWRkIGEgZHVwbGljYXRlIHZhbHVlXG4gICAqIHRvIHRoZSBmaWVsZHNldC4gVXNlZCB0byBkaXNwbGF5IHVuaXF1ZW5lc3MgdmFsaWRhdGlvbiBmZWVkYmFjay5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBpc1VuaXF1ZUVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gQ1JVRCBvcGVyYXRpb24gY29uc3RhbnRzIGZvciB0ZW1wbGF0ZSB1c2FnZS5cbiAgICogQHN1bW1hcnkgRXhwb3NlcyB0aGUgT3BlcmF0aW9uS2V5cyBlbnVtIHRvIHRoZSBjb21wb25lbnQgdGVtcGxhdGUsIGVuYWJsaW5nIGNvbmRpdGlvbmFsXG4gICAqIHJlbmRlcmluZyBhbmQgYmVoYXZpb3IgYmFzZWQgb24gb3BlcmF0aW9uIHR5cGVzLiBUaGlzIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0eSBlbnN1cmVzXG4gICAqIHRoYXQgdGVtcGxhdGUgbG9naWMgY2FuIGFjY2VzcyBvcGVyYXRpb24gY29uc3RhbnRzIHdoaWxlIG1haW50YWluaW5nIGVuY2Fwc3VsYXRpb24gYW5kXG4gICAqIHByZXZlbnRpbmcgYWNjaWRlbnRhbCBtb2RpZmljYXRpb24gb2YgdGhlIGVudW0gdmFsdWVzLlxuICAgKlxuICAgKiBAdHlwZSB7Q3J1ZE9wZXJhdGlvbnN9XG4gICAqIEBkZWZhdWx0IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IE9wZXJhdGlvbktleXM6IENydWRPcGVyYXRpb25zID0gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24gc2VydmljZS5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgc2VydmljZSB0aGF0IHByb3ZpZGVzIG1hbnVhbCBjb250cm9sIG92ZXIgY2hhbmdlIGRldGVjdGlvbiBjeWNsZXMuXG4gICAqIFRoaXMgaXMgZXNzZW50aWFsIGZvciBlbnN1cmluZyB0aGF0IHByb2dyYW1tYXRpYyBET00gY2hhbmdlcyAobGlrZSBzZXR0aW5nIGFjY29yZGlvblxuICAgKiBhdHRyaWJ1dGVzKSBhcmUgcHJvcGVybHkgcmVmbGVjdGVkIGluIHRoZSBjb21wb25lbnQncyBzdGF0ZSBhbmQgdHJpZ2dlciBhcHByb3ByaWF0ZVxuICAgKiB2aWV3IHVwZGF0ZXMgd2hlbiBtb2RpZmljYXRpb25zIG9jY3VyIG91dHNpZGUgdGhlIG5vcm1hbCBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24gZmxvdy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0NoYW5nZURldGVjdG9yUmVmfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFuZ3VsYXIgUmVuZGVyZXIyIHNlcnZpY2UgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbi5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgc2VydmljZSB0aGF0IHByb3ZpZGVzIGEgc2FmZSwgcGxhdGZvcm0tYWdub3N0aWMgd2F5IHRvIG1hbmlwdWxhdGUgRE9NIGVsZW1lbnRzLlxuICAgKiBUaGlzIHNlcnZpY2UgZW5zdXJlcyBwcm9wZXIgaGFuZGxpbmcgb2YgRE9NIG9wZXJhdGlvbnMgYWNyb3NzIGRpZmZlcmVudCBwbGF0Zm9ybXMgYW5kIGVudmlyb25tZW50cyxcbiAgICogaW5jbHVkaW5nIHNlcnZlci1zaWRlIHJlbmRlcmluZyBhbmQgd2ViIHdvcmtlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZW5kZXJlcjJ9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUcmFuc2xhdGlvbiBzZXJ2aWNlIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbi5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgc2VydmljZSB0aGF0IHByb3ZpZGVzIHRyYW5zbGF0aW9uIGNhcGFiaWxpdGllcyBmb3IgVUkgdGV4dC5cbiAgICogVXNlZCB0byB0cmFuc2xhdGUgYnV0dG9uIGxhYmVscyBhbmQgdmFsaWRhdGlvbiBtZXNzYWdlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBsb2NhbGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtUcmFuc2xhdGVTZXJ2aWNlfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvY2FsaXplZCBsYWJlbCB0ZXh0IGZvciBhY3Rpb24gYnV0dG9ucy5cbiAgICogQHN1bW1hcnkgRHluYW1pYyBidXR0b24gbGFiZWwgdGhhdCBjaGFuZ2VzIGJhc2VkIG9uIHRoZSBjdXJyZW50IG9wZXJhdGlvbiBtb2RlLlxuICAgKiBTaG93cyBcIkFkZFwiIGZvciBjcmVhdGUgb3BlcmF0aW9ucyBhbmQgXCJVcGRhdGVcIiBmb3IgZWRpdCBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGJ1dHRvbkxhYmVsITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IGNvbnN0cnVjdG9yIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIGZpZWxkc2V0IHdpdGggaWNvbnMgYW5kIGNvbXBvbmVudCBuYW1lLlxuICAgKiBAc3VtbWFyeSBDYWxscyB0aGUgcGFyZW50IE5neEJhc2VDb21wb25lbnQgY29uc3RydWN0b3Igd2l0aCB0aGUgY29tcG9uZW50IG5hbWUgYW5kXG4gICAqIHJlcXVpcmVkIElvbmljIGljb25zIChhbGVydENpcmNsZU91dGxpbmUgZm9yIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBjcmVhdGVPdXRsaW5lIGZvciBhZGQgYWN0aW9ucykuXG4gICAqIFNldHMgdXAgdGhlIGZvdW5kYXRpb25hbCBjb21wb25lbnQgc3RydWN0dXJlIGFuZCBpY29uIHJlZ2lzdHJ5LlxuICAgKlxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdGaWVsZHNldENvbXBvbmVudCcsIHthbGVydENpcmNsZU91dGxpbmUsIGNyZWF0ZU91dGxpbmV9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IGluaXRpYWxpemF0aW9uIGxpZmVjeWNsZSBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgYnkgc2V0dGluZyB1cCByZXBvc2l0b3J5IHJlbGF0aW9uc2hpcHMgaWYgYSBtb2RlbCBleGlzdHMsXG4gICAqIGFuZCBjb25maWd1cmVzIHRoZSBpbml0aWFsIGJ1dHRvbiBsYWJlbCBmb3IgdGhlIGFkZCBhY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLlxuICAgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHByb3BlciBzZXR1cCBvZiB0cmFuc2xhdGlvbiBzZXJ2aWNlcyBhbmQgY29tcG9uZW50IHN0YXRlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZih0aGlzLm1vZGVsKVxuICAgICAgdGhpcy5fcmVwb3NpdG9yeSA9IHRoaXMucmVwb3NpdG9yeTtcbiAgICB0aGlzLmJ1dHRvbkxhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5sb2NhbGUgKyAnLmFkZCcpO1xuICB9XG5cbiAgIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudCBzdGF0ZSBhZnRlciB2aWV3IGFuZCBjaGlsZCBjb21wb25lbnRzIGFyZSByZW5kZXJlZC5cbiAgICogQHN1bW1hcnkgVGhpcyBsaWZlY3ljbGUgaG9vayBpbXBsZW1lbnRzIGludGVsbGlnZW50IGF1dG8tc3RhdGUgbWFuYWdlbWVudCBiYXNlZCBvbiB0aGUgY3VycmVudFxuICAgKiBDUlVEIG9wZXJhdGlvbi4gRm9yIFJFQUQgYW5kIERFTEVURSBvcGVyYXRpb25zLCB0aGUgZmllbGRzZXQgYXV0b21hdGljYWxseSBvcGVucyB0byBwcm92aWRlXG4gICAqIGltbWVkaWF0ZSBhY2Nlc3MgdG8gaW5mb3JtYXRpb24sIHdoaWxlIENSRUFURSBhbmQgVVBEQVRFIG9wZXJhdGlvbnMga2VlcCBpdCBjbG9zZWQgdG8gbWFpbnRhaW5cbiAgICogYSBjbGVhbiBpbml0aWFsIGludGVyZmFjZS4gVGhlIG1ldGhvZCBkaXJlY3RseSBtYW5pcHVsYXRlcyB0aGUgRE9NIHRvIGVuc3VyZSBwcm9wZXIgYWNjb3JkaW9uXG4gICAqIHN5bmNocm9uaXphdGlvbiBhbmQgdHJpZ2dlcnMgY2hhbmdlIGRldGVjdGlvbiB0byByZWZsZWN0IHRoZSBwcm9ncmFtbWF0aWMgc3RhdGUgY2hhbmdlcy5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBbmd1bGFyIExpZmVjeWNsZVxuICAgKiAgIHBhcnRpY2lwYW50IEYgYXMgRmllbGRzZXRDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIERPTVxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2hhbmdlRGV0ZWN0b3JcbiAgICpcbiAgICogICBBLT4+RjogbmdBZnRlclZpZXdJbml0KClcbiAgICogICBhbHQgb3BlcmF0aW9uIGlzIFJFQUQgb3IgREVMRVRFXG4gICAqICAgICBGLT4+RjogU2V0IGlzT3BlbiA9IHRydWVcbiAgICogICAgIEYtPj5EOiBRdWVyeSBpb24tYWNjb3JkaW9uLWdyb3VwIGVsZW1lbnRcbiAgICogICAgIGFsdCBhY2NvcmRpb24gZWxlbWVudCBleGlzdHNcbiAgICogICAgICAgRi0+PkQ6IFNldCB2YWx1ZSBhdHRyaWJ1dGUgdG8gJ29wZW4nXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICogICBGLT4+QzogZGV0ZWN0Q2hhbmdlcygpXG4gICAqICAgQy0+PkY6IFVwZGF0ZSB2aWV3IHdpdGggbmV3IHN0YXRlXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuUkVBRCB8fCB0aGlzLm9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5ERUxFVEUpIHtcbiAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAgIC8vIGhpZGRlbiByZW1vdmUgYnV0dG9uXG4gICAgICBjb25zdCBhY2NvcmRpb25FbGVtZW50ID0gdGhpcy5jb21wb25lbnQ/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW9uLWFjY29yZGlvbi1ncm91cCcpO1xuICAgICAgaWYodGhpcy5hY2NvcmRpb25Db21wb25lbnQpXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGFjY29yZGlvbkVsZW1lbnQsICd2YWx1ZScsICdvcGVuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlucHV0cyA9IHRoaXMuY29tcG9uZW50Py5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tyZXF1aXJlZF0nKTtcbiAgICAgIHRoaXMuaXNSZXF1aXJlZCA9IGlucHV0cy5sZW5ndGggPiAwO1xuICAgICAgaWYodGhpcy5pc1JlcXVpcmVkKSB7XG4gICAgICAgIHRoaXMuYWNjb3JkaW9uQ29tcG9uZW50LnZhbHVlID0gJ29wZW4nO1xuICAgICAgICB0aGlzLmhhbmRsZUFjY29yZGlvblRvZ2dsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyByZW1vdmFsIG9mIHRoZSBmaWVsZHNldCB3aXRoIHNsaWRlIGFuaW1hdGlvbi5cbiAgICogQHN1bW1hcnkgSW5pdGlhdGVzIHRoZSByZW1vdmFsIHByb2Nlc3MgZm9yIHRoZSBmaWVsZHNldCB3aXRoIGEgc21vb3RoIHNsaWRlLXVwIGFuaW1hdGlvbi5cbiAgICogVGhlIG1ldGhvZCBhcHBsaWVzIENTUyBjbGFzc2VzIGZvciB0aGUgc2xpZGUgYW5pbWF0aW9uIGFuZCB0aGVuIHNhZmVseSByZW1vdmVzIHRoZVxuICAgKiBlbGVtZW50IGZyb20gdGhlIERPTSB1c2luZyBSZW5kZXJlcjIuIFRoaXMgcHJvdmlkZXMgYSBwb2xpc2hlZCB1c2VyIGV4cGVyaWVuY2VcbiAgICogd2hlbiByZW1vdmluZyBmaWVsZHNldCBpbnN0YW5jZXMgZnJvbSBkeW5hbWljIGZvcm1zLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIERPTSBldmVudCBmcm9tIHRoZSByZW1vdmUgYnV0dG9uIGNsaWNrXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGhhbmRsZVJlbW92ZUNvbXBvbmVudChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2RjZi1hbmltYXRpb24nLCAnZGNmLWFuaW1hdGlvbi1zbGlkZS10b3AtbWVkaXVtJywgJ2RjZi1hbmltYXRpb24tcmV2ZXJzZScsICdkY2YtYW5pbWF0aW9uLWZhc3QnKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIFVzZSBSZW5kZXJlcjIgdG8gc2FmZWx5IHJlbW92ZSB0aGUgZWxlbWVudFxuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5yZW5kZXJlci5wYXJlbnROb2RlKHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgaWYgKHBhcmVudClcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChwYXJlbnQsIHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIH0sIDE1MCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBjcmVhdGluZyBuZXcgaXRlbXMgb3IgdHJpZ2dlcmluZyBncm91cCBhZGRpdGlvbiBldmVudHMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBmb3JtIHZhbGlkYXRpb24gZXZlbnRzIGZvciBpdGVtIGNyZWF0aW9uIG9yIGVtaXRzIGV2ZW50cyB0byB0cmlnZ2VyXG4gICAqIHRoZSBhZGRpdGlvbiBvZiBuZXcgZmllbGRzZXQgZ3JvdXBzLiBXaGVuIGNhbGxlZCB3aXRoIHZhbGlkYXRpb24gZXZlbnQgZGF0YSwgaXQgdmFsaWRhdGVzXG4gICAqIHVuaXF1ZW5lc3MgYW5kIGFkZHMgdGhlIGl0ZW0gdG8gdGhlIGZpZWxkc2V0LiBXaGVuIGNhbGxlZCB3aXRob3V0IHBhcmFtZXRlcnMsIGl0IHRyaWdnZXJzXG4gICAqIGEgZ3JvdXAgYWRkaXRpb24gZXZlbnQgZm9yIHBhcmVudCBjb21wb25lbnRzIHRvIGhhbmRsZS5cbiAgICpcbiAgICogQHBhcmFtIHtDdXN0b21FdmVudDxJRmllbGRTZXRWYWxpZGF0aW9uRXZlbnQ+fSBbZXZlbnRdIC0gT3B0aW9uYWwgdmFsaWRhdGlvbiBldmVudCBjb250YWluaW5nIGZvcm0gZGF0YVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQ2FsbGVkIGZyb20gZm9ybSB2YWxpZGF0aW9uXG4gICAqIGhhbmRsZUNyZWF0ZUl0ZW0odmFsaWRhdGlvbkV2ZW50KTtcbiAgICpcbiAgICogLy8gQ2FsbGVkIHRvIHRyaWdnZXIgZ3JvdXAgYWRkaXRpb25cbiAgICogaGFuZGxlQ3JlYXRlSXRlbSgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGhhbmRsZUNyZWF0ZUl0ZW0oZXZlbnQ/OiBDdXN0b21FdmVudDxJRmllbGRTZXRWYWxpZGF0aW9uRXZlbnQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYoZXZlbnQgJiYgZXZlbnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCB7Zm9ybUdyb3VwLCB2YWx1ZSwgaXNWYWxpZH0gPSBldmVudC5kZXRhaWw7XG4gICAgICB0aGlzLmZvcm1Hcm91cCA9IGZvcm1Hcm91cCBhcyBGb3JtQXJyYXk7XG4gICAgICBpZighdGhpcy5tYXBwZXIpXG4gICAgICAgIHRoaXMubWFwcGVyID0gdGhpcy5nZXRNYXBwZXIodmFsdWUgYXMgS2V5VmFsdWUpO1xuICAgICAgaWYoaXNWYWxpZCApe1xuICAgICAgICAgIHRoaXMuaXNVbmlxdWVFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB0aGlzLmJ1dHRvbkxhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5sb2NhbGUgKyAnLmFkZCcpO1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgdGhpcy5pc1VuaXF1ZUVycm9yID0gKHZhbHVlIGFzIEtleVZhbHVlKT8uW3RoaXMucGtdIHx8IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93RXZlbnRFbWl0dGVyKEV2ZW50Q29uc3RhbnRzLkZJRUxEU0VUX0FERF9HUk9VUCwge1xuICAgICAgICBjb21wb25lbnQ6IHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIGluZGV4OiB0aGlzLnZhbHVlPy5sZW5ndGgsXG4gICAgICAgIHBhcmVudDogdGhpcy5jaGlsZE9mLFxuICAgICAgICBvcGVyYXRpb246ICF0aGlzLnVwZGF0aW5nSXRlbSA/IE9wZXJhdGlvbktleXMuQ1JFQVRFIDogT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGl0ZW0gdXBkYXRlIG9wZXJhdGlvbnMgd2l0aCBmb3JtIHN0YXRlIG1hbmFnZW1lbnQuXG4gICAqIEBzdW1tYXJ5IExvY2F0ZXMgYW4gaXRlbSBpbiB0aGUgZm9ybSBhcnJheSBmb3IgZWRpdGluZyBhbmQgcHJlcGFyZXMgdGhlIGNvbXBvbmVudFxuICAgKiBmb3IgdXBkYXRlIG1vZGUuIFVwZGF0ZXMgdGhlIGJ1dHRvbiBsYWJlbCB0byByZWZsZWN0IHRoZSBlZGl0IHN0YXRlIGFuZCBzdG9yZXNcbiAgICogdGhlIGl0ZW0gYmVpbmcgdXBkYXRlZC4gVHJpZ2dlcnMgYSB3aW5kb3cgZXZlbnQgdG8gbm90aWZ5IHBhcmVudCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdmFsdWUgLSBUaGUgaWRlbnRpZmllciB2YWx1ZSBvZiB0aGUgaXRlbSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGFycmF5IGluZGV4IHBvc2l0aW9uIG9mIHRoZSBpdGVtXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGhhbmRsZVVwZGF0ZUl0ZW0odmFsdWU6IHN0cmluZyB8IG51bWJlciwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5maW5kKGNvbnRyb2wgPT4gYCR7Y29udHJvbC5nZXQodGhpcy5wayk/LnZhbHVlfWAudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5TcGFjZXMoYCR7dmFsdWV9YCwgdHJ1ZSkpIGFzIEZvcm1Db250cm9sO1xuICAgIGlmKGl0ZW0pIHtcbiAgICAgIHRoaXMuYnV0dG9uTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmxvY2FsZSArICcudXBkYXRlJyk7XG4gICAgICB0aGlzLnVwZGF0aW5nSXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0udmFsdWUgfHwge30pO1xuICAgICAgd2luZG93RXZlbnRFbWl0dGVyKEV2ZW50Q29uc3RhbnRzLkZJRUxEU0VUX1VQREFURV9HUk9VUCwge1xuICAgICAgICBwYXJlbnQ6IHRoaXMuY2hpbGRPZixcbiAgICAgICAgY29tcG9uZW50OiB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2FuY2VscyB0aGUgdXBkYXRlIG1vZGUgYW5kIHJlc2V0cyB0aGUgVUkgc3RhdGUuXG4gICAqIEBzdW1tYXJ5IEV4aXRzIHRoZSB1cGRhdGUgbW9kZSBieSByZXNldHRpbmcgdGhlIGJ1dHRvbiBsYWJlbCBhbmQgY2xlYXJpbmcgdGhlIHVwZGF0aW5nIGl0ZW0sXG4gICAqIHJlc3RvcmluZyB0aGUgY29tcG9uZW50IHRvIGl0cyBkZWZhdWx0IHN0YXRlIGZvciBhZGRpbmcgbmV3IGl0ZW1zLiBOb3RpZmllcyBwYXJlbnQgY29tcG9uZW50c1xuICAgKiB0aGF0IHRoZSB1cGRhdGUgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZC5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlQ2FuY2VsVXBkYXRlSXRlbSgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1dHRvbkxhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5sb2NhbGUgKyAnLmFkZCcpO1xuICAgIHRoaXMudXBkYXRpbmdJdGVtID0gdW5kZWZpbmVkO1xuICAgIHdpbmRvd0V2ZW50RW1pdHRlcihFdmVudENvbnN0YW50cy5GSUVMRFNFVF9VUERBVEVfR1JPVVAsIHtcbiAgICAgIHBhcmVudDogdGhpcy5jaGlsZE9mLFxuICAgICAgY29tcG9uZW50OiB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgaW5kZXg6IHRoaXMudmFsdWU/Lmxlbmd0aFxuICAgIH0pO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgaXRlbSByZW1vdmFsIG9wZXJhdGlvbnMgd2l0aCBmb3JtIGFycmF5IG1hbmFnZW1lbnQuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBpdGVtIHJlbW92YWwgYnkgZWl0aGVyIGhhbmRsaW5nIHZhbGlkYXRpb24gZXZlbnRzIG9yIHJlbW92aW5nIHNwZWNpZmljXG4gICAqIGl0ZW1zIGZyb20gdGhlIGZvcm0gYXJyYXkuIFdoZW4gY2FsbGVkIHdpdGggYSB2YWxpZGF0aW9uIGV2ZW50LCBpdCB0cmlnZ2VycyB2YWx1ZSB1cGRhdGVzLlxuICAgKiBXaGVuIGNhbGxlZCB3aXRoIGFuIGlkZW50aWZpZXIsIGl0IGxvY2F0ZXMgYW5kIHJlbW92ZXMgdGhlIG1hdGNoaW5nIGl0ZW0gZnJvbSB0aGUgZm9ybSBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHZhbHVlIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIGl0ZW0gdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IFtldmVudF0gLSBPcHRpb25hbCB2YWxpZGF0aW9uIGV2ZW50IGZvciBmb3JtIHVwZGF0ZXNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlUmVtb3ZlSXRlbSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBldmVudD86IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgaWYoZXZlbnQgJiYgZXZlbnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm4gdGhpcy5zZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZvcm1Hcm91cCBhcyBGb3JtQXJyYXk7XG4gICAgY29uc3QgYXJyYXlMZW5ndGggPSBmb3JtQXJyYXkubGVuZ3RoO1xuICAgIGZvciAobGV0IGluZGV4ID0gYXJyYXlMZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgICBjb25zdCBncm91cCA9IGZvcm1BcnJheS5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgICAgaWYgKGNsZWFuU3BhY2VzKGdyb3VwLmdldCh0aGlzLnBrKT8udmFsdWUpID09PSBjbGVhblNwYWNlcyh2YWx1ZSBhcyBzdHJpbmcpKSB7XG4gICAgICAgIHdpbmRvd0V2ZW50RW1pdHRlcihFdmVudENvbnN0YW50cy5GSUVMRFNFVF9SRU1PVkVfR1JPVVAsIHtcbiAgICAgICAgICBwYXJlbnQ6IHRoaXMuY2hpbGRPZixcbiAgICAgICAgICBjb21wb25lbnQ6IHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgZm9ybUdyb3VwOiBncm91cFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyByZW9yZGVyaW5nIG9mIGl0ZW1zIHdpdGhpbiB0aGUgZmllbGRzZXQgbGlzdC5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGRyYWctYW5kLWRyb3AgcmVvcmRlciBldmVudHMgZnJvbSB0aGUgaW9uLXJlb3JkZXItZ3JvdXAgY29tcG9uZW50LlxuICAgKiBVcGRhdGVzIGJvdGggdGhlIGRpc3BsYXkgaXRlbXMgYXJyYXkgYW5kIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGFycmF5IHRvIG1haW50YWluXG4gICAqIGNvbnNpc3RlbmN5IGJldHdlZW4gVUkgc3RhdGUgYW5kIGRhdGEgc3RhdGUuIFByZXNlcnZlcyBpdGVtIGluZGljZXMgYWZ0ZXIgcmVvcmRlcmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtDdXN0b21FdmVudDxJdGVtUmVvcmRlckV2ZW50RGV0YWlsPn0gZXZlbnQgLSBJb25pYyByZW9yZGVyIGV2ZW50IGNvbnRhaW5pbmcgc291cmNlIGFuZCB0YXJnZXQgaW5kaWNlc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYGh0bWxcbiAgICogPGlvbi1yZW9yZGVyLWdyb3VwIChpb25JdGVtUmVvcmRlcik9XCJoYW5kbGVSZW9yZGVyKCRldmVudClcIj5cbiAgICogICA8IS0tIFJlb3JkZXJhYmxlIGl0ZW1zIC0tPlxuICAgKiA8L2lvbi1yZW9yZGVyLWdyb3VwPlxuICAgKiBgYGBcbiAgICovXG4gIGhhbmRsZVJlb3JkZXJJdGVtcyhldmVudDogQ3VzdG9tRXZlbnQ8SXRlbVJlb3JkZXJFdmVudERldGFpbD4pOiB2b2lkIHtcbiAgIGNvbnN0IGZyb21JbmRleCA9IGV2ZW50LmRldGFpbC5mcm9tO1xuICAgIGNvbnN0IHRvSW5kZXggPSBldmVudC5kZXRhaWwudG87XG5cbiAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzLml0ZW1zXTsgLy8gc3VhIGVzdHJ1dHVyYSB2aXN1YWxcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZvcm1Hcm91cCBhcyBGb3JtQXJyYXk7IC8vIEZvcm1BcnJheSByZWF0aXZvXG5cbiAgICBpZiAoZnJvbUluZGV4ICE9PSB0b0luZGV4KSB7XG4gICAgICAvLyBSZW9yZGVuYXIgb3MgZGFkb3MgdmlzdWFpc1xuICAgICAgY29uc3QgaXRlbVRvTW92ZSA9IGl0ZW1zLnNwbGljZShmcm9tSW5kZXgsIDEpWzBdO1xuICAgICAgaXRlbXMuc3BsaWNlKHRvSW5kZXgsIDAsIGl0ZW1Ub01vdmUpO1xuICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IGl0ZW1bJ2luZGV4J10gPSBpbmRleCArIDEpO1xuXG4gICAgICAvLyBSZW9yZGVuYXIgb3MgY29udHJvbGVzIGRvIEZvcm1BcnJheVxuICAgICAgY29uc3QgY29udHJvbFRvTW92ZSA9IGZvcm1BcnJheS5hdChmcm9tSW5kZXgpO1xuICAgICAgZm9ybUFycmF5LnJlbW92ZUF0KGZyb21JbmRleCk7XG4gICAgICBmb3JtQXJyYXkuaW5zZXJ0KHRvSW5kZXgsIGNvbnRyb2xUb01vdmUpO1xuICAgIH1cbiAgICAvLyBGaW5hbGl6YSBhIG9wZXJhw6fDo28gZGUgcmVvcmRlciBkbyBJb25pY1xuICAgIGV2ZW50LmRldGFpbC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGFjY29yZGlvbiBzdGF0ZSBjaGFuZ2UgZXZlbnRzIGZyb20gdXNlciBpbnRlcmFjdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBDdXN0b21FdmVudCBvYmplY3RzIHRyaWdnZXJlZCB3aGVuIHVzZXJzIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgYWNjb3JkaW9uLlxuICAgKiBUaGlzIG1ldGhvZCBleHRyYWN0cyB0aGUgbmV3IHN0YXRlIGZyb20gdGhlIGV2ZW50IGRldGFpbHMgYW5kIHVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzXG4gICAqIGludGVybmFsIHN0YXRlIGFjY29yZGluZ2x5LiBJdCBzcGVjaWZpY2FsbHkgbGlzdGVucyBmb3IgSU9OLUFDQ09SRElPTi1HUk9VUCBldmVudHMgdG9cbiAgICogZW5zdXJlIHByb3BlciBldmVudCBzb3VyY2UgdmFsaWRhdGlvbiBhbmQgcHJldmVudCBoYW5kbGluZyBvZiB1bnJlbGF0ZWQgZXZlbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCAtIFRoZSBldmVudCBvYmplY3QgY29udGFpbmluZyBhY2NvcmRpb24gc3RhdGUgY2hhbmdlIGRldGFpbHNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICAgKiAgIHBhcnRpY2lwYW50IEkgYXMgSW9uLUFjY29yZGlvblxuICAgKiAgIHBhcnRpY2lwYW50IEYgYXMgRmllbGRzZXRDb21wb25lbnRcbiAgICpcbiAgICogICBVLT4+STogQ2xpY2sgYWNjb3JkaW9uIGhlYWRlclxuICAgKiAgIEktPj5GOiBoYW5kbGVDaGFuZ2UoQ3VzdG9tRXZlbnQpXG4gICAqICAgRi0+PkY6IEV4dHJhY3QgdGFyZ2V0IGFuZCBkZXRhaWwgZnJvbSBldmVudFxuICAgKiAgIEYtPj5GOiBWYWxpZGF0ZSB0YXJnZXQgaXMgSU9OLUFDQ09SRElPTi1HUk9VUFxuICAgKiAgIGFsdCB2YWxpZCB0YXJnZXRcbiAgICogICAgIEYtPj5GOiBVcGRhdGUgaXNPcGVuID0gISF2YWx1ZVxuICAgKiAgIGVuZFxuICAgKiAgIEYtPj5JOiBSZWZsZWN0IHVwZGF0ZWQgc3RhdGVcbiAgICpcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBhY2NvcmRpb24gdG9nZ2xlIGZ1bmN0aW9uYWxpdHkgd2l0aCB2YWxpZGF0aW9uIGVycm9yIGNvbnNpZGVyYXRpb24uXG4gICAqIEBzdW1tYXJ5IE1hbmFnZXMgdGhlIGV4cGFuZC9jb2xsYXBzZSBzdGF0ZSBvZiB0aGUgYWNjb3JkaW9uIHdoaWxlIHJlc3BlY3RpbmcgdmFsaWRhdGlvbiBlcnJvciBzdGF0ZXMuXG4gICAqIFdoZW4gdmFsaWRhdGlvbiBlcnJvcnMgYXJlIHByZXNlbnQsIHRoZSBhY2NvcmRpb24gY2Fubm90IGJlIGNvbGxhcHNlZCB0byBlbnN1cmUgdXNlcnMgY2FuIHNlZVxuICAgKiBhbmQgYWRkcmVzcyB0aGUgZXJyb3JzLiBXaGVuIG5vIGVycm9ycyBleGlzdCwgdXNlcnMgY2FuIGZyZWVseSB0b2dnbGUgdGhlIGFjY29yZGlvbiBzdGF0ZS5cbiAgICogVGhpcyBtZXRob2QgYWxzbyBzdG9wcyBldmVudCBwcm9wYWdhdGlvbiB0byBwcmV2ZW50IHVud2FudGVkIHNpZGUgZWZmZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIHtDdXN0b21FdmVudH0gW2V2ZW50XSAtIE9wdGlvbmFsIGV2ZW50IG9iamVjdCBmcm9tIHVzZXIgaW50ZXJhY3Rpb25cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlQWNjb3JkaW9uVG9nZ2xlKGV2ZW50PzogQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgICBpZihldmVudClcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIGlmKCF0aGlzLmhhc1ZhbGlkYXRpb25FcnJvcnMpIHtcbiAgICAgIHRoaXMuYWNjb3JkaW9uQ29tcG9uZW50LnZhbHVlID0gdGhpcy5pc09wZW4gPyB1bmRlZmluZWQgOiAnb3Blbic7XG4gICAgICB0aGlzLmlzT3BlbiA9ICEhdGhpcy5hY2NvcmRpb25Db21wb25lbnQudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHZhbGlkYXRpb24gZXJyb3IgZXZlbnRzIGZyb20gY2hpbGQgZm9ybSBmaWVsZHMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyB2YWxpZGF0aW9uIGVycm9yIGV2ZW50cyBkaXNwYXRjaGVkIGJ5IGZvcm0gZmllbGRzIHdpdGhpbiB0aGUgZmllbGRzZXQuXG4gICAqIFdoZW4gZXJyb3JzIGFyZSBkZXRlY3RlZCwgdGhlIGFjY29yZGlvbiBpcyBmb3JjZWQgb3BlbiBhbmQgcHJldmVudGVkIGZyb20gY29sbGFwc2luZ1xuICAgKiB0byBlbnN1cmUgdXNlcnMgY2FuIHNlZSB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcy4gVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgY29tcG9uZW50J3NcbiAgICogZXJyb3Igc3RhdGUgYW5kIGFjY29yZGlvbiB2aXNpYmlsaXR5IGFjY29yZGluZ2x5LlxuICAgKlxuICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCAtIEN1c3RvbSBldmVudCBjb250YWluaW5nIHZhbGlkYXRpb24gZXJyb3IgZGV0YWlsc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBoYW5kbGVWYWxpZGF0aW9uRXJyb3IoZXZlbnQ6IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3Qge2hhc0Vycm9yc30gPSBldmVudC5kZXRhaWw7XG4gICAgdGhpcy5pc09wZW4gPSB0aGlzLmhhc1ZhbGlkYXRpb25FcnJvcnMgPSBoYXNFcnJvcnM7XG4gICAgaWYoaGFzRXJyb3JzKVxuICAgICAgdGhpcy5hY2NvcmRpb25Db21wb25lbnQudmFsdWUgPSAnb3Blbic7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGFuZCBzdG9yZXMgYSBuZXcgb3IgdXBkYXRlZCB2YWx1ZSBpbiB0aGUgZmllbGRzZXQuXG4gICAqIEBzdW1tYXJ5IEhhbmRsZXMgYm90aCBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zIGZvciBmaWVsZHNldCBpdGVtcy4gUGFyc2VzIGFuZCBjbGVhbnNcbiAgICogdGhlIGlucHV0IHZhbHVlLCBkZXRlcm1pbmVzIHRoZSBvcGVyYXRpb24gdHlwZSBiYXNlZCBvbiB0aGUgdXBkYXRpbmcgc3RhdGUsIGFuZCBlaXRoZXJcbiAgICogYWRkcyBhIG5ldyBpdGVtIG9yIHVwZGF0ZXMgYW4gZXhpc3Rpbmcgb25lLiBNYWludGFpbnMgZGF0YSBpbnRlZ3JpdHkgYW5kIFVJIGNvbnNpc3RlbmN5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIHNldFZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSAodGhpcy5mb3JtR3JvdXAgYXMgRm9ybUFycmF5KS5jb250cm9scy5tYXAoKHt2YWx1ZX0pID0+IHZhbHVlKTtcbiAgICB0aGlzLml0ZW1zID0gdGhpcy52YWx1ZVxuICAgIC5maWx0ZXIodiA9PiB2W3RoaXMucGtdICE9PSB1bmRlZmluZWQpXG4gICAgLm1hcCgodiwgaW5kZXgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLml0ZW1NYXBwZXIodiwgdGhpcy5tYXBwZXIpLFxuICAgICAgICBpbmRleDogaW5kZXggKyAxXG4gICAgICB9IGFzIElGaWVsZFNldEl0ZW07XG4gICAgfSk7XG4gICAgY29uc3QgaW5wdXRDb250YWluZXJzID0gdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZGNmLWlucHV0LWl0ZW0nKTtcbiAgICBpbnB1dENvbnRhaW5lcnMuZm9yRWFjaCgoY29udGFpbmVyOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXQsIGlvbi1pbnB1dCwgaW9uLXRleHRhcmVhLCB0ZXh0YXJlYScpIGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYoaW5wdXQpXG4gICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgfSlcbiAgICB0aGlzLnVwZGF0aW5nSXRlbSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXV0b21hdGljYWxseSBjb25maWd1cmVzIHRoZSBmaWVsZCBtYXBwaW5nIGJhc2VkIG9uIHRoZSB2YWx1ZSBzdHJ1Y3R1cmUuXG4gICAqIEBzdW1tYXJ5IEFuYWx5emVzIHRoZSBwcm92aWRlZCB2YWx1ZSBvYmplY3QgdG8gYXV0b21hdGljYWxseSBkZXRlcm1pbmUgdGhlIHByaW1hcnkga2V5XG4gICAqIGFuZCBjcmVhdGUgYXBwcm9wcmlhdGUgZmllbGQgbWFwcGluZ3MgZm9yIGRpc3BsYXkgcHVycG9zZXMuIFNldHMgdXAgdGhlIG1hcHBlciBvYmplY3RcbiAgICogd2l0aCB0aXRsZSwgZGVzY3JpcHRpb24sIGFuZCBpbmRleCBmaWVsZHMgYmFzZWQgb24gdGhlIGF2YWlsYWJsZSBkYXRhIHN0cnVjdHVyZS5cbiAgICpcbiAgICogQHBhcmFtIHtLZXlWYWx1ZX0gdmFsdWUgLSBTYW1wbGUgdmFsdWUgb2JqZWN0IHVzZWQgdG8gZGV0ZXJtaW5lIGZpZWxkIG1hcHBpbmdzXG4gICAqIEByZXR1cm5zIHtLZXlWYWx1ZX0gVGhlIGNvbmZpZ3VyZWQgbWFwcGVyIG9iamVjdFxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgZ2V0TWFwcGVyKHZhbHVlOiBLZXlWYWx1ZSk6IEtleVZhbHVlIHtcbiAgICBpZighdGhpcy5waylcbiAgICAgIHRoaXMucGsgPSBPYmplY3Qua2V5cyh2YWx1ZSlbMF07XG4gICAgaWYoIU9iamVjdC5rZXlzKHRoaXMubWFwcGVyKS5sZW5ndGgpXG4gICAgICB0aGlzLm1hcHBlclsndGl0bGUnXSA9IHRoaXMucGs7XG4gICAgdGhpcy5tYXBwZXJbJ2luZGV4J10gPSBcImluZGV4XCI7XG4gICAgZm9yKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgaWYoT2JqZWN0LmtleXModGhpcy5tYXBwZXIpLmxlbmd0aCA+PSAyIHx8IE9iamVjdC5rZXlzKHRoaXMubWFwcGVyKS5sZW5ndGggPT09IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpXG4gICAgICAgIGJyZWFrO1xuICAgICAgaWYoIXRoaXMubWFwcGVyWyd0aXRsZSddKSB7XG4gICAgICAgIHRoaXMubWFwcGVyWyd0aXRsZSddID0ga2V5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tYXBwZXJbJ2Rlc2NyaXB0aW9uJ10gPSBrZXk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hcHBlcjtcbiAgfVxufVxuIiwiXG5cbjxmaWVsZHNldFxuICAoZmllbGRzZXRBZGRHcm91cEV2ZW50KT1cImhhbmRsZUNyZWF0ZUl0ZW0oJGV2ZW50KVwiXG4gIChmaWVsZHNldFJlbW92ZUdyb3VwRXZlbnQpPVwiaGFuZGxlUmVtb3ZlSXRlbSh1bmRlZmluZWQsICRldmVudClcIlxuICBbY2xhc3NdPVwiJ2RjZi1maWVsZHNldCAnICsgb3BlcmF0aW9uXCJcbiAgI2NvbXBvbmVudD5cbiAgPGlvbi1hY2NvcmRpb24tZ3JvdXAgW25nQ2xhc3NdPVwieydvcGVuJzogaXNPcGVuLCAnaGFzVmFsaWRhdGlvbkVycm9ycyc6IGhhc1ZhbGlkYXRpb25FcnJvcnN9XCIgICh2YWxpZGF0aW9uRXJyb3JFdmVudCk9XCJoYW5kbGVWYWxpZGF0aW9uRXJyb3IoJGV2ZW50KVwiICNhY2NvcmRpb25Db21wb25lbnQ+XG4gICAgPGlvbi1hY2NvcmRpb24gdmFsdWU9XCJvcGVuXCI+XG4gICAgICA8aW9uLWl0ZW0gc2xvdD1cImhlYWRlclwiIChjbGljayk9XCJoYW5kbGVBY2NvcmRpb25Ub2dnbGUoJGV2ZW50KVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGNmLWdyaWQgZGNmLWdyaWQtY29sbGFwc2UgZGNmLWZsZXggZGNmLWZsZXgtbWlkZGxlIGRjZi13aWR0aC0xLTFcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGNmLXdpZHRoLWV4cGFuZFwiPlxuICAgICAgICAgICAgPGxlZ2VuZD57eyBuYW1lIHwgdHJhbnNsYXRlIH19PC9sZWdlbmQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmKCFpc1JlcXVpcmVkICYmIFsnY3JlYXRlJywgJ3VwZGF0ZSddLmluY2x1ZGVzKG9wZXJhdGlvbikpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkY2Ytd2lkdGgtYXV0byBkY2YtZGVsZXRlXCI+XG4gICAgICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIHNpemU9XCJzbWFsbFwiIChjbGljayk9XCJoYW5kbGVSZW1vdmVDb21wb25lbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwidHJhc2gtb3V0bGluZVwiIGNvbG9yPVwiZGFya1wiIHNsb3Q9XCJpY29uLW9ubHlcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9pb24taXRlbT5cbiAgICAgIDxkaXYgc2xvdD1cImNvbnRlbnRcIiBbYXR0ci5hcmlhLWhpZGRlbl09XCIhaXNPcGVuXCI+XG4gICAgICAgIEBpZihtdWx0aXBsZSAmJiBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICA8aW9uLWxpc3QgY2xhc3M9XCJkY2YtZmllbGRzLWxpc3RcIj5cbiAgICAgICAgICAgIDxpb24tcmVvcmRlci1ncm91cCBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cC5wYXJlbnRcIiBbZGlzYWJsZWRdPVwidXBkYXRpbmdJdGVtXCIgKGlvbkl0ZW1SZW9yZGVyKT1cImhhbmRsZVJlb3JkZXJJdGVtcygkYW55KCRldmVudCkpXCIgI2FjY29yZGlvbkNvbXBvbmVudD5cbiAgICAgICAgICAgICAgQGZvcihpdGVtIG9mIGl0ZW1zOyB0cmFjayBpdGVtLmluZGV4KSB7XG4gICAgICAgICAgICAgICAgPGlvbi1pdGVtIFtuZ0NsYXNzXT1cInsnbm90LXVuaXF1ZSc6IGl0ZW0udGl0bGUgPT09IGlzVW5pcXVlRXJyb3J9XCIgbGluZXM9XCJmdWxsXCIgW2J1dHRvbl09XCJmYWxzZVwiIFtuZ0NsYXNzXT1cInsndXBkYXRpbmcnOiB1cGRhdGluZ0l0ZW0/Lltwa10gPT09IGl0ZW0udGl0bGV9XCI+XG4gICAgICAgICAgICAgICAgICBAaWYoaXRlbXM/Lmxlbmd0aCA+IDEgJiYgIXVwZGF0aW5nSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICA8aW9uLXJlb3JkZXIgc2xvdD1cInN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJzd2FwLXZlcnRpY2FsLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1yZW9yZGVyPlxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc2xvdD1cInN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIGNsYXNzPVwiZGNmLXJlb3JkZXItZGlzYWJsZWRcIiBzaXplPVwic21hbGxcIiBuYW1lPVwic3dhcC12ZXJ0aWNhbC1vdXRsaW5lXCIgZGlzYWJsZWQ+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIFtjb2xvcl09XCJpdGVtLnRpdGxlID09PSBpc1VuaXF1ZUVycm9yID8gJ2RhbmdlcicgOiAnJ1wiPnt7IGl0ZW0uaW5kZXggfX0uIHt7IGl0ZW0udGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgQGlmKGl0ZW0uZGVzY3JpcHRpb24/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJkY2Ytc3VidGl0bGVcIj57e2l0ZW0uZGVzY3JpcHRpb259fTwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgQGlmKCF1cGRhdGluZ0l0ZW0gfHwgdXBkYXRpbmdJdGVtPy5bcGtdICE9PSBpdGVtLnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIHNpemU9XCJzbWFsbFwiIChjbGljayk9XCJoYW5kbGVVcGRhdGVJdGVtKGl0ZW0udGl0bGUsICRpbmRleClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNyZWF0ZS1vdXRsaW5lXCIgY29sb3I9XCJkYXJrXCIgc2xvdD1cImljb24tb25seVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgQGlmKCF1cGRhdGluZ0l0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgc2l6ZT1cInNtYWxsXCIgKGNsaWNrKT1cImhhbmRsZVJlbW92ZUl0ZW0oaXRlbS50aXRsZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInRyYXNoLW91dGxpbmVcIiBjb2xvcj1cImRhcmtcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvaW9uLXJlb3JkZXItZ3JvdXA+XG4gICAgICAgICAgPC9pb24tbGlzdD5cbiAgICAgICAgfVxuXG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgQGlmKG11bHRpcGxlICYmIFsnY3JlYXRlJywgJ3VwZGF0ZSddLmluY2x1ZGVzKG9wZXJhdGlvbikpIHtcbiAgICAgICAgICBAaWYoaXNVbmlxdWVFcnJvcikge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRjZi1ub3QtdW5pcXVlLWNvbnRhaW5lciBkY2YtYW5pbWF0aW9uIGRjZi1hbmltYXRpb24tYm90dG9tLXNtYWxsIGRjZi1hbmltYXRpb24tZmFzdFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIGRjZi1ncmlkIGRjZi1ncmlkLWNvbGxhcHNlIGRjZi13aWR0aC0xLTEgXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRjZi1hdXRvXCIgW2F0dHIuc3R5bGVdPVwiJ21heC13aWR0aDogNTBweCdcIj5cbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiYWxlcnQtY2lyY2xlLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkY2Ytd2lkdGgtZXhwYW5kXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJkYW5nZXJcIiBjbGFzcz1cImRjZi10ZXh0LXNtYWxsXCI+e3sgbG9jYWxlICsgJy5ub3RfdW5pcXVlJyB8IHRyYW5zbGF0ZSA6IHsgdmFsdWU6IGlzVW5pcXVlRXJyb3IgfSB9fTwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkY2YtbWFyZ2luLWJvdHRvbSBkY2YtZ3JpZCBkY2YtZ3JpZC1jb2xsYXBzZSBkY2YtZmxleFwiPlxuICAgICAgICAgICAgQGlmKHVwZGF0aW5nSXRlbSkge1xuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBzaXplPVwic21hbGxcIiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhbmdlclwiIChjbGljayk9XCJoYW5kbGVDYW5jZWxVcGRhdGVJdGVtKClcIj5cbiAgICAgICAgICAgICAgICB7eyBsb2NhbGUgKyAnLmNhbmNlbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPGlvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImhhbmRsZUNyZWF0ZUl0ZW0oKVwiPlxuICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFkZC1vdXRsaW5lXCIgc2xvdD1cInN0YXJ0XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAge3tidXR0b25MYWJlbH19XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICA8L2Rpdj5cbiAgICA8L2lvbi1hY2NvcmRpb24+XG4gIDwvaW9uLWFjY29yZGlvbi1ncm91cD5cbjwvZmllbGRzZXQ+XG5cbiJdfQ==
|
|
667
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2ZpZWxkc2V0L2ZpZWxkc2V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9maWVsZHNldC9maWVsZHNldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFpQixpQkFBaUIsRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pKLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUF5QyxNQUFNLGNBQWMsQ0FBQztBQUM5RixPQUFPLEVBQWtCLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUEwQixlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEssT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakcsT0FBTyxFQUFFLFNBQVMsRUFBMEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFD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QyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDOytHQXJzQlUsaUJBQWlCO21HQUFqQixpQkFBaUIsa2hCQzlFOUIsZ3BKQStGQSwyOEZEcEJZLGdCQUFnQixpMEJBQUUsaUJBQWlCLHFKQUFFLFlBQVksNklBQUUsT0FBTyx5RkFBRSxPQUFPLDBOQUFFLFFBQVEsNkZBQUUsVUFBVSx3REFBYSxlQUFlOztBQUdwSCxpQkFBaUI7SUFWN0IsT0FBTyxFQUFFOztHQVVHLGlCQUFpQixDQXNzQjdCOzs0RkF0c0JZLGlCQUFpQjtrQkFUN0IsU0FBUztpQ0FDSSxJQUFJLFlBQ04sb0JBQW9CLFdBR3JCLENBQUMsc0JBQXNCLENBQUMsV0FDeEIsQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsb0JBQW9CLENBQUMsUUFDaEosRUFBQyxXQUFXLEVBQUUsWUFBWSxFQUFDO3dEQWlCakMsa0JBQWtCO3NCQURqQixTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFnQmxELElBQUk7c0JBREgsS0FBSztnQkFlTixPQUFPO3NCQUROLEtBQUs7Z0JBZUcsR0FBRztzQkFEWCxLQUFLO2dCQWNOLFdBQVc7c0JBRFYsS0FBSztnQkEwQk4sU0FBUztzQkFEUixLQUFLO2dCQVlOLFNBQVM7c0JBRFIsS0FBSztnQkFZTixLQUFLO3NCQURKLEtBQUs7Z0JBWU4sV0FBVztzQkFEVixLQUFLO2dCQWVOLE1BQU07c0JBREwsS0FBSztnQkFjTixRQUFRO3NCQURQLEtBQUs7Z0JBYU4sS0FBSztzQkFESixLQUFLO2dCQWFOLFFBQVE7c0JBRFAsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgaW5qZWN0LCBJbnB1dCwgVmlld0NoaWxkLCBSZW5kZXJlcjIsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHluYW1pYywgRXZlbnRDb25zdGFudHMsIEhhbmRsZXJMaWtlLCBIVE1MRm9ybVRhcmdldCwgS2V5VmFsdWUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3J1ZE9wZXJhdGlvbnMsIE9wZXJhdGlvbktleXMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBGb3JBbmd1bGFyTW9kdWxlIH0gZnJvbSAnLi4vLi4vZm9yLWFuZ3VsYXIubW9kdWxlJztcbmltcG9ydCB7IENvbGxhcHNhYmxlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9jb2xsYXBzYWJsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSW9uQWNjb3JkaW9uLCBJb25BY2NvcmRpb25Hcm91cCwgSW9uQnV0dG9uLCBJb25JdGVtLCBJb25MYWJlbCwgSW9uTGlzdCwgSXRlbVJlb3JkZXJFdmVudERldGFpbCwgSW9uUmVvcmRlckdyb3VwLCBJb25SZW9yZGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBjbGVhblNwYWNlcywgZ2VuZXJhdGVSYW5kb21WYWx1ZSwgaXRlbU1hcHBlciwgd2luZG93RXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOZ3hCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IGFsZXJ0Q2lyY2xlT3V0bGluZSwgY3JlYXRlT3V0bGluZSB9IGZyb20gJ2lvbmljb25zL2ljb25zJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IElGaWVsZFNldEl0ZW0sIElGaWVsZFNldFZhbGlkYXRpb25FdmVudCB9IGZyb20gJy4uLy4uL2VuZ2luZS9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuXG5cblxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEeW5hbWljIGZpZWxkc2V0IGNvbXBvbmVudCB3aXRoIGNvbGxhcHNpYmxlIGFjY29yZGlvbiBmdW5jdGlvbmFsaXR5LlxuICogQHN1bW1hcnkgVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBzb3BoaXN0aWNhdGVkIGZpZWxkc2V0IGNvbnRhaW5lciB0aGF0IGF1dG9tYXRpY2FsbHlcbiAqIGFkYXB0cyBpdHMgYmVoYXZpb3IgYmFzZWQgb24gQ1JVRCBvcGVyYXRpb25zLiBJdCBpbnRlZ3JhdGVzIHNlYW1sZXNzbHkgd2l0aCBJb25pYydzXG4gKiBhY2NvcmRpb24gY29tcG9uZW50cyB0byBjcmVhdGUgZXhwYW5kYWJsZS9jb2xsYXBzaWJsZSBzZWN0aW9ucyBmb3Igb3JnYW5pemluZyBmb3JtXG4gKiBjb250ZW50IGFuZCByZWxhdGVkIGluZm9ybWF0aW9uLiBUaGUgY29tcG9uZW50IGludGVsbGlnZW50bHkgZGV0ZXJtaW5lcyBpdHMgaW5pdGlhbFxuICogc3RhdGUgYmFzZWQgb24gdGhlIG9wZXJhdGlvbiB0eXBlLCBvcGVuaW5nIGF1dG9tYXRpY2FsbHkgZm9yIFJFQUQgYW5kIERFTEVURSBvcGVyYXRpb25zXG4gKiB3aGlsZSByZW1haW5pbmcgY2xvc2VkIGZvciBDUkVBVEUgYW5kIFVQREFURSBvcGVyYXRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8IS0tIEJhc2ljIHVzYWdlIHdpdGggYXV0b21hdGljIHN0YXRlIG1hbmFnZW1lbnQgLS0+XG4gKiA8bmd4LWRlY2FmLWZpZWxkc2V0XG4gKiAgIG5hbWU9XCJQZXJzb25hbCBJbmZvcm1hdGlvblwiXG4gKiAgIFtvcGVyYXRpb25dPVwiT3BlcmF0aW9uS2V5cy5SRUFEXCJcbiAqICAgdGFyZ2V0PVwiX3NlbGZcIj5cbiAqICAgPGlvbi1pbnB1dCBsYWJlbD1cIk5hbWVcIiBwbGFjZWhvbGRlcj1cIkVudGVyIG5hbWVcIj48L2lvbi1pbnB1dD5cbiAqICAgPGlvbi1pbnB1dCBsYWJlbD1cIkVtYWlsXCIgdHlwZT1cImVtYWlsXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBlbWFpbFwiPjwvaW9uLWlucHV0PlxuICogPC9uZ3gtZGVjYWYtZmllbGRzZXQ+XG4gKlxuICogPCEtLSBBZHZhbmNlZCB1c2FnZSB3aXRoIGN1c3RvbSBvcGVyYXRpb24gLS0+XG4gKiA8bmd4LWRlY2FmLWZpZWxkc2V0XG4gKiAgIG5hbWU9XCJDb250YWN0IERldGFpbHNcIlxuICogICBbb3BlcmF0aW9uXT1cImN1cnJlbnRPcGVyYXRpb25cIlxuICogICB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAqICAgPCEtLSBDb21wbGV4IGZvcm0gZmllbGRzIC0tPlxuICogPC9uZ3gtZGVjYWYtZmllbGRzZXQ+XG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICogICBwYXJ0aWNpcGFudCBGIGFzIEZpZWxkc2V0Q29tcG9uZW50XG4gKiAgIHBhcnRpY2lwYW50IEkgYXMgSW9uaWMgQWNjb3JkaW9uXG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRE9NXG4gKlxuICogICBGLT4+RjogbmdBZnRlclZpZXdJbml0KClcbiAqICAgYWx0IG9wZXJhdGlvbiBpcyBSRUFEIG9yIERFTEVURVxuICogICAgIEYtPj5GOiBTZXQgaXNPcGVuID0gdHJ1ZVxuICogICAgIEYtPj5EOiBRdWVyeSBhY2NvcmRpb24gZWxlbWVudFxuICogICAgIEYtPj5JOiBTZXQgdmFsdWUgYXR0cmlidXRlIHRvICdvcGVuJ1xuICogICAgIEYtPj5GOiBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cbiAqICAgZW5kXG4gKiAgIFUtPj5JOiBDbGljayBhY2NvcmRpb24gaGVhZGVyXG4gKiAgIEktPj5GOiBoYW5kbGVDaGFuZ2UoZXZlbnQpXG4gKiAgIEYtPj5GOiBVcGRhdGUgaXNPcGVuIHN0YXRlXG4gKiAgIEYtPj5JOiBSZWZsZWN0IG5ldyBzdGF0ZVxuICpcbiAqIEBtZW1iZXJPZiBGb3JBbmd1bGFyTW9kdWxlXG4gKi9cbkBEeW5hbWljKClcbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ25neC1kZWNhZi1maWVsZHNldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWVsZHNldC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpZWxkc2V0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbiAgaW1wb3J0czogW0ZvckFuZ3VsYXJNb2R1bGUsIElvbkFjY29yZGlvbkdyb3VwLCBJb25BY2NvcmRpb24sIElvbkxpc3QsIElvbkl0ZW0sIElvbkxhYmVsLCBJb25SZW9yZGVyLCBJb25CdXR0b24sIElvblJlb3JkZXJHcm91cCwgQ29sbGFwc2FibGVEaXJlY3RpdmVdLFxuICBob3N0OiB7J1thdHRyLmlkXSc6ICdvdmVycmlvZGUgJ30sXG59KVxuZXhwb3J0IGNsYXNzIEZpZWxkc2V0Q29tcG9uZW50IGV4dGVuZHMgTmd4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG5cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNlIHRvIHRoZSBpb24tYWNjb3JkaW9uLWdyb3VwIGNvbXBvbmVudCBmb3IgcHJvZ3JhbW1hdGljIGNvbnRyb2wuXG4gICAqIEBzdW1tYXJ5IFZpZXdDaGlsZCByZWZlcmVuY2UgdGhhdCBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBJb25pYyBhY2NvcmRpb24gZ3JvdXAgY29tcG9uZW50LlxuICAgKiBUaGlzIGVuYWJsZXMgcHJvZ3JhbW1hdGljIGNvbnRyb2wgb3ZlciB0aGUgYWNjb3JkaW9uJ3MgZXhwYW5kL2NvbGxhcHNlIHN0YXRlLCBhbGxvd2luZ1xuICAgKiB0aGUgY29tcG9uZW50IHRvIG9wZW4vY2xvc2UgdGhlIGFjY29yZGlvbiBiYXNlZCBvbiB2YWxpZGF0aW9uIGVycm9ycywgQ1JVRCBvcGVyYXRpb25zLFxuICAgKiBvciBvdGhlciBidXNpbmVzcyBsb2dpYyByZXF1aXJlbWVudHMuXG4gICAqXG4gICAqIEB0eXBlIHtJb25BY2NvcmRpb25Hcm91cH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBAVmlld0NoaWxkKCdhY2NvcmRpb25Db21wb25lbnQnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgYWNjb3JkaW9uQ29tcG9uZW50ITogSW9uQWNjb3JkaW9uR3JvdXA7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBkaXNwbGF5IG5hbWUgb3IgdGl0bGUgb2YgdGhlIGZpZWxkc2V0IHNlY3Rpb24uXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIGxlZ2VuZCBvciBoZWFkZXIgdGV4dCB0aGF0IGFwcGVhcnMgaW4gdGhlIGFjY29yZGlvbiBoZWFkZXIuIFRoaXMgdGV4dFxuICAgKiBwcm92aWRlcyBhIGNsZWFyIGxhYmVsIGZvciB0aGUgY29sbGFwc2libGUgc2VjdGlvbiwgaGVscGluZyB1c2VycyB1bmRlcnN0YW5kIHdoYXQgY29udGVudFxuICAgKiBpcyBjb250YWluZWQgd2l0aGluLiBUaGUgbmFtZSBpcyBkaXNwbGF5ZWQgcHJvbWluZW50bHkgYW5kIHNlcnZlcyBhcyB0aGUgY2xpY2thYmxlIGFyZWFcbiAgICogZm9yIGV4cGFuZGluZy9jb2xsYXBzaW5nIHRoZSBmaWVsZHNldC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ0NoaWxkJ1xuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG5hbWU6IHN0cmluZyA9ICdDaGlsZCc7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBwYXJlbnQgY29tcG9uZW50IGlkZW50aWZpZXIgZm9yIGhpZXJhcmNoaWNhbCBmaWVsZHNldCByZWxhdGlvbnNoaXBzLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIHBhcmVudCBjb21wb25lbnQgbmFtZSB0aGF0IHRoaXMgZmllbGRzZXQgYmVsb25ncyB0byBpbiBhIGhpZXJhcmNoaWNhbFxuICAgKiBmb3JtIHN0cnVjdHVyZS4gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGZvciBldmVudCBidWJibGluZyBhbmQgZXN0YWJsaXNoaW5nIHBhcmVudC1jaGlsZFxuICAgKiByZWxhdGlvbnNoaXBzIGJldHdlZW4gZmllbGRzZXRzIGluIGNvbXBsZXggZm9ybXMgd2l0aCBuZXN0ZWQgc3RydWN0dXJlcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ0NoaWxkJ1xuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGNoaWxkT2Y6IHN0cmluZyA9ICdDaGlsZCc7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBwYXJlbnQgY29tcG9uZW50IGlkZW50aWZpZXIgZm9yIGhpZXJhcmNoaWNhbCBmaWVsZHNldCByZWxhdGlvbnNoaXBzLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIHBhcmVudCBjb21wb25lbnQgbmFtZSB0aGF0IHRoaXMgZmllbGRzZXQgYmVsb25ncyB0byBpbiBhIGhpZXJhcmNoaWNhbFxuICAgKiBmb3JtIHN0cnVjdHVyZS4gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGZvciBldmVudCBidWJibGluZyBhbmQgZXN0YWJsaXNoaW5nIHBhcmVudC1jaGlsZFxuICAgKiByZWxhdGlvbnNoaXBzIGJldHdlZW4gZmllbGRzZXRzIGluIGNvbXBsZXggZm9ybXMgd2l0aCBuZXN0ZWQgc3RydWN0dXJlcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ0NoaWxkJ1xuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIHVpZDogc3RyaW5nID0gZ2VuZXJhdGVSYW5kb21WYWx1ZSgxMik7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1c3RvbSB0eXBlIGRlZmluaXRpb25zIGZvciBzcGVjaWFsaXplZCBmaWVsZHNldCBiZWhhdmlvci5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBjdXN0b20gZGF0YSB0eXBlcyBvciB2YWxpZGF0aW9uIHJ1bGVzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhpcyBmaWVsZHNldC5cbiAgICogQ2FuIGJlIGEgc2luZ2xlIHR5cGUgc3RyaW5nIG9yIGFycmF5IG9mIHR5cGVzIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgZmllbGRzZXQgaGFuZGxlc1xuICAgKiBkYXRhIHZhbGlkYXRpb24sIGZvcm1hdHRpbmcsIGFuZCBkaXNwbGF5IGJlaGF2aW9yIGZvciBzcGVjaWFsaXplZCB1c2UgY2FzZXMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBjdXN0b21UeXBlcyE6IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGN1cnJlbnQgQ1JVRCBvcGVyYXRpb24gY29udGV4dC5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB0aGUgY29tcG9uZW50J3MgaW5pdGlhbCBiZWhhdmlvciBhbmQgc3RhdGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgb3BlcmF0aW9uLlxuICAgKiBUaGlzIGlucHV0IGlzIGNydWNpYWwgZm9yIGF1dG8tc3RhdGUgbWFuYWdlbWVudDogUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnMgYXV0b21hdGljYWxseVxuICAgKiBvcGVuIHRoZSBmaWVsZHNldCB0byBzaG93IGNvbnRlbnQsIHdoaWxlIENSRUFURSBhbmQgVVBEQVRFIG9wZXJhdGlvbnMga2VlcCBpdCBjbG9zZWRcbiAgICogaW5pdGlhbGx5LiBUaGlzIHByb3ZpZGVzIGFuIGludHVpdGl2ZSB1c2VyIGV4cGVyaWVuY2UgYWxpZ25lZCB3aXRoIG9wZXJhdGlvbiBzZW1hbnRpY3MuXG4gICAqXG4gICAqIEB0eXBlIHtPcGVyYXRpb25LZXlzfVxuICAgKiBAZGVmYXVsdCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBDUlVEIG9wZXJhdGlvbiB0eXBlIGZvciB0aGUgY3VycmVudCBmaWVsZHNldCBjb250ZXh0LlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSBjb21wb25lbnQncyBpbml0aWFsIGJlaGF2aW9yIGFuZCBzdGF0ZSBiYXNlZCBvbiB0aGUgY3VycmVudCBvcGVyYXRpb24uXG4gICAqIFRoaXMgaW5wdXQgaXMgY3J1Y2lhbCBmb3IgYXV0by1zdGF0ZSBtYW5hZ2VtZW50OiBSRUFEIGFuZCBERUxFVEUgb3BlcmF0aW9ucyBhdXRvbWF0aWNhbGx5XG4gICAqIG9wZW4gdGhlIGZpZWxkc2V0IHRvIHNob3cgY29udGVudCwgd2hpbGUgQ1JFQVRFIGFuZCBVUERBVEUgb3BlcmF0aW9ucyBrZWVwIGl0IGNsb3NlZFxuICAgKiBpbml0aWFsbHkuIFRoaXMgcHJvdmlkZXMgYW4gaW50dWl0aXZlIHVzZXIgZXhwZXJpZW5jZSBhbGlnbmVkIHdpdGggb3BlcmF0aW9uIHNlbWFudGljcy5cbiAgICpcbiAgICogQHR5cGUge09wZXJhdGlvbktleXN9XG4gICAqIEBkZWZhdWx0IE9wZXJhdGlvbktleXMuUkVBRFxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyA9IE9wZXJhdGlvbktleXMuUkVBRDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWN0aXZlIGZvcm0gZ3JvdXAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmllbGRzZXQuXG4gICAqIEBzdW1tYXJ5IFRoZSBGb3JtR3JvdXAgaW5zdGFuY2UgdGhhdCBjb250YWlucyBhbGwgZm9ybSBjb250cm9scyB3aXRoaW4gdGhpcyBmaWVsZHNldC5cbiAgICogVXNlZCBmb3IgZm9ybSB2YWxpZGF0aW9uLCB2YWx1ZSBtYW5hZ2VtZW50LCBhbmQgaW50ZWdyYXRpb24gd2l0aCBBbmd1bGFyJ3MgcmVhY3RpdmUgZm9ybXMuXG4gICAqXG4gICAqIEB0eXBlIHtGb3JtR3JvdXB9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZm9ybUdyb3VwITogIEZvcm1BcnJheTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByaW1hcnkgdGl0bGUgdGV4dCBmb3IgdGhlIGZpZWxkc2V0IGNvbnRlbnQuXG4gICAqIEBzdW1tYXJ5IERpc3BsYXkgdGl0bGUgdXNlZCBmb3IgZmllbGRzZXQgaWRlbnRpZmljYXRpb24gYW5kIGNvbnRlbnQgb3JnYW5pemF0aW9uLlxuICAgKiBQcm92aWRlcyBzZW1hbnRpYyBtZWFuaW5nIHRvIHRoZSBncm91cGVkIGZvcm0gZmllbGRzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHRpdGxlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2Vjb25kYXJ5IGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBmaWVsZHNldC5cbiAgICogQHN1bW1hcnkgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IHByb3ZpZGVzIGNvbnRleHQgb3IgaW5zdHJ1Y3Rpb25zXG4gICAqIHJlbGF0ZWQgdG8gdGhlIGZpZWxkc2V0IGNvbnRlbnQgYW5kIHB1cnBvc2UuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZGVzY3JpcHRpb24hOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGb3JtIHRhcmdldCBhdHRyaWJ1dGUgZm9yIG5lc3RlZCBmb3JtIHN1Ym1pc3Npb25zLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hlcmUgdG8gZGlzcGxheSB0aGUgcmVzcG9uc2UgYWZ0ZXIgc3VibWl0dGluZyBmb3JtcyBjb250YWluZWQgd2l0aGluXG4gICAqIHRoZSBmaWVsZHNldC4gVGhpcyBhdHRyaWJ1dGUgbWlycm9ycyB0aGUgSFRNTCBmb3JtIHRhcmdldCBiZWhhdmlvciwgYWxsb3dpbmcgY29udHJvbCBvdmVyXG4gICAqIHdoZXRoZXIgZm9ybSBzdWJtaXNzaW9ucyBvcGVuIGluIHRoZSBzYW1lIHdpbmRvdywgbmV3IHdpbmRvdywgb3Igc3BlY2lmaWMgZnJhbWUuIFVzZWZ1bFxuICAgKiBmb3IgY29tcGxleCBmb3JtIHdvcmtmbG93cyBhbmQgbXVsdGktc3RlcCBwcm9jZXNzZXMuXG4gICAqXG4gICAqIEB0eXBlIHtIVE1MRm9ybVRhcmdldH1cbiAgICogQGRlZmF1bHQgJ19zZWxmJ1xuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHRhcmdldDogSFRNTEZvcm1UYXJnZXQgPSAnX3NlbGYnO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFbmFibGVzIG11bHRpcGxlIGl0ZW0gbWFuYWdlbWVudCB3aXRoaW4gdGhlIGZpZWxkc2V0LlxuICAgKiBAc3VtbWFyeSBCb29sZWFuIGZsYWcgdGhhdCBkZXRlcm1pbmVzIGlmIHRoZSBmaWVsZHNldCBzdXBwb3J0cyBhZGRpbmcgbXVsdGlwbGUgdmFsdWVzLlxuICAgKiBXaGVuIHRydWUsIGRpc3BsYXlzIGEgcmVvcmRlcmFibGUgbGlzdCBvZiBpdGVtcyB3aXRoIGFkZC9yZW1vdmUgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIHJhdyB2YWx1ZXMgc3RvcmVkIGluIHRoZSBmaWVsZHNldC5cbiAgICogQHN1bW1hcnkgQ29udGFpbnMgdGhlIGFjdHVhbCBkYXRhIHZhbHVlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgZmllbGRzZXQuXG4gICAqIFRoaXMgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGZpZWxkc2V0J3MgZGF0YSBzdGF0ZS5cbiAgICpcbiAgICogQHR5cGUge0tleVZhbHVlW119XG4gICAqIEBkZWZhdWx0IFtdXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdmFsdWU6IEtleVZhbHVlW10gPSBbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGZvciBjdXN0b20gZmllbGRzZXQgYWN0aW9ucy5cbiAgICogQHN1bW1hcnkgQSByZWNvcmQgb2YgZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMga2V5ZWQgYnkgZXZlbnQgbmFtZXMgdGhhdCBjYW4gYmUgdHJpZ2dlcmVkXG4gICAqIHdpdGhpbiB0aGUgZmllbGRzZXQuIFRoZXNlIGhhbmRsZXJzIHByb3ZpZGUgZXh0ZW5zaWJpbGl0eSBmb3IgY3VzdG9tIGJ1c2luZXNzIGxvZ2ljXG4gICAqIGFuZCBjYW4gYmUgaW52b2tlZCBmb3IgdmFyaW91cyBmaWVsZHNldCBvcGVyYXRpb25zIGFuZCB1c2VyIGludGVyYWN0aW9ucy5cbiAgICpcbiAgICogQHR5cGUge0hhbmRsZXJMaWtlfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGhhbmRsZXJzITogSGFuZGxlckxpa2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcnJheSBvZiBmb3JtYXR0ZWQgaXRlbXMgZm9yIFVJIGRpc3BsYXkuXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIHRoZSBwcm9jZXNzZWQgaXRlbXMgcmVhZHkgZm9yIGRpc3BsYXkgaW4gdGhlIGNvbXBvbmVudCB0ZW1wbGF0ZS5cbiAgICogVGhlc2UgaXRlbXMgYXJlIG1hcHBlZCBmcm9tIHRoZSByYXcgdmFsdWVzIHVzaW5nIHRoZSBtYXBwZXIgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHR5cGUge0lGaWVsZFNldEl0ZW1bXX1cbiAgICogQGRlZmF1bHQgW11cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBpdGVtczogSUZpZWxkU2V0SXRlbVtdID0gW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBmb3IgdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEhvbGRzIHRoZSBpdGVtIGJlaW5nIGVkaXRlZCB3aGVuIGluIHVwZGF0ZSBtb2RlLiBVc2VkIHRvIHRyYWNrXG4gICAqIHdoaWNoIGl0ZW0gaXMgYmVpbmcgbW9kaWZpZWQgYW5kIGFwcGx5IGNoYW5nZXMgdG8gdGhlIGNvcnJlY3QgaXRlbS5cbiAgICpcbiAgICogQHR5cGUge0lGaWVsZFNldEl0ZW0gfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgdXBkYXRpbmdJdGVtITogSUZpZWxkU2V0SXRlbSB8IHVuZGVmaW5lZDtcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudCBzdGF0ZSBvZiB0aGUgYWNjb3JkaW9uIChleHBhbmRlZCBvciBjb2xsYXBzZWQpLlxuICAgKiBAc3VtbWFyeSBCb29sZWFuIGZsYWcgdGhhdCB0cmFja3Mgd2hldGhlciB0aGUgZmllbGRzZXQgYWNjb3JkaW9uIGlzIGN1cnJlbnRseSBvcGVuIG9yIGNsb3NlZC5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhdXRvbWF0aWNhbGx5IG1hbmFnZWQgYmFzZWQgb24gdXNlciBpbnRlcmFjdGlvbnMgYW5kIGluaXRpYWwgb3BlcmF0aW9uIHN0YXRlLlxuICAgKiBJdCBzZXJ2ZXMgYXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBjb21wb25lbnQncyB2aXNpYmlsaXR5IHN0YXRlIGFuZCBpcyB1c2VkXG4gICAqIHRvIGNvb3JkaW5hdGUgYmV0d2VlbiB1c2VyIGFjdGlvbnMgYW5kIHByb2dyYW1tYXRpYyBzdGF0ZSBjaGFuZ2VzLiBUaGUgdmFsdWUgaXMgYXV0b21hdGljYWxseVxuICAgKiBzZXQgYmFzZWQgb24gQ1JVRCBvcGVyYXRpb25zIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQgdXBkYXRlZCB0aHJvdWdoIHVzZXIgaW50ZXJhY3Rpb25zLlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBpc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZHNldCBjb250YWlucyByZXF1aXJlZCBmb3JtIGZpZWxkcy5cbiAgICogQHN1bW1hcnkgQm9vbGVhbiBmbGFnIHRoYXQgc2lnbmFscyB0aGUgcHJlc2VuY2Ugb2YgbWFuZGF0b3J5IGlucHV0IGZpZWxkcyB3aXRoaW4gdGhlIGZpZWxkc2V0LlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIGF1dG9tYXRpY2FsbHkgc2V0IGJ5IHRoZSBDb2xsYXBzYWJsZURpcmVjdGl2ZSB3aGVuIHJlcXVpcmVkIGZpZWxkcyBhcmUgZGV0ZWN0ZWQsXG4gICAqIGFuZCBjYW4gYmUgdXNlZCB0byBhcHBseSBzcGVjaWFsIHN0eWxpbmcsIHZhbGlkYXRpb24gbG9naWMsIG9yIFVJIGluZGljYXRvcnMgdG8gaGlnaGxpZ2h0XG4gICAqIGZpZWxkc2V0cyB0aGF0IGNvbnRhaW4gbWFuZGF0b3J5IGluZm9ybWF0aW9uLiBJdCBoZWxwcyB3aXRoIGZvcm0gdmFsaWRhdGlvbiBmZWVkYmFjayBhbmRcbiAgICogdXNlciBleHBlcmllbmNlIGJ5IG1ha2luZyByZXF1aXJlZCBzZWN0aW9ucyBtb3JlIHByb21pbmVudC5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaXNSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkc2V0IGNvbnRhaW5zIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKiBAc3VtbWFyeSBCb29sZWFuIGZsYWcgdGhhdCB0cmFja3MgaWYgYW55IGZvcm0gZmllbGRzIHdpdGhpbiB0aGUgZmllbGRzZXQgaGF2ZSB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGNvbnRyb2wgYWNjb3JkaW9uIGJlaGF2aW9yIHdoZW4gZXJyb3JzIGFyZSBwcmVzZW50LCBwcmV2ZW50aW5nXG4gICAqIHVzZXJzIGZyb20gY29sbGFwc2luZyB0aGUgYWNjb3JkaW9uIHdoZW4gdGhleSBuZWVkIHRvIHNlZSBhbmQgYWRkcmVzcyB2YWxpZGF0aW9uIGlzc3Vlcy5cbiAgICogSXQncyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgd2hlbiB2YWxpZGF0aW9uIGVycm9yIGV2ZW50cyBhcmUgcmVjZWl2ZWQgZnJvbSBjaGlsZCBmb3JtIGZpZWxkcy5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFzVmFsaWRhdGlvbkVycm9yczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlIGZvciBkdXBsaWNhdGUgdmFsdWVzLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGVycm9yIG1lc3NhZ2Ugd2hlbiBhIHVzZXIgYXR0ZW1wdHMgdG8gYWRkIGEgZHVwbGljYXRlIHZhbHVlXG4gICAqIHRvIHRoZSBmaWVsZHNldC4gVXNlZCB0byBkaXNwbGF5IHVuaXF1ZW5lc3MgdmFsaWRhdGlvbiBmZWVkYmFjay5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBpc1VuaXF1ZUVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gQ1JVRCBvcGVyYXRpb24gY29uc3RhbnRzIGZvciB0ZW1wbGF0ZSB1c2FnZS5cbiAgICogQHN1bW1hcnkgRXhwb3NlcyB0aGUgT3BlcmF0aW9uS2V5cyBlbnVtIHRvIHRoZSBjb21wb25lbnQgdGVtcGxhdGUsIGVuYWJsaW5nIGNvbmRpdGlvbmFsXG4gICAqIHJlbmRlcmluZyBhbmQgYmVoYXZpb3IgYmFzZWQgb24gb3BlcmF0aW9uIHR5cGVzLiBUaGlzIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0eSBlbnN1cmVzXG4gICAqIHRoYXQgdGVtcGxhdGUgbG9naWMgY2FuIGFjY2VzcyBvcGVyYXRpb24gY29uc3RhbnRzIHdoaWxlIG1haW50YWluaW5nIGVuY2Fwc3VsYXRpb24gYW5kXG4gICAqIHByZXZlbnRpbmcgYWNjaWRlbnRhbCBtb2RpZmljYXRpb24gb2YgdGhlIGVudW0gdmFsdWVzLlxuICAgKlxuICAgKiBAdHlwZSB7Q3J1ZE9wZXJhdGlvbnN9XG4gICAqIEBkZWZhdWx0IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IE9wZXJhdGlvbktleXM6IENydWRPcGVyYXRpb25zID0gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24gc2VydmljZS5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgc2VydmljZSB0aGF0IHByb3ZpZGVzIG1hbnVhbCBjb250cm9sIG92ZXIgY2hhbmdlIGRldGVjdGlvbiBjeWNsZXMuXG4gICAqIFRoaXMgaXMgZXNzZW50aWFsIGZvciBlbnN1cmluZyB0aGF0IHByb2dyYW1tYXRpYyBET00gY2hhbmdlcyAobGlrZSBzZXR0aW5nIGFjY29yZGlvblxuICAgKiBhdHRyaWJ1dGVzKSBhcmUgcHJvcGVybHkgcmVmbGVjdGVkIGluIHRoZSBjb21wb25lbnQncyBzdGF0ZSBhbmQgdHJpZ2dlciBhcHByb3ByaWF0ZVxuICAgKiB2aWV3IHVwZGF0ZXMgd2hlbiBtb2RpZmljYXRpb25zIG9jY3VyIG91dHNpZGUgdGhlIG5vcm1hbCBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24gZmxvdy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0NoYW5nZURldGVjdG9yUmVmfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFuZ3VsYXIgUmVuZGVyZXIyIHNlcnZpY2UgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbi5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgc2VydmljZSB0aGF0IHByb3ZpZGVzIGEgc2FmZSwgcGxhdGZvcm0tYWdub3N0aWMgd2F5IHRvIG1hbmlwdWxhdGUgRE9NIGVsZW1lbnRzLlxuICAgKiBUaGlzIHNlcnZpY2UgZW5zdXJlcyBwcm9wZXIgaGFuZGxpbmcgb2YgRE9NIG9wZXJhdGlvbnMgYWNyb3NzIGRpZmZlcmVudCBwbGF0Zm9ybXMgYW5kIGVudmlyb25tZW50cyxcbiAgICogaW5jbHVkaW5nIHNlcnZlci1zaWRlIHJlbmRlcmluZyBhbmQgd2ViIHdvcmtlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZW5kZXJlcjJ9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUcmFuc2xhdGlvbiBzZXJ2aWNlIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbi5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgc2VydmljZSB0aGF0IHByb3ZpZGVzIHRyYW5zbGF0aW9uIGNhcGFiaWxpdGllcyBmb3IgVUkgdGV4dC5cbiAgICogVXNlZCB0byB0cmFuc2xhdGUgYnV0dG9uIGxhYmVscyBhbmQgdmFsaWRhdGlvbiBtZXNzYWdlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBsb2NhbGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtUcmFuc2xhdGVTZXJ2aWNlfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvY2FsaXplZCBsYWJlbCB0ZXh0IGZvciBhY3Rpb24gYnV0dG9ucy5cbiAgICogQHN1bW1hcnkgRHluYW1pYyBidXR0b24gbGFiZWwgdGhhdCBjaGFuZ2VzIGJhc2VkIG9uIHRoZSBjdXJyZW50IG9wZXJhdGlvbiBtb2RlLlxuICAgKiBTaG93cyBcIkFkZFwiIGZvciBjcmVhdGUgb3BlcmF0aW9ucyBhbmQgXCJVcGRhdGVcIiBmb3IgZWRpdCBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGJ1dHRvbkxhYmVsITogc3RyaW5nO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2NhbGl6ZWQgbGFiZWwgdGV4dCBmb3IgYWN0aW9uIGJ1dHRvbnMuXG4gICAqIEBzdW1tYXJ5IER5bmFtaWMgYnV0dG9uIGxhYmVsIHRoYXQgY2hhbmdlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBvcGVyYXRpb24gbW9kZS5cbiAgICogU2hvd3MgXCJDYW5jZWxcIiBmb3IgdXBkYXRlIG9wZXJhdGlvbnNcbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBidXR0b25DYW5jZWxMYWJlbCE6IHN0cmluZztcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IGNvbnN0cnVjdG9yIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIGZpZWxkc2V0IHdpdGggaWNvbnMgYW5kIGNvbXBvbmVudCBuYW1lLlxuICAgKiBAc3VtbWFyeSBDYWxscyB0aGUgcGFyZW50IE5neEJhc2VDb21wb25lbnQgY29uc3RydWN0b3Igd2l0aCB0aGUgY29tcG9uZW50IG5hbWUgYW5kXG4gICAqIHJlcXVpcmVkIElvbmljIGljb25zIChhbGVydENpcmNsZU91dGxpbmUgZm9yIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBjcmVhdGVPdXRsaW5lIGZvciBhZGQgYWN0aW9ucykuXG4gICAqIFNldHMgdXAgdGhlIGZvdW5kYXRpb25hbCBjb21wb25lbnQgc3RydWN0dXJlIGFuZCBpY29uIHJlZ2lzdHJ5LlxuICAgKlxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdGaWVsZHNldENvbXBvbmVudCcpO1xuICAgIGFkZEljb25zKHsgYWxlcnRDaXJjbGVPdXRsaW5lLCBjcmVhdGVPdXRsaW5lIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnQgaW5pdGlhbGl6YXRpb24gbGlmZWN5Y2xlIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudCBieSBzZXR0aW5nIHVwIHJlcG9zaXRvcnkgcmVsYXRpb25zaGlwcyBpZiBhIG1vZGVsIGV4aXN0cyxcbiAgICogYW5kIGNvbmZpZ3VyZXMgdGhlIGluaXRpYWwgYnV0dG9uIGxhYmVsIGZvciB0aGUgYWRkIGFjdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCBsb2NhbGUuXG4gICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgcHJvcGVyIHNldHVwIG9mIHRyYW5zbGF0aW9uIHNlcnZpY2VzIGFuZCBjb21wb25lbnQgc3RhdGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmKHRoaXMubW9kZWwpXG4gICAgICB0aGlzLl9yZXBvc2l0b3J5ID0gdGhpcy5yZXBvc2l0b3J5O1xuICAgIHRoaXMuYnV0dG9uTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmxvY2FsZSArICcuYWRkJyk7XG4gICAgdGhpcy5idXR0b25DYW5jZWxMYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMubG9jYWxlICsgJy5jYW5jZWwnKTtcbiAgfVxuXG4gICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgc3RhdGUgYWZ0ZXIgdmlldyBhbmQgY2hpbGQgY29tcG9uZW50cyBhcmUgcmVuZGVyZWQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbGlmZWN5Y2xlIGhvb2sgaW1wbGVtZW50cyBpbnRlbGxpZ2VudCBhdXRvLXN0YXRlIG1hbmFnZW1lbnQgYmFzZWQgb24gdGhlIGN1cnJlbnRcbiAgICogQ1JVRCBvcGVyYXRpb24uIEZvciBSRUFEIGFuZCBERUxFVEUgb3BlcmF0aW9ucywgdGhlIGZpZWxkc2V0IGF1dG9tYXRpY2FsbHkgb3BlbnMgdG8gcHJvdmlkZVxuICAgKiBpbW1lZGlhdGUgYWNjZXNzIHRvIGluZm9ybWF0aW9uLCB3aGlsZSBDUkVBVEUgYW5kIFVQREFURSBvcGVyYXRpb25zIGtlZXAgaXQgY2xvc2VkIHRvIG1haW50YWluXG4gICAqIGEgY2xlYW4gaW5pdGlhbCBpbnRlcmZhY2UuIFRoZSBtZXRob2QgZGlyZWN0bHkgbWFuaXB1bGF0ZXMgdGhlIERPTSB0byBlbnN1cmUgcHJvcGVyIGFjY29yZGlvblxuICAgKiBzeW5jaHJvbml6YXRpb24gYW5kIHRyaWdnZXJzIGNoYW5nZSBkZXRlY3Rpb24gdG8gcmVmbGVjdCB0aGUgcHJvZ3JhbW1hdGljIHN0YXRlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQW5ndWxhciBMaWZlY3ljbGVcbiAgICogICBwYXJ0aWNpcGFudCBGIGFzIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBET01cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIENoYW5nZURldGVjdG9yXG4gICAqXG4gICAqICAgQS0+PkY6IG5nQWZ0ZXJWaWV3SW5pdCgpXG4gICAqICAgYWx0IG9wZXJhdGlvbiBpcyBSRUFEIG9yIERFTEVURVxuICAgKiAgICAgRi0+PkY6IFNldCBpc09wZW4gPSB0cnVlXG4gICAqICAgICBGLT4+RDogUXVlcnkgaW9uLWFjY29yZGlvbi1ncm91cCBlbGVtZW50XG4gICAqICAgICBhbHQgYWNjb3JkaW9uIGVsZW1lbnQgZXhpc3RzXG4gICAqICAgICAgIEYtPj5EOiBTZXQgdmFsdWUgYXR0cmlidXRlIHRvICdvcGVuJ1xuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgRi0+PkM6IGRldGVjdENoYW5nZXMoKVxuICAgKiAgIEMtPj5GOiBVcGRhdGUgdmlldyB3aXRoIG5ldyBzdGF0ZVxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLlJFQUQgfHwgdGhpcy5vcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuREVMRVRFKSB7XG4gICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICAvLyBoaWRkZW4gcmVtb3ZlIGJ1dHRvblxuICAgICAgY29uc3QgYWNjb3JkaW9uRWxlbWVudCA9IHRoaXMuY29tcG9uZW50Py5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lvbi1hY2NvcmRpb24tZ3JvdXAnKTtcbiAgICAgIGlmKHRoaXMuYWNjb3JkaW9uQ29tcG9uZW50KVxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShhY2NvcmRpb25FbGVtZW50LCAndmFsdWUnLCAnb3BlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbnB1dHMgPSB0aGlzLmNvbXBvbmVudD8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbcmVxdWlyZWRdJyk7XG4gICAgICB0aGlzLmlzUmVxdWlyZWQgPSBpbnB1dHMubGVuZ3RoID4gMDtcbiAgICAgIGlmKHRoaXMuaXNSZXF1aXJlZCkge1xuICAgICAgICB0aGlzLmFjY29yZGlvbkNvbXBvbmVudC52YWx1ZSA9ICdvcGVuJztcbiAgICAgICAgdGhpcy5oYW5kbGVBY2NvcmRpb25Ub2dnbGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcmVtb3ZhbCBvZiB0aGUgZmllbGRzZXQgd2l0aCBzbGlkZSBhbmltYXRpb24uXG4gICAqIEBzdW1tYXJ5IEluaXRpYXRlcyB0aGUgcmVtb3ZhbCBwcm9jZXNzIGZvciB0aGUgZmllbGRzZXQgd2l0aCBhIHNtb290aCBzbGlkZS11cCBhbmltYXRpb24uXG4gICAqIFRoZSBtZXRob2QgYXBwbGllcyBDU1MgY2xhc3NlcyBmb3IgdGhlIHNsaWRlIGFuaW1hdGlvbiBhbmQgdGhlbiBzYWZlbHkgcmVtb3ZlcyB0aGVcbiAgICogZWxlbWVudCBmcm9tIHRoZSBET00gdXNpbmcgUmVuZGVyZXIyLiBUaGlzIHByb3ZpZGVzIGEgcG9saXNoZWQgdXNlciBleHBlcmllbmNlXG4gICAqIHdoZW4gcmVtb3ZpbmcgZmllbGRzZXQgaW5zdGFuY2VzIGZyb20gZHluYW1pYyBmb3Jtcy5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBET00gZXZlbnQgZnJvbSB0aGUgcmVtb3ZlIGJ1dHRvbiBjbGlja1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBoYW5kbGVSZW1vdmVDb21wb25lbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkY2YtYW5pbWF0aW9uJywgJ2RjZi1hbmltYXRpb24tc2xpZGUtdG9wLW1lZGl1bScsICdkY2YtYW5pbWF0aW9uLXJldmVyc2UnLCAnZGNmLWFuaW1hdGlvbi1mYXN0Jyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBVc2UgUmVuZGVyZXIyIHRvIHNhZmVseSByZW1vdmUgdGhlIGVsZW1lbnRcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucmVuZGVyZXIucGFyZW50Tm9kZSh0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgIGlmIChwYXJlbnQpXG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQocGFyZW50LCB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50KTtcbiAgICB9LCAxNTApO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgY3JlYXRpbmcgbmV3IGl0ZW1zIG9yIHRyaWdnZXJpbmcgZ3JvdXAgYWRkaXRpb24gZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgZm9ybSB2YWxpZGF0aW9uIGV2ZW50cyBmb3IgaXRlbSBjcmVhdGlvbiBvciBlbWl0cyBldmVudHMgdG8gdHJpZ2dlclxuICAgKiB0aGUgYWRkaXRpb24gb2YgbmV3IGZpZWxkc2V0IGdyb3Vwcy4gV2hlbiBjYWxsZWQgd2l0aCB2YWxpZGF0aW9uIGV2ZW50IGRhdGEsIGl0IHZhbGlkYXRlc1xuICAgKiB1bmlxdWVuZXNzIGFuZCBhZGRzIHRoZSBpdGVtIHRvIHRoZSBmaWVsZHNldC4gV2hlbiBjYWxsZWQgd2l0aG91dCBwYXJhbWV0ZXJzLCBpdCB0cmlnZ2Vyc1xuICAgKiBhIGdyb3VwIGFkZGl0aW9uIGV2ZW50IGZvciBwYXJlbnQgY29tcG9uZW50cyB0byBoYW5kbGUuXG4gICAqXG4gICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnQ8SUZpZWxkU2V0VmFsaWRhdGlvbkV2ZW50Pn0gW2V2ZW50XSAtIE9wdGlvbmFsIHZhbGlkYXRpb24gZXZlbnQgY29udGFpbmluZyBmb3JtIGRhdGFcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIENhbGxlZCBmcm9tIGZvcm0gdmFsaWRhdGlvblxuICAgKiBoYW5kbGVDcmVhdGVJdGVtKHZhbGlkYXRpb25FdmVudCk7XG4gICAqXG4gICAqIC8vIENhbGxlZCB0byB0cmlnZ2VyIGdyb3VwIGFkZGl0aW9uXG4gICAqIGhhbmRsZUNyZWF0ZUl0ZW0oKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBoYW5kbGVDcmVhdGVJdGVtKGV2ZW50PzogQ3VzdG9tRXZlbnQ8SUZpZWxkU2V0VmFsaWRhdGlvbkV2ZW50Pik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmKGV2ZW50ICYmIGV2ZW50IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3Qge2Zvcm1Hcm91cCwgdmFsdWUsIGlzVmFsaWR9ID0gZXZlbnQuZGV0YWlsO1xuICAgICAgdGhpcy5mb3JtR3JvdXAgPSBmb3JtR3JvdXAgYXMgRm9ybUFycmF5O1xuICAgICAgaWYoIXRoaXMubWFwcGVyKVxuICAgICAgICB0aGlzLm1hcHBlciA9IHRoaXMuZ2V0TWFwcGVyKHZhbHVlIGFzIEtleVZhbHVlKTtcbiAgICAgIGlmKGlzVmFsaWQgKXtcbiAgICAgICAgICB0aGlzLmlzVW5pcXVlRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdGhpcy5idXR0b25MYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMubG9jYWxlICsgJy5hZGQnKTtcbiAgICAgICAgICB0aGlzLnNldFZhbHVlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgIHRoaXMuaXNVbmlxdWVFcnJvciA9ICh2YWx1ZSBhcyBLZXlWYWx1ZSk/Llt0aGlzLnBrXSB8fCB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvd0V2ZW50RW1pdHRlcihFdmVudENvbnN0YW50cy5GSUVMRFNFVF9BRERfR1JPVVAsIHtcbiAgICAgICAgY29tcG9uZW50OiB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICBpbmRleDogdGhpcy52YWx1ZT8ubGVuZ3RoLFxuICAgICAgICBwYXJlbnQ6IHRoaXMuY2hpbGRPZixcbiAgICAgICAgb3BlcmF0aW9uOiAhdGhpcy51cGRhdGluZ0l0ZW0gPyBPcGVyYXRpb25LZXlzLkNSRUFURSA6IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBpdGVtIHVwZGF0ZSBvcGVyYXRpb25zIHdpdGggZm9ybSBzdGF0ZSBtYW5hZ2VtZW50LlxuICAgKiBAc3VtbWFyeSBMb2NhdGVzIGFuIGl0ZW0gaW4gdGhlIGZvcm0gYXJyYXkgZm9yIGVkaXRpbmcgYW5kIHByZXBhcmVzIHRoZSBjb21wb25lbnRcbiAgICogZm9yIHVwZGF0ZSBtb2RlLiBVcGRhdGVzIHRoZSBidXR0b24gbGFiZWwgdG8gcmVmbGVjdCB0aGUgZWRpdCBzdGF0ZSBhbmQgc3RvcmVzXG4gICAqIHRoZSBpdGVtIGJlaW5nIHVwZGF0ZWQuIFRyaWdnZXJzIGEgd2luZG93IGV2ZW50IHRvIG5vdGlmeSBwYXJlbnQgY29tcG9uZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHZhbHVlIC0gVGhlIGlkZW50aWZpZXIgdmFsdWUgb2YgdGhlIGl0ZW0gdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBhcnJheSBpbmRleCBwb3NpdGlvbiBvZiB0aGUgaXRlbVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBoYW5kbGVVcGRhdGVJdGVtKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZmluZChjb250cm9sID0+IGAke2NvbnRyb2wuZ2V0KHRoaXMucGspPy52YWx1ZX1gLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuU3BhY2VzKGAke3ZhbHVlfWAsIHRydWUpKSBhcyBGb3JtQ29udHJvbDtcbiAgICBpZihpdGVtKSB7XG4gICAgICB0aGlzLmJ1dHRvbkxhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5sb2NhbGUgKyAnLnVwZGF0ZScpO1xuICAgICAgdGhpcy51cGRhdGluZ0l0ZW0gPSBPYmplY3QuYXNzaWduKHt9LCBpdGVtLnZhbHVlIHx8IHt9KTtcbiAgICAgIHdpbmRvd0V2ZW50RW1pdHRlcihFdmVudENvbnN0YW50cy5GSUVMRFNFVF9VUERBVEVfR1JPVVAsIHtcbiAgICAgICAgcGFyZW50OiB0aGlzLmNoaWxkT2YsXG4gICAgICAgIGNvbXBvbmVudDogdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENhbmNlbHMgdGhlIHVwZGF0ZSBtb2RlIGFuZCByZXNldHMgdGhlIFVJIHN0YXRlLlxuICAgKiBAc3VtbWFyeSBFeGl0cyB0aGUgdXBkYXRlIG1vZGUgYnkgcmVzZXR0aW5nIHRoZSBidXR0b24gbGFiZWwgYW5kIGNsZWFyaW5nIHRoZSB1cGRhdGluZyBpdGVtLFxuICAgKiByZXN0b3JpbmcgdGhlIGNvbXBvbmVudCB0byBpdHMgZGVmYXVsdCBzdGF0ZSBmb3IgYWRkaW5nIG5ldyBpdGVtcy4gTm90aWZpZXMgcGFyZW50IGNvbXBvbmVudHNcbiAgICogdGhhdCB0aGUgdXBkYXRlIG9wZXJhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGhhbmRsZUNhbmNlbFVwZGF0ZUl0ZW0oKTogdm9pZCB7XG4gICAgdGhpcy5idXR0b25MYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMubG9jYWxlICsgJy5hZGQnKTtcbiAgICB0aGlzLnVwZGF0aW5nSXRlbSA9IHVuZGVmaW5lZDtcbiAgICB3aW5kb3dFdmVudEVtaXR0ZXIoRXZlbnRDb25zdGFudHMuRklFTERTRVRfVVBEQVRFX0dST1VQLCB7XG4gICAgICBwYXJlbnQ6IHRoaXMuY2hpbGRPZixcbiAgICAgIGNvbXBvbmVudDogdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgIGluZGV4OiB0aGlzLnZhbHVlPy5sZW5ndGhcbiAgICB9KTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGl0ZW0gcmVtb3ZhbCBvcGVyYXRpb25zIHdpdGggZm9ybSBhcnJheSBtYW5hZ2VtZW50LlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgaXRlbSByZW1vdmFsIGJ5IGVpdGhlciBoYW5kbGluZyB2YWxpZGF0aW9uIGV2ZW50cyBvciByZW1vdmluZyBzcGVjaWZpY1xuICAgKiBpdGVtcyBmcm9tIHRoZSBmb3JtIGFycmF5LiBXaGVuIGNhbGxlZCB3aXRoIGEgdmFsaWRhdGlvbiBldmVudCwgaXQgdHJpZ2dlcnMgdmFsdWUgdXBkYXRlcy5cbiAgICogV2hlbiBjYWxsZWQgd2l0aCBhbiBpZGVudGlmaWVyLCBpdCBsb2NhdGVzIGFuZCByZW1vdmVzIHRoZSBtYXRjaGluZyBpdGVtIGZyb20gdGhlIGZvcm0gYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB2YWx1ZSAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBpdGVtIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBbZXZlbnRdIC0gT3B0aW9uYWwgdmFsaWRhdGlvbiBldmVudCBmb3IgZm9ybSB1cGRhdGVzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGhhbmRsZVJlbW92ZUl0ZW0odmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZXZlbnQ/OiBDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIGlmKGV2ZW50ICYmIGV2ZW50IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuIHRoaXMuc2V0VmFsdWUoKTtcbiAgICB9XG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5mb3JtR3JvdXAgYXMgRm9ybUFycmF5O1xuICAgIGNvbnN0IGFycmF5TGVuZ3RoID0gZm9ybUFycmF5Lmxlbmd0aDtcbiAgICBmb3IgKGxldCBpbmRleCA9IGFycmF5TGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgICAgY29uc3QgZ3JvdXAgPSBmb3JtQXJyYXkuYXQoaW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICAgIGlmIChjbGVhblNwYWNlcyhncm91cC5nZXQodGhpcy5wayk/LnZhbHVlKSA9PT0gY2xlYW5TcGFjZXModmFsdWUgYXMgc3RyaW5nKSkge1xuICAgICAgICB3aW5kb3dFdmVudEVtaXR0ZXIoRXZlbnRDb25zdGFudHMuRklFTERTRVRfUkVNT1ZFX0dST1VQLCB7XG4gICAgICAgICAgcGFyZW50OiB0aGlzLmNoaWxkT2YsXG4gICAgICAgICAgY29tcG9uZW50OiB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGZvcm1Hcm91cDogZ3JvdXBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcmVvcmRlcmluZyBvZiBpdGVtcyB3aXRoaW4gdGhlIGZpZWxkc2V0IGxpc3QuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBkcmFnLWFuZC1kcm9wIHJlb3JkZXIgZXZlbnRzIGZyb20gdGhlIGlvbi1yZW9yZGVyLWdyb3VwIGNvbXBvbmVudC5cbiAgICogVXBkYXRlcyBib3RoIHRoZSBkaXNwbGF5IGl0ZW1zIGFycmF5IGFuZCB0aGUgdW5kZXJseWluZyB2YWx1ZSBhcnJheSB0byBtYWludGFpblxuICAgKiBjb25zaXN0ZW5jeSBiZXR3ZWVuIFVJIHN0YXRlIGFuZCBkYXRhIHN0YXRlLiBQcmVzZXJ2ZXMgaXRlbSBpbmRpY2VzIGFmdGVyIHJlb3JkZXJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnQ8SXRlbVJlb3JkZXJFdmVudERldGFpbD59IGV2ZW50IC0gSW9uaWMgcmVvcmRlciBldmVudCBjb250YWluaW5nIHNvdXJjZSBhbmQgdGFyZ2V0IGluZGljZXNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBodG1sXG4gICAqIDxpb24tcmVvcmRlci1ncm91cCAoaW9uSXRlbVJlb3JkZXIpPVwiaGFuZGxlUmVvcmRlcigkZXZlbnQpXCI+XG4gICAqICAgPCEtLSBSZW9yZGVyYWJsZSBpdGVtcyAtLT5cbiAgICogPC9pb24tcmVvcmRlci1ncm91cD5cbiAgICogYGBgXG4gICAqL1xuICBoYW5kbGVSZW9yZGVySXRlbXMoZXZlbnQ6IEN1c3RvbUV2ZW50PEl0ZW1SZW9yZGVyRXZlbnREZXRhaWw+KTogdm9pZCB7XG4gICBjb25zdCBmcm9tSW5kZXggPSBldmVudC5kZXRhaWwuZnJvbTtcbiAgICBjb25zdCB0b0luZGV4ID0gZXZlbnQuZGV0YWlsLnRvO1xuXG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5pdGVtc107IC8vIHN1YSBlc3RydXR1cmEgdmlzdWFsXG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5mb3JtR3JvdXAgYXMgRm9ybUFycmF5OyAvLyBGb3JtQXJyYXkgcmVhdGl2b1xuXG4gICAgaWYgKGZyb21JbmRleCAhPT0gdG9JbmRleCkge1xuICAgICAgLy8gUmVvcmRlbmFyIG9zIGRhZG9zIHZpc3VhaXNcbiAgICAgIGNvbnN0IGl0ZW1Ub01vdmUgPSBpdGVtcy5zcGxpY2UoZnJvbUluZGV4LCAxKVswXTtcbiAgICAgIGl0ZW1zLnNwbGljZSh0b0luZGV4LCAwLCBpdGVtVG9Nb3ZlKTtcbiAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiBpdGVtWydpbmRleCddID0gaW5kZXggKyAxKTtcblxuICAgICAgLy8gUmVvcmRlbmFyIG9zIGNvbnRyb2xlcyBkbyBGb3JtQXJyYXlcbiAgICAgIGNvbnN0IGNvbnRyb2xUb01vdmUgPSBmb3JtQXJyYXkuYXQoZnJvbUluZGV4KTtcbiAgICAgIGZvcm1BcnJheS5yZW1vdmVBdChmcm9tSW5kZXgpO1xuICAgICAgZm9ybUFycmF5Lmluc2VydCh0b0luZGV4LCBjb250cm9sVG9Nb3ZlKTtcbiAgICB9XG4gICAgLy8gRmluYWxpemEgYSBvcGVyYcOnw6NvIGRlIHJlb3JkZXIgZG8gSW9uaWNcbiAgICBldmVudC5kZXRhaWwuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBhY2NvcmRpb24gc3RhdGUgY2hhbmdlIGV2ZW50cyBmcm9tIHVzZXIgaW50ZXJhY3Rpb25zLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgQ3VzdG9tRXZlbnQgb2JqZWN0cyB0cmlnZ2VyZWQgd2hlbiB1c2VycyBleHBhbmQgb3IgY29sbGFwc2UgdGhlIGFjY29yZGlvbi5cbiAgICogVGhpcyBtZXRob2QgZXh0cmFjdHMgdGhlIG5ldyBzdGF0ZSBmcm9tIHRoZSBldmVudCBkZXRhaWxzIGFuZCB1cGRhdGVzIHRoZSBjb21wb25lbnQnc1xuICAgKiBpbnRlcm5hbCBzdGF0ZSBhY2NvcmRpbmdseS4gSXQgc3BlY2lmaWNhbGx5IGxpc3RlbnMgZm9yIElPTi1BQ0NPUkRJT04tR1JPVVAgZXZlbnRzIHRvXG4gICAqIGVuc3VyZSBwcm9wZXIgZXZlbnQgc291cmNlIHZhbGlkYXRpb24gYW5kIHByZXZlbnQgaGFuZGxpbmcgb2YgdW5yZWxhdGVkIGV2ZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgb2JqZWN0IGNvbnRhaW5pbmcgYWNjb3JkaW9uIHN0YXRlIGNoYW5nZSBkZXRhaWxzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAgICogICBwYXJ0aWNpcGFudCBJIGFzIElvbi1BY2NvcmRpb25cbiAgICogICBwYXJ0aWNpcGFudCBGIGFzIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqXG4gICAqICAgVS0+Pkk6IENsaWNrIGFjY29yZGlvbiBoZWFkZXJcbiAgICogICBJLT4+RjogaGFuZGxlQ2hhbmdlKEN1c3RvbUV2ZW50KVxuICAgKiAgIEYtPj5GOiBFeHRyYWN0IHRhcmdldCBhbmQgZGV0YWlsIGZyb20gZXZlbnRcbiAgICogICBGLT4+RjogVmFsaWRhdGUgdGFyZ2V0IGlzIElPTi1BQ0NPUkRJT04tR1JPVVBcbiAgICogICBhbHQgdmFsaWQgdGFyZ2V0XG4gICAqICAgICBGLT4+RjogVXBkYXRlIGlzT3BlbiA9ICEhdmFsdWVcbiAgICogICBlbmRcbiAgICogICBGLT4+STogUmVmbGVjdCB1cGRhdGVkIHN0YXRlXG4gICAqXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgYWNjb3JkaW9uIHRvZ2dsZSBmdW5jdGlvbmFsaXR5IHdpdGggdmFsaWRhdGlvbiBlcnJvciBjb25zaWRlcmF0aW9uLlxuICAgKiBAc3VtbWFyeSBNYW5hZ2VzIHRoZSBleHBhbmQvY29sbGFwc2Ugc3RhdGUgb2YgdGhlIGFjY29yZGlvbiB3aGlsZSByZXNwZWN0aW5nIHZhbGlkYXRpb24gZXJyb3Igc3RhdGVzLlxuICAgKiBXaGVuIHZhbGlkYXRpb24gZXJyb3JzIGFyZSBwcmVzZW50LCB0aGUgYWNjb3JkaW9uIGNhbm5vdCBiZSBjb2xsYXBzZWQgdG8gZW5zdXJlIHVzZXJzIGNhbiBzZWVcbiAgICogYW5kIGFkZHJlc3MgdGhlIGVycm9ycy4gV2hlbiBubyBlcnJvcnMgZXhpc3QsIHVzZXJzIGNhbiBmcmVlbHkgdG9nZ2xlIHRoZSBhY2NvcmRpb24gc3RhdGUuXG4gICAqIFRoaXMgbWV0aG9kIGFsc28gc3RvcHMgZXZlbnQgcHJvcGFnYXRpb24gdG8gcHJldmVudCB1bndhbnRlZCBzaWRlIGVmZmVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IFtldmVudF0gLSBPcHRpb25hbCBldmVudCBvYmplY3QgZnJvbSB1c2VyIGludGVyYWN0aW9uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGhhbmRsZUFjY29yZGlvblRvZ2dsZShldmVudD86IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgaWYoZXZlbnQpXG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICBpZighdGhpcy5oYXNWYWxpZGF0aW9uRXJyb3JzKSB7XG4gICAgICB0aGlzLmFjY29yZGlvbkNvbXBvbmVudC52YWx1ZSA9IHRoaXMuaXNPcGVuID8gdW5kZWZpbmVkIDogJ29wZW4nO1xuICAgICAgdGhpcy5pc09wZW4gPSAhIXRoaXMuYWNjb3JkaW9uQ29tcG9uZW50LnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyB2YWxpZGF0aW9uIGVycm9yIGV2ZW50cyBmcm9tIGNoaWxkIGZvcm0gZmllbGRzLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgdmFsaWRhdGlvbiBlcnJvciBldmVudHMgZGlzcGF0Y2hlZCBieSBmb3JtIGZpZWxkcyB3aXRoaW4gdGhlIGZpZWxkc2V0LlxuICAgKiBXaGVuIGVycm9ycyBhcmUgZGV0ZWN0ZWQsIHRoZSBhY2NvcmRpb24gaXMgZm9yY2VkIG9wZW4gYW5kIHByZXZlbnRlZCBmcm9tIGNvbGxhcHNpbmdcbiAgICogdG8gZW5zdXJlIHVzZXJzIGNhbiBzZWUgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuIFRoaXMgbWV0aG9kIHVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzXG4gICAqIGVycm9yIHN0YXRlIGFuZCBhY2NvcmRpb24gdmlzaWJpbGl0eSBhY2NvcmRpbmdseS5cbiAgICpcbiAgICogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZlbnQgLSBDdXN0b20gZXZlbnQgY29udGFpbmluZyB2YWxpZGF0aW9uIGVycm9yIGRldGFpbHNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlVmFsaWRhdGlvbkVycm9yKGV2ZW50OiBDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IHtoYXNFcnJvcnN9ID0gZXZlbnQuZGV0YWlsO1xuICAgIHRoaXMuaXNPcGVuID0gdGhpcy5oYXNWYWxpZGF0aW9uRXJyb3JzID0gaGFzRXJyb3JzO1xuICAgIGlmKGhhc0Vycm9ycylcbiAgICAgIHRoaXMuYWNjb3JkaW9uQ29tcG9uZW50LnZhbHVlID0gJ29wZW4nO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhbmQgc3RvcmVzIGEgbmV3IG9yIHVwZGF0ZWQgdmFsdWUgaW4gdGhlIGZpZWxkc2V0LlxuICAgKiBAc3VtbWFyeSBIYW5kbGVzIGJvdGggY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9ucyBmb3IgZmllbGRzZXQgaXRlbXMuIFBhcnNlcyBhbmQgY2xlYW5zXG4gICAqIHRoZSBpbnB1dCB2YWx1ZSwgZGV0ZXJtaW5lcyB0aGUgb3BlcmF0aW9uIHR5cGUgYmFzZWQgb24gdGhlIHVwZGF0aW5nIHN0YXRlLCBhbmQgZWl0aGVyXG4gICAqIGFkZHMgYSBuZXcgaXRlbSBvciB1cGRhdGVzIGFuIGV4aXN0aW5nIG9uZS4gTWFpbnRhaW5zIGRhdGEgaW50ZWdyaXR5IGFuZCBVSSBjb25zaXN0ZW5jeS5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBzZXRWYWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gKHRoaXMuZm9ybUdyb3VwIGFzIEZvcm1BcnJheSkuY29udHJvbHMubWFwKCh7dmFsdWV9KSA9PiB2YWx1ZSk7XG4gICAgdGhpcy5pdGVtcyA9IHRoaXMudmFsdWVcbiAgICAuZmlsdGVyKHYgPT4gdlt0aGlzLnBrXSAhPT0gdW5kZWZpbmVkKVxuICAgIC5tYXAoKHYsIGluZGV4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pdGVtTWFwcGVyKHYsIHRoaXMubWFwcGVyKSxcbiAgICAgICAgaW5kZXg6IGluZGV4ICsgMVxuICAgICAgfSBhcyBJRmllbGRTZXRJdGVtO1xuICAgIH0pO1xuICAgIGNvbnN0IGlucHV0Q29udGFpbmVycyA9IHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRjZi1pbnB1dC1pdGVtJyk7XG4gICAgaW5wdXRDb250YWluZXJzLmZvckVhY2goKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0LCBpb24taW5wdXQsIGlvbi10ZXh0YXJlYSwgdGV4dGFyZWEnKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmKGlucHV0KVxuICAgICAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICAgIH0pXG4gICAgdGhpcy51cGRhdGluZ0l0ZW0gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEF1dG9tYXRpY2FsbHkgY29uZmlndXJlcyB0aGUgZmllbGQgbWFwcGluZyBiYXNlZCBvbiB0aGUgdmFsdWUgc3RydWN0dXJlLlxuICAgKiBAc3VtbWFyeSBBbmFseXplcyB0aGUgcHJvdmlkZWQgdmFsdWUgb2JqZWN0IHRvIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHRoZSBwcmltYXJ5IGtleVxuICAgKiBhbmQgY3JlYXRlIGFwcHJvcHJpYXRlIGZpZWxkIG1hcHBpbmdzIGZvciBkaXNwbGF5IHB1cnBvc2VzLiBTZXRzIHVwIHRoZSBtYXBwZXIgb2JqZWN0XG4gICAqIHdpdGggdGl0bGUsIGRlc2NyaXB0aW9uLCBhbmQgaW5kZXggZmllbGRzIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5VmFsdWV9IHZhbHVlIC0gU2FtcGxlIHZhbHVlIG9iamVjdCB1c2VkIHRvIGRldGVybWluZSBmaWVsZCBtYXBwaW5nc1xuICAgKiBAcmV0dXJucyB7S2V5VmFsdWV9IFRoZSBjb25maWd1cmVkIG1hcHBlciBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGdldE1hcHBlcih2YWx1ZTogS2V5VmFsdWUpOiBLZXlWYWx1ZSB7XG4gICAgaWYoIXRoaXMucGspXG4gICAgICB0aGlzLnBrID0gT2JqZWN0LmtleXModmFsdWUpWzBdO1xuICAgIGlmKCFPYmplY3Qua2V5cyh0aGlzLm1hcHBlcikubGVuZ3RoKVxuICAgICAgdGhpcy5tYXBwZXJbJ3RpdGxlJ10gPSB0aGlzLnBrO1xuICAgIHRoaXMubWFwcGVyWydpbmRleCddID0gXCJpbmRleFwiO1xuICAgIGZvcihjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgIGlmKE9iamVjdC5rZXlzKHRoaXMubWFwcGVyKS5sZW5ndGggPj0gMiB8fCBPYmplY3Qua2V5cyh0aGlzLm1hcHBlcikubGVuZ3RoID09PSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoKVxuICAgICAgICBicmVhaztcbiAgICAgIGlmKCF0aGlzLm1hcHBlclsndGl0bGUnXSkge1xuICAgICAgICB0aGlzLm1hcHBlclsndGl0bGUnXSA9IGtleTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWFwcGVyWydkZXNjcmlwdGlvbiddID0ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXBwZXI7XG4gIH1cbn1cbiIsIlxuXG48ZmllbGRzZXRcbiAgKGZpZWxkc2V0QWRkR3JvdXBFdmVudCk9XCJoYW5kbGVDcmVhdGVJdGVtKCRldmVudClcIlxuICAoZmllbGRzZXRSZW1vdmVHcm91cEV2ZW50KT1cImhhbmRsZVJlbW92ZUl0ZW0odW5kZWZpbmVkLCAkZXZlbnQpXCJcbiAgW2NsYXNzXT1cIidkY2YtZmllbGRzZXQgJyArIG9wZXJhdGlvblwiXG4gICNjb21wb25lbnQ+XG4gIDxpb24tYWNjb3JkaW9uLWdyb3VwIFtuZ0NsYXNzXT1cInsnb3Blbic6IGlzT3BlbiwgJ2hhc1ZhbGlkYXRpb25FcnJvcnMnOiBoYXNWYWxpZGF0aW9uRXJyb3JzfVwiICAodmFsaWRhdGlvbkVycm9yRXZlbnQpPVwiaGFuZGxlVmFsaWRhdGlvbkVycm9yKCRldmVudClcIiAjYWNjb3JkaW9uQ29tcG9uZW50PlxuICAgIDxpb24tYWNjb3JkaW9uIHZhbHVlPVwib3BlblwiPlxuICAgICAgPGlvbi1pdGVtIHNsb3Q9XCJoZWFkZXJcIiAoY2xpY2spPVwiaGFuZGxlQWNjb3JkaW9uVG9nZ2xlKCRldmVudClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRjZi1ncmlkIGRjZi1ncmlkLWNvbGxhcHNlIGRjZi1mbGV4IGRjZi1mbGV4LW1pZGRsZSBkY2Ytd2lkdGgtMS0xXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRjZi13aWR0aC1leHBhbmRcIj5cbiAgICAgICAgICAgIDxsZWdlbmQ+e3sgbmFtZSB8IHRyYW5zbGF0ZSB9fTwvbGVnZW5kPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZighaXNSZXF1aXJlZCAmJiBbJ2NyZWF0ZScsICd1cGRhdGUnXS5pbmNsdWRlcyhvcGVyYXRpb24pKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGNmLXdpZHRoLWF1dG8gZGNmLWRlbGV0ZVwiPlxuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBzaXplPVwic21hbGxcIiAoY2xpY2spPVwiaGFuZGxlUmVtb3ZlQ29tcG9uZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInRyYXNoLW91dGxpbmVcIiBjb2xvcj1cImRhcmtcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICA8ZGl2IHNsb3Q9XCJjb250ZW50XCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIWlzT3BlblwiPlxuICAgICAgICBAaWYobXVsdGlwbGUgJiYgaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgPGlvbi1saXN0IGNsYXNzPVwiZGNmLWZpZWxkcy1saXN0XCI+XG4gICAgICAgICAgICA8aW9uLXJlb3JkZXItZ3JvdXAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXAucGFyZW50XCIgW2Rpc2FibGVkXT1cInVwZGF0aW5nSXRlbVwiIChpb25JdGVtUmVvcmRlcik9XCJoYW5kbGVSZW9yZGVySXRlbXMoJGFueSgkZXZlbnQpKVwiICNhY2NvcmRpb25Db21wb25lbnQ+XG4gICAgICAgICAgICAgIEBmb3IoaXRlbSBvZiBpdGVtczsgdHJhY2sgaXRlbS5pbmRleCkge1xuICAgICAgICAgICAgICAgIDxpb24taXRlbSBbbmdDbGFzc109XCJ7J25vdC11bmlxdWUnOiBpdGVtLnRpdGxlID09PSBpc1VuaXF1ZUVycm9yfVwiIGxpbmVzPVwiZnVsbFwiIFtidXR0b25dPVwiZmFsc2VcIiBbbmdDbGFzc109XCJ7J3VwZGF0aW5nJzogdXBkYXRpbmdJdGVtPy5bcGtdID09PSBpdGVtLnRpdGxlfVwiPlxuICAgICAgICAgICAgICAgICAgQGlmKGl0ZW1zPy5sZW5ndGggPiAxICYmICF1cGRhdGluZ0l0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgPGlvbi1yZW9yZGVyIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwic3dhcC12ZXJ0aWNhbC1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tcmVvcmRlcj5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IHNsb3Q9XCJzdGFydFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBjbGFzcz1cImRjZi1yZW9yZGVyLWRpc2FibGVkXCIgc2l6ZT1cInNtYWxsXCIgbmFtZT1cInN3YXAtdmVydGljYWwtb3V0bGluZVwiIGRpc2FibGVkPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBbY29sb3JdPVwiKGl0ZW0udGl0bGUgPT09IGlzVW5pcXVlRXJyb3IgJiYgIXVwZGF0aW5nSXRlbS50aXRsZSA9PT0gaXRlbS50aXRsZSkgPyAnZGFuZ2VyJyA6ICcnXCI+e3sgaXRlbS5pbmRleCB9fS4ge3sgaXRlbS50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICBAaWYoaXRlbS5kZXNjcmlwdGlvbj8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cImRjZi1zdWJ0aXRsZVwiPnt7aXRlbS5kZXNjcmlwdGlvbn19PC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICBAaWYoIXVwZGF0aW5nSXRlbSB8fCB1cGRhdGluZ0l0ZW0/Lltwa10gIT09IGl0ZW0udGl0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgc2l6ZT1cInNtYWxsXCIgKGNsaWNrKT1cImhhbmRsZVVwZGF0ZUl0ZW0oaXRlbS50aXRsZSwgJGluZGV4KVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY3JlYXRlLW91dGxpbmVcIiBjb2xvcj1cImRhcmtcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBAaWYoIXVwZGF0aW5nSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBzaXplPVwic21hbGxcIiAoY2xpY2spPVwiaGFuZGxlUmVtb3ZlSXRlbShpdGVtLnRpdGxlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwidHJhc2gtb3V0bGluZVwiIGNvbG9yPVwiZGFya1wiIHNsb3Q9XCJpY29uLW9ubHlcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9pb24tcmVvcmRlci1ncm91cD5cbiAgICAgICAgICA8L2lvbi1saXN0PlxuICAgICAgICB9XG5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG4gICAgICAgIEBpZihtdWx0aXBsZSAmJiBbJ2NyZWF0ZScsICd1cGRhdGUnXS5pbmNsdWRlcyhvcGVyYXRpb24pKSB7XG4gICAgICAgICAgQGlmKGlzVW5pcXVlRXJyb3IpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkY2Ytbm90LXVuaXF1ZS1jb250YWluZXIgZGNmLWFuaW1hdGlvbiBkY2YtYW5pbWF0aW9uLWJvdHRvbS1zbWFsbCBkY2YtYW5pbWF0aW9uLWZhc3RcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiBkY2YtZ3JpZCBkY2YtZ3JpZC1jb2xsYXBzZSBkY2Ytd2lkdGgtMS0xIFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkY2YtYXV0b1wiIFthdHRyLnN0eWxlXT1cIidtYXgtd2lkdGg6IDUwcHgnXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFsZXJ0LWNpcmNsZS1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGNmLXdpZHRoLWV4cGFuZFwiPlxuICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFuZ2VyXCIgY2xhc3M9XCJkY2YtdGV4dC1zbWFsbFwiPnt7IGxvY2FsZSArICcubm90X3VuaXF1ZScgfCB0cmFuc2xhdGUgOiB7IHZhbHVlOiBpc1VuaXF1ZUVycm9yIH0gfX08L2lvbi10ZXh0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGNmLW1hcmdpbi1ib3R0b20gZGNmLWdyaWQgZGNmLWdyaWQtY29sbGFwc2UgZGNmLWZsZXhcIj5cbiAgICAgICAgICAgIEBpZih1cGRhdGluZ0l0ZW0pIHtcbiAgICAgICAgICAgICAgPGlvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYW5nZXJcIiAoY2xpY2spPVwiaGFuZGxlQ2FuY2VsVXBkYXRlSXRlbSgpXCI+XG4gICAgICAgICAgICAgICAge3sgYnV0dG9uQ2FuY2VsTGFiZWwgfX1cbiAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPGlvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgZmlsbD1cImNsZWFyXCIgY2xhc3M9XCJkY2YtYnV0dG9uLWFkZFwiIChjbGljayk9XCJoYW5kbGVDcmVhdGVJdGVtKClcIj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJhZGQtb3V0bGluZVwiIHNsb3Q9XCJzdGFydFwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgIHt7YnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgPC9kaXY+XG4gICAgPC9pb24tYWNjb3JkaW9uPlxuICA8L2lvbi1hY2NvcmRpb24tZ3JvdXA+XG48L2ZpZWxkc2V0PlxuXG4iXX0=
|