UNPKG

@taiga-ui/kit

Version:
224 lines 31.8 kB
var TuiInputDateTimeComponent_1; import { __decorate, __param } from "tslib"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, forwardRef, HostListener, Inject, Input, Optional, Self, ViewChild, } from '@angular/core'; import { NgControl } from '@angular/forms'; import { AbstractTuiControl, ALWAYS_FALSE_HANDLER, nullableSame, TUI_DATE_FILLER, TUI_FIRST_DAY, TUI_FOCUSABLE_ITEM_ACCESSOR, TUI_LAST_DAY, TuiDay, tuiDefaultProp, TuiMonth, tuiPure, TuiTime, } from '@taiga-ui/cdk'; import { sizeBigger, TUI_TEXTFIELD_SIZE, TuiPrimitiveTextfieldComponent, TuiTextfieldSizeDirective, TuiTextMaskOptions, TuiWithOptionalMinMax, } from '@taiga-ui/core'; import { DATE_TIME_SEPARATOR, TUI_DATE_MASK } from '@taiga-ui/kit/constants'; import { LEFT_ALIGNED_DROPDOWN_CONTROLLER_PROVIDER } from '@taiga-ui/kit/providers'; import { TUI_CALENDAR_DATA_STREAM, TUI_TIME_TEXTS } from '@taiga-ui/kit/tokens'; import { tuiCreateAutoCorrectedDateTimePipe, tuiCreateTimeMask, } from '@taiga-ui/kit/utils/mask'; import { TuiReplayControlValueChangesFactory } from '@taiga-ui/kit/utils/miscellaneous'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; const ɵ0 = TuiReplayControlValueChangesFactory; // @dynamic let TuiInputDateTimeComponent = TuiInputDateTimeComponent_1 = class TuiInputDateTimeComponent extends AbstractTuiControl { constructor(control, changeDetectorRef, textfieldSize, dateFiller, timeTexts$) { super(control, changeDetectorRef); this.textfieldSize = textfieldSize; this.dateFiller = dateFiller; this.timeTexts$ = timeTexts$; this.min = TUI_FIRST_DAY; this.max = TUI_LAST_DAY; this.disabledItemHandler = ALWAYS_FALSE_HANDLER; this.defaultActiveYearMonth = TuiMonth.currentLocal(); this.timeMode = 'HH:MM'; this.open = false; this.month = null; } get fillerLength() { return this.dateFiller.length + DATE_TIME_SEPARATOR.length + this.timeMode.length; } get textMaskOptions() { return this.calculateMask(this.value[0], this.min, this.max, this.timeMode, this.dateFiller); } get nativeFocusableElement() { return this.textfield ? this.textfield.nativeFocusableElement : null; } get focused() { return !!this.textfield && this.textfield.focused; } get calendarIcon() { return sizeBigger(this.textfieldSize.size) ? 'tuiIconCalendarLarge' : 'tuiIconCalendar'; } get computedValue() { const { value, nativeValue, focused, touched } = this; const [date, time] = value; if ((date && !nativeValue) || (date && nativeValue.length === this.dateFiller.length) || (date && time)) { return `${date.toString()}${DATE_TIME_SEPARATOR}${time ? time.toString(this.timeMode) : ''}`; } if (touched || focused) { return nativeValue; } return date !== null ? date.toString() : ''; } get calendarValue() { return this.value[0]; } get computedActiveYearMonth() { return this.month || this.value[0] || this.defaultActiveYearMonth; } get nativeValue() { return this.nativeFocusableElement ? this.nativeFocusableElement.value : ''; } set nativeValue(value) { if (!this.nativeFocusableElement) { return; } this.nativeFocusableElement.value = value; } get canOpen() { return !this.computedDisabled && !this.readOnly; } getFiller$(dateFiller, timeMode) { return this.timeTexts$.pipe(map(texts => `${dateFiller}${DATE_TIME_SEPARATOR}${texts[timeMode]}`)); } onClick() { this.open = !this.open; } onValueChange(value) { if (value.length < this.dateFiller.length) { this.updateValue([null, null]); return; } const [date, time] = value.split(DATE_TIME_SEPARATOR); const parsedDate = TuiDay.normalizeParse(date); const parsedTime = time && time.length === this.timeMode.length ? TuiTime.fromString(time) : null; if (parsedDate !== null) { this.open = false; } this.updateValue([parsedDate, parsedTime]); } onDayClick(day) { this.updateValue([day, this.value[1]]); this.open = false; } onHovered(hovered) { this.updateHovered(hovered); } onMonthChange(month) { this.month = month; } onOpenChange(open) { this.open = open; } onFocused(focused) { this.updateFocused(focused); if (focused || this.value[0] === null || this.value[1] !== null || this.nativeValue.length <= this.fillerLength + DATE_TIME_SEPARATOR.length || this.timeMode === 'HH:MM') { return; } const [, time] = this.nativeValue.split(DATE_TIME_SEPARATOR); if (!time) { return; } const parsedTime = TuiTime.fromString(time); this.updateValue([this.value[0], parsedTime]); setTimeout(() => { if (this.nativeValue.endsWith('.') || this.nativeValue.endsWith(':')) { this.nativeValue = this.nativeValue.slice(0, -1); } }); } setDisabledState() { super.setDisabledState(); this.open = false; } writeValue(value) { super.writeValue(value); this.nativeValue = value && (value[0] || value[1]) ? this.computedValue : ''; } getFallbackValue() { return [null, null]; } valueIdenticalComparator(oldValue, newValue) { return (nullableSame(oldValue[0], newValue[0], (a, b) => a.daySame(b)) && nullableSame(oldValue[1], newValue[1], (a, b) => a.toString() === b.toString())); } calculateMask(day, min, max, timeMode, filler) { return { mask: [...TUI_DATE_MASK, ',', ' ', ...tuiCreateTimeMask(timeMode)], pipe: tuiCreateAutoCorrectedDateTimePipe({ value: day, min, max, filler }, timeMode), guide: false, }; } }; TuiInputDateTimeComponent.ctorParameters = () => [ { type: NgControl, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [NgControl,] }] }, { type: ChangeDetectorRef, decorators: [{ type: Inject, args: [ChangeDetectorRef,] }] }, { type: TuiTextfieldSizeDirective, decorators: [{ type: Inject, args: [TUI_TEXTFIELD_SIZE,] }] }, { type: String, decorators: [{ type: Inject, args: [TUI_DATE_FILLER,] }] }, { type: Observable, decorators: [{ type: Inject, args: [TUI_TIME_TEXTS,] }] } ]; __decorate([ Input(), tuiDefaultProp() ], TuiInputDateTimeComponent.prototype, "min", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputDateTimeComponent.prototype, "max", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputDateTimeComponent.prototype, "disabledItemHandler", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputDateTimeComponent.prototype, "defaultActiveYearMonth", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputDateTimeComponent.prototype, "timeMode", void 0); __decorate([ ViewChild(TuiPrimitiveTextfieldComponent) ], TuiInputDateTimeComponent.prototype, "textfield", void 0); __decorate([ tuiPure ], TuiInputDateTimeComponent.prototype, "getFiller$", null); __decorate([ HostListener('click') ], TuiInputDateTimeComponent.prototype, "onClick", null); __decorate([ tuiPure ], TuiInputDateTimeComponent.prototype, "calculateMask", null); TuiInputDateTimeComponent = TuiInputDateTimeComponent_1 = __decorate([ Component({ selector: 'tui-input-date-time', template: "<tui-hosted-dropdown\n class=\"hosted\"\n [canOpen]=\"canOpen\"\n [content]=\"dropdown\"\n [open]=\"open && canOpen\"\n (openChange)=\"onOpenChange($event)\"\n>\n <tui-primitive-textfield\n class=\"textfield\"\n tuiValueAccessor\n [pseudoFocused]=\"pseudoFocused\"\n [pseudoHovered]=\"pseudoHovered\"\n [invalid]=\"computedInvalid\"\n [filler]=\"getFiller$(dateFiller, timeMode) | async\"\n [nativeId]=\"nativeId\"\n [readOnly]=\"readOnly\"\n [iconContent]=\"calendarIcon\"\n [disabled]=\"disabled\"\n [textMask]=\"textMaskOptions\"\n [value]=\"computedValue\"\n (valueChange)=\"onValueChange($event)\"\n (hoveredChange)=\"onHovered($event)\"\n (focusedChange)=\"onFocused($event)\"\n >\n <ng-content></ng-content>\n </tui-primitive-textfield>\n\n <ng-template #dropdown=\"polymorpheus\" polymorpheus>\n <tui-calendar\n tuiPreventDefault=\"mousedown\"\n [min]=\"min\"\n [max]=\"max\"\n [disabledItemHandler]=\"disabledItemHandler\"\n [month]=\"computedActiveYearMonth\"\n [value]=\"calendarValue\"\n (dayClick)=\"onDayClick($event)\"\n (monthChange)=\"onMonthChange($event)\"\n ></tui-calendar>\n </ng-template>\n</tui-hosted-dropdown>\n", changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { provide: TUI_FOCUSABLE_ITEM_ACCESSOR, useExisting: forwardRef(() => TuiInputDateTimeComponent_1), }, { provide: TUI_CALENDAR_DATA_STREAM, deps: [[new Optional(), new Self(), NgControl]], useFactory: ɵ0, }, LEFT_ALIGNED_DROPDOWN_CONTROLLER_PROVIDER, ], styles: [":host{display:block;border-radius:var(--tui-radius-m)}.hosted{display:block;border-radius:inherit}.textfield{border-radius:inherit}.icon{position:relative;cursor:pointer}.button{display:flex;height:44px;justify-content:center;box-shadow:inset 0 1px var(--tui-base-03)}"] }), __param(0, Optional()), __param(0, Self()), __param(0, Inject(NgControl)), __param(1, Inject(ChangeDetectorRef)), __param(2, Inject(TUI_TEXTFIELD_SIZE)), __param(3, Inject(TUI_DATE_FILLER)), __param(4, Inject(TUI_TIME_TEXTS)) ], TuiInputDateTimeComponent); export { TuiInputDateTimeComponent }; export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtZGF0ZS10aW1lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0YWlnYS11aS9raXQvY29tcG9uZW50cy9pbnB1dC1kYXRlLXRpbWUvIiwic291cmNlcyI6WyJpbnB1dC1kYXRlLXRpbWUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxRQUFRLEVBQ1IsSUFBSSxFQUNKLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekMsT0FBTyxFQUNILGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIsWUFBWSxFQUNaLGVBQWUsRUFDZixhQUFhLEVBQ2IsMkJBQTJCLEVBQzNCLFlBQVksRUFFWixNQUFNLEVBQ04sY0FBYyxFQUVkLFFBQVEsRUFDUixPQUFPLEVBQ1AsT0FBTyxHQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLDhCQUE4QixFQUM5Qix5QkFBeUIsRUFDekIsa0JBQWtCLEVBQ2xCLHFCQUFxQixHQUN4QixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRSxPQUFPLEVBQUMseUNBQXlDLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRixPQUFPLEVBQUMsd0JBQXdCLEVBQUUsY0FBYyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDOUUsT0FBTyxFQUNILGtDQUFrQyxFQUNsQyxpQkFBaUIsR0FDcEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUMsbUNBQW1DLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUN0RixPQUFPLEVB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TSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBRWpCLFdBQUEsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUE7SUFDekIsV0FBQSxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUUxQixXQUFBLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUN2QixXQUFBLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQTtHQXZDbEIseUJBQXlCLENBcVByQztTQXJQWSx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBmb3J3YXJkUmVmLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT3B0aW9uYWwsXG4gICAgU2VsZixcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOZ0NvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RUdWlDb250cm9sLFxuICAgIEFMV0FZU19GQUxTRV9IQU5ETEVSLFxuICAgIG51bGxhYmxlU2FtZSxcbiAgICBUVUlfREFURV9GSUxMRVIsXG4gICAgVFVJX0ZJUlNUX0RBWSxcbiAgICBUVUlfRk9DVVNBQkxFX0lURU1fQUNDRVNTT1IsXG4gICAgVFVJX0xBU1RfREFZLFxuICAgIFR1aUJvb2xlYW5IYW5kbGVyLFxuICAgIFR1aURheSxcbiAgICB0dWlEZWZhdWx0UHJvcCxcbiAgICBUdWlGb2N1c2FibGVFbGVtZW50QWNjZXNzb3IsXG4gICAgVHVpTW9udGgsXG4gICAgdHVpUHVyZSxcbiAgICBUdWlUaW1lLFxuICAgIFR1aVRpbWVNb2RlLFxufSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7XG4gICAgc2l6ZUJpZ2dlcixcbiAgICBUVUlfVEVYVEZJRUxEX1NJWkUsXG4gICAgVHVpUHJpbWl0aXZlVGV4dGZpZWxkQ29tcG9uZW50LFxuICAgIFR1aVRleHRmaWVsZFNpemVEaXJlY3RpdmUsXG4gICAgVHVpVGV4dE1hc2tPcHRpb25zLFxuICAgIFR1aVdpdGhPcHRpb25hbE1pbk1heCxcbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHtEQVRFX1RJTUVfU0VQQVJBVE9SLCBUVUlfREFURV9NQVNLfSBmcm9tICdAdGFpZ2EtdWkva2l0L2NvbnN0YW50cyc7XG5pbXBvcnQge0xFRlRfQUxJR05FRF9EUk9QRE9XTl9DT05UUk9MTEVSX1BST1ZJREVSfSBmcm9tICdAdGFpZ2EtdWkva2l0L3Byb3ZpZGVycyc7XG5pbXBvcnQge1RVSV9DQUxFTkRBUl9EQVRBX1NUUkVBTSwgVFVJX1RJTUVfVEVYVFN9IGZyb20gJ0B0YWlnYS11aS9raXQvdG9rZW5zJztcbmltcG9ydCB7XG4gICAgdHVpQ3JlYXRlQXV0b0NvcnJlY3RlZERhdGVUaW1lUGlwZSxcbiAgICB0dWlDcmVhdGVUaW1lTWFzayxcbn0gZnJvbSAnQHRhaWdhLXVpL2tpdC91dGlscy9tYXNrJztcbmltcG9ydCB7VHVpUmVwbGF5Q29udHJvbFZhbHVlQ2hhbmdlc0ZhY3Rvcnl9IGZyb20gJ0B0YWlnYS11aS9raXQvdXRpbHMvbWlzY2VsbGFuZW91cyc7XG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHttYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLy8gQGR5bmFtaWNcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndHVpLWlucHV0LWRhdGUtdGltZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LWRhdGUtdGltZS50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9pbnB1dC1kYXRlLXRpbWUuc3R5bGUubGVzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBUVUlfRk9DVVNBQkxFX0lURU1fQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUdWlJbnB1dERhdGVUaW1lQ29tcG9uZW50KSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVFVJX0NBTEVOREFSX0RBVEFfU1RSRUFNLFxuICAgICAgICAgICAgZGVwczogW1tuZXcgT3B0aW9uYWwoKSwgbmV3IFNlbGYoKSwgTmdDb250cm9sXV0sXG4gICAgICAgICAgICB1c2VGYWN0b3J5OiBUdWlSZXBsYXlDb250cm9sVmFsdWVDaGFuZ2VzRmFjdG9yeSxcbiAgICAgICAgfSxcbiAgICAgICAgTEVGVF9BTElHTkVEX0RST1BET1dOX0NPTlRST0xMRVJfUFJPVklERVIsXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpSW5wdXREYXRlVGltZUNvbXBvbmVudFxuICAgIGV4dGVuZHMgQWJzdHJhY3RUdWlDb250cm9sPFtUdWlEYXkgfCBudWxsLCBUdWlUaW1lIHwgbnVsbF0+XG4gICAgaW1wbGVtZW50cyBUdWlXaXRoT3B0aW9uYWxNaW5NYXg8VHVpRGF5PiwgVHVpRm9jdXNhYmxlRWxlbWVudEFjY2Vzc29yIHtcbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgbWluID0gVFVJX0ZJUlNUX0RBWTtcblxuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBtYXggPSBUVUlfTEFTVF9EQVk7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgZGlzYWJsZWRJdGVtSGFuZGxlcjogVHVpQm9vbGVhbkhhbmRsZXI8VHVpRGF5PiA9IEFMV0FZU19GQUxTRV9IQU5ETEVSO1xuXG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIGRlZmF1bHRBY3RpdmVZZWFyTW9udGggPSBUdWlNb250aC5jdXJyZW50TG9jYWwoKTtcblxuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICB0aW1lTW9kZTogVHVpVGltZU1vZGUgPSAnSEg6TU0nO1xuXG4gICAgb3BlbiA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBtb250aDogVHVpTW9udGggfCBudWxsID0gbnVsbDtcblxuICAgIEBWaWV3Q2hpbGQoVHVpUHJpbWl0aXZlVGV4dGZpZWxkQ29tcG9uZW50KVxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGV4dGZpZWxkPzogVHVpUHJpbWl0aXZlVGV4dGZpZWxkQ29tcG9uZW50O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBPcHRpb25hbCgpXG4gICAgICAgIEBTZWxmKClcbiAgICAgICAgQEluamVjdChOZ0NvbnRyb2wpXG4gICAgICAgIGNvbnRyb2w6IE5nQ29udHJvbCB8IG51bGwsXG4gICAgICAgIEBJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQEluamVjdChUVUlfVEVYVEZJRUxEX1NJWkUpXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdGV4dGZpZWxkU2l6ZTogVHVpVGV4dGZpZWxkU2l6ZURpcmVjdGl2ZSxcbiAgICAgICAgQEluamVjdChUVUlfREFURV9GSUxMRVIpIHJlYWRvbmx5IGRhdGVGaWxsZXI6IHN0cmluZyxcbiAgICAgICAgQEluamVjdChUVUlfVElNRV9URVhUUylcbiAgICAgICAgcmVhZG9ubHkgdGltZVRleHRzJDogT2JzZXJ2YWJsZTxSZWNvcmQ8VHVpVGltZU1vZGUsIHN0cmluZz4+LFxuICAgICkge1xuICAgICAgICBzdXBlcihjb250cm9sLCBjaGFuZ2VEZXRlY3RvclJlZik7XG4gICAgfVxuXG4gICAgZ2V0IGZpbGxlckxlbmd0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlRmlsbGVyLmxlbmd0aCArIERBVEVfVElNRV9TRVBBUkFUT1IubGVuZ3RoICsgdGhpcy50aW1lTW9kZS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0IHRleHRNYXNrT3B0aW9ucygpOiBUdWlUZXh0TWFza09wdGlvbnMge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVNYXNrKFxuICAgICAgICAgICAgdGhpcy52YWx1ZVswXSxcbiAgICAgICAgICAgIHRoaXMubWluLFxuICAgICAgICAgICAgdGhpcy5tYXgsXG4gICAgICAgICAgICB0aGlzLnRpbWVNb2RlLFxuICAgICAgICAgICAgdGhpcy5kYXRlRmlsbGVyLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldCBuYXRpdmVGb2N1c2FibGVFbGVtZW50KCk6IEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dGZpZWxkID8gdGhpcy50ZXh0ZmllbGQubmF0aXZlRm9jdXNhYmxlRWxlbWVudCA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGZvY3VzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMudGV4dGZpZWxkICYmIHRoaXMudGV4dGZpZWxkLmZvY3VzZWQ7XG4gICAgfVxuXG4gICAgZ2V0IGNhbGVuZGFySWNvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc2l6ZUJpZ2dlcih0aGlzLnRleHRmaWVsZFNpemUuc2l6ZSlcbiAgICAgICAgICAgID8gJ3R1aUljb25DYWxlbmRhckxhcmdlJ1xuICAgICAgICAgICAgOiAndHVpSWNvbkNhbGVuZGFyJztcbiAgICB9XG5cbiAgICBnZXQgY29tcHV0ZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB7dmFsdWUsIG5hdGl2ZVZhbHVlLCBmb2N1c2VkLCB0b3VjaGVkfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IFtkYXRlLCB0aW1lXSA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChkYXRlICYmICFuYXRpdmVWYWx1ZSkgfHxcbiAgICAgICAgICAgIChkYXRlICYmIG5hdGl2ZVZhbHVlLmxlbmd0aCA9PT0gdGhpcy5kYXRlRmlsbGVyLmxlbmd0aCkgfHxcbiAgICAgICAgICAgIChkYXRlICYmIHRpbWUpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGAke2RhdGUudG9TdHJpbmcoKX0ke0RBVEVfVElNRV9TRVBBUkFUT1J9JHtcbiAgICAgICAgICAgICAgICB0aW1lID8gdGltZS50b1N0cmluZyh0aGlzLnRpbWVNb2RlKSA6ICcnXG4gICAgICAgICAgICB9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b3VjaGVkIHx8IGZvY3VzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRlICE9PSBudWxsID8gZGF0ZS50b1N0cmluZygpIDogJyc7XG4gICAgfVxuXG4gICAgZ2V0IGNhbGVuZGFyVmFsdWUoKTogVHVpRGF5IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlWzBdO1xuICAgIH1cblxuICAgIGdldCBjb21wdXRlZEFjdGl2ZVllYXJNb250aCgpOiBUdWlNb250aCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vbnRoIHx8IHRoaXMudmFsdWVbMF0gfHwgdGhpcy5kZWZhdWx0QWN0aXZlWWVhck1vbnRoO1xuICAgIH1cblxuICAgIGdldCBuYXRpdmVWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVGb2N1c2FibGVFbGVtZW50ID8gdGhpcy5uYXRpdmVGb2N1c2FibGVFbGVtZW50LnZhbHVlIDogJyc7XG4gICAgfVxuXG4gICAgc2V0IG5hdGl2ZVZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLm5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmF0aXZlRm9jdXNhYmxlRWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldCBjYW5PcGVuKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuY29tcHV0ZWREaXNhYmxlZCAmJiAhdGhpcy5yZWFkT25seTtcbiAgICB9XG5cbiAgICBAdHVpUHVyZVxuICAgIGdldEZpbGxlciQoZGF0ZUZpbGxlcjogc3RyaW5nLCB0aW1lTW9kZTogVHVpVGltZU1vZGUpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lVGV4dHMkLnBpcGUoXG4gICAgICAgICAgICBtYXAodGV4dHMgPT4gYCR7ZGF0ZUZpbGxlcn0ke0RBVEVfVElNRV9TRVBBUkFUT1J9JHt0ZXh0c1t0aW1lTW9kZV19YCksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICAgIG9uQ2xpY2soKSB7XG4gICAgICAgIHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XG4gICAgfVxuXG4gICAgb25WYWx1ZUNoYW5nZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPCB0aGlzLmRhdGVGaWxsZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKFtudWxsLCBudWxsXSk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtkYXRlLCB0aW1lXSA9IHZhbHVlLnNwbGl0KERBVEVfVElNRV9TRVBBUkFUT1IpO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZERhdGUgPSBUdWlEYXkubm9ybWFsaXplUGFyc2UoZGF0ZSk7XG4gICAgICAgIGNvbnN0IHBhcnNlZFRpbWUgPVxuICAgICAgICAgICAgdGltZSAmJiB0aW1lLmxlbmd0aCA9PT0gdGhpcy50aW1lTW9kZS5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IFR1aVRpbWUuZnJvbVN0cmluZyh0aW1lKVxuICAgICAgICAgICAgICAgIDogbnVsbDtcblxuICAgICAgICBpZiAocGFyc2VkRGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKFtwYXJzZWREYXRlLCBwYXJzZWRUaW1lXSk7XG4gICAgfVxuXG4gICAgb25EYXlDbGljayhkYXk6IFR1aURheSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKFtkYXksIHRoaXMudmFsdWVbMV1dKTtcbiAgICAgICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgb25Ib3ZlcmVkKGhvdmVyZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy51cGRhdGVIb3ZlcmVkKGhvdmVyZWQpO1xuICAgIH1cblxuICAgIG9uTW9udGhDaGFuZ2UobW9udGg6IFR1aU1vbnRoKSB7XG4gICAgICAgIHRoaXMubW9udGggPSBtb250aDtcbiAgICB9XG5cbiAgICBvbk9wZW5DaGFuZ2Uob3BlbjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLm9wZW4gPSBvcGVuO1xuICAgIH1cblxuICAgIG9uRm9jdXNlZChmb2N1c2VkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRm9jdXNlZChmb2N1c2VkKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBmb2N1c2VkIHx8XG4gICAgICAgICAgICB0aGlzLnZhbHVlWzBdID09PSBudWxsIHx8XG4gICAgICAgICAgICB0aGlzLnZhbHVlWzFdICE9PSBudWxsIHx8XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlLmxlbmd0aCA8PSB0aGlzLmZpbGxlckxlbmd0aCArIERBVEVfVElNRV9TRVBBUkFUT1IubGVuZ3RoIHx8XG4gICAgICAgICAgICB0aGlzLnRpbWVNb2RlID09PSAnSEg6TU0nXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgWywgdGltZV0gPSB0aGlzLm5hdGl2ZVZhbHVlLnNwbGl0KERBVEVfVElNRV9TRVBBUkFUT1IpO1xuXG4gICAgICAgIGlmICghdGltZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyc2VkVGltZSA9IFR1aVRpbWUuZnJvbVN0cmluZyh0aW1lKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKFt0aGlzLnZhbHVlWzBdLCBwYXJzZWRUaW1lXSk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5uYXRpdmVWYWx1ZS5lbmRzV2l0aCgnLicpIHx8IHRoaXMubmF0aXZlVmFsdWUuZW5kc1dpdGgoJzonKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSB0aGlzLm5hdGl2ZVZhbHVlLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0RGlzYWJsZWRTdGF0ZSgpIHtcbiAgICAgICAgc3VwZXIuc2V0RGlzYWJsZWRTdGF0ZSgpO1xuICAgICAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICB3cml0ZVZhbHVlKHZhbHVlOiBbVHVpRGF5IHwgbnVsbCwgVHVpVGltZSB8IG51bGxdIHwgbnVsbCkge1xuICAgICAgICBzdXBlci53cml0ZVZhbHVlKHZhbHVlKTtcblxuICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlID0gdmFsdWUgJiYgKHZhbHVlWzBdIHx8IHZhbHVlWzFdKSA/IHRoaXMuY29tcHV0ZWRWYWx1ZSA6ICcnO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRGYWxsYmFja1ZhbHVlKCk6IFtUdWlEYXkgfCBudWxsLCBUdWlUaW1lIHwgbnVsbF0ge1xuICAgICAgICByZXR1cm4gW251bGwsIG51bGxdO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB2YWx1ZUlkZW50aWNhbENvbXBhcmF0b3IoXG4gICAgICAgIG9sZFZhbHVlOiBbVHVpRGF5IHwgbnVsbCwgVHVpVGltZSB8IG51bGxdLFxuICAgICAgICBuZXdWYWx1ZTogW1R1aURheSB8IG51bGwsIFR1aVRpbWUgfCBudWxsXSxcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG51bGxhYmxlU2FtZShvbGRWYWx1ZVswXSwgbmV3VmFsdWVbMF0sIChhLCBiKSA9PiBhLmRheVNhbWUoYikpICYmXG4gICAgICAgICAgICBudWxsYWJsZVNhbWUoXG4gICAgICAgICAgICAgICAgb2xkVmFsdWVbMV0sXG4gICAgICAgICAgICAgICAgbmV3VmFsdWVbMV0sXG4gICAgICAgICAgICAgICAgKGEsIGIpID0+IGEudG9TdHJpbmcoKSA9PT0gYi50b1N0cmluZygpLFxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIEB0dWlQdXJlXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVNYXNrKFxuICAgICAgICBkYXk6IFR1aURheSB8IG51bGwsXG4gICAgICAgIG1pbjogVHVpRGF5LFxuICAgICAgICBtYXg6IFR1aURheSxcbiAgICAgICAgdGltZU1vZGU6IFR1aVRpbWVNb2RlLFxuICAgICAgICBmaWxsZXI6IHN0cmluZyxcbiAgICApOiBUdWlUZXh0TWFza09wdGlvbnMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWFzazogWy4uLlRVSV9EQVRFX01BU0ssICcsJywgJyAnLCAuLi50dWlDcmVhdGVUaW1lTWFzayh0aW1lTW9kZSldLFxuICAgICAgICAgICAgcGlwZTogdHVpQ3JlYXRlQXV0b0NvcnJlY3RlZERhdGVUaW1lUGlwZShcbiAgICAgICAgICAgICAgICB7dmFsdWU6IGRheSwgbWluLCBtYXgsIGZpbGxlcn0sXG4gICAgICAgICAgICAgICAgdGltZU1vZGUsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZ3VpZGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==