UNPKG

@taiga-ui/kit

Version:

Taiga UI Angular main components kit

159 lines 25.3 kB
import { computed, Directive, effect, inject, Input, signal } from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; import { MaskitoDirective } from '@maskito/angular'; import { maskitoDateOptionsGenerator } from '@maskito/kit'; import { tuiAsControl, TuiControl, tuiValueTransformerFrom } from '@taiga-ui/cdk/classes'; import { TUI_ALLOW_SIGNAL_WRITES } from '@taiga-ui/cdk/constants'; import { DATE_FILLER_LENGTH, TuiDay } from '@taiga-ui/cdk/date-time'; import { TUI_IS_MOBILE } from '@taiga-ui/cdk/tokens'; import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom'; import { changeDateSeparator, tuiDirectiveBinding, } from '@taiga-ui/cdk/utils/miscellaneous'; import { TuiCalendar } from '@taiga-ui/core/components/calendar'; import { tuiAsOptionContent } from '@taiga-ui/core/components/data-list'; import { tuiInjectAuxiliary, TuiTextfieldComponent, TuiTextfieldDirective, tuiTextfieldIconBinding, TuiWithTextfield, } from '@taiga-ui/core/components/textfield'; import { TuiDropdownAuto, tuiDropdownEnabled, tuiDropdownOpen, } from '@taiga-ui/core/directives/dropdown'; import { TUI_ITEMS_HANDLERS, TuiItemsHandlersDirective, TuiItemsHandlersValidator, } from '@taiga-ui/core/directives/items-handlers'; import { TUI_DATE_FORMAT, TUI_DEFAULT_DATE_FORMAT } from '@taiga-ui/core/tokens'; import { TuiCalendarRange } from '@taiga-ui/kit/components/calendar-range'; import { TuiSelectOption } from '@taiga-ui/kit/components/select'; import { TUI_DATE_TEXTS } from '@taiga-ui/kit/tokens'; import { tuiMaskito } from '@taiga-ui/kit/utils'; import { TUI_INPUT_DATE_OPTIONS_NEW } from './input-date.options'; import * as i0 from "@angular/core"; import * as i1 from "@taiga-ui/core/components/textfield"; import * as i2 from "@taiga-ui/core/directives/dropdown"; import * as i3 from "@taiga-ui/core/directives/items-handlers"; import * as i4 from "@maskito/angular"; export const TUI_DATE_ADAPTER = { DMY: 'dd/mm/yyyy', MDY: 'mm/dd/yyyy', YMD: 'yyyy/mm/dd', }; class TuiInputDateBase extends TuiControl { constructor() { super(...arguments); this.el = tuiInjectElement(); this.options = inject(TUI_INPUT_DATE_OPTIONS_NEW); this.handlers = inject(TuiItemsHandlersDirective); this.textfield = inject(TuiTextfieldDirective); this.texts = toSignal(inject(TUI_DATE_TEXTS)); this.calendar = tuiInjectAuxiliary((x) => x instanceof TuiCalendar || x instanceof TuiCalendarRange); this.filler = tuiDirectiveBinding(TuiTextfieldComponent, 'fillerSetter', computed(() => { const { mode, separator } = this.format(); const texts = this.texts() || ''; return texts && changeDateSeparator(texts[mode], separator); }), {}); this.mobile = inject(TUI_IS_MOBILE); this.open = tuiDropdownOpen(); this.icon = tuiTextfieldIconBinding(TUI_INPUT_DATE_OPTIONS_NEW); this.dropdownEnabled = tuiDropdownEnabled(computed(() => !this.native && this.interactive())); this.format = toSignal(inject(TUI_DATE_FORMAT), { initialValue: TUI_DEFAULT_DATE_FORMAT, }); this.mask = tuiMaskito(computed(() => maskitoDateOptionsGenerator({ separator: this.format().separator, mode: TUI_DATE_ADAPTER[this.format().mode], min: this.min().toLocalNativeDate(), max: this.max().toLocalNativeDate(), }))); this.valueEffect = effect(() => { const value = this.value()?.toString(this.format().mode, this.format().separator) ?? (this.filler().length === this.el.value.length ? '' : this.el.value); this.textfield.value.set(value); }, TUI_ALLOW_SIGNAL_WRITES); this.calendarIn = effect(() => { if (this.calendar()) { this.processCalendar(this.calendar()); } }, TUI_ALLOW_SIGNAL_WRITES); this.calendarOut = effect((onCleanup) => { const subscription = this.calendar()?.valueChange.subscribe((value) => { this.onChange(value); this.open.set(false); if (!this.el.closest('tui-dropdown')) { this.el.blur(); } }); onCleanup(() => subscription?.unsubscribe()); }); this.native = this.el.type === 'date' && this.mobile; this.min = signal(this.options.min); this.max = signal(this.options.max); } set minSetter(min) { this.min.set(min || this.options.min); } set maxSetter(max) { this.max.set(max || this.options.max); } processCalendar(calendar) { calendar.value = this.value(); calendar.disabledItemHandler = this.handlers.disabledItemHandler(); calendar.min = this.min(); calendar.max = this.max(); } onClick() { if (!this.mobile) { this.open.update((open) => !open); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputDateBase, deps: null, target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiInputDateBase, isStandalone: true, inputs: { minSetter: ["min", "minSetter"], maxSetter: ["max", "maxSetter"] }, host: { listeners: { "input": "onValueChange($event.target.value)", "click.capture.stop": "onClick()" }, properties: { "attr.inputmode": "mobile && open() ? \"none\" : \"numeric\"", "disabled": "disabled()" } }, usesInheritance: true, ngImport: i0 }); } } export { TuiInputDateBase }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputDateBase, decorators: [{ type: Directive, args: [{ standalone: true, host: { '[attr.inputmode]': 'mobile && open() ? "none" : "numeric"', '[disabled]': 'disabled()', '(input)': 'onValueChange($event.target.value)', '(click.capture.stop)': 'onClick()', }, }] }], propDecorators: { minSetter: [{ type: Input, args: ['min'] }], maxSetter: [{ type: Input, args: ['max'] }] } }); class TuiInputDateDirective extends TuiInputDateBase { constructor() { super(...arguments); this.identity = inject(TUI_ITEMS_HANDLERS).identityMatcher.set((a, b) => a.daySame(b)); } onValueChange(value) { this.control?.control?.updateValueAndValidity({ emitEvent: false }); this.onChange(value.length === DATE_FILLER_LENGTH ? TuiDay.normalizeParse(value, this.format().mode) : null); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputDateDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiInputDateDirective, isStandalone: true, selector: "input[tuiInputDate]", providers: [ tuiAsOptionContent(TuiSelectOption), tuiAsControl(TuiInputDateDirective), tuiValueTransformerFrom(TUI_INPUT_DATE_OPTIONS_NEW), ], usesInheritance: true, hostDirectives: [{ directive: i1.TuiWithTextfield }, { directive: i2.TuiDropdownAuto }, { directive: i3.TuiItemsHandlersValidator }, { directive: i4.MaskitoDirective }], ngImport: i0 }); } } export { TuiInputDateDirective }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputDateDirective, decorators: [{ type: Directive, args: [{ standalone: true, selector: 'input[tuiInputDate]', providers: [ tuiAsOptionContent(TuiSelectOption), tuiAsControl(TuiInputDateDirective), tuiValueTransformerFrom(TUI_INPUT_DATE_OPTIONS_NEW), ], hostDirectives: [ TuiWithTextfield, TuiDropdownAuto, TuiItemsHandlersValidator, MaskitoDirective, ], }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtZGF0ZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXQvY29tcG9uZW50cy9pbnB1dC1kYXRlL2lucHV0LWRhdGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDcEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFbEQsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3pELE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDeEYsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFaEUsT0FBTyxFQUFDLGtCQUFrQixFQUFFLE1BQU0sRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQ0gsbUJBQW1CLEVBQ25CLG1CQUFtQixHQUN0QixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUMvRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQ0gsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixHQUNuQixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFDSCxlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLGVBQWUsR0FDbEIsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1QyxPQUFPLEVBQ0gsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6Qix5QkFBeUIsR0FDNUIsTUFBTSwwQ0FBMEMsQ0FBQztBQUNsRCxPQUFPLEVBQUMsZUFBZSxFQUFFLHVCQUF1QixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDL0UsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFDekUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFL0MsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7Ozs7OztBQUVoRSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBeUM7SUFDbEUsR0FBRyxFQUFFLFlBQVk7SUFDakIsR0FBRyxFQUFFLFlBQVk7SUFDakIsR0FBRyxFQUFFLFlBQVk7Q0FDcEIsQ0FBQztBQUVGLE1BU3NCLGdCQUVwQixTQUFRLFVBQW9CO0lBWDlCOztRQVlxQixPQUFFLEdBQUcsZ0JBQWdCLEVBQW9CLENBQUM7UUFDMUMsWUFBTyxHQUFHLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzdDLGFBQVEsR0FBRyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxjQUFTLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDMUMsVUFBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUN6QyxhQUFRLEdBQUcsa0JBQWtCLENBQzFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksV0FBVyxJQUFJLENBQUMsWUFBWSxnQkFBZ0IsQ0FDbkUsQ0FBQztRQUVpQixXQUFNLEdBQUcsbUJBQW1CLENBQzNDLHFCQUFxQixFQUNyQixjQUFjLEVBQ2QsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNWLE1BQU0sRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFFakMsT0FBTyxLQUFLLElBQUksbUJBQW1CLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxFQUNGLEVBQUUsQ0FDTCxDQUFDO1FBRWlCLFdBQU0sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0IsU0FBSSxHQUFHLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLFNBQUksR0FBRyx1QkFBdUIsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzNELG9CQUFlLEdBQUcsa0JBQWtCLENBQ25ELFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQ3JELENBQUM7UUFFaUIsV0FBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDMUQsWUFBWSxFQUFFLHVCQUF1QjtTQUN4QyxDQUFDLENBQUM7UUFFZ0IsU0FBSSxHQUFHLFVBQVUsQ0FDaEMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUNWLDJCQUEyQixDQUFDO1lBQ3hCLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUztZQUNsQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQztZQUMxQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFO1lBQ25DLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUU7U0FDdEMsQ0FBQyxDQUNMLENBQ0osQ0FBQztRQUVpQixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDekMsTUFBTSxLQUFLLEdBQ1AsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ25FLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV6RSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFVCxlQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUN4QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFHLENBQUMsQ0FBQzthQUMxQztRQUNMLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBRVQsZ0JBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNsRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO2dCQUN2RSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFckIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFO29CQUNsQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUNsQjtZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO1FBRWEsV0FBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2hELFFBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixRQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7S0EwQmxEO0lBdEJHLElBQ1csU0FBUyxDQUFDLEdBQWtCO1FBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUNXLFNBQVMsQ0FBQyxHQUFrQjtRQUNuQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRVMsZUFBZSxDQUFDLFFBQXdDO1FBQzlELFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlCLFFBQVEsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDbkUsUUFBUSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDMUIsUUFBUSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVTLE9BQU87UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JDO0lBQ0wsQ0FBQzsrR0FwR2lCLGdCQUFnQjttR0FBaEIsZ0JBQWdCOztTQUFoQixnQkFBZ0I7NEZBQWhCLGdCQUFnQjtrQkFUckMsU0FBUzttQkFBQztvQkFDUCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsSUFBSSxFQUFFO3dCQUNGLGtCQUFrQixFQUFFLHVDQUF1Qzt3QkFDM0QsWUFBWSxFQUFFLFlBQVk7d0JBQzFCLFNBQVMsRUFBRSxvQ0FBb0M7d0JBQy9DLHNCQUFzQixFQUFFLFdBQVc7cUJBQ3RDO2lCQUNKOzhCQWlGYyxTQUFTO3NCQURuQixLQUFLO3VCQUFDLEtBQUs7Z0JBTUQsU0FBUztzQkFEbkIsS0FBSzt1QkFBQyxLQUFLOztBQW1CaEIsTUFlYSxxQkFBc0IsU0FBUSxnQkFBd0I7SUFmbkU7O1FBZ0J1QixhQUFRLEdBQUcsTUFBTSxDQUNoQyxrQkFBa0IsQ0FDckIsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBVWpEO0lBUnNCLGFBQWEsQ0FBQyxLQUFhO1FBQzFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixDQUFDLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFFBQVEsQ0FDVCxLQUFLLENBQUMsTUFBTSxLQUFLLGtCQUFrQjtZQUMvQixDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQztZQUNsRCxDQUFDLENBQUMsSUFBSSxDQUNiLENBQUM7SUFDTixDQUFDOytHQVpRLHFCQUFxQjttR0FBckIscUJBQXFCLGtFQVpuQjtZQUNQLGtCQUFrQixDQUFDLGVBQWUsQ0FBQztZQUNuQyxZQUFZLENBQUMscUJBQXFCLENBQUM7WUFDbkMsdUJBQXVCLENBQUMsMEJBQTBCLENBQUM7U0FDdEQ7O1NBUVEscUJBQXFCOzRGQUFyQixxQkFBcUI7a0JBZmpDLFNBQVM7bUJBQUM7b0JBQ1AsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLFNBQVMsRUFBRTt3QkFDUCxrQkFBa0IsQ0FBQyxlQUFlLENBQUM7d0JBQ25DLFlBQVksdUJBQXVCO3dCQUNuQyx1QkFBdUIsQ0FBQywwQkFBMEIsQ0FBQztxQkFDdEQ7b0JBQ0QsY0FBYyxFQUFFO3dCQUNaLGdCQUFnQjt3QkFDaEIsZUFBZTt3QkFDZix5QkFBeUI7d0JBQ3pCLGdCQUFnQjtxQkFDbkI7aUJBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2NvbXB1dGVkLCBEaXJlY3RpdmUsIGVmZmVjdCwgaW5qZWN0LCBJbnB1dCwgc2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dG9TaWduYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7TWFza2l0b0RpcmVjdGl2ZX0gZnJvbSAnQG1hc2tpdG8vYW5ndWxhcic7XG5pbXBvcnQgdHlwZSB7TWFza2l0b0RhdGVNb2RlfSBmcm9tICdAbWFza2l0by9raXQnO1xuaW1wb3J0IHttYXNraXRvRGF0ZU9wdGlvbnNHZW5lcmF0b3J9IGZyb20gJ0BtYXNraXRvL2tpdCc7XG5pbXBvcnQge3R1aUFzQ29udHJvbCwgVHVpQ29udHJvbCwgdHVpVmFsdWVUcmFuc2Zvcm1lckZyb219IGZyb20gJ0B0YWlnYS11aS9jZGsvY2xhc3Nlcyc7XG5pbXBvcnQge1RVSV9BTExPV19TSUdOQUxfV1JJVEVTfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2NvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7VHVpRGF0ZU1vZGUsIFR1aURheVJhbmdlfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RhdGUtdGltZSc7XG5pbXBvcnQge0RBVEVfRklMTEVSX0xFTkdUSCwgVHVpRGF5fSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RhdGUtdGltZSc7XG5pbXBvcnQge1RVSV9JU19NT0JJTEV9IGZyb20gJ0B0YWlnYS11aS9jZGsvdG9rZW5zJztcbmltcG9ydCB7dHVpSW5qZWN0RWxlbWVudH0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9kb20nO1xuaW1wb3J0IHtcbiAgICBjaGFuZ2VEYXRlU2VwYXJhdG9yLFxuICAgIHR1aURpcmVjdGl2ZUJpbmRpbmcsXG59IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWlzY2VsbGFuZW91cyc7XG5pbXBvcnQge1R1aUNhbGVuZGFyfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2NhbGVuZGFyJztcbmltcG9ydCB7dHVpQXNPcHRpb25Db250ZW50fSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2RhdGEtbGlzdCc7XG5pbXBvcnQge1xuICAgIHR1aUluamVjdEF1eGlsaWFyeSxcbiAgICBUdWlUZXh0ZmllbGRDb21wb25lbnQsXG4gICAgVHVpVGV4dGZpZWxkRGlyZWN0aXZlLFxuICAgIHR1aVRleHRmaWVsZEljb25CaW5kaW5nLFxuICAgIFR1aVdpdGhUZXh0ZmllbGQsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvdGV4dGZpZWxkJztcbmltcG9ydCB7XG4gICAgVHVpRHJvcGRvd25BdXRvLFxuICAgIHR1aURyb3Bkb3duRW5hYmxlZCxcbiAgICB0dWlEcm9wZG93bk9wZW4sXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvZHJvcGRvd24nO1xuaW1wb3J0IHR5cGUge1R1aUl0ZW1zSGFuZGxlcnN9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvaXRlbXMtaGFuZGxlcnMnO1xuaW1wb3J0IHtcbiAgICBUVUlfSVRFTVNfSEFORExFUlMsXG4gICAgVHVpSXRlbXNIYW5kbGVyc0RpcmVjdGl2ZSxcbiAgICBUdWlJdGVtc0hhbmRsZXJzVmFsaWRhdG9yLFxufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9kaXJlY3RpdmVzL2l0ZW1zLWhhbmRsZXJzJztcbmltcG9ydCB7VFVJX0RBVEVfRk9STUFULCBUVUlfREVGQVVMVF9EQVRFX0ZPUk1BVH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvdG9rZW5zJztcbmltcG9ydCB7VHVpQ2FsZW5kYXJSYW5nZX0gZnJvbSAnQHRhaWdhLXVpL2tpdC9jb21wb25lbnRzL2NhbGVuZGFyLXJhbmdlJztcbmltcG9ydCB7VHVpU2VsZWN0T3B0aW9ufSBmcm9tICdAdGFpZ2EtdWkva2l0L2NvbXBvbmVudHMvc2VsZWN0JztcbmltcG9ydCB7VFVJX0RBVEVfVEVYVFN9IGZyb20gJ0B0YWlnYS11aS9raXQvdG9rZW5zJztcbmltcG9ydCB7dHVpTWFza2l0b30gZnJvbSAnQHRhaWdhLXVpL2tpdC91dGlscyc7XG5cbmltcG9ydCB7VFVJX0lOUFVUX0RBVEVfT1BUSU9OU19ORVd9IGZyb20gJy4vaW5wdXQtZGF0ZS5vcHRpb25zJztcblxuZXhwb3J0IGNvbnN0IFRVSV9EQVRFX0FEQVBURVI6IFJlY29yZDxUdWlEYXRlTW9kZSwgTWFza2l0b0RhdGVNb2RlPiA9IHtcbiAgICBETVk6ICdkZC9tbS95eXl5JyxcbiAgICBNRFk6ICdtbS9kZC95eXl5JyxcbiAgICBZTUQ6ICd5eXl5L21tL2RkJyxcbn07XG5cbkBEaXJlY3RpdmUoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaG9zdDoge1xuICAgICAgICAnW2F0dHIuaW5wdXRtb2RlXSc6ICdtb2JpbGUgJiYgb3BlbigpID8gXCJub25lXCIgOiBcIm51bWVyaWNcIicsXG4gICAgICAgICdbZGlzYWJsZWRdJzogJ2Rpc2FibGVkKCknLFxuICAgICAgICAnKGlucHV0KSc6ICdvblZhbHVlQ2hhbmdlKCRldmVudC50YXJnZXQudmFsdWUpJyxcbiAgICAgICAgJyhjbGljay5jYXB0dXJlLnN0b3ApJzogJ29uQ2xpY2soKScsXG4gICAgfSxcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVHVpSW5wdXREYXRlQmFzZTxcbiAgICBUIGV4dGVuZHMgVHVpRGF5IHwgVHVpRGF5UmFuZ2UsXG4+IGV4dGVuZHMgVHVpQ29udHJvbDxUIHwgbnVsbD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZWwgPSB0dWlJbmplY3RFbGVtZW50PEhUTUxJbnB1dEVsZW1lbnQ+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zID0gaW5qZWN0KFRVSV9JTlBVVF9EQVRFX09QVElPTlNfTkVXKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXJzID0gaW5qZWN0KFR1aUl0ZW1zSGFuZGxlcnNEaXJlY3RpdmUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGV4dGZpZWxkID0gaW5qZWN0KFR1aVRleHRmaWVsZERpcmVjdGl2ZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZXh0cyA9IHRvU2lnbmFsKGluamVjdChUVUlfREFURV9URVhUUykpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FsZW5kYXIgPSB0dWlJbmplY3RBdXhpbGlhcnk8VHVpQ2FsZW5kYXIgfCBUdWlDYWxlbmRhclJhbmdlPihcbiAgICAgICAgKHgpID0+IHggaW5zdGFuY2VvZiBUdWlDYWxlbmRhciB8fCB4IGluc3RhbmNlb2YgVHVpQ2FsZW5kYXJSYW5nZSxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpbGxlciA9IHR1aURpcmVjdGl2ZUJpbmRpbmcoXG4gICAgICAgIFR1aVRleHRmaWVsZENvbXBvbmVudCxcbiAgICAgICAgJ2ZpbGxlclNldHRlcicsXG4gICAgICAgIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHttb2RlLCBzZXBhcmF0b3J9ID0gdGhpcy5mb3JtYXQoKTtcbiAgICAgICAgICAgIGNvbnN0IHRleHRzID0gdGhpcy50ZXh0cygpIHx8ICcnO1xuXG4gICAgICAgICAgICByZXR1cm4gdGV4dHMgJiYgY2hhbmdlRGF0ZVNlcGFyYXRvcih0ZXh0c1ttb2RlXSwgc2VwYXJhdG9yKTtcbiAgICAgICAgfSksXG4gICAgICAgIHt9LFxuICAgICk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9iaWxlID0gaW5qZWN0KFRVSV9JU19NT0JJTEUpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBvcGVuID0gdHVpRHJvcGRvd25PcGVuKCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGljb24gPSB0dWlUZXh0ZmllbGRJY29uQmluZGluZyhUVUlfSU5QVVRfREFURV9PUFRJT05TX05FVyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRyb3Bkb3duRW5hYmxlZCA9IHR1aURyb3Bkb3duRW5hYmxlZChcbiAgICAgICAgY29tcHV0ZWQoKCkgPT4gIXRoaXMubmF0aXZlICYmIHRoaXMuaW50ZXJhY3RpdmUoKSksXG4gICAgKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBmb3JtYXQgPSB0b1NpZ25hbChpbmplY3QoVFVJX0RBVEVfRk9STUFUKSwge1xuICAgICAgICBpbml0aWFsVmFsdWU6IFRVSV9ERUZBVUxUX0RBVEVfRk9STUFULFxuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1hc2sgPSB0dWlNYXNraXRvKFxuICAgICAgICBjb21wdXRlZCgoKSA9PlxuICAgICAgICAgICAgbWFza2l0b0RhdGVPcHRpb25zR2VuZXJhdG9yKHtcbiAgICAgICAgICAgICAgICBzZXBhcmF0b3I6IHRoaXMuZm9ybWF0KCkuc2VwYXJhdG9yLFxuICAgICAgICAgICAgICAgIG1vZGU6IFRVSV9EQVRFX0FEQVBURVJbdGhpcy5mb3JtYXQoKS5tb2RlXSxcbiAgICAgICAgICAgICAgICBtaW46IHRoaXMubWluKCkudG9Mb2NhbE5hdGl2ZURhdGUoKSxcbiAgICAgICAgICAgICAgICBtYXg6IHRoaXMubWF4KCkudG9Mb2NhbE5hdGl2ZURhdGUoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmFsdWVFZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgICAgICB0aGlzLnZhbHVlKCk/LnRvU3RyaW5nKHRoaXMuZm9ybWF0KCkubW9kZSwgdGhpcy5mb3JtYXQoKS5zZXBhcmF0b3IpID8/XG4gICAgICAgICAgICAodGhpcy5maWxsZXIoKS5sZW5ndGggPT09IHRoaXMuZWwudmFsdWUubGVuZ3RoID8gJycgOiB0aGlzLmVsLnZhbHVlKTtcblxuICAgICAgICB0aGlzLnRleHRmaWVsZC52YWx1ZS5zZXQodmFsdWUpO1xuICAgIH0sIFRVSV9BTExPV19TSUdOQUxfV1JJVEVTKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBjYWxlbmRhckluID0gZWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FsZW5kYXIoKSkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2FsZW5kYXIodGhpcy5jYWxlbmRhcigpISk7XG4gICAgICAgIH1cbiAgICB9LCBUVUlfQUxMT1dfU0lHTkFMX1dSSVRFUyk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FsZW5kYXJPdXQgPSBlZmZlY3QoKG9uQ2xlYW51cCkgPT4ge1xuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmNhbGVuZGFyKCk/LnZhbHVlQ2hhbmdlLnN1YnNjcmliZSgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLm9wZW4uc2V0KGZhbHNlKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmVsLmNsb3Nlc3QoJ3R1aS1kcm9wZG93bicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbC5ibHVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG9uQ2xlYW51cCgoKSA9PiBzdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCkpO1xuICAgIH0pO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IG5hdGl2ZSA9IHRoaXMuZWwudHlwZSA9PT0gJ2RhdGUnICYmIHRoaXMubW9iaWxlO1xuICAgIHB1YmxpYyByZWFkb25seSBtaW4gPSBzaWduYWwodGhpcy5vcHRpb25zLm1pbik7XG4gICAgcHVibGljIHJlYWRvbmx5IG1heCA9IHNpZ25hbCh0aGlzLm9wdGlvbnMubWF4KTtcblxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBvblZhbHVlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkO1xuXG4gICAgQElucHV0KCdtaW4nKVxuICAgIHB1YmxpYyBzZXQgbWluU2V0dGVyKG1pbjogVHVpRGF5IHwgbnVsbCkge1xuICAgICAgICB0aGlzLm1pbi5zZXQobWluIHx8IHRoaXMub3B0aW9ucy5taW4pO1xuICAgIH1cblxuICAgIEBJbnB1dCgnbWF4JylcbiAgICBwdWJsaWMgc2V0IG1heFNldHRlcihtYXg6IFR1aURheSB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5tYXguc2V0KG1heCB8fCB0aGlzLm9wdGlvbnMubWF4KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0NhbGVuZGFyKGNhbGVuZGFyOiBUdWlDYWxlbmRhciB8IFR1aUNhbGVuZGFyUmFuZ2UpOiB2b2lkIHtcbiAgICAgICAgY2FsZW5kYXIudmFsdWUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIGNhbGVuZGFyLmRpc2FibGVkSXRlbUhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmRpc2FibGVkSXRlbUhhbmRsZXIoKTtcbiAgICAgICAgY2FsZW5kYXIubWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY2FsZW5kYXIubWF4ID0gdGhpcy5tYXgoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25DbGljaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm1vYmlsZSkge1xuICAgICAgICAgICAgdGhpcy5vcGVuLnVwZGF0ZSgob3BlbikgPT4gIW9wZW4pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnaW5wdXRbdHVpSW5wdXREYXRlXScsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHR1aUFzT3B0aW9uQ29udGVudChUdWlTZWxlY3RPcHRpb24pLFxuICAgICAgICB0dWlBc0NvbnRyb2woVHVpSW5wdXREYXRlRGlyZWN0aXZlKSxcbiAgICAgICAgdHVpVmFsdWVUcmFuc2Zvcm1lckZyb20oVFVJX0lOUFVUX0RBVEVfT1BUSU9OU19ORVcpLFxuICAgIF0sXG4gICAgaG9zdERpcmVjdGl2ZXM6IFtcbiAgICAgICAgVHVpV2l0aFRleHRmaWVsZCxcbiAgICAgICAgVHVpRHJvcGRvd25BdXRvLFxuICAgICAgICBUdWlJdGVtc0hhbmRsZXJzVmFsaWRhdG9yLFxuICAgICAgICBNYXNraXRvRGlyZWN0aXZlLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIFR1aUlucHV0RGF0ZURpcmVjdGl2ZSBleHRlbmRzIFR1aUlucHV0RGF0ZUJhc2U8VHVpRGF5PiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlkZW50aXR5ID0gaW5qZWN0PFR1aUl0ZW1zSGFuZGxlcnM8VHVpRGF5Pj4oXG4gICAgICAgIFRVSV9JVEVNU19IQU5ETEVSUyxcbiAgICApLmlkZW50aXR5TWF0Y2hlci5zZXQoKGEsIGIpID0+IGEuZGF5U2FtZShiKSk7XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb25WYWx1ZUNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udHJvbD8uY29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKFxuICAgICAgICAgICAgdmFsdWUubGVuZ3RoID09PSBEQVRFX0ZJTExFUl9MRU5HVEhcbiAgICAgICAgICAgICAgICA/IFR1aURheS5ub3JtYWxpemVQYXJzZSh2YWx1ZSwgdGhpcy5mb3JtYXQoKS5tb2RlKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=