UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

328 lines 42.1 kB
import { __decorate } from "tslib"; import { NgClass, NgIf, NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, ContentChildren, Directive, Input, Optional, ViewEncapsulation } from '@angular/core'; import { merge, Subject } from 'rxjs'; import { distinctUntilChanged, map, mergeMap, startWith, switchMap, takeUntil } from 'rxjs/operators'; import { NzFormNoStatusService, NzFormPatchModule } from 'ng-zorro-antd/core/form'; import { getStatusClassNames, InputBoolean } from 'ng-zorro-antd/core/util'; import { NzInputNumberGroupSlotComponent } from './input-number-group-slot.component'; import { NzInputNumberComponent } from './input-number.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/a11y"; import * as i2 from "@angular/cdk/bidi"; import * as i3 from "ng-zorro-antd/core/form"; export class NzInputNumberGroupWhitSuffixOrPrefixDirective { constructor(elementRef) { this.elementRef = elementRef; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: NzInputNumberGroupWhitSuffixOrPrefixDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.7", type: NzInputNumberGroupWhitSuffixOrPrefixDirective, isStandalone: true, selector: "nz-input-number-group[nzSuffix], nz-input-number-group[nzPrefix]", ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: NzInputNumberGroupWhitSuffixOrPrefixDirective, decorators: [{ type: Directive, args: [{ selector: `nz-input-number-group[nzSuffix], nz-input-number-group[nzPrefix]`, standalone: true }] }], ctorParameters: () => [{ type: i0.ElementRef }] }); export class NzInputNumberGroupComponent { constructor(focusMonitor, elementRef, renderer, cdr, directionality, nzFormStatusService, nzFormNoStatusService) { this.focusMonitor = focusMonitor; this.elementRef = elementRef; this.renderer = renderer; this.cdr = cdr; this.directionality = directionality; this.nzFormStatusService = nzFormStatusService; this.nzFormNoStatusService = nzFormNoStatusService; this.nzAddOnBeforeIcon = null; this.nzAddOnAfterIcon = null; this.nzPrefixIcon = null; this.nzSuffixIcon = null; this.nzStatus = ''; this.nzSize = 'default'; this.nzCompact = false; this.isLarge = false; this.isSmall = false; this.isAffix = false; this.isAddOn = false; this.isFeedback = false; this.focused = false; this.disabled = false; this.dir = 'ltr'; // status this.prefixCls = 'ant-input-number'; this.affixStatusCls = {}; this.groupStatusCls = {}; this.affixInGroupStatusCls = {}; this.status = ''; this.hasFeedback = false; this.destroy$ = new Subject(); } updateChildrenInputSize() { if (this.listOfNzInputNumberComponent) { this.listOfNzInputNumberComponent.forEach(item => (item.nzSize = this.nzSize)); } } ngOnInit() { this.nzFormStatusService?.formStatusChanges .pipe(distinctUntilChanged((pre, cur) => { return pre.status === cur.status && pre.hasFeedback === cur.hasFeedback; }), takeUntil(this.destroy$)) .subscribe(({ status, hasFeedback }) => { this.setStatusStyles(status, hasFeedback); }); this.focusMonitor .monitor(this.elementRef, true) .pipe(takeUntil(this.destroy$)) .subscribe(focusOrigin => { this.focused = !!focusOrigin; this.cdr.markForCheck(); }); this.dir = this.directionality.value; this.directionality.change?.pipe(takeUntil(this.destroy$)).subscribe((direction) => { this.dir = direction; }); } ngAfterContentInit() { this.updateChildrenInputSize(); const listOfInputChange$ = this.listOfNzInputNumberComponent.changes.pipe(startWith(this.listOfNzInputNumberComponent)); listOfInputChange$ .pipe(switchMap(list => merge(...[listOfInputChange$, ...list.map((input) => input.disabled$)])), mergeMap(() => listOfInputChange$), map(list => list.some((input) => input.nzDisabled)), takeUntil(this.destroy$)) .subscribe(disabled => { this.disabled = disabled; this.cdr.markForCheck(); }); } ngOnChanges(changes) { const { nzSize, nzSuffix, nzPrefix, nzPrefixIcon, nzSuffixIcon, nzAddOnAfter, nzAddOnBefore, nzAddOnAfterIcon, nzAddOnBeforeIcon, nzStatus } = changes; if (nzSize) { this.updateChildrenInputSize(); this.isLarge = this.nzSize === 'large'; this.isSmall = this.nzSize === 'small'; } if (nzSuffix || nzPrefix || nzPrefixIcon || nzSuffixIcon) { this.isAffix = !!(this.nzSuffix || this.nzPrefix || this.nzPrefixIcon || this.nzSuffixIcon); } if (nzAddOnAfter || nzAddOnBefore || nzAddOnAfterIcon || nzAddOnBeforeIcon) { this.isAddOn = !!(this.nzAddOnAfter || this.nzAddOnBefore || this.nzAddOnAfterIcon || this.nzAddOnBeforeIcon); this.nzFormNoStatusService?.noFormStatus?.next(this.isAddOn); } if (nzStatus) { this.setStatusStyles(this.nzStatus, this.hasFeedback); } } ngOnDestroy() { this.focusMonitor.stopMonitoring(this.elementRef); this.destroy$.next(); this.destroy$.complete(); } setStatusStyles(status, hasFeedback) { // set inner status this.status = status; this.hasFeedback = hasFeedback; this.isFeedback = !!status && hasFeedback; const baseAffix = !!(this.nzSuffix || this.nzPrefix || this.nzPrefixIcon || this.nzSuffixIcon); this.isAffix = baseAffix || (!this.isAddOn && hasFeedback); this.affixInGroupStatusCls = this.isAffix || this.isFeedback ? (this.affixStatusCls = getStatusClassNames(`${this.prefixCls}-affix-wrapper`, status, hasFeedback)) : {}; this.cdr.markForCheck(); // render status if nzStatus is set this.affixStatusCls = getStatusClassNames(`${this.prefixCls}-affix-wrapper`, this.isAddOn ? '' : status, this.isAddOn ? false : hasFeedback); this.groupStatusCls = getStatusClassNames(`${this.prefixCls}-group-wrapper`, this.isAddOn ? status : '', this.isAddOn ? hasFeedback : false); const statusCls = { ...this.affixStatusCls, ...this.groupStatusCls }; Object.keys(statusCls).forEach(status => { if (statusCls[status]) { this.renderer.addClass(this.elementRef.nativeElement, status); } else { this.renderer.removeClass(this.elementRef.nativeElement, status); } }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: NzInputNumberGroupComponent, deps: [{ token: i1.FocusMonitor }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i2.Directionality, optional: true }, { token: i3.NzFormStatusService, optional: true }, { token: i3.NzFormNoStatusService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: NzInputNumberGroupComponent, isStandalone: true, selector: "nz-input-number-group", inputs: { nzAddOnBeforeIcon: "nzAddOnBeforeIcon", nzAddOnAfterIcon: "nzAddOnAfterIcon", nzPrefixIcon: "nzPrefixIcon", nzSuffixIcon: "nzSuffixIcon", nzAddOnBefore: "nzAddOnBefore", nzAddOnAfter: "nzAddOnAfter", nzPrefix: "nzPrefix", nzStatus: "nzStatus", nzSuffix: "nzSuffix", nzSize: "nzSize", nzCompact: "nzCompact" }, host: { properties: { "class.ant-input-number-group": "nzCompact", "class.ant-input-number-group-compact": "nzCompact", "class.ant-input-number-group-wrapper": "isAddOn", "class.ant-input-number-group-wrapper-rtl": "isAddOn && dir === 'rtl'", "class.ant-input-number-group-wrapper-lg": "isAddOn && isLarge", "class.ant-input-number-group-wrapper-sm": "isAddOn && isSmall", "class.ant-input-number-affix-wrapper": "!isAddOn && isAffix", "class.ant-input-number-affix-wrapper-rtl": "!isAddOn && dir === 'rtl'", "class.ant-input-number-affix-wrapper-focused": "!isAddOn && isAffix && focused", "class.ant-input-number-affix-wrapper-disabled": "!isAddOn && isAffix && disabled", "class.ant-input-number-affix-wrapper-lg": "!isAddOn && isAffix && isLarge", "class.ant-input-number-affix-wrapper-sm": "!isAddOn && isAffix && isSmall" } }, providers: [NzFormNoStatusService], queries: [{ propertyName: "listOfNzInputNumberComponent", predicate: NzInputNumberComponent, descendants: true }], exportAs: ["nzInputNumberGroup"], usesOnChanges: true, ngImport: i0, template: ` <span class="ant-input-number-wrapper ant-input-number-group" *ngIf="isAddOn; else noAddOnTemplate"> <div *ngIf="nzAddOnBefore || nzAddOnBeforeIcon" nz-input-number-group-slot type="addon" [icon]="nzAddOnBeforeIcon" [template]="nzAddOnBefore" ></div> <div *ngIf="isAffix || hasFeedback; else contentTemplate" class="ant-input-number-affix-wrapper" [class.ant-input-number-affix-wrapper-disabled]="disabled" [class.ant-input-number-affix-wrapper-sm]="isSmall" [class.ant-input-number-affix-wrapper-lg]="isLarge" [class.ant-input-number-affix-wrapper-focused]="focused" [ngClass]="affixInGroupStatusCls" > <ng-template [ngTemplateOutlet]="affixTemplate"></ng-template> </div> <span *ngIf="nzAddOnAfter || nzAddOnAfterIcon" nz-input-number-group-slot type="addon" [icon]="nzAddOnAfterIcon" [template]="nzAddOnAfter" ></span> </span> <ng-template #noAddOnTemplate> <ng-template [ngIf]="isAffix" [ngIfElse]="contentTemplate"> <ng-template [ngTemplateOutlet]="affixTemplate"></ng-template> </ng-template> </ng-template> <ng-template #affixTemplate> <span *ngIf="nzPrefix || nzPrefixIcon" nz-input-number-group-slot type="prefix" [icon]="nzPrefixIcon" [template]="nzPrefix" ></span> <ng-template [ngTemplateOutlet]="contentTemplate"></ng-template> <span *ngIf="nzSuffix || nzSuffixIcon || isFeedback" nz-input-number-group-slot type="suffix" [icon]="nzSuffixIcon" [template]="nzSuffix" > <nz-form-item-feedback-icon *ngIf="isFeedback" [status]="status"></nz-form-item-feedback-icon> </span> </ng-template> <ng-template #contentTemplate> <ng-content></ng-content> <span *ngIf="!isAddOn && !isAffix && isFeedback" nz-input-number-group-slot type="suffix"> <nz-form-item-feedback-icon *ngIf="isFeedback" [status]="status"></nz-form-item-feedback-icon> </span> </ng-template> `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: NzInputNumberGroupSlotComponent, selector: "[nz-input-number-group-slot]", inputs: ["icon", "type", "template"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: NzFormPatchModule }, { kind: "component", type: i3.NzFormItemFeedbackIconComponent, selector: "nz-form-item-feedback-icon", inputs: ["status"], exportAs: ["nzFormFeedbackIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } __decorate([ InputBoolean() ], NzInputNumberGroupComponent.prototype, "nzCompact", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: NzInputNumberGroupComponent, decorators: [{ type: Component, args: [{ selector: 'nz-input-number-group', exportAs: 'nzInputNumberGroup', preserveWhitespaces: false, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [NzFormNoStatusService], template: ` <span class="ant-input-number-wrapper ant-input-number-group" *ngIf="isAddOn; else noAddOnTemplate"> <div *ngIf="nzAddOnBefore || nzAddOnBeforeIcon" nz-input-number-group-slot type="addon" [icon]="nzAddOnBeforeIcon" [template]="nzAddOnBefore" ></div> <div *ngIf="isAffix || hasFeedback; else contentTemplate" class="ant-input-number-affix-wrapper" [class.ant-input-number-affix-wrapper-disabled]="disabled" [class.ant-input-number-affix-wrapper-sm]="isSmall" [class.ant-input-number-affix-wrapper-lg]="isLarge" [class.ant-input-number-affix-wrapper-focused]="focused" [ngClass]="affixInGroupStatusCls" > <ng-template [ngTemplateOutlet]="affixTemplate"></ng-template> </div> <span *ngIf="nzAddOnAfter || nzAddOnAfterIcon" nz-input-number-group-slot type="addon" [icon]="nzAddOnAfterIcon" [template]="nzAddOnAfter" ></span> </span> <ng-template #noAddOnTemplate> <ng-template [ngIf]="isAffix" [ngIfElse]="contentTemplate"> <ng-template [ngTemplateOutlet]="affixTemplate"></ng-template> </ng-template> </ng-template> <ng-template #affixTemplate> <span *ngIf="nzPrefix || nzPrefixIcon" nz-input-number-group-slot type="prefix" [icon]="nzPrefixIcon" [template]="nzPrefix" ></span> <ng-template [ngTemplateOutlet]="contentTemplate"></ng-template> <span *ngIf="nzSuffix || nzSuffixIcon || isFeedback" nz-input-number-group-slot type="suffix" [icon]="nzSuffixIcon" [template]="nzSuffix" > <nz-form-item-feedback-icon *ngIf="isFeedback" [status]="status"></nz-form-item-feedback-icon> </span> </ng-template> <ng-template #contentTemplate> <ng-content></ng-content> <span *ngIf="!isAddOn && !isAffix && isFeedback" nz-input-number-group-slot type="suffix"> <nz-form-item-feedback-icon *ngIf="isFeedback" [status]="status"></nz-form-item-feedback-icon> </span> </ng-template> `, host: { '[class.ant-input-number-group]': 'nzCompact', '[class.ant-input-number-group-compact]': 'nzCompact', '[class.ant-input-number-group-wrapper]': `isAddOn`, '[class.ant-input-number-group-wrapper-rtl]': `isAddOn && dir === 'rtl'`, '[class.ant-input-number-group-wrapper-lg]': `isAddOn && isLarge`, '[class.ant-input-number-group-wrapper-sm]': `isAddOn && isSmall`, '[class.ant-input-number-affix-wrapper]': `!isAddOn && isAffix`, '[class.ant-input-number-affix-wrapper-rtl]': `!isAddOn && dir === 'rtl'`, '[class.ant-input-number-affix-wrapper-focused]': `!isAddOn && isAffix && focused`, '[class.ant-input-number-affix-wrapper-disabled]': `!isAddOn && isAffix && disabled`, '[class.ant-input-number-affix-wrapper-lg]': `!isAddOn && isAffix && isLarge`, '[class.ant-input-number-affix-wrapper-sm]': `!isAddOn && isAffix && isSmall` }, imports: [NgIf, NzInputNumberGroupSlotComponent, NgClass, NgTemplateOutlet, NzFormPatchModule], standalone: true }] }], ctorParameters: () => [{ type: i1.FocusMonitor }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i2.Directionality, decorators: [{ type: Optional }] }, { type: i3.NzFormStatusService, decorators: [{ type: Optional }] }, { type: i3.NzFormNoStatusService, decorators: [{ type: Optional }] }], propDecorators: { listOfNzInputNumberComponent: [{ type: ContentChildren, args: [NzInputNumberComponent, { descendants: true }] }], nzAddOnBeforeIcon: [{ type: Input }], nzAddOnAfterIcon: [{ type: Input }], nzPrefixIcon: [{ type: Input }], nzSuffixIcon: [{ type: Input }], nzAddOnBefore: [{ type: Input }], nzAddOnAfter: [{ type: Input }], nzPrefix: [{ type: Input }], nzStatus: [{ type: Input }], nzSuffix: [{ type: Input }], nzSize: [{ type: Input }], nzCompact: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtbnVtYmVyLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvaW5wdXQtbnVtYmVyL2lucHV0LW51bWJlci1ncm91cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQU9BLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFNBQVMsRUFFVCxLQUFLLEVBSUwsUUFBUSxFQUtSLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBdUIsTUFBTSx5QkFBeUIsQ0FBQztBQUV4RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFNUUsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7O0FBTWxFLE1BQU0sT0FBTyw2Q0FBNkM7SUFDeEQsWUFBbUIsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtJQUFHLENBQUM7OEdBRGxDLDZDQUE2QztrR0FBN0MsNkNBQTZDOzsyRkFBN0MsNkNBQTZDO2tCQUp6RCxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrRUFBa0U7b0JBQzVFLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7QUF3RkQsTUFBTSxP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QUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ21CLFNBQVM7c0JBQWpDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBGb2N1c01vbml0b3IgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBEaXJlY3Rpb24sIERpcmVjdGlvbmFsaXR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2JpZGknO1xuaW1wb3J0IHsgTmdDbGFzcywgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG1lcmdlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBtZXJnZU1hcCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTnpGb3JtTm9TdGF0dXNTZXJ2aWNlLCBOekZvcm1QYXRjaE1vZHVsZSwgTnpGb3JtU3RhdHVzU2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9mb3JtJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgTmdDbGFzc0ludGVyZmFjZSwgTnpTaXplTERTVHlwZSwgTnpTdGF0dXMsIE56VmFsaWRhdGVTdGF0dXMgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ2xhc3NOYW1lcywgSW5wdXRCb29sZWFuIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuXG5pbXBvcnQgeyBOeklucHV0TnVtYmVyR3JvdXBTbG90Q29tcG9uZW50IH0gZnJvbSAnLi9pbnB1dC1udW1iZXItZ3JvdXAtc2xvdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTnpJbnB1dE51bWJlckNvbXBvbmVudCB9IGZyb20gJy4vaW5wdXQtbnVtYmVyLmNvbXBvbmVudCc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogYG56LWlucHV0LW51bWJlci1ncm91cFtuelN1ZmZpeF0sIG56LWlucHV0LW51bWJlci1ncm91cFtuelByZWZpeF1gLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIE56SW5wdXROdW1iZXJHcm91cFdoaXRTdWZmaXhPclByZWZpeERpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7fVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduei1pbnB1dC1udW1iZXItZ3JvdXAnLFxuICBleHBvcnRBczogJ256SW5wdXROdW1iZXJHcm91cCcsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbTnpGb3JtTm9TdGF0dXNTZXJ2aWNlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c3BhbiBjbGFzcz1cImFudC1pbnB1dC1udW1iZXItd3JhcHBlciBhbnQtaW5wdXQtbnVtYmVyLWdyb3VwXCIgKm5nSWY9XCJpc0FkZE9uOyBlbHNlIG5vQWRkT25UZW1wbGF0ZVwiPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIm56QWRkT25CZWZvcmUgfHwgbnpBZGRPbkJlZm9yZUljb25cIlxuICAgICAgICBuei1pbnB1dC1udW1iZXItZ3JvdXAtc2xvdFxuICAgICAgICB0eXBlPVwiYWRkb25cIlxuICAgICAgICBbaWNvbl09XCJuekFkZE9uQmVmb3JlSWNvblwiXG4gICAgICAgIFt0ZW1wbGF0ZV09XCJuekFkZE9uQmVmb3JlXCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJpc0FmZml4IHx8IGhhc0ZlZWRiYWNrOyBlbHNlIGNvbnRlbnRUZW1wbGF0ZVwiXG4gICAgICAgIGNsYXNzPVwiYW50LWlucHV0LW51bWJlci1hZmZpeC13cmFwcGVyXCJcbiAgICAgICAgW2NsYXNzLmFudC1pbnB1dC1udW1iZXItYWZmaXgtd3JhcHBlci1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtjbGFzcy5hbnQtaW5wdXQtbnVtYmVyLWFmZml4LXdyYXBwZXItc21dPVwiaXNTbWFsbFwiXG4gICAgICAgIFtjbGFzcy5hbnQtaW5wdXQtbnVtYmVyLWFmZml4LXdyYXBwZXItbGddPVwiaXNMYXJnZVwiXG4gICAgICAgIFtjbGFzcy5hbnQtaW5wdXQtbnVtYmVyLWFmZml4LXdyYXBwZXItZm9jdXNlZF09XCJmb2N1c2VkXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiYWZmaXhJbkdyb3VwU3RhdHVzQ2xzXCJcbiAgICAgID5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFmZml4VGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhblxuICAgICAgICAqbmdJZj1cIm56QWRkT25BZnRlciB8fCBuekFkZE9uQWZ0ZXJJY29uXCJcbiAgICAgICAgbnotaW5wdXQtbnVtYmVyLWdyb3VwLXNsb3RcbiAgICAgICAgdHlwZT1cImFkZG9uXCJcbiAgICAgICAgW2ljb25dPVwibnpBZGRPbkFmdGVySWNvblwiXG4gICAgICAgIFt0ZW1wbGF0ZV09XCJuekFkZE9uQWZ0ZXJcIlxuICAgICAgPjwvc3Bhbj5cbiAgICA8L3NwYW4+XG4gICAgPG5nLXRlbXBsYXRlICNub0FkZE9uVGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaXNBZmZpeFwiIFtuZ0lmRWxzZV09XCJjb250ZW50VGVtcGxhdGVcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFmZml4VGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjYWZmaXhUZW1wbGF0ZT5cbiAgICAgIDxzcGFuXG4gICAgICAgICpuZ0lmPVwibnpQcmVmaXggfHwgbnpQcmVmaXhJY29uXCJcbiAgICAgICAgbnotaW5wdXQtbnVtYmVyLWdyb3VwLXNsb3RcbiAgICAgICAgdHlwZT1cInByZWZpeFwiXG4gICAgICAgIFtpY29uXT1cIm56UHJlZml4SWNvblwiXG4gICAgICAgIFt0ZW1wbGF0ZV09XCJuelByZWZpeFwiXG4gICAgICA+PC9zcGFuPlxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnRUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICA8c3BhblxuICAgICAgICAqbmdJZj1cIm56U3VmZml4IHx8IG56U3VmZml4SWNvbiB8fCBpc0ZlZWRiYWNrXCJcbiAgICAgICAgbnotaW5wdXQtbnVtYmVyLWdyb3VwLXNsb3RcbiAgICAgICAgdHlwZT1cInN1ZmZpeFwiXG4gICAgICAgIFtpY29uXT1cIm56U3VmZml4SWNvblwiXG4gICAgICAgIFt0ZW1wbGF0ZV09XCJuelN1ZmZpeFwiXG4gICAgICA+XG4gICAgICAgIDxuei1mb3JtLWl0ZW0tZmVlZGJhY2staWNvbiAqbmdJZj1cImlzRmVlZGJhY2tcIiBbc3RhdHVzXT1cInN0YXR1c1wiPjwvbnotZm9ybS1pdGVtLWZlZWRiYWNrLWljb24+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2NvbnRlbnRUZW1wbGF0ZT5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQWRkT24gJiYgIWlzQWZmaXggJiYgaXNGZWVkYmFja1wiIG56LWlucHV0LW51bWJlci1ncm91cC1zbG90IHR5cGU9XCJzdWZmaXhcIj5cbiAgICAgICAgPG56LWZvcm0taXRlbS1mZWVkYmFjay1pY29uICpuZ0lmPVwiaXNGZWVkYmFja1wiIFtzdGF0dXNdPVwic3RhdHVzXCI+PC9uei1mb3JtLWl0ZW0tZmVlZGJhY2staWNvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtbnVtYmVyLWdyb3VwXSc6ICduekNvbXBhY3QnLFxuICAgICdbY2xhc3MuYW50LWlucHV0LW51bWJlci1ncm91cC1jb21wYWN0XSc6ICduekNvbXBhY3QnLFxuICAgICdbY2xhc3MuYW50LWlucHV0LW51bWJlci1ncm91cC13cmFwcGVyXSc6IGBpc0FkZE9uYCxcbiAgICAnW2NsYXNzLmFudC1pbnB1dC1udW1iZXItZ3JvdXAtd3JhcHBlci1ydGxdJzogYGlzQWRkT24gJiYgZGlyID09PSAncnRsJ2AsXG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtbnVtYmVyLWdyb3VwLXdyYXBwZXItbGddJzogYGlzQWRkT24gJiYgaXNMYXJnZWAsXG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtbnVtYmVyLWdyb3VwLXdyYXBwZXItc21dJzogYGlzQWRkT24gJiYgaXNTbWFsbGAsXG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtbnVtYmVyLWFmZml4LXdyYXBwZXJdJzogYCFpc0FkZE9uICYmIGlzQWZmaXhgLFxuICAgICdbY2xhc3MuYW50LWlucHV0LW51bWJlci1hZmZpeC13cmFwcGVyLXJ0bF0nOiBgIWlzQWRkT24gJiYgZGlyID09PSAncnRsJ2AsXG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtbnVtYmVyLWFmZml4LXdyYXBwZXItZm9jdXNlZF0nOiBgIWlzQWRkT24gJiYgaXNBZmZpeCAmJiBmb2N1c2VkYCxcbiAgICAnW2NsYXNzLmFudC1pbnB1dC1udW1iZXItYWZmaXgtd3JhcHBlci1kaXNhYmxlZF0nOiBgIWlzQWRkT24gJiYgaXNBZmZpeCAmJiBkaXNhYmxlZGAsXG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtbnVtYmVyLWFmZml4LXdyYXBwZXItbGddJzogYCFpc0FkZE9uICYmIGlzQWZmaXggJiYgaXNMYXJnZWAsXG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtbnVtYmVyLWFmZml4LXdyYXBwZXItc21dJzogYCFpc0FkZE9uICYmIGlzQWZmaXggJiYgaXNTbWFsbGBcbiAgfSxcbiAgaW1wb3J0czogW05nSWYsIE56SW5wdXROdW1iZXJHcm91cFNsb3RDb21wb25lbnQsIE5nQ2xhc3MsIE5nVGVtcGxhdGVPdXRsZXQsIE56Rm9ybVBhdGNoTW9kdWxlXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBOeklucHV0TnVtYmVyR3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256Q29tcGFjdDogQm9vbGVhbklucHV0O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oTnpJbnB1dE51bWJlckNvbXBvbmVudCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBsaXN0T2ZOeklucHV0TnVtYmVyQ29tcG9uZW50ITogUXVlcnlMaXN0PE56SW5wdXROdW1iZXJDb21wb25lbnQ+O1xuICBASW5wdXQoKSBuekFkZE9uQmVmb3JlSWNvbj86IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBuekFkZE9uQWZ0ZXJJY29uPzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG56UHJlZml4SWNvbj86IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBuelN1ZmZpeEljb24/OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbnpBZGRPbkJlZm9yZT86IHN0cmluZyB8IFRlbXBsYXRlUmVmPHZvaWQ+O1xuICBASW5wdXQoKSBuekFkZE9uQWZ0ZXI/OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgQElucHV0KCkgbnpQcmVmaXg/OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgQElucHV0KCkgbnpTdGF0dXM6IE56U3RhdHVzID0gJyc7XG4gIEBJbnB1dCgpIG56U3VmZml4Pzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dm9pZD47XG4gIEBJbnB1dCgpIG56U2l6ZTogTnpTaXplTERTVHlwZSA9ICdkZWZhdWx0JztcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56Q29tcGFjdCA9IGZhbHNlO1xuICBpc0xhcmdlID0gZmFsc2U7XG4gIGlzU21hbGwgPSBmYWxzZTtcbiAgaXNBZmZpeCA9IGZhbHNlO1xuICBpc0FkZE9uID0gZmFsc2U7XG4gIGlzRmVlZGJhY2sgPSBmYWxzZTtcbiAgZm9jdXNlZCA9IGZhbHNlO1xuICBkaXNhYmxlZCA9IGZhbHNlO1xuICBkaXI6IERpcmVjdGlvbiA9ICdsdHInO1xuICAvLyBzdGF0dXNcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW50LWlucHV0LW51bWJlcic7XG4gIGFmZml4U3RhdHVzQ2xzOiBOZ0NsYXNzSW50ZXJmYWNlID0ge307XG4gIGdyb3VwU3RhdHVzQ2xzOiBOZ0NsYXNzSW50ZXJmYWNlID0ge307XG4gIGFmZml4SW5Hcm91cFN0YXR1c0NsczogTmdDbGFzc0ludGVyZmFjZSA9IHt9O1xuICBzdGF0dXM6IE56VmFsaWRhdGVTdGF0dXMgPSAnJztcbiAgaGFzRmVlZGJhY2s6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmb2N1c01vbml0b3I6IEZvY3VzTW9uaXRvcixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRpcmVjdGlvbmFsaXR5OiBEaXJlY3Rpb25hbGl0eSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIG56Rm9ybVN0YXR1c1NlcnZpY2U/OiBOekZvcm1TdGF0dXNTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbnpGb3JtTm9TdGF0dXNTZXJ2aWNlPzogTnpGb3JtTm9TdGF0dXNTZXJ2aWNlXG4gICkge31cblxuICB1cGRhdGVDaGlsZHJlbklucHV0U2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5saXN0T2ZOeklucHV0TnVtYmVyQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLmxpc3RPZk56SW5wdXROdW1iZXJDb21wb25lbnQuZm9yRWFjaChpdGVtID0+IChpdGVtLm56U2l6ZSA9IHRoaXMubnpTaXplKSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5uekZvcm1TdGF0dXNTZXJ2aWNlPy5mb3JtU3RhdHVzQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmUsIGN1cikgPT4ge1xuICAgICAgICAgIHJldHVybiBwcmUuc3RhdHVzID09PSBjdXIuc3RhdHVzICYmIHByZS5oYXNGZWVkYmFjayA9PT0gY3VyLmhhc0ZlZWRiYWNrO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCh7IHN0YXR1cywgaGFzRmVlZGJhY2sgfSkgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXR1c1N0eWxlcyhzdGF0dXMsIGhhc0ZlZWRiYWNrKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5mb2N1c01vbml0b3JcbiAgICAgIC5tb25pdG9yKHRoaXMuZWxlbWVudFJlZiwgdHJ1ZSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoZm9jdXNPcmlnaW4gPT4ge1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSAhIWZvY3VzT3JpZ2luO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5kaXIgPSB0aGlzLmRpcmVjdGlvbmFsaXR5LnZhbHVlO1xuICAgIHRoaXMuZGlyZWN0aW9uYWxpdHkuY2hhbmdlPy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChkaXJlY3Rpb246IERpcmVjdGlvbikgPT4ge1xuICAgICAgdGhpcy5kaXIgPSBkaXJlY3Rpb247XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDaGlsZHJlbklucHV0U2l6ZSgpO1xuICAgIGNvbnN0IGxpc3RPZklucHV0Q2hhbmdlJCA9IHRoaXMubGlzdE9mTnpJbnB1dE51bWJlckNvbXBvbmVudC5jaGFuZ2VzLnBpcGUoXG4gICAgICBzdGFydFdpdGgodGhpcy5saXN0T2ZOeklucHV0TnVtYmVyQ29tcG9uZW50KVxuICAgICk7XG4gICAgbGlzdE9mSW5wdXRDaGFuZ2UkXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKGxpc3QgPT5cbiAgICAgICAgICBtZXJnZSguLi5bbGlzdE9mSW5wdXRDaGFuZ2UkLCAuLi5saXN0Lm1hcCgoaW5wdXQ6IE56SW5wdXROdW1iZXJDb21wb25lbnQpID0+IGlucHV0LmRpc2FibGVkJCldKVxuICAgICAgICApLFxuICAgICAgICBtZXJnZU1hcCgoKSA9PiBsaXN0T2ZJbnB1dENoYW5nZSQpLFxuICAgICAgICBtYXAobGlzdCA9PiBsaXN0LnNvbWUoKGlucHV0OiBOeklucHV0TnVtYmVyQ29tcG9uZW50KSA9PiBpbnB1dC5uekRpc2FibGVkKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShkaXNhYmxlZCA9PiB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgbnpTaXplLFxuICAgICAgbnpTdWZmaXgsXG4gICAgICBuelByZWZpeCxcbiAgICAgIG56UHJlZml4SWNvbixcbiAgICAgIG56U3VmZml4SWNvbixcbiAgICAgIG56QWRkT25BZnRlcixcbiAgICAgIG56QWRkT25CZWZvcmUsXG4gICAgICBuekFkZE9uQWZ0ZXJJY29uLFxuICAgICAgbnpBZGRPbkJlZm9yZUljb24sXG4gICAgICBuelN0YXR1c1xuICAgIH0gPSBjaGFuZ2VzO1xuICAgIGlmIChuelNpemUpIHtcbiAgICAgIHRoaXMudXBkYXRlQ2hpbGRyZW5JbnB1dFNpemUoKTtcbiAgICAgIHRoaXMuaXNMYXJnZSA9IHRoaXMubnpTaXplID09PSAnbGFyZ2UnO1xuICAgICAgdGhpcy5pc1NtYWxsID0gdGhpcy5uelNpemUgPT09ICdzbWFsbCc7XG4gICAgfVxuICAgIGlmIChuelN1ZmZpeCB8fCBuelByZWZpeCB8fCBuelByZWZpeEljb24gfHwgbnpTdWZmaXhJY29uKSB7XG4gICAgICB0aGlzLmlzQWZmaXggPSAhISh0aGlzLm56U3VmZml4IHx8IHRoaXMubnpQcmVmaXggfHwgdGhpcy5uelByZWZpeEljb24gfHwgdGhpcy5uelN1ZmZpeEljb24pO1xuICAgIH1cbiAgICBpZiAobnpBZGRPbkFmdGVyIHx8IG56QWRkT25CZWZvcmUgfHwgbnpBZGRPbkFmdGVySWNvbiB8fCBuekFkZE9uQmVmb3JlSWNvbikge1xuICAgICAgdGhpcy5pc0FkZE9uID0gISEodGhpcy5uekFkZE9uQWZ0ZXIgfHwgdGhpcy5uekFkZE9uQmVmb3JlIHx8IHRoaXMubnpBZGRPbkFmdGVySWNvbiB8fCB0aGlzLm56QWRkT25CZWZvcmVJY29uKTtcbiAgICAgIHRoaXMubnpGb3JtTm9TdGF0dXNTZXJ2aWNlPy5ub0Zvcm1TdGF0dXM/Lm5leHQodGhpcy5pc0FkZE9uKTtcbiAgICB9XG4gICAgaWYgKG56U3RhdHVzKSB7XG4gICAgICB0aGlzLnNldFN0YXR1c1N0eWxlcyh0aGlzLm56U3RhdHVzLCB0aGlzLmhhc0ZlZWRiYWNrKTtcbiAgICB9XG4gIH1cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5lbGVtZW50UmVmKTtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcml2YXRlIHNldFN0YXR1c1N0eWxlcyhzdGF0dXM6IE56VmFsaWRhdGVTdGF0dXMsIGhhc0ZlZWRiYWNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gc2V0IGlubmVyIHN0YXR1c1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMuaGFzRmVlZGJhY2sgPSBoYXNGZWVkYmFjaztcbiAgICB0aGlzLmlzRmVlZGJhY2sgPSAhIXN0YXR1cyAmJiBoYXNGZWVkYmFjaztcbiAgICBjb25zdCBiYXNlQWZmaXggPSAhISh0aGlzLm56U3VmZml4IHx8IHRoaXMubnpQcmVmaXggfHwgdGhpcy5uelByZWZpeEljb24gfHwgdGhpcy5uelN1ZmZpeEljb24pO1xuICAgIHRoaXMuaXNBZmZpeCA9IGJhc2VBZmZpeCB8fCAoIXRoaXMuaXNBZGRPbiAmJiBoYXNGZWVkYmFjayk7XG4gICAgdGhpcy5hZmZpeEluR3JvdXBTdGF0dXNDbHMgPVxuICAgICAgdGhpcy5pc0FmZml4IHx8IHRoaXMuaXNGZWVkYmFja1xuICAgICAgICA/ICh0aGlzLmFmZml4U3RhdHVzQ2xzID0gZ2V0U3RhdHVzQ2xhc3NOYW1lcyhgJHt0aGlzLnByZWZpeENsc30tYWZmaXgtd3JhcHBlcmAsIHN0YXR1cywgaGFzRmVlZGJhY2spKVxuICAgICAgICA6IHt9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIC8vIHJlbmRlciBzdGF0dXMgaWYgbnpTdGF0dXMgaXMgc2V0XG4gICAgdGhpcy5hZmZpeFN0YXR1c0NscyA9IGdldFN0YXR1c0NsYXNzTmFtZXMoXG4gICAgICBgJHt0aGlzLnByZWZpeENsc30tYWZmaXgtd3JhcHBlcmAsXG4gICAgICB0aGlzLmlzQWRkT24gPyAnJyA6IHN0YXR1cyxcbiAgICAgIHRoaXMuaXNBZGRPbiA/IGZhbHNlIDogaGFzRmVlZGJhY2tcbiAgICApO1xuICAgIHRoaXMuZ3JvdXBTdGF0dXNDbHMgPSBnZXRTdGF0dXNDbGFzc05hbWVzKFxuICAgICAgYCR7dGhpcy5wcmVmaXhDbHN9LWdyb3VwLXdyYXBwZXJgLFxuICAgICAgdGhpcy5pc0FkZE9uID8gc3RhdHVzIDogJycsXG4gICAgICB0aGlzLmlzQWRkT24gPyBoYXNGZWVkYmFjayA6IGZhbHNlXG4gICAgKTtcbiAgICBjb25zdCBzdGF0dXNDbHMgPSB7XG4gICAgICAuLi50aGlzLmFmZml4U3RhdHVzQ2xzLFxuICAgICAgLi4udGhpcy5ncm91cFN0YXR1c0Nsc1xuICAgIH07XG4gICAgT2JqZWN0LmtleXMoc3RhdHVzQ2xzKS5mb3JFYWNoKHN0YXR1cyA9PiB7XG4gICAgICBpZiAoc3RhdHVzQ2xzW3N0YXR1c10pIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgc3RhdHVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHN0YXR1cyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==