@netwin/angular-datetime-picker 18.1.0 → 19.0.0-rc.1
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/README.md +1 -27
- package/assets/style/picker.min.css +1 -1
- package/esm2022/lib/date-time/adapter/date-time-adapter.class.mjs +7 -13
- package/esm2022/lib/date-time/adapter/date-time-format.class.mjs +1 -4
- package/esm2022/lib/date-time/adapter/native-date-time-adapter.class.mjs +21 -36
- package/esm2022/lib/date-time/adapter/native-date-time-format.class.mjs +1 -2
- package/esm2022/lib/date-time/adapter/native-date-time.module.mjs +9 -12
- package/esm2022/lib/date-time/adapter/unix-timestamp-adapter/unix-timestamp-date-time-adapter.class.mjs +12 -25
- package/esm2022/lib/date-time/adapter/unix-timestamp-adapter/unix-timestamp-date-time-format.class.mjs +1 -2
- package/esm2022/lib/date-time/calendar-body.component.mjs +22 -31
- package/esm2022/lib/date-time/calendar-month-view.component.mjs +13 -29
- package/esm2022/lib/date-time/calendar-multi-year-view.component.mjs +11 -17
- package/esm2022/lib/date-time/calendar-year-view.component.mjs +11 -19
- package/esm2022/lib/date-time/calendar.component.mjs +16 -27
- package/esm2022/lib/date-time/date-time-inline.component.mjs +262 -108
- package/esm2022/lib/date-time/date-time-picker-intl.service.mjs +4 -11
- package/esm2022/lib/date-time/date-time.module.mjs +12 -36
- package/esm2022/lib/date-time/options-provider.mjs +1 -1
- package/esm2022/lib/date-time/timer-box.component.mjs +6 -16
- package/esm2022/lib/date-time/timer.component.mjs +18 -17
- package/esm2022/lib/types/date-view.mjs +19 -0
- package/esm2022/lib/types/index.mjs +4 -0
- package/esm2022/lib/types/picker-type.mjs +2 -0
- package/esm2022/lib/types/select-mode.mjs +2 -0
- package/esm2022/lib/utils/array.utils.mjs +2 -9
- package/esm2022/lib/utils/constants.mjs +1 -4
- package/esm2022/lib/utils/date.utils.mjs +1 -4
- package/esm2022/public_api.mjs +13 -20
- package/fesm2022/netwin-angular-datetime-picker.mjs +2653 -5112
- package/fesm2022/netwin-angular-datetime-picker.mjs.map +1 -1
- package/lib/date-time/adapter/date-time-adapter.class.d.ts +16 -26
- package/lib/date-time/adapter/date-time-format.class.d.ts +8 -12
- package/lib/date-time/adapter/native-date-time-adapter.class.d.ts +7 -18
- package/lib/date-time/adapter/native-date-time-format.class.d.ts +0 -3
- package/lib/date-time/adapter/unix-timestamp-adapter/unix-timestamp-date-time-adapter.class.d.ts +6 -17
- package/lib/date-time/adapter/unix-timestamp-adapter/unix-timestamp-date-time-format.class.d.ts +0 -3
- package/lib/date-time/calendar-body.component.d.ts +21 -26
- package/lib/date-time/calendar-month-view.component.d.ts +19 -24
- package/lib/date-time/calendar-multi-year-view.component.d.ts +7 -8
- package/lib/date-time/calendar-year-view.component.d.ts +8 -9
- package/lib/date-time/calendar.component.d.ts +15 -21
- package/lib/date-time/date-time-inline.component.d.ts +164 -74
- package/lib/date-time/date-time-picker-intl.service.d.ts +0 -4
- package/lib/date-time/date-time.module.d.ts +11 -18
- package/lib/date-time/timer-box.component.d.ts +4 -5
- package/lib/date-time/timer.component.d.ts +6 -9
- package/lib/types/date-view.d.ts +17 -0
- package/lib/types/index.d.ts +3 -0
- package/lib/types/picker-type.d.ts +7 -0
- package/lib/types/select-mode.d.ts +8 -0
- package/lib/utils/array.utils.d.ts +0 -3
- package/lib/utils/constants.d.ts +0 -3
- package/lib/utils/date.utils.d.ts +0 -3
- package/package.json +1 -1
- package/public_api.d.ts +12 -19
- package/esm2022/lib/date-time/date-time-picker-container.component.mjs +0 -405
- package/esm2022/lib/date-time/date-time-picker-input.directive.mjs +0 -598
- package/esm2022/lib/date-time/date-time-picker-trigger.directive.mjs +0 -64
- package/esm2022/lib/date-time/date-time-picker.animations.mjs +0 -21
- package/esm2022/lib/date-time/date-time-picker.component.mjs +0 -564
- package/esm2022/lib/date-time/date-time.class.mjs +0 -176
- package/esm2022/lib/date-time/numberedFixLen.pipe.mjs +0 -28
- package/esm2022/lib/dialog/dialog-config.class.mjs +0 -59
- package/esm2022/lib/dialog/dialog-container.component.mjs +0 -232
- package/esm2022/lib/dialog/dialog-ref.class.mjs +0 -134
- package/esm2022/lib/dialog/dialog.module.mjs +0 -26
- package/esm2022/lib/dialog/dialog.service.mjs +0 -228
- package/esm2022/lib/utils/index.mjs +0 -5
- package/esm2022/lib/utils/object.utils.mjs +0 -26
- package/lib/date-time/date-time-picker-container.component.d.ts +0 -130
- package/lib/date-time/date-time-picker-input.directive.d.ts +0 -164
- package/lib/date-time/date-time-picker-trigger.directive.d.ts +0 -23
- package/lib/date-time/date-time-picker.animations.d.ts +0 -8
- package/lib/date-time/date-time-picker.component.d.ts +0 -173
- package/lib/date-time/date-time.class.d.ts +0 -103
- package/lib/date-time/numberedFixLen.pipe.d.ts +0 -10
- package/lib/dialog/dialog-config.class.d.ts +0 -169
- package/lib/dialog/dialog-container.component.d.ts +0 -58
- package/lib/dialog/dialog-ref.class.d.ts +0 -51
- package/lib/dialog/dialog.module.d.ts +0 -11
- package/lib/dialog/dialog.service.d.ts +0 -76
- package/lib/utils/index.d.ts +0 -4
- package/lib/utils/object.utils.d.ts +0 -11
|
@@ -1,564 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* date-time-picker.component
|
|
3
|
-
*/
|
|
4
|
-
import { coerceArray, coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
5
|
-
import { ESCAPE, UP_ARROW } from '@angular/cdk/keycodes';
|
|
6
|
-
import { Overlay, OverlayConfig } from '@angular/cdk/overlay';
|
|
7
|
-
import { ComponentPortal } from '@angular/cdk/portal';
|
|
8
|
-
import { DOCUMENT } from '@angular/common';
|
|
9
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, Inject, InjectionToken, Input, Optional, Output } from '@angular/core';
|
|
10
|
-
import { Subscription, merge } from 'rxjs';
|
|
11
|
-
import { filter, take } from 'rxjs/operators';
|
|
12
|
-
import { OWL_DATE_TIME_FORMATS } from './adapter/date-time-format.class';
|
|
13
|
-
import { OwlDateTimeContainerComponent } from './date-time-picker-container.component';
|
|
14
|
-
import { OwlDateTime } from './date-time.class';
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "@angular/cdk/overlay";
|
|
17
|
-
import * as i2 from "../dialog/dialog.service";
|
|
18
|
-
import * as i3 from "./adapter/date-time-adapter.class";
|
|
19
|
-
/** Injection token that determines the scroll handling while the dtPicker is open. */
|
|
20
|
-
export const OWL_DTPICKER_SCROLL_STRATEGY = new InjectionToken('owl-dtpicker-scroll-strategy');
|
|
21
|
-
/** @docs-private */
|
|
22
|
-
export function OWL_DTPICKER_SCROLL_STRATEGY_PROVIDER_FACTORY(overlay) {
|
|
23
|
-
const fn = () => overlay.scrollStrategies.block();
|
|
24
|
-
return fn;
|
|
25
|
-
}
|
|
26
|
-
/** @docs-private */
|
|
27
|
-
export const OWL_DTPICKER_SCROLL_STRATEGY_PROVIDER = {
|
|
28
|
-
provide: OWL_DTPICKER_SCROLL_STRATEGY,
|
|
29
|
-
deps: [Overlay],
|
|
30
|
-
useFactory: OWL_DTPICKER_SCROLL_STRATEGY_PROVIDER_FACTORY
|
|
31
|
-
};
|
|
32
|
-
export class OwlDateTimeComponent extends OwlDateTime {
|
|
33
|
-
get startAt() {
|
|
34
|
-
// If an explicit startAt is set we start there, otherwise we start at whatever the currently
|
|
35
|
-
// selected value is.
|
|
36
|
-
if (this._startAt) {
|
|
37
|
-
return this._startAt;
|
|
38
|
-
}
|
|
39
|
-
if (this._dtInput) {
|
|
40
|
-
if (this._dtInput.selectMode === 'single') {
|
|
41
|
-
return this._dtInput.value || null;
|
|
42
|
-
}
|
|
43
|
-
else if (this._dtInput.selectMode === 'range' || this._dtInput.selectMode === 'rangeFrom') {
|
|
44
|
-
return this._dtInput.values[0] || null;
|
|
45
|
-
}
|
|
46
|
-
else if (this._dtInput.selectMode === 'rangeTo') {
|
|
47
|
-
return this._dtInput.values[1] || null;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
set startAt(date) {
|
|
53
|
-
this._startAt = this.getValidDate(this.dateTimeAdapter.deserialize(date));
|
|
54
|
-
}
|
|
55
|
-
get endAt() {
|
|
56
|
-
if (this._endAt) {
|
|
57
|
-
return this._endAt;
|
|
58
|
-
}
|
|
59
|
-
if (this._dtInput) {
|
|
60
|
-
if (this._dtInput.selectMode === 'single') {
|
|
61
|
-
return this._dtInput.value || null;
|
|
62
|
-
}
|
|
63
|
-
else if (this._dtInput.selectMode === 'range' || this._dtInput.selectMode === 'rangeFrom') {
|
|
64
|
-
return this._dtInput.values[1] || null;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
69
|
-
set endAt(date) {
|
|
70
|
-
this._endAt = this.getValidDate(this.dateTimeAdapter.deserialize(date));
|
|
71
|
-
}
|
|
72
|
-
get pickerType() {
|
|
73
|
-
return this._pickerType;
|
|
74
|
-
}
|
|
75
|
-
set pickerType(val) {
|
|
76
|
-
if (val !== this._pickerType) {
|
|
77
|
-
this._pickerType = val;
|
|
78
|
-
if (this._dtInput) {
|
|
79
|
-
this._dtInput.formatNativeInputValue();
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
get pickerMode() {
|
|
84
|
-
return this._pickerMode;
|
|
85
|
-
}
|
|
86
|
-
set pickerMode(mode) {
|
|
87
|
-
if (mode === 'popup') {
|
|
88
|
-
this._pickerMode = mode;
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
this._pickerMode = 'dialog';
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
get disabled() {
|
|
95
|
-
return this._disabled === undefined && this._dtInput ? this._dtInput.disabled : !!this._disabled;
|
|
96
|
-
}
|
|
97
|
-
set disabled(value) {
|
|
98
|
-
value = coerceBooleanProperty(value);
|
|
99
|
-
if (value !== this._disabled) {
|
|
100
|
-
this._disabled = value;
|
|
101
|
-
this.disabledChange.next(value);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
get opened() {
|
|
105
|
-
return this._opened;
|
|
106
|
-
}
|
|
107
|
-
set opened(val) {
|
|
108
|
-
if (val) {
|
|
109
|
-
this.open();
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
this.close();
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
get dtInput() {
|
|
116
|
-
return this._dtInput;
|
|
117
|
-
}
|
|
118
|
-
get selected() {
|
|
119
|
-
return this._selected;
|
|
120
|
-
}
|
|
121
|
-
set selected(value) {
|
|
122
|
-
this._selected = value;
|
|
123
|
-
this.changeDetector.markForCheck();
|
|
124
|
-
}
|
|
125
|
-
get selecteds() {
|
|
126
|
-
return this._selecteds;
|
|
127
|
-
}
|
|
128
|
-
set selecteds(values) {
|
|
129
|
-
this._selecteds = values;
|
|
130
|
-
this.changeDetector.markForCheck();
|
|
131
|
-
}
|
|
132
|
-
/** The minimum selectable date. */
|
|
133
|
-
get minDateTime() {
|
|
134
|
-
return this._dtInput && this._dtInput.min;
|
|
135
|
-
}
|
|
136
|
-
/** The maximum selectable date. */
|
|
137
|
-
get maxDateTime() {
|
|
138
|
-
return this._dtInput && this._dtInput.max;
|
|
139
|
-
}
|
|
140
|
-
get dateTimeFilter() {
|
|
141
|
-
return this._dtInput && this._dtInput.dateTimeFilter;
|
|
142
|
-
}
|
|
143
|
-
get selectMode() {
|
|
144
|
-
return this._dtInput.selectMode;
|
|
145
|
-
}
|
|
146
|
-
get isInSingleMode() {
|
|
147
|
-
return this._dtInput.isInSingleMode;
|
|
148
|
-
}
|
|
149
|
-
get isInRangeMode() {
|
|
150
|
-
return this._dtInput.isInRangeMode;
|
|
151
|
-
}
|
|
152
|
-
constructor(overlay, viewContainerRef, dialogService, ngZone, changeDetector, dateTimeAdapter, defaultScrollStrategy, dateTimeFormats, document) {
|
|
153
|
-
super(dateTimeAdapter, dateTimeFormats);
|
|
154
|
-
this.overlay = overlay;
|
|
155
|
-
this.viewContainerRef = viewContainerRef;
|
|
156
|
-
this.dialogService = dialogService;
|
|
157
|
-
this.ngZone = ngZone;
|
|
158
|
-
this.changeDetector = changeDetector;
|
|
159
|
-
this.dateTimeAdapter = dateTimeAdapter;
|
|
160
|
-
this.dateTimeFormats = dateTimeFormats;
|
|
161
|
-
this.document = document;
|
|
162
|
-
/** Custom class for the picker backdrop. */
|
|
163
|
-
this.backdropClass = [];
|
|
164
|
-
/** Custom class for the picker overlay pane. */
|
|
165
|
-
this.panelClass = [];
|
|
166
|
-
/**
|
|
167
|
-
* Set the type of the dateTime picker
|
|
168
|
-
* 'both' -- show both calendar and timer
|
|
169
|
-
* 'calendar' -- show only calendar
|
|
170
|
-
* 'timer' -- show only timer
|
|
171
|
-
*/
|
|
172
|
-
this._pickerType = 'both';
|
|
173
|
-
/**
|
|
174
|
-
* Whether the picker open as a dialog
|
|
175
|
-
*/
|
|
176
|
-
this._pickerMode = 'popup';
|
|
177
|
-
/** Whether the calendar is open. */
|
|
178
|
-
this._opened = false;
|
|
179
|
-
/**
|
|
180
|
-
* Callback when the picker is closed
|
|
181
|
-
* */
|
|
182
|
-
this.afterPickerClosed = new EventEmitter();
|
|
183
|
-
/**
|
|
184
|
-
* Callback before the picker is open
|
|
185
|
-
* */
|
|
186
|
-
this.beforePickerOpen = new EventEmitter();
|
|
187
|
-
/**
|
|
188
|
-
* Callback when the picker is open
|
|
189
|
-
* */
|
|
190
|
-
this.afterPickerOpen = new EventEmitter();
|
|
191
|
-
/**
|
|
192
|
-
* Emits selected year in multi-year view
|
|
193
|
-
* This doesn't imply a change on the selected date.
|
|
194
|
-
* */
|
|
195
|
-
this.yearSelected = new EventEmitter();
|
|
196
|
-
/**
|
|
197
|
-
* Emits selected month in year view
|
|
198
|
-
* This doesn't imply a change on the selected date.
|
|
199
|
-
* */
|
|
200
|
-
this.monthSelected = new EventEmitter();
|
|
201
|
-
/**
|
|
202
|
-
* Emits selected date
|
|
203
|
-
* */
|
|
204
|
-
this.dateSelected = new EventEmitter();
|
|
205
|
-
/**
|
|
206
|
-
* Emit when the selected value has been confirmed
|
|
207
|
-
* */
|
|
208
|
-
this.confirmSelectedChange = new EventEmitter();
|
|
209
|
-
/**
|
|
210
|
-
* Emits when the date time picker is disabled.
|
|
211
|
-
* */
|
|
212
|
-
this.disabledChange = new EventEmitter();
|
|
213
|
-
this.dtInputSub = Subscription.EMPTY;
|
|
214
|
-
this.hidePickerStreamSub = Subscription.EMPTY;
|
|
215
|
-
this.confirmSelectedStreamSub = Subscription.EMPTY;
|
|
216
|
-
this.pickerOpenedStreamSub = Subscription.EMPTY;
|
|
217
|
-
this.pickerBeforeOpenedStreamSub = Subscription.EMPTY;
|
|
218
|
-
/** The element that was focused before the date time picker was opened. */
|
|
219
|
-
this.focusedElementBeforeOpen = null;
|
|
220
|
-
this._selecteds = [];
|
|
221
|
-
this.defaultScrollStrategy = defaultScrollStrategy;
|
|
222
|
-
}
|
|
223
|
-
ngOnDestroy() {
|
|
224
|
-
this.close();
|
|
225
|
-
this.dtInputSub.unsubscribe();
|
|
226
|
-
this.disabledChange.complete();
|
|
227
|
-
if (this.popupRef) {
|
|
228
|
-
this.popupRef.dispose();
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
registerInput(input) {
|
|
232
|
-
if (this._dtInput) {
|
|
233
|
-
throw Error('A Owl DateTimePicker can only be associated with a single input.');
|
|
234
|
-
}
|
|
235
|
-
this._dtInput = input;
|
|
236
|
-
this.dtInputSub = this._dtInput.valueChange.subscribe((value) => {
|
|
237
|
-
if (Array.isArray(value)) {
|
|
238
|
-
this.selecteds = value;
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
this.selected = value;
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
open() {
|
|
246
|
-
if (this._opened || this.disabled) {
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
if (!this._dtInput) {
|
|
250
|
-
throw Error('Attempted to open an DateTimePicker with no associated input.');
|
|
251
|
-
}
|
|
252
|
-
if (this.document) {
|
|
253
|
-
this.focusedElementBeforeOpen = this.document.activeElement;
|
|
254
|
-
}
|
|
255
|
-
// reset the picker selected value
|
|
256
|
-
if (this.isInSingleMode) {
|
|
257
|
-
this.selected = this._dtInput.value;
|
|
258
|
-
}
|
|
259
|
-
else if (this.isInRangeMode) {
|
|
260
|
-
this.selecteds = this._dtInput.values;
|
|
261
|
-
}
|
|
262
|
-
// when the picker is open , we make sure the picker's current selected time value
|
|
263
|
-
// is the same as the _startAt time value.
|
|
264
|
-
if (this.selected && this.pickerType !== 'calendar' && this._startAt) {
|
|
265
|
-
this.selected = this.dateTimeAdapter.createDate(this.dateTimeAdapter.getYear(this.selected), this.dateTimeAdapter.getMonth(this.selected), this.dateTimeAdapter.getDate(this.selected), this.dateTimeAdapter.getHours(this._startAt), this.dateTimeAdapter.getMinutes(this._startAt), this.dateTimeAdapter.getSeconds(this._startAt));
|
|
266
|
-
}
|
|
267
|
-
if (this.pickerMode === 'dialog') {
|
|
268
|
-
this.openAsDialog();
|
|
269
|
-
}
|
|
270
|
-
else {
|
|
271
|
-
this.openAsPopup();
|
|
272
|
-
}
|
|
273
|
-
this.pickerContainer.picker = this;
|
|
274
|
-
// Listen to picker container's hidePickerStream
|
|
275
|
-
this.hidePickerStreamSub = this.pickerContainer.hidePickerStream.subscribe(() => {
|
|
276
|
-
this.close();
|
|
277
|
-
});
|
|
278
|
-
// Listen to picker container's confirmSelectedStream
|
|
279
|
-
this.confirmSelectedStreamSub = this.pickerContainer.confirmSelectedStream.subscribe((event) => {
|
|
280
|
-
this.confirmSelect(event);
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* Selects the given date
|
|
285
|
-
*/
|
|
286
|
-
select(date) {
|
|
287
|
-
if (Array.isArray(date)) {
|
|
288
|
-
this.selecteds = [...date];
|
|
289
|
-
}
|
|
290
|
-
else {
|
|
291
|
-
this.selected = date;
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* Cases in which automatically confirm the select when date or dates are selected:
|
|
295
|
-
* 1) picker mode is NOT 'dialog'
|
|
296
|
-
* 2) picker type is 'calendar' and selectMode is 'single'.
|
|
297
|
-
* 3) picker type is 'calendar' and selectMode is 'range' and
|
|
298
|
-
* the 'selecteds' has 'from'(selecteds[0]) and 'to'(selecteds[1]) values.
|
|
299
|
-
* 4) selectMode is 'rangeFrom' and selecteds[0] has value.
|
|
300
|
-
* 5) selectMode is 'rangeTo' and selecteds[1] has value.
|
|
301
|
-
* */
|
|
302
|
-
if (this.pickerMode !== 'dialog' &&
|
|
303
|
-
this.pickerType === 'calendar' &&
|
|
304
|
-
((this.selectMode === 'single' && this.selected) ||
|
|
305
|
-
(this.selectMode === 'rangeFrom' && this.selecteds[0]) ||
|
|
306
|
-
(this.selectMode === 'rangeTo' && this.selecteds[1]) ||
|
|
307
|
-
(this.selectMode === 'range' && this.selecteds[0] && this.selecteds[1]))) {
|
|
308
|
-
this.confirmSelect();
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
/**
|
|
312
|
-
* Emits the selected year in multi-year view
|
|
313
|
-
* */
|
|
314
|
-
selectYear(normalizedYear) {
|
|
315
|
-
this.yearSelected.emit(normalizedYear);
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Emits selected month in year view
|
|
319
|
-
* */
|
|
320
|
-
selectMonth(normalizedMonth) {
|
|
321
|
-
this.monthSelected.emit(normalizedMonth);
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Emits the selected date
|
|
325
|
-
* */
|
|
326
|
-
selectDate(normalizedDate) {
|
|
327
|
-
this.dateSelected.emit(normalizedDate);
|
|
328
|
-
}
|
|
329
|
-
/**
|
|
330
|
-
* Hide the picker
|
|
331
|
-
*/
|
|
332
|
-
close() {
|
|
333
|
-
if (!this._opened) {
|
|
334
|
-
return;
|
|
335
|
-
}
|
|
336
|
-
if (this.popupRef && this.popupRef.hasAttached()) {
|
|
337
|
-
this.popupRef.detach();
|
|
338
|
-
}
|
|
339
|
-
if (this.pickerContainerPortal && this.pickerContainerPortal.isAttached) {
|
|
340
|
-
this.pickerContainerPortal.detach();
|
|
341
|
-
}
|
|
342
|
-
if (this.hidePickerStreamSub) {
|
|
343
|
-
this.hidePickerStreamSub.unsubscribe();
|
|
344
|
-
this.hidePickerStreamSub = null;
|
|
345
|
-
}
|
|
346
|
-
if (this.confirmSelectedStreamSub) {
|
|
347
|
-
this.confirmSelectedStreamSub.unsubscribe();
|
|
348
|
-
this.confirmSelectedStreamSub = null;
|
|
349
|
-
}
|
|
350
|
-
if (this.pickerBeforeOpenedStreamSub) {
|
|
351
|
-
this.pickerBeforeOpenedStreamSub.unsubscribe();
|
|
352
|
-
this.pickerBeforeOpenedStreamSub = null;
|
|
353
|
-
}
|
|
354
|
-
if (this.pickerOpenedStreamSub) {
|
|
355
|
-
this.pickerOpenedStreamSub.unsubscribe();
|
|
356
|
-
this.pickerOpenedStreamSub = null;
|
|
357
|
-
}
|
|
358
|
-
if (this.dialogRef) {
|
|
359
|
-
this.dialogRef.close();
|
|
360
|
-
this.dialogRef = null;
|
|
361
|
-
}
|
|
362
|
-
const completeClose = () => {
|
|
363
|
-
if (this._opened) {
|
|
364
|
-
this._opened = false;
|
|
365
|
-
const selected = this.selected || this.selecteds;
|
|
366
|
-
this.afterPickerClosed.emit(selected);
|
|
367
|
-
this.focusedElementBeforeOpen = null;
|
|
368
|
-
}
|
|
369
|
-
};
|
|
370
|
-
if (this.focusedElementBeforeOpen && typeof this.focusedElementBeforeOpen.focus === 'function') {
|
|
371
|
-
// Because IE moves focus asynchronously, we can't count on it being restored before we've
|
|
372
|
-
// marked the datepicker as closed. If the event fires out of sequence and the element that
|
|
373
|
-
// we're refocusing opens the datepicker on focus, the user could be stuck with not being
|
|
374
|
-
// able to close the calendar at all. We work around it by making the logic, that marks
|
|
375
|
-
// the datepicker as closed, async as well.
|
|
376
|
-
this.focusedElementBeforeOpen.focus();
|
|
377
|
-
setTimeout(completeClose);
|
|
378
|
-
}
|
|
379
|
-
else {
|
|
380
|
-
completeClose();
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* Confirm the selected value
|
|
385
|
-
*/
|
|
386
|
-
confirmSelect(event) {
|
|
387
|
-
if (this.isInSingleMode) {
|
|
388
|
-
const selected = this.selected || this.startAt || this.dateTimeAdapter.now();
|
|
389
|
-
this.confirmSelectedChange.emit(selected);
|
|
390
|
-
}
|
|
391
|
-
else if (this.isInRangeMode) {
|
|
392
|
-
this.confirmSelectedChange.emit(this.selecteds);
|
|
393
|
-
}
|
|
394
|
-
this.close();
|
|
395
|
-
return;
|
|
396
|
-
}
|
|
397
|
-
/**
|
|
398
|
-
* Open the picker as a dialog
|
|
399
|
-
*/
|
|
400
|
-
openAsDialog() {
|
|
401
|
-
this.dialogRef = this.dialogService.open(OwlDateTimeContainerComponent, {
|
|
402
|
-
autoFocus: false,
|
|
403
|
-
backdropClass: ['cdk-overlay-dark-backdrop', ...coerceArray(this.backdropClass)],
|
|
404
|
-
paneClass: ['owl-dt-dialog', ...coerceArray(this.panelClass)],
|
|
405
|
-
viewContainerRef: this.viewContainerRef,
|
|
406
|
-
scrollStrategy: this.scrollStrategy || this.defaultScrollStrategy()
|
|
407
|
-
});
|
|
408
|
-
this.pickerContainer = this.dialogRef.componentInstance;
|
|
409
|
-
this.dialogRef.beforeOpen().subscribe(() => {
|
|
410
|
-
this.beforePickerOpen.emit(null);
|
|
411
|
-
});
|
|
412
|
-
this.dialogRef.afterOpen().subscribe(() => {
|
|
413
|
-
this.afterPickerOpen.emit(null);
|
|
414
|
-
this._opened = true;
|
|
415
|
-
});
|
|
416
|
-
this.dialogRef.afterClosed().subscribe(() => this.close());
|
|
417
|
-
}
|
|
418
|
-
/**
|
|
419
|
-
* Open the picker as popup
|
|
420
|
-
*/
|
|
421
|
-
openAsPopup() {
|
|
422
|
-
if (!this.pickerContainerPortal) {
|
|
423
|
-
this.pickerContainerPortal = new ComponentPortal(OwlDateTimeContainerComponent, this.viewContainerRef);
|
|
424
|
-
}
|
|
425
|
-
if (!this.popupRef) {
|
|
426
|
-
this.createPopup();
|
|
427
|
-
}
|
|
428
|
-
if (!this.popupRef.hasAttached()) {
|
|
429
|
-
const componentRef = this.popupRef.attach(this.pickerContainerPortal);
|
|
430
|
-
this.pickerContainer = componentRef.instance;
|
|
431
|
-
// Update the position once the calendar has rendered.
|
|
432
|
-
this.ngZone.onStable
|
|
433
|
-
.asObservable()
|
|
434
|
-
.pipe(take(1))
|
|
435
|
-
.subscribe(() => {
|
|
436
|
-
this.popupRef.updatePosition();
|
|
437
|
-
});
|
|
438
|
-
this.pickerBeforeOpenedStreamSub = this.pickerContainer.beforePickerOpenedStream.pipe(take(1)).subscribe(() => {
|
|
439
|
-
this.beforePickerOpen.emit(null);
|
|
440
|
-
});
|
|
441
|
-
// emit open stream
|
|
442
|
-
this.pickerOpenedStreamSub = this.pickerContainer.pickerOpenedStream.pipe(take(1)).subscribe(() => {
|
|
443
|
-
this.afterPickerOpen.emit(null);
|
|
444
|
-
this._opened = true;
|
|
445
|
-
});
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
createPopup() {
|
|
449
|
-
const overlayConfig = new OverlayConfig({
|
|
450
|
-
positionStrategy: this.createPopupPositionStrategy(),
|
|
451
|
-
hasBackdrop: true,
|
|
452
|
-
backdropClass: ['cdk-overlay-transparent-backdrop', ...coerceArray(this.backdropClass)],
|
|
453
|
-
scrollStrategy: this.scrollStrategy || this.defaultScrollStrategy(),
|
|
454
|
-
panelClass: ['owl-dt-popup', ...coerceArray(this.panelClass)]
|
|
455
|
-
});
|
|
456
|
-
this.popupRef = this.overlay.create(overlayConfig);
|
|
457
|
-
merge(this.popupRef.backdropClick(), this.popupRef.detachments(), this.popupRef
|
|
458
|
-
.keydownEvents()
|
|
459
|
-
.pipe(filter((event) => event.keyCode === ESCAPE || (this._dtInput && event.altKey && event.keyCode === UP_ARROW)))).subscribe(() => this.close());
|
|
460
|
-
}
|
|
461
|
-
/**
|
|
462
|
-
* Create the popup PositionStrategy.
|
|
463
|
-
* */
|
|
464
|
-
createPopupPositionStrategy() {
|
|
465
|
-
return this.overlay
|
|
466
|
-
.position()
|
|
467
|
-
.flexibleConnectedTo(this._dtInput.elementRef)
|
|
468
|
-
.withTransformOriginOn('.owl-dt-container')
|
|
469
|
-
.withFlexibleDimensions(false)
|
|
470
|
-
.withPush(false)
|
|
471
|
-
.withPositions([
|
|
472
|
-
{
|
|
473
|
-
originX: 'start',
|
|
474
|
-
originY: 'bottom',
|
|
475
|
-
overlayX: 'start',
|
|
476
|
-
overlayY: 'top'
|
|
477
|
-
},
|
|
478
|
-
{
|
|
479
|
-
originX: 'start',
|
|
480
|
-
originY: 'top',
|
|
481
|
-
overlayX: 'start',
|
|
482
|
-
overlayY: 'bottom'
|
|
483
|
-
},
|
|
484
|
-
{
|
|
485
|
-
originX: 'end',
|
|
486
|
-
originY: 'bottom',
|
|
487
|
-
overlayX: 'end',
|
|
488
|
-
overlayY: 'top'
|
|
489
|
-
},
|
|
490
|
-
{
|
|
491
|
-
originX: 'end',
|
|
492
|
-
originY: 'top',
|
|
493
|
-
overlayX: 'end',
|
|
494
|
-
overlayY: 'bottom'
|
|
495
|
-
},
|
|
496
|
-
{
|
|
497
|
-
originX: 'start',
|
|
498
|
-
originY: 'top',
|
|
499
|
-
overlayX: 'start',
|
|
500
|
-
overlayY: 'top',
|
|
501
|
-
offsetY: -176
|
|
502
|
-
},
|
|
503
|
-
{
|
|
504
|
-
originX: 'start',
|
|
505
|
-
originY: 'top',
|
|
506
|
-
overlayX: 'start',
|
|
507
|
-
overlayY: 'top',
|
|
508
|
-
offsetY: -352
|
|
509
|
-
}
|
|
510
|
-
]);
|
|
511
|
-
}
|
|
512
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: OwlDateTimeComponent, deps: [{ token: i1.Overlay }, { token: i0.ViewContainerRef }, { token: i2.OwlDialogService }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i3.DateTimeAdapter, optional: true }, { token: OWL_DTPICKER_SCROLL_STRATEGY }, { token: OWL_DATE_TIME_FORMATS, optional: true }, { token: DOCUMENT, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
513
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: OwlDateTimeComponent, selector: "owl-date-time", inputs: { backdropClass: "backdropClass", panelClass: "panelClass", startAt: "startAt", endAt: "endAt", pickerType: "pickerType", pickerMode: "pickerMode", disabled: "disabled", opened: "opened", scrollStrategy: "scrollStrategy" }, outputs: { afterPickerClosed: "afterPickerClosed", beforePickerOpen: "beforePickerOpen", afterPickerOpen: "afterPickerOpen", yearSelected: "yearSelected", monthSelected: "monthSelected", dateSelected: "dateSelected" }, exportAs: ["owlDateTime"], usesInheritance: true, ngImport: i0, template: "", styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
514
|
-
}
|
|
515
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: OwlDateTimeComponent, decorators: [{
|
|
516
|
-
type: Component,
|
|
517
|
-
args: [{ selector: 'owl-date-time', exportAs: 'owlDateTime', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, template: "" }]
|
|
518
|
-
}], ctorParameters: () => [{ type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: i2.OwlDialogService }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i3.DateTimeAdapter, decorators: [{
|
|
519
|
-
type: Optional
|
|
520
|
-
}] }, { type: undefined, decorators: [{
|
|
521
|
-
type: Inject,
|
|
522
|
-
args: [OWL_DTPICKER_SCROLL_STRATEGY]
|
|
523
|
-
}] }, { type: undefined, decorators: [{
|
|
524
|
-
type: Optional
|
|
525
|
-
}, {
|
|
526
|
-
type: Inject,
|
|
527
|
-
args: [OWL_DATE_TIME_FORMATS]
|
|
528
|
-
}] }, { type: undefined, decorators: [{
|
|
529
|
-
type: Optional
|
|
530
|
-
}, {
|
|
531
|
-
type: Inject,
|
|
532
|
-
args: [DOCUMENT]
|
|
533
|
-
}] }], propDecorators: { backdropClass: [{
|
|
534
|
-
type: Input
|
|
535
|
-
}], panelClass: [{
|
|
536
|
-
type: Input
|
|
537
|
-
}], startAt: [{
|
|
538
|
-
type: Input
|
|
539
|
-
}], endAt: [{
|
|
540
|
-
type: Input
|
|
541
|
-
}], pickerType: [{
|
|
542
|
-
type: Input
|
|
543
|
-
}], pickerMode: [{
|
|
544
|
-
type: Input
|
|
545
|
-
}], disabled: [{
|
|
546
|
-
type: Input
|
|
547
|
-
}], opened: [{
|
|
548
|
-
type: Input
|
|
549
|
-
}], scrollStrategy: [{
|
|
550
|
-
type: Input
|
|
551
|
-
}], afterPickerClosed: [{
|
|
552
|
-
type: Output
|
|
553
|
-
}], beforePickerOpen: [{
|
|
554
|
-
type: Output
|
|
555
|
-
}], afterPickerOpen: [{
|
|
556
|
-
type: Output
|
|
557
|
-
}], yearSelected: [{
|
|
558
|
-
type: Output
|
|
559
|
-
}], monthSelected: [{
|
|
560
|
-
type: Output
|
|
561
|
-
}], dateSelected: [{
|
|
562
|
-
type: Output
|
|
563
|
-
}] } });
|
|
564
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9waWNrZXIvc3JjL2xpYi9kYXRlLXRpbWUvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9waWNrZXIvc3JjL2xpYi9kYXRlLXRpbWUvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFFTCxPQUFPLEVBQ1AsYUFBYSxFQUlkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLGNBQWMsRUFDZCxLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTlDLE9BQU8sRUFBRSxxQkFBcUIsRUFBc0IsTUFBTSxrQ0FBa0MsQ0FBQztBQUM3RixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV2RixPQUFPLEVBQUUsV0FBVyxFQUFzQyxNQUFNLG1CQUFtQixDQUFDOzs7OztBQUVwRixzRkFBc0Y7QUFDdEYs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ZDtTQUNGLENBQUMsQ0FBQztJQUNQLENBQUM7OEdBam1CVSxvQkFBb0IsK01BOFByQiw0QkFBNEIsYUFFNUIscUJBQXFCLDZCQUdyQixRQUFRO2tHQW5RUCxvQkFBb0IsMGlCQ2pFakMsRUFBQTs7MkZEaUVhLG9CQUFvQjtrQkFSaEMsU0FBUzsrQkFDRSxlQUFlLFlBQ2YsYUFBYSxtQkFHTix1QkFBdUIsQ0FBQyxNQUFNLHVCQUMxQixLQUFLOzswQkErUHZCLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsNEJBQTRCOzswQkFDbkMsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxxQkFBcUI7OzBCQUU1QixRQUFROzswQkFDUixNQUFNOzJCQUFDLFFBQVE7eUNBaFFYLGFBQWE7c0JBRG5CLEtBQUs7Z0JBS0MsVUFBVTtzQkFEaEIsS0FBSztnQkFNRixPQUFPO3NCQURWLEtBQUs7Z0JBNEJGLEtBQUs7c0JBRFIsS0FBSztnQkE0QkYsVUFBVTtzQkFEYixLQUFLO2dCQW1CRixVQUFVO3NCQURiLEtBQUs7Z0JBZ0JPLFFBQVE7c0JBRHBCLEtBQUs7Z0JBZ0JGLE1BQU07c0JBRFQsS0FBSztnQkFrQkMsY0FBYztzQkFEcEIsS0FBSztnQkFPTixpQkFBaUI7c0JBRGhCLE1BQU07Z0JBT1AsZ0JBQWdCO3NCQURmLE1BQU07Z0JBT1AsZUFBZTtzQkFEZCxNQUFNO2dCQVFQLFlBQVk7c0JBRFgsTUFBTTtnQkFRUCxhQUFhO3NCQURaLE1BQU07Z0JBT1AsWUFBWTtzQkFEWCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBkYXRlLXRpbWUtcGlja2VyLmNvbXBvbmVudFxuICovXG5cbmltcG9ydCB7IGNvZXJjZUFycmF5LCBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgRVNDQVBFLCBVUF9BUlJPVyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQge1xuICBCbG9ja1Njcm9sbFN0cmF0ZWd5LFxuICBPdmVybGF5LFxuICBPdmVybGF5Q29uZmlnLFxuICBPdmVybGF5UmVmLFxuICBQb3NpdGlvblN0cmF0ZWd5LFxuICBTY3JvbGxTdHJhdGVneVxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT3dsRGlhbG9nUmVmIH0gZnJvbSAnLi4vZGlhbG9nL2RpYWxvZy1yZWYuY2xhc3MnO1xuaW1wb3J0IHsgT3dsRGlhbG9nU2VydmljZSB9IGZyb20gJy4uL2RpYWxvZy9kaWFsb2cuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRlVGltZUFkYXB0ZXIgfSBmcm9tICcuL2FkYXB0ZXIvZGF0ZS10aW1lLWFkYXB0ZXIuY2xhc3MnO1xuaW1wb3J0IHsgT1dMX0RBVEVfVElNRV9GT1JNQVRTLCBPd2xEYXRlVGltZUZvcm1hdHMgfSBmcm9tICcuL2FkYXB0ZXIvZGF0ZS10aW1lLWZvcm1hdC5jbGFzcyc7XG5pbXBvcnQgeyBPd2xEYXRlVGltZUNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4vZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE93bERhdGVUaW1lSW5wdXREaXJlY3RpdmUgfSBmcm9tICcuL2RhdGUtdGltZS1waWNrZXItaW5wdXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IE93bERhdGVUaW1lLCBQaWNrZXJNb2RlLCBQaWNrZXJUeXBlLCBTZWxlY3RNb2RlIH0gZnJvbSAnLi9kYXRlLXRpbWUuY2xhc3MnO1xuXG4vKiogSW5qZWN0aW9uIHRva2VuIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc2Nyb2xsIGhhbmRsaW5nIHdoaWxlIHRoZSBkdFBpY2tlciBpcyBvcGVuLiAqL1xuZXhwb3J0IGNvbnN0IE9XTF9EVFBJQ0tFUl9TQ1JPTExfU1RSQVRFR1kgPSBuZXcgSW5qZWN0aW9uVG9rZW48KCkgPT4gU2Nyb2xsU3RyYXRlZ3k+KCdvd2wtZHRwaWNrZXItc2Nyb2xsLXN0cmF0ZWd5Jyk7XG5cbi8qKiBAZG9jcy1wcml2YXRlICovXG5leHBvcnQgZnVuY3Rpb24gT1dMX0RUUElDS0VSX1NDUk9MTF9TVFJBVEVHWV9QUk9WSURFUl9GQUNUT1JZKG92ZXJsYXk6IE92ZXJsYXkpOiAoKSA9PiBCbG9ja1Njcm9sbFN0cmF0ZWd5IHtcbiAgY29uc3QgZm4gPSAoKSA9PiBvdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKTtcbiAgcmV0dXJuIGZuO1xufVxuXG4vKiogQGRvY3MtcHJpdmF0ZSAqL1xuZXhwb3J0IGNvbnN0IE9XTF9EVFBJQ0tFUl9TQ1JPTExfU1RSQVRFR1lfUFJPVklERVIgPSB7XG4gIHByb3ZpZGU6IE9XTF9EVFBJQ0tFUl9TQ1JPTExfU1RSQVRFR1ksXG4gIGRlcHM6IFtPdmVybGF5XSxcbiAgdXNlRmFjdG9yeTogT1dMX0RUUElDS0VSX1NDUk9MTF9TVFJBVEVHWV9QUk9WSURFUl9GQUNUT1JZXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvd2wtZGF0ZS10aW1lJyxcbiAgZXhwb3J0QXM6ICdvd2xEYXRlVGltZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXRpbWUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2Vcbn0pXG5leHBvcnQgY2xhc3MgT3dsRGF0ZVRpbWVDb21wb25lbnQ8VD4gZXh0ZW5kcyBPd2xEYXRlVGltZTxUPiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8qKiBDdXN0b20gY2xhc3MgZm9yIHRoZSBwaWNrZXIgYmFja2Ryb3AuICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBiYWNrZHJvcENsYXNzOiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgLyoqIEN1c3RvbSBjbGFzcyBmb3IgdGhlIHBpY2tlciBvdmVybGF5IHBhbmUuICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBwYW5lbENsYXNzOiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgLyoqIFRoZSBkYXRlIHRvIG9wZW4gdGhlIGNhbGVuZGFyIHRvIGluaXRpYWxseS4gKi9cbiAgcHJpdmF0ZSBfc3RhcnRBdDogVCB8IG51bGw7XG4gIEBJbnB1dCgpXG4gIGdldCBzdGFydEF0KCk6IFQgfCBudWxsIHtcbiAgICAvLyBJZiBhbiBleHBsaWNpdCBzdGFydEF0IGlzIHNldCB3ZSBzdGFydCB0aGVyZSwgb3RoZXJ3aXNlIHdlIHN0YXJ0IGF0IHdoYXRldmVyIHRoZSBjdXJyZW50bHlcbiAgICAvLyBzZWxlY3RlZCB2YWx1ZSBpcy5cbiAgICBpZiAodGhpcy5fc3RhcnRBdCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0QXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2R0SW5wdXQpIHtcbiAgICAgIGlmICh0aGlzLl9kdElucHV0LnNlbGVjdE1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kdElucHV0LnZhbHVlIHx8IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2R0SW5wdXQuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJyB8fCB0aGlzLl9kdElucHV0LnNlbGVjdE1vZGUgPT09ICdyYW5nZUZyb20nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kdElucHV0LnZhbHVlc1swXSB8fCBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9kdElucHV0LnNlbGVjdE1vZGUgPT09ICdyYW5nZVRvJykge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHRJbnB1dC52YWx1ZXNbMV0gfHwgbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHNldCBzdGFydEF0KGRhdGU6IFQgfCBudWxsKSB7XG4gICAgdGhpcy5fc3RhcnRBdCA9IHRoaXMuZ2V0VmFsaWREYXRlKHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGRhdGUpKTtcbiAgfVxuXG4gIC8qKiBUaGUgZW5kIGRhdGUgdG8gc2V0IGZvciByYW5nZSBjYWxlbmRhci4gKi9cbiAgcHJpdmF0ZSBfZW5kQXQ6IFQgfCBudWxsO1xuICBASW5wdXQoKVxuICBnZXQgZW5kQXQoKTogVCB8IG51bGwge1xuICAgIGlmICh0aGlzLl9lbmRBdCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VuZEF0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9kdElucHV0KSB7XG4gICAgICBpZiAodGhpcy5fZHRJbnB1dC5zZWxlY3RNb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHRJbnB1dC52YWx1ZSB8fCBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9kdElucHV0LnNlbGVjdE1vZGUgPT09ICdyYW5nZScgfHwgdGhpcy5fZHRJbnB1dC5zZWxlY3RNb2RlID09PSAncmFuZ2VGcm9tJykge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHRJbnB1dC52YWx1ZXNbMV0gfHwgbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzZXQgZW5kQXQoZGF0ZTogVCB8IG51bGwpIHtcbiAgICB0aGlzLl9lbmRBdCA9IHRoaXMuZ2V0VmFsaWREYXRlKHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGRhdGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHR5cGUgb2YgdGhlIGRhdGVUaW1lIHBpY2tlclxuICAgKiAgICAgICdib3RoJyAtLSBzaG93IGJvdGggY2FsZW5kYXIgYW5kIHRpbWVyXG4gICAqICAgICAgJ2NhbGVuZGFyJyAtLSBzaG93IG9ubHkgY2FsZW5kYXJcbiAgICogICAgICAndGltZXInIC0tIHNob3cgb25seSB0aW1lclxuICAgKi9cbiAgcHJpdmF0ZSBfcGlja2VyVHlwZTogUGlja2VyVHlwZSA9ICdib3RoJztcbiAgQElucHV0KClcbiAgZ2V0IHBpY2tlclR5cGUoKTogUGlja2VyVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3BpY2tlclR5cGU7XG4gIH1cblxuICBzZXQgcGlja2VyVHlwZSh2YWw6IFBpY2tlclR5cGUpIHtcbiAgICBpZiAodmFsICE9PSB0aGlzLl9waWNrZXJUeXBlKSB7XG4gICAgICB0aGlzLl9waWNrZXJUeXBlID0gdmFsO1xuICAgICAgaWYgKHRoaXMuX2R0SW5wdXQpIHtcbiAgICAgICAgdGhpcy5fZHRJbnB1dC5mb3JtYXROYXRpdmVJbnB1dFZhbHVlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBpY2tlciBvcGVuIGFzIGEgZGlhbG9nXG4gICAqL1xuICBfcGlja2VyTW9kZTogUGlja2VyTW9kZSA9ICdwb3B1cCc7XG4gIEBJbnB1dCgpXG4gIGdldCBwaWNrZXJNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl9waWNrZXJNb2RlO1xuICB9XG5cbiAgc2V0IHBpY2tlck1vZGUobW9kZTogUGlja2VyTW9kZSkge1xuICAgIGlmIChtb2RlID09PSAncG9wdXAnKSB7XG4gICAgICB0aGlzLl9waWNrZXJNb2RlID0gbW9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcGlja2VyTW9kZSA9ICdkaWFsb2cnO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBkYXRlIHRpbWUgcGlja2VyIHNob3VsZCBiZSBkaXNhYmxlZC4gKi9cbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl9kdElucHV0ID8gdGhpcy5fZHRJbnB1dC5kaXNhYmxlZCA6ICEhdGhpcy5fZGlzYWJsZWQ7XG4gIH1cblxuICBvdmVycmlkZSBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB2YWx1ZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9kaXNhYmxlZCkge1xuICAgICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICAgIHRoaXMuZGlzYWJsZWRDaGFuZ2UubmV4dCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGNhbGVuZGFyIGlzIG9wZW4uICovXG4gIHByaXZhdGUgX29wZW5lZCA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgb3BlbmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vcGVuZWQ7XG4gIH1cblxuICBzZXQgb3BlbmVkKHZhbDogYm9vbGVhbikge1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHRoaXMub3BlbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzY3JvbGwgc3RyYXRlZ3kgd2hlbiB0aGUgcGlja2VyIGlzIG9wZW5cbiAgICogTGVhcm4gbW9yZSB0aGlzIGZyb20gaHR0cHM6Ly9tYXRlcmlhbC5hbmd1bGFyLmlvL2Nkay9vdmVybGF5L292ZXJ2aWV3I3Njcm9sbC1zdHJhdGVnaWVzXG4gICAqICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzY3JvbGxTdHJhdGVneTogU2Nyb2xsU3RyYXRlZ3k7XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHdoZW4gdGhlIHBpY2tlciBpcyBjbG9zZWRcbiAgICogKi9cbiAgQE91dHB1dCgpXG4gIGFmdGVyUGlja2VyQ2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGJlZm9yZSB0aGUgcGlja2VyIGlzIG9wZW5cbiAgICogKi9cbiAgQE91dHB1dCgpXG4gIGJlZm9yZVBpY2tlck9wZW4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiB0aGUgcGlja2VyIGlzIG9wZW5cbiAgICogKi9cbiAgQE91dHB1dCgpXG4gIGFmdGVyUGlja2VyT3BlbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBzZWxlY3RlZCB5ZWFyIGluIG11bHRpLXllYXIgdmlld1xuICAgKiBUaGlzIGRvZXNuJ3QgaW1wbHkgYSBjaGFuZ2Ugb24gdGhlIHNlbGVjdGVkIGRhdGUuXG4gICAqICovXG4gIEBPdXRwdXQoKVxuICB5ZWFyU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHNlbGVjdGVkIG1vbnRoIGluIHllYXIgdmlld1xuICAgKiBUaGlzIGRvZXNuJ3QgaW1wbHkgYSBjaGFuZ2Ugb24gdGhlIHNlbGVjdGVkIGRhdGUuXG4gICAqICovXG4gIEBPdXRwdXQoKVxuICBtb250aFNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBzZWxlY3RlZCBkYXRlXG4gICAqICovXG4gIEBPdXRwdXQoKVxuICBkYXRlU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXQgd2hlbiB0aGUgc2VsZWN0ZWQgdmFsdWUgaGFzIGJlZW4gY29uZmlybWVkXG4gICAqICovXG4gIHB1YmxpYyBjb25maXJtU2VsZWN0ZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PFQ+IHwgVD4oKTtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGUgZGF0ZSB0aW1lIHBpY2tlciBpcyBkaXNhYmxlZC5cbiAgICogKi9cbiAgcHVibGljIGRpc2FibGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIHByaXZhdGUgcGlja2VyQ29udGFpbmVyUG9ydGFsOiBDb21wb25lbnRQb3J0YWw8T3dsRGF0ZVRpbWVDb250YWluZXJDb21wb25lbnQ8VD4+O1xuICBwcml2YXRlIHBpY2tlckNvbnRhaW5lcjogT3dsRGF0ZVRpbWVDb250YWluZXJDb21wb25lbnQ8VD47XG4gIHByaXZhdGUgcG9wdXBSZWY6IE92ZXJsYXlSZWY7XG4gIHByaXZhdGUgZGlhbG9nUmVmOiBPd2xEaWFsb2dSZWY8T3dsRGF0ZVRpbWVDb250YWluZXJDb21wb25lbnQ8VD4+O1xuICBwcml2YXRlIGR0SW5wdXRTdWIgPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHByaXZhdGUgaGlkZVBpY2tlclN0cmVhbVN1YiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgcHJpdmF0ZSBjb25maXJtU2VsZWN0ZWRTdHJlYW1TdWIgPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHByaXZhdGUgcGlja2VyT3BlbmVkU3RyZWFtU3ViID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICBwcml2YXRlIHBpY2tlckJlZm9yZU9wZW5lZFN0cmVhbVN1YiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcblxuICAvKiogVGhlIGVsZW1lbnQgdGhhdCB3YXMgZm9jdXNlZCBiZWZvcmUgdGhlIGRhdGUgdGltZSBwaWNrZXIgd2FzIG9wZW5lZC4gKi9cbiAgcHJpdmF0ZSBmb2N1c2VkRWxlbWVudEJlZm9yZU9wZW46IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfZHRJbnB1dDogT3dsRGF0ZVRpbWVJbnB1dERpcmVjdGl2ZTxUPjtcbiAgZ2V0IGR0SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2R0SW5wdXQ7XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RlZDogVCB8IG51bGw7XG4gIGdldCBzZWxlY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7XG4gIH1cblxuICBzZXQgc2VsZWN0ZWQodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWQgPSB2YWx1ZTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0ZWRzOiBBcnJheTxUPiA9IFtdO1xuICBnZXQgc2VsZWN0ZWRzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZHM7XG4gIH1cblxuICBzZXQgc2VsZWN0ZWRzKHZhbHVlczogQXJyYXk8VD4pIHtcbiAgICB0aGlzLl9zZWxlY3RlZHMgPSB2YWx1ZXM7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBUaGUgbWluaW11bSBzZWxlY3RhYmxlIGRhdGUuICovXG4gIGdldCBtaW5EYXRlVGltZSgpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2R0SW5wdXQgJiYgdGhpcy5fZHRJbnB1dC5taW47XG4gIH1cblxuICAvKiogVGhlIG1heGltdW0gc2VsZWN0YWJsZSBkYXRlLiAqL1xuICBnZXQgbWF4RGF0ZVRpbWUoKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9kdElucHV0ICYmIHRoaXMuX2R0SW5wdXQubWF4O1xuICB9XG5cbiAgZ2V0IGRhdGVUaW1lRmlsdGVyKCk6IChkYXRlOiBUIHwgbnVsbCkgPT4gYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2R0SW5wdXQgJiYgdGhpcy5fZHRJbnB1dC5kYXRlVGltZUZpbHRlcjtcbiAgfVxuXG4gIGdldCBzZWxlY3RNb2RlKCk6IFNlbGVjdE1vZGUge1xuICAgIHJldHVybiB0aGlzLl9kdElucHV0LnNlbGVjdE1vZGU7XG4gIH1cblxuICBnZXQgaXNJblNpbmdsZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2R0SW5wdXQuaXNJblNpbmdsZU1vZGU7XG4gIH1cblxuICBnZXQgaXNJblJhbmdlTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZHRJbnB1dC5pc0luUmFuZ2VNb2RlO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0U2Nyb2xsU3RyYXRlZ3k6ICgpID0+IFNjcm9sbFN0cmF0ZWd5O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBvdmVybGF5OiBPdmVybGF5LFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IE93bERpYWxvZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBvdmVycmlkZSBkYXRlVGltZUFkYXB0ZXI6IERhdGVUaW1lQWRhcHRlcjxUPixcbiAgICBASW5qZWN0KE9XTF9EVFBJQ0tFUl9TQ1JPTExfU1RSQVRFR1kpIGRlZmF1bHRTY3JvbGxTdHJhdGVneTogYW55LFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChPV0xfREFURV9USU1FX0ZPUk1BVFMpXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGRhdGVUaW1lRm9ybWF0czogT3dsRGF0ZVRpbWVGb3JtYXRzLFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChET0NVTUVOVClcbiAgICBwcml2YXRlIGRvY3VtZW50OiBhbnlcbiAgKSB7XG4gICAgc3VwZXIoZGF0ZVRpbWVBZGFwdGVyLCBkYXRlVGltZUZvcm1hdHMpO1xuICAgIHRoaXMuZGVmYXVsdFNjcm9sbFN0cmF0ZWd5ID0gZGVmYXVsdFNjcm9sbFN0cmF0ZWd5O1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgICB0aGlzLmR0SW5wdXRTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc2FibGVkQ2hhbmdlLmNvbXBsZXRlKCk7XG5cbiAgICBpZiAodGhpcy5wb3B1cFJlZikge1xuICAgICAgdGhpcy5wb3B1cFJlZi5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVySW5wdXQoaW5wdXQ6IE93bERhdGVUaW1lSW5wdXREaXJlY3RpdmU8VD4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZHRJbnB1dCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0EgT3dsIERhdGVUaW1lUGlja2VyIGNhbiBvbmx5IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBpbnB1dC4nKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kdElucHV0ID0gaW5wdXQ7XG4gICAgdGhpcy5kdElucHV0U3ViID0gdGhpcy5fZHRJbnB1dC52YWx1ZUNoYW5nZS5zdWJzY3JpYmUoKHZhbHVlOiBBcnJheTxUPiB8IFQgfCBudWxsKSA9PiB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZHMgPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9vcGVuZWQgfHwgdGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fZHRJbnB1dCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0F0dGVtcHRlZCB0byBvcGVuIGFuIERhdGVUaW1lUGlja2VyIHdpdGggbm8gYXNzb2NpYXRlZCBpbnB1dC4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kb2N1bWVudCkge1xuICAgICAgdGhpcy5mb2N1c2VkRWxlbWVudEJlZm9yZU9wZW4gPSB0aGlzLmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gcmVzZXQgdGhlIHBpY2tlciBzZWxlY3RlZCB2YWx1ZVxuICAgIGlmICh0aGlzLmlzSW5TaW5nbGVNb2RlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gdGhpcy5fZHRJbnB1dC52YWx1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNJblJhbmdlTW9kZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZHMgPSB0aGlzLl9kdElucHV0LnZhbHVlcztcbiAgICB9XG5cbiAgICAvLyB3aGVuIHRoZSBwaWNrZXIgaXMgb3BlbiAsIHdlIG1ha2Ugc3VyZSB0aGUgcGlja2VyJ3MgY3VycmVudCBzZWxlY3RlZCB0aW1lIHZhbHVlXG4gICAgLy8gaXMgdGhlIHNhbWUgYXMgdGhlIF9zdGFydEF0IHRpbWUgdmFsdWUuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWQgJiYgdGhpcy5waWNrZXJUeXBlICE9PSAnY2FsZW5kYXInICYmIHRoaXMuX3N0YXJ0QXQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKHRoaXMuc2VsZWN0ZWQpLFxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRNb250aCh0aGlzLnNlbGVjdGVkKSxcbiAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLnNlbGVjdGVkKSxcbiAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0SG91cnModGhpcy5fc3RhcnRBdCksXG4gICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE1pbnV0ZXModGhpcy5fc3RhcnRBdCksXG4gICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFNlY29uZHModGhpcy5fc3RhcnRBdClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGlja2VyTW9kZSA9PT0gJ2RpYWxvZycpIHtcbiAgICAgIHRoaXMub3BlbkFzRGlhbG9nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3BlbkFzUG9wdXAoKTtcbiAgICB9XG5cbiAgICB0aGlzLnBpY2tlckNvbnRhaW5lci5waWNrZXIgPSB0aGlzO1xuXG4gICAgLy8gTGlzdGVuIHRvIHBpY2tlciBjb250YWluZXIncyBoaWRlUGlja2VyU3RyZWFtXG4gICAgdGhpcy5oaWRlUGlja2VyU3RyZWFtU3ViID0gdGhpcy5waWNrZXJDb250YWluZXIuaGlkZVBpY2tlclN0cmVhbS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuIHRvIHBpY2tlciBjb250YWluZXIncyBjb25maXJtU2VsZWN0ZWRTdHJlYW1cbiAgICB0aGlzLmNvbmZpcm1TZWxlY3RlZFN0cmVhbVN1YiA9IHRoaXMucGlja2VyQ29udGFpbmVyLmNvbmZpcm1TZWxlY3RlZFN0cmVhbS5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuY29uZmlybVNlbGVjdChldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyB0aGUgZ2l2ZW4gZGF0ZVxuICAgKi9cbiAgcHVibGljIHNlbGVjdChkYXRlOiBBcnJheTxUPiB8IFQpOiB2b2lkIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRlKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZHMgPSBbLi4uZGF0ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSBkYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc2VzIGluIHdoaWNoIGF1dG9tYXRpY2FsbHkgY29uZmlybSB0aGUgc2VsZWN0IHdoZW4gZGF0ZSBvciBkYXRlcyBhcmUgc2VsZWN0ZWQ6XG4gICAgICogMSkgcGlja2VyIG1vZGUgaXMgTk9UICdkaWFsb2cnXG4gICAgICogMikgcGlja2VyIHR5cGUgaXMgJ2NhbGVuZGFyJyBhbmQgc2VsZWN0TW9kZSBpcyAnc2luZ2xlJy5cbiAgICAgKiAzKSBwaWNrZXIgdHlwZSBpcyAnY2FsZW5kYXInIGFuZCBzZWxlY3RNb2RlIGlzICdyYW5nZScgYW5kXG4gICAgICogICAgdGhlICdzZWxlY3RlZHMnIGhhcyAnZnJvbScoc2VsZWN0ZWRzWzBdKSBhbmQgJ3RvJyhzZWxlY3RlZHNbMV0pIHZhbHVlcy5cbiAgICAgKiA0KSBzZWxlY3RNb2RlIGlzICdyYW5nZUZyb20nIGFuZCBzZWxlY3RlZHNbMF0gaGFzIHZhbHVlLlxuICAgICAqIDUpIHNlbGVjdE1vZGUgaXMgJ3JhbmdlVG8nIGFuZCBzZWxlY3RlZHNbMV0gaGFzIHZhbHVlLlxuICAgICAqICovXG4gICAgaWYgKFxuICAgICAgdGhpcy5waWNrZXJNb2RlICE9PSAnZGlhbG9nJyAmJlxuICAgICAgdGhpcy5waWNrZXJUeXBlID09PSAnY2FsZW5kYXInICYmXG4gICAgICAoKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3NpbmdsZScgJiYgdGhpcy5zZWxlY3RlZCkgfHxcbiAgICAgICAgKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlRnJvbScgJiYgdGhpcy5zZWxlY3RlZHNbMF0pIHx8XG4gICAgICAgICh0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZVRvJyAmJiB0aGlzLnNlbGVjdGVkc1sxXSkgfHxcbiAgICAgICAgKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJyAmJiB0aGlzLnNlbGVjdGVkc1swXSAmJiB0aGlzLnNlbGVjdGVkc1sxXSkpXG4gICAgKSB7XG4gICAgICB0aGlzLmNvbmZpcm1TZWxlY3QoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgdGhlIHNlbGVjdGVkIHllYXIgaW4gbXVsdGkteWVhciB2aWV3XG4gICAqICovXG4gIHB1YmxpYyBzZWxlY3RZZWFyKG5vcm1hbGl6ZWRZZWFyOiBUKTogdm9pZCB7XG4gICAgdGhpcy55ZWFyU2VsZWN0ZWQuZW1pdChub3JtYWxpemVkWWVhcik7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgc2VsZWN0ZWQgbW9udGggaW4geWVhciB2aWV3XG4gICAqICovXG4gIHB1YmxpYyBzZWxlY3RNb250aChub3JtYWxpemVkTW9udGg6IFQpOiB2b2lkIHtcbiAgICB0aGlzLm1vbnRoU2VsZWN0ZWQuZW1pdChub3JtYWxpemVkTW9udGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBzZWxlY3RlZCBkYXRlXG4gICAqICovXG4gIHB1YmxpYyBzZWxlY3REYXRlKG5vcm1hbGl6ZWREYXRlOiBUKTogdm9pZCB7XG4gICAgdGhpcy5kYXRlU2VsZWN0ZWQuZW1pdChub3JtYWxpemVkRGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSB0aGUgcGlja2VyXG4gICAqL1xuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9vcGVuZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wb3B1cFJlZiAmJiB0aGlzLnBvcHVwUmVmLmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgIHRoaXMucG9wdXBSZWYuZGV0YWNoKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGlja2VyQ29udGFpbmVyUG9ydGFsICYmIHRoaXMucGlja2VyQ29udGFpbmVyUG9ydGFsLmlzQXR0YWNoZWQpIHtcbiAgICAgIHRoaXMucGlja2VyQ29udGFpbmVyUG9ydGFsLmRldGFjaCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhpZGVQaWNrZXJTdHJlYW1TdWIpIHtcbiAgICAgIHRoaXMuaGlkZVBpY2tlclN0cmVhbVN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5oaWRlUGlja2VyU3RyZWFtU3ViID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maXJtU2VsZWN0ZWRTdHJlYW1TdWIpIHtcbiAgICAgIHRoaXMuY29uZmlybVNlbGVjdGVkU3RyZWFtU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLmNvbmZpcm1TZWxlY3RlZFN0cmVhbVN1YiA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGlja2VyQmVmb3JlT3BlbmVkU3RyZWFtU3ViKSB7XG4gICAgICB0aGlzLnBpY2tlckJlZm9yZU9wZW5lZFN0cmVhbVN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5waWNrZXJCZWZvcmVPcGVuZWRTdHJlYW1TdWIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBpY2tlck9wZW5lZFN0cmVhbVN1Yikge1xuICAgICAgdGhpcy5waWNrZXJPcGVuZWRTdHJlYW1TdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMucGlja2VyT3BlbmVkU3RyZWFtU3ViID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kaWFsb2dSZWYpIHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICB0aGlzLmRpYWxvZ1JlZiA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVDbG9zZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9vcGVuZWQpIHtcbiAgICAgICAgdGhpcy5fb3BlbmVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZCB8fCB0aGlzLnNlbGVjdGVkcztcbiAgICAgICAgdGhpcy5hZnRlclBpY2tlckNsb3NlZC5lbWl0KHNlbGVjdGVkKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkRWxlbWVudEJlZm9yZU9wZW4gPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5mb2N1c2VkRWxlbWVudEJlZm9yZU9wZW4gJiYgdHlwZW9mIHRoaXMuZm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBCZWNhdXNlIElFIG1vdmVzIGZvY3VzIGFzeW5jaHJvbm91c2x5LCB3ZSBjYW4ndCBjb3VudCBvbiBpdCBiZWluZyByZXN0b3JlZCBiZWZvcmUgd2UndmVcbiAgICAgIC8vIG1hcmtlZCB0aGUgZGF0ZXBpY2tlciBhcyBjbG9zZWQuIElmIHRoZSBldmVudCBmaXJlcyBvdXQgb2Ygc2VxdWVuY2UgYW5kIHRoZSBlbGVtZW50IHRoYXRcbiAgICAgIC8vIHdlJ3JlIHJlZm9jdXNpbmcgb3BlbnMgdGhlIGRhdGVwaWNrZXIgb24gZm9jdXMsIHRoZSB1c2VyIGNvdWxkIGJlIHN0dWNrIHdpdGggbm90IGJlaW5nXG4gICAgICAvLyBhYmxlIHRvIGNsb3NlIHRoZSBjYWxlbmRhciBhdCBhbGwuIFdlIHdvcmsgYXJvdW5kIGl0IGJ5IG1ha2luZyB0aGUgbG9naWMsIHRoYXQgbWFya3NcbiAgICAgIC8vIHRoZSBkYXRlcGlja2VyIGFzIGNsb3NlZCwgYXN5bmMgYXMgd2VsbC5cbiAgICAgIHRoaXMuZm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuLmZvY3VzKCk7XG4gICAgICBzZXRUaW1lb3V0KGNvbXBsZXRlQ2xvc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21wbGV0ZUNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gdGhlIHNlbGVjdGVkIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgY29uZmlybVNlbGVjdChldmVudD86IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzSW5TaW5nbGVNb2RlKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWQgfHwgdGhpcy5zdGFydEF0IHx8IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLm5vdygpO1xuICAgICAgdGhpcy5jb25maXJtU2VsZWN0ZWRDaGFuZ2UuZW1pdChzZWxlY3RlZCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzSW5SYW5nZU1vZGUpIHtcbiAgICAgIHRoaXMuY29uZmlybVNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZHMpO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2UoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgcGlja2VyIGFzIGEgZGlhbG9nXG4gICAqL1xuICBwcml2YXRlIG9wZW5Bc0RpYWxvZygpOiB2b2lkIHtcbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKE93bERhdGVUaW1lQ29udGFpbmVyQ29tcG9uZW50LCB7XG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgYmFja2Ryb3BDbGFzczogWydjZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wJywgLi4uY29lcmNlQXJyYXkodGhpcy5iYWNrZHJvcENsYXNzKV0sXG4gICAgICBwYW5lQ2xhc3M6IFsnb3dsLWR0LWRpYWxvZycsIC4uLmNvZXJjZUFycmF5KHRoaXMucGFuZWxDbGFzcyldLFxuICAgICAgdmlld0NvbnRhaW5lclJlZjogdGhpcy52aWV3Q29udGFpbmVyUmVmLFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMuc2Nyb2xsU3RyYXRlZ3kgfHwgdGhpcy5kZWZhdWx0U2Nyb2xsU3RyYXRlZ3koKVxuICAgIH0pO1xuICAgIHRoaXMucGlja2VyQ29udGFpbmVyID0gdGhpcy5kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2U7XG5cbiAgICB0aGlzLmRpYWxvZ1JlZi5iZWZvcmVPcGVuKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuYmVmb3JlUGlja2VyT3Blbi5lbWl0KG51bGwpO1xuICAgIH0pO1xuICAgIHRoaXMuZGlhbG9nUmVmLmFmdGVyT3BlbigpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmFmdGVyUGlja2VyT3Blbi5lbWl0KG51bGwpO1xuICAgICAgdGhpcy5fb3BlbmVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLmRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNsb3NlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIHBpY2tlciBhcyBwb3B1cFxuICAgKi9cbiAgcHJpdmF0ZSBvcGVuQXNQb3B1cCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGlja2VyQ29udGFpbmVyUG9ydGFsKSB7XG4gICAgICB0aGlzLnBpY2tlckNvbnRhaW5lclBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWw8T3dsRGF0ZVRpbWVDb250YWluZXJDb21wb25lbnQ8VD4+KFxuICAgICAgICBPd2xEYXRlVGltZUNvbnRhaW5lckNvbXBvbmVudCxcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wb3B1cFJlZikge1xuICAgICAgdGhpcy5jcmVhdGVQb3B1cCgpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wb3B1cFJlZi5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxPd2xEYXRlVGltZUNvbnRhaW5lckNvbXBvbmVudDxUPj4gPSB0aGlzLnBvcHVwUmVmLmF0dGFjaChcbiAgICAgICAgdGhpcy5waWNrZXJDb250YWluZXJQb3J0YWxcbiAgICAgICk7XG4gICAgICB0aGlzLnBpY2tlckNvbnRhaW5lciA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBwb3NpdGlvbiBvbmNlIHRoZSBjYWxlbmRhciBoYXMgcmVuZGVyZWQuXG4gICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wb3B1cFJlZi51cGRhdGVQb3NpdGlvbigpO1xuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5waWNrZXJCZWZvcmVPcGVuZWRTdHJlYW1TdWIgPSB0aGlzLnBpY2tlckNvbnRhaW5lci5iZWZvcmVQaWNrZXJPcGVuZWRTdHJlYW0ucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmJlZm9yZVBpY2tlck9wZW4uZW1pdChudWxsKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBlbWl0IG9wZW4gc3RyZWFtXG4gICAgICB0aGlzLnBpY2tlck9wZW5lZFN0cmVhbVN1YiA9IHRoaXMucGlja2VyQ29udGFpbmVyLnBpY2tlck9wZW5lZFN0cmVhbS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuYWZ0ZXJQaWNrZXJPcGVuLmVtaXQobnVsbCk7XG4gICAgICAgIHRoaXMuX29wZW5lZCA9IHRydWU7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVBvcHVwKCk6IHZvaWQge1xuICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLmNyZWF0ZVBvcHVwUG9zaXRpb25TdHJhdGVneSgpLFxuICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICBiYWNrZHJvcENsYXNzOiBbJ2Nkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wJywgLi4uY29lcmNlQXJyYXkodGhpcy5iYWNrZHJvcENsYXNzKV0sXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5zY3JvbGxTdHJhdGVneSB8fCB0aGlzLmRlZmF1bHRTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgcGFuZWxDbGFzczogWydvd2wtZHQtcG9wdXAnLCAuLi5jb2VyY2VBcnJheSh0aGlzLnBhbmVsQ2xhc3MpXVxuICAgIH0pO1xuXG4gICAgdGhpcy5wb3B1cFJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUob3ZlcmxheUNvbmZpZyk7XG5cbiAgICBtZXJnZShcbiAgICAgIHRoaXMucG9wdXBSZWYuYmFja2Ryb3BDbGljaygpLFxuICAgICAgdGhpcy5wb3B1cFJlZi5kZXRhY2htZW50cygpLFxuICAgICAgdGhpcy5wb3B1cFJlZlxuICAgICAgICAua2V5ZG93bkV2ZW50cygpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcigoZXZlbnQpID0+IGV2ZW50LmtleUNvZGUgPT09IEVTQ0FQRSB8fCAodGhpcy5fZHRJbnB1dCAmJiBldmVudC5hbHRLZXkgJiYgZXZlbnQua2V5Q29kZSA9PT0gVVBfQVJST1cpKVxuICAgICAgICApXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIHBvcHVwIFBvc2l0aW9uU3RyYXRlZ3kuXG4gICAqICovXG4gIHByaXZhdGUgY3JlYXRlUG9wdXBQb3NpdGlvblN0cmF0ZWd5KCk6IFBvc2l0aW9uU3RyYXRlZ3kge1xuICAgIHJldHVybiB0aGlzLm92ZXJsYXlcbiAgICAgIC5wb3NpdGlvbigpXG4gICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLl9kdElucHV0LmVsZW1lbnRSZWYpXG4gICAgICAud2l0aFRyYW5zZm9ybU9yaWdpbk9uKCcub3dsLWR0LWNvbnRhaW5lcicpXG4gICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcbiAgICAgIC53aXRoUHVzaChmYWxzZSlcbiAgICAgIC53aXRoUG9zaXRpb25zKFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICd0b3AnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgICAgICAgb2Zmc2V0WTogLTE3NlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgICAgICAgb2Zmc2V0WTogLTM1MlxuICAgICAgICB9XG4gICAgICBdKTtcbiAgfVxufVxuIiwiIl19
|