@taiga-ui/kit 4.39.2 → 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.
- package/components/calendar-range/calendar-range.component.d.ts +4 -1
- package/components/combo-box/combo-box.directive.d.ts +13 -9
- package/components/data-list-wrapper/data-list-wrapper.component.d.ts +4 -1
- package/components/files/file/file.component.d.ts +1 -0
- package/components/files/file/file.options.d.ts +1 -1
- package/components/files/files.utils.d.ts +1 -1
- package/components/index.d.ts +1 -0
- package/components/input-date/index.d.ts +0 -1
- package/components/input-date/input-date.d.ts +1 -2
- package/components/input-date/input-date.directive.d.ts +14 -3
- package/components/input-date-range/index.d.ts +3 -0
- package/components/input-date-range/input-date-range.d.ts +3 -0
- package/components/input-date-range/input-date-range.directive.d.ts +20 -0
- package/components/input-date-range/input-date-range.options.d.ts +9 -0
- package/components/input-phone-international/input-phone-international.component.d.ts +1 -0
- package/esm2022/components/calendar-range/calendar-range.component.mjs +44 -27
- package/esm2022/components/combo-box/combo-box.directive.mjs +60 -37
- package/esm2022/components/data-list-wrapper/data-list-wrapper.component.mjs +16 -4
- package/esm2022/components/files/file/file.component.mjs +4 -3
- package/esm2022/components/files/file/file.options.mjs +1 -1
- package/esm2022/components/files/files.utils.mjs +3 -3
- package/esm2022/components/index.mjs +2 -1
- package/esm2022/components/input-date/index.mjs +1 -2
- package/esm2022/components/input-date/input-date.directive.mjs +49 -37
- package/esm2022/components/input-date/input-date.mjs +1 -3
- package/esm2022/components/input-date-range/index.mjs +4 -0
- package/esm2022/components/input-date-range/input-date-range.directive.mjs +75 -0
- package/esm2022/components/input-date-range/input-date-range.mjs +4 -0
- package/esm2022/components/input-date-range/input-date-range.options.mjs +10 -0
- package/esm2022/components/input-date-range/taiga-ui-kit-components-input-date-range.mjs +5 -0
- package/esm2022/components/input-month/input-month.directive.mjs +2 -3
- package/esm2022/components/input-month-range/input-month-range.directive.mjs +2 -3
- package/esm2022/components/input-number/input-number.directive.mjs +2 -4
- package/esm2022/components/input-phone-international/input-phone-international.component.mjs +2 -1
- package/esm2022/components/input-pin/input-pin.component.mjs +3 -3
- package/esm2022/components/input-slider/input-slider.directive.mjs +3 -2
- package/esm2022/components/segmented/segmented.component.mjs +2 -2
- package/esm2022/components/select/select.directive.mjs +2 -3
- package/fesm2022/taiga-ui-kit-components-calendar-range.mjs +43 -26
- package/fesm2022/taiga-ui-kit-components-calendar-range.mjs.map +1 -1
- package/fesm2022/taiga-ui-kit-components-combo-box.mjs +61 -38
- package/fesm2022/taiga-ui-kit-components-combo-box.mjs.map +1 -1
- package/fesm2022/taiga-ui-kit-components-data-list-wrapper.mjs +15 -3
- package/fesm2022/taiga-ui-kit-components-data-list-wrapper.mjs.map +1 -1
- package/fesm2022/taiga-ui-kit-components-files.mjs +5 -4
- package/fesm2022/taiga-ui-kit-components-files.mjs.map +1 -1
- package/fesm2022/taiga-ui-kit-components-input-date-range.mjs +89 -0
- package/fesm2022/taiga-ui-kit-components-input-date-range.mjs.map +1 -0
- package/fesm2022/taiga-ui-kit-components-input-date.mjs +50 -63
- package/fesm2022/taiga-ui-kit-components-input-date.mjs.map +1 -1
- package/fesm2022/taiga-ui-kit-components-input-month-range.mjs +1 -2
- package/fesm2022/taiga-ui-kit-components-input-month-range.mjs.map +1 -1
- package/fesm2022/taiga-ui-kit-components-input-month.mjs +1 -2
- package/fesm2022/taiga-ui-kit-components-input-month.mjs.map +1 -1
- package/fesm2022/taiga-ui-kit-components-input-number.mjs +1 -3
- package/fesm2022/taiga-ui-kit-components-input-number.mjs.map +1 -1
- package/fesm2022/taiga-ui-kit-components-input-phone-international.mjs +1 -0
- package/fesm2022/taiga-ui-kit-components-input-phone-international.mjs.map +1 -1
- package/fesm2022/taiga-ui-kit-components-input-pin.mjs +2 -2
- package/fesm2022/taiga-ui-kit-components-input-pin.mjs.map +1 -1
- package/fesm2022/taiga-ui-kit-components-input-slider.mjs +2 -1
- package/fesm2022/taiga-ui-kit-components-input-slider.mjs.map +1 -1
- package/fesm2022/taiga-ui-kit-components-segmented.mjs +2 -2
- package/fesm2022/taiga-ui-kit-components-segmented.mjs.map +1 -1
- package/fesm2022/taiga-ui-kit-components-select.mjs +1 -2
- package/fesm2022/taiga-ui-kit-components-select.mjs.map +1 -1
- package/fesm2022/taiga-ui-kit-components.mjs +1 -0
- package/fesm2022/taiga-ui-kit-components.mjs.map +1 -1
- package/package.json +26 -20
- package/components/input-date/input-date.validator.d.ts +0 -10
- package/esm2022/components/input-date/input-date.validator.mjs +0 -31
|
@@ -12,13 +12,15 @@ export declare class TuiCalendarRange implements OnInit, OnChanges {
|
|
|
12
12
|
* @deprecated use `item`
|
|
13
13
|
*/
|
|
14
14
|
private selectedPeriod;
|
|
15
|
-
|
|
15
|
+
private readonly cdr;
|
|
16
|
+
protected currentValue: TuiDay | TuiDayRange | null;
|
|
16
17
|
protected previousValue: TuiDay | TuiDayRange | null;
|
|
17
18
|
protected hoveredItem: TuiDay | null;
|
|
18
19
|
protected month: TuiMonth;
|
|
19
20
|
protected readonly otherDateText$: Observable<string>;
|
|
20
21
|
protected readonly icons: import("@taiga-ui/core/tokens").TuiCommonIcons;
|
|
21
22
|
protected readonly capsMapper: TuiMapper<[TuiDay | null, TuiDay | TuiDayRange | null, TuiDayLike | null, boolean], TuiDay>;
|
|
23
|
+
protected readonly mobile: boolean;
|
|
22
24
|
disabledItemHandler: TuiBooleanHandler<TuiDay>;
|
|
23
25
|
markerHandler: TuiMarkerHandler | null;
|
|
24
26
|
items: readonly TuiDayRangePeriod[];
|
|
@@ -32,6 +34,7 @@ export declare class TuiCalendarRange implements OnInit, OnChanges {
|
|
|
32
34
|
constructor();
|
|
33
35
|
set valueSetter(value: TuiDayRange | null);
|
|
34
36
|
set defaultViewedMonth(month: TuiMonth);
|
|
37
|
+
set value(value: TuiDayRange | null);
|
|
35
38
|
get defaultViewedMonth(): TuiMonth;
|
|
36
39
|
/**
|
|
37
40
|
* @deprecated use `item`
|
|
@@ -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
|
-
|
|
15
|
-
protected readonly
|
|
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
|
-
|
|
18
|
-
|
|
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(
|
|
26
|
+
protected onInput(): void;
|
|
22
27
|
protected keydownEnter(event: KeyboardEvent): void;
|
|
23
|
-
private
|
|
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, { "
|
|
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>;
|
|
@@ -10,6 +10,7 @@ import * as i1 from "@taiga-ui/core/directives/appearance";
|
|
|
10
10
|
export declare class TuiFile {
|
|
11
11
|
private readonly sanitizer;
|
|
12
12
|
private readonly options;
|
|
13
|
+
private readonly locale;
|
|
13
14
|
private readonly units$;
|
|
14
15
|
private readonly win;
|
|
15
16
|
protected readonly icons: import("@taiga-ui/core/tokens").TuiCommonIcons;
|
|
@@ -4,7 +4,7 @@ import type { TuiSizeL } from '@taiga-ui/core/types';
|
|
|
4
4
|
import type { PolymorpheusContent } from '@taiga-ui/polymorpheus';
|
|
5
5
|
import type { TuiFileState } from '../files.types';
|
|
6
6
|
export interface TuiFileOptions extends TuiAppearanceOptions {
|
|
7
|
-
readonly formatSize: (units: readonly [string, string, string], size?: number) => string | null;
|
|
7
|
+
readonly formatSize: (units: readonly [string, string, string], size?: number, locale?: string) => string | null;
|
|
8
8
|
readonly icons: Record<Exclude<TuiFileState, 'loading'>, PolymorpheusContent<TuiContext<TuiSizeL>>>;
|
|
9
9
|
}
|
|
10
10
|
export declare const TUI_FILE_DEFAULT_OPTIONS: TuiFileOptions;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { AbstractControl } from '@angular/forms';
|
|
2
2
|
export declare function tuiFilesRejected(control?: AbstractControl | null): File[];
|
|
3
3
|
export declare function tuiFilesAccepted(control?: AbstractControl | null): File[];
|
|
4
|
-
export declare function tuiFormatSize(units: readonly [string, string, string], size?: number): string | null;
|
|
4
|
+
export declare function tuiFormatSize(units: readonly [string, string, string], size?: number, locale?: string): string | null;
|
package/components/index.d.ts
CHANGED
|
@@ -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';
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { TuiCalendar } from '@taiga-ui/core/components/calendar';
|
|
2
2
|
import { TuiInputDateComponent } from './input-date.component';
|
|
3
3
|
import { TuiInputDateDirective } from './input-date.directive';
|
|
4
|
-
|
|
5
|
-
export declare const TuiInputDate: readonly [typeof TuiInputDateDirective, typeof TuiInputDateComponent, typeof TuiInputDateValidator, typeof TuiCalendar];
|
|
4
|
+
export declare const TuiInputDate: readonly [typeof TuiInputDateDirective, typeof TuiInputDateComponent, typeof TuiCalendar];
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
+
import type { MaskitoDateMode } from '@maskito/kit';
|
|
1
2
|
import { TuiControl } from '@taiga-ui/cdk/classes';
|
|
3
|
+
import type { TuiDateMode, TuiDayRange } from '@taiga-ui/cdk/date-time';
|
|
2
4
|
import { TuiDay } from '@taiga-ui/cdk/date-time';
|
|
5
|
+
import { TuiCalendar } from '@taiga-ui/core/components/calendar';
|
|
6
|
+
import { TuiCalendarRange } from '@taiga-ui/kit/components/calendar-range';
|
|
3
7
|
import * as i0 from "@angular/core";
|
|
4
8
|
import * as i1 from "@taiga-ui/core/components/textfield";
|
|
5
9
|
import * as i2 from "@taiga-ui/core/directives/dropdown";
|
|
6
|
-
import * as i3 from "
|
|
10
|
+
import * as i3 from "@taiga-ui/core/directives/items-handlers";
|
|
7
11
|
import * as i4 from "@maskito/angular";
|
|
8
|
-
export declare
|
|
12
|
+
export declare const TUI_DATE_ADAPTER: Record<TuiDateMode, MaskitoDateMode>;
|
|
13
|
+
export declare abstract class TuiInputDateBase<T extends TuiDay | TuiDayRange> extends TuiControl<T | null> {
|
|
9
14
|
private readonly el;
|
|
10
15
|
private readonly mobile;
|
|
11
16
|
private readonly options;
|
|
@@ -25,10 +30,16 @@ export declare class TuiInputDateDirective extends TuiControl<TuiDay | null> {
|
|
|
25
30
|
readonly native: boolean;
|
|
26
31
|
readonly min: import("@angular/core").WritableSignal<TuiDay>;
|
|
27
32
|
readonly max: import("@angular/core").WritableSignal<TuiDay>;
|
|
33
|
+
protected abstract onValueChange(value: string): void;
|
|
28
34
|
set minSetter(min: TuiDay | null);
|
|
29
35
|
set maxSetter(max: TuiDay | null);
|
|
36
|
+
protected processCalendar(calendar: TuiCalendar | TuiCalendarRange): void;
|
|
30
37
|
protected onClick(): void;
|
|
38
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TuiInputDateBase<any>, never>;
|
|
39
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TuiInputDateBase<any>, never, never, { "minSetter": { "alias": "min"; "required": false; }; "maxSetter": { "alias": "max"; "required": false; }; }, {}, never, never, true, never>;
|
|
40
|
+
}
|
|
41
|
+
export declare class TuiInputDateDirective extends TuiInputDateBase<TuiDay> {
|
|
31
42
|
protected onValueChange(value: string): void;
|
|
32
43
|
static ɵfac: i0.ɵɵFactoryDeclaration<TuiInputDateDirective, never>;
|
|
33
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<TuiInputDateDirective, "input[tuiInputDate]", never, {
|
|
44
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TuiInputDateDirective, "input[tuiInputDate]", never, {}, {}, never, never, true, [{ directive: typeof i1.TuiWithTextfield; inputs: {}; outputs: {}; }, { directive: typeof i2.TuiDropdownAuto; inputs: {}; outputs: {}; }, { directive: typeof i3.TuiItemsHandlersValidator; inputs: {}; outputs: {}; }, { directive: typeof i4.MaskitoDirective; inputs: {}; outputs: {}; }]>;
|
|
34
45
|
}
|
|
@@ -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;
|
|
@@ -7,6 +7,7 @@ import type { MetadataJson } from 'libphonenumber-js/core';
|
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
import * as i1 from "@taiga-ui/core/directives/group";
|
|
9
9
|
import * as i2 from "@taiga-ui/core/directives/dropdown";
|
|
10
|
+
/** @deprecated use version from experimental package instead */
|
|
10
11
|
export declare class TuiInputPhoneInternational extends TuiControl<string> {
|
|
11
12
|
private readonly input?;
|
|
12
13
|
private readonly filter?;
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
2
|
import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
|
|
3
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output, } from '@angular/core';
|
|
3
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, inject, Input, Output, } from '@angular/core';
|
|
4
4
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
5
5
|
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';
|
|
12
13
|
import { TuiIcon } from '@taiga-ui/core/components/icon';
|
|
13
|
-
import { TUI_COMMON_ICONS } from '@taiga-ui/core/tokens';
|
|
14
|
+
import { TUI_COMMON_ICONS, tuiAsAuxiliary } from '@taiga-ui/core/tokens';
|
|
14
15
|
import { TUI_CALENDAR_DATE_STREAM, TUI_OTHER_DATE_TEXT } from '@taiga-ui/kit/tokens';
|
|
15
16
|
import { calculateDisabledItemHandler } from './calculate-disabled-item-handler';
|
|
16
17
|
import { TUI_DAY_CAPS_MAPPER } from './day-caps-mapper';
|
|
@@ -22,13 +23,15 @@ class TuiCalendarRange {
|
|
|
22
23
|
* @deprecated use `item`
|
|
23
24
|
*/
|
|
24
25
|
this.selectedPeriod = null;
|
|
25
|
-
this.
|
|
26
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
27
|
+
this.currentValue = null;
|
|
26
28
|
this.previousValue = null;
|
|
27
29
|
this.hoveredItem = null;
|
|
28
30
|
this.month = TuiMonth.currentLocal();
|
|
29
31
|
this.otherDateText$ = inject(TUI_OTHER_DATE_TEXT);
|
|
30
32
|
this.icons = inject(TUI_COMMON_ICONS);
|
|
31
33
|
this.capsMapper = TUI_DAY_CAPS_MAPPER;
|
|
34
|
+
this.mobile = inject(TUI_IS_MOBILE);
|
|
32
35
|
this.disabledItemHandler = TUI_FALSE_HANDLER;
|
|
33
36
|
this.markerHandler = null;
|
|
34
37
|
this.items = [];
|
|
@@ -53,18 +56,23 @@ class TuiCalendarRange {
|
|
|
53
56
|
inject(TUI_CALENDAR_DATE_STREAM, { optional: true })
|
|
54
57
|
?.pipe(tuiWatch(), takeUntilDestroyed())
|
|
55
58
|
.subscribe((value) => {
|
|
56
|
-
this.
|
|
59
|
+
this.currentValue = value;
|
|
57
60
|
this.initDefaultViewedMonth();
|
|
58
61
|
});
|
|
59
62
|
}
|
|
60
63
|
set valueSetter(value) {
|
|
61
|
-
this.
|
|
64
|
+
this.currentValue = value;
|
|
62
65
|
}
|
|
63
66
|
set defaultViewedMonth(month) {
|
|
64
|
-
if (!this.
|
|
67
|
+
if (!this.currentValue) {
|
|
65
68
|
this.month = month;
|
|
66
69
|
}
|
|
67
70
|
}
|
|
71
|
+
set value(value) {
|
|
72
|
+
this.cdr.markForCheck();
|
|
73
|
+
this.currentValue = value;
|
|
74
|
+
this.initDefaultViewedMonth();
|
|
75
|
+
}
|
|
68
76
|
get defaultViewedMonth() {
|
|
69
77
|
return this.month;
|
|
70
78
|
}
|
|
@@ -81,7 +89,7 @@ class TuiCalendarRange {
|
|
|
81
89
|
this.selectedPeriod = period;
|
|
82
90
|
}
|
|
83
91
|
ngOnChanges() {
|
|
84
|
-
if (!this.
|
|
92
|
+
if (!this.currentValue) {
|
|
85
93
|
this.initDefaultViewedMonth();
|
|
86
94
|
}
|
|
87
95
|
}
|
|
@@ -89,14 +97,14 @@ class TuiCalendarRange {
|
|
|
89
97
|
this.initDefaultViewedMonth();
|
|
90
98
|
}
|
|
91
99
|
get calculatedDisabledItemHandler() {
|
|
92
|
-
return this.calculateDisabledItemHandler(this.disabledItemHandler, this.
|
|
100
|
+
return this.calculateDisabledItemHandler(this.disabledItemHandler, this.currentValue, this.minLength);
|
|
93
101
|
}
|
|
94
102
|
onEsc(event) {
|
|
95
|
-
if (event.key !== 'Escape' || !(this.
|
|
103
|
+
if (event.key !== 'Escape' || !(this.currentValue instanceof TuiDay)) {
|
|
96
104
|
return;
|
|
97
105
|
}
|
|
98
106
|
event.stopPropagation();
|
|
99
|
-
this.
|
|
107
|
+
this.currentValue = this.previousValue;
|
|
100
108
|
}
|
|
101
109
|
isItemActive(item) {
|
|
102
110
|
const { activePeriod } = this;
|
|
@@ -121,28 +129,28 @@ class TuiCalendarRange {
|
|
|
121
129
|
this.month = month;
|
|
122
130
|
}
|
|
123
131
|
onDayClick(day) {
|
|
124
|
-
this.previousValue = this.
|
|
132
|
+
this.previousValue = this.currentValue;
|
|
125
133
|
this.selectedActivePeriod = null;
|
|
126
|
-
if (this.
|
|
127
|
-
const range = TuiDayRange.sort(this.
|
|
128
|
-
this.
|
|
134
|
+
if (this.currentValue instanceof TuiDay) {
|
|
135
|
+
const range = TuiDayRange.sort(this.currentValue, day);
|
|
136
|
+
this.currentValue = range;
|
|
129
137
|
this.itemChange.emit(this.findItemByDayRange(range));
|
|
130
138
|
this.updateValue(range);
|
|
131
139
|
}
|
|
132
140
|
else {
|
|
133
|
-
this.
|
|
141
|
+
this.currentValue = day;
|
|
134
142
|
}
|
|
135
143
|
}
|
|
136
144
|
updateValue(value) {
|
|
137
|
-
this.
|
|
145
|
+
this.currentValue = value;
|
|
138
146
|
this.valueChange.emit(value);
|
|
139
147
|
}
|
|
140
148
|
get activePeriod() {
|
|
141
149
|
return (this.item ??
|
|
142
150
|
this.selectedActivePeriod ??
|
|
143
|
-
(this.items.find((item) => tuiNullableSame(this.
|
|
144
|
-
? new TuiDayRange(this.
|
|
145
|
-
: this.
|
|
151
|
+
(this.items.find((item) => tuiNullableSame(this.currentValue instanceof TuiDay
|
|
152
|
+
? new TuiDayRange(this.currentValue, this.currentValue)
|
|
153
|
+
: this.currentValue, item.range, (a, b) => a.from.daySame(b.from.dayLimit(this.min, this.max)) &&
|
|
146
154
|
a.to.daySame(b.to.dayLimit(this.min, this.max)))) ||
|
|
147
155
|
null));
|
|
148
156
|
}
|
|
@@ -150,11 +158,13 @@ class TuiCalendarRange {
|
|
|
150
158
|
return calculateDisabledItemHandler(disabledItemHandler, value, minLength);
|
|
151
159
|
}
|
|
152
160
|
initDefaultViewedMonth() {
|
|
153
|
-
if (this.
|
|
154
|
-
this.month = this.
|
|
161
|
+
if (this.currentValue instanceof TuiDay) {
|
|
162
|
+
this.month = this.currentValue;
|
|
155
163
|
}
|
|
156
|
-
else if (this.
|
|
157
|
-
this.month = this.items.length
|
|
164
|
+
else if (this.currentValue) {
|
|
165
|
+
this.month = this.items.length
|
|
166
|
+
? this.currentValue.to
|
|
167
|
+
: this.currentValue.from;
|
|
158
168
|
}
|
|
159
169
|
else if (this.max && this.month.monthSameOrAfter(this.max)) {
|
|
160
170
|
this.month = this.items.length ? this.max : this.max.append({ month: -1 });
|
|
@@ -167,7 +177,10 @@ class TuiCalendarRange {
|
|
|
167
177
|
return this.items.find((item) => dayRange.daySame(item.range)) ?? null;
|
|
168
178
|
}
|
|
169
179
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiCalendarRange, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
170
|
-
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)" }
|
|
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: [
|
|
181
|
+
tuiAsAuxiliary(TuiCalendarRange),
|
|
182
|
+
tuiCalendarSheetOptionsProvider({ rangeMode: true }),
|
|
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 }); }
|
|
171
184
|
}
|
|
172
185
|
__decorate([
|
|
173
186
|
tuiPure
|
|
@@ -175,9 +188,13 @@ __decorate([
|
|
|
175
188
|
export { TuiCalendarRange };
|
|
176
189
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiCalendarRange, decorators: [{
|
|
177
190
|
type: Component,
|
|
178
|
-
args: [{ standalone: true, selector: 'tui-calendar-range', imports: [AsyncPipe, NgForOf, NgIf, TuiCalendar, TuiDataList, TuiIcon, TuiMapperPipe], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
191
|
+
args: [{ standalone: true, selector: 'tui-calendar-range', imports: [AsyncPipe, NgForOf, NgIf, TuiCalendar, TuiDataList, TuiIcon, TuiMapperPipe], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
192
|
+
tuiAsAuxiliary(TuiCalendarRange),
|
|
193
|
+
tuiCalendarSheetOptionsProvider({ rangeMode: true }),
|
|
194
|
+
], host: {
|
|
195
|
+
'[class._mobile]': 'mobile',
|
|
179
196
|
'(document:keydown.capture)': 'onEsc($event)',
|
|
180
|
-
}, template: "<tui-calendar\n automation-id=\"tui-calendar-range__calendar\"\n class
|
|
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"] }]
|
|
181
198
|
}], ctorParameters: function () { return []; }, propDecorators: { disabledItemHandler: [{
|
|
182
199
|
type: Input
|
|
183
200
|
}], markerHandler: [{
|
|
@@ -204,4 +221,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
204
221
|
}], defaultViewedMonth: [{
|
|
205
222
|
type: Input
|
|
206
223
|
}], calculateDisabledItemHandler: [] } });
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItcmFuZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvY2FsZW5kYXItcmFuZ2UvY2FsZW5kYXItcmFuZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvY2FsZW5kYXItcmFuZ2UvY2FsZW5kYXItcmFuZ2UudGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRTFELE9BQU8sRUFDSCxhQUFhLEVBQ2IsWUFBWSxFQUNaLE1BQU0sRUFDTixXQUFXLEVBQ1gsUUFBUSxHQUNYLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUV6RCxPQUFPLEVBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUV4RixPQUFPLEVBQ0gsV0FBVyxFQUNYLCtCQUErQixHQUNsQyxNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNoRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FB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S0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDM0UsQ0FBQzsrR0FyT1EsZ0JBQWdCO21HQUFoQixnQkFBZ0IseWRBTGQsQ0FBQywrQkFBK0IsQ0FBQyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDLCtDQzlDbkUsaXZFQXlEQSxpS0RmYyxTQUFTLDhDQUFFLE9BQU8sbUhBQUUsSUFBSSw2RkFBRSxXQUFXLHFqQkFBZSxPQUFPLGdGQUFFLGFBQWE7O0FBd041RTtJQURQLE9BQU87b0VBT1A7U0FyTlEsZ0JBQWdCOzRGQUFoQixnQkFBZ0I7a0JBWjVCLFNBQVM7aUNBQ00sSUFBSSxZQUNOLG9CQUFvQixXQUNyQixDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxtQkFHcEUsdUJBQXVCLENBQUMsTUFBTSxhQUNwQyxDQUFDLCtCQUErQixDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsUUFDekQ7d0JBQ0YsNEJBQTRCLEVBQUUsZUFBZTtxQkFDaEQ7MEVBa0JNLG1CQUFtQjtzQkFEekIsS0FBSztnQkFJQyxhQUFhO3NCQURuQixLQUFLO2dCQUlDLEtBQUs7c0JBRFgsS0FBSztnQkFJQyxHQUFHO3NCQURULEtBQUs7Z0JBSUMsR0FBRztzQkFEVCxLQUFLO2dCQUlDLFNBQVM7c0JBRGYsS0FBSztnQkFJQyxTQUFTO3NCQURmLEtBQUs7Z0JBSUMsSUFBSTtzQkFEVixLQUFLO2dCQUlVLFdBQVc7c0JBRDFCLE1BQU07Z0JBSVMsVUFBVTtzQkFEekIsTUFBTTtnQkFhSSxXQUFXO3NCQURyQixLQUFLO3VCQUFDLE9BQU87Z0JBTUgsa0JBQWtCO3NCQUQ1QixLQUFLO2dCQW9KRSw0QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jUGlwZSwgTmdGb3JPZiwgTmdJZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB0eXBlIHtPbkNoYW5nZXMsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtUVUlfRkFMU0VfSEFORExFUn0gZnJvbSAnQHRhaWdhLXVpL2Nkay9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUge1R1aURheUxpa2V9IGZyb20gJ0B0YWlnYS11aS9jZGsvZGF0ZS10aW1lJztcbmltcG9ydCB7XG4gICAgVFVJX0ZJUlNUX0RBWSxcbiAgICBUVUlfTEFTVF9EQVksXG4gICAgVHVpRGF5LFxuICAgIFR1aURheVJhbmdlLFxuICAgIFR1aU1vbnRoLFxufSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RhdGUtdGltZSc7XG5pbXBvcnQge3R1aVdhdGNofSBmcm9tICdAdGFpZ2EtdWkvY2RrL29ic2VydmFibGVzJztcbmltcG9ydCB7VHVpTWFwcGVyUGlwZX0gZnJvbSAnQHRhaWdhLXVpL2Nkay9waXBlcy9tYXBwZXInO1xuaW1wb3J0IHR5cGUge1R1aUJvb2xlYW5IYW5kbGVyLCBUdWlNYXBwZXJ9IGZyb20gJ0B0YWlnYS11aS9jZGsvdHlwZXMnO1xuaW1wb3J0IHt0dWlJc1N0cmluZywgdHVpTnVsbGFibGVTYW1lLCB0dWlQdXJlfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL21pc2NlbGxhbmVvdXMnO1xuaW1wb3J0IHR5cGUge1R1aU1hcmtlckhhbmRsZXJ9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvY2FsZW5kYXInO1xuaW1wb3J0IHtcbiAgICBUdWlDYWxlbmRhcixcbiAgICB0dWlDYWxlbmRhclNoZWV0T3B0aW9uc1Byb3ZpZGVyLFxufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2NhbGVuZGFyJztcbmltcG9ydCB7VHVpRGF0YUxpc3R9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvZGF0YS1saXN0JztcbmltcG9ydCB7VHVpSWNvbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7VFVJX0NPTU1PTl9JQ09OU30gZnJvbSAnQHRhaWdhLXVpL2NvcmUvdG9rZW5zJztcbmltcG9ydCB7VFVJX0NBTEVOREFSX0RBVEVfU1RSRUFNLCBUVUlfT1RIRVJfREFURV9URVhUfSBmcm9tICdAdGFpZ2EtdWkva2l0L3Rva2Vucyc7XG5pbXBvcnQgdHlwZSB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7Y2FsY3VsYXRlRGlzYWJsZWRJdGVtSGFuZGxlcn0gZnJvbSAnLi9jYWxjdWxhdGUtZGlzYWJsZWQtaXRlbS1oYW5kbGVyJztcbmltcG9ydCB7VFVJX0RBWV9DQVBTX01BUFBFUn0gZnJvbSAnLi9kYXktY2Fwcy1tYXBwZXInO1xuaW1wb3J0IHR5cGUge1R1aURheVJhbmdlUGVyaW9kfSBmcm9tICcuL2RheS1yYW5nZS1wZXJpb2QnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAndHVpLWNhbGVuZGFyLXJhbmdlJyxcbiAgICBpbXBvcnRzOiBbQXN5bmNQaXBlLCBOZ0Zvck9mLCBOZ0lmLCBUdWlDYWxlbmRhciwgVHVpRGF0YUxpc3QsIFR1aUljb24sIFR1aU1hcHBlclBpcGVdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci1yYW5nZS50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1yYW5nZS5zdHlsZS5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbdHVpQ2FsZW5kYXJTaGVldE9wdGlvbnNQcm92aWRlcih7cmFuZ2VNb2RlOiB0cnVlfSldLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyhkb2N1bWVudDprZXlkb3duLmNhcHR1cmUpJzogJ29uRXNjKCRldmVudCknLFxuICAgIH0sXG59KVxuZXhwb3J0IGNsYXNzIFR1aUNhbGVuZGFyUmFuZ2UgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGBpdGVtYFxuICAgICAqL1xuICAgIHByaXZhdGUgc2VsZWN0ZWRQZXJpb2Q6IFR1aURheVJhbmdlUGVyaW9kIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcm90ZWN0ZWQgdmFsdWU6IFR1aURheSB8IFR1aURheVJhbmdlIHwgbnVsbCA9IG51bGw7XG4gICAgcHJvdGVjdGVkIHByZXZpb3VzVmFsdWU6IFR1aURheSB8IFR1aURheVJhbmdlIHwgbnVsbCA9IG51bGw7XG4gICAgcHJvdGVjdGVkIGhvdmVyZWRJdGVtOiBUdWlEYXkgfCBudWxsID0gbnVsbDtcbiAgICBwcm90ZWN0ZWQgbW9udGg6IFR1aU1vbnRoID0gVHVpTW9udGguY3VycmVudExvY2FsKCk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3RoZXJEYXRlVGV4dCQgPSBpbmplY3QoVFVJX09USEVSX0RBVEVfVEVYVCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGljb25zID0gaW5qZWN0KFRVSV9DT01NT05fSUNPTlMpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjYXBzTWFwcGVyID0gVFVJX0RBWV9DQVBTX01BUFBFUjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpc2FibGVkSXRlbUhhbmRsZXI6IFR1aUJvb2xlYW5IYW5kbGVyPFR1aURheT4gPSBUVUlfRkFMU0VfSEFORExFUjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1hcmtlckhhbmRsZXI6IFR1aU1hcmtlckhhbmRsZXIgfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGl0ZW1zOiByZWFkb25seSBUdWlEYXlSYW5nZVBlcmlvZFtdID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtaW46IFR1aURheSB8IG51bGwgPSBUVUlfRklSU1RfREFZO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWF4OiBUdWlEYXkgfCBudWxsID0gVFVJX0xBU1RfREFZO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWluTGVuZ3RoOiBUdWlEYXlMaWtlIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtYXhMZW5ndGg6IFR1aURheUxpa2UgfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGl0ZW06IFR1aURheVJhbmdlUGVyaW9kIHwgbnVsbCA9IG51bGw7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFR1aURheVJhbmdlIHwgbnVsbD4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBpdGVtQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUdWlEYXlSYW5nZVBlcmlvZCB8IG51bGw+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgaW5qZWN0PE9ic2VydmFibGU8VHVpRGF5UmFuZ2UgfCBudWxsPj4oVFVJX0NBTEVOREFSX0RBVEVfU1RSRUFNLCB7b3B0aW9uYWw6IHRydWV9KVxuICAgICAgICAgICAgPy5waXBlKHR1aVdhdGNoKCksIHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0RGVmYXVsdFZpZXdlZE1vbnRoKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoJ3ZhbHVlJylcbiAgICBwdWJsaWMgc2V0IHZhbHVlU2V0dGVyKHZhbHVlOiBUdWlEYXlSYW5nZSB8IG51bGwpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBkZWZhdWx0Vmlld2VkTW9udGgobW9udGg6IFR1aU1vbnRoKSB7XG4gICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5tb250aCA9IG1vbnRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkZWZhdWx0Vmlld2VkTW9udGgoKTogVHVpTW9udGgge1xuICAgICAgICByZXR1cm4gdGhpcy5tb250aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgYGl0ZW1gXG4gICAgICovXG4gICAgcHVibGljIGdldCBzZWxlY3RlZEFjdGl2ZVBlcmlvZCgpOiBUdWlEYXlSYW5nZVBlcmlvZCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFBlcmlvZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgYGl0ZW1gXG4gICAgICovXG4gICAgcHVibGljIHNldCBzZWxlY3RlZEFjdGl2ZVBlcmlvZChwZXJpb2Q6IFR1aURheVJhbmdlUGVyaW9kIHwgbnVsbCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUGVyaW9kID0gcGVyaW9kO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmluaXREZWZhdWx0Vmlld2VkTW9udGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0RGVmYXVsdFZpZXdlZE1vbnRoKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBjYWxjdWxhdGVkRGlzYWJsZWRJdGVtSGFuZGxlcigpOiBUdWlCb29sZWFuSGFuZGxlcjxUdWlEYXk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlRGlzYWJsZWRJdGVtSGFuZGxlcihcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWRJdGVtSGFuZGxlcixcbiAgICAgICAgICAgIHRoaXMudmFsdWUsXG4gICAgICAgICAgICB0aGlzLm1pbkxlbmd0aCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25Fc2MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSAhPT0gJ0VzY2FwZScgfHwgISh0aGlzLnZhbHVlIGluc3RhbmNlb2YgVHVpRGF5KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnByZXZpb3VzVmFsdWU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbnRoT2Zmc2V0OiBUdWlNYXBwZXI8W1R1aU1vbnRoLCBudW1iZXJdLCBUdWlNb250aD4gPSAoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBtb250aCxcbiAgICApID0+IHZhbHVlLmFwcGVuZCh7bW9udGh9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXBwZXI6IFR1aU1hcHBlcjxcbiAgICAgICAgW1xuICAgICAgICAgICAgcmVhZG9ubHkgVHVpRGF5UmFuZ2VQZXJpb2RbXSxcbiAgICAgICAgICAgIFR1aURheSB8IG51bGwsXG4gICAgICAgICAgICBUdWlEYXkgfCBudWxsLFxuICAgICAgICAgICAgVHVpRGF5TGlrZSB8IG51bGwsXG4gICAgICAgICAgICBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgICAgICBdLFxuICAgICAgICBSZWFkb25seUFycmF5PFR1aURheVJhbmdlUGVyaW9kIHwgc3RyaW5nPlxuICAgID4gPSAoaXRlbXMsIG1pbiwgbWF4LCBtaW5MZW5ndGgsIG90aGVyRGF0ZVRleHQpID0+IFtcbiAgICAgICAgLi4uaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgKG1pbkxlbmd0aCA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICBpdGVtLnJhbmdlLmZyb21cbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobWluTGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCh7ZGF5OiAtMX0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGF5U2FtZU9yQmVmb3JlKGl0ZW0ucmFuZ2UudG8pKSAmJlxuICAgICAgICAgICAgICAgIChtaW4gPT09IG51bGwgfHwgaXRlbS5yYW5nZS50by5kYXlTYW1lT3JBZnRlcihtaW4pKSAmJlxuICAgICAgICAgICAgICAgIChtYXggPT09IG51bGwgfHwgaXRlbS5yYW5nZS5mcm9tLmRheVNhbWVPckJlZm9yZShtYXgpKSxcbiAgICAgICAgKSxcbiAgICAgICAgb3RoZXJEYXRlVGV4dCB8fCAnJyxcbiAgICBdO1xuXG4gICAgcHJvdGVjdGVkIGlzSXRlbUFjdGl2ZShpdGVtOiBUdWlEYXlSYW5nZVBlcmlvZCB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB7YWN0aXZlUGVyaW9kfSA9IHRoaXM7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh0dWlJc1N0cmluZyhpdGVtKSAmJiBhY3RpdmVQZXJpb2QgPT09IG51bGwpIHx8XG4gICAgICAgICAgICBhY3RpdmVQZXJpb2QgPT09IGl0ZW0gfHxcbiAgICAgICAgICAgIGFjdGl2ZVBlcmlvZD8udG9TdHJpbmcoKSA9PT0gaXRlbS50b1N0cmluZygpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uSXRlbVNlbGVjdChpdGVtOiBUdWlEYXlSYW5nZVBlcmlvZCB8IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXR1aUlzU3RyaW5nKGl0ZW0pKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQWN0aXZlUGVyaW9kID0gaXRlbTtcbiAgICAgICAgICAgIHRoaXMuaXRlbUNoYW5nZS5lbWl0KGl0ZW0pO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShpdGVtLnJhbmdlLmRheUxpbWl0KHRoaXMubWluLCB0aGlzLm1heCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlUGVyaW9kICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQWN0aXZlUGVyaW9kID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuaXRlbUNoYW5nZS5lbWl0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdERlZmF1bHRWaWV3ZWRNb250aCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbk1vbnRoQ2hhbmdlKG1vbnRoOiBUdWlNb250aCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vbnRoID0gbW9udGg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRGF5Q2xpY2soZGF5OiBUdWlEYXkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEFjdGl2ZVBlcmlvZCA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBUdWlEYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gVHVpRGF5UmFuZ2Uuc29ydCh0aGlzLnZhbHVlLCBkYXkpO1xuXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gcmFuZ2U7XG4gICAgICAgICAgICB0aGlzLml0ZW1DaGFuZ2UuZW1pdCh0aGlzLmZpbmRJdGVtQnlEYXlSYW5nZShyYW5nZSkpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShyYW5nZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gZGF5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHVwZGF0ZVZhbHVlKHZhbHVlOiBUdWlEYXlSYW5nZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGFjdGl2ZVBlcmlvZCgpOiBUdWlEYXlSYW5nZVBlcmlvZCB8IG51bGwge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5pdGVtID8/XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQWN0aXZlUGVyaW9kID8/XG4gICAgICAgICAgICAodGhpcy5pdGVtcy5maW5kKChpdGVtKSA9PlxuICAgICAgICAgICAgICAgIHR1aU51bGxhYmxlU2FtZTxUdWlEYXlSYW5nZT4oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgaW5zdGFuY2VvZiBUdWlEYXlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFR1aURheVJhbmdlKHRoaXMudmFsdWUsIHRoaXMudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucmFuZ2UsXG4gICAgICAgICAgICAgICAgICAgIChhLCBiKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgYS5mcm9tLmRheVNhbWUoYi5mcm9tLmRheUxpbWl0KHRoaXMubWluLCB0aGlzLm1heCkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBhLnRvLmRheVNhbWUoYi50by5kYXlMaW1pdCh0aGlzLm1pbiwgdGhpcy5tYXgpKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSB8fFxuICAgICAgICAgICAgICAgIG51bGwpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgQHR1aVB1cmVcbiAgICBwcml2YXRlIGNhbGN1bGF0ZURpc2FibGVkSXRlbUhhbmRsZXIoXG4gICAgICAgIGRpc2FibGVkSXRlbUhhbmRsZXI6IFR1aUJvb2xlYW5IYW5kbGVyPFR1aURheT4sXG4gICAgICAgIHZhbHVlOiBUdWlEYXkgfCBUdWlEYXlSYW5nZSB8IG51bGwsXG4gICAgICAgIG1pbkxlbmd0aDogVHVpRGF5TGlrZSB8IG51bGwsXG4gICAgKTogVHVpQm9vbGVhbkhhbmRsZXI8VHVpRGF5PiB7XG4gICAgICAgIHJldHVybiBjYWxjdWxhdGVEaXNhYmxlZEl0ZW1IYW5kbGVyKGRpc2FibGVkSXRlbUhhbmRsZXIsIHZhbHVlLCBtaW5MZW5ndGgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdERlZmF1bHRWaWV3ZWRNb250aCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBUdWlEYXkpIHtcbiAgICAgICAgICAgIHRoaXMubW9udGggPSB0aGlzLnZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMubW9udGggPSB0aGlzLml0ZW1zLmxlbmd0aCA/IHRoaXMudmFsdWUudG8gOiB0aGlzLnZhbHVlLmZyb207XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXggJiYgdGhpcy5tb250aC5tb250aFNhbWVPckFmdGVyKHRoaXMubWF4KSkge1xuICAgICAgICAgICAgdGhpcy5tb250aCA9IHRoaXMuaXRlbXMubGVuZ3RoID8gdGhpcy5tYXggOiB0aGlzLm1heC5hcHBlbmQoe21vbnRoOiAtMX0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWluICYmIHRoaXMubW9udGgubW9udGhTYW1lT3JCZWZvcmUodGhpcy5taW4pKSB7XG4gICAgICAgICAgICB0aGlzLm1vbnRoID0gdGhpcy5taW47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRJdGVtQnlEYXlSYW5nZShkYXlSYW5nZTogVHVpRGF5UmFuZ2UpOiBUdWlEYXlSYW5nZVBlcmlvZCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtcy5maW5kKChpdGVtKSA9PiBkYXlSYW5nZS5kYXlTYW1lKGl0ZW0ucmFuZ2UpKSA/PyBudWxsO1xuICAgIH1cbn1cbiIsIjx0dWktY2FsZW5kYXJcbiAgICBhdXRvbWF0aW9uLWlkPVwidHVpLWNhbGVuZGFyLXJhbmdlX19jYWxlbmRhclwiXG4gICAgY2xhc3M9XCJ0LWNhbGVuZGFyXCJcbiAgICBbZGlzYWJsZWRJdGVtSGFuZGxlcl09XCJjYWxjdWxhdGVkRGlzYWJsZWRJdGVtSGFuZGxlclwiXG4gICAgW21hcmtlckhhbmRsZXJdPVwibWFya2VySGFuZGxlclwiXG4gICAgW21heF09XCJtYXggfCB0dWlNYXBwZXI6IGNhcHNNYXBwZXIgOiB2YWx1ZSA6IG1heExlbmd0aCA6IGZhbHNlXCJcbiAgICBbbWF4Vmlld2VkTW9udGhdPVwiaXRlbXMubGVuZ3RoID8gbnVsbCA6IChkZWZhdWx0Vmlld2VkTW9udGggfCB0dWlNYXBwZXI6IG1vbnRoT2Zmc2V0IDogLTEpXCJcbiAgICBbbWluXT1cIm1pbiB8IHR1aU1hcHBlcjogY2Fwc01hcHBlciA6IHZhbHVlIDogbWF4TGVuZ3RoIDogdHJ1ZVwiXG4gICAgW21vbnRoXT1cImRlZmF1bHRWaWV3ZWRNb250aFwiXG4gICAgW3Nob3dBZGphY2VudF09XCIhIWl0ZW1zLmxlbmd0aFwiXG4gICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICBbKGhvdmVyZWRJdGVtKV09XCJob3ZlcmVkSXRlbVwiXG4gICAgKGRheUNsaWNrKT1cIm9uRGF5Q2xpY2soJGV2ZW50KVwiXG4gICAgKG1vbnRoQ2hhbmdlKT1cIm9uTW9udGhDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKG1vdXNlZG93bi5wcmV2ZW50LnpvbmVsZXNzKT1cIigwKVwiXG4vPlxuPHR1aS1jYWxlbmRhclxuICAgICpuZ0lmPVwiIWl0ZW1zLmxlbmd0aDsgZWxzZSBwcmVzZXRzXCJcbiAgICBbZGlzYWJsZWRJdGVtSGFuZGxlcl09XCJjYWxjdWxhdGVkRGlzYWJsZWRJdGVtSGFuZGxlclwiXG4gICAgW21hcmtlckhhbmRsZXJdPVwibWFya2VySGFuZGxlclwiXG4gICAgW21heF09XCJtYXggfCB0dWlNYXBwZXI6IGNhcHNNYXBwZXIgOiB2YWx1ZSA6IG1heExlbmd0aCA6IGZhbHNlXCJcbiAgICBbbWluXT1cIm1pbiB8IHR1aU1hcHBlcjogY2Fwc01hcHBlciA6IHZhbHVlIDogbWF4TGVuZ3RoIDogdHJ1ZVwiXG4gICAgW21pblZpZXdlZE1vbnRoXT1cImRlZmF1bHRWaWV3ZWRNb250aCB8IHR1aU1hcHBlcjogbW9udGhPZmZzZXQgOiAxXCJcbiAgICBbbW9udGhdPVwiZGVmYXVsdFZpZXdlZE1vbnRoIHwgdHVpTWFwcGVyOiBtb250aE9mZnNldCA6IDFcIlxuICAgIFtzaG93QWRqYWNlbnRdPVwiZmFsc2VcIlxuICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgWyhob3ZlcmVkSXRlbSldPVwiaG92ZXJlZEl0ZW1cIlxuICAgIChkYXlDbGljayk9XCJvbkRheUNsaWNrKCRldmVudClcIlxuICAgIChtb250aENoYW5nZSk9XCJvbk1vbnRoQ2hhbmdlKCRldmVudC5hcHBlbmQoe21vbnRoOiAtMX0pKVwiXG4gICAgKG1vdXNlZG93bi5wcmV2ZW50LnpvbmVsZXNzKT1cIigwKVwiXG4vPlxuPG5nLXRlbXBsYXRlICNwcmVzZXRzPlxuICAgIDx0dWktZGF0YS1saXN0XG4gICAgICAgIGF1dG9tYXRpb24taWQ9XCJ0dWktY2FsZW5kYXItcmFuZ2VfX21lbnVcIlxuICAgICAgICByb2xlPVwibWVudVwiXG4gICAgICAgIFtzdHlsZS5mbGV4XT1cIjFcIlxuICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXMgfCB0dWlNYXBwZXI6IG1hcHBlciA6IG1pbiA6IG1heCA6IG1pbkxlbmd0aCA6IChvdGhlckRhdGVUZXh0JCB8IGFzeW5jKVwiXG4gICAgICAgICAgICBhdXRvbWF0aW9uLWlkPVwidHVpLWNhbGVuZGFyLXJhbmdlX19tZW51X19pdGVtXCJcbiAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbXJhZGlvXCJcbiAgICAgICAgICAgIHR1aU9wdGlvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiaXNJdGVtQWN0aXZlKGl0ZW0pXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkl0ZW1TZWxlY3QoaXRlbSlcIlxuICAgICAgICAgICAgKG1vdXNlZG93bi5wcmV2ZW50LnpvbmVsZXNzKT1cIigwKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7IGl0ZW0gfX1cbiAgICAgICAgICAgIDx0dWktaWNvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNJdGVtQWN0aXZlKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICBhdXRvbWF0aW9uLWlkPVwidHVpLWNhbGVuZGFyLXJhbmdlX19jaGVja21hcmtcIlxuICAgICAgICAgICAgICAgIFtpY29uXT1cImljb25zLmNoZWNrXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuZm9udC1zaXplLnJlbV09XCIxXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvdHVpLWRhdGEtbGlzdD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
224
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItcmFuZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvY2FsZW5kYXItcmFuZ2UvY2FsZW5kYXItcmFuZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvY2FsZW5kYXItcmFuZ2UvY2FsZW5kYXItcmFuZ2UudGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRCxPQUFPLEVBQ0gsYUFBYSxFQUNiLFlBQVksRUFDWixNQUFNLEVBQ04sV0FBVyxFQUNYLFFBQVEsR0FDWCxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBRXhGLE9BQU8sRUFDSCxXQUFXLEVBQ1gsK0JBQStCLEdBQ2xDLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDdkUsT0FBTyxFQUFDLHdCQUF3QixFQUFFLG1CQUFtQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHbkYsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDL0UsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7OztBQUd0RCxNQWdCYSxnQkFBZ0I7SUErQ3pCO1FBOUNBOztXQUVHO1FBQ0ssbUJBQWMsR0FBNkIsSUFBSSxDQUFDO1FBQ3ZDLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUV2QyxpQkFBWSxHQUFnQyxJQUFJLENBQUM7UUFDakQsa0JBQWEsR0FBZ0MsSUFBSSxDQUFDO1FBQ2xELGdCQUFXLEdBQWtCLElBQUksQ0FBQztRQUNsQyxVQUFLLEdBQWEsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRWpDLG1CQUFjLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDN0MsVUFBSyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2pDLGVBQVUsR0FBRyxtQkFBbUIsQ0FBQztRQUNqQyxXQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRzNDLHdCQUFtQixHQUE4QixpQkFBaUIsQ0FBQztRQUduRSxrQkFBYSxHQUE0QixJQUFJLENBQUM7UUFHOUMsVUFBSyxHQUFpQyxFQUFFLENBQUM7UUFHekMsUUFBRyxHQUFrQixhQUFhLENBQUM7UUFHbkMsUUFBRyxHQUFrQixZQUFZLENBQUM7UUFHbEMsY0FBUyxHQUFzQixJQUFJLENBQUM7UUFHcEMsY0FBUyxHQUFzQixJQUFJLENBQUM7UUFHcEMsU0FBSSxHQUE2QixJQUFJLENBQUM7UUFHN0IsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQUdyRCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUEwRXZELGdCQUFXLEdBQTRDLENBQ3RFLEtBQUssRUFDTCxLQUFLLEVBQ1AsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBRVIsV0FBTSxHQVNyQixDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDO1lBQy9DLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FDWCxDQUFDLElBQUksRUFBRSxFQUFFLENBQ0wsQ0FBQyxTQUFTLEtBQUssSUFBSTtnQkFDZixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7cUJBQ1YsTUFBTSxDQUFDLFNBQVMsQ0FBQztxQkFDakIsTUFBTSxDQUFDLEVBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUM7cUJBQ2pCLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDLEdBQUcsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDLEdBQUcsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQzdEO1lBQ0QsYUFBYSxJQUFJLEVBQUU7U0FDdEIsQ0FBQztRQWpHRSxNQUFNLENBQWlDLHdCQUF3QixFQUFFLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxDQUFDO1lBQzlFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLGtCQUFrQixFQUFFLENBQUM7YUFDdkMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsSUFDVyxXQUFXLENBQUMsS0FBeUI7UUFDNUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQ1csa0JBQWtCLENBQUMsS0FBZTtRQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztTQUN0QjtJQUNMLENBQUM7SUFFRCxJQUFXLEtBQUssQ0FBQyxLQUF5QjtRQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFXLGtCQUFrQjtRQUN6QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxvQkFBb0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsb0JBQW9CLENBQUMsTUFBZ0M7UUFDNUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUM7SUFDakMsQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNwQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztTQUNqQztJQUNMLENBQUM7SUFFTSxRQUFRO1FBQ1gsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQWMsNkJBQTZCO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUNwQyxJQUFJLENBQUMsbUJBQW1CLEVBQ3hCLElBQUksQ0FBQyxZQUFZLEVBQ2pCLElBQUksQ0FBQyxTQUFTLENBQ2pCLENBQUM7SUFDTixDQUFDO0lBRVMsS0FBSyxDQUFDLEtBQW9CO1FBQ2hDLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLFlBQVksTUFBTSxDQUFDLEVBQUU7WUFDbEUsT0FBTztTQUNWO1FBRUQsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUMzQyxDQUFDO0lBOEJTLFlBQVksQ0FBQyxJQUFnQztRQUNuRCxNQUFNLEVBQUMsWUFBWSxFQUFDLEdBQUcsSUFBSSxDQUFDO1FBRTVCLE9BQU8sQ0FDSCxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLEtBQUssSUFBSSxDQUFDO1lBQzVDLFlBQVksS0FBSyxJQUFJO1lBQ3JCLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQy9DLENBQUM7SUFDTixDQUFDO0lBRVMsWUFBWSxDQUFDLElBQWdDO1FBQ25ELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDcEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDN0Q7YUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxFQUFFO1lBQ25DLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMxQjtRQUVELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFUyxhQUFhLENBQUMsS0FBZTtRQUNuQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBRVMsVUFBVSxDQUFDLEdBQVc7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFFakMsSUFBSSxJQUFJLENBQUMsWUFBWSxZQUFZLE1BQU0sRUFBRTtZQUNyQyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMzQjthQUFNO1lBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7U0FDM0I7SUFDTCxDQUFDO0lBRVMsV0FBVyxDQUFDLEtBQXlCO1FBQzNDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFZLFlBQVk7UUFDcEIsT0FBTyxDQUNILElBQUksQ0FBQyxJQUFJO1lBQ1QsSUFBSSxDQUFDLG9CQUFvQjtZQUN6QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDdEIsZUFBZSxDQUNYLElBQUksQ0FBQyxZQUFZLFlBQVksTUFBTTtnQkFDL0IsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDdkQsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQ3ZCLElBQUksQ0FBQyxLQUFLLEVBQ1YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDTCxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDdEQsQ0FDSjtnQkFDRyxJQUFJLENBQUMsQ0FDWixDQUFDO0lBQ04sQ0FBQztJQUdPLDRCQUE0QixDQUNoQyxtQkFBOEMsRUFDOUMsS0FBa0MsRUFDbEMsU0FBNEI7UUFFNUIsT0FBTyw0QkFBNEIsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVPLHNCQUFzQjtRQUMxQixJQUFJLElBQUksQ0FBQyxZQUFZLFlBQVksTUFBTSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztTQUNsQzthQUFNLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtnQkFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO1NBQ2hDO2FBQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzFELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztTQUM1RTthQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMzRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7U0FDekI7SUFDTCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsUUFBcUI7UUFDNUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDM0UsQ0FBQzsrR0EvT1EsZ0JBQWdCO21HQUFoQixnQkFBZ0Isb2dCQVRkO1lBQ1AsY0FBYyxDQUFDLGdCQUFnQixDQUFDO1lBQ2hDLCtCQUErQixDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDO1NBQ3JELCtDQ25ETCw2d0VBd0RBLCtLRFpjLFNBQVMsOENBQUUsT0FBTyxtSEFBRSxJQUFJLDZGQUFFLFdBQVcscWpCQUFlLE9BQU8sZ0ZBQUUsYUFBYTs7QUFvTzVFO0lBRFAsT0FBTztvRUFPUDtTQTdOUSxnQkFBZ0I7NEZBQWhCLGdCQUFnQjtrQkFoQjVCLFNBQVM7aUNBQ00sSUFBSSxZQUNOLG9CQUFvQixXQUNyQixDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxtQkFHcEUsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDUCxjQUFjLGtCQUFrQjt3QkFDaEMsK0JBQStCLENBQUMsRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUM7cUJBQ3JELFFBQ0s7d0JBQ0YsaUJBQWlCLEVBQUUsUUFBUTt3QkFDM0IsNEJBQTRCLEVBQUUsZUFBZTtxQkFDaEQ7MEVBb0JNLG1CQUFtQjtzQkFEekIsS0FBSztnQkFJQyxhQUFhO3NCQURuQixLQUFLO2dCQUlDLEtBQUs7c0JBRFgsS0FBSztnQkFJQyxHQUFHO3NCQURULEtBQUs7Z0JBSUMsR0FBRztzQkFEVCxLQUFLO2dCQUlDLFNBQVM7c0JBRGYsS0FBSztnQkFJQyxTQUFTO3NCQURmLEtBQUs7Z0JBSUMsSUFBSTtzQkFEVixLQUFLO2dCQUlVLFdBQVc7c0JBRDFCLE1BQU07Z0JBSVMsVUFBVTtzQkFEekIsTUFBTTtnQkFhSSxXQUFXO3NCQURyQixLQUFLO3VCQUFDLE9BQU87Z0JBTUgsa0JBQWtCO3NCQUQ1QixLQUFLO2dCQTBKRSw0QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jUGlwZSwgTmdGb3JPZiwgTmdJZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB0eXBlIHtPbkNoYW5nZXMsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtUVUlfRkFMU0VfSEFORExFUn0gZnJvbSAnQHRhaWdhLXVpL2Nkay9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUge1R1aURheUxpa2V9IGZyb20gJ0B0YWlnYS11aS9jZGsvZGF0ZS10aW1lJztcbmltcG9ydCB7XG4gICAgVFVJX0ZJUlNUX0RBWSxcbiAgICBUVUlfTEFTVF9EQVksXG4gICAgVHVpRGF5LFxuICAgIFR1aURheVJhbmdlLFxuICAgIFR1aU1vbnRoLFxufSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RhdGUtdGltZSc7XG5pbXBvcnQge3R1aVdhdGNofSBmcm9tICdAdGFpZ2EtdWkvY2RrL29ic2VydmFibGVzJztcbmltcG9ydCB7VHVpTWFwcGVyUGlwZX0gZnJvbSAnQHRhaWdhLXVpL2Nkay9waXBlcy9tYXBwZXInO1xuaW1wb3J0IHtUVUlfSVNfTU9CSUxFfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3Rva2Vucyc7XG5pbXBvcnQgdHlwZSB7VHVpQm9vbGVhbkhhbmRsZXIsIFR1aU1hcHBlcn0gZnJvbSAnQHRhaWdhLXVpL2Nkay90eXBlcyc7XG5pbXBvcnQge3R1aUlzU3RyaW5nLCB0dWlOdWxsYWJsZVNhbWUsIHR1aVB1cmV9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWlzY2VsbGFuZW91cyc7XG5pbXBvcnQgdHlwZSB7VHVpTWFya2VySGFuZGxlcn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9jYWxlbmRhcic7XG5pbXBvcnQge1xuICAgIFR1aUNhbGVuZGFyLFxuICAgIHR1aUNhbGVuZGFyU2hlZXRPcHRpb25zUHJvdmlkZXIsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvY2FsZW5kYXInO1xuaW1wb3J0IHtUdWlEYXRhTGlzdH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9kYXRhLWxpc3QnO1xuaW1wb3J0IHtUdWlJY29ufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2ljb24nO1xuaW1wb3J0IHtUVUlfQ09NTU9OX0lDT05TLCB0dWlBc0F1eGlsaWFyeX0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvdG9rZW5zJztcbmltcG9ydCB7VFVJX0NBTEVOREFSX0RBVEVfU1RSRUFNLCBUVUlfT1RIRVJfREFURV9URVhUfSBmcm9tICdAdGFpZ2EtdWkva2l0L3Rva2Vucyc7XG5pbXBvcnQgdHlwZSB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7Y2FsY3VsYXRlRGlzYWJsZWRJdGVtSGFuZGxlcn0gZnJvbSAnLi9jYWxjdWxhdGUtZGlzYWJsZWQtaXRlbS1oYW5kbGVyJztcbmltcG9ydCB7VFVJX0RBWV9DQVBTX01BUFBFUn0gZnJvbSAnLi9kYXktY2Fwcy1tYXBwZXInO1xuaW1wb3J0IHR5cGUge1R1aURheVJhbmdlUGVyaW9kfSBmcm9tICcuL2RheS1yYW5nZS1wZXJpb2QnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAndHVpLWNhbGVuZGFyLXJhbmdlJyxcbiAgICBpbXBvcnRzOiBbQXN5bmNQaXBlLCBOZ0Zvck9mLCBOZ0lmLCBUdWlDYWxlbmRhciwgVHVpRGF0YUxpc3QsIFR1aUljb24sIFR1aU1hcHBlclBpcGVdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci1yYW5nZS50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1yYW5nZS5zdHlsZS5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHR1aUFzQXV4aWxpYXJ5KFR1aUNhbGVuZGFyUmFuZ2UpLFxuICAgICAgICB0dWlDYWxlbmRhclNoZWV0T3B0aW9uc1Byb3ZpZGVyKHtyYW5nZU1vZGU6IHRydWV9KSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1tjbGFzcy5fbW9iaWxlXSc6ICdtb2JpbGUnLFxuICAgICAgICAnKGRvY3VtZW50OmtleWRvd24uY2FwdHVyZSknOiAnb25Fc2MoJGV2ZW50KScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpQ2FsZW5kYXJSYW5nZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgYGl0ZW1gXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZWxlY3RlZFBlcmlvZDogVHVpRGF5UmFuZ2VQZXJpb2QgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgICBwcm90ZWN0ZWQgY3VycmVudFZhbHVlOiBUdWlEYXkgfCBUdWlEYXlSYW5nZSB8IG51bGwgPSBudWxsO1xuICAgIHByb3RlY3RlZCBwcmV2aW91c1ZhbHVlOiBUdWlEYXkgfCBUdWlEYXlSYW5nZSB8IG51bGwgPSBudWxsO1xuICAgIHByb3RlY3RlZCBob3ZlcmVkSXRlbTogVHVpRGF5IHwgbnVsbCA9IG51bGw7XG4gICAgcHJvdGVjdGVkIG1vbnRoOiBUdWlNb250aCA9IFR1aU1vbnRoLmN1cnJlbnRMb2NhbCgpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG90aGVyRGF0ZVRleHQkID0gaW5qZWN0KFRVSV9PVEhFUl9EQVRFX1RFWFQpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpY29ucyA9IGluamVjdChUVUlfQ09NTU9OX0lDT05TKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2Fwc01hcHBlciA9IFRVSV9EQVlfQ0FQU19NQVBQRVI7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vYmlsZSA9IGluamVjdChUVUlfSVNfTU9CSUxFKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpc2FibGVkSXRlbUhhbmRsZXI6IFR1aUJvb2xlYW5IYW5kbGVyPFR1aURheT4gPSBUVUlfRkFMU0VfSEFORExFUjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1hcmtlckhhbmRsZXI6IFR1aU1hcmtlckhhbmRsZXIgfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGl0ZW1zOiByZWFkb25seSBUdWlEYXlSYW5nZVBlcmlvZFtdID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtaW46IFR1aURheSB8IG51bGwgPSBUVUlfRklSU1RfREFZO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWF4OiBUdWlEYXkgfCBudWxsID0gVFVJX0xBU1RfREFZO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWluTGVuZ3RoOiBUdWlEYXlMaWtlIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtYXhMZW5ndGg6IFR1aURheUxpa2UgfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGl0ZW06IFR1aURheVJhbmdlUGVyaW9kIHwgbnVsbCA9IG51bGw7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFR1aURheVJhbmdlIHwgbnVsbD4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBpdGVtQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUdWlEYXlSYW5nZVBlcmlvZCB8IG51bGw+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgaW5qZWN0PE9ic2VydmFibGU8VHVpRGF5UmFuZ2UgfCBudWxsPj4oVFVJX0NBTEVOREFSX0RBVEVfU1RSRUFNLCB7b3B0aW9uYWw6IHRydWV9KVxuICAgICAgICAgICAgPy5waXBlKHR1aVdhdGNoKCksIHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdERlZmF1bHRWaWV3ZWRNb250aCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCd2YWx1ZScpXG4gICAgcHVibGljIHNldCB2YWx1ZVNldHRlcih2YWx1ZTogVHVpRGF5UmFuZ2UgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGRlZmF1bHRWaWV3ZWRNb250aChtb250aDogVHVpTW9udGgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5tb250aCA9IG1vbnRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogVHVpRGF5UmFuZ2UgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmluaXREZWZhdWx0Vmlld2VkTW9udGgoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRWaWV3ZWRNb250aCgpOiBUdWlNb250aCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vbnRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBgaXRlbWBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkQWN0aXZlUGVyaW9kKCk6IFR1aURheVJhbmdlUGVyaW9kIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUGVyaW9kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBgaXRlbWBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkQWN0aXZlUGVyaW9kKHBlcmlvZDogVHVpRGF5UmFuZ2VQZXJpb2QgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQZXJpb2QgPSBwZXJpb2Q7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmluaXREZWZhdWx0Vmlld2VkTW9udGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0RGVmYXVsdFZpZXdlZE1vbnRoKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBjYWxjdWxhdGVkRGlzYWJsZWRJdGVtSGFuZGxlcigpOiBUdWlCb29sZWFuSGFuZGxlcjxUdWlEYXk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlRGlzYWJsZWRJdGVtSGFuZGxlcihcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWRJdGVtSGFuZGxlcixcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgdGhpcy5taW5MZW5ndGgsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRXNjKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgIT09ICdFc2NhcGUnIHx8ICEodGhpcy5jdXJyZW50VmFsdWUgaW5zdGFuY2VvZiBUdWlEYXkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0aGlzLnByZXZpb3VzVmFsdWU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbnRoT2Zmc2V0OiBUdWlNYXBwZXI8W1R1aU1vbnRoLCBudW1iZXJdLCBUdWlNb250aD4gPSAoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBtb250aCxcbiAgICApID0+IHZhbHVlLmFwcGVuZCh7bW9udGh9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXBwZXI6IFR1aU1hcHBlcjxcbiAgICAgICAgW1xuICAgICAgICAgICAgcmVhZG9ubHkgVHVpRGF5UmFuZ2VQZXJpb2RbXSxcbiAgICAgICAgICAgIFR1aURheSB8IG51bGwsXG4gICAgICAgICAgICBUdWlEYXkgfCBudWxsLFxuICAgICAgICAgICAgVHVpRGF5TGlrZSB8IG51bGwsXG4gICAgICAgICAgICBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgICAgICBdLFxuICAgICAgICBSZWFkb25seUFycmF5PFR1aURheVJhbmdlUGVyaW9kIHwgc3RyaW5nPlxuICAgID4gPSAoaXRlbXMsIG1pbiwgbWF4LCBtaW5MZW5ndGgsIG90aGVyRGF0ZVRleHQpID0+IFtcbiAgICAgICAgLi4uaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgKG1pbkxlbmd0aCA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICBpdGVtLnJhbmdlLmZyb21cbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobWluTGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCh7ZGF5OiAtMX0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGF5U2FtZU9yQmVmb3JlKGl0ZW0ucmFuZ2UudG8pKSAmJlxuICAgICAgICAgICAgICAgIChtaW4gPT09IG51bGwgfHwgaXRlbS5yYW5nZS50by5kYXlTYW1lT3JBZnRlcihtaW4pKSAmJlxuICAgICAgICAgICAgICAgIChtYXggPT09IG51bGwgfHwgaXRlbS5yYW5nZS5mcm9tLmRheVNhbWVPckJlZm9yZShtYXgpKSxcbiAgICAgICAgKSxcbiAgICAgICAgb3RoZXJEYXRlVGV4dCB8fCAnJyxcbiAgICBdO1xuXG4gICAgcHJvdGVjdGVkIGlzSXRlbUFjdGl2ZShpdGVtOiBUdWlEYXlSYW5nZVBlcmlvZCB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB7YWN0aXZlUGVyaW9kfSA9IHRoaXM7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh0dWlJc1N0cmluZyhpdGVtKSAmJiBhY3RpdmVQZXJpb2QgPT09IG51bGwpIHx8XG4gICAgICAgICAgICBhY3RpdmVQZXJpb2QgPT09IGl0ZW0gfHxcbiAgICAgICAgICAgIGFjdGl2ZVBlcmlvZD8udG9TdHJpbmcoKSA9PT0gaXRlbS50b1N0cmluZygpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uSXRlbVNlbGVjdChpdGVtOiBUdWlEYXlSYW5nZVBlcmlvZCB8IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXR1aUlzU3RyaW5nKGl0ZW0pKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQWN0aXZlUGVyaW9kID0gaXRlbTtcbiAgICAgICAgICAgIHRoaXMuaXRlbUNoYW5nZS5lbWl0KGl0ZW0pO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShpdGVtLnJhbmdlLmRheUxpbWl0KHRoaXMubWluLCB0aGlzLm1heCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlUGVyaW9kICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQWN0aXZlUGVyaW9kID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuaXRlbUNoYW5nZS5lbWl0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdERlZmF1bHRWaWV3ZWRNb250aCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbk1vbnRoQ2hhbmdlKG1vbnRoOiBUdWlNb250aCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vbnRoID0gbW9udGg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRGF5Q2xpY2soZGF5OiBUdWlEYXkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gdGhpcy5jdXJyZW50VmFsdWU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBY3RpdmVQZXJpb2QgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIFR1aURheSkge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBUdWlEYXlSYW5nZS5zb3J0KHRoaXMuY3VycmVudFZhbHVlLCBkYXkpO1xuXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHJhbmdlO1xuICAgICAgICAgICAgdGhpcy5pdGVtQ2hhbmdlLmVtaXQodGhpcy5maW5kSXRlbUJ5RGF5UmFuZ2UocmFuZ2UpKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWUocmFuZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBkYXk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdXBkYXRlVmFsdWUodmFsdWU6IFR1aURheVJhbmdlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGFjdGl2ZVBlcmlvZCgpOiBUdWlEYXlSYW5nZVBlcmlvZCB8IG51bGwge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5pdGVtID8/XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQWN0aXZlUGVyaW9kID8/XG4gICAgICAgICAgICAodGhpcy5pdGVtcy5maW5kKChpdGVtKSA9PlxuICAgICAgICAgICAgICAgIHR1aU51bGxhYmxlU2FtZTxUdWlEYXlSYW5nZT4oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlIGluc3RhbmNlb2YgVHVpRGF5XG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBUdWlEYXlSYW5nZSh0aGlzLmN1cnJlbnRWYWx1ZSwgdGhpcy5jdXJyZW50VmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBpdGVtLnJhbmdlLFxuICAgICAgICAgICAgICAgICAgICAoYSwgYikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGEuZnJvbS5kYXlTYW1lKGIuZnJvbS5kYXlMaW1pdCh0aGlzLm1pbiwgdGhpcy5tYXgpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYS50by5kYXlTYW1lKGIudG8uZGF5TGltaXQodGhpcy5taW4sIHRoaXMubWF4KSksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgICBudWxsKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIEB0dWlQdXJlXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVEaXNhYmxlZEl0ZW1IYW5kbGVyKFxuICAgICAgICBkaXNhYmxlZEl0ZW1IYW5kbGVyOiBUdWlCb29sZWFuSGFuZGxlcjxUdWlEYXk+LFxuICAgICAgICB2YWx1ZTogVHVpRGF5IHwgVHVpRGF5UmFuZ2UgfCBudWxsLFxuICAgICAgICBtaW5MZW5ndGg6IFR1aURheUxpa2UgfCBudWxsLFxuICAgICk6IFR1aUJvb2xlYW5IYW5kbGVyPFR1aURheT4ge1xuICAgICAgICByZXR1cm4gY2FsY3VsYXRlRGlzYWJsZWRJdGVtSGFuZGxlcihkaXNhYmxlZEl0ZW1IYW5kbGVyLCB2YWx1ZSwgbWluTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXREZWZhdWx0Vmlld2VkTW9udGgoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIFR1aURheSkge1xuICAgICAgICAgICAgdGhpcy5tb250aCA9IHRoaXMuY3VycmVudFZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLm1vbnRoID0gdGhpcy5pdGVtcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHRoaXMuY3VycmVudFZhbHVlLnRvXG4gICAgICAgICAgICAgICAgOiB0aGlzLmN1cnJlbnRWYWx1ZS5mcm9tO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWF4ICYmIHRoaXMubW9udGgubW9udGhTYW1lT3JBZnRlcih0aGlzLm1heCkpIHtcbiAgICAgICAgICAgIHRoaXMubW9udGggPSB0aGlzLml0ZW1zLmxlbmd0aCA/IHRoaXMubWF4IDogdGhpcy5tYXguYXBwZW5kKHttb250aDogLTF9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1pbiAmJiB0aGlzLm1vbnRoLm1vbnRoU2FtZU9yQmVmb3JlKHRoaXMubWluKSkge1xuICAgICAgICAgICAgdGhpcy5tb250aCA9IHRoaXMubWluO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kSXRlbUJ5RGF5UmFuZ2UoZGF5UmFuZ2U6IFR1aURheVJhbmdlKTogVHVpRGF5UmFuZ2VQZXJpb2QgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gZGF5UmFuZ2UuZGF5U2FtZShpdGVtLnJhbmdlKSkgPz8gbnVsbDtcbiAgICB9XG59XG4iLCI8dHVpLWNhbGVuZGFyXG4gICAgYXV0b21hdGlvbi1pZD1cInR1aS1jYWxlbmRhci1yYW5nZV9fY2FsZW5kYXJcIlxuICAgIFtjbGFzcy50LWNhbGVuZGFyXT1cIiFtb2JpbGVcIlxuICAgIFtkaXNhYmxlZEl0ZW1IYW5kbGVyXT1cImNhbGN1bGF0ZWREaXNhYmxlZEl0ZW1IYW5kbGVyXCJcbiAgICBbbWFya2VySGFuZGxlcl09XCJtYXJrZXJIYW5kbGVyXCJcbiAgICBbbWF4XT1cIm1heCB8IHR1aU1hcHBlcjogY2Fwc01hcHBlciA6IGN1cnJlbnRWYWx1ZSA6IG1heExlbmd0aCA6IGZhbHNlXCJcbiAgICBbbWF4Vmlld2VkTW9udGhdPVwiaXRlbXMubGVuZ3RoIHx8IG1vYmlsZSA/IG51bGwgOiAoZGVmYXVsdFZpZXdlZE1vbnRoIHwgdHVpTWFwcGVyOiBtb250aE9mZnNldCA6IC0xKVwiXG4gICAgW21pbl09XCJtaW4gfCB0dWlNYXBwZXI6IGNhcHNNYXBwZXIgOiBjdXJyZW50VmFsdWUgOiBtYXhMZW5ndGggOiB0cnVlXCJcbiAgICBbbW9udGhdPVwiZGVmYXVsdFZpZXdlZE1vbnRoXCJcbiAgICBbc2hvd0FkamFjZW50XT1cIiEhaXRlbXMubGVuZ3RoIHx8IG1vYmlsZVwiXG4gICAgW3ZhbHVlXT1cImN1cnJlbnRWYWx1ZVwiXG4gICAgWyhob3ZlcmVkSXRlbSldPVwiaG92ZXJlZEl0ZW1cIlxuICAgIChkYXlDbGljayk9XCJvbkRheUNsaWNrKCRldmVudClcIlxuICAgIChtb250aENoYW5nZSk9XCJvbk1vbnRoQ2hhbmdlKCRldmVudClcIlxuLz5cbjx0dWktY2FsZW5kYXJcbiAgICAqbmdJZj1cIiFpdGVtcy5sZW5ndGggJiYgIW1vYmlsZTsgZWxzZSBwcmVzZXRzXCJcbiAgICBbZGlzYWJsZWRJdGVtSGFuZGxlcl09XCJjYWxjdWxhdGVkRGlzYWJsZWRJdGVtSGFuZGxlclwiXG4gICAgW21hcmtlckhhbmRsZXJdPVwibWFya2VySGFuZGxlclwiXG4gICAgW21heF09XCJtYXggfCB0dWlNYXBwZXI6IGNhcHNNYXBwZXIgOiBjdXJyZW50VmFsdWUgOiBtYXhMZW5ndGggOiBmYWxzZVwiXG4gICAgW21pbl09XCJtaW4gfCB0dWlNYXBwZXI6IGNhcHNNYXBwZXIgOiBjdXJyZW50VmFsdWUgOiBtYXhMZW5ndGggOiB0cnVlXCJcbiAgICBbbWluVmlld2VkTW9udGhdPVwiZGVmYXVsdFZpZXdlZE1vbnRoIHwgdHVpTWFwcGVyOiBtb250aE9mZnNldCA6IDFcIlxuICAgIFttb250aF09XCJkZWZhdWx0Vmlld2VkTW9udGggfCB0dWlNYXBwZXI6IG1vbnRoT2Zmc2V0IDogMVwiXG4gICAgW3Nob3dBZGphY2VudF09XCJmYWxzZVwiXG4gICAgW3ZhbHVlXT1cImN1cnJlbnRWYWx1ZVwiXG4gICAgWyhob3ZlcmVkSXRlbSldPVwiaG92ZXJlZEl0ZW1cIlxuICAgIChkYXlDbGljayk9XCJvbkRheUNsaWNrKCRldmVudClcIlxuICAgIChtb250aENoYW5nZSk9XCJvbk1vbnRoQ2hhbmdlKCRldmVudC5hcHBlbmQoe21vbnRoOiAtMX0pKVwiXG4vPlxuPG5nLXRlbXBsYXRlICNwcmVzZXRzPlxuICAgIDx0dWktZGF0YS1saXN0XG4gICAgICAgICpuZ0lmPVwiIW1vYmlsZVwiXG4gICAgICAgIGF1dG9tYXRpb24taWQ9XCJ0dWktY2FsZW5kYXItcmFuZ2VfX21lbnVcIlxuICAgICAgICByb2xlPVwibWVudVwiXG4gICAgICAgIFtzdHlsZS5mbGV4XT1cIjFcIlxuICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXMgfCB0dWlNYXBwZXI6IG1hcHBlciA6IG1pbiA6IG1heCA6IG1pbkxlbmd0aCA6IChvdGhlckRhdGVUZXh0JCB8IGFzeW5jKVwiXG4gICAgICAgICAgICBhdXRvbWF0aW9uLWlkPVwidHVpLWNhbGVuZGFyLXJhbmdlX19tZW51X19pdGVtXCJcbiAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbXJhZGlvXCJcbiAgICAgICAgICAgIHR1aU9wdGlvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiaXNJdGVtQWN0aXZlKGl0ZW0pXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkl0ZW1TZWxlY3QoaXRlbSlcIlxuICAgICAgICAgICAgKHBvaW50ZXJkb3duLnByZXZlbnQuem9uZWxlc3MpPVwiKDApXCJcbiAgICAgICAgPlxuICAgICAgICAgICAge3sgaXRlbSB9fVxuICAgICAgICAgICAgPHR1aS1pY29uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc0l0ZW1BY3RpdmUoaXRlbSlcIlxuICAgICAgICAgICAgICAgIGF1dG9tYXRpb24taWQ9XCJ0dWktY2FsZW5kYXItcmFuZ2VfX2NoZWNrbWFya1wiXG4gICAgICAgICAgICAgICAgW2ljb25dPVwiaWNvbnMuY2hlY2tcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5mb250LXNpemUucmVtXT1cIjFcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC90dWktZGF0YS1saXN0PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|