@taiga-ui/kit 4.39.2-canary.ec52de3 → 4.40.0-canary.cdfddf4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/components/calendar-range/calendar-range.component.d.ts +1 -0
  2. package/components/combo-box/combo-box.directive.d.ts +13 -9
  3. package/components/data-list-wrapper/data-list-wrapper.component.d.ts +4 -1
  4. package/components/index.d.ts +1 -0
  5. package/components/input-date-range/index.d.ts +3 -0
  6. package/components/input-date-range/input-date-range.d.ts +3 -0
  7. package/components/input-date-range/input-date-range.directive.d.ts +20 -0
  8. package/components/input-date-range/input-date-range.options.d.ts +9 -0
  9. package/esm2022/components/calendar-range/calendar-range.component.mjs +7 -4
  10. package/esm2022/components/combo-box/combo-box.directive.mjs +60 -36
  11. package/esm2022/components/data-list-wrapper/data-list-wrapper.component.mjs +16 -4
  12. package/esm2022/components/index.mjs +2 -1
  13. package/esm2022/components/input-date/input-date.directive.mjs +3 -3
  14. package/esm2022/components/input-date-range/index.mjs +4 -0
  15. package/esm2022/components/input-date-range/input-date-range.directive.mjs +75 -0
  16. package/esm2022/components/input-date-range/input-date-range.mjs +4 -0
  17. package/esm2022/components/input-date-range/input-date-range.options.mjs +10 -0
  18. package/esm2022/components/input-date-range/taiga-ui-kit-components-input-date-range.mjs +5 -0
  19. package/esm2022/components/input-slider/input-slider.directive.mjs +3 -2
  20. package/fesm2022/taiga-ui-kit-components-calendar-range.mjs +6 -3
  21. package/fesm2022/taiga-ui-kit-components-calendar-range.mjs.map +1 -1
  22. package/fesm2022/taiga-ui-kit-components-combo-box.mjs +61 -37
  23. package/fesm2022/taiga-ui-kit-components-combo-box.mjs.map +1 -1
  24. package/fesm2022/taiga-ui-kit-components-data-list-wrapper.mjs +15 -3
  25. package/fesm2022/taiga-ui-kit-components-data-list-wrapper.mjs.map +1 -1
  26. package/fesm2022/taiga-ui-kit-components-input-date-range.mjs +89 -0
  27. package/fesm2022/taiga-ui-kit-components-input-date-range.mjs.map +1 -0
  28. package/fesm2022/taiga-ui-kit-components-input-date.mjs +2 -2
  29. package/fesm2022/taiga-ui-kit-components-input-date.mjs.map +1 -1
  30. package/fesm2022/taiga-ui-kit-components-input-slider.mjs +2 -1
  31. package/fesm2022/taiga-ui-kit-components-input-slider.mjs.map +1 -1
  32. package/fesm2022/taiga-ui-kit-components.mjs +1 -0
  33. package/fesm2022/taiga-ui-kit-components.mjs.map +1 -1
  34. package/package.json +26 -20
@@ -20,6 +20,7 @@ export declare class TuiCalendarRange implements OnInit, OnChanges {
20
20
  protected readonly otherDateText$: Observable<string>;
21
21
  protected readonly icons: import("@taiga-ui/core/tokens").TuiCommonIcons;
22
22
  protected readonly capsMapper: TuiMapper<[TuiDay | null, TuiDay | TuiDayRange | null, TuiDayLike | null, boolean], TuiDay>;
23
+ protected readonly mobile: boolean;
23
24
  disabledItemHandler: TuiBooleanHandler<TuiDay>;
24
25
  markerHandler: TuiMarkerHandler | null;
25
26
  items: readonly TuiDayRangePeriod[];
@@ -8,20 +8,24 @@ export declare class TuiComboBox<T> extends TuiControl<T | string | null> implem
8
8
  private readonly host;
9
9
  private readonly textfield;
10
10
  private readonly open;
11
+ private readonly dropdownEnabled;
11
12
  private readonly dropdown;
12
13
  private readonly itemsHandlers;
14
+ private readonly matcher;
15
+ private readonly strict;
13
16
  private readonly datalist;
14
- protected readonly dropdownEnabled: import("@angular/core").Signal<boolean>;
15
- protected readonly valueEffect: import("@angular/core").EffectRef;
17
+ private readonly options;
18
+ protected readonly nonStrictValueEffect: import("@angular/core").EffectRef;
19
+ protected readonly matchingEffect: import("@angular/core").EffectRef;
16
20
  protected readonly blurEffect: import("@angular/core").EffectRef;
17
- strict: boolean;
18
- matcher: TuiStringMatcher<T> | null;
19
- setValue(value: T): void;
21
+ set strictSetter(x: boolean);
22
+ set matcherSetter(x: TuiStringMatcher<T> | null);
23
+ setValue(value: T | null): void;
24
+ writeValue(value: T | string | null): void;
20
25
  protected toggleDropdown(open?: boolean): void;
21
- protected onInput(value: string): void;
26
+ protected onInput(): void;
22
27
  protected keydownEnter(event: KeyboardEvent): void;
23
- private get options();
24
- private match;
28
+ private stringify;
25
29
  static ɵfac: i0.ɵɵFactoryDeclaration<TuiComboBox<any>, never>;
26
- static ɵdir: i0.ɵɵDirectiveDeclaration<TuiComboBox<any>, "input[tuiComboBox]", never, { "strict": { "alias": "strict"; "required": false; }; "matcher": { "alias": "matcher"; "required": false; }; }, {}, never, never, true, [{ directive: typeof i1.TuiWithTextfield; inputs: {}; outputs: {}; }]>;
30
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TuiComboBox<any>, "input[tuiComboBox]", never, { "strictSetter": { "alias": "strict"; "required": false; }; "matcherSetter": { "alias": "matcher"; "required": false; }; }, {}, never, never, true, [{ directive: typeof i1.TuiWithTextfield; inputs: {}; outputs: {}; }]>;
27
31
  }
@@ -2,11 +2,12 @@ import type { ElementRef, QueryList } from '@angular/core';
2
2
  import { EventEmitter } from '@angular/core';
3
3
  import type { TuiBooleanHandler } from '@taiga-ui/cdk/types';
4
4
  import type { TuiDataListAccessor } from '@taiga-ui/core/components/data-list';
5
- import { TuiOption, TuiOptionWithValue } from '@taiga-ui/core/components/data-list';
5
+ import { TuiDataListComponent, TuiOption, TuiOptionWithValue } from '@taiga-ui/core/components/data-list';
6
6
  import type { TuiValueContentContext } from '@taiga-ui/core/types';
7
7
  import type { PolymorpheusContent } from '@taiga-ui/polymorpheus';
8
8
  import * as i0 from "@angular/core";
9
9
  export declare class TuiDataListWrapperComponent<T, K = T> implements TuiDataListAccessor<T> {
10
+ private readonly datalist;
10
11
  private readonly itemsHandlers;
11
12
  private readonly itemsHandlersLegacy;
12
13
  protected readonly legacyOptionsQuery: QueryList<TuiOption<T>>;
@@ -17,9 +18,11 @@ export declare class TuiDataListWrapperComponent<T, K = T> implements TuiDataLis
17
18
  emptyContent: PolymorpheusContent;
18
19
  size: "m" | "l" | "s";
19
20
  readonly itemClick: EventEmitter<T>;
21
+ readonly options: import("@angular/core").Signal<readonly T[]>;
20
22
  itemContent: PolymorpheusContent<TuiValueContentContext<T>>;
21
23
  getContext($implicit: T, { nativeElement }: ElementRef<HTMLElement>): TuiValueContentContext<T>;
22
24
  getOptions(includeDisabled?: boolean): readonly T[];
25
+ protected set datalistSetter(x: TuiDataListComponent<T>);
23
26
  protected $cast(items: readonly K[]): readonly T[];
24
27
  static ɵfac: i0.ɵɵFactoryDeclaration<TuiDataListWrapperComponent<any, any>, never>;
25
28
  static ɵcmp: i0.ɵɵComponentDeclaration<TuiDataListWrapperComponent<any, any>, "tui-data-list-wrapper:not([labels]), tui-data-list-wrapper:not([labels])[new]", never, { "items": { "alias": "items"; "required": false; }; "disabledItemHandler": { "alias": "disabledItemHandler"; "required": false; }; "emptyContent": { "alias": "emptyContent"; "required": false; }; "size": { "alias": "size"; "required": false; }; "itemContent": { "alias": "itemContent"; "required": false; }; }, { "itemClick": "itemClick"; }, never, never, true, never>;
@@ -23,6 +23,7 @@ export * from '@taiga-ui/kit/components/files';
23
23
  export * from '@taiga-ui/kit/components/filter';
24
24
  export * from '@taiga-ui/kit/components/floating-container';
25
25
  export * from '@taiga-ui/kit/components/input-date';
26
+ export * from '@taiga-ui/kit/components/input-date-range';
26
27
  export * from '@taiga-ui/kit/components/input-inline';
27
28
  export * from '@taiga-ui/kit/components/input-month';
28
29
  export * from '@taiga-ui/kit/components/input-month-range';
@@ -0,0 +1,3 @@
1
+ export * from './input-date-range';
2
+ export * from './input-date-range.directive';
3
+ export * from './input-date-range.options';
@@ -0,0 +1,3 @@
1
+ import { TuiCalendarRange } from '@taiga-ui/kit/components/calendar-range';
2
+ import { TuiInputDateRangeDirective } from './input-date-range.directive';
3
+ export declare const TuiInputDateRange: readonly [typeof TuiInputDateRangeDirective, typeof TuiCalendarRange];
@@ -0,0 +1,20 @@
1
+ import type { TuiDayLike } from '@taiga-ui/cdk/date-time';
2
+ import { TuiDayRange } from '@taiga-ui/cdk/date-time';
3
+ import type { TuiCalendarRange } from '@taiga-ui/kit/components/calendar-range';
4
+ import { TuiInputDateBase } from '@taiga-ui/kit/components/input-date';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@taiga-ui/core/components/textfield";
7
+ import * as i2 from "@taiga-ui/core/directives/dropdown";
8
+ import * as i3 from "@maskito/angular";
9
+ export declare class TuiInputDateRangeDirective extends TuiInputDateBase<TuiDayRange> {
10
+ protected readonly rangeFiller: import("@angular/core").Signal<string>;
11
+ protected readonly mask: import("@angular/core").Signal<import("@maskito/core").MaskitoOptions | null>;
12
+ readonly minLength: import("@angular/core").WritableSignal<TuiDayLike | null>;
13
+ readonly maxLength: import("@angular/core").WritableSignal<TuiDayLike | null>;
14
+ set minLengthSetter(minLength: TuiDayLike | null);
15
+ set maxLengthSetter(maxLength: TuiDayLike | null);
16
+ protected processCalendar(calendar: TuiCalendarRange): void;
17
+ protected onValueChange(value: string): void;
18
+ static ɵfac: i0.ɵɵFactoryDeclaration<TuiInputDateRangeDirective, never>;
19
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TuiInputDateRangeDirective, "input[tuiInputDateRange]", never, { "minLengthSetter": { "alias": "minLength"; "required": false; }; "maxLengthSetter": { "alias": "maxLength"; "required": false; }; }, {}, never, never, true, [{ directive: typeof i1.TuiWithTextfield; inputs: {}; outputs: {}; }, { directive: typeof i2.TuiDropdownAuto; inputs: {}; outputs: {}; }, { directive: typeof i3.MaskitoDirective; inputs: {}; outputs: {}; }]>;
20
+ }
@@ -0,0 +1,9 @@
1
+ import type { FactoryProvider } from '@angular/core';
2
+ import type { TuiValueTransformer } from '@taiga-ui/cdk/classes';
3
+ import type { TuiDayRange } from '@taiga-ui/cdk/date-time';
4
+ import type { TuiInputDateOptionsNew } from '@taiga-ui/kit/components/input-date';
5
+ export interface TuiInputDateRangeOptions extends Omit<TuiInputDateOptionsNew, 'valueTransformer'> {
6
+ readonly valueTransformer: TuiValueTransformer<TuiDayRange | null, any>;
7
+ }
8
+ export declare const TUI_INPUT_DATE_RANGE_OPTIONS: import("@angular/core").InjectionToken<TuiInputDateRangeOptions>;
9
+ export declare const tuiInputDateRangeOptionsProvider: (options: Partial<TuiInputDateRangeOptions>) => FactoryProvider;
@@ -6,6 +6,7 @@ import { TUI_FALSE_HANDLER } from '@taiga-ui/cdk/constants';
6
6
  import { TUI_FIRST_DAY, TUI_LAST_DAY, TuiDay, TuiDayRange, TuiMonth, } from '@taiga-ui/cdk/date-time';
7
7
  import { tuiWatch } from '@taiga-ui/cdk/observables';
8
8
  import { TuiMapperPipe } from '@taiga-ui/cdk/pipes/mapper';
9
+ import { TUI_IS_MOBILE } from '@taiga-ui/cdk/tokens';
9
10
  import { tuiIsString, tuiNullableSame, tuiPure } from '@taiga-ui/cdk/utils/miscellaneous';
10
11
  import { TuiCalendar, tuiCalendarSheetOptionsProvider, } from '@taiga-ui/core/components/calendar';
11
12
  import { TuiDataList } from '@taiga-ui/core/components/data-list';
@@ -30,6 +31,7 @@ class TuiCalendarRange {
30
31
  this.otherDateText$ = inject(TUI_OTHER_DATE_TEXT);
31
32
  this.icons = inject(TUI_COMMON_ICONS);
32
33
  this.capsMapper = TUI_DAY_CAPS_MAPPER;
34
+ this.mobile = inject(TUI_IS_MOBILE);
33
35
  this.disabledItemHandler = TUI_FALSE_HANDLER;
34
36
  this.markerHandler = null;
35
37
  this.items = [];
@@ -175,10 +177,10 @@ class TuiCalendarRange {
175
177
  return this.items.find((item) => dayRange.daySame(item.range)) ?? null;
176
178
  }
177
179
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiCalendarRange, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
178
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiCalendarRange, isStandalone: true, selector: "tui-calendar-range", inputs: { disabledItemHandler: "disabledItemHandler", markerHandler: "markerHandler", items: "items", min: "min", max: "max", minLength: "minLength", maxLength: "maxLength", item: "item", valueSetter: ["value", "valueSetter"], defaultViewedMonth: "defaultViewedMonth" }, outputs: { valueChange: "valueChange", itemChange: "itemChange" }, host: { listeners: { "document:keydown.capture": "onEsc($event)" } }, providers: [
180
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiCalendarRange, isStandalone: true, selector: "tui-calendar-range", inputs: { disabledItemHandler: "disabledItemHandler", markerHandler: "markerHandler", items: "items", min: "min", max: "max", minLength: "minLength", maxLength: "maxLength", item: "item", valueSetter: ["value", "valueSetter"], defaultViewedMonth: "defaultViewedMonth" }, outputs: { valueChange: "valueChange", itemChange: "itemChange" }, host: { listeners: { "document:keydown.capture": "onEsc($event)" }, properties: { "class._mobile": "mobile" } }, providers: [
179
181
  tuiAsAuxiliary(TuiCalendarRange),
180
182
  tuiCalendarSheetOptionsProvider({ rangeMode: true }),
181
- ], usesOnChanges: true, ngImport: i0, template: "<tui-calendar\n automation-id=\"tui-calendar-range__calendar\"\n class=\"t-calendar\"\n [disabledItemHandler]=\"calculatedDisabledItemHandler\"\n [markerHandler]=\"markerHandler\"\n [max]=\"max | tuiMapper: capsMapper : currentValue : maxLength : false\"\n [maxViewedMonth]=\"items.length ? null : (defaultViewedMonth | tuiMapper: monthOffset : -1)\"\n [min]=\"min | tuiMapper: capsMapper : currentValue : maxLength : true\"\n [month]=\"defaultViewedMonth\"\n [showAdjacent]=\"!!items.length\"\n [value]=\"currentValue\"\n [(hoveredItem)]=\"hoveredItem\"\n (dayClick)=\"onDayClick($event)\"\n (monthChange)=\"onMonthChange($event)\"\n/>\n<tui-calendar\n *ngIf=\"!items.length; else presets\"\n [disabledItemHandler]=\"calculatedDisabledItemHandler\"\n [markerHandler]=\"markerHandler\"\n [max]=\"max | tuiMapper: capsMapper : currentValue : maxLength : false\"\n [min]=\"min | tuiMapper: capsMapper : currentValue : maxLength : true\"\n [minViewedMonth]=\"defaultViewedMonth | tuiMapper: monthOffset : 1\"\n [month]=\"defaultViewedMonth | tuiMapper: monthOffset : 1\"\n [showAdjacent]=\"false\"\n [value]=\"currentValue\"\n [(hoveredItem)]=\"hoveredItem\"\n (dayClick)=\"onDayClick($event)\"\n (monthChange)=\"onMonthChange($event.append({month: -1}))\"\n/>\n<ng-template #presets>\n <tui-data-list\n automation-id=\"tui-calendar-range__menu\"\n role=\"menu\"\n [style.flex]=\"1\"\n >\n <button\n *ngFor=\"let item of items | tuiMapper: mapper : min : max : minLength : (otherDateText$ | async)\"\n automation-id=\"tui-calendar-range__menu__item\"\n role=\"menuitemradio\"\n tuiOption\n type=\"button\"\n [attr.aria-checked]=\"isItemActive(item)\"\n (click)=\"onItemSelect(item)\"\n (pointerdown.prevent.zoneless)=\"(0)\"\n >\n {{ item }}\n <tui-icon\n *ngIf=\"isItemActive(item)\"\n automation-id=\"tui-calendar-range__checkmark\"\n [icon]=\"icons.check\"\n [style.font-size.rem]=\"1\"\n />\n </button>\n </tui-data-list>\n</ng-template>\n", styles: [":host{display:flex;min-inline-size:30rem}.t-calendar{border-inline-end:1px solid var(--tui-border-normal)}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: TuiCalendar, selector: "tui-calendar", inputs: ["month", "disabledItemHandler", "min", "max", "minViewedMonth", "maxViewedMonth", "hoveredItem", "showAdjacent", "markerHandler", "value", "initialView"], outputs: ["dayClick", "monthChange", "hoveredItemChange"] }, { kind: "component", type: i1.TuiDataListComponent, selector: "tui-data-list", inputs: ["emptyContent", "size"] }, { kind: "component", type: i1.TuiOption, selector: "button[tuiOption]:not([new]), a[tuiOption]:not([new]), label[tuiOption]:not([new])", inputs: ["disabled", "value"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "pipe", type: TuiMapperPipe, name: "tuiMapper" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
183
+ ], usesOnChanges: true, ngImport: i0, template: "<tui-calendar\n automation-id=\"tui-calendar-range__calendar\"\n [class.t-calendar]=\"!mobile\"\n [disabledItemHandler]=\"calculatedDisabledItemHandler\"\n [markerHandler]=\"markerHandler\"\n [max]=\"max | tuiMapper: capsMapper : currentValue : maxLength : false\"\n [maxViewedMonth]=\"items.length || mobile ? null : (defaultViewedMonth | tuiMapper: monthOffset : -1)\"\n [min]=\"min | tuiMapper: capsMapper : currentValue : maxLength : true\"\n [month]=\"defaultViewedMonth\"\n [showAdjacent]=\"!!items.length || mobile\"\n [value]=\"currentValue\"\n [(hoveredItem)]=\"hoveredItem\"\n (dayClick)=\"onDayClick($event)\"\n (monthChange)=\"onMonthChange($event)\"\n/>\n<tui-calendar\n *ngIf=\"!items.length && !mobile; else presets\"\n [disabledItemHandler]=\"calculatedDisabledItemHandler\"\n [markerHandler]=\"markerHandler\"\n [max]=\"max | tuiMapper: capsMapper : currentValue : maxLength : false\"\n [min]=\"min | tuiMapper: capsMapper : currentValue : maxLength : true\"\n [minViewedMonth]=\"defaultViewedMonth | tuiMapper: monthOffset : 1\"\n [month]=\"defaultViewedMonth | tuiMapper: monthOffset : 1\"\n [showAdjacent]=\"false\"\n [value]=\"currentValue\"\n [(hoveredItem)]=\"hoveredItem\"\n (dayClick)=\"onDayClick($event)\"\n (monthChange)=\"onMonthChange($event.append({month: -1}))\"\n/>\n<ng-template #presets>\n <tui-data-list\n *ngIf=\"!mobile\"\n automation-id=\"tui-calendar-range__menu\"\n role=\"menu\"\n [style.flex]=\"1\"\n >\n <button\n *ngFor=\"let item of items | tuiMapper: mapper : min : max : minLength : (otherDateText$ | async)\"\n automation-id=\"tui-calendar-range__menu__item\"\n role=\"menuitemradio\"\n tuiOption\n type=\"button\"\n [attr.aria-checked]=\"isItemActive(item)\"\n (click)=\"onItemSelect(item)\"\n (pointerdown.prevent.zoneless)=\"(0)\"\n >\n {{ item }}\n <tui-icon\n *ngIf=\"isItemActive(item)\"\n automation-id=\"tui-calendar-range__checkmark\"\n [icon]=\"icons.check\"\n [style.font-size.rem]=\"1\"\n />\n </button>\n </tui-data-list>\n</ng-template>\n", styles: [":host:not(._mobile){display:flex;min-inline-size:30rem}.t-calendar{border-inline-end:1px solid var(--tui-border-normal)}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: TuiCalendar, selector: "tui-calendar", inputs: ["month", "disabledItemHandler", "min", "max", "minViewedMonth", "maxViewedMonth", "hoveredItem", "showAdjacent", "markerHandler", "value", "initialView"], outputs: ["dayClick", "monthChange", "hoveredItemChange"] }, { kind: "component", type: i1.TuiDataListComponent, selector: "tui-data-list", inputs: ["emptyContent", "size"] }, { kind: "component", type: i1.TuiOption, selector: "button[tuiOption]:not([new]), a[tuiOption]:not([new]), label[tuiOption]:not([new])", inputs: ["disabled", "value"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "pipe", type: TuiMapperPipe, name: "tuiMapper" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
182
184
  }
183
185
  __decorate([
184
186
  tuiPure
@@ -190,8 +192,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
190
192
  tuiAsAuxiliary(TuiCalendarRange),
191
193
  tuiCalendarSheetOptionsProvider({ rangeMode: true }),
192
194
  ], host: {
195
+ '[class._mobile]': 'mobile',
193
196
  '(document:keydown.capture)': 'onEsc($event)',
194
- }, template: "<tui-calendar\n automation-id=\"tui-calendar-range__calendar\"\n class=\"t-calendar\"\n [disabledItemHandler]=\"calculatedDisabledItemHandler\"\n [markerHandler]=\"markerHandler\"\n [max]=\"max | tuiMapper: capsMapper : currentValue : maxLength : false\"\n [maxViewedMonth]=\"items.length ? null : (defaultViewedMonth | tuiMapper: monthOffset : -1)\"\n [min]=\"min | tuiMapper: capsMapper : currentValue : maxLength : true\"\n [month]=\"defaultViewedMonth\"\n [showAdjacent]=\"!!items.length\"\n [value]=\"currentValue\"\n [(hoveredItem)]=\"hoveredItem\"\n (dayClick)=\"onDayClick($event)\"\n (monthChange)=\"onMonthChange($event)\"\n/>\n<tui-calendar\n *ngIf=\"!items.length; else presets\"\n [disabledItemHandler]=\"calculatedDisabledItemHandler\"\n [markerHandler]=\"markerHandler\"\n [max]=\"max | tuiMapper: capsMapper : currentValue : maxLength : false\"\n [min]=\"min | tuiMapper: capsMapper : currentValue : maxLength : true\"\n [minViewedMonth]=\"defaultViewedMonth | tuiMapper: monthOffset : 1\"\n [month]=\"defaultViewedMonth | tuiMapper: monthOffset : 1\"\n [showAdjacent]=\"false\"\n [value]=\"currentValue\"\n [(hoveredItem)]=\"hoveredItem\"\n (dayClick)=\"onDayClick($event)\"\n (monthChange)=\"onMonthChange($event.append({month: -1}))\"\n/>\n<ng-template #presets>\n <tui-data-list\n automation-id=\"tui-calendar-range__menu\"\n role=\"menu\"\n [style.flex]=\"1\"\n >\n <button\n *ngFor=\"let item of items | tuiMapper: mapper : min : max : minLength : (otherDateText$ | async)\"\n automation-id=\"tui-calendar-range__menu__item\"\n role=\"menuitemradio\"\n tuiOption\n type=\"button\"\n [attr.aria-checked]=\"isItemActive(item)\"\n (click)=\"onItemSelect(item)\"\n (pointerdown.prevent.zoneless)=\"(0)\"\n >\n {{ item }}\n <tui-icon\n *ngIf=\"isItemActive(item)\"\n automation-id=\"tui-calendar-range__checkmark\"\n [icon]=\"icons.check\"\n [style.font-size.rem]=\"1\"\n />\n </button>\n </tui-data-list>\n</ng-template>\n", styles: [":host{display:flex;min-inline-size:30rem}.t-calendar{border-inline-end:1px solid var(--tui-border-normal)}\n"] }]
197
+ }, template: "<tui-calendar\n automation-id=\"tui-calendar-range__calendar\"\n [class.t-calendar]=\"!mobile\"\n [disabledItemHandler]=\"calculatedDisabledItemHandler\"\n [markerHandler]=\"markerHandler\"\n [max]=\"max | tuiMapper: capsMapper : currentValue : maxLength : false\"\n [maxViewedMonth]=\"items.length || mobile ? null : (defaultViewedMonth | tuiMapper: monthOffset : -1)\"\n [min]=\"min | tuiMapper: capsMapper : currentValue : maxLength : true\"\n [month]=\"defaultViewedMonth\"\n [showAdjacent]=\"!!items.length || mobile\"\n [value]=\"currentValue\"\n [(hoveredItem)]=\"hoveredItem\"\n (dayClick)=\"onDayClick($event)\"\n (monthChange)=\"onMonthChange($event)\"\n/>\n<tui-calendar\n *ngIf=\"!items.length && !mobile; else presets\"\n [disabledItemHandler]=\"calculatedDisabledItemHandler\"\n [markerHandler]=\"markerHandler\"\n [max]=\"max | tuiMapper: capsMapper : currentValue : maxLength : false\"\n [min]=\"min | tuiMapper: capsMapper : currentValue : maxLength : true\"\n [minViewedMonth]=\"defaultViewedMonth | tuiMapper: monthOffset : 1\"\n [month]=\"defaultViewedMonth | tuiMapper: monthOffset : 1\"\n [showAdjacent]=\"false\"\n [value]=\"currentValue\"\n [(hoveredItem)]=\"hoveredItem\"\n (dayClick)=\"onDayClick($event)\"\n (monthChange)=\"onMonthChange($event.append({month: -1}))\"\n/>\n<ng-template #presets>\n <tui-data-list\n *ngIf=\"!mobile\"\n automation-id=\"tui-calendar-range__menu\"\n role=\"menu\"\n [style.flex]=\"1\"\n >\n <button\n *ngFor=\"let item of items | tuiMapper: mapper : min : max : minLength : (otherDateText$ | async)\"\n automation-id=\"tui-calendar-range__menu__item\"\n role=\"menuitemradio\"\n tuiOption\n type=\"button\"\n [attr.aria-checked]=\"isItemActive(item)\"\n (click)=\"onItemSelect(item)\"\n (pointerdown.prevent.zoneless)=\"(0)\"\n >\n {{ item }}\n <tui-icon\n *ngIf=\"isItemActive(item)\"\n automation-id=\"tui-calendar-range__checkmark\"\n [icon]=\"icons.check\"\n [style.font-size.rem]=\"1\"\n />\n </button>\n </tui-data-list>\n</ng-template>\n", styles: [":host:not(._mobile){display:flex;min-inline-size:30rem}.t-calendar{border-inline-end:1px solid var(--tui-border-normal)}\n"] }]
195
198
  }], ctorParameters: function () { return []; }, propDecorators: { disabledItemHandler: [{
196
199
  type: Input
197
200
  }], markerHandler: [{
@@ -218,4 +221,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
218
221
  }], defaultViewedMonth: [{
219
222
  type: Input
220
223
  }], calculateDisabledItemHandler: [] } });
221
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItcmFuZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvY2FsZW5kYXItcmFuZ2UvY2FsZW5kYXItcmFuZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvY2FsZW5kYXItcmFuZ2UvY2FsZW5kYXItcmFuZ2UudGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRCxPQUFPLEVBQ0gsYUFBYSxFQUNiLFlBQVksRUFDWixNQUFNLEVBQ04sV0FBVyxFQUNYLFFBQVEsR0FDWCxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsT0FBTyxFQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFFeEYsT0FBTyxFQUNILFdBQVcsRUFDWCwrQkFBK0IsR0FDbEMsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1QyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDaEUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdDQUFnQyxD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SztnQkFJQyxTQUFTO3NCQURmLEtBQUs7Z0JBSUMsSUFBSTtzQkFEVixLQUFLO2dCQUlVLFdBQVc7c0JBRDFCLE1BQU07Z0JBSVMsVUFBVTtzQkFEekIsTUFBTTtnQkFhSSxXQUFXO3NCQURyQixLQUFLO3VCQUFDLE9BQU87Z0JBTUgsa0JBQWtCO3NCQUQ1QixLQUFLO2dCQTBKRSw0QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jUGlwZSwgTmdGb3JPZiwgTmdJZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB0eXBlIHtPbkNoYW5nZXMsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtUVUlfRkFMU0VfSEFORExFUn0gZnJvbSAnQHRhaWdhLXVpL2Nkay9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUge1R1aURheUxpa2V9IGZyb20gJ0B0YWlnYS11aS9jZGsvZGF0ZS10aW1lJztcbmltcG9ydCB7XG4gICAgVFVJX0ZJUlNUX0RBWSxcbiAgICBUVUlfTEFTVF9EQVksXG4gICAgVHVpRGF5LFxuICAgIFR1aURheVJhbmdlLFxuICAgIFR1aU1vbnRoLFxufSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RhdGUtdGltZSc7XG5pbXBvcnQge3R1aVdhdGNofSBmcm9tICdAdGFpZ2EtdWkvY2RrL29ic2VydmFibGVzJztcbmltcG9ydCB7VHVpTWFwcGVyUGlwZX0gZnJvbSAnQHRhaWdhLXVpL2Nkay9waXBlcy9tYXBwZXInO1xuaW1wb3J0IHR5cGUge1R1aUJvb2xlYW5IYW5kbGVyLCBUdWlNYXBwZXJ9IGZyb20gJ0B0YWlnYS11aS9jZGsvdHlwZXMnO1xuaW1wb3J0IHt0dWlJc1N0cmluZywgdHVpTnVsbGFibGVTYW1lLCB0dWlQdXJlfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL21pc2NlbGxhbmVvdXMnO1xuaW1wb3J0IHR5cGUge1R1aU1hcmtlckhhbmRsZXJ9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvY2FsZW5kYXInO1xuaW1wb3J0IHtcbiAgICBUdWlDYWxlbmRhcixcbiAgICB0dWlDYWxlbmRhclNoZWV0T3B0aW9uc1Byb3ZpZGVyLFxufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2NhbGVuZGFyJztcbmltcG9ydCB7VHVpRGF0YUxpc3R9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvZGF0YS1saXN0JztcbmltcG9ydCB7VHVpSWNvbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7VFVJX0NPTU1PTl9JQ09OUywgdHVpQXNBdXhpbGlhcnl9IGZyb20gJ0B0YWlnYS11aS9jb3JlL3Rva2Vucyc7XG5pbXBvcnQge1RVSV9DQUxFTkRBUl9EQVRFX1NUUkVBTSwgVFVJX09USEVSX0RBVEVfVEVYVH0gZnJvbSAnQHRhaWdhLXVpL2tpdC90b2tlbnMnO1xuaW1wb3J0IHR5cGUge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge2NhbGN1bGF0ZURpc2FibGVkSXRlbUhhbmRsZXJ9IGZyb20gJy4vY2FsY3VsYXRlLWRpc2FibGVkLWl0ZW0taGFuZGxlcic7XG5pbXBvcnQge1RVSV9EQVlfQ0FQU19NQVBQRVJ9IGZyb20gJy4vZGF5LWNhcHMtbWFwcGVyJztcbmltcG9ydCB0eXBlIHtUdWlEYXlSYW5nZVBlcmlvZH0gZnJvbSAnLi9kYXktcmFuZ2UtcGVyaW9kJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3R1aS1jYWxlbmRhci1yYW5nZScsXG4gICAgaW1wb3J0czogW0FzeW5jUGlwZSwgTmdGb3JPZiwgTmdJZiwgVHVpQ2FsZW5kYXIsIFR1aURhdGFMaXN0LCBUdWlJY29uLCBUdWlNYXBwZXJQaXBlXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItcmFuZ2UudGVtcGxhdGUuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXItcmFuZ2Uuc3R5bGUubGVzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB0dWlBc0F1eGlsaWFyeShUdWlDYWxlbmRhclJhbmdlKSxcbiAgICAgICAgdHVpQ2FsZW5kYXJTaGVldE9wdGlvbnNQcm92aWRlcih7cmFuZ2VNb2RlOiB0cnVlfSksXG4gICAgXSxcbiAgICBob3N0OiB7XG4gICAgICAgICcoZG9jdW1lbnQ6a2V5ZG93bi5jYXB0dXJlKSc6ICdvbkVzYygkZXZlbnQpJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUdWlDYWxlbmRhclJhbmdlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBgaXRlbWBcbiAgICAgKi9cbiAgICBwcml2YXRlIHNlbGVjdGVkUGVyaW9kOiBUdWlEYXlSYW5nZVBlcmlvZCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAgIHByb3RlY3RlZCBjdXJyZW50VmFsdWU6IFR1aURheSB8IFR1aURheVJhbmdlIHwgbnVsbCA9IG51bGw7XG4gICAgcHJvdGVjdGVkIHByZXZpb3VzVmFsdWU6IFR1aURheSB8IFR1aURheVJhbmdlIHwgbnVsbCA9IG51bGw7XG4gICAgcHJvdGVjdGVkIGhvdmVyZWRJdGVtOiBUdWlEYXkgfCBudWxsID0gbnVsbDtcbiAgICBwcm90ZWN0ZWQgbW9udGg6IFR1aU1vbnRoID0gVHVpTW9udGguY3VycmVudExvY2FsKCk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3RoZXJEYXRlVGV4dCQgPSBpbmplY3QoVFVJX09USEVSX0RBVEVfVEVYVCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGljb25zID0gaW5qZWN0KFRVSV9DT01NT05fSUNPTlMpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjYXBzTWFwcGVyID0gVFVJX0RBWV9DQVBTX01BUFBFUjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpc2FibGVkSXRlbUhhbmRsZXI6IFR1aUJvb2xlYW5IYW5kbGVyPFR1aURheT4gPSBUVUlfRkFMU0VfSEFORExFUjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1hcmtlckhhbmRsZXI6IFR1aU1hcmtlckhhbmRsZXIgfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGl0ZW1zOiByZWFkb25seSBUdWlEYXlSYW5nZVBlcmlvZFtdID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtaW46IFR1aURheSB8IG51bGwgPSBUVUlfRklSU1RfREFZO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWF4OiBUdWlEYXkgfCBudWxsID0gVFVJX0xBU1RfREFZO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWluTGVuZ3RoOiBUdWlEYXlMaWtlIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtYXhMZW5ndGg6IFR1aURheUxpa2UgfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGl0ZW06IFR1aURheVJhbmdlUGVyaW9kIHwgbnVsbCA9IG51bGw7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFR1aURheVJhbmdlIHwgbnVsbD4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBpdGVtQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUdWlEYXlSYW5nZVBlcmlvZCB8IG51bGw+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgaW5qZWN0PE9ic2VydmFibGU8VHVpRGF5UmFuZ2UgfCBudWxsPj4oVFVJX0NBTEVOREFSX0RBVEVfU1RSRUFNLCB7b3B0aW9uYWw6IHRydWV9KVxuICAgICAgICAgICAgPy5waXBlKHR1aVdhdGNoKCksIHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdERlZmF1bHRWaWV3ZWRNb250aCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCd2YWx1ZScpXG4gICAgcHVibGljIHNldCB2YWx1ZVNldHRlcih2YWx1ZTogVHVpRGF5UmFuZ2UgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGRlZmF1bHRWaWV3ZWRNb250aChtb250aDogVHVpTW9udGgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5tb250aCA9IG1vbnRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogVHVpRGF5UmFuZ2UgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmluaXREZWZhdWx0Vmlld2VkTW9udGgoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRWaWV3ZWRNb250aCgpOiBUdWlNb250aCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vbnRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBgaXRlbWBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkQWN0aXZlUGVyaW9kKCk6IFR1aURheVJhbmdlUGVyaW9kIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUGVyaW9kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBgaXRlbWBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkQWN0aXZlUGVyaW9kKHBlcmlvZDogVHVpRGF5UmFuZ2VQZXJpb2QgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQZXJpb2QgPSBwZXJpb2Q7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmluaXREZWZhdWx0Vmlld2VkTW9udGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0RGVmYXVsdFZpZXdlZE1vbnRoKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBjYWxjdWxhdGVkRGlzYWJsZWRJdGVtSGFuZGxlcigpOiBUdWlCb29sZWFuSGFuZGxlcjxUdWlEYXk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlRGlzYWJsZWRJdGVtSGFuZGxlcihcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWRJdGVtSGFuZGxlcixcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgdGhpcy5taW5MZW5ndGgsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRXNjKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgIT09ICdFc2NhcGUnIHx8ICEodGhpcy5jdXJyZW50VmFsdWUgaW5zdGFuY2VvZiBUdWlEYXkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0aGlzLnByZXZpb3VzVmFsdWU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbnRoT2Zmc2V0OiBUdWlNYXBwZXI8W1R1aU1vbnRoLCBudW1iZXJdLCBUdWlNb250aD4gPSAoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBtb250aCxcbiAgICApID0+IHZhbHVlLmFwcGVuZCh7bW9udGh9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXBwZXI6IFR1aU1hcHBlcjxcbiAgICAgICAgW1xuICAgICAgICAgICAgcmVhZG9ubHkgVHVpRGF5UmFuZ2VQZXJpb2RbXSxcbiAgICAgICAgICAgIFR1aURheSB8IG51bGwsXG4gICAgICAgICAgICBUdWlEYXkgfCBudWxsLFxuICAgICAgICAgICAgVHVpRGF5TGlrZSB8IG51bGwsXG4gICAgICAgICAgICBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgICAgICBdLFxuICAgICAgICBSZWFkb25seUFycmF5PFR1aURheVJhbmdlUGVyaW9kIHwgc3RyaW5nPlxuICAgID4gPSAoaXRlbXMsIG1pbiwgbWF4LCBtaW5MZW5ndGgsIG90aGVyRGF0ZVRleHQpID0+IFtcbiAgICAgICAgLi4uaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgKG1pbkxlbmd0aCA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICBpdGVtLnJhbmdlLmZyb21cbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobWluTGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCh7ZGF5OiAtMX0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGF5U2FtZU9yQmVmb3JlKGl0ZW0ucmFuZ2UudG8pKSAmJlxuICAgICAgICAgICAgICAgIChtaW4gPT09IG51bGwgfHwgaXRlbS5yYW5nZS50by5kYXlTYW1lT3JBZnRlcihtaW4pKSAmJlxuICAgICAgICAgICAgICAgIChtYXggPT09IG51bGwgfHwgaXRlbS5yYW5nZS5mcm9tLmRheVNhbWVPckJlZm9yZShtYXgpKSxcbiAgICAgICAgKSxcbiAgICAgICAgb3RoZXJEYXRlVGV4dCB8fCAnJyxcbiAgICBdO1xuXG4gICAgcHJvdGVjdGVkIGlzSXRlbUFjdGl2ZShpdGVtOiBUdWlEYXlSYW5nZVBlcmlvZCB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB7YWN0aXZlUGVyaW9kfSA9IHRoaXM7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh0dWlJc1N0cmluZyhpdGVtKSAmJiBhY3RpdmVQZXJpb2QgPT09IG51bGwpIHx8XG4gICAgICAgICAgICBhY3RpdmVQZXJpb2QgPT09IGl0ZW0gfHxcbiAgICAgICAgICAgIGFjdGl2ZVBlcmlvZD8udG9TdHJpbmcoKSA9PT0gaXRlbS50b1N0cmluZygpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uSXRlbVNlbGVjdChpdGVtOiBUdWlEYXlSYW5nZVBlcmlvZCB8IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXR1aUlzU3RyaW5nKGl0ZW0pKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQWN0aXZlUGVyaW9kID0gaXRlbTtcbiAgICAgICAgICAgIHRoaXMuaXRlbUNoYW5nZS5lbWl0KGl0ZW0pO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShpdGVtLnJhbmdlLmRheUxpbWl0KHRoaXMubWluLCB0aGlzLm1heCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlUGVyaW9kICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQWN0aXZlUGVyaW9kID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuaXRlbUNoYW5nZS5lbWl0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdERlZmF1bHRWaWV3ZWRNb250aCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbk1vbnRoQ2hhbmdlKG1vbnRoOiBUdWlNb250aCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vbnRoID0gbW9udGg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRGF5Q2xpY2soZGF5OiBUdWlEYXkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gdGhpcy5jdXJyZW50VmFsdWU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBY3RpdmVQZXJpb2QgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIFR1aURheSkge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBUdWlEYXlSYW5nZS5zb3J0KHRoaXMuY3VycmVudFZhbHVlLCBkYXkpO1xuXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHJhbmdlO1xuICAgICAgICAgICAgdGhpcy5pdGVtQ2hhbmdlLmVtaXQodGhpcy5maW5kSXRlbUJ5RGF5UmFuZ2UocmFuZ2UpKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWUocmFuZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBkYXk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdXBkYXRlVmFsdWUodmFsdWU6IFR1aURheVJhbmdlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGFjdGl2ZVBlcmlvZCgpOiBUdWlEYXlSYW5nZVBlcmlvZCB8IG51bGwge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5pdGVtID8/XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQWN0aXZlUGVyaW9kID8/XG4gICAgICAgICAgICAodGhpcy5pdGVtcy5maW5kKChpdGVtKSA9PlxuICAgICAgICAgICAgICAgIHR1aU51bGxhYmxlU2FtZTxUdWlEYXlSYW5nZT4oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlIGluc3RhbmNlb2YgVHVpRGF5XG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBUdWlEYXlSYW5nZSh0aGlzLmN1cnJlbnRWYWx1ZSwgdGhpcy5jdXJyZW50VmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBpdGVtLnJhbmdlLFxuICAgICAgICAgICAgICAgICAgICAoYSwgYikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGEuZnJvbS5kYXlTYW1lKGIuZnJvbS5kYXlMaW1pdCh0aGlzLm1pbiwgdGhpcy5tYXgpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYS50by5kYXlTYW1lKGIudG8uZGF5TGltaXQodGhpcy5taW4sIHRoaXMubWF4KSksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgICBudWxsKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIEB0dWlQdXJlXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVEaXNhYmxlZEl0ZW1IYW5kbGVyKFxuICAgICAgICBkaXNhYmxlZEl0ZW1IYW5kbGVyOiBUdWlCb29sZWFuSGFuZGxlcjxUdWlEYXk+LFxuICAgICAgICB2YWx1ZTogVHVpRGF5IHwgVHVpRGF5UmFuZ2UgfCBudWxsLFxuICAgICAgICBtaW5MZW5ndGg6IFR1aURheUxpa2UgfCBudWxsLFxuICAgICk6IFR1aUJvb2xlYW5IYW5kbGVyPFR1aURheT4ge1xuICAgICAgICByZXR1cm4gY2FsY3VsYXRlRGlzYWJsZWRJdGVtSGFuZGxlcihkaXNhYmxlZEl0ZW1IYW5kbGVyLCB2YWx1ZSwgbWluTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXREZWZhdWx0Vmlld2VkTW9udGgoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIFR1aURheSkge1xuICAgICAgICAgICAgdGhpcy5tb250aCA9IHRoaXMuY3VycmVudFZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLm1vbnRoID0gdGhpcy5pdGVtcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHRoaXMuY3VycmVudFZhbHVlLnRvXG4gICAgICAgICAgICAgICAgOiB0aGlzLmN1cnJlbnRWYWx1ZS5mcm9tO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWF4ICYmIHRoaXMubW9udGgubW9udGhTYW1lT3JBZnRlcih0aGlzLm1heCkpIHtcbiAgICAgICAgICAgIHRoaXMubW9udGggPSB0aGlzLml0ZW1zLmxlbmd0aCA/IHRoaXMubWF4IDogdGhpcy5tYXguYXBwZW5kKHttb250aDogLTF9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1pbiAmJiB0aGlzLm1vbnRoLm1vbnRoU2FtZU9yQmVmb3JlKHRoaXMubWluKSkge1xuICAgICAgICAgICAgdGhpcy5tb250aCA9IHRoaXMubWluO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kSXRlbUJ5RGF5UmFuZ2UoZGF5UmFuZ2U6IFR1aURheVJhbmdlKTogVHVpRGF5UmFuZ2VQZXJpb2QgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gZGF5UmFuZ2UuZGF5U2FtZShpdGVtLnJhbmdlKSkgPz8gbnVsbDtcbiAgICB9XG59XG4iLCI8dHVpLWNhbGVuZGFyXG4gICAgYXV0b21hdGlvbi1pZD1cInR1aS1jYWxlbmRhci1yYW5nZV9fY2FsZW5kYXJcIlxuICAgIGNsYXNzPVwidC1jYWxlbmRhclwiXG4gICAgW2Rpc2FibGVkSXRlbUhhbmRsZXJdPVwiY2FsY3VsYXRlZERpc2FibGVkSXRlbUhhbmRsZXJcIlxuICAgIFttYXJrZXJIYW5kbGVyXT1cIm1hcmtlckhhbmRsZXJcIlxuICAgIFttYXhdPVwibWF4IHwgdHVpTWFwcGVyOiBjYXBzTWFwcGVyIDogY3VycmVudFZhbHVlIDogbWF4TGVuZ3RoIDogZmFsc2VcIlxuICAgIFttYXhWaWV3ZWRNb250aF09XCJpdGVtcy5sZW5ndGggPyBudWxsIDogKGRlZmF1bHRWaWV3ZWRNb250aCB8IHR1aU1hcHBlcjogbW9udGhPZmZzZXQgOiAtMSlcIlxuICAgIFttaW5dPVwibWluIHwgdHVpTWFwcGVyOiBjYXBzTWFwcGVyIDogY3VycmVudFZhbHVlIDogbWF4TGVuZ3RoIDogdHJ1ZVwiXG4gICAgW21vbnRoXT1cImRlZmF1bHRWaWV3ZWRNb250aFwiXG4gICAgW3Nob3dBZGphY2VudF09XCIhIWl0ZW1zLmxlbmd0aFwiXG4gICAgW3ZhbHVlXT1cImN1cnJlbnRWYWx1ZVwiXG4gICAgWyhob3ZlcmVkSXRlbSldPVwiaG92ZXJlZEl0ZW1cIlxuICAgIChkYXlDbGljayk9XCJvbkRheUNsaWNrKCRldmVudClcIlxuICAgIChtb250aENoYW5nZSk9XCJvbk1vbnRoQ2hhbmdlKCRldmVudClcIlxuLz5cbjx0dWktY2FsZW5kYXJcbiAgICAqbmdJZj1cIiFpdGVtcy5sZW5ndGg7IGVsc2UgcHJlc2V0c1wiXG4gICAgW2Rpc2FibGVkSXRlbUhhbmRsZXJdPVwiY2FsY3VsYXRlZERpc2FibGVkSXRlbUhhbmRsZXJcIlxuICAgIFttYXJrZXJIYW5kbGVyXT1cIm1hcmtlckhhbmRsZXJcIlxuICAgIFttYXhdPVwibWF4IHwgdHVpTWFwcGVyOiBjYXBzTWFwcGVyIDogY3VycmVudFZhbHVlIDogbWF4TGVuZ3RoIDogZmFsc2VcIlxuICAgIFttaW5dPVwibWluIHwgdHVpTWFwcGVyOiBjYXBzTWFwcGVyIDogY3VycmVudFZhbHVlIDogbWF4TGVuZ3RoIDogdHJ1ZVwiXG4gICAgW21pblZpZXdlZE1vbnRoXT1cImRlZmF1bHRWaWV3ZWRNb250aCB8IHR1aU1hcHBlcjogbW9udGhPZmZzZXQgOiAxXCJcbiAgICBbbW9udGhdPVwiZGVmYXVsdFZpZXdlZE1vbnRoIHwgdHVpTWFwcGVyOiBtb250aE9mZnNldCA6IDFcIlxuICAgIFtzaG93QWRqYWNlbnRdPVwiZmFsc2VcIlxuICAgIFt2YWx1ZV09XCJjdXJyZW50VmFsdWVcIlxuICAgIFsoaG92ZXJlZEl0ZW0pXT1cImhvdmVyZWRJdGVtXCJcbiAgICAoZGF5Q2xpY2spPVwib25EYXlDbGljaygkZXZlbnQpXCJcbiAgICAobW9udGhDaGFuZ2UpPVwib25Nb250aENoYW5nZSgkZXZlbnQuYXBwZW5kKHttb250aDogLTF9KSlcIlxuLz5cbjxuZy10ZW1wbGF0ZSAjcHJlc2V0cz5cbiAgICA8dHVpLWRhdGEtbGlzdFxuICAgICAgICBhdXRvbWF0aW9uLWlkPVwidHVpLWNhbGVuZGFyLXJhbmdlX19tZW51XCJcbiAgICAgICAgcm9sZT1cIm1lbnVcIlxuICAgICAgICBbc3R5bGUuZmxleF09XCIxXCJcbiAgICA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zIHwgdHVpTWFwcGVyOiBtYXBwZXIgOiBtaW4gOiBtYXggOiBtaW5MZW5ndGggOiAob3RoZXJEYXRlVGV4dCQgfCBhc3luYylcIlxuICAgICAgICAgICAgYXV0b21hdGlvbi1pZD1cInR1aS1jYWxlbmRhci1yYW5nZV9fbWVudV9faXRlbVwiXG4gICAgICAgICAgICByb2xlPVwibWVudWl0ZW1yYWRpb1wiXG4gICAgICAgICAgICB0dWlPcHRpb25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImlzSXRlbUFjdGl2ZShpdGVtKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25JdGVtU2VsZWN0KGl0ZW0pXCJcbiAgICAgICAgICAgIChwb2ludGVyZG93bi5wcmV2ZW50LnpvbmVsZXNzKT1cIigwKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7IGl0ZW0gfX1cbiAgICAgICAgICAgIDx0dWktaWNvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNJdGVtQWN0aXZlKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICBhdXRvbWF0aW9uLWlkPVwidHVpLWNhbGVuZGFyLXJhbmdlX19jaGVja21hcmtcIlxuICAgICAgICAgICAgICAgIFtpY29uXT1cImljb25zLmNoZWNrXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuZm9udC1zaXplLnJlbV09XCIxXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvdHVpLWRhdGEtbGlzdD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItcmFuZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvY2FsZW5kYXItcmFuZ2UvY2FsZW5kYXItcmFuZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvY2FsZW5kYXItcmFuZ2UvY2FsZW5kYXItcmFuZ2UudGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRCxPQUFPLEVBQ0gsYUFBYSxFQUNiLFlBQVksRUFDWixNQUFNLEVBQ04sV0FBVyxFQUNYLFFBQVEsR0FDWCxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBRXhGLE9BQU8sRUFDSCxXQUFXLEVBQ1gsK0JBQStCLEdBQ2xDLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHFDQUFxQyxD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SztnQkFJQyxhQUFhO3NCQURuQixLQUFLO2dCQUlDLEtBQUs7c0JBRFgsS0FBSztnQkFJQyxHQUFHO3NCQURULEtBQUs7Z0JBSUMsR0FBRztzQkFEVCxLQUFLO2dCQUlDLFNBQVM7c0JBRGYsS0FBSztnQkFJQyxTQUFTO3NCQURmLEtBQUs7Z0JBSUMsSUFBSTtzQkFEVixLQUFLO2dCQUlVLFdBQVc7c0JBRDFCLE1BQU07Z0JBSVMsVUFBVTtzQkFEekIsTUFBTTtnQkFhSSxXQUFXO3NCQURyQixLQUFLO3VCQUFDLE9BQU87Z0JBTUgsa0JBQWtCO3NCQUQ1QixLQUFLO2dCQTBKRSw0QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jUGlwZSwgTmdGb3JPZiwgTmdJZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB0eXBlIHtPbkNoYW5nZXMsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtUVUlfRkFMU0VfSEFORExFUn0gZnJvbSAnQHRhaWdhLXVpL2Nkay9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUge1R1aURheUxpa2V9IGZyb20gJ0B0YWlnYS11aS9jZGsvZGF0ZS10aW1lJztcbmltcG9ydCB7XG4gICAgVFVJX0ZJUlNUX0RBWSxcbiAgICBUVUlfTEFTVF9EQVksXG4gICAgVHVpRGF5LFxuICAgIFR1aURheVJhbmdlLFxuICAgIFR1aU1vbnRoLFxufSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RhdGUtdGltZSc7XG5pbXBvcnQge3R1aVdhdGNofSBmcm9tICdAdGFpZ2EtdWkvY2RrL29ic2VydmFibGVzJztcbmltcG9ydCB7VHVpTWFwcGVyUGlwZX0gZnJvbSAnQHRhaWdhLXVpL2Nkay9waXBlcy9tYXBwZXInO1xuaW1wb3J0IHtUVUlfSVNfTU9CSUxFfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3Rva2Vucyc7XG5pbXBvcnQgdHlwZSB7VHVpQm9vbGVhbkhhbmRsZXIsIFR1aU1hcHBlcn0gZnJvbSAnQHRhaWdhLXVpL2Nkay90eXBlcyc7XG5pbXBvcnQge3R1aUlzU3RyaW5nLCB0dWlOdWxsYWJsZVNhbWUsIHR1aVB1cmV9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWlzY2VsbGFuZW91cyc7XG5pbXBvcnQgdHlwZSB7VHVpTWFya2VySGFuZGxlcn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9jYWxlbmRhcic7XG5pbXBvcnQge1xuICAgIFR1aUNhbGVuZGFyLFxuICAgIHR1aUNhbGVuZGFyU2hlZXRPcHRpb25zUHJvdmlkZXIsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvY2FsZW5kYXInO1xuaW1wb3J0IHtUdWlEYXRhTGlzdH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9kYXRhLWxpc3QnO1xuaW1wb3J0IHtUdWlJY29ufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2ljb24nO1xuaW1wb3J0IHtUVUlfQ09NTU9OX0lDT05TLCB0dWlBc0F1eGlsaWFyeX0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvdG9rZW5zJztcbmltcG9ydCB7VFVJX0NBTEVOREFSX0RBVEVfU1RSRUFNLCBUVUlfT1RIRVJfREFURV9URVhUfSBmcm9tICdAdGFpZ2EtdWkva2l0L3Rva2Vucyc7XG5pbXBvcnQgdHlwZSB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7Y2FsY3VsYXRlRGlzYWJsZWRJdGVtSGFuZGxlcn0gZnJvbSAnLi9jYWxjdWxhdGUtZGlzYWJsZWQtaXRlbS1oYW5kbGVyJztcbmltcG9ydCB7VFVJX0RBWV9DQVBTX01BUFBFUn0gZnJvbSAnLi9kYXktY2Fwcy1tYXBwZXInO1xuaW1wb3J0IHR5cGUge1R1aURheVJhbmdlUGVyaW9kfSBmcm9tICcuL2RheS1yYW5nZS1wZXJpb2QnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAndHVpLWNhbGVuZGFyLXJhbmdlJyxcbiAgICBpbXBvcnRzOiBbQXN5bmNQaXBlLCBOZ0Zvck9mLCBOZ0lmLCBUdWlDYWxlbmRhciwgVHVpRGF0YUxpc3QsIFR1aUljb24sIFR1aU1hcHBlclBpcGVdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci1yYW5nZS50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1yYW5nZS5zdHlsZS5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHR1aUFzQXV4aWxpYXJ5KFR1aUNhbGVuZGFyUmFuZ2UpLFxuICAgICAgICB0dWlDYWxlbmRhclNoZWV0T3B0aW9uc1Byb3ZpZGVyKHtyYW5nZU1vZGU6IHRydWV9KSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1tjbGFzcy5fbW9iaWxlXSc6ICdtb2JpbGUnLFxuICAgICAgICAnKGRvY3VtZW50OmtleWRvd24uY2FwdHVyZSknOiAnb25Fc2MoJGV2ZW50KScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpQ2FsZW5kYXJSYW5nZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgYGl0ZW1gXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZWxlY3RlZFBlcmlvZDogVHVpRGF5UmFuZ2VQZXJpb2QgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgICBwcm90ZWN0ZWQgY3VycmVudFZhbHVlOiBUdWlEYXkgfCBUdWlEYXlSYW5nZSB8IG51bGwgPSBudWxsO1xuICAgIHByb3RlY3RlZCBwcmV2aW91c1ZhbHVlOiBUdWlEYXkgfCBUdWlEYXlSYW5nZSB8IG51bGwgPSBudWxsO1xuICAgIHByb3RlY3RlZCBob3ZlcmVkSXRlbTogVHVpRGF5IHwgbnVsbCA9IG51bGw7XG4gICAgcHJvdGVjdGVkIG1vbnRoOiBUdWlNb250aCA9IFR1aU1vbnRoLmN1cnJlbnRMb2NhbCgpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG90aGVyRGF0ZVRleHQkID0gaW5qZWN0KFRVSV9PVEhFUl9EQVRFX1RFWFQpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpY29ucyA9IGluamVjdChUVUlfQ09NTU9OX0lDT05TKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2Fwc01hcHBlciA9IFRVSV9EQVlfQ0FQU19NQVBQRVI7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vYmlsZSA9IGluamVjdChUVUlfSVNfTU9CSUxFKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpc2FibGVkSXRlbUhhbmRsZXI6IFR1aUJvb2xlYW5IYW5kbGVyPFR1aURheT4gPSBUVUlfRkFMU0VfSEFORExFUjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1hcmtlckhhbmRsZXI6IFR1aU1hcmtlckhhbmRsZXIgfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGl0ZW1zOiByZWFkb25seSBUdWlEYXlSYW5nZVBlcmlvZFtdID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtaW46IFR1aURheSB8IG51bGwgPSBUVUlfRklSU1RfREFZO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWF4OiBUdWlEYXkgfCBudWxsID0gVFVJX0xBU1RfREFZO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWluTGVuZ3RoOiBUdWlEYXlMaWtlIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtYXhMZW5ndGg6IFR1aURheUxpa2UgfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGl0ZW06IFR1aURheVJhbmdlUGVyaW9kIHwgbnVsbCA9IG51bGw7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFR1aURheVJhbmdlIHwgbnVsbD4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBpdGVtQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUdWlEYXlSYW5nZVBlcmlvZCB8IG51bGw+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgaW5qZWN0PE9ic2VydmFibGU8VHVpRGF5UmFuZ2UgfCBudWxsPj4oVFVJX0NBTEVOREFSX0RBVEVfU1RSRUFNLCB7b3B0aW9uYWw6IHRydWV9KVxuICAgICAgICAgICAgPy5waXBlKHR1aVdhdGNoKCksIHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdERlZmF1bHRWaWV3ZWRNb250aCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCd2YWx1ZScpXG4gICAgcHVibGljIHNldCB2YWx1ZVNldHRlcih2YWx1ZTogVHVpRGF5UmFuZ2UgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGRlZmF1bHRWaWV3ZWRNb250aChtb250aDogVHVpTW9udGgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5tb250aCA9IG1vbnRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogVHVpRGF5UmFuZ2UgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmluaXREZWZhdWx0Vmlld2VkTW9udGgoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRWaWV3ZWRNb250aCgpOiBUdWlNb250aCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vbnRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBgaXRlbWBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkQWN0aXZlUGVyaW9kKCk6IFR1aURheVJhbmdlUGVyaW9kIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUGVyaW9kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBgaXRlbWBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkQWN0aXZlUGVyaW9kKHBlcmlvZDogVHVpRGF5UmFuZ2VQZXJpb2QgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQZXJpb2QgPSBwZXJpb2Q7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmluaXREZWZhdWx0Vmlld2VkTW9udGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0RGVmYXVsdFZpZXdlZE1vbnRoKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBjYWxjdWxhdGVkRGlzYWJsZWRJdGVtSGFuZGxlcigpOiBUdWlCb29sZWFuSGFuZGxlcjxUdWlEYXk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlRGlzYWJsZWRJdGVtSGFuZGxlcihcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWRJdGVtSGFuZGxlcixcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgdGhpcy5taW5MZW5ndGgsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRXNjKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgIT09ICdFc2NhcGUnIHx8ICEodGhpcy5jdXJyZW50VmFsdWUgaW5zdGFuY2VvZiBUdWlEYXkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0aGlzLnByZXZpb3VzVmFsdWU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbnRoT2Zmc2V0OiBUdWlNYXBwZXI8W1R1aU1vbnRoLCBudW1iZXJdLCBUdWlNb250aD4gPSAoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBtb250aCxcbiAgICApID0+IHZhbHVlLmFwcGVuZCh7bW9udGh9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXBwZXI6IFR1aU1hcHBlcjxcbiAgICAgICAgW1xuICAgICAgICAgICAgcmVhZG9ubHkgVHVpRGF5UmFuZ2VQZXJpb2RbXSxcbiAgICAgICAgICAgIFR1aURheSB8IG51bGwsXG4gICAgICAgICAgICBUdWlEYXkgfCBudWxsLFxuICAgICAgICAgICAgVHVpRGF5TGlrZSB8IG51bGwsXG4gICAgICAgICAgICBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgICAgICBdLFxuICAgICAgICBSZWFkb25seUFycmF5PFR1aURheVJhbmdlUGVyaW9kIHwgc3RyaW5nPlxuICAgID4gPSAoaXRlbXMsIG1pbiwgbWF4LCBtaW5MZW5ndGgsIG90aGVyRGF0ZVRleHQpID0+IFtcbiAgICAgICAgLi4uaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgKG1pbkxlbmd0aCA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICBpdGVtLnJhbmdlLmZyb21cbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobWluTGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCh7ZGF5OiAtMX0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGF5U2FtZU9yQmVmb3JlKGl0ZW0ucmFuZ2UudG8pKSAmJlxuICAgICAgICAgICAgICAgIChtaW4gPT09IG51bGwgfHwgaXRlbS5yYW5nZS50by5kYXlTYW1lT3JBZnRlcihtaW4pKSAmJlxuICAgICAgICAgICAgICAgIChtYXggPT09IG51bGwgfHwgaXRlbS5yYW5nZS5mcm9tLmRheVNhbWVPckJlZm9yZShtYXgpKSxcbiAgICAgICAgKSxcbiAgICAgICAgb3RoZXJEYXRlVGV4dCB8fCAnJyxcbiAgICBdO1xuXG4gICAgcHJvdGVjdGVkIGlzSXRlbUFjdGl2ZShpdGVtOiBUdWlEYXlSYW5nZVBlcmlvZCB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB7YWN0aXZlUGVyaW9kfSA9IHRoaXM7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh0dWlJc1N0cmluZyhpdGVtKSAmJiBhY3RpdmVQZXJpb2QgPT09IG51bGwpIHx8XG4gICAgICAgICAgICBhY3RpdmVQZXJpb2QgPT09IGl0ZW0gfHxcbiAgICAgICAgICAgIGFjdGl2ZVBlcmlvZD8udG9TdHJpbmcoKSA9PT0gaXRlbS50b1N0cmluZygpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uSXRlbVNlbGVjdChpdGVtOiBUdWlEYXlSYW5nZVBlcmlvZCB8IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXR1aUlzU3RyaW5nKGl0ZW0pKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQWN0aXZlUGVyaW9kID0gaXRlbTtcbiAgICAgICAgICAgIHRoaXMuaXRlbUNoYW5nZS5lbWl0KGl0ZW0pO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShpdGVtLnJhbmdlLmRheUxpbWl0KHRoaXMubWluLCB0aGlzLm1heCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlUGVyaW9kICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQWN0aXZlUGVyaW9kID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuaXRlbUNoYW5nZS5lbWl0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdERlZmF1bHRWaWV3ZWRNb250aCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbk1vbnRoQ2hhbmdlKG1vbnRoOiBUdWlNb250aCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vbnRoID0gbW9udGg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRGF5Q2xpY2soZGF5OiBUdWlEYXkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gdGhpcy5jdXJyZW50VmFsdWU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBY3RpdmVQZXJpb2QgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIFR1aURheSkge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBUdWlEYXlSYW5nZS5zb3J0KHRoaXMuY3VycmVudFZhbHVlLCBkYXkpO1xuXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHJhbmdlO1xuICAgICAgICAgICAgdGhpcy5pdGVtQ2hhbmdlLmVtaXQodGhpcy5maW5kSXRlbUJ5RGF5UmFuZ2UocmFuZ2UpKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWUocmFuZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBkYXk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdXBkYXRlVmFsdWUodmFsdWU6IFR1aURheVJhbmdlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGFjdGl2ZVBlcmlvZCgpOiBUdWlEYXlSYW5nZVBlcmlvZCB8IG51bGwge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5pdGVtID8/XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQWN0aXZlUGVyaW9kID8/XG4gICAgICAgICAgICAodGhpcy5pdGVtcy5maW5kKChpdGVtKSA9PlxuICAgICAgICAgICAgICAgIHR1aU51bGxhYmxlU2FtZTxUdWlEYXlSYW5nZT4oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlIGluc3RhbmNlb2YgVHVpRGF5XG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBUdWlEYXlSYW5nZSh0aGlzLmN1cnJlbnRWYWx1ZSwgdGhpcy5jdXJyZW50VmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBpdGVtLnJhbmdlLFxuICAgICAgICAgICAgICAgICAgICAoYSwgYikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGEuZnJvbS5kYXlTYW1lKGIuZnJvbS5kYXlMaW1pdCh0aGlzLm1pbiwgdGhpcy5tYXgpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYS50by5kYXlTYW1lKGIudG8uZGF5TGltaXQodGhpcy5taW4sIHRoaXMubWF4KSksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgICBudWxsKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIEB0dWlQdXJlXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVEaXNhYmxlZEl0ZW1IYW5kbGVyKFxuICAgICAgICBkaXNhYmxlZEl0ZW1IYW5kbGVyOiBUdWlCb29sZWFuSGFuZGxlcjxUdWlEYXk+LFxuICAgICAgICB2YWx1ZTogVHVpRGF5IHwgVHVpRGF5UmFuZ2UgfCBudWxsLFxuICAgICAgICBtaW5MZW5ndGg6IFR1aURheUxpa2UgfCBudWxsLFxuICAgICk6IFR1aUJvb2xlYW5IYW5kbGVyPFR1aURheT4ge1xuICAgICAgICByZXR1cm4gY2FsY3VsYXRlRGlzYWJsZWRJdGVtSGFuZGxlcihkaXNhYmxlZEl0ZW1IYW5kbGVyLCB2YWx1ZSwgbWluTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXREZWZhdWx0Vmlld2VkTW9udGgoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIFR1aURheSkge1xuICAgICAgICAgICAgdGhpcy5tb250aCA9IHRoaXMuY3VycmVudFZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLm1vbnRoID0gdGhpcy5pdGVtcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHRoaXMuY3VycmVudFZhbHVlLnRvXG4gICAgICAgICAgICAgICAgOiB0aGlzLmN1cnJlbnRWYWx1ZS5mcm9tO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWF4ICYmIHRoaXMubW9udGgubW9udGhTYW1lT3JBZnRlcih0aGlzLm1heCkpIHtcbiAgICAgICAgICAgIHRoaXMubW9udGggPSB0aGlzLml0ZW1zLmxlbmd0aCA/IHRoaXMubWF4IDogdGhpcy5tYXguYXBwZW5kKHttb250aDogLTF9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1pbiAmJiB0aGlzLm1vbnRoLm1vbnRoU2FtZU9yQmVmb3JlKHRoaXMubWluKSkge1xuICAgICAgICAgICAgdGhpcy5tb250aCA9IHRoaXMubWluO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kSXRlbUJ5RGF5UmFuZ2UoZGF5UmFuZ2U6IFR1aURheVJhbmdlKTogVHVpRGF5UmFuZ2VQZXJpb2QgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gZGF5UmFuZ2UuZGF5U2FtZShpdGVtLnJhbmdlKSkgPz8gbnVsbDtcbiAgICB9XG59XG4iLCI8dHVpLWNhbGVuZGFyXG4gICAgYXV0b21hdGlvbi1pZD1cInR1aS1jYWxlbmRhci1yYW5nZV9fY2FsZW5kYXJcIlxuICAgIFtjbGFzcy50LWNhbGVuZGFyXT1cIiFtb2JpbGVcIlxuICAgIFtkaXNhYmxlZEl0ZW1IYW5kbGVyXT1cImNhbGN1bGF0ZWREaXNhYmxlZEl0ZW1IYW5kbGVyXCJcbiAgICBbbWFya2VySGFuZGxlcl09XCJtYXJrZXJIYW5kbGVyXCJcbiAgICBbbWF4XT1cIm1heCB8IHR1aU1hcHBlcjogY2Fwc01hcHBlciA6IGN1cnJlbnRWYWx1ZSA6IG1heExlbmd0aCA6IGZhbHNlXCJcbiAgICBbbWF4Vmlld2VkTW9udGhdPVwiaXRlbXMubGVuZ3RoIHx8IG1vYmlsZSA/IG51bGwgOiAoZGVmYXVsdFZpZXdlZE1vbnRoIHwgdHVpTWFwcGVyOiBtb250aE9mZnNldCA6IC0xKVwiXG4gICAgW21pbl09XCJtaW4gfCB0dWlNYXBwZXI6IGNhcHNNYXBwZXIgOiBjdXJyZW50VmFsdWUgOiBtYXhMZW5ndGggOiB0cnVlXCJcbiAgICBbbW9udGhdPVwiZGVmYXVsdFZpZXdlZE1vbnRoXCJcbiAgICBbc2hvd0FkamFjZW50XT1cIiEhaXRlbXMubGVuZ3RoIHx8IG1vYmlsZVwiXG4gICAgW3ZhbHVlXT1cImN1cnJlbnRWYWx1ZVwiXG4gICAgWyhob3ZlcmVkSXRlbSldPVwiaG92ZXJlZEl0ZW1cIlxuICAgIChkYXlDbGljayk9XCJvbkRheUNsaWNrKCRldmVudClcIlxuICAgIChtb250aENoYW5nZSk9XCJvbk1vbnRoQ2hhbmdlKCRldmVudClcIlxuLz5cbjx0dWktY2FsZW5kYXJcbiAgICAqbmdJZj1cIiFpdGVtcy5sZW5ndGggJiYgIW1vYmlsZTsgZWxzZSBwcmVzZXRzXCJcbiAgICBbZGlzYWJsZWRJdGVtSGFuZGxlcl09XCJjYWxjdWxhdGVkRGlzYWJsZWRJdGVtSGFuZGxlclwiXG4gICAgW21hcmtlckhhbmRsZXJdPVwibWFya2VySGFuZGxlclwiXG4gICAgW21heF09XCJtYXggfCB0dWlNYXBwZXI6IGNhcHNNYXBwZXIgOiBjdXJyZW50VmFsdWUgOiBtYXhMZW5ndGggOiBmYWxzZVwiXG4gICAgW21pbl09XCJtaW4gfCB0dWlNYXBwZXI6IGNhcHNNYXBwZXIgOiBjdXJyZW50VmFsdWUgOiBtYXhMZW5ndGggOiB0cnVlXCJcbiAgICBbbWluVmlld2VkTW9udGhdPVwiZGVmYXVsdFZpZXdlZE1vbnRoIHwgdHVpTWFwcGVyOiBtb250aE9mZnNldCA6IDFcIlxuICAgIFttb250aF09XCJkZWZhdWx0Vmlld2VkTW9udGggfCB0dWlNYXBwZXI6IG1vbnRoT2Zmc2V0IDogMVwiXG4gICAgW3Nob3dBZGphY2VudF09XCJmYWxzZVwiXG4gICAgW3ZhbHVlXT1cImN1cnJlbnRWYWx1ZVwiXG4gICAgWyhob3ZlcmVkSXRlbSldPVwiaG92ZXJlZEl0ZW1cIlxuICAgIChkYXlDbGljayk9XCJvbkRheUNsaWNrKCRldmVudClcIlxuICAgIChtb250aENoYW5nZSk9XCJvbk1vbnRoQ2hhbmdlKCRldmVudC5hcHBlbmQoe21vbnRoOiAtMX0pKVwiXG4vPlxuPG5nLXRlbXBsYXRlICNwcmVzZXRzPlxuICAgIDx0dWktZGF0YS1saXN0XG4gICAgICAgICpuZ0lmPVwiIW1vYmlsZVwiXG4gICAgICAgIGF1dG9tYXRpb24taWQ9XCJ0dWktY2FsZW5kYXItcmFuZ2VfX21lbnVcIlxuICAgICAgICByb2xlPVwibWVudVwiXG4gICAgICAgIFtzdHlsZS5mbGV4XT1cIjFcIlxuICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXMgfCB0dWlNYXBwZXI6IG1hcHBlciA6IG1pbiA6IG1heCA6IG1pbkxlbmd0aCA6IChvdGhlckRhdGVUZXh0JCB8IGFzeW5jKVwiXG4gICAgICAgICAgICBhdXRvbWF0aW9uLWlkPVwidHVpLWNhbGVuZGFyLXJhbmdlX19tZW51X19pdGVtXCJcbiAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbXJhZGlvXCJcbiAgICAgICAgICAgIHR1aU9wdGlvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiaXNJdGVtQWN0aXZlKGl0ZW0pXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkl0ZW1TZWxlY3QoaXRlbSlcIlxuICAgICAgICAgICAgKHBvaW50ZXJkb3duLnByZXZlbnQuem9uZWxlc3MpPVwiKDApXCJcbiAgICAgICAgPlxuICAgICAgICAgICAge3sgaXRlbSB9fVxuICAgICAgICAgICAgPHR1aS1pY29uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc0l0ZW1BY3RpdmUoaXRlbSlcIlxuICAgICAgICAgICAgICAgIGF1dG9tYXRpb24taWQ9XCJ0dWktY2FsZW5kYXItcmFuZ2VfX2NoZWNrbWFya1wiXG4gICAgICAgICAgICAgICAgW2ljb25dPVwiaWNvbnMuY2hlY2tcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5mb250LXNpemUucmVtXT1cIjFcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC90dWktZGF0YS1saXN0PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -1,8 +1,7 @@
1
- import { Directive, effect, inject, Input, untracked } from '@angular/core';
1
+ import { computed, Directive, effect, inject, Input, isSignal, signal, untracked, } from '@angular/core';
2
2
  import { tuiAsControl, TuiControl } from '@taiga-ui/cdk/classes';
3
3
  import { TUI_ALLOW_SIGNAL_WRITES, TUI_STRICT_MATCHER } from '@taiga-ui/cdk/constants';
4
4
  import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom';
5
- import { tuiIsString } from '@taiga-ui/cdk/utils/miscellaneous';
6
5
  import { tuiAsOptionContent } from '@taiga-ui/core/components/data-list';
7
6
  import { tuiAsTextfieldAccessor, tuiInjectAuxiliary, TuiTextfieldComponent, TuiTextfieldDirective, TuiWithTextfield, } from '@taiga-ui/core/components/textfield';
8
7
  import { TuiDropdownDirective, tuiDropdownEnabled, tuiDropdownOpen, } from '@taiga-ui/core/directives/dropdown';
@@ -18,46 +17,71 @@ class TuiComboBox extends TuiControl {
18
17
  this.host = inject(TuiTextfieldComponent);
19
18
  this.textfield = inject(TuiTextfieldDirective);
20
19
  this.open = tuiDropdownOpen();
20
+ this.dropdownEnabled = tuiDropdownEnabled(this.interactive);
21
21
  this.dropdown = inject(TuiDropdownDirective);
22
22
  this.itemsHandlers = inject(TUI_ITEMS_HANDLERS);
23
- this.datalist = tuiInjectAuxiliary((x) => 'getOptions' in x);
24
- this.dropdownEnabled = tuiDropdownEnabled(this.interactive);
25
- this.valueEffect = effect(() => {
26
- const value = this.value() ?? '';
27
- const stringified = tuiIsString(value)
28
- ? value
29
- : this.itemsHandlers.stringify()(value);
30
- const match = this.match(stringified);
31
- this.textfield.value.update((x) => stringified || x);
32
- if (match) {
33
- setTimeout((end = this.el.value.length) => this.el.setSelectionRange(end, end));
23
+ this.matcher = signal(TUI_STRICT_MATCHER);
24
+ this.strict = signal(true);
25
+ this.datalist = tuiInjectAuxiliary((x) => x !== this && 'options' in x && isSignal(x.options));
26
+ this.options = computed(() => this.datalist()
27
+ ?.options?.() // TODO(v5): remove optional call `?.()`
28
+ .filter((x) => !this.itemsHandlers.disabledItemHandler()(x)) ?? []);
29
+ this.nonStrictValueEffect = effect(() => {
30
+ if (!this.options().length && !this.strict()) {
31
+ this.onChange(this.textfield.value() || null);
32
+ }
33
+ }, TUI_ALLOW_SIGNAL_WRITES);
34
+ this.matchingEffect = effect(() => {
35
+ const options = this.options();
36
+ const matcher = this.matcher();
37
+ if (!options.length || !matcher) {
38
+ return;
39
+ }
40
+ const textfieldValue = this.textfield.value();
41
+ const selectedOption = options.find((x) => matcher(x, textfieldValue, this.itemsHandlers.stringify())) ?? null;
42
+ const stringified = this.stringify(selectedOption);
43
+ const fallback = this.strict() || !textfieldValue ? null : textfieldValue;
44
+ this.onChange(selectedOption ?? fallback);
45
+ if (stringified && stringified !== textfieldValue) {
46
+ this.textfield.value.set(stringified);
34
47
  }
35
48
  }, TUI_ALLOW_SIGNAL_WRITES);
36
49
  this.blurEffect = effect(() => {
37
- const value = untracked(() => this.value());
38
- if (!this.host.focused() && this.strict && !value) {
50
+ const incomplete = untracked(() => this.strict() && !this.value());
51
+ if (!this.host.focused() && incomplete) {
39
52
  this.textfield.value.set('');
40
53
  }
41
54
  }, TUI_ALLOW_SIGNAL_WRITES);
42
- this.strict = true;
43
- this.matcher = TUI_STRICT_MATCHER;
55
+ }
56
+ // TODO(v5): use signal input
57
+ set strictSetter(x) {
58
+ this.strict.set(x);
59
+ }
60
+ // TODO(v5): use signal input
61
+ set matcherSetter(x) {
62
+ this.matcher.set(x);
44
63
  }
45
64
  setValue(value) {
65
+ const stringified = this.stringify(value);
66
+ if (stringified !== this.textfield.value()) {
67
+ this.textfield.value.set(stringified);
68
+ setTimeout((end = stringified.length) => this.el.setSelectionRange(end, end));
69
+ }
46
70
  this.onChange(value);
47
71
  if (!value) {
48
72
  this.toggleDropdown(true);
49
- this.textfield.value.set('');
50
73
  }
51
74
  }
75
+ writeValue(value) {
76
+ super.writeValue(value);
77
+ this.textfield.value.set(this.stringify(value));
78
+ }
52
79
  toggleDropdown(open = !this.open()) {
53
80
  if (this.dropdownEnabled() && this.dropdown.content) {
54
81
  this.open.set(open);
55
82
  }
56
83
  }
57
- onInput(value) {
58
- const match = this.match(value);
59
- const fallback = this.strict || !value ? null : value;
60
- this.onChange(match ?? fallback);
84
+ onInput() {
61
85
  setTimeout(() => this.toggleDropdown(true));
62
86
  }
63
87
  keydownEnter(event) {
@@ -65,19 +89,17 @@ class TuiComboBox extends TuiControl {
65
89
  return;
66
90
  }
67
91
  event.preventDefault();
68
- if (this.options.length === 1) {
69
- this.onChange(this.options[0]);
92
+ const options = this.options();
93
+ if (options.length === 1 && options[0]) {
94
+ this.setValue(options[0]);
70
95
  this.toggleDropdown(false);
71
96
  }
72
97
  }
73
- get options() {
74
- return this.datalist()?.getOptions() || [];
75
- }
76
- match(value) {
77
- return (this.options.find((item) => this.matcher?.(item, value, this.itemsHandlers.stringify())) ?? null);
98
+ stringify(value) {
99
+ return value ? this.itemsHandlers.stringify()(value) : '';
78
100
  }
79
101
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiComboBox, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
80
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiComboBox, isStandalone: true, selector: "input[tuiComboBox]", inputs: { strict: "strict", matcher: "matcher" }, host: { listeners: { "click": "toggleDropdown()", "input": "onInput($event.target.value)", "keydown.enter": "keydownEnter($event)" }, properties: { "disabled": "disabled()" } }, providers: [
102
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiComboBox, isStandalone: true, selector: "input[tuiComboBox]", inputs: { strictSetter: ["strict", "strictSetter"], matcherSetter: ["matcher", "matcherSetter"] }, host: { listeners: { "click": "toggleDropdown()", "input": "onInput()", "keydown.enter": "keydownEnter($event)" }, properties: { "disabled": "disabled()" } }, providers: [
81
103
  tuiAsOptionContent(TuiSelectOption),
82
104
  tuiAsTextfieldAccessor(TuiComboBox),
83
105
  tuiAsControl(TuiComboBox),
@@ -100,13 +122,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
100
122
  host: {
101
123
  '[disabled]': 'disabled()',
102
124
  '(click)': 'toggleDropdown()',
103
- '(input)': 'onInput($event.target.value)',
125
+ '(input)': 'onInput()',
104
126
  '(keydown.enter)': 'keydownEnter($event)',
105
127
  },
106
128
  }]
107
- }], propDecorators: { strict: [{
108
- type: Input
109
- }], matcher: [{
110
- type: Input
129
+ }], propDecorators: { strictSetter: [{
130
+ type: Input,
131
+ args: ['strict']
132
+ }], matcherSetter: [{
133
+ type: Input,
134
+ args: ['matcher']
111
135
  }] } });
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm8tYm94LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdC9jb21wb25lbnRzL2NvbWJvLWJveC9jb21iby1ib3guZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUFDLHVCQUF1QixFQUFFLGtCQUFrQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFcEYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBRTlELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBRXZFLE9BQU8sRUFDSCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsZ0JBQWdCLEdBQ25CLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUNILG9CQUFvQixFQUNwQixrQkFBa0IsRUFDbEIsZUFBZSxHQUNsQixNQUFNLG9DQUFvQyxDQUFDO0FBRTVDLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQzVFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0saUNBQWlDLENBQUM7OztBQUVoRSxNQWlCYSxXQUNULFNBQVEsVUFBNkI7SUFsQnpDOztRQXFCcUIsT0FBRSxHQUFHLGdCQUFnQixFQUFvQixDQUFDO1FBQzFDLFNBQUksR0FBNkIsTUFBTSxDQUFDLHFCQUFxQixD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QVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixTQUFTLEVBQUU7d0JBQ1Asa0JBQWtCLENBQUMsZUFBZSxDQUFDO3dCQUNuQyxzQkFBc0IsYUFBYTt3QkFDbkMsWUFBWSxhQUFhO3dCQUN6QixjQUFjLGFBQWE7cUJBQzlCO29CQUNELGNBQWMsRUFBRSxDQUFDLGdCQUFnQixDQUFDO29CQUNsQyxJQUFJLEVBQUU7d0JBQ0YsWUFBWSxFQUFFLFlBQVk7d0JBQzFCLFNBQVMsRUFBRSxrQkFBa0I7d0JBQzdCLFNBQVMsRUFBRSw4QkFBOEI7d0JBQ3pDLGlCQUFpQixFQUFFLHNCQUFzQjtxQkFDNUM7aUJBQ0o7OEJBMkNVLE1BQU07c0JBRFosS0FBSztnQkFJQyxPQUFPO3NCQURiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgZWZmZWN0LCBpbmplY3QsIElucHV0LCB1bnRyYWNrZWR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHt0dWlBc0NvbnRyb2wsIFR1aUNvbnRyb2x9IGZyb20gJ0B0YWlnYS11aS9jZGsvY2xhc3Nlcyc7XG5pbXBvcnQge1RVSV9BTExPV19TSUdOQUxfV1JJVEVTLCBUVUlfU1RSSUNUX01BVENIRVJ9IGZyb20gJ0B0YWlnYS11aS9jZGsvY29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHtUdWlTdHJpbmdNYXRjaGVyfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3R5cGVzJztcbmltcG9ydCB7dHVpSW5qZWN0RWxlbWVudH0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9kb20nO1xuaW1wb3J0IHt0dWlJc1N0cmluZ30gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9taXNjZWxsYW5lb3VzJztcbmltcG9ydCB0eXBlIHtUdWlEYXRhTGlzdEFjY2Vzc29yfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2RhdGEtbGlzdCc7XG5pbXBvcnQge3R1aUFzT3B0aW9uQ29udGVudH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9kYXRhLWxpc3QnO1xuaW1wb3J0IHR5cGUge1R1aVRleHRmaWVsZEFjY2Vzc29yfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL3RleHRmaWVsZCc7XG5pbXBvcnQge1xuICAgIHR1aUFzVGV4dGZpZWxkQWNjZXNzb3IsXG4gICAgdHVpSW5qZWN0QXV4aWxpYXJ5LFxuICAgIFR1aVRleHRmaWVsZENvbXBvbmVudCxcbiAgICBUdWlUZXh0ZmllbGREaXJlY3RpdmUsXG4gICAgVHVpV2l0aFRleHRmaWVsZCxcbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy90ZXh0ZmllbGQnO1xuaW1wb3J0IHtcbiAgICBUdWlEcm9wZG93bkRpcmVjdGl2ZSxcbiAgICB0dWlEcm9wZG93bkVuYWJsZWQsXG4gICAgdHVpRHJvcGRvd25PcGVuLFxufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9kaXJlY3RpdmVzL2Ryb3Bkb3duJztcbmltcG9ydCB0eXBlIHtUdWlJdGVtc0hhbmRsZXJzfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9kaXJlY3RpdmVzL2l0ZW1zLWhhbmRsZXJzJztcbmltcG9ydCB7VFVJX0lURU1TX0hBTkRMRVJTfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9kaXJlY3RpdmVzL2l0ZW1zLWhhbmRsZXJzJztcbmltcG9ydCB7dHVpQXNBdXhpbGlhcnl9IGZyb20gJ0B0YWlnYS11aS9jb3JlL3Rva2Vucyc7XG5pbXBvcnQge1R1aVNlbGVjdE9wdGlvbn0gZnJvbSAnQHRhaWdhLXVpL2tpdC9jb21wb25lbnRzL3NlbGVjdCc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdpbnB1dFt0dWlDb21ib0JveF0nLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB0dWlBc09wdGlvbkNvbnRlbnQoVHVpU2VsZWN0T3B0aW9uKSxcbiAgICAgICAgdHVpQXNUZXh0ZmllbGRBY2Nlc3NvcihUdWlDb21ib0JveCksXG4gICAgICAgIHR1aUFzQ29udHJvbChUdWlDb21ib0JveCksXG4gICAgICAgIHR1aUFzQXV4aWxpYXJ5KFR1aUNvbWJvQm94KSxcbiAgICBdLFxuICAgIGhvc3REaXJlY3RpdmVzOiBbVHVpV2l0aFRleHRmaWVsZF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnW2Rpc2FibGVkXSc6ICdkaXNhYmxlZCgpJyxcbiAgICAgICAgJyhjbGljayknOiAndG9nZ2xlRHJvcGRvd24oKScsXG4gICAgICAgICcoaW5wdXQpJzogJ29uSW5wdXQoJGV2ZW50LnRhcmdldC52YWx1ZSknLFxuICAgICAgICAnKGtleWRvd24uZW50ZXIpJzogJ2tleWRvd25FbnRlcigkZXZlbnQpJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUdWlDb21ib0JveDxUPlxuICAgIGV4dGVuZHMgVHVpQ29udHJvbDxUIHwgc3RyaW5nIHwgbnVsbD5cbiAgICBpbXBsZW1lbnRzIFR1aVRleHRmaWVsZEFjY2Vzc29yPFQ+XG57XG4gICAgcHJpdmF0ZSByZWFkb25seSBlbCA9IHR1aUluamVjdEVsZW1lbnQ8SFRNTElucHV0RWxlbWVudD4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IFR1aVRleHRmaWVsZENvbXBvbmVudDxUPiA9IGluamVjdChUdWlUZXh0ZmllbGRDb21wb25lbnQpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGV4dGZpZWxkOiBUdWlUZXh0ZmllbGREaXJlY3RpdmU8VD4gPSBpbmplY3QoVHVpVGV4dGZpZWxkRGlyZWN0aXZlKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3BlbiA9IHR1aURyb3Bkb3duT3BlbigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZHJvcGRvd24gPSBpbmplY3QoVHVpRHJvcGRvd25EaXJlY3RpdmUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaXRlbXNIYW5kbGVyczogVHVpSXRlbXNIYW5kbGVyczxUPiA9IGluamVjdChUVUlfSVRFTVNfSEFORExFUlMpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YWxpc3QgPSB0dWlJbmplY3RBdXhpbGlhcnk8VHVpRGF0YUxpc3RBY2Nlc3NvcjxUPj4oXG4gICAgICAgICh4KSA9PiAnZ2V0T3B0aW9ucycgaW4geCxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRyb3Bkb3duRW5hYmxlZCA9IHR1aURyb3Bkb3duRW5hYmxlZCh0aGlzLmludGVyYWN0aXZlKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB2YWx1ZUVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZSgpID8/ICcnO1xuICAgICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHR1aUlzU3RyaW5nKHZhbHVlKVxuICAgICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgICAgOiB0aGlzLml0ZW1zSGFuZGxlcnMuc3RyaW5naWZ5KCkodmFsdWUpO1xuICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMubWF0Y2goc3RyaW5naWZpZWQpO1xuXG4gICAgICAgIHRoaXMudGV4dGZpZWxkLnZhbHVlLnVwZGF0ZSgoeCkgPT4gc3RyaW5naWZpZWQgfHwgeCk7XG5cbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KChlbmQgPSB0aGlzLmVsLnZhbHVlLmxlbmd0aCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmVsLnNldFNlbGVjdGlvblJhbmdlKGVuZCwgZW5kKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9LCBUVUlfQUxMT1dfU0lHTkFMX1dSSVRFUyk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYmx1ckVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdW50cmFja2VkKCgpID0+IHRoaXMudmFsdWUoKSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhvc3QuZm9jdXNlZCgpICYmIHRoaXMuc3RyaWN0ICYmICF2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0ZmllbGQudmFsdWUuc2V0KCcnKTtcbiAgICAgICAgfVxuICAgIH0sIFRVSV9BTExPV19TSUdOQUxfV1JJVEVTKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHN0cmljdCA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtYXRjaGVyOiBUdWlTdHJpbmdNYXRjaGVyPFQ+IHwgbnVsbCA9IFRVSV9TVFJJQ1RfTUFUQ0hFUjtcblxuICAgIHB1YmxpYyBzZXRWYWx1ZSh2YWx1ZTogVCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcblxuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZURyb3Bkb3duKHRydWUpO1xuICAgICAgICAgICAgdGhpcy50ZXh0ZmllbGQudmFsdWUuc2V0KCcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCB0b2dnbGVEcm9wZG93bihvcGVuID0gIXRoaXMub3BlbigpKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRyb3Bkb3duRW5hYmxlZCgpICYmIHRoaXMuZHJvcGRvd24uY29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5vcGVuLnNldChvcGVuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbklucHV0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLm1hdGNoKHZhbHVlKTtcbiAgICAgICAgY29uc3QgZmFsbGJhY2sgPSB0aGlzLnN0cmljdCB8fCAhdmFsdWUgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgICAgdGhpcy5vbkNoYW5nZShtYXRjaCA/PyBmYWxsYmFjayk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50b2dnbGVEcm9wZG93bih0cnVlKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGtleWRvd25FbnRlcihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMub3BlbigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMub3B0aW9uc1swXSEpO1xuICAgICAgICAgICAgdGhpcy50b2dnbGVEcm9wZG93bihmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBvcHRpb25zKCk6IHJlYWRvbmx5IFRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFsaXN0KCk/LmdldE9wdGlvbnMoKSB8fCBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1hdGNoKHZhbHVlOiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmluZCgoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZXI/LihpdGVtLCB2YWx1ZSwgdGhpcy5pdGVtc0hhbmRsZXJzLnN0cmluZ2lmeSgpKSxcbiAgICAgICAgICAgICkgPz8gbnVsbFxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm8tYm94LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdC9jb21wb25lbnRzL2NvbWJvLWJveC9jb21iby1ib3guZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxRQUFRLEVBQ1IsU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUFDLHVCQUF1QixFQUFFLGtCQUFrQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFcEYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFekQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFFdkUsT0FBTyxFQUNILHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixnQkFBZ0IsR0FDbkIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQ0gsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixlQUFlLEdBQ2xCLE1BQU0sb0NBQW9DLENBQUM7QUFFNUMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFDNUUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQzs7O0FBRWhFLE1BaUJhLFdBQ1QsU0FBUSxVQUE2QjtJQWxCekM7O1FBcUJxQixPQUFFLEdBQUcsZ0JBQWdCLEVBQW9CLENBQUM7UUFDMUMsU0FBSSxHQUE2QixNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUMv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Q3pCLGNBQWMsQ0FBQyxXQUFXLENBQUM7U0FDOUI7O1NBU1EsV0FBVzs0RkFBWCxXQUFXO2tCQWpCdkIsU0FBUzttQkFBQztvQkFDUCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsU0FBUyxFQUFFO3dCQUNQLGtCQUFrQixDQUFDLGVBQWUsQ0FBQzt3QkFDbkMsc0JBQXNCLGFBQWE7d0JBQ25DLFlBQVksYUFBYTt3QkFDekIsY0FBYyxhQUFhO3FCQUM5QjtvQkFDRCxjQUFjLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDbEMsSUFBSSxFQUFFO3dCQUNGLFlBQVksRUFBRSxZQUFZO3dCQUMxQixTQUFTLEVBQUUsa0JBQWtCO3dCQUM3QixTQUFTLEVBQUUsV0FBVzt3QkFDdEIsaUJBQWlCLEVBQUUsc0JBQXNCO3FCQUM1QztpQkFDSjs4QkFrRWMsWUFBWTtzQkFEdEIsS0FBSzt1QkFBQyxRQUFRO2dCQU9KLGFBQWE7c0JBRHZCLEtBQUs7dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgY29tcHV0ZWQsXG4gICAgRGlyZWN0aXZlLFxuICAgIGVmZmVjdCxcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgaXNTaWduYWwsXG4gICAgc2lnbmFsLFxuICAgIHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3R1aUFzQ29udHJvbCwgVHVpQ29udHJvbH0gZnJvbSAnQHRhaWdhLXVpL2Nkay9jbGFzc2VzJztcbmltcG9ydCB7VFVJX0FMTE9XX1NJR05BTF9XUklURVMsIFRVSV9TVFJJQ1RfTUFUQ0hFUn0gZnJvbSAnQHRhaWdhLXVpL2Nkay9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUge1R1aVN0cmluZ01hdGNoZXJ9IGZyb20gJ0B0YWlnYS11aS9jZGsvdHlwZXMnO1xuaW1wb3J0IHt0dWlJbmplY3RFbGVtZW50fSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL2RvbSc7XG5pbXBvcnQgdHlwZSB7VHVpRGF0YUxpc3RBY2Nlc3Nvcn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9kYXRhLWxpc3QnO1xuaW1wb3J0IHt0dWlBc09wdGlvbkNvbnRlbnR9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvZGF0YS1saXN0JztcbmltcG9ydCB0eXBlIHtUdWlUZXh0ZmllbGRBY2Nlc3Nvcn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy90ZXh0ZmllbGQnO1xuaW1wb3J0IHtcbiAgICB0dWlBc1RleHRmaWVsZEFjY2Vzc29yLFxuICAgIHR1aUluamVjdEF1eGlsaWFyeSxcbiAgICBUdWlUZXh0ZmllbGRDb21wb25lbnQsXG4gICAgVHVpVGV4dGZpZWxkRGlyZWN0aXZlLFxuICAgIFR1aVdpdGhUZXh0ZmllbGQsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvdGV4dGZpZWxkJztcbmltcG9ydCB7XG4gICAgVHVpRHJvcGRvd25EaXJlY3RpdmUsXG4gICAgdHVpRHJvcGRvd25FbmFibGVkLFxuICAgIHR1aURyb3Bkb3duT3Blbixcbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvZGlyZWN0aXZlcy9kcm9wZG93bic7XG5pbXBvcnQgdHlwZSB7VHVpSXRlbXNIYW5kbGVyc30gZnJvbSAnQHRhaWdhLXVpL2NvcmUvZGlyZWN0aXZlcy9pdGVtcy1oYW5kbGVycyc7XG5pbXBvcnQge1RVSV9JVEVNU19IQU5ETEVSU30gZnJvbSAnQHRhaWdhLXVpL2NvcmUvZGlyZWN0aXZlcy9pdGVtcy1oYW5kbGVycyc7XG5pbXBvcnQge3R1aUFzQXV4aWxpYXJ5fSBmcm9tICdAdGFpZ2EtdWkvY29yZS90b2tlbnMnO1xuaW1wb3J0IHtUdWlTZWxlY3RPcHRpb259IGZyb20gJ0B0YWlnYS11aS9raXQvY29tcG9uZW50cy9zZWxlY3QnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnaW5wdXRbdHVpQ29tYm9Cb3hdJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgdHVpQXNPcHRpb25Db250ZW50KFR1aVNlbGVjdE9wdGlvbiksXG4gICAgICAgIHR1aUFzVGV4dGZpZWxkQWNjZXNzb3IoVHVpQ29tYm9Cb3gpLFxuICAgICAgICB0dWlBc0NvbnRyb2woVHVpQ29tYm9Cb3gpLFxuICAgICAgICB0dWlBc0F1eGlsaWFyeShUdWlDb21ib0JveCksXG4gICAgXSxcbiAgICBob3N0RGlyZWN0aXZlczogW1R1aVdpdGhUZXh0ZmllbGRdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1tkaXNhYmxlZF0nOiAnZGlzYWJsZWQoKScsXG4gICAgICAgICcoY2xpY2spJzogJ3RvZ2dsZURyb3Bkb3duKCknLFxuICAgICAgICAnKGlucHV0KSc6ICdvbklucHV0KCknLFxuICAgICAgICAnKGtleWRvd24uZW50ZXIpJzogJ2tleWRvd25FbnRlcigkZXZlbnQpJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUdWlDb21ib0JveDxUPlxuICAgIGV4dGVuZHMgVHVpQ29udHJvbDxUIHwgc3RyaW5nIHwgbnVsbD5cbiAgICBpbXBsZW1lbnRzIFR1aVRleHRmaWVsZEFjY2Vzc29yPFQ+XG57XG4gICAgcHJpdmF0ZSByZWFkb25seSBlbCA9IHR1aUluamVjdEVsZW1lbnQ8SFRNTElucHV0RWxlbWVudD4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IFR1aVRleHRmaWVsZENvbXBvbmVudDxUPiA9IGluamVjdChUdWlUZXh0ZmllbGRDb21wb25lbnQpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGV4dGZpZWxkOiBUdWlUZXh0ZmllbGREaXJlY3RpdmU8VD4gPSBpbmplY3QoVHVpVGV4dGZpZWxkRGlyZWN0aXZlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wZW4gPSB0dWlEcm9wZG93bk9wZW4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRyb3Bkb3duRW5hYmxlZCA9IHR1aURyb3Bkb3duRW5hYmxlZCh0aGlzLmludGVyYWN0aXZlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRyb3Bkb3duID0gaW5qZWN0KFR1aURyb3Bkb3duRGlyZWN0aXZlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGl0ZW1zSGFuZGxlcnM6IFR1aUl0ZW1zSGFuZGxlcnM8VCB8IHN0cmluZz4gPVxuICAgICAgICBpbmplY3QoVFVJX0lURU1TX0hBTkRMRVJTKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF0Y2hlciA9IHNpZ25hbDxUdWlTdHJpbmdNYXRjaGVyPFQ+IHwgbnVsbD4oVFVJX1NUUklDVF9NQVRDSEVSKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmljdCA9IHNpZ25hbCh0cnVlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGFsaXN0ID0gdHVpSW5qZWN0QXV4aWxpYXJ5PFR1aURhdGFMaXN0QWNjZXNzb3I8VD4+KFxuICAgICAgICAoeCkgPT4geCAhPT0gdGhpcyAmJiAnb3B0aW9ucycgaW4geCAmJiBpc1NpZ25hbCh4Lm9wdGlvbnMpLFxuICAgICk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnMgPSBjb21wdXRlZChcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIHRoaXMuZGF0YWxpc3QoKVxuICAgICAgICAgICAgICAgID8ub3B0aW9ucz8uKCkgLy8gVE9ETyh2NSk6IHJlbW92ZSBvcHRpb25hbCBjYWxsIGA/LigpYFxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHgpID0+ICF0aGlzLml0ZW1zSGFuZGxlcnMuZGlzYWJsZWRJdGVtSGFuZGxlcigpKHgpKSA/PyBbXSxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5vblN0cmljdFZhbHVlRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMoKS5sZW5ndGggJiYgIXRoaXMuc3RyaWN0KCkpIHtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50ZXh0ZmllbGQudmFsdWUoKSB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgIH0sIFRVSV9BTExPV19TSUdOQUxfV1JJVEVTKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXRjaGluZ0VmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgbWF0Y2hlciA9IHRoaXMubWF0Y2hlcigpO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5sZW5ndGggfHwgIW1hdGNoZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHRmaWVsZFZhbHVlID0gdGhpcy50ZXh0ZmllbGQudmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPVxuICAgICAgICAgICAgb3B0aW9ucy5maW5kKCh4KSA9PlxuICAgICAgICAgICAgICAgIG1hdGNoZXIoeCwgdGV4dGZpZWxkVmFsdWUsIHRoaXMuaXRlbXNIYW5kbGVycy5zdHJpbmdpZnkoKSksXG4gICAgICAgICAgICApID8/IG51bGw7XG4gICAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gdGhpcy5zdHJpbmdpZnkoc2VsZWN0ZWRPcHRpb24pO1xuICAgICAgICBjb25zdCBmYWxsYmFjayA9IHRoaXMuc3RyaWN0KCkgfHwgIXRleHRmaWVsZFZhbHVlID8gbnVsbCA6IHRleHRmaWVsZFZhbHVlO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2Uoc2VsZWN0ZWRPcHRpb24gPz8gZmFsbGJhY2spO1xuXG4gICAgICAgIGlmIChzdHJpbmdpZmllZCAmJiBzdHJpbmdpZmllZCAhPT0gdGV4dGZpZWxkVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dGZpZWxkLnZhbHVlLnNldChzdHJpbmdpZmllZCk7XG4gICAgICAgIH1cbiAgICB9LCBUVUlfQUxMT1dfU0lHTkFMX1dSSVRFUyk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYmx1ckVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGluY29tcGxldGUgPSB1bnRyYWNrZWQoKCkgPT4gdGhpcy5zdHJpY3QoKSAmJiAhdGhpcy52YWx1ZSgpKTtcblxuICAgICAgICBpZiAoIXRoaXMuaG9zdC5mb2N1c2VkKCkgJiYgaW5jb21wbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0ZmllbGQudmFsdWUuc2V0KCcnKTtcbiAgICAgICAgfVxuICAgIH0sIFRVSV9BTExPV19TSUdOQUxfV1JJVEVTKTtcblxuICAgIC8vIFRPRE8odjUpOiB1c2Ugc2lnbmFsIGlucHV0XG4gICAgQElucHV0KCdzdHJpY3QnKVxuICAgIHB1YmxpYyBzZXQgc3RyaWN0U2V0dGVyKHg6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zdHJpY3Quc2V0KHgpO1xuICAgIH1cblxuICAgIC8vIFRPRE8odjUpOiB1c2Ugc2lnbmFsIGlucHV0XG4gICAgQElucHV0KCdtYXRjaGVyJylcbiAgICBwdWJsaWMgc2V0IG1hdGNoZXJTZXR0ZXIoeDogVHVpU3RyaW5nTWF0Y2hlcjxUPiB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5tYXRjaGVyLnNldCh4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VmFsdWUodmFsdWU6IFQgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gdGhpcy5zdHJpbmdpZnkodmFsdWUpO1xuXG4gICAgICAgIGlmIChzdHJpbmdpZmllZCAhPT0gdGhpcy50ZXh0ZmllbGQudmFsdWUoKSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0ZmllbGQudmFsdWUuc2V0KHN0cmluZ2lmaWVkKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKGVuZCA9IHN0cmluZ2lmaWVkLmxlbmd0aCkgPT4gdGhpcy5lbC5zZXRTZWxlY3Rpb25SYW5nZShlbmQsIGVuZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVEcm9wZG93bih0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSB3cml0ZVZhbHVlKHZhbHVlOiBUIHwgc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBzdXBlci53cml0ZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgdGhpcy50ZXh0ZmllbGQudmFsdWUuc2V0KHRoaXMuc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRvZ2dsZURyb3Bkb3duKG9wZW4gPSAhdGhpcy5vcGVuKCkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZHJvcGRvd25FbmFibGVkKCkgJiYgdGhpcy5kcm9wZG93bi5jb250ZW50KSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4uc2V0KG9wZW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uSW5wdXQoKTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50b2dnbGVEcm9wZG93bih0cnVlKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGtleWRvd25FbnRlcihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMub3BlbigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMoKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDEgJiYgb3B0aW9uc1swXSkge1xuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShvcHRpb25zWzBdKTtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlRHJvcGRvd24oZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdHJpbmdpZnkodmFsdWU6IFQgfCBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID8gdGhpcy5pdGVtc0hhbmRsZXJzLnN0cmluZ2lmeSgpKHZhbHVlKSA6ICcnO1xuICAgIH1cbn1cbiJdfQ==