@skyux/datetime 5.7.2 → 6.0.0-beta.2
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/esm2020/index.mjs +28 -0
- package/esm2020/lib/modules/date-pipe/date-format-utility.mjs +46 -0
- package/esm2020/lib/modules/date-pipe/date-pipe.module.mjs +21 -0
- package/esm2020/lib/modules/date-pipe/date.pipe.mjs +65 -0
- package/esm2020/lib/modules/date-pipe/fuzzy-date.pipe.mjs +47 -0
- package/esm2020/lib/modules/date-range-picker/date-range-picker.component.mjs +448 -0
- package/esm2020/lib/modules/date-range-picker/date-range-picker.module.mjs +47 -0
- package/esm2020/lib/modules/date-range-picker/date-range.service.mjs +97 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-calculation.mjs +2 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-calculator-config.mjs +2 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.mjs +2 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-calculator-id.mjs +118 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-calculator-type.mjs +23 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-calculator-validate-function.mjs +2 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-calculator.mjs +56 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-default-calculator-config.mjs +2 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-default-calculator-configs.mjs +147 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-relative-value.mjs +249 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range.mjs +2 -0
- package/esm2020/lib/modules/datepicker/date-formatter.mjs +38 -0
- package/esm2020/lib/modules/datepicker/datepicker-adapter.service.mjs +33 -0
- package/esm2020/lib/modules/datepicker/datepicker-calendar-change.mjs +2 -0
- package/esm2020/lib/modules/datepicker/datepicker-calendar-inner.component.mjs +310 -0
- package/esm2020/lib/modules/datepicker/datepicker-calendar.component.mjs +104 -0
- package/esm2020/lib/modules/datepicker/datepicker-config.service.mjs +21 -0
- package/esm2020/lib/modules/datepicker/datepicker-custom-date.mjs +2 -0
- package/esm2020/lib/modules/datepicker/datepicker-date.mjs +2 -0
- package/esm2020/lib/modules/datepicker/datepicker-input-fuzzy.directive.mjs +466 -0
- package/esm2020/lib/modules/datepicker/datepicker-input.directive.mjs +445 -0
- package/esm2020/lib/modules/datepicker/datepicker.component.mjs +328 -0
- package/esm2020/lib/modules/datepicker/datepicker.module.mjs +95 -0
- package/esm2020/lib/modules/datepicker/datepicker.service.mjs +21 -0
- package/esm2020/lib/modules/datepicker/daypicker-button.component.mjs +22 -0
- package/esm2020/lib/modules/datepicker/daypicker-cell.component.mjs +126 -0
- package/esm2020/lib/modules/datepicker/daypicker.component.mjs +211 -0
- package/esm2020/lib/modules/datepicker/fuzzy-date.mjs +2 -0
- package/esm2020/lib/modules/datepicker/fuzzy-date.service.mjs +403 -0
- package/esm2020/lib/modules/datepicker/monthpicker.component.mjs +80 -0
- package/esm2020/lib/modules/datepicker/yearpicker.component.mjs +86 -0
- package/esm2020/lib/modules/shared/sky-datetime-resources.module.mjs +131 -0
- package/esm2020/lib/modules/timepicker/timepicker.component.mjs +361 -0
- package/esm2020/lib/modules/timepicker/timepicker.directive.mjs +228 -0
- package/esm2020/lib/modules/timepicker/timepicker.interface.mjs +2 -0
- package/esm2020/lib/modules/timepicker/timepicker.module.mjs +46 -0
- package/esm2020/skyux-datetime.mjs +5 -0
- package/esm2020/testing/datepicker-fixture.mjs +54 -0
- package/esm2020/testing/public-api.mjs +3 -0
- package/esm2020/testing/skyux-datetime-testing.mjs +5 -0
- package/esm2020/testing/timepicker-fixture.mjs +50 -0
- package/fesm2015/{skyux-datetime-testing.js → skyux-datetime-testing.mjs} +1 -1
- package/fesm2015/skyux-datetime-testing.mjs.map +1 -0
- package/fesm2015/skyux-datetime.mjs +4726 -0
- package/fesm2015/skyux-datetime.mjs.map +1 -0
- package/{esm2015/testing/datepicker-fixture.js → fesm2020/skyux-datetime-testing.mjs} +57 -2
- package/fesm2020/skyux-datetime-testing.mjs.map +1 -0
- package/{fesm2015/skyux-datetime.js → fesm2020/skyux-datetime.mjs} +110 -158
- package/fesm2020/skyux-datetime.mjs.map +1 -0
- package/package.json +42 -18
- package/testing/package.json +5 -5
- package/bundles/skyux-datetime-testing.umd.js +0 -143
- package/bundles/skyux-datetime.umd.js +0 -5488
- package/esm2015/index.js +0 -28
- package/esm2015/index.js.map +0 -1
- package/esm2015/lib/modules/date-pipe/date-format-utility.js +0 -46
- package/esm2015/lib/modules/date-pipe/date-format-utility.js.map +0 -1
- package/esm2015/lib/modules/date-pipe/date-pipe.module.js +0 -21
- package/esm2015/lib/modules/date-pipe/date-pipe.module.js.map +0 -1
- package/esm2015/lib/modules/date-pipe/date.pipe.js +0 -65
- package/esm2015/lib/modules/date-pipe/date.pipe.js.map +0 -1
- package/esm2015/lib/modules/date-pipe/fuzzy-date.pipe.js +0 -47
- package/esm2015/lib/modules/date-pipe/fuzzy-date.pipe.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/date-range-picker.component.js +0 -453
- package/esm2015/lib/modules/date-range-picker/date-range-picker.component.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/date-range-picker.module.js +0 -47
- package/esm2015/lib/modules/date-range-picker/date-range-picker.module.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/date-range.service.js +0 -97
- package/esm2015/lib/modules/date-range-picker/date-range.service.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculation.js +0 -2
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculation.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-config.js +0 -2
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-config.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.js +0 -2
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-id.js +0 -118
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-id.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-type.js +0 -23
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-type.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-validate-function.js +0 -2
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-validate-function.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator.js +0 -56
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-config.js +0 -2
- package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-config.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-configs.js +0 -147
- package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-configs.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-relative-value.js +0 -249
- package/esm2015/lib/modules/date-range-picker/types/date-range-relative-value.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range.js +0 -2
- package/esm2015/lib/modules/date-range-picker/types/date-range.js.map +0 -1
- package/esm2015/lib/modules/datepicker/date-formatter.js +0 -38
- package/esm2015/lib/modules/datepicker/date-formatter.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-adapter.service.js +0 -33
- package/esm2015/lib/modules/datepicker/datepicker-adapter.service.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-calendar-change.js +0 -2
- package/esm2015/lib/modules/datepicker/datepicker-calendar-change.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-calendar-inner.component.js +0 -315
- package/esm2015/lib/modules/datepicker/datepicker-calendar-inner.component.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-calendar.component.js +0 -109
- package/esm2015/lib/modules/datepicker/datepicker-calendar.component.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-config.service.js +0 -21
- package/esm2015/lib/modules/datepicker/datepicker-config.service.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-custom-date.js +0 -2
- package/esm2015/lib/modules/datepicker/datepicker-custom-date.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-date.js +0 -2
- package/esm2015/lib/modules/datepicker/datepicker-date.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-input-fuzzy.directive.js +0 -467
- package/esm2015/lib/modules/datepicker/datepicker-input-fuzzy.directive.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-input.directive.js +0 -446
- package/esm2015/lib/modules/datepicker/datepicker-input.directive.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker.component.js +0 -333
- package/esm2015/lib/modules/datepicker/datepicker.component.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker.module.js +0 -95
- package/esm2015/lib/modules/datepicker/datepicker.module.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker.service.js +0 -21
- package/esm2015/lib/modules/datepicker/datepicker.service.js.map +0 -1
- package/esm2015/lib/modules/datepicker/daypicker-button.component.js +0 -26
- package/esm2015/lib/modules/datepicker/daypicker-button.component.js.map +0 -1
- package/esm2015/lib/modules/datepicker/daypicker-cell.component.js +0 -130
- package/esm2015/lib/modules/datepicker/daypicker-cell.component.js.map +0 -1
- package/esm2015/lib/modules/datepicker/daypicker.component.js +0 -215
- package/esm2015/lib/modules/datepicker/daypicker.component.js.map +0 -1
- package/esm2015/lib/modules/datepicker/fuzzy-date.js +0 -2
- package/esm2015/lib/modules/datepicker/fuzzy-date.js.map +0 -1
- package/esm2015/lib/modules/datepicker/fuzzy-date.service.js +0 -403
- package/esm2015/lib/modules/datepicker/fuzzy-date.service.js.map +0 -1
- package/esm2015/lib/modules/datepicker/monthpicker.component.js +0 -84
- package/esm2015/lib/modules/datepicker/monthpicker.component.js.map +0 -1
- package/esm2015/lib/modules/datepicker/yearpicker.component.js +0 -90
- package/esm2015/lib/modules/datepicker/yearpicker.component.js.map +0 -1
- package/esm2015/lib/modules/shared/sky-datetime-resources.module.js +0 -131
- package/esm2015/lib/modules/shared/sky-datetime-resources.module.js.map +0 -1
- package/esm2015/lib/modules/timepicker/timepicker.component.js +0 -367
- package/esm2015/lib/modules/timepicker/timepicker.component.js.map +0 -1
- package/esm2015/lib/modules/timepicker/timepicker.directive.js +0 -228
- package/esm2015/lib/modules/timepicker/timepicker.directive.js.map +0 -1
- package/esm2015/lib/modules/timepicker/timepicker.interface.js +0 -2
- package/esm2015/lib/modules/timepicker/timepicker.interface.js.map +0 -1
- package/esm2015/lib/modules/timepicker/timepicker.module.js +0 -46
- package/esm2015/lib/modules/timepicker/timepicker.module.js.map +0 -1
- package/esm2015/skyux-datetime.js +0 -5
- package/esm2015/skyux-datetime.js.map +0 -1
- package/esm2015/testing/datepicker-fixture.js.map +0 -1
- package/esm2015/testing/public-api.js +0 -3
- package/esm2015/testing/public-api.js.map +0 -1
- package/esm2015/testing/skyux-datetime-testing.js +0 -5
- package/esm2015/testing/skyux-datetime-testing.js.map +0 -1
- package/esm2015/testing/timepicker-fixture.js +0 -50
- package/esm2015/testing/timepicker-fixture.js.map +0 -1
- package/fesm2015/skyux-datetime-testing.js.map +0 -1
- package/fesm2015/skyux-datetime.js.map +0 -1
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
import { ChangeDetectorRef, Directive, ElementRef, HostListener, Input, Optional, Renderer2, forwardRef, } from '@angular/core';
|
|
2
|
+
import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
|
|
3
|
+
import { SkyAppLocaleProvider, SkyLibResourcesService } from '@skyux/i18n';
|
|
4
|
+
import moment from 'moment';
|
|
5
|
+
import { Subject } from 'rxjs';
|
|
6
|
+
import { distinctUntilChanged, takeUntil } from 'rxjs/operators';
|
|
7
|
+
import { SkyDateFormatter } from './date-formatter';
|
|
8
|
+
import { SkyDatepickerAdapterService } from './datepicker-adapter.service';
|
|
9
|
+
import { SkyDatepickerConfigService } from './datepicker-config.service';
|
|
10
|
+
import { SkyDatepickerComponent } from './datepicker.component';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "./datepicker-adapter.service";
|
|
13
|
+
import * as i2 from "./datepicker-config.service";
|
|
14
|
+
import * as i3 from "@skyux/i18n";
|
|
15
|
+
import * as i4 from "./datepicker.component";
|
|
16
|
+
// tslint:disable:no-forward-ref no-use-before-declare
|
|
17
|
+
const SKY_DATEPICKER_VALUE_ACCESSOR = {
|
|
18
|
+
provide: NG_VALUE_ACCESSOR,
|
|
19
|
+
useExisting: forwardRef(() => SkyDatepickerInputDirective),
|
|
20
|
+
multi: true,
|
|
21
|
+
};
|
|
22
|
+
const SKY_DATEPICKER_VALIDATOR = {
|
|
23
|
+
provide: NG_VALIDATORS,
|
|
24
|
+
useExisting: forwardRef(() => SkyDatepickerInputDirective),
|
|
25
|
+
multi: true,
|
|
26
|
+
};
|
|
27
|
+
// tslint:enable
|
|
28
|
+
export class SkyDatepickerInputDirective {
|
|
29
|
+
constructor(adapter, changeDetector, configService, elementRef, localeProvider, renderer, resourcesService, datepickerComponent) {
|
|
30
|
+
this.adapter = adapter;
|
|
31
|
+
this.changeDetector = changeDetector;
|
|
32
|
+
this.configService = configService;
|
|
33
|
+
this.elementRef = elementRef;
|
|
34
|
+
this.localeProvider = localeProvider;
|
|
35
|
+
this.renderer = renderer;
|
|
36
|
+
this.resourcesService = resourcesService;
|
|
37
|
+
this.datepickerComponent = datepickerComponent;
|
|
38
|
+
/**
|
|
39
|
+
* Indicates whether to disable date validation on the datepicker input.
|
|
40
|
+
* @default false
|
|
41
|
+
*/
|
|
42
|
+
this.skyDatepickerNoValidate = false;
|
|
43
|
+
this.dateFormatter = new SkyDateFormatter();
|
|
44
|
+
this.ngUnsubscribe = new Subject();
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
46
|
+
this.onChange = (_) => { };
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
48
|
+
this.onTouched = () => { };
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
50
|
+
this.onValidatorChange = () => { };
|
|
51
|
+
this.initialPlaceholder = this.adapter.getPlaceholder(this.elementRef);
|
|
52
|
+
this.updatePlaceholder();
|
|
53
|
+
this.localeProvider
|
|
54
|
+
.getLocaleInfo()
|
|
55
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
56
|
+
.subscribe((localeInfo) => {
|
|
57
|
+
SkyDateFormatter.setLocale(localeInfo.locale);
|
|
58
|
+
this.preferredShortDateFormat =
|
|
59
|
+
SkyDateFormatter.getPreferredShortDateFormat();
|
|
60
|
+
this.applyDateFormat();
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Specifies the date format for the input. Place this attribute on the `input` element
|
|
65
|
+
* to override the default in the `SkyDatepickerConfigService`.
|
|
66
|
+
* @default "MM/DD/YYYY"
|
|
67
|
+
*/
|
|
68
|
+
set dateFormat(value) {
|
|
69
|
+
/* istanbul ignore else */
|
|
70
|
+
if (value !== this._dateFormat) {
|
|
71
|
+
this._dateFormat = value;
|
|
72
|
+
this.applyDateFormat();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
get dateFormat() {
|
|
76
|
+
return (this._dateFormat ||
|
|
77
|
+
this.configService.dateFormat ||
|
|
78
|
+
this.preferredShortDateFormat);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Indicates whether to disable the datepicker.
|
|
82
|
+
* @default false
|
|
83
|
+
*/
|
|
84
|
+
set disabled(value) {
|
|
85
|
+
this._disabled = value;
|
|
86
|
+
this.datepickerComponent.disabled = value;
|
|
87
|
+
this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', value);
|
|
88
|
+
}
|
|
89
|
+
get disabled() {
|
|
90
|
+
return this._disabled || false;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* @internal
|
|
94
|
+
* Indicates if the input element or any of its children have focus.
|
|
95
|
+
*/
|
|
96
|
+
get inputIsFocused() {
|
|
97
|
+
return this.adapter.elementIsFocused();
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Specifies the latest date that is available in the calendar. Place this attribute on
|
|
101
|
+
* the `input` element to override the default in `SkyDatepickerConfigService`.
|
|
102
|
+
*/
|
|
103
|
+
set maxDate(value) {
|
|
104
|
+
this._maxDate = value;
|
|
105
|
+
this.datepickerComponent.maxDate = this.maxDate;
|
|
106
|
+
this.onValidatorChange();
|
|
107
|
+
}
|
|
108
|
+
get maxDate() {
|
|
109
|
+
return this._maxDate || this.configService.maxDate;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Specifies the earliest date that is available in the calendar. Place this attribute on
|
|
113
|
+
* the `input` element to override the default in `SkyDatepickerConfigService`.
|
|
114
|
+
*/
|
|
115
|
+
set minDate(value) {
|
|
116
|
+
this._minDate = value;
|
|
117
|
+
this.datepickerComponent.minDate = this.minDate;
|
|
118
|
+
this.onValidatorChange();
|
|
119
|
+
}
|
|
120
|
+
get minDate() {
|
|
121
|
+
return this._minDate || this.configService.minDate;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Creates the datepicker input and calendar. Place this directive on an `input` element,
|
|
125
|
+
* and wrap the input in a `sky-datepicker` component. The value that users select is driven
|
|
126
|
+
* through the `ngModel` attribute specified on the `input` element.
|
|
127
|
+
* @required
|
|
128
|
+
*/
|
|
129
|
+
set skyDatepickerInput(value) {
|
|
130
|
+
if (value) {
|
|
131
|
+
console.warn('[Deprecation warning] You no longer need to provide a template reference variable ' +
|
|
132
|
+
'to the `skyDatepickerInput` attribute (this will be a breaking change in the next ' +
|
|
133
|
+
'major version release).\n' +
|
|
134
|
+
'Do this instead:\n' +
|
|
135
|
+
'<sky-datepicker>\n <input skyDatepickerInput />\n</sky-datepicker>');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Specifies the starting day of the week in the calendar, where `0` sets the starting day
|
|
140
|
+
* to Sunday. Place this attribute on the `input` element to override the default
|
|
141
|
+
* in `SkyDatepickerConfigService`.
|
|
142
|
+
* @default 0
|
|
143
|
+
*/
|
|
144
|
+
set startingDay(value) {
|
|
145
|
+
this._startingDay = value;
|
|
146
|
+
this.datepickerComponent.startingDay = this.startingDay;
|
|
147
|
+
this.onValidatorChange();
|
|
148
|
+
}
|
|
149
|
+
get startingDay() {
|
|
150
|
+
return this._startingDay || this.configService.startingDay;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Indicates whether the format of the date value must match the format from the `dateFormat` value.
|
|
154
|
+
* If this property is `true` and the datepicker input directive cannot find an exact match, then
|
|
155
|
+
* the input is marked as invalid.
|
|
156
|
+
* If this property is `false` and the datepicker input directive cannot find an exact match, then
|
|
157
|
+
* it attempts to format the string based on the [ISO 8601 standard format](https://www.iso.org/iso-8601-date-and-time-format.html).
|
|
158
|
+
* @default false
|
|
159
|
+
*/
|
|
160
|
+
set strict(value) {
|
|
161
|
+
this._strict = value;
|
|
162
|
+
}
|
|
163
|
+
get strict() {
|
|
164
|
+
return this._strict || false;
|
|
165
|
+
}
|
|
166
|
+
get value() {
|
|
167
|
+
return this._value;
|
|
168
|
+
}
|
|
169
|
+
set value(value) {
|
|
170
|
+
this.updateValue(value);
|
|
171
|
+
}
|
|
172
|
+
ngOnInit() {
|
|
173
|
+
if (!this.datepickerComponent) {
|
|
174
|
+
throw new Error('You must wrap the `skyDatepickerInput` directive within a ' +
|
|
175
|
+
'`<sky-datepicker>` component!');
|
|
176
|
+
}
|
|
177
|
+
const element = this.elementRef.nativeElement;
|
|
178
|
+
this.renderer.addClass(element, 'sky-form-control');
|
|
179
|
+
const hasAriaLabel = element.getAttribute('aria-label');
|
|
180
|
+
if (!hasAriaLabel) {
|
|
181
|
+
this.resourcesService
|
|
182
|
+
.getString('skyux_date_field_default_label')
|
|
183
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
184
|
+
.subscribe((value) => {
|
|
185
|
+
this.renderer.setAttribute(element, 'aria-label', value);
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
ngAfterContentInit() {
|
|
190
|
+
this.datepickerComponent.dateChange
|
|
191
|
+
.pipe(distinctUntilChanged())
|
|
192
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
193
|
+
.subscribe((value) => {
|
|
194
|
+
this.value = value;
|
|
195
|
+
this.onTouched();
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
ngAfterViewInit() {
|
|
199
|
+
// This is needed to address a bug in Angular 4.
|
|
200
|
+
// When a control value is set intially, its value is not represented on the view.
|
|
201
|
+
// See: https://github.com/angular/angular/issues/13792
|
|
202
|
+
// Of note is the parent check which allows us to determine if the form is reactive.
|
|
203
|
+
// Without this check there is a changed before checked error
|
|
204
|
+
/* istanbul ignore else */
|
|
205
|
+
if (this.control && this.control.parent) {
|
|
206
|
+
setTimeout(() => {
|
|
207
|
+
this.control.setValue(this.value, {
|
|
208
|
+
emitEvent: false,
|
|
209
|
+
});
|
|
210
|
+
this.changeDetector.markForCheck();
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
this.adapter.init(this.elementRef);
|
|
214
|
+
}
|
|
215
|
+
ngOnDestroy() {
|
|
216
|
+
this.ngUnsubscribe.next();
|
|
217
|
+
this.ngUnsubscribe.complete();
|
|
218
|
+
}
|
|
219
|
+
onInputChange(event) {
|
|
220
|
+
const value = event.target.value;
|
|
221
|
+
if (this.skyDatepickerNoValidate) {
|
|
222
|
+
this.onValueChange(value);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
// Don't try to parse the string value into a Date value if it is malformed.
|
|
226
|
+
if (this.isDateStringValid(value)) {
|
|
227
|
+
this.onValueChange(value);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
this._value = value;
|
|
231
|
+
this.onChange(value);
|
|
232
|
+
this.control.setErrors({
|
|
233
|
+
skyDate: {
|
|
234
|
+
invalid: true,
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
onInputBlur() {
|
|
239
|
+
this.onTouched();
|
|
240
|
+
}
|
|
241
|
+
onInputKeyup() {
|
|
242
|
+
this.control.markAsDirty();
|
|
243
|
+
}
|
|
244
|
+
writeValue(value) {
|
|
245
|
+
this.updateValue(value, false);
|
|
246
|
+
}
|
|
247
|
+
validate(control) {
|
|
248
|
+
if (!this.control) {
|
|
249
|
+
this.control = control;
|
|
250
|
+
}
|
|
251
|
+
if (this.skyDatepickerNoValidate) {
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
const value = control.value;
|
|
255
|
+
if (!value) {
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
const dateValue = this.getDateValue(value);
|
|
259
|
+
const isDateValid = dateValue && this.dateFormatter.dateIsValid(dateValue);
|
|
260
|
+
if (!isDateValid || !this.isDateStringValid(value)) {
|
|
261
|
+
// Mark the invalid control as touched so that the input's invalid CSS styles appear.
|
|
262
|
+
// (This is only required when the invalid value is set by the FormControl constructor.)
|
|
263
|
+
this.control.markAsTouched();
|
|
264
|
+
return {
|
|
265
|
+
skyDate: {
|
|
266
|
+
invalid: value,
|
|
267
|
+
},
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
const minDate = this.minDate;
|
|
271
|
+
if (minDate && this.dateFormatter.dateIsValid(minDate) && value < minDate) {
|
|
272
|
+
return {
|
|
273
|
+
skyDate: {
|
|
274
|
+
minDate,
|
|
275
|
+
},
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
const maxDate = this.maxDate;
|
|
279
|
+
if (maxDate && this.dateFormatter.dateIsValid(maxDate) && value > maxDate) {
|
|
280
|
+
return {
|
|
281
|
+
skyDate: {
|
|
282
|
+
maxDate,
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
registerOnChange(fn) {
|
|
288
|
+
this.onChange = fn;
|
|
289
|
+
}
|
|
290
|
+
registerOnTouched(fn) {
|
|
291
|
+
this.onTouched = fn;
|
|
292
|
+
}
|
|
293
|
+
registerOnValidatorChange(fn) {
|
|
294
|
+
this.onValidatorChange = fn;
|
|
295
|
+
}
|
|
296
|
+
setDisabledState(disabled) {
|
|
297
|
+
this.disabled = disabled;
|
|
298
|
+
this.datepickerComponent.disabled = disabled;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Detects changes to the underlying input element's value and updates the ngModel accordingly.
|
|
302
|
+
* This is useful if you need to update the ngModel value before the input element loses focus.
|
|
303
|
+
*/
|
|
304
|
+
detectInputValueChange() {
|
|
305
|
+
this.onValueChange(this.elementRef.nativeElement.value);
|
|
306
|
+
}
|
|
307
|
+
applyDateFormat() {
|
|
308
|
+
this.updatePlaceholder();
|
|
309
|
+
if (this.value) {
|
|
310
|
+
const formattedDate = this.dateFormatter.format(this.value, this.dateFormat);
|
|
311
|
+
this.setInputElementValue(formattedDate);
|
|
312
|
+
this.changeDetector.markForCheck();
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
onValueChange(newValue) {
|
|
316
|
+
this.value = newValue;
|
|
317
|
+
}
|
|
318
|
+
setInputElementValue(value) {
|
|
319
|
+
this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);
|
|
320
|
+
}
|
|
321
|
+
getDateValue(value) {
|
|
322
|
+
let dateValue;
|
|
323
|
+
if (value instanceof Date) {
|
|
324
|
+
dateValue = value;
|
|
325
|
+
}
|
|
326
|
+
else if (typeof value === 'string') {
|
|
327
|
+
const date = this.dateFormatter.getDateFromString(value, this.dateFormat, this.strict);
|
|
328
|
+
if (this.dateFormatter.dateIsValid(date)) {
|
|
329
|
+
dateValue = date;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return dateValue;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Validates the input value to ensure it is formatted correctly.
|
|
336
|
+
*/
|
|
337
|
+
isDateStringValid(value) {
|
|
338
|
+
if (!value || typeof value !== 'string') {
|
|
339
|
+
return true;
|
|
340
|
+
}
|
|
341
|
+
// Does the value only include digits, dashes, or slashes?
|
|
342
|
+
const regexp = /^[\d/-]+$/;
|
|
343
|
+
const isValid = regexp.test(value);
|
|
344
|
+
if (isValid) {
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
// If not, does it conform to the standard ISO format?
|
|
348
|
+
const isValidIso = moment(value, moment.ISO_8601).isValid();
|
|
349
|
+
return isValidIso;
|
|
350
|
+
}
|
|
351
|
+
updatePlaceholder() {
|
|
352
|
+
if (!this.initialPlaceholder) {
|
|
353
|
+
this.adapter.setPlaceholder(this.elementRef, this.dateFormat);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Update the value of the form control and input element
|
|
358
|
+
* @param emitEvent Denotes if we emit an event to the consumer's form control. We do not want to do this if the value is being updated via a `setValue` call or a `patchValue` call as this is already handled by Angular.
|
|
359
|
+
* In these cases we do not want to fire `onChange` as it will cause extra `valueChange` and `statusChange` events and the status of the form should not be affected by these changes.
|
|
360
|
+
*/
|
|
361
|
+
updateValue(value, emitEvent = true) {
|
|
362
|
+
if (this._value === value) {
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
const dateValue = this.getDateValue(value);
|
|
366
|
+
const areDatesEqual = this._value instanceof Date &&
|
|
367
|
+
dateValue &&
|
|
368
|
+
dateValue.getTime() === this._value.getTime();
|
|
369
|
+
const isValidDateString = this.isDateStringValid(value);
|
|
370
|
+
// If the string value supplied is malformed, do not set the value to its Date equivalent.
|
|
371
|
+
// (JavaScript's Date parser will convert poorly formatted dates to Date objects, such as "abc 123", which isn't ideal.)
|
|
372
|
+
if (!isValidDateString) {
|
|
373
|
+
this._value = value;
|
|
374
|
+
if (emitEvent) {
|
|
375
|
+
this.onChange(this._value);
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
this.control?.setValue(this._value, { emitEvent: false });
|
|
379
|
+
}
|
|
380
|
+
this.datepickerComponent.selectedDate = this._value;
|
|
381
|
+
}
|
|
382
|
+
else if (dateValue !== this._value || !areDatesEqual) {
|
|
383
|
+
this._value = dateValue || value;
|
|
384
|
+
if (emitEvent) {
|
|
385
|
+
this.onChange(this._value);
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
this.control?.setValue(this._value, { emitEvent: false });
|
|
389
|
+
}
|
|
390
|
+
this.datepickerComponent.selectedDate = this._value;
|
|
391
|
+
}
|
|
392
|
+
if (dateValue && isValidDateString) {
|
|
393
|
+
const formattedDate = this.dateFormatter.format(dateValue, this.dateFormat);
|
|
394
|
+
this.setInputElementValue(formattedDate);
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
this.setInputElementValue(value || '');
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
SkyDatepickerInputDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDatepickerInputDirective, deps: [{ token: i1.SkyDatepickerAdapterService }, { token: i0.ChangeDetectorRef }, { token: i2.SkyDatepickerConfigService }, { token: i0.ElementRef }, { token: i3.SkyAppLocaleProvider }, { token: i0.Renderer2 }, { token: i3.SkyLibResourcesService }, { token: i4.SkyDatepickerComponent, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
|
|
402
|
+
SkyDatepickerInputDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.7", type: SkyDatepickerInputDirective, selector: "[skyDatepickerInput]", inputs: { dateFormat: "dateFormat", disabled: "disabled", maxDate: "maxDate", minDate: "minDate", skyDatepickerInput: "skyDatepickerInput", skyDatepickerNoValidate: "skyDatepickerNoValidate", startingDay: "startingDay", strict: "strict" }, host: { listeners: { "change": "onInputChange($event)", "blur": "onInputBlur()", "keyup": "onInputKeyup()" } }, providers: [
|
|
403
|
+
SKY_DATEPICKER_VALUE_ACCESSOR,
|
|
404
|
+
SKY_DATEPICKER_VALIDATOR,
|
|
405
|
+
SkyDatepickerAdapterService,
|
|
406
|
+
], ngImport: i0 });
|
|
407
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDatepickerInputDirective, decorators: [{
|
|
408
|
+
type: Directive,
|
|
409
|
+
args: [{
|
|
410
|
+
selector: '[skyDatepickerInput]',
|
|
411
|
+
providers: [
|
|
412
|
+
SKY_DATEPICKER_VALUE_ACCESSOR,
|
|
413
|
+
SKY_DATEPICKER_VALIDATOR,
|
|
414
|
+
SkyDatepickerAdapterService,
|
|
415
|
+
],
|
|
416
|
+
}]
|
|
417
|
+
}], ctorParameters: function () { return [{ type: i1.SkyDatepickerAdapterService }, { type: i0.ChangeDetectorRef }, { type: i2.SkyDatepickerConfigService }, { type: i0.ElementRef }, { type: i3.SkyAppLocaleProvider }, { type: i0.Renderer2 }, { type: i3.SkyLibResourcesService }, { type: i4.SkyDatepickerComponent, decorators: [{
|
|
418
|
+
type: Optional
|
|
419
|
+
}] }]; }, propDecorators: { dateFormat: [{
|
|
420
|
+
type: Input
|
|
421
|
+
}], disabled: [{
|
|
422
|
+
type: Input
|
|
423
|
+
}], maxDate: [{
|
|
424
|
+
type: Input
|
|
425
|
+
}], minDate: [{
|
|
426
|
+
type: Input
|
|
427
|
+
}], skyDatepickerInput: [{
|
|
428
|
+
type: Input
|
|
429
|
+
}], skyDatepickerNoValidate: [{
|
|
430
|
+
type: Input
|
|
431
|
+
}], startingDay: [{
|
|
432
|
+
type: Input
|
|
433
|
+
}], strict: [{
|
|
434
|
+
type: Input
|
|
435
|
+
}], onInputChange: [{
|
|
436
|
+
type: HostListener,
|
|
437
|
+
args: ['change', ['$event']]
|
|
438
|
+
}], onInputBlur: [{
|
|
439
|
+
type: HostListener,
|
|
440
|
+
args: ['blur']
|
|
441
|
+
}], onInputKeyup: [{
|
|
442
|
+
type: HostListener,
|
|
443
|
+
args: ['keyup']
|
|
444
|
+
}] } });
|
|
445
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbnB1dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0ZXRpbWUvc3JjL2xpYi9tb2R1bGVzL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGFBQWEsRUFDYixpQkFBaUIsR0FHbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFM0UsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFFaEUsc0RBQXNEO0FBQ3RELE1BQU0sNkJBQTZCLEdBQUc7SUFDcEMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDO0lBQzFELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQUVGLE1BQU0s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QUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQzFDO2FBQU07WUFDTCxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQzs7d0hBNWVVLDJCQUEyQjs0R0FBM0IsMkJBQTJCLCtZQU4zQjtRQUNULDZCQUE2QjtRQUM3Qix3QkFBd0I7UUFDeEIsMkJBQTJCO0tBQzVCOzJGQUVVLDJCQUEyQjtrQkFSdkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsc0JBQXNCO29CQUNoQyxTQUFTLEVBQUU7d0JBQ1QsNkJBQTZCO3dCQUM3Qix3QkFBd0I7d0JBQ3hCLDJCQUEyQjtxQkFDNUI7aUJBQ0Y7OzBCQW9MSSxRQUFROzRDQXBLQSxVQUFVO3NCQURwQixLQUFLO2dCQXNCSyxRQUFRO3NCQURsQixLQUFLO2dCQXdCSyxPQUFPO3NCQURqQixLQUFLO2dCQWlCSyxPQUFPO3NCQURqQixLQUFLO2dCQW1CSyxrQkFBa0I7c0JBRDVCLEtBQUs7Z0JBb0JDLHVCQUF1QjtzQkFEN0IsS0FBSztnQkFVSyxXQUFXO3NCQURyQixLQUFLO2dCQXFCSyxNQUFNO3NCQURoQixLQUFLO2dCQW1IQyxhQUFhO3NCQURuQixZQUFZO3VCQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkEwQjNCLFdBQVc7c0JBRGpCLFlBQVk7dUJBQUMsTUFBTTtnQkFNYixZQUFZO3NCQURsQixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFJlbmRlcmVyMixcbiAgZm9yd2FyZFJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTa3lBcHBMb2NhbGVQcm92aWRlciwgU2t5TGliUmVzb3VyY2VzU2VydmljZSB9IGZyb20gJ0Bza3l1eC9pMThuJztcblxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU2t5RGF0ZUZvcm1hdHRlciB9IGZyb20gJy4vZGF0ZS1mb3JtYXR0ZXInO1xuaW1wb3J0IHsgU2t5RGF0ZXBpY2tlckFkYXB0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9kYXRlcGlja2VyLWFkYXB0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTa3lEYXRlcGlja2VyQ29uZmlnU2VydmljZSB9IGZyb20gJy4vZGF0ZXBpY2tlci1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBTa3lEYXRlcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWZvcndhcmQtcmVmIG5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuY29uc3QgU0tZX0RBVEVQSUNLRVJfVkFMVUVfQUNDRVNTT1IgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTa3lEYXRlcGlja2VySW5wdXREaXJlY3RpdmUpLFxuICBtdWx0aTogdHJ1ZSxcbn07XG5cbmNvbnN0IFNLWV9EQVRFUElDS0VSX1ZBTElEQVRPUiA9IHtcbiAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2t5RGF0ZXBpY2tlcklucHV0RGlyZWN0aXZlKSxcbiAgbXVsdGk6IHRydWUsXG59O1xuLy8gdHNsaW50OmVuYWJsZVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbc2t5RGF0ZXBpY2tlcklucHV0XScsXG4gIHByb3ZpZGVyczogW1xuICAgIFNLWV9EQVRFUElDS0VSX1ZBTFVFX0FDQ0VTU09SLFxuICAgIFNLWV9EQVRFUElDS0VSX1ZBTElEQVRPUixcbiAgICBTa3lEYXRlcGlja2VyQWRhcHRlclNlcnZpY2UsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFNreURhdGVwaWNrZXJJbnB1dERpcmVjdGl2ZVxuICBpbXBsZW1lbnRzXG4gICAgT25Jbml0LFxuICAgIE9uRGVzdHJveSxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgVmFsaWRhdG9yXG57XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGRhdGUgZm9ybWF0IGZvciB0aGUgaW5wdXQuIFBsYWNlIHRoaXMgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnRcbiAgICogdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW4gdGhlIGBTa3lEYXRlcGlja2VyQ29uZmlnU2VydmljZWAuXG4gICAqIEBkZWZhdWx0IFwiTU0vREQvWVlZWVwiXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRhdGVGb3JtYXQodmFsdWU6IHN0cmluZykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9kYXRlRm9ybWF0KSB7XG4gICAgICB0aGlzLl9kYXRlRm9ybWF0ID0gdmFsdWU7XG4gICAgICB0aGlzLmFwcGx5RGF0ZUZvcm1hdCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0ZUZvcm1hdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9kYXRlRm9ybWF0IHx8XG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuZGF0ZUZvcm1hdCB8fFxuICAgICAgdGhpcy5wcmVmZXJyZWRTaG9ydERhdGVGb3JtYXRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGRpc2FibGUgdGhlIGRhdGVwaWNrZXIuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB0aGlzLmRhdGVwaWNrZXJDb21wb25lbnQuZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCB2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZCB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBpbnB1dCBlbGVtZW50IG9yIGFueSBvZiBpdHMgY2hpbGRyZW4gaGF2ZSBmb2N1cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5wdXRJc0ZvY3VzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5lbGVtZW50SXNGb2N1c2VkKCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBsYXRlc3QgZGF0ZSB0aGF0IGlzIGF2YWlsYWJsZSBpbiB0aGUgY2FsZW5kYXIuIFBsYWNlIHRoaXMgYXR0cmlidXRlIG9uXG4gICAqIHRoZSBgaW5wdXRgIGVsZW1lbnQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW4gYFNreURhdGVwaWNrZXJDb25maWdTZXJ2aWNlYC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbWF4RGF0ZSh2YWx1ZTogRGF0ZSkge1xuICAgIHRoaXMuX21heERhdGUgPSB2YWx1ZTtcbiAgICB0aGlzLmRhdGVwaWNrZXJDb21wb25lbnQubWF4RGF0ZSA9IHRoaXMubWF4RGF0ZTtcblxuICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF4RGF0ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4RGF0ZSB8fCB0aGlzLmNvbmZpZ1NlcnZpY2UubWF4RGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGVhcmxpZXN0IGRhdGUgdGhhdCBpcyBhdmFpbGFibGUgaW4gdGhlIGNhbGVuZGFyLiBQbGFjZSB0aGlzIGF0dHJpYnV0ZSBvblxuICAgKiB0aGUgYGlucHV0YCBlbGVtZW50IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGluIGBTa3lEYXRlcGlja2VyQ29uZmlnU2VydmljZWAuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IG1pbkRhdGUodmFsdWU6IERhdGUpIHtcbiAgICB0aGlzLl9taW5EYXRlID0gdmFsdWU7XG4gICAgdGhpcy5kYXRlcGlja2VyQ29tcG9uZW50Lm1pbkRhdGUgPSB0aGlzLm1pbkRhdGU7XG5cbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1pbkRhdGUoKTogRGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21pbkRhdGUgfHwgdGhpcy5jb25maWdTZXJ2aWNlLm1pbkRhdGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZGF0ZXBpY2tlciBpbnB1dCBhbmQgY2FsZW5kYXIuIFBsYWNlIHRoaXMgZGlyZWN0aXZlIG9uIGFuIGBpbnB1dGAgZWxlbWVudCxcbiAgICogYW5kIHdyYXAgdGhlIGlucHV0IGluIGEgYHNreS1kYXRlcGlja2VyYCBjb21wb25lbnQuIFRoZSB2YWx1ZSB0aGF0IHVzZXJzIHNlbGVjdCBpcyBkcml2ZW5cbiAgICogdGhyb3VnaCB0aGUgYG5nTW9kZWxgIGF0dHJpYnV0ZSBzcGVjaWZpZWQgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICogQHJlcXVpcmVkXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNreURhdGVwaWNrZXJJbnB1dChcbiAgICB2YWx1ZTogU2t5RGF0ZXBpY2tlckNvbXBvbmVudCB8IHVuZGVmaW5lZCB8ICcnXG4gICkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnW0RlcHJlY2F0aW9uIHdhcm5pbmddIFlvdSBubyBsb25nZXIgbmVlZCB0byBwcm92aWRlIGEgdGVtcGxhdGUgcmVmZXJlbmNlIHZhcmlhYmxlICcgK1xuICAgICAgICAgICd0byB0aGUgYHNreURhdGVwaWNrZXJJbnB1dGAgYXR0cmlidXRlICh0aGlzIHdpbGwgYmUgYSBicmVha2luZyBjaGFuZ2UgaW4gdGhlIG5leHQgJyArXG4gICAgICAgICAgJ21ham9yIHZlcnNpb24gcmVsZWFzZSkuXFxuJyArXG4gICAgICAgICAgJ0RvIHRoaXMgaW5zdGVhZDpcXG4nICtcbiAgICAgICAgICAnPHNreS1kYXRlcGlja2VyPlxcbiAgPGlucHV0IHNreURhdGVwaWNrZXJJbnB1dCAvPlxcbjwvc2t5LWRhdGVwaWNrZXI+J1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gZGlzYWJsZSBkYXRlIHZhbGlkYXRpb24gb24gdGhlIGRhdGVwaWNrZXIgaW5wdXQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2t5RGF0ZXBpY2tlck5vVmFsaWRhdGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBzdGFydGluZyBkYXkgb2YgdGhlIHdlZWsgaW4gdGhlIGNhbGVuZGFyLCB3aGVyZSBgMGAgc2V0cyB0aGUgc3RhcnRpbmcgZGF5XG4gICAqIHRvIFN1bmRheS4gUGxhY2UgdGhpcyBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdFxuICAgKiBpbiBgU2t5RGF0ZXBpY2tlckNvbmZpZ1NlcnZpY2VgLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHN0YXJ0aW5nRGF5KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zdGFydGluZ0RheSA9IHZhbHVlO1xuICAgIHRoaXMuZGF0ZXBpY2tlckNvbXBvbmVudC5zdGFydGluZ0RheSA9IHRoaXMuc3RhcnRpbmdEYXk7XG5cbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0YXJ0aW5nRGF5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0aW5nRGF5IHx8IHRoaXMuY29uZmlnU2VydmljZS5zdGFydGluZ0RheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZm9ybWF0IG9mIHRoZSBkYXRlIHZhbHVlIG11c3QgbWF0Y2ggdGhlIGZvcm1hdCBmcm9tIHRoZSBgZGF0ZUZvcm1hdGAgdmFsdWUuXG4gICAqIElmIHRoaXMgcHJvcGVydHkgaXMgYHRydWVgIGFuZCB0aGUgZGF0ZXBpY2tlciBpbnB1dCBkaXJlY3RpdmUgY2Fubm90IGZpbmQgYW4gZXhhY3QgbWF0Y2gsIHRoZW5cbiAgICogdGhlIGlucHV0IGlzIG1hcmtlZCBhcyBpbnZhbGlkLlxuICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIGBmYWxzZWAgYW5kIHRoZSBkYXRlcGlja2VyIGlucHV0IGRpcmVjdGl2ZSBjYW5ub3QgZmluZCBhbiBleGFjdCBtYXRjaCwgdGhlblxuICAgKiBpdCBhdHRlbXB0cyB0byBmb3JtYXQgdGhlIHN0cmluZyBiYXNlZCBvbiB0aGUgW0lTTyA4NjAxIHN0YW5kYXJkIGZvcm1hdF0oaHR0cHM6Ly93d3cuaXNvLm9yZy9pc28tODYwMS1kYXRlLWFuZC10aW1lLWZvcm1hdC5odG1sKS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc3RyaWN0KHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc3RyaWN0ID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0cmljdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RyaWN0IHx8IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy51cGRhdGVWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcbiAgcHJpdmF0ZSBkYXRlRm9ybWF0dGVyID0gbmV3IFNreURhdGVGb3JtYXR0ZXIoKTtcbiAgcHJpdmF0ZSBpbml0aWFsUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgcHJpdmF0ZSBwcmVmZXJyZWRTaG9ydERhdGVGb3JtYXQ6IHN0cmluZztcbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIF9kYXRlRm9ybWF0OiBzdHJpbmc7XG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuO1xuICBwcml2YXRlIF9tYXhEYXRlOiBEYXRlO1xuICBwcml2YXRlIF9taW5EYXRlOiBEYXRlO1xuICBwcml2YXRlIF9zdGFydGluZ0RheTogbnVtYmVyO1xuICBwcml2YXRlIF9zdHJpY3Q6IGJvb2xlYW47XG4gIHByaXZhdGUgX3ZhbHVlOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhZGFwdGVyOiBTa3lEYXRlcGlja2VyQWRhcHRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBTa3lEYXRlcGlja2VyQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBsb2NhbGVQcm92aWRlcjogU2t5QXBwTG9jYWxlUHJvdmlkZXIsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgcmVzb3VyY2VzU2VydmljZTogU2t5TGliUmVzb3VyY2VzU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRhdGVwaWNrZXJDb21wb25lbnQ6IFNreURhdGVwaWNrZXJDb21wb25lbnRcbiAgKSB7XG4gICAgdGhpcy5pbml0aWFsUGxhY2Vob2xkZXIgPSB0aGlzLmFkYXB0ZXIuZ2V0UGxhY2Vob2xkZXIodGhpcy5lbGVtZW50UmVmKTtcbiAgICB0aGlzLnVwZGF0ZVBsYWNlaG9sZGVyKCk7XG5cbiAgICB0aGlzLmxvY2FsZVByb3ZpZGVyXG4gICAgICAuZ2V0TG9jYWxlSW5mbygpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGxvY2FsZUluZm8pID0+IHtcbiAgICAgICAgU2t5RGF0ZUZvcm1hdHRlci5zZXRMb2NhbGUobG9jYWxlSW5mby5sb2NhbGUpO1xuICAgICAgICB0aGlzLnByZWZlcnJlZFNob3J0RGF0ZUZvcm1hdCA9XG4gICAgICAgICAgU2t5RGF0ZUZvcm1hdHRlci5nZXRQcmVmZXJyZWRTaG9ydERhdGVGb3JtYXQoKTtcbiAgICAgICAgdGhpcy5hcHBseURhdGVGb3JtYXQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kYXRlcGlja2VyQ29tcG9uZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdZb3UgbXVzdCB3cmFwIHRoZSBgc2t5RGF0ZXBpY2tlcklucHV0YCBkaXJlY3RpdmUgd2l0aGluIGEgJyArXG4gICAgICAgICAgJ2A8c2t5LWRhdGVwaWNrZXI+YCBjb21wb25lbnQhJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQsICdza3ktZm9ybS1jb250cm9sJyk7XG5cbiAgICBjb25zdCBoYXNBcmlhTGFiZWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpO1xuXG4gICAgaWYgKCFoYXNBcmlhTGFiZWwpIHtcbiAgICAgIHRoaXMucmVzb3VyY2VzU2VydmljZVxuICAgICAgICAuZ2V0U3RyaW5nKCdza3l1eF9kYXRlX2ZpZWxkX2RlZmF1bHRfbGFiZWwnKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsZW1lbnQsICdhcmlhLWxhYmVsJywgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGF0ZXBpY2tlckNvbXBvbmVudC5kYXRlQ2hhbmdlXG4gICAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCh2YWx1ZTogRGF0ZSkgPT4ge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYWRkcmVzcyBhIGJ1ZyBpbiBBbmd1bGFyIDQuXG4gICAgLy8gV2hlbiBhIGNvbnRyb2wgdmFsdWUgaXMgc2V0IGludGlhbGx5LCBpdHMgdmFsdWUgaXMgbm90IHJlcHJlc2VudGVkIG9uIHRoZSB2aWV3LlxuICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTM3OTJcbiAgICAvLyBPZiBub3RlIGlzIHRoZSBwYXJlbnQgY2hlY2sgd2hpY2ggYWxsb3dzIHVzIHRvIGRldGVybWluZSBpZiB0aGUgZm9ybSBpcyByZWFjdGl2ZS5cbiAgICAvLyBXaXRob3V0IHRoaXMgY2hlY2sgdGhlcmUgaXMgYSBjaGFuZ2VkIGJlZm9yZSBjaGVja2VkIGVycm9yXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5wYXJlbnQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodGhpcy52YWx1ZSwge1xuICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmFkYXB0ZXIuaW5pdCh0aGlzLmVsZW1lbnRSZWYpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjaGFuZ2UnLCBbJyRldmVudCddKVxuICBwdWJsaWMgb25JbnB1dENoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG5cbiAgICBpZiAodGhpcy5za3lEYXRlcGlja2VyTm9WYWxpZGF0ZSkge1xuICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlKHZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEb24ndCB0cnkgdG8gcGFyc2UgdGhlIHN0cmluZyB2YWx1ZSBpbnRvIGEgRGF0ZSB2YWx1ZSBpZiBpdCBpcyBtYWxmb3JtZWQuXG4gICAgaWYgKHRoaXMuaXNEYXRlU3RyaW5nVmFsaWQodmFsdWUpKSB7XG4gICAgICB0aGlzLm9uVmFsdWVDaGFuZ2UodmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG5cbiAgICB0aGlzLmNvbnRyb2wuc2V0RXJyb3JzKHtcbiAgICAgIHNreURhdGU6IHtcbiAgICAgICAgaW52YWxpZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgcHVibGljIG9uSW5wdXRCbHVyKCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdrZXl1cCcpXG4gIHB1YmxpYyBvbklucHV0S2V5dXAoKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVWYWx1ZSh2YWx1ZSwgZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgIGlmICghdGhpcy5jb250cm9sKSB7XG4gICAgICB0aGlzLmNvbnRyb2wgPSBjb250cm9sO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNreURhdGVwaWNrZXJOb1ZhbGlkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWU6IGFueSA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGF0ZVZhbHVlID0gdGhpcy5nZXREYXRlVmFsdWUodmFsdWUpO1xuICAgIGNvbnN0IGlzRGF0ZVZhbGlkID0gZGF0ZVZhbHVlICYmIHRoaXMuZGF0ZUZvcm1hdHRlci5kYXRlSXNWYWxpZChkYXRlVmFsdWUpO1xuXG4gICAgaWYgKCFpc0RhdGVWYWxpZCB8fCAhdGhpcy5pc0RhdGVTdHJpbmdWYWxpZCh2YWx1ZSkpIHtcbiAgICAgIC8vIE1hcmsgdGhlIGludmFsaWQgY29udHJvbCBhcyB0b3VjaGVkIHNvIHRoYXQgdGhlIGlucHV0J3MgaW52YWxpZCBDU1Mgc3R5bGVzIGFwcGVhci5cbiAgICAgIC8vIChUaGlzIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiB0aGUgaW52YWxpZCB2YWx1ZSBpcyBzZXQgYnkgdGhlIEZvcm1Db250cm9sIGNvbnN0cnVjdG9yLilcbiAgICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNreURhdGU6IHtcbiAgICAgICAgICBpbnZhbGlkOiB2YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgbWluRGF0ZSA9IHRoaXMubWluRGF0ZTtcblxuICAgIGlmIChtaW5EYXRlICYmIHRoaXMuZGF0ZUZvcm1hdHRlci5kYXRlSXNWYWxpZChtaW5EYXRlKSAmJiB2YWx1ZSA8IG1pbkRhdGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNreURhdGU6IHtcbiAgICAgICAgICBtaW5EYXRlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEYXRlID0gdGhpcy5tYXhEYXRlO1xuXG4gICAgaWYgKG1heERhdGUgJiYgdGhpcy5kYXRlRm9ybWF0dGVyLmRhdGVJc1ZhbGlkKG1heERhdGUpICYmIHZhbHVlID4gbWF4RGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2t5RGF0ZToge1xuICAgICAgICAgIG1heERhdGUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIHRoaXMuZGF0ZXBpY2tlckNvbXBvbmVudC5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdHMgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBpbnB1dCBlbGVtZW50J3MgdmFsdWUgYW5kIHVwZGF0ZXMgdGhlIG5nTW9kZWwgYWNjb3JkaW5nbHkuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBuZWVkIHRvIHVwZGF0ZSB0aGUgbmdNb2RlbCB2YWx1ZSBiZWZvcmUgdGhlIGlucHV0IGVsZW1lbnQgbG9zZXMgZm9jdXMuXG4gICAqL1xuICBwdWJsaWMgZGV0ZWN0SW5wdXRWYWx1ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2UodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseURhdGVGb3JtYXQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVQbGFjZWhvbGRlcigpO1xuICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gdGhpcy5kYXRlRm9ybWF0dGVyLmZvcm1hdChcbiAgICAgICAgdGhpcy52YWx1ZSxcbiAgICAgICAgdGhpcy5kYXRlRm9ybWF0XG4gICAgICApO1xuICAgICAgdGhpcy5zZXRJbnB1dEVsZW1lbnRWYWx1ZShmb3JtYXR0ZWREYXRlKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblZhbHVlQ2hhbmdlKG5ld1ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHNldElucHV0RWxlbWVudFZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERhdGVWYWx1ZSh2YWx1ZTogYW55KTogRGF0ZSB7XG4gICAgbGV0IGRhdGVWYWx1ZTogRGF0ZTtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBkYXRlVmFsdWUgPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGVGb3JtYXR0ZXIuZ2V0RGF0ZUZyb21TdHJpbmcoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0aGlzLmRhdGVGb3JtYXQsXG4gICAgICAgIHRoaXMuc3RyaWN0XG4gICAgICApO1xuICAgICAgaWYgKHRoaXMuZGF0ZUZvcm1hdHRlci5kYXRlSXNWYWxpZChkYXRlKSkge1xuICAgICAgICBkYXRlVmFsdWUgPSBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRlVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBpbnB1dCB2YWx1ZSB0byBlbnN1cmUgaXQgaXMgZm9ybWF0dGVkIGNvcnJlY3RseS5cbiAgICovXG4gIHByaXZhdGUgaXNEYXRlU3RyaW5nVmFsaWQodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gRG9lcyB0aGUgdmFsdWUgb25seSBpbmNsdWRlIGRpZ2l0cywgZGFzaGVzLCBvciBzbGFzaGVzP1xuICAgIGNvbnN0IHJlZ2V4cCA9IC9eW1xcZC8tXSskLztcbiAgICBjb25zdCBpc1ZhbGlkID0gcmVnZXhwLnRlc3QodmFsdWUpO1xuXG4gICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIElmIG5vdCwgZG9lcyBpdCBjb25mb3JtIHRvIHRoZSBzdGFuZGFyZCBJU08gZm9ybWF0P1xuICAgIGNvbnN0IGlzVmFsaWRJc28gPSBtb21lbnQodmFsdWUsIG1vbWVudC5JU09fODYwMSkuaXNWYWxpZCgpO1xuXG4gICAgcmV0dXJuIGlzVmFsaWRJc287XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByaXZhdGUgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByaXZhdGUgb25WYWxpZGF0b3JDaGFuZ2UgPSAoKSA9PiB7fTtcblxuICBwcml2YXRlIHVwZGF0ZVBsYWNlaG9sZGVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbml0aWFsUGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMuYWRhcHRlci5zZXRQbGFjZWhvbGRlcih0aGlzLmVsZW1lbnRSZWYsIHRoaXMuZGF0ZUZvcm1hdCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIGZvcm0gY29udHJvbCBhbmQgaW5wdXQgZWxlbWVudFxuICAgKiBAcGFyYW0gZW1pdEV2ZW50IERlbm90ZXMgaWYgd2UgZW1pdCBhbiBldmVudCB0byB0aGUgY29uc3VtZXIncyBmb3JtIGNvbnRyb2wuIFdlIGRvIG5vdCB3YW50IHRvIGRvIHRoaXMgaWYgdGhlIHZhbHVlIGlzIGJlaW5nIHVwZGF0ZWQgdmlhIGEgYHNldFZhbHVlYCBjYWxsIG9yIGEgYHBhdGNoVmFsdWVgIGNhbGwgYXMgdGhpcyBpcyBhbHJlYWR5IGhhbmRsZWQgYnkgQW5ndWxhci5cbiAgICogSW4gdGhlc2UgY2FzZXMgd2UgZG8gbm90IHdhbnQgdG8gZmlyZSBgb25DaGFuZ2VgIGFzIGl0IHdpbGwgY2F1c2UgZXh0cmEgYHZhbHVlQ2hhbmdlYCBhbmQgYHN0YXR1c0NoYW5nZWAgZXZlbnRzIGFuZCB0aGUgc3RhdHVzIG9mIHRoZSBmb3JtIHNob3VsZCBub3QgYmUgYWZmZWN0ZWQgYnkgdGhlc2UgY2hhbmdlcy5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVmFsdWUodmFsdWU6IGFueSwgZW1pdEV2ZW50ID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl92YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRlVmFsdWUgPSB0aGlzLmdldERhdGVWYWx1ZSh2YWx1ZSk7XG5cbiAgICBjb25zdCBhcmVEYXRlc0VxdWFsID1cbiAgICAgIHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJlxuICAgICAgZGF0ZVZhbHVlICYmXG4gICAgICBkYXRlVmFsdWUuZ2V0VGltZSgpID09PSB0aGlzLl92YWx1ZS5nZXRUaW1lKCk7XG5cbiAgICBjb25zdCBpc1ZhbGlkRGF0ZVN0cmluZyA9IHRoaXMuaXNEYXRlU3RyaW5nVmFsaWQodmFsdWUpO1xuXG4gICAgLy8gSWYgdGhlIHN0cmluZyB2YWx1ZSBzdXBwbGllZCBpcyBtYWxmb3JtZWQsIGRvIG5vdCBzZXQgdGhlIHZhbHVlIHRvIGl0cyBEYXRlIGVxdWl2YWxlbnQuXG4gICAgLy8gKEphdmFTY3JpcHQncyBEYXRlIHBhcnNlciB3aWxsIGNvbnZlcnQgcG9vcmx5IGZvcm1hdHRlZCBkYXRlcyB0byBEYXRlIG9iamVjdHMsIHN1Y2ggYXMgXCJhYmMgMTIzXCIsIHdoaWNoIGlzbid0IGlkZWFsLilcbiAgICBpZiAoIWlzVmFsaWREYXRlU3RyaW5nKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29udHJvbD8uc2V0VmFsdWUodGhpcy5fdmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kYXRlcGlja2VyQ29tcG9uZW50LnNlbGVjdGVkRGF0ZSA9IHRoaXMuX3ZhbHVlO1xuICAgIH0gZWxzZSBpZiAoZGF0ZVZhbHVlICE9PSB0aGlzLl92YWx1ZSB8fCAhYXJlRGF0ZXNFcXVhbCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSBkYXRlVmFsdWUgfHwgdmFsdWU7XG4gICAgICBpZiAoZW1pdEV2ZW50KSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5fdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb250cm9sPy5zZXRWYWx1ZSh0aGlzLl92YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRhdGVwaWNrZXJDb21wb25lbnQuc2VsZWN0ZWREYXRlID0gdGhpcy5fdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGVWYWx1ZSAmJiBpc1ZhbGlkRGF0ZVN0cmluZykge1xuICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuZGF0ZUZvcm1hdHRlci5mb3JtYXQoXG4gICAgICAgIGRhdGVWYWx1ZSxcbiAgICAgICAgdGhpcy5kYXRlRm9ybWF0XG4gICAgICApO1xuICAgICAgdGhpcy5zZXRJbnB1dEVsZW1lbnRWYWx1ZShmb3JtYXR0ZWREYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRJbnB1dEVsZW1lbnRWYWx1ZSh2YWx1ZSB8fCAnJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
|