UNPKG

ng-zorro-antd

Version:

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

689 lines 57.2 kB
/** * @fileoverview added by tsickle * Generated from: date-picker.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { __assign, __decorate, __metadata } from "tslib"; /** * @license * Copyright Alibaba.com All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Host, Input, Optional, Output, Renderer2, ViewChild, ViewEncapsulation } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { warnDeprecation } from 'ng-zorro-antd/core/logger'; import { NzNoAnimationDirective } from 'ng-zorro-antd/core/no-animation'; import { CandyDate, cloneDate } from 'ng-zorro-antd/core/time'; import { InputBoolean, toBoolean, valueFunctionProp } from 'ng-zorro-antd/core/util'; import { DateHelperService, NzI18nService } from 'ng-zorro-antd/i18n'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { DatePickerService } from './date-picker.service'; import { NzConfigService, WithConfig } from 'ng-zorro-antd/core/config'; import { NzPickerComponent } from './picker.component'; /** @type {?} */ var POPUP_STYLE_PATCH = { position: 'relative' }; // Aim to override antd's style to support overlay's position strategy (position:absolute will cause it not working beacuse the overlay can't get the height/width of it's content) /** @type {?} */ var NZ_CONFIG_COMPONENT_NAME = 'datePicker'; /** * The base picker for all common APIs */ var NzDatePickerComponent = /** @class */ (function () { function NzDatePickerComponent(nzConfigService, datePickerService, i18n, cdr, renderer, elementRef, dateHelper, noAnimation) { this.nzConfigService = nzConfigService; this.datePickerService = datePickerService; this.i18n = i18n; this.cdr = cdr; this.renderer = renderer; this.elementRef = elementRef; this.dateHelper = dateHelper; this.noAnimation = noAnimation; this.isRange = false; // Indicate whether the value is a range value // Indicate whether the value is a range value this.showWeek = false; // Should show as week picker // Should show as week picker this.focused = false; this.hostClassMap = {}; this.destroyed$ = new Subject(); this.isCustomPlaceHolder = false; this.showTime = false; // --- Common API this.nzAllowClear = true; this.nzAutoFocus = false; this.nzDisabled = false; /** * @deprecated 10.0.0. This is deprecated and going to be removed in 10.0.0. */ this.nzClassName = ''; this.nzPlaceHolder = ''; this.nzPopupStyle = POPUP_STYLE_PATCH; this.nzSize = 'default'; /** * @deprecated 10.0.0. This is deprecated and going to be removed in 10.0.0. */ this.nzStyle = null; this.nzShowToday = true; this.nzMode = 'date'; this.nzDefaultPickerValue = null; this.nzSeparator = undefined; this.nzSuffixIcon = 'calendar'; // TODO(@wenqi73) The PanelMode need named for each pickers and export this.nzOnPanelChange = new EventEmitter(); this.nzOnCalendarChange = new EventEmitter(); this.nzOnOk = new EventEmitter(); this.nzOnOpenChange = new EventEmitter(); // ------------------------------------------------------------------------ // | Control value accessor implements // ------------------------------------------------------------------------ // NOTE: onChangeFn/onTouchedFn will not be assigned if user not use as ngModel this.onChangeFn = (/** * @return {?} */ function () { return void 0; }); this.onTouchedFn = (/** * @return {?} */ function () { return void 0; }); } Object.defineProperty(NzDatePickerComponent.prototype, "nzShowTime", { get: /** * @return {?} */ function () { return this.showTime; }, set: /** * @param {?} value * @return {?} */ function (value) { this.showTime = typeof value === 'object' ? value : toBoolean(value); }, enumerable: true, configurable: true }); Object.defineProperty(NzDatePickerComponent.prototype, "realOpenState", { get: /** * @return {?} */ function () { return this.picker.animationOpenState; } // Use picker's real open state to let re-render the picker's content when shown up , enumerable: true, configurable: true }); /** * @return {?} */ NzDatePickerComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; // Subscribe the every locale change if the nzLocale is not handled by user if (!this.nzLocale) { this.i18n.localeChange.pipe(takeUntil(this.destroyed$)).subscribe((/** * @return {?} */ function () { return _this.setLocale(); })); } // Default value this.datePickerService.isRange = this.isRange; this.datePickerService.initValue(); this.datePickerService.emitValue$.pipe(takeUntil(this.destroyed$)).subscribe((/** * @param {?} _ * @return {?} */ function (_) { /** @type {?} */ var value = _this.datePickerService.value; _this.datePickerService.initialValue = cloneDate(value); if (_this.isRange) { /** @type {?} */ var vAsRange = (/** @type {?} */ (value)); if (vAsRange.length) { _this.onChangeFn([vAsRange[0].nativeDate, vAsRange[1].nativeDate]); } else { _this.onChangeFn([]); } } else { if (value) { _this.onChangeFn(((/** @type {?} */ (value))).nativeDate); } else { _this.onChangeFn(null); } } _this.onTouchedFn(); // When value emitted, overlay will be closed _this.picker.hideOverlay(); })); // Default format when it's empty if (!this.nzFormat) { if (this.showWeek) { this.nzFormat = 'yyyy-ww'; // Format for week } else { this.nzFormat = this.nzShowTime ? 'yyyy-MM-dd HH:mm:ss' : 'yyyy-MM-dd'; } } }; /** * @param {?} changes * @return {?} */ NzDatePickerComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { if (changes.nzPopupStyle) { // Always assign the popup style patch this.nzPopupStyle = this.nzPopupStyle ? __assign(__assign({}, this.nzPopupStyle), POPUP_STYLE_PATCH) : POPUP_STYLE_PATCH; } // Mark as customized placeholder by user once nzPlaceHolder assigned at the first time if (changes.nzPlaceHolder && changes.nzPlaceHolder.firstChange && typeof this.nzPlaceHolder !== 'undefined') { this.isCustomPlaceHolder = true; } if (changes.nzLocale) { // The nzLocale is currently handled by user this.setDefaultPlaceHolder(); } if (changes.nzRenderExtraFooter) { this.extraFooter = valueFunctionProp((/** @type {?} */ (this.nzRenderExtraFooter))); } if (changes.nzStyle) { warnDeprecation("'nzStyle' in DatePicker is going to be removed in 10.0.0. Please use CSS style attribute like <nz-date-picker style=\"...\"></nz-date-picker> instead."); } if (changes.nzClassName) { warnDeprecation("'nzClassName' in DatePicker is going to be removed in 10.0.0. Please use CSS class attribute like <nz-date-picker class=\"...\"></nz-date-picker> instead."); } if (changes.nzMode) { this.setPanelMode(); } }; /** * @return {?} */ NzDatePickerComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.destroyed$.next(); this.destroyed$.complete(); }; /** * @return {?} */ NzDatePickerComponent.prototype.setPanelMode = /** * @return {?} */ function () { if (!this.nzMode) { this.nzMode = this.isRange ? ['date', 'date'] : 'date'; } }; /** * Triggered when overlayOpen changes (different with realOpenState) * @param open The overlayOpen in picker component */ /** * Triggered when overlayOpen changes (different with realOpenState) * @param {?} open The overlayOpen in picker component * @return {?} */ NzDatePickerComponent.prototype.onOpenChange = /** * Triggered when overlayOpen changes (different with realOpenState) * @param {?} open The overlayOpen in picker component * @return {?} */ function (open) { this.nzOnOpenChange.emit(open); }; /** * @param {?} value * @return {?} */ NzDatePickerComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { this.setValue(value); this.cdr.markForCheck(); }; /** * @param {?} fn * @return {?} */ NzDatePickerComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.onChangeFn = fn; }; /** * @param {?} fn * @return {?} */ NzDatePickerComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this.onTouchedFn = fn; }; /** * @param {?} isDisabled * @return {?} */ NzDatePickerComponent.prototype.setDisabledState = /** * @param {?} isDisabled * @return {?} */ function (isDisabled) { this.nzDisabled = isDisabled; this.cdr.markForCheck(); }; // ------------------------------------------------------------------------ // | Internal methods // ------------------------------------------------------------------------ // Reload locale from i18n with side effects // ------------------------------------------------------------------------ // | Internal methods // ------------------------------------------------------------------------ // Reload locale from i18n with side effects /** * @private * @return {?} */ NzDatePickerComponent.prototype.setLocale = // ------------------------------------------------------------------------ // | Internal methods // ------------------------------------------------------------------------ // Reload locale from i18n with side effects /** * @private * @return {?} */ function () { this.nzLocale = this.i18n.getLocaleData('DatePicker', {}); this.setDefaultPlaceHolder(); this.cdr.markForCheck(); }; /** * @private * @return {?} */ NzDatePickerComponent.prototype.setDefaultPlaceHolder = /** * @private * @return {?} */ function () { if (!this.isCustomPlaceHolder && this.nzLocale) { this.nzPlaceHolder = this.isRange ? ((/** @type {?} */ (this.nzLocale.lang.rangePlaceholder))) : this.nzLocale.lang.placeholder; } }; // Safe way of setting value with default // Safe way of setting value with default /** * @private * @param {?} value * @return {?} */ NzDatePickerComponent.prototype.setValue = // Safe way of setting value with default /** * @private * @param {?} value * @return {?} */ function (value) { /** @type {?} */ var newValue = this.datePickerService.makeValue(value); this.datePickerService.setValue(newValue); this.datePickerService.initialValue = newValue; }; Object.defineProperty(NzDatePickerComponent.prototype, "realShowToday", { get: /** * @return {?} */ function () { // Range only support in single date picker return this.nzMode === 'date' && this.nzShowToday; }, enumerable: true, configurable: true }); /** * @param {?} value * @return {?} */ NzDatePickerComponent.prototype.onFocusChange = /** * @param {?} value * @return {?} */ function (value) { this.focused = value; // TODO: avoid autoFocus cause change after checked error if (this.focused) { this.renderer.addClass(this.elementRef.nativeElement, 'ant-picker-focused'); } else { this.renderer.removeClass(this.elementRef.nativeElement, 'ant-picker-focused'); } }; /** * @param {?} panelMode * @return {?} */ NzDatePickerComponent.prototype.onPanelModeChange = /** * @param {?} panelMode * @return {?} */ function (panelMode) { // this.nzMode = panelMode; this.nzOnPanelChange.emit(panelMode); }; // Emit nzOnCalendarChange when select date by nz-range-picker // Emit nzOnCalendarChange when select date by nz-range-picker /** * @param {?} value * @return {?} */ NzDatePickerComponent.prototype.onCalendarChange = // Emit nzOnCalendarChange when select date by nz-range-picker /** * @param {?} value * @return {?} */ function (value) { if (this.isRange && Array.isArray(value)) { /** @type {?} */ var rangeValue = value.filter((/** * @param {?} x * @return {?} */ function (x) { return x instanceof CandyDate; })).map((/** * @param {?} x * @return {?} */ function (x) { return (/** @type {?} */ (x)).nativeDate; })); this.nzOnCalendarChange.emit(rangeValue); } }; // Emitted when done with date selecting // Emitted when done with date selecting /** * @return {?} */ NzDatePickerComponent.prototype.onResultOk = // Emitted when done with date selecting /** * @return {?} */ function () { if (this.isRange) { /** @type {?} */ var value = (/** @type {?} */ (this.datePickerService.value)); if (value.length) { this.nzOnOk.emit([value[0].nativeDate, value[1].nativeDate]); } else { this.nzOnOk.emit([]); } } else { if (this.datePickerService.value) { this.nzOnOk.emit(((/** @type {?} */ (this.datePickerService.value))).nativeDate); } else { this.nzOnOk.emit(null); } } this.datePickerService.emitValue$.next(); }; NzDatePickerComponent.decorators = [ { type: Component, args: [{ encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, selector: 'nz-date-picker,nz-week-picker,nz-month-picker,nz-year-picker,nz-range-picker', exportAs: 'nzDatePicker', template: "\n <div\n nz-picker\n [isRange]=\"isRange\"\n [open]=\"nzOpen\"\n [separator]=\"nzSeparator\"\n [disabled]=\"nzDisabled\"\n [format]=\"nzFormat\"\n [allowClear]=\"nzAllowClear\"\n [autoFocus]=\"nzAutoFocus\"\n [placeholder]=\"nzPlaceHolder\"\n [ngClass]=\"nzClassName\"\n style=\"display: inherit; align-items: center; width: 100%;\"\n [ngStyle]=\"nzStyle\"\n [dropdownClassName]=\"nzDropdownClassName\"\n [popupStyle]=\"nzPopupStyle\"\n [noAnimation]=\"!!noAnimation?.nzNoAnimation\"\n [suffixIcon]=\"nzSuffixIcon\"\n (openChange)=\"onOpenChange($event)\"\n (focusChange)=\"onFocusChange($event)\"\n >\n <date-range-popup\n *ngIf=\"realOpenState\"\n [isRange]=\"isRange\"\n [defaultPickerValue]=\"nzDefaultPickerValue\"\n [showWeek]=\"showWeek\"\n [panelMode]=\"nzMode\"\n (panelModeChange)=\"onPanelModeChange($event)\"\n (calendarChange)=\"onCalendarChange($event)\"\n [locale]=\"nzLocale?.lang!\"\n [showToday]=\"realShowToday\"\n [showTime]=\"nzShowTime\"\n [format]=\"nzFormat\"\n [dateRender]=\"nzDateRender\"\n [disabledDate]=\"nzDisabledDate\"\n [disabledTime]=\"nzDisabledTime\"\n [placeholder]=\"nzPlaceHolder\"\n [extraFooter]=\"extraFooter\"\n [ranges]=\"nzRanges\"\n (resultOk)=\"onResultOk()\"\n ></date-range-popup>\n </div>\n ", host: { '[class.ant-picker]': "true", '[class.ant-picker-range]': "isRange", '[class.ant-picker-large]': "nzSize === 'large'", '[class.ant-picker-small]': "nzSize === 'small'", '[class.ant-picker-disabled]': "nzDisabled", '(click)': 'picker.onClickInputBox($event)' }, providers: [ DatePickerService, { provide: NG_VALUE_ACCESSOR, multi: true, useExisting: forwardRef((/** * @return {?} */ function () { return NzDatePickerComponent; })) } ] }] } ]; /** @nocollapse */ NzDatePickerComponent.ctorParameters = function () { return [ { type: NzConfigService }, { type: DatePickerService }, { type: NzI18nService }, { type: ChangeDetectorRef }, { type: Renderer2 }, { type: ElementRef }, { type: DateHelperService }, { type: NzNoAnimationDirective, decorators: [{ type: Host }, { type: Optional }] } ]; }; NzDatePickerComponent.propDecorators = { nzAllowClear: [{ type: Input }], nzAutoFocus: [{ type: Input }], nzDisabled: [{ type: Input }], nzOpen: [{ type: Input }], nzClassName: [{ type: Input }], nzDisabledDate: [{ type: Input }], nzLocale: [{ type: Input }], nzPlaceHolder: [{ type: Input }], nzPopupStyle: [{ type: Input }], nzDropdownClassName: [{ type: Input }], nzSize: [{ type: Input }], nzStyle: [{ type: Input }], nzFormat: [{ type: Input }], nzDateRender: [{ type: Input }], nzDisabledTime: [{ type: Input }], nzRenderExtraFooter: [{ type: Input }], nzShowToday: [{ type: Input }], nzMode: [{ type: Input }], nzRanges: [{ type: Input }], nzDefaultPickerValue: [{ type: Input }], nzSeparator: [{ type: Input }], nzSuffixIcon: [{ type: Input }], nzOnPanelChange: [{ type: Output }], nzOnCalendarChange: [{ type: Output }], nzOnOk: [{ type: Output }], nzOnOpenChange: [{ type: Output }], picker: [{ type: ViewChild, args: [NzPickerComponent, { static: true },] }], nzShowTime: [{ type: Input }] }; __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzDatePickerComponent.prototype, "nzAllowClear", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzDatePickerComponent.prototype, "nzAutoFocus", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzDatePickerComponent.prototype, "nzDisabled", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzDatePickerComponent.prototype, "nzOpen", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzDatePickerComponent.prototype, "nzShowToday", void 0); __decorate([ WithConfig(NZ_CONFIG_COMPONENT_NAME), __metadata("design:type", String) ], NzDatePickerComponent.prototype, "nzSeparator", void 0); __decorate([ WithConfig(NZ_CONFIG_COMPONENT_NAME), __metadata("design:type", Object) ], NzDatePickerComponent.prototype, "nzSuffixIcon", void 0); return NzDatePickerComponent; }()); export { NzDatePickerComponent }; if (false) { /** @type {?} */ NzDatePickerComponent.ngAcceptInputType_nzAllowClear; /** @type {?} */ NzDatePickerComponent.ngAcceptInputType_nzAutoFocus; /** @type {?} */ NzDatePickerComponent.ngAcceptInputType_nzDisabled; /** @type {?} */ NzDatePickerComponent.ngAcceptInputType_nzOpen; /** @type {?} */ NzDatePickerComponent.ngAcceptInputType_nzShowToday; /** @type {?} */ NzDatePickerComponent.ngAcceptInputType_nzMode; /** @type {?} */ NzDatePickerComponent.ngAcceptInputType_nzShowTime; /** @type {?} */ NzDatePickerComponent.prototype.isRange; /** @type {?} */ NzDatePickerComponent.prototype.showWeek; /** @type {?} */ NzDatePickerComponent.prototype.focused; /** @type {?} */ NzDatePickerComponent.prototype.extraFooter; /** @type {?} */ NzDatePickerComponent.prototype.hostClassMap; /** * @type {?} * @protected */ NzDatePickerComponent.prototype.destroyed$; /** * @type {?} * @protected */ NzDatePickerComponent.prototype.isCustomPlaceHolder; /** * @type {?} * @private */ NzDatePickerComponent.prototype.showTime; /** @type {?} */ NzDatePickerComponent.prototype.nzAllowClear; /** @type {?} */ NzDatePickerComponent.prototype.nzAutoFocus; /** @type {?} */ NzDatePickerComponent.prototype.nzDisabled; /** @type {?} */ NzDatePickerComponent.prototype.nzOpen; /** * @deprecated 10.0.0. This is deprecated and going to be removed in 10.0.0. * @type {?} */ NzDatePickerComponent.prototype.nzClassName; /** @type {?} */ NzDatePickerComponent.prototype.nzDisabledDate; /** @type {?} */ NzDatePickerComponent.prototype.nzLocale; /** @type {?} */ NzDatePickerComponent.prototype.nzPlaceHolder; /** @type {?} */ NzDatePickerComponent.prototype.nzPopupStyle; /** @type {?} */ NzDatePickerComponent.prototype.nzDropdownClassName; /** @type {?} */ NzDatePickerComponent.prototype.nzSize; /** * @deprecated 10.0.0. This is deprecated and going to be removed in 10.0.0. * @type {?} */ NzDatePickerComponent.prototype.nzStyle; /** @type {?} */ NzDatePickerComponent.prototype.nzFormat; /** @type {?} */ NzDatePickerComponent.prototype.nzDateRender; /** @type {?} */ NzDatePickerComponent.prototype.nzDisabledTime; /** @type {?} */ NzDatePickerComponent.prototype.nzRenderExtraFooter; /** @type {?} */ NzDatePickerComponent.prototype.nzShowToday; /** @type {?} */ NzDatePickerComponent.prototype.nzMode; /** @type {?} */ NzDatePickerComponent.prototype.nzRanges; /** @type {?} */ NzDatePickerComponent.prototype.nzDefaultPickerValue; /** @type {?} */ NzDatePickerComponent.prototype.nzSeparator; /** @type {?} */ NzDatePickerComponent.prototype.nzSuffixIcon; /** @type {?} */ NzDatePickerComponent.prototype.nzOnPanelChange; /** @type {?} */ NzDatePickerComponent.prototype.nzOnCalendarChange; /** @type {?} */ NzDatePickerComponent.prototype.nzOnOk; /** @type {?} */ NzDatePickerComponent.prototype.nzOnOpenChange; /** @type {?} */ NzDatePickerComponent.prototype.picker; /** @type {?} */ NzDatePickerComponent.prototype.onChangeFn; /** @type {?} */ NzDatePickerComponent.prototype.onTouchedFn; /** @type {?} */ NzDatePickerComponent.prototype.nzConfigService; /** @type {?} */ NzDatePickerComponent.prototype.datePickerService; /** * @type {?} * @protected */ NzDatePickerComponent.prototype.i18n; /** * @type {?} * @protected */ NzDatePickerComponent.prototype.cdr; /** * @type {?} * @private */ NzDatePickerComponent.prototype.renderer; /** * @type {?} * @private */ NzDatePickerComponent.prototype.elementRef; /** * @type {?} * @protected */ NzDatePickerComponent.prototype.dateHelper; /** @type {?} */ NzDatePickerComponent.prototype.noAnimation; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC9kYXRlLXBpY2tlci8iLCJzb3VyY2VzIjpbImRhdGUtcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLElBQUksRUFDSixLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBR1QsU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFtQixNQUFNLHlCQUF5QixDQUFDO0FBRWhGLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckYsT0FBTyxFQUFFLGlCQUFpQixFQUE2QixhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztJQUdqRCxpQkFBaUIsR0FBRyxFQUFFLFFB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QUNsRyxtREFBMEY7O0lBRTFGLHdDQUF5Qjs7SUFDekIseUNBQTBCOztJQUMxQix3Q0FBeUI7O0lBQ3pCLDRDQUE4Qzs7SUFDOUMsNkNBQW9DOzs7OztJQUVwQywyQ0FBb0Q7Ozs7O0lBQ3BELG9EQUErQzs7Ozs7SUFDL0MseUNBQXVEOztJQUd2RCw2Q0FBc0Q7O0lBQ3RELDRDQUFzRDs7SUFDdEQsMkNBQXFEOztJQUNyRCx1Q0FBMEM7Ozs7O0lBSTFDLDRDQUFrQzs7SUFDbEMsK0NBQStDOztJQUMvQyx5Q0FBOEM7O0lBQzlDLDhDQUF1RDs7SUFDdkQsNkNBQWtEOztJQUNsRCxvREFBc0M7O0lBQ3RDLHVDQUEyRDs7Ozs7SUFJM0Qsd0NBQXVDOztJQUN2Qyx5Q0FBMkI7O0lBQzNCLDZDQUFtRzs7SUFDbkcsK0NBQXlDOztJQUN6QyxvREFBK0c7O0lBQy9HLDRDQUFxRDs7SUFDckQsdUNBQW9EOztJQUNwRCx5Q0FBaUM7O0lBQ2pDLHFEQUE0RDs7SUFDNUQsNENBQWdGOztJQUNoRiw2Q0FBMEc7O0lBRzFHLGdEQUF1Rzs7SUFDdkcsbURBQStFOztJQUMvRSx1Q0FBc0U7O0lBQ3RFLCtDQUFnRTs7SUFFaEUsdUNBQTJFOztJQStIM0UsMkNBQXdDOztJQUN4Qyw0Q0FBMEM7O0lBakh4QyxnREFBdUM7O0lBQ3ZDLGtEQUEyQzs7Ozs7SUFDM0MscUNBQTZCOzs7OztJQUM3QixvQ0FBZ0M7Ozs7O0lBQ2hDLHlDQUEyQjs7Ozs7SUFDM0IsMkNBQThCOzs7OztJQUM5QiwyQ0FBdUM7O0lBQ3ZDLDRDQUErRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHdhcm5EZXByZWNhdGlvbiB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9sb2dnZXInO1xuaW1wb3J0IHsgTnpOb0FuaW1hdGlvbkRpcmVjdGl2ZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9uby1hbmltYXRpb24nO1xuaW1wb3J0IHsgQ2FuZHlEYXRlLCBjbG9uZURhdGUsIENvbXBhdGlibGVWYWx1ZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90aW1lJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgRnVuY3Rpb25Qcm9wLCBOZ0NsYXNzSW50ZXJmYWNlLCBOelNhZmVBbnksIE9uQ2hhbmdlVHlwZSwgT25Ub3VjaGVkVHlwZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBJbnB1dEJvb2xlYW4sIHRvQm9vbGVhbiwgdmFsdWVGdW5jdGlvblByb3AgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdXRpbCc7XG5pbXBvcnQgeyBEYXRlSGVscGVyU2VydmljZSwgTnpEYXRlUGlja2VySTE4bkludGVyZmFjZSwgTnpJMThuU2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvaTE4bic7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEYXRlUGlja2VyU2VydmljZSB9IGZyb20gJy4vZGF0ZS1waWNrZXIuc2VydmljZSc7XG5cbmltcG9ydCB7IE56Q29uZmlnU2VydmljZSwgV2l0aENvbmZpZyB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9jb25maWcnO1xuaW1wb3J0IHsgTnpQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL3BpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcGF0aWJsZURhdGUsIERpc2FibGVkVGltZUZuLCBOekRhdGVNb2RlLCBQcmVzZXRSYW5nZXMsIFN1cHBvcnRUaW1lT3B0aW9ucyB9IGZyb20gJy4vc3RhbmRhcmQtdHlwZXMnO1xuXG5jb25zdCBQT1BVUF9TVFlMRV9QQVRDSCA9IHsgcG9zaXRpb246ICdyZWxhdGl2ZScgfTsgLy8gQWltIHRvIG92ZXJyaWRlIGFudGQncyBzdHlsZSB0byBzdXBwb3J0IG92ZXJsYXkncyBwb3NpdGlvbiBzdHJhdGVneSAocG9zaXRpb246YWJzb2x1dGUgd2lsbCBjYXVzZSBpdCBub3Qgd29ya2luZyBiZWFjdXNlIHRoZSBvdmVybGF5IGNhbid0IGdldCB0aGUgaGVpZ2h0L3dpZHRoIG9mIGl0J3MgY29udGVudClcbmNvbnN0IE5aX0NPTkZJR19DT01QT05FTlRfTkFNRSA9ICdkYXRlUGlja2VyJztcblxuLyoqXG4gKiBUaGUgYmFzZSBwaWNrZXIgZm9yIGFsbCBjb21tb24gQVBJc1xuICovXG5AQ29tcG9uZW50KHtcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHNlbGVjdG9yOiAnbnotZGF0ZS1waWNrZXIsbnotd2Vlay1waWNrZXIsbnotbW9udGgtcGlja2VyLG56LXllYXItcGlja2VyLG56LXJhbmdlLXBpY2tlcicsXG4gIGV4cG9ydEFzOiAnbnpEYXRlUGlja2VyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBuei1waWNrZXJcbiAgICAgIFtpc1JhbmdlXT1cImlzUmFuZ2VcIlxuICAgICAgW29wZW5dPVwibnpPcGVuXCJcbiAgICAgIFtzZXBhcmF0b3JdPVwibnpTZXBhcmF0b3JcIlxuICAgICAgW2Rpc2FibGVkXT1cIm56RGlzYWJsZWRcIlxuICAgICAgW2Zvcm1hdF09XCJuekZvcm1hdFwiXG4gICAgICBbYWxsb3dDbGVhcl09XCJuekFsbG93Q2xlYXJcIlxuICAgICAgW2F1dG9Gb2N1c109XCJuekF1dG9Gb2N1c1wiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwibnpQbGFjZUhvbGRlclwiXG4gICAgICBbbmdDbGFzc109XCJuekNsYXNzTmFtZVwiXG4gICAgICBzdHlsZT1cImRpc3BsYXk6IGluaGVyaXQ7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IHdpZHRoOiAxMDAlO1wiXG4gICAgICBbbmdTdHlsZV09XCJuelN0eWxlXCJcbiAgICAgIFtkcm9wZG93bkNsYXNzTmFtZV09XCJuekRyb3Bkb3duQ2xhc3NOYW1lXCJcbiAgICAgIFtwb3B1cFN0eWxlXT1cIm56UG9wdXBTdHlsZVwiXG4gICAgICBbbm9BbmltYXRpb25dPVwiISFub0FuaW1hdGlvbj8ubnpOb0FuaW1hdGlvblwiXG4gICAgICBbc3VmZml4SWNvbl09XCJuelN1ZmZpeEljb25cIlxuICAgICAgKG9wZW5DaGFuZ2UpPVwib25PcGVuQ2hhbmdlKCRldmVudClcIlxuICAgICAgKGZvY3VzQ2hhbmdlKT1cIm9uRm9jdXNDaGFuZ2UoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGRhdGUtcmFuZ2UtcG9wdXBcbiAgICAgICAgKm5nSWY9XCJyZWFsT3BlblN0YXRlXCJcbiAgICAgICAgW2lzUmFuZ2VdPVwiaXNSYW5nZVwiXG4gICAgICAgIFtkZWZhdWx0UGlja2VyVmFsdWVdPVwibnpEZWZhdWx0UGlja2VyVmFsdWVcIlxuICAgICAgICBbc2hvd1dlZWtdPVwic2hvd1dlZWtcIlxuICAgICAgICBbcGFuZWxNb2RlXT1cIm56TW9kZVwiXG4gICAgICAgIChwYW5lbE1vZGVDaGFuZ2UpPVwib25QYW5lbE1vZGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChjYWxlbmRhckNoYW5nZSk9XCJvbkNhbGVuZGFyQ2hhbmdlKCRldmVudClcIlxuICAgICAgICBbbG9jYWxlXT1cIm56TG9jYWxlPy5sYW5nIVwiXG4gICAgICAgIFtzaG93VG9kYXldPVwicmVhbFNob3dUb2RheVwiXG4gICAgICAgIFtzaG93VGltZV09XCJuelNob3dUaW1lXCJcbiAgICAgICAgW2Zvcm1hdF09XCJuekZvcm1hdFwiXG4gICAgICAgIFtkYXRlUmVuZGVyXT1cIm56RGF0ZVJlbmRlclwiXG4gICAgICAgIFtkaXNhYmxlZERhdGVdPVwibnpEaXNhYmxlZERhdGVcIlxuICAgICAgICBbZGlzYWJsZWRUaW1lXT1cIm56RGlzYWJsZWRUaW1lXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cIm56UGxhY2VIb2xkZXJcIlxuICAgICAgICBbZXh0cmFGb290ZXJdPVwiZXh0cmFGb290ZXJcIlxuICAgICAgICBbcmFuZ2VzXT1cIm56UmFuZ2VzXCJcbiAgICAgICAgKHJlc3VsdE9rKT1cIm9uUmVzdWx0T2soKVwiXG4gICAgICA+PC9kYXRlLXJhbmdlLXBvcHVwPlxuICAgIDwvZGl2PlxuICBgLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5hbnQtcGlja2VyXSc6IGB0cnVlYCxcbiAgICAnW2NsYXNzLmFudC1waWNrZXItcmFuZ2VdJzogYGlzUmFuZ2VgLFxuICAgICdbY2xhc3MuYW50LXBpY2tlci1sYXJnZV0nOiBgbnpTaXplID09PSAnbGFyZ2UnYCxcbiAgICAnW2NsYXNzLmFudC1waWNrZXItc21hbGxdJzogYG56U2l6ZSA9PT0gJ3NtYWxsJ2AsXG4gICAgJ1tjbGFzcy5hbnQtcGlja2VyLWRpc2FibGVkXSc6IGBuekRpc2FibGVkYCxcbiAgICAnKGNsaWNrKSc6ICdwaWNrZXIub25DbGlja0lucHV0Qm94KCRldmVudCknXG4gIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIERhdGVQaWNrZXJTZXJ2aWNlLFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOekRhdGVQaWNrZXJDb21wb25lbnQpXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE56RGF0ZVBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256QWxsb3dDbGVhcjogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpBdXRvRm9jdXM6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256RGlzYWJsZWQ6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256T3BlbjogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpTaG93VG9kYXk6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256TW9kZTogTnpEYXRlTW9kZSB8IE56RGF0ZU1vZGVbXSB8IHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256U2hvd1RpbWU6IEJvb2xlYW5JbnB1dCB8IFN1cHBvcnRUaW1lT3B0aW9ucyB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgaXNSYW5nZTogYm9vbGVhbiA9IGZhbHNlOyAvLyBJbmRpY2F0ZSB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBhIHJhbmdlIHZhbHVlXG4gIHNob3dXZWVrOiBib29sZWFuID0gZmFsc2U7IC8vIFNob3VsZCBzaG93IGFzIHdlZWsgcGlja2VyXG4gIGZvY3VzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZXh0cmFGb290ZXI/OiBUZW1wbGF0ZVJlZjxOelNhZmVBbnk+IHwgc3RyaW5nO1xuICBob3N0Q2xhc3NNYXA6IE5nQ2xhc3NJbnRlcmZhY2UgPSB7fTtcblxuICBwcm90ZWN0ZWQgZGVzdHJveWVkJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHByb3RlY3RlZCBpc0N1c3RvbVBsYWNlSG9sZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgc2hvd1RpbWU6IFN1cHBvcnRUaW1lT3B0aW9ucyB8IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyAtLS0gQ29tbW9uIEFQSVxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpBbGxvd0NsZWFyOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56QXV0b0ZvY3VzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuek9wZW4/OiBib29sZWFuO1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgMTAuMC4wLiBUaGlzIGlzIGRlcHJlY2F0ZWQgYW5kIGdvaW5nIHRvIGJlIHJlbW92ZWQgaW4gMTAuMC4wLlxuICAgKi9cbiAgQElucHV0KCkgbnpDbGFzc05hbWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBuekRpc2FibGVkRGF0ZT86IChkOiBEYXRlKSA9PiBib29sZWFuO1xuICBASW5wdXQoKSBuekxvY2FsZT86IE56RGF0ZVBpY2tlckkxOG5JbnRlcmZhY2U7XG4gIEBJbnB1dCgpIG56UGxhY2VIb2xkZXI6IHN0cmluZyB8IFtzdHJpbmcsIHN0cmluZ10gPSAnJztcbiAgQElucHV0KCkgbnpQb3B1cFN0eWxlOiBvYmplY3QgPSBQT1BVUF9TVFlMRV9QQVRDSDtcbiAgQElucHV0KCkgbnpEcm9wZG93bkNsYXNzTmFtZT86IHN0cmluZztcbiAgQElucHV0KCkgbnpTaXplOiAnbGFyZ2UnIHwgJ3NtYWxsJyB8ICdkZWZhdWx0JyA9ICdkZWZhdWx0JztcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIDEwLjAuMC4gVGhpcyBpcyBkZXByZWNhdGVkIGFuZCBnb2luZyB0byBiZSByZW1vdmVkIGluIDEwLjAuMC5cbiAgICovXG4gIEBJbnB1dCgpIG56U3R5bGU6IG9iamVjdCB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBuekZvcm1hdCE6IHN0cmluZztcbiAgQElucHV0KCkgbnpEYXRlUmVuZGVyPzogVGVtcGxhdGVSZWY8TnpTYWZlQW55PiB8IHN0cmluZyB8IEZ1bmN0aW9uUHJvcDxUZW1wbGF0ZVJlZjxEYXRlPiB8IHN0cmluZz47XG4gIEBJbnB1dCgpIG56RGlzYWJsZWRUaW1lPzogRGlzYWJsZWRUaW1lRm47XG4gIEBJbnB1dCgpIG56UmVuZGVyRXh0cmFGb290ZXI/OiBUZW1wbGF0ZVJlZjxOelNhZmVBbnk+IHwgc3RyaW5nIHwgRnVuY3Rpb25Qcm9wPFRlbXBsYXRlUmVmPE56U2FmZUFueT4gfCBzdHJpbmc+O1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpTaG93VG9kYXk6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBuek1vZGU6IE56RGF0ZU1vZGUgfCBOekRhdGVNb2RlW10gPSAnZGF0ZSc7XG4gIEBJbnB1dCgpIG56UmFuZ2VzPzogUHJlc2V0UmFuZ2VzO1xuICBASW5wdXQoKSBuekRlZmF1bHRQaWNrZXJWYWx1ZTogQ29tcGF0aWJsZURhdGUgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgQFdpdGhDb25maWcoTlpfQ09ORklHX0NPTVBPTkVOVF9OQU1FKSBuelNlcGFyYXRvcj86IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgQFdpdGhDb25maWcoTlpfQ09ORklHX0NPTVBPTkVOVF9OQU1FKSBuelN1ZmZpeEljb246IHN0cmluZyB8IFRlbXBsYXRlUmVmPE56U2FmZUFueT4gPSAnY2FsZW5kYXInO1xuXG4gIC8vIFRPRE8oQHdlbnFpNzMpIFRoZSBQYW5lbE1vZGUgbmVlZCBuYW1lZCBmb3IgZWFjaCBwaWNrZXJzIGFuZCBleHBvcnRcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25QYW5lbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TnpEYXRlTW9kZSB8IE56RGF0ZU1vZGVbXSB8IHN0cmluZyB8IHN0cmluZ1tdPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkNhbGVuZGFyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxEYXRlIHwgbnVsbD4+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uT2sgPSBuZXcgRXZlbnRFbWl0dGVyPENvbXBhdGlibGVEYXRlIHwgbnVsbD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25PcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIEBWaWV3Q2hpbGQoTnpQaWNrZXJDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pIHBpY2tlciE6IE56UGlja2VyQ29tcG9uZW50O1xuXG4gIEBJbnB1dCgpIGdldCBuelNob3dUaW1lKCk6IFN1cHBvcnRUaW1lT3B0aW9ucyB8IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNob3dUaW1lO1xuICB9XG5cbiAgc2V0IG56U2hvd1RpbWUodmFsdWU6IFN1cHBvcnRUaW1lT3B0aW9ucyB8IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNob3dUaW1lID0gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHZhbHVlIDogdG9Cb29sZWFuKHZhbHVlKTtcbiAgfVxuXG4gIGdldCByZWFsT3BlblN0YXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBpY2tlci5hbmltYXRpb25PcGVuU3RhdGU7XG4gIH0gLy8gVXNlIHBpY2tlcidzIHJlYWwgb3BlbiBzdGF0ZSB0byBsZXQgcmUtcmVuZGVyIHRoZSBwaWNrZXIncyBjb250ZW50IHdoZW4gc2hvd24gdXBcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbnpDb25maWdTZXJ2aWNlOiBOekNvbmZpZ1NlcnZpY2UsXG4gICAgcHVibGljIGRhdGVQaWNrZXJTZXJ2aWNlOiBEYXRlUGlja2VyU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgaTE4bjogTnpJMThuU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByb3RlY3RlZCBkYXRlSGVscGVyOiBEYXRlSGVscGVyU2VydmljZSxcbiAgICBASG9zdCgpIEBPcHRpb25hbCgpIHB1YmxpYyBub0FuaW1hdGlvbj86IE56Tm9BbmltYXRpb25EaXJlY3RpdmVcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFN1YnNjcmliZSB0aGUgZXZlcnkgbG9jYWxlIGNoYW5nZSBpZiB0aGUgbnpMb2NhbGUgaXMgbm90IGhhbmRsZWQgYnkgdXNlclxuICAgIGlmICghdGhpcy5uekxvY2FsZSkge1xuICAgICAgdGhpcy5pMThuLmxvY2FsZUNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZXRMb2NhbGUoKSk7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB2YWx1ZVxuICAgIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuaXNSYW5nZSA9IHRoaXMuaXNSYW5nZTtcbiAgICB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmluaXRWYWx1ZSgpO1xuICAgIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZW1pdFZhbHVlJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpKS5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UudmFsdWU7XG4gICAgICB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZSA9IGNsb25lRGF0ZSh2YWx1ZSk7XG4gICAgICBpZiAodGhpcy5pc1JhbmdlKSB7XG4gICAgICAgIGNvbnN0IHZBc1JhbmdlID0gdmFsdWUgYXMgQ2FuZHlEYXRlW107XG4gICAgICAgIGlmICh2QXNSYW5nZS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlRm4oW3ZBc1JhbmdlWzBdLm5hdGl2ZURhdGUsIHZBc1JhbmdlWzFdLm5hdGl2ZURhdGVdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlRm4oW10pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlRm4oKHZhbHVlIGFzIENhbmR5RGF0ZSkubmF0aXZlRGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vbkNoYW5nZUZuKG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAg