UNPKG

ng-zorro-antd

Version:

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

332 lines (324 loc) 42 kB
import { __decorate } from "tslib"; import { NgClass, 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.2.1", ngImport: i0, type: NzInputNumberGroupWhitSuffixOrPrefixDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.2.1", 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.2.1", 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.2.1", 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: "17.0.0", version: "17.2.1", 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: ` @if (isAddOn) { <span class="ant-input-number-wrapper ant-input-number-group"> @if (nzAddOnBefore || nzAddOnBeforeIcon) { <div nz-input-number-group-slot type="addon" [icon]="nzAddOnBeforeIcon" [template]="nzAddOnBefore"></div> } @if (isAffix || hasFeedback) { <div 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> } @else { <ng-template [ngTemplateOutlet]="contentTemplate" /> } @if (nzAddOnAfter || nzAddOnAfterIcon) { <span nz-input-number-group-slot type="addon" [icon]="nzAddOnAfterIcon" [template]="nzAddOnAfter"></span> } </span> } @else { @if (isAffix) { <ng-template [ngTemplateOutlet]="affixTemplate" /> } @else { <ng-template [ngTemplateOutlet]="contentTemplate" /> } } <!-- Affix Template --> <ng-template #affixTemplate> @if (nzPrefix || nzPrefixIcon) { <span nz-input-number-group-slot type="prefix" [icon]="nzPrefixIcon" [template]="nzPrefix"></span> } <ng-template [ngTemplateOutlet]="contentTemplate" /> @if (nzSuffix || nzSuffixIcon || isFeedback) { <span nz-input-number-group-slot type="suffix" [icon]="nzSuffixIcon" [template]="nzSuffix"> @if (isFeedback) { <nz-form-item-feedback-icon [status]="status" /> } </span> } </ng-template> <!-- Content Template --> <ng-template #contentTemplate> <ng-content /> @if (!isAddOn && !isAffix && isFeedback) { <span nz-input-number-group-slot type="suffix"> @if (isFeedback) { <nz-form-item-feedback-icon [status]="status" /> } </span> } </ng-template> `, isInline: true, dependencies: [{ 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.2.1", 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: ` @if (isAddOn) { <span class="ant-input-number-wrapper ant-input-number-group"> @if (nzAddOnBefore || nzAddOnBeforeIcon) { <div nz-input-number-group-slot type="addon" [icon]="nzAddOnBeforeIcon" [template]="nzAddOnBefore"></div> } @if (isAffix || hasFeedback) { <div 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> } @else { <ng-template [ngTemplateOutlet]="contentTemplate" /> } @if (nzAddOnAfter || nzAddOnAfterIcon) { <span nz-input-number-group-slot type="addon" [icon]="nzAddOnAfterIcon" [template]="nzAddOnAfter"></span> } </span> } @else { @if (isAffix) { <ng-template [ngTemplateOutlet]="affixTemplate" /> } @else { <ng-template [ngTemplateOutlet]="contentTemplate" /> } } <!-- Affix Template --> <ng-template #affixTemplate> @if (nzPrefix || nzPrefixIcon) { <span nz-input-number-group-slot type="prefix" [icon]="nzPrefixIcon" [template]="nzPrefix"></span> } <ng-template [ngTemplateOutlet]="contentTemplate" /> @if (nzSuffix || nzSuffixIcon || isFeedback) { <span nz-input-number-group-slot type="suffix" [icon]="nzSuffixIcon" [template]="nzSuffix"> @if (isFeedback) { <nz-form-item-feedback-icon [status]="status" /> } </span> } </ng-template> <!-- Content Template --> <ng-template #contentTemplate> <ng-content /> @if (!isAddOn && !isAffix && isFeedback) { <span nz-input-number-group-slot type="suffix"> @if (isFeedback) { <nz-form-item-feedback-icon [status]="status" /> } </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: [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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtbnVtYmVyLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvaW5wdXQtbnVtYmVyL2lucHV0LW51bWJlci1ncm91cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQU9BLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsU0FBUyxFQUVULEtBQUssRUFJTCxRQUFRLEVBS1IsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGlCQUFpQixFQUF1QixNQUFNLHlCQUF5QixDQUFDO0FBRXhHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU1RSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN0RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7QUFNbEUsTUFBTSxPQUFPLDZDQUE2QztJQUN4RCxZQUFtQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO0lBQUcsQ0FBQzs4R0FEbEMsNkNBQTZDO2tHQUE3Qyw2Q0FBNkM7OzJGQUE3Qyw2Q0FBNkM7a0JBSnpELFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtFQUFrRTtvQkFDNUUsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOztBQTBGRCxNQUFNLE9BQU8sMkJBQTJC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O3NCQUFyQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNtQixTQUFTO3NCQUFqQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgRm9jdXNNb25pdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgRGlyZWN0aW9uLCBEaXJlY3Rpb25hbGl0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7IE5nQ2xhc3MsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBtZXJnZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgbWVyZ2VNYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE56Rm9ybU5vU3RhdHVzU2VydmljZSwgTnpGb3JtUGF0Y2hNb2R1bGUsIE56Rm9ybVN0YXR1c1NlcnZpY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvZm9ybSc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIE5nQ2xhc3NJbnRlcmZhY2UsIE56U2l6ZUxEU1R5cGUsIE56U3RhdHVzLCBOelZhbGlkYXRlU3RhdHVzIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IGdldFN0YXR1c0NsYXNzTmFtZXMsIElucHV0Qm9vbGVhbiB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS91dGlsJztcblxuaW1wb3J0IHsgTnpJbnB1dE51bWJlckdyb3VwU2xvdENvbXBvbmVudCB9IGZyb20gJy4vaW5wdXQtbnVtYmVyLWdyb3VwLXNsb3QuY29tcG9uZW50JztcbmltcG9ydCB7IE56SW5wdXROdW1iZXJDb21wb25lbnQgfSBmcm9tICcuL2lucHV0LW51bWJlci5jb21wb25lbnQnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IGBuei1pbnB1dC1udW1iZXItZ3JvdXBbbnpTdWZmaXhdLCBuei1pbnB1dC1udW1iZXItZ3JvdXBbbnpQcmVmaXhdYCxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBOeklucHV0TnVtYmVyR3JvdXBXaGl0U3VmZml4T3JQcmVmaXhEaXJlY3RpdmUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZikge31cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnotaW5wdXQtbnVtYmVyLWdyb3VwJyxcbiAgZXhwb3J0QXM6ICdueklucHV0TnVtYmVyR3JvdXAnLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW056Rm9ybU5vU3RhdHVzU2VydmljZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgQGlmIChpc0FkZE9uKSB7XG4gICAgICA8c3BhbiBjbGFzcz1cImFudC1pbnB1dC1udW1iZXItd3JhcHBlciBhbnQtaW5wdXQtbnVtYmVyLWdyb3VwXCI+XG4gICAgICAgIEBpZiAobnpBZGRPbkJlZm9yZSB8fCBuekFkZE9uQmVmb3JlSWNvbikge1xuICAgICAgICAgIDxkaXYgbnotaW5wdXQtbnVtYmVyLWdyb3VwLXNsb3QgdHlwZT1cImFkZG9uXCIgW2ljb25dPVwibnpBZGRPbkJlZm9yZUljb25cIiBbdGVtcGxhdGVdPVwibnpBZGRPbkJlZm9yZVwiPjwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChpc0FmZml4IHx8IGhhc0ZlZWRiYWNrKSB7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJhbnQtaW5wdXQtbnVtYmVyLWFmZml4LXdyYXBwZXJcIlxuICAgICAgICAgICAgW2NsYXNzLmFudC1pbnB1dC1udW1iZXItYWZmaXgtd3JhcHBlci1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbY2xhc3MuYW50LWlucHV0LW51bWJlci1hZmZpeC13cmFwcGVyLXNtXT1cImlzU21hbGxcIlxuICAgICAgICAgICAgW2NsYXNzLmFudC1pbnB1dC1udW1iZXItYWZmaXgtd3JhcHBlci1sZ109XCJpc0xhcmdlXCJcbiAgICAgICAgICAgIFtjbGFzcy5hbnQtaW5wdXQtbnVtYmVyLWFmZml4LXdyYXBwZXItZm9jdXNlZF09XCJmb2N1c2VkXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFmZml4SW5Hcm91cFN0YXR1c0Nsc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFmZml4VGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udGVudFRlbXBsYXRlXCIgLz5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAobnpBZGRPbkFmdGVyIHx8IG56QWRkT25BZnRlckljb24pIHtcbiAgICAgICAgICA8c3BhbiBuei1pbnB1dC1udW1iZXItZ3JvdXAtc2xvdCB0eXBlPVwiYWRkb25cIiBbaWNvbl09XCJuekFkZE9uQWZ0ZXJJY29uXCIgW3RlbXBsYXRlXT1cIm56QWRkT25BZnRlclwiPjwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9zcGFuPlxuICAgIH0gQGVsc2Uge1xuICAgICAgQGlmIChpc0FmZml4KSB7XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJhZmZpeFRlbXBsYXRlXCIgLz5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udGVudFRlbXBsYXRlXCIgLz5cbiAgICAgIH1cbiAgICB9XG5cbiAgICA8IS0tIEFmZml4IFRlbXBsYXRlIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjYWZmaXhUZW1wbGF0ZT5cbiAgICAgIEBpZiAobnpQcmVmaXggfHwgbnpQcmVmaXhJY29uKSB7XG4gICAgICAgIDxzcGFuIG56LWlucHV0LW51bWJlci1ncm91cC1zbG90IHR5cGU9XCJwcmVmaXhcIiBbaWNvbl09XCJuelByZWZpeEljb25cIiBbdGVtcGxhdGVdPVwibnpQcmVmaXhcIj48L3NwYW4+XG4gICAgICB9XG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udGVudFRlbXBsYXRlXCIgLz5cbiAgICAgIEBpZiAobnpTdWZmaXggfHwgbnpTdWZmaXhJY29uIHx8IGlzRmVlZGJhY2spIHtcbiAgICAgICAgPHNwYW4gbnotaW5wdXQtbnVtYmVyLWdyb3VwLXNsb3QgdHlwZT1cInN1ZmZpeFwiIFtpY29uXT1cIm56U3VmZml4SWNvblwiIFt0ZW1wbGF0ZV09XCJuelN1ZmZpeFwiPlxuICAgICAgICAgIEBpZiAoaXNGZWVkYmFjaykge1xuICAgICAgICAgICAgPG56LWZvcm0taXRlbS1mZWVkYmFjay1pY29uIFtzdGF0dXNdPVwic3RhdHVzXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIH1cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSBDb250ZW50IFRlbXBsYXRlIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjY29udGVudFRlbXBsYXRlPlxuICAgICAgPG5nLWNvbnRlbnQgLz5cbiAgICAgIEBpZiAoIWlzQWRkT24gJiYgIWlzQWZmaXggJiYgaXNGZWVkYmFjaykge1xuICAgICAgICA8c3BhbiBuei1pbnB1dC1udW1iZXItZ3JvdXAtc2xvdCB0eXBlPVwic3VmZml4XCI+XG4gICAgICAgICAgQGlmIChpc0ZlZWRiYWNrKSB7XG4gICAgICAgICAgICA8bnotZm9ybS1pdGVtLWZlZWRiYWNrLWljb24gW3N0YXR1c109XCJzdGF0dXNcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgfVxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmFudC1pbnB1dC1udW1iZXItZ3JvdXBdJzogJ256Q29tcGFjdCcsXG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtbnVtYmVyLWdyb3VwLWNvbXBhY3RdJzogJ256Q29tcGFjdCcsXG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtbnVtYmVyLWdyb3VwLXdyYXBwZXJdJzogYGlzQWRkT25gLFxuICAgICdbY2xhc3MuYW50LWlucHV0LW51bWJlci1ncm91cC13cmFwcGVyLXJ0bF0nOiBgaXNBZGRPbiAmJiBkaXIgPT09ICdydGwnYCxcbiAgICAnW2NsYXNzLmFudC1pbnB1dC1udW1iZXItZ3JvdXAtd3JhcHBlci1sZ10nOiBgaXNBZGRPbiAmJiBpc0xhcmdlYCxcbiAgICAnW2NsYXNzLmFudC1pbnB1dC1udW1iZXItZ3JvdXAtd3JhcHBlci1zbV0nOiBgaXNBZGRPbiAmJiBpc1NtYWxsYCxcbiAgICAnW2NsYXNzLmFudC1pbnB1dC1udW1iZXItYWZmaXgtd3JhcHBlcl0nOiBgIWlzQWRkT24gJiYgaXNBZmZpeGAsXG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtbnVtYmVyLWFmZml4LXdyYXBwZXItcnRsXSc6IGAhaXNBZGRPbiAmJiBkaXIgPT09ICdydGwnYCxcbiAgICAnW2NsYXNzLmFudC1pbnB1dC1udW1iZXItYWZmaXgtd3JhcHBlci1mb2N1c2VkXSc6IGAhaXNBZGRPbiAmJiBpc0FmZml4ICYmIGZvY3VzZWRgLFxuICAgICdbY2xhc3MuYW50LWlucHV0LW51bWJlci1hZmZpeC13cmFwcGVyLWRpc2FibGVkXSc6IGAhaXNBZGRPbiAmJiBpc0FmZml4ICYmIGRpc2FibGVkYCxcbiAgICAnW2NsYXNzLmFudC1pbnB1dC1udW1iZXItYWZmaXgtd3JhcHBlci1sZ10nOiBgIWlzQWRkT24gJiYgaXNBZmZpeCAmJiBpc0xhcmdlYCxcbiAgICAnW2NsYXNzLmFudC1pbnB1dC1udW1iZXItYWZmaXgtd3JhcHBlci1zbV0nOiBgIWlzQWRkT24gJiYgaXNBZmZpeCAmJiBpc1NtYWxsYFxuICB9LFxuICBpbXBvcnRzOiBbTnpJbnB1dE51bWJlckdyb3VwU2xvdENvbXBvbmVudCwgTmdDbGFzcywgTmdUZW1wbGF0ZU91dGxldCwgTnpGb3JtUGF0Y2hNb2R1bGVdLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIE56SW5wdXROdW1iZXJHcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpDb21wYWN0OiBCb29sZWFuSW5wdXQ7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihOeklucHV0TnVtYmVyQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIGxpc3RPZk56SW5wdXROdW1iZXJDb21wb25lbnQhOiBRdWVyeUxpc3Q8TnpJbnB1dE51bWJlckNvbXBvbmVudD47XG4gIEBJbnB1dCgpIG56QWRkT25CZWZvcmVJY29uPzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG56QWRkT25BZnRlckljb24/OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbnpQcmVmaXhJY29uPzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG56U3VmZml4SWNvbj86IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBuekFkZE9uQmVmb3JlPzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dm9pZD47XG4gIEBJbnB1dCgpIG56QWRkT25BZnRlcj86IHN0cmluZyB8IFRlbXBsYXRlUmVmPHZvaWQ+O1xuICBASW5wdXQoKSBuelByZWZpeD86IHN0cmluZyB8IFRlbXBsYXRlUmVmPHZvaWQ+O1xuICBASW5wdXQoKSBuelN0YXR1czogTnpTdGF0dXMgPSAnJztcbiAgQElucHV0KCkgbnpTdWZmaXg/OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgQElucHV0KCkgbnpTaXplOiBOelNpemVMRFNUeXBlID0gJ2RlZmF1bHQnO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpDb21wYWN0ID0gZmFsc2U7XG4gIGlzTGFyZ2UgPSBmYWxzZTtcbiAgaXNTbWFsbCA9IGZhbHNlO1xuICBpc0FmZml4ID0gZmFsc2U7XG4gIGlzQWRkT24gPSBmYWxzZTtcbiAgaXNGZWVkYmFjayA9IGZhbHNlO1xuICBmb2N1c2VkID0gZmFsc2U7XG4gIGRpc2FibGVkID0gZmFsc2U7XG4gIGRpcjogRGlyZWN0aW9uID0gJ2x0cic7XG4gIC8vIHN0YXR1c1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbnQtaW5wdXQtbnVtYmVyJztcbiAgYWZmaXhTdGF0dXNDbHM6IE5nQ2xhc3NJbnRlcmZhY2UgPSB7fTtcbiAgZ3JvdXBTdGF0dXNDbHM6IE5nQ2xhc3NJbnRlcmZhY2UgPSB7fTtcbiAgYWZmaXhJbkdyb3VwU3RhdHVzQ2xzOiBOZ0NsYXNzSW50ZXJmYWNlID0ge307XG4gIHN0YXR1czogTnpWYWxpZGF0ZVN0YXR1cyA9ICcnO1xuICBoYXNGZWVkYmFjazogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZvY3VzTW9uaXRvcjogRm9jdXNNb25pdG9yLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZGlyZWN0aW9uYWxpdHk6IERpcmVjdGlvbmFsaXR5LFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbnpGb3JtU3RhdHVzU2VydmljZT86IE56Rm9ybVN0YXR1c1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBuekZvcm1Ob1N0YXR1c1NlcnZpY2U/OiBOekZvcm1Ob1N0YXR1c1NlcnZpY2VcbiAgKSB7fVxuXG4gIHVwZGF0ZUNoaWxkcmVuSW5wdXRTaXplKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxpc3RPZk56SW5wdXROdW1iZXJDb21wb25lbnQpIHtcbiAgICAgIHRoaXMubGlzdE9mTnpJbnB1dE51bWJlckNvbXBvbmVudC5mb3JFYWNoKGl0ZW0gPT4gKGl0ZW0ubnpTaXplID0gdGhpcy5uelNpemUpKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm56Rm9ybVN0YXR1c1NlcnZpY2U/LmZvcm1TdGF0dXNDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZSwgY3VyKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHByZS5zdGF0dXMgPT09IGN1ci5zdGF0dXMgJiYgcHJlLmhhc0ZlZWRiYWNrID09PSBjdXIuaGFzRmVlZGJhY2s7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHsgc3RhdHVzLCBoYXNGZWVkYmFjayB9KSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdHVzU3R5bGVzKHN0YXR1cywgaGFzRmVlZGJhY2spO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmZvY3VzTW9uaXRvclxuICAgICAgLm1vbml0b3IodGhpcy5lbGVtZW50UmVmLCB0cnVlKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShmb2N1c09yaWdpbiA9PiB7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9ICEhZm9jdXNPcmlnaW47XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmRpciA9IHRoaXMuZGlyZWN0aW9uYWxpdHkudmFsdWU7XG4gICAgdGhpcy5kaXJlY3Rpb25hbGl0eS5jaGFuZ2U/LnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGRpcmVjdGlvbjogRGlyZWN0aW9uKSA9PiB7XG4gICAgICB0aGlzLmRpciA9IGRpcmVjdGlvbjtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuSW5wdXRTaXplKCk7XG4gICAgY29uc3QgbGlzdE9mSW5wdXRDaGFuZ2UkID0gdGhpcy5saXN0T2ZOeklucHV0TnVtYmVyQ29tcG9uZW50LmNoYW5nZXMucGlwZShcbiAgICAgIHN0YXJ0V2l0aCh0aGlzLmxpc3RPZk56SW5wdXROdW1iZXJDb21wb25lbnQpXG4gICAgKTtcbiAgICBsaXN0T2ZJbnB1dENoYW5nZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAobGlzdCA9PlxuICAgICAgICAgIG1lcmdlKC4uLltsaXN0T2ZJbnB1dENoYW5nZSQsIC4uLmxpc3QubWFwKChpbnB1dDogTnpJbnB1dE51bWJlckNvbXBvbmVudCkgPT4gaW5wdXQuZGlzYWJsZWQkKV0pXG4gICAgICAgICksXG4gICAgICAgIG1lcmdlTWFwKCgpID0+IGxpc3RPZklucHV0Q2hhbmdlJCksXG4gICAgICAgIG1hcChsaXN0ID0+IGxpc3Quc29tZSgoaW5wdXQ6IE56SW5wdXROdW1iZXJDb21wb25lbnQpID0+IGlucHV0Lm56RGlzYWJsZWQpKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGRpc2FibGVkID0+IHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7XG4gICAgICBuelNpemUsXG4gICAgICBuelN1ZmZpeCxcbiAgICAgIG56UHJlZml4LFxuICAgICAgbnpQcmVmaXhJY29uLFxuICAgICAgbnpTdWZmaXhJY29uLFxuICAgICAgbnpBZGRPbkFmdGVyLFxuICAgICAgbnpBZGRPbkJlZm9yZSxcbiAgICAgIG56QWRkT25BZnRlckljb24sXG4gICAgICBuekFkZE9uQmVmb3JlSWNvbixcbiAgICAgIG56U3RhdHVzXG4gICAgfSA9IGNoYW5nZXM7XG4gICAgaWYgKG56U2l6ZSkge1xuICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbklucHV0U2l6ZSgpO1xuICAgICAgdGhpcy5pc0xhcmdlID0gdGhpcy5uelNpemUgPT09ICdsYXJnZSc7XG4gICAgICB0aGlzLmlzU21hbGwgPSB0aGlzLm56U2l6ZSA9PT0gJ3NtYWxsJztcbiAgICB9XG4gICAgaWYgKG56U3VmZml4IHx8IG56UHJlZml4IHx8IG56UHJlZml4SWNvbiB8fCBuelN1ZmZpeEljb24pIHtcbiAgICAgIHRoaXMuaXNBZmZpeCA9ICEhKHRoaXMubnpTdWZmaXggfHwgdGhpcy5uelByZWZpeCB8fCB0aGlzLm56UHJlZml4SWNvbiB8fCB0aGlzLm56U3VmZml4SWNvbik7XG4gICAgfVxuICAgIGlmIChuekFkZE9uQWZ0ZXIgfHwgbnpBZGRPbkJlZm9yZSB8fCBuekFkZE9uQWZ0ZXJJY29uIHx8IG56QWRkT25CZWZvcmVJY29uKSB7XG4gICAgICB0aGlzLmlzQWRkT24gPSAhISh0aGlzLm56QWRkT25BZnRlciB8fCB0aGlzLm56QWRkT25CZWZvcmUgfHwgdGhpcy5uekFkZE9uQWZ0ZXJJY29uIHx8IHRoaXMubnpBZGRPbkJlZm9yZUljb24pO1xuICAgICAgdGhpcy5uekZvcm1Ob1N0YXR1c1NlcnZpY2U/Lm5vRm9ybVN0YXR1cz8ubmV4dCh0aGlzLmlzQWRkT24pO1xuICAgIH1cbiAgICBpZiAobnpTdGF0dXMpIHtcbiAgICAgIHRoaXMuc2V0U3RhdHVzU3R5bGVzKHRoaXMubnpTdGF0dXMsIHRoaXMuaGFzRmVlZGJhY2spO1xuICAgIH1cbiAgfVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLmVsZW1lbnRSZWYpO1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RhdHVzU3R5bGVzKHN0YXR1czogTnpWYWxpZGF0ZVN0YXR1cywgaGFzRmVlZGJhY2s6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBzZXQgaW5uZXIgc3RhdHVzXG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5oYXNGZWVkYmFjayA9IGhhc0ZlZWRiYWNrO1xuICAgIHRoaXMuaXNGZWVkYmFjayA9ICEhc3RhdHVzICYmIGhhc0ZlZWRiYWNrO1xuICAgIGNvbnN0IGJhc2VBZmZpeCA9ICEhKHRoaXMubnpTdWZmaXggfHwgdGhpcy5uelByZWZpeCB8fCB0aGlzLm56UHJlZml4SWNvbiB8fCB0aGlzLm56U3VmZml4SWNvbik7XG4gICAgdGhpcy5pc0FmZml4ID0gYmFzZUFmZml4IHx8ICghdGhpcy5pc0FkZE9uICYmIGhhc0ZlZWRiYWNrKTtcbiAgICB0aGlzLmFmZml4SW5Hcm91cFN0YXR1c0NscyA9XG4gICAgICB0aGlzLmlzQWZmaXggfHwgdGhpcy5pc0ZlZWRiYWNrXG4gICAgICAgID8gKHRoaXMuYWZmaXhTdGF0dXNDbHMgPSBnZXRTdGF0dXNDbGFzc05hbWVzKGAke3RoaXMucHJlZml4Q2xzfS1hZmZpeC13cmFwcGVyYCwgc3RhdHVzLCBoYXNGZWVkYmFjaykpXG4gICAgICAgIDoge307XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgLy8gcmVuZGVyIHN0YXR1cyBpZiBuelN0YXR1cyBpcyBzZXRcbiAgICB0aGlzLmFmZml4U3RhdHVzQ2xzID0gZ2V0U3RhdHVzQ2xhc3NOYW1lcyhcbiAgICAgIGAke3RoaXMucHJlZml4Q2xzfS1hZmZpeC13cmFwcGVyYCxcbiAgICAgIHRoaXMuaXNBZGRPbiA/ICcnIDogc3RhdHVzLFxuICAgICAgdGhpcy5pc0FkZE9uID8gZmFsc2UgOiBoYXNGZWVkYmFja1xuICAgICk7XG4gICAgdGhpcy5ncm91cFN0YXR1c0NscyA9IGdldFN0YXR1c0NsYXNzTmFtZXMoXG4gICAgICBgJHt0aGlzLnByZWZpeENsc30tZ3JvdXAtd3JhcHBlcmAsXG4gICAgICB0aGlzLmlzQWRkT24gPyBzdGF0dXMgOiAnJyxcbiAgICAgIHRoaXMuaXNBZGRPbiA/IGhhc0ZlZWRiYWNrIDogZmFsc2VcbiAgICApO1xuICAgIGNvbnN0IHN0YXR1c0NscyA9IHtcbiAgICAgIC4uLnRoaXMuYWZmaXhTdGF0dXNDbHMsXG4gICAgICAuLi50aGlzLmdyb3VwU3RhdHVzQ2xzXG4gICAgfTtcbiAgICBPYmplY3Qua2V5cyhzdGF0dXNDbHMpLmZvckVhY2goc3RhdHVzID0+IHtcbiAgICAgIGlmIChzdGF0dXNDbHNbc3RhdHVzXSkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCBzdGF0dXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgc3RhdHVzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19