@energinet/watt 3.0.33 → 3.0.35
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/esm2022/picker/__shared/watt-picker-base.js +11 -110
- package/esm2022/picker/datepicker/watt-datepicker.component.js +45 -151
- package/esm2022/picker/timepicker/watt-timepicker.component.js +19 -91
- package/package.json +1 -1
- package/picker/__shared/watt-picker-base.d.ts +5 -129
- package/picker/datepicker/watt-datepicker.component.d.ts +9 -93
- package/picker/timepicker/watt-timepicker.component.d.ts +6 -69
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* limitations under the License.
|
|
17
17
|
*/
|
|
18
18
|
//#endregion
|
|
19
|
-
import { ChangeDetectorRef, Component, ElementRef, LOCALE_ID,
|
|
19
|
+
import { ChangeDetectorRef, Component, ElementRef, LOCALE_ID, ViewEncapsulation, computed, inject, input, effect, linkedSignal, booleanAttribute, viewChild, } from '@angular/core';
|
|
20
20
|
import { NgControl } from '@angular/forms';
|
|
21
21
|
import { MatDateRangeInput, MatDateRangePicker, MatDatepickerInput, MatDatepickerModule, MatEndDate, MatStartDate, } from '@angular/material/datepicker';
|
|
22
22
|
import { MatFormFieldControl } from '@angular/material/form-field';
|
|
@@ -51,75 +51,33 @@ export class WattDatepickerComponent extends WattPickerBase {
|
|
|
51
51
|
label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
|
|
52
52
|
dateClass = input(() => '', ...(ngDevMode ? [{ debugName: "dateClass" }] : []));
|
|
53
53
|
canStepThroughDays = input(false, ...(ngDevMode ? [{ debugName: "canStepThroughDays", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
matStartDate;
|
|
64
|
-
/**
|
|
65
|
-
* @ignore
|
|
66
|
-
*/
|
|
67
|
-
matEndDate;
|
|
68
|
-
/**
|
|
69
|
-
* @ignore
|
|
70
|
-
*/
|
|
71
|
-
actualInput;
|
|
72
|
-
/**
|
|
73
|
-
* @ignore
|
|
74
|
-
*/
|
|
75
|
-
input;
|
|
76
|
-
/**
|
|
77
|
-
* @ignore
|
|
78
|
-
*/
|
|
79
|
-
startInput;
|
|
80
|
-
/**
|
|
81
|
-
* @ignore
|
|
82
|
-
*/
|
|
83
|
-
endInput;
|
|
84
|
-
/**
|
|
85
|
-
* @ignore
|
|
86
|
-
*/
|
|
54
|
+
matDatepickerInput = viewChild.required(MatDatepickerInput);
|
|
55
|
+
matDateRangePicker = viewChild.required(MatDateRangePicker);
|
|
56
|
+
matDateRangeInput = viewChild.required(MatDateRangeInput);
|
|
57
|
+
matStartDate = viewChild.required(MatStartDate);
|
|
58
|
+
matEndDate = viewChild.required(MatEndDate);
|
|
59
|
+
actualInput = viewChild.required('actualInput');
|
|
60
|
+
input = viewChild('dateInput', ...(ngDevMode ? [{ debugName: "input" }] : []));
|
|
61
|
+
startInput = viewChild('startDateInput', ...(ngDevMode ? [{ debugName: "startInput" }] : []));
|
|
62
|
+
endInput = viewChild('endDateInput', ...(ngDevMode ? [{ debugName: "endInput" }] : []));
|
|
87
63
|
_placeholder = this.getPlaceholderByLocale(this.locale);
|
|
88
|
-
/**
|
|
89
|
-
* @ignore
|
|
90
|
-
*/
|
|
91
64
|
rangeSeparator = ' - ';
|
|
92
|
-
/**
|
|
93
|
-
* @ignore
|
|
94
|
-
*/
|
|
95
65
|
rangePlaceholder = this.getRangePlaceholder();
|
|
96
|
-
/**
|
|
97
|
-
* @ignore
|
|
98
|
-
*/
|
|
99
66
|
inputMask = computed(() => maskitoDateOptionsGenerator({
|
|
100
67
|
mode: 'dd/mm/yyyy',
|
|
101
68
|
separator: '-',
|
|
102
69
|
max: this.max(),
|
|
103
70
|
min: this.min(),
|
|
104
71
|
}), ...(ngDevMode ? [{ debugName: "inputMask" }] : []));
|
|
105
|
-
/**
|
|
106
|
-
* @ignore
|
|
107
|
-
*/
|
|
108
72
|
rangeInputMask = computed(() => maskitoDateRangeOptionsGenerator({
|
|
109
73
|
mode: 'dd/mm/yyyy',
|
|
110
74
|
dateSeparator: '-',
|
|
111
75
|
max: this.max(),
|
|
112
76
|
min: this.min(),
|
|
113
77
|
}), ...(ngDevMode ? [{ debugName: "rangeInputMask" }] : []));
|
|
114
|
-
/**
|
|
115
|
-
* @ignore
|
|
116
|
-
*/
|
|
117
78
|
getPlaceholderByLocale(locale) {
|
|
118
79
|
return locale === 'da' ? 'dd-mm-åååå' : 'dd-mm-yyyy';
|
|
119
80
|
}
|
|
120
|
-
/**
|
|
121
|
-
* @ignore
|
|
122
|
-
*/
|
|
123
81
|
getRangePlaceholder() {
|
|
124
82
|
return this.placeholder + this.rangeSeparator + this.placeholder;
|
|
125
83
|
}
|
|
@@ -154,7 +112,7 @@ export class WattDatepickerComponent extends WattPickerBase {
|
|
|
154
112
|
}
|
|
155
113
|
initSingleInput() {
|
|
156
114
|
if (this.initialValue) {
|
|
157
|
-
this.matDatepickerInput.value = this.initialValue;
|
|
115
|
+
this.matDatepickerInput().value = this.initialValue;
|
|
158
116
|
this.datepickerClosed();
|
|
159
117
|
}
|
|
160
118
|
}
|
|
@@ -171,39 +129,39 @@ export class WattDatepickerComponent extends WattPickerBase {
|
|
|
171
129
|
this.control?.setValue(this.formatDateFromViewToModel(date));
|
|
172
130
|
}
|
|
173
131
|
datepickerClosed() {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
132
|
+
const matDatepickerInput = this.matDatepickerInput();
|
|
133
|
+
const actualInput = this.actualInput();
|
|
134
|
+
if (matDatepickerInput.value) {
|
|
135
|
+
this.control?.setValue(matDatepickerInput.value);
|
|
136
|
+
actualInput.nativeElement.value = this.formatDateTimeFromModelToView(this.formatDateFromViewToModel(matDatepickerInput.value));
|
|
177
137
|
}
|
|
178
138
|
else {
|
|
179
|
-
|
|
139
|
+
actualInput.nativeElement.value = '';
|
|
180
140
|
this.control?.setValue(null);
|
|
181
141
|
}
|
|
182
142
|
this.isPrevDayButtonDisabled.set(this.isPrevDayBeforeOrEqualToMinDate());
|
|
183
143
|
this.isNextDayButtonDisabled.set(this.isNextDayAfterOrEqualToMaxDate());
|
|
184
|
-
|
|
144
|
+
actualInput.nativeElement.dispatchEvent(new InputEvent('input'));
|
|
185
145
|
}
|
|
186
146
|
onMonthSelected(date) {
|
|
187
147
|
if (this.rangeMonthOnlyMode() && date) {
|
|
188
|
-
this.matDateRangePicker.select(dayjs(date).startOf('month').toDate());
|
|
189
|
-
this.matDateRangePicker.select(dayjs(date).endOf('month').toDate());
|
|
190
|
-
this.matDateRangePicker.close();
|
|
148
|
+
this.matDateRangePicker().select(dayjs(date).startOf('month').toDate());
|
|
149
|
+
this.matDateRangePicker().select(dayjs(date).endOf('month').toDate());
|
|
150
|
+
this.matDateRangePicker().close();
|
|
191
151
|
}
|
|
192
152
|
}
|
|
193
|
-
/**
|
|
194
|
-
* @ignore
|
|
195
|
-
*/
|
|
196
153
|
initRangeInput() {
|
|
197
154
|
if (this.initialValue) {
|
|
198
|
-
this.matStartDate.value = this.initialValue.start;
|
|
199
|
-
this.matEndDate.value = this.initialValue.end;
|
|
155
|
+
this.matStartDate().value = this.initialValue.start;
|
|
156
|
+
this.matEndDate().value = this.initialValue.end;
|
|
200
157
|
this.rangePickerClosed();
|
|
201
158
|
}
|
|
202
159
|
}
|
|
203
160
|
clearRangePicker() {
|
|
204
161
|
this.control?.setValue(null);
|
|
205
|
-
|
|
206
|
-
|
|
162
|
+
const actualInput = this.actualInput();
|
|
163
|
+
actualInput.nativeElement.value = '';
|
|
164
|
+
actualInput.nativeElement.dispatchEvent(new InputEvent('input'));
|
|
207
165
|
}
|
|
208
166
|
rangeInputChanged(value) {
|
|
209
167
|
const startDateString = value.slice(0, this.placeholder.length);
|
|
@@ -223,53 +181,40 @@ export class WattDatepickerComponent extends WattPickerBase {
|
|
|
223
181
|
}
|
|
224
182
|
}
|
|
225
183
|
rangePickerClosed() {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
184
|
+
const matDateRangeInput = this.matDateRangeInput();
|
|
185
|
+
const actualInput = this.actualInput();
|
|
186
|
+
if (matDateRangeInput.value?.start && matDateRangeInput.value.end) {
|
|
187
|
+
actualInput.nativeElement.value =
|
|
188
|
+
this.formatDateTimeFromModelToView(this.formatDateFromViewToModel(matDateRangeInput.value?.start)) +
|
|
229
189
|
'-' +
|
|
230
|
-
this.formatDateTimeFromModelToView(this.formatDateFromViewToModel(
|
|
190
|
+
this.formatDateTimeFromModelToView(this.formatDateFromViewToModel(matDateRangeInput.value.end));
|
|
231
191
|
this.control?.setValue({
|
|
232
|
-
start: this.formatDateFromViewToModel(
|
|
233
|
-
end: this.formatDateFromViewToModel(
|
|
192
|
+
start: this.formatDateFromViewToModel(matDateRangeInput.value.start),
|
|
193
|
+
end: this.formatDateFromViewToModel(matDateRangeInput.value.end),
|
|
234
194
|
});
|
|
235
195
|
}
|
|
236
196
|
else {
|
|
237
|
-
|
|
197
|
+
actualInput.nativeElement.value = '';
|
|
238
198
|
this.control?.setValue(null);
|
|
239
199
|
}
|
|
240
|
-
|
|
200
|
+
actualInput.nativeElement.dispatchEvent(new InputEvent('input'));
|
|
241
201
|
}
|
|
242
|
-
/**
|
|
243
|
-
* @ignore
|
|
244
|
-
*/
|
|
245
202
|
setSingleValue(value, input) {
|
|
246
|
-
this.setValueToInput(value, input, this.matDatepickerInput);
|
|
203
|
+
this.setValueToInput(value, input, this.matDatepickerInput());
|
|
247
204
|
}
|
|
248
|
-
/**
|
|
249
|
-
* @ignore
|
|
250
|
-
*/
|
|
251
205
|
setRangeValue(value, startInput, endInput) {
|
|
252
206
|
const { start, end } = value ?? {};
|
|
253
|
-
this.setValueToInput(start, startInput, this.matStartDate);
|
|
254
|
-
this.setValueToInput(end, endInput, this.matEndDate);
|
|
207
|
+
this.setValueToInput(start, startInput, this.matStartDate());
|
|
208
|
+
this.setValueToInput(end, endInput, this.matEndDate());
|
|
255
209
|
}
|
|
256
|
-
/**
|
|
257
|
-
* @ignore
|
|
258
|
-
*/
|
|
259
210
|
prevDay() {
|
|
260
211
|
this.changeDay(-1);
|
|
261
212
|
}
|
|
262
|
-
/**
|
|
263
|
-
* @ignore
|
|
264
|
-
*/
|
|
265
213
|
nextDay() {
|
|
266
214
|
this.changeDay(1);
|
|
267
215
|
}
|
|
268
|
-
/**
|
|
269
|
-
* @ignore
|
|
270
|
-
*/
|
|
271
216
|
changeDay(value) {
|
|
272
|
-
const currentDate = this.matDatepickerInput.value;
|
|
217
|
+
const currentDate = this.matDatepickerInput().value;
|
|
273
218
|
if (currentDate) {
|
|
274
219
|
const newDate = dayjs(currentDate).add(value, 'day').toISOString();
|
|
275
220
|
const newDateFormatted = this.formatDateTimeFromModelToView(newDate);
|
|
@@ -277,39 +222,27 @@ export class WattDatepickerComponent extends WattPickerBase {
|
|
|
277
222
|
this.datepickerClosed();
|
|
278
223
|
}
|
|
279
224
|
}
|
|
280
|
-
/**
|
|
281
|
-
* @ignore
|
|
282
|
-
*/
|
|
283
225
|
isPrevDayBeforeOrEqualToMinDate() {
|
|
284
226
|
const min = this.min();
|
|
285
|
-
const selectedDate = this.matDatepickerInput?.value;
|
|
227
|
+
const selectedDate = this.matDatepickerInput()?.value;
|
|
286
228
|
if (!min || !selectedDate)
|
|
287
229
|
return false;
|
|
288
230
|
const isBefore = dayjs(selectedDate).isBefore(min, 'day');
|
|
289
231
|
const isSame = dayjs(selectedDate).isSame(min, 'day');
|
|
290
232
|
return isSame || isBefore;
|
|
291
233
|
}
|
|
292
|
-
/**
|
|
293
|
-
* @ignore
|
|
294
|
-
*/
|
|
295
234
|
isNextDayAfterOrEqualToMaxDate() {
|
|
296
235
|
const max = this.max();
|
|
297
|
-
const selectedDate = this.matDatepickerInput?.value;
|
|
236
|
+
const selectedDate = this.matDatepickerInput()?.value;
|
|
298
237
|
if (!max || !selectedDate)
|
|
299
238
|
return false;
|
|
300
239
|
const isAfter = dayjs(selectedDate).isAfter(max, 'day');
|
|
301
240
|
const isSame = dayjs(selectedDate).isSame(max, 'day');
|
|
302
241
|
return isSame || isAfter;
|
|
303
242
|
}
|
|
304
|
-
/**
|
|
305
|
-
* @ignore
|
|
306
|
-
*/
|
|
307
243
|
parseDateShortFormat(value) {
|
|
308
244
|
return dayjs(value, dateShortFormat).toDate();
|
|
309
245
|
}
|
|
310
|
-
/**
|
|
311
|
-
* @ignore
|
|
312
|
-
*/
|
|
313
246
|
setValueToInput(value, nativeInput, matDateInput) {
|
|
314
247
|
nativeInput.value = value ? this.formatDateTimeFromModelToView(value) : '';
|
|
315
248
|
matDateInput.value = value ? dayjs(value).utc().toDate() : null;
|
|
@@ -321,27 +254,15 @@ export class WattDatepickerComponent extends WattPickerBase {
|
|
|
321
254
|
formatDateFromViewToModel(value) {
|
|
322
255
|
return dayjs(value).utc().toISOString();
|
|
323
256
|
}
|
|
324
|
-
/**
|
|
325
|
-
* @ignore
|
|
326
|
-
*/
|
|
327
257
|
formatDateTimeFromModelToView(value) {
|
|
328
258
|
return dayjs(value).tz(danishTimeZoneIdentifier).format(dateShortFormat);
|
|
329
259
|
}
|
|
330
|
-
/**
|
|
331
|
-
* @ignore
|
|
332
|
-
*/
|
|
333
260
|
toDanishTimeZone(value) {
|
|
334
261
|
return dayjs(value.toISOString()).tz(danishTimeZoneIdentifier).toDate();
|
|
335
262
|
}
|
|
336
|
-
/**
|
|
337
|
-
* @ignore
|
|
338
|
-
*/
|
|
339
263
|
setToEndOfDay(value) {
|
|
340
264
|
return dayjs(value).endOf('day').toDate();
|
|
341
265
|
}
|
|
342
|
-
/**
|
|
343
|
-
* @ignore
|
|
344
|
-
*/
|
|
345
266
|
setEndDateToDanishTimeZone(value) {
|
|
346
267
|
const dateBasedOnShortFormat = this.parseDateShortFormat(value);
|
|
347
268
|
let maybeDateInDanishTimeZone = null;
|
|
@@ -351,7 +272,7 @@ export class WattDatepickerComponent extends WattPickerBase {
|
|
|
351
272
|
return maybeDateInDanishTimeZone;
|
|
352
273
|
}
|
|
353
274
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: WattDatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
354
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.3", type: WattDatepickerComponent, isStandalone: true, selector: "watt-datepicker", inputs: { max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, rangeMonthOnlyMode: { classPropertyName: "rangeMonthOnlyMode", publicName: "rangeMonthOnlyMode", isSignal: true, isRequired: false, transformFunction: null }, startAt: { classPropertyName: "startAt", publicName: "startAt", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, dateClass: { classPropertyName: "dateClass", publicName: "dateClass", isSignal: true, isRequired: false, transformFunction: null }, canStepThroughDays: { classPropertyName: "canStepThroughDays", publicName: "canStepThroughDays", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: MatFormFieldControl, useExisting: WattDatepickerComponent }], viewQueries: [{ propertyName: "matDatepickerInput", first: true, predicate: MatDatepickerInput, descendants: true }, { propertyName: "matDateRangePicker", first: true, predicate: MatDateRangePicker, descendants: true }, { propertyName: "matDateRangeInput", first: true, predicate: MatDateRangeInput, descendants: true }, { propertyName: "matStartDate", first: true, predicate: MatStartDate, descendants: true }, { propertyName: "matEndDate", first: true, predicate: MatEndDate, descendants: true }, { propertyName: "actualInput", first: true, predicate: ["actualInput"], descendants: true }, { propertyName: "input", first: true, predicate: ["dateInput"], descendants: true }, { propertyName: "startInput", first: true, predicate: ["startDateInput"], descendants: true }, { propertyName: "endInput", first: true, predicate: ["endDateInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<!--\n@license\nCopyright 2020 Energinet DataHub A/S\n\nLicensed under the Apache License, Version 2.0 (the \"License2\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n<watt-field [control]=\"control\" [label]=\"label()\">\n @if (range) {\n <mat-date-range-input\n [disabled]=\"disabled\"\n [rangePicker]=\"rangeDatepicker\"\n [min]=\"min() ?? null\"\n [max]=\"max() ?? null\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut($event)\"\n >\n <input\n inert\n aria-label=\"start-date-input\"\n matStartDate\n #startDateInput\n [readOnly]=\"rangeMonthOnlyMode()\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [hidden]=\"true\"\n />\n\n <input\n inert\n aria-label=\"end-date-input\"\n matEndDate\n #endDateInput\n [readOnly]=\"rangeMonthOnlyMode()\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [hidden]=\"true\"\n />\n </mat-date-range-input>\n <input #actualInput class=\"mask-input\" [disabled]=\"disabled\" />\n <watt-placeholder-mask\n [primaryInputElement]=\"actualInput\"\n [mask]=\"rangeInputMask()\"\n [placeholder]=\"rangePlaceholder\"\n (maskApplied)=\"rangeInputChanged($event)\"\n />\n\n <watt-button\n variant=\"icon\"\n icon=\"date\"\n [disabled]=\"disabled\"\n [attr.aria-pressed]=\"false\"\n (click)=\"rangeDatepicker.open()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut($event)\"\n />\n\n <mat-date-range-picker\n [panelClass]=\"rangeMonthOnlyMode() ? 'watt-datepicker-range__panel--month-only' : ''\"\n [startView]=\"rangeMonthOnlyMode() ? 'multi-year' : 'month'\"\n [startAt]=\"startAt()\"\n (monthSelected)=\"onMonthSelected($event)\"\n (closed)=\"rangePickerClosed()\"\n #rangeDatepicker\n />\n } @else {\n <input\n inert\n matInput\n tabindex=\"-1\"\n aria-label=\"date-input\"\n #dateInput\n autocomplete=\"off\"\n spellcheck=\"false\"\n [disabled]=\"disabled\"\n [min]=\"min()\"\n [max]=\"max()\"\n [matDatepicker]=\"singleDatepicker\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut($event)\"\n />\n <input #actualInput class=\"mask-input\" [disabled]=\"disabled\" />\n <watt-placeholder-mask\n [primaryInputElement]=\"actualInput\"\n [mask]=\"inputMask()\"\n [placeholder]=\"placeholder\"\n (maskApplied)=\"inputChanged($event)\"\n />\n\n <watt-button\n wattSuffix\n variant=\"icon\"\n icon=\"date\"\n [disabled]=\"disabled\"\n (click)=\"singleDatepicker.open()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut($event)\"\n />\n\n <mat-datepicker\n #singleDatepicker\n panelClass=\"watt-datepicker-single__panel\"\n [dateClass]=\"dateClass()\"\n [startAt]=\"startAt()\"\n (closed)=\"datepickerClosed()\"\n />\n }\n\n <ng-content />\n <ng-content ngProjectAs=\"watt-field-hint\" select=\"watt-field-hint\" />\n <ng-content ngProjectAs=\"watt-field-error\" select=\"watt-field-error\" />\n</watt-field>\n\n@if (!range && canStepThroughDays()) {\n <span\n class=\"watt-datepicker-single__step-through\"\n [class.watt-datepicker-single__has-label]=\"!!label()\"\n >\n <watt-button\n variant=\"icon\"\n icon=\"left\"\n (click)=\"prevDay()\"\n [disabled]=\"disabled || isPrevDayButtonDisabled()\"\n />\n <watt-button\n variant=\"icon\"\n icon=\"right\"\n (click)=\"nextDay()\"\n [disabled]=\"disabled || isNextDayButtonDisabled()\"\n />\n </span>\n}\n", styles: ["watt-datepicker{display:flex;align-items:center;width:100%}watt-datepicker watt-button[variant=icon]{margin-left:auto}watt-datepicker watt-button[variant=icon] .watt-button--icon{height:42px}watt-datepicker mat-datepicker,watt-datepicker mat-date-range-picker{display:none}watt-datepicker input.mat-date-range-input-inner,watt-datepicker input.mat-mdc-input-element,watt-datepicker .mat-date-range-input-mirror,watt-datepicker input.mask-input{font-family:Droid Sans Mono,monospace}watt-datepicker input.mat-date-range-input-inner,watt-datepicker input.mat-mdc-input-element,watt-datepicker input.mask-input{border:none;caret-color:var(--watt-color-neutral-black);letter-spacing:-.03em;-webkit-background-clip:text;-moz-background-clip:text;background-clip:text;color:transparent}watt-datepicker input.mask-input{color:#000}watt-datepicker input.mask-input{position:absolute;min-width:100%;padding:2px 1px}watt-datepicker input.mask-input:focus-visible{outline:none}watt-datepicker .mat-date-range-input-container{align-items:initial}watt-datepicker .mat-date-range-input-start-wrapper,watt-datepicker .mat-date-range-input-end-wrapper{max-width:calc(50% - var(--watt-space-s));overflow:visible;position:relative}watt-datepicker .mat-date-range-input-separator{display:flex;align-items:center}watt-datepicker .mat-date-range-input-separator-hidden,watt-datepicker .mat-date-range-input-separator{opacity:0!important}watt-datepicker .mat-date-range-input-inner::-webkit-input-placeholder{color:var(--watt-color-neutral-grey-500)!important;-webkit-text-fill-color:var(--watt-color-neutral-grey-500)}watt-datepicker watt-button .mat-button{background:transparent}watt-datepicker:has(.watt-datepicker-single__step-through){align-items:flex-start}watt-datepicker:has(.watt-datepicker-single__step-through) .watt-datepicker-single__step-through{display:flex;margin-top:1px}watt-datepicker:has(.watt-datepicker-single__has-label) .watt-datepicker-single__step-through{margin-top:28px}.watt-datepicker-range__panel--month-only .mat-calendar-period-button{pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i1.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i1.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i1.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i1.MatStartDate, selector: "input[matStartDate]", outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i1.MatEndDate, selector: "input[matEndDate]", outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i1.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: WattButtonComponent, selector: "watt-button", inputs: ["icon", "variant", "size", "type", "formId", "disabled", "loading"] }, { kind: "component", type: WattFieldComponent, selector: "watt-field", inputs: ["control", "label", "id", "chipMode", "tooltip", "placeholder", "anchorName"] }, { kind: "component", type: WattPlaceholderMaskComponent, selector: "watt-placeholder-mask", inputs: ["primaryInputElement", "secondaryInputElement", "mask", "placeholder"], outputs: ["maskApplied"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
275
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.3", type: WattDatepickerComponent, isStandalone: true, selector: "watt-datepicker", inputs: { max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, rangeMonthOnlyMode: { classPropertyName: "rangeMonthOnlyMode", publicName: "rangeMonthOnlyMode", isSignal: true, isRequired: false, transformFunction: null }, startAt: { classPropertyName: "startAt", publicName: "startAt", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, dateClass: { classPropertyName: "dateClass", publicName: "dateClass", isSignal: true, isRequired: false, transformFunction: null }, canStepThroughDays: { classPropertyName: "canStepThroughDays", publicName: "canStepThroughDays", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: MatFormFieldControl, useExisting: WattDatepickerComponent }], viewQueries: [{ propertyName: "matDatepickerInput", first: true, predicate: MatDatepickerInput, descendants: true, isSignal: true }, { propertyName: "matDateRangePicker", first: true, predicate: MatDateRangePicker, descendants: true, isSignal: true }, { propertyName: "matDateRangeInput", first: true, predicate: MatDateRangeInput, descendants: true, isSignal: true }, { propertyName: "matStartDate", first: true, predicate: MatStartDate, descendants: true, isSignal: true }, { propertyName: "matEndDate", first: true, predicate: MatEndDate, descendants: true, isSignal: true }, { propertyName: "actualInput", first: true, predicate: ["actualInput"], descendants: true, isSignal: true }, { propertyName: "input", first: true, predicate: ["dateInput"], descendants: true, isSignal: true }, { propertyName: "startInput", first: true, predicate: ["startDateInput"], descendants: true, isSignal: true }, { propertyName: "endInput", first: true, predicate: ["endDateInput"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<!--\n@license\nCopyright 2020 Energinet DataHub A/S\n\nLicensed under the Apache License, Version 2.0 (the \"License2\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n<watt-field [control]=\"control\" [label]=\"label()\">\n @if (range) {\n <mat-date-range-input\n [disabled]=\"disabled\"\n [rangePicker]=\"rangeDatepicker\"\n [min]=\"min() ?? null\"\n [max]=\"max() ?? null\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut($event)\"\n >\n <input\n inert\n aria-label=\"start-date-input\"\n matStartDate\n #startDateInput\n [readOnly]=\"rangeMonthOnlyMode()\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [hidden]=\"true\"\n />\n\n <input\n inert\n aria-label=\"end-date-input\"\n matEndDate\n #endDateInput\n [readOnly]=\"rangeMonthOnlyMode()\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [hidden]=\"true\"\n />\n </mat-date-range-input>\n <input #actualInput class=\"mask-input\" [disabled]=\"disabled\" />\n <watt-placeholder-mask\n [primaryInputElement]=\"actualInput\"\n [mask]=\"rangeInputMask()\"\n [placeholder]=\"rangePlaceholder\"\n (maskApplied)=\"rangeInputChanged($event)\"\n />\n\n <watt-button\n variant=\"icon\"\n icon=\"date\"\n [disabled]=\"disabled\"\n [attr.aria-pressed]=\"false\"\n (click)=\"rangeDatepicker.open()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut($event)\"\n />\n\n <mat-date-range-picker\n [panelClass]=\"rangeMonthOnlyMode() ? 'watt-datepicker-range__panel--month-only' : ''\"\n [startView]=\"rangeMonthOnlyMode() ? 'multi-year' : 'month'\"\n [startAt]=\"startAt()\"\n (monthSelected)=\"onMonthSelected($event)\"\n (closed)=\"rangePickerClosed()\"\n #rangeDatepicker\n />\n } @else {\n <input\n inert\n matInput\n tabindex=\"-1\"\n aria-label=\"date-input\"\n #dateInput\n autocomplete=\"off\"\n spellcheck=\"false\"\n [disabled]=\"disabled\"\n [min]=\"min()\"\n [max]=\"max()\"\n [matDatepicker]=\"singleDatepicker\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut($event)\"\n />\n <input #actualInput class=\"mask-input\" [disabled]=\"disabled\" />\n <watt-placeholder-mask\n [primaryInputElement]=\"actualInput\"\n [mask]=\"inputMask()\"\n [placeholder]=\"placeholder\"\n (maskApplied)=\"inputChanged($event)\"\n />\n\n <watt-button\n wattSuffix\n variant=\"icon\"\n icon=\"date\"\n [disabled]=\"disabled\"\n (click)=\"singleDatepicker.open()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut($event)\"\n />\n\n <mat-datepicker\n #singleDatepicker\n panelClass=\"watt-datepicker-single__panel\"\n [dateClass]=\"dateClass()\"\n [startAt]=\"startAt()\"\n (closed)=\"datepickerClosed()\"\n />\n }\n\n <ng-content />\n <ng-content ngProjectAs=\"watt-field-hint\" select=\"watt-field-hint\" />\n <ng-content ngProjectAs=\"watt-field-error\" select=\"watt-field-error\" />\n</watt-field>\n\n@if (!range && canStepThroughDays()) {\n <span\n class=\"watt-datepicker-single__step-through\"\n [class.watt-datepicker-single__has-label]=\"!!label()\"\n >\n <watt-button\n variant=\"icon\"\n icon=\"left\"\n (click)=\"prevDay()\"\n [disabled]=\"disabled || isPrevDayButtonDisabled()\"\n />\n <watt-button\n variant=\"icon\"\n icon=\"right\"\n (click)=\"nextDay()\"\n [disabled]=\"disabled || isNextDayButtonDisabled()\"\n />\n </span>\n}\n", styles: ["watt-datepicker{display:flex;align-items:center;width:100%}watt-datepicker watt-button[variant=icon]{margin-left:auto}watt-datepicker watt-button[variant=icon] .watt-button--icon{height:42px}watt-datepicker mat-datepicker,watt-datepicker mat-date-range-picker{display:none}watt-datepicker input.mat-date-range-input-inner,watt-datepicker input.mat-mdc-input-element,watt-datepicker .mat-date-range-input-mirror,watt-datepicker input.mask-input{font-family:Droid Sans Mono,monospace}watt-datepicker input.mat-date-range-input-inner,watt-datepicker input.mat-mdc-input-element,watt-datepicker input.mask-input{border:none;caret-color:var(--watt-color-neutral-black);letter-spacing:-.03em;-webkit-background-clip:text;-moz-background-clip:text;background-clip:text;color:transparent}watt-datepicker input.mask-input{color:#000}watt-datepicker input.mask-input{position:absolute;min-width:100%;padding:2px 1px}watt-datepicker input.mask-input:focus-visible{outline:none}watt-datepicker .mat-date-range-input-container{align-items:initial}watt-datepicker .mat-date-range-input-start-wrapper,watt-datepicker .mat-date-range-input-end-wrapper{max-width:calc(50% - var(--watt-space-s));overflow:visible;position:relative}watt-datepicker .mat-date-range-input-separator{display:flex;align-items:center}watt-datepicker .mat-date-range-input-separator-hidden,watt-datepicker .mat-date-range-input-separator{opacity:0!important}watt-datepicker .mat-date-range-input-inner::-webkit-input-placeholder{color:var(--watt-color-neutral-grey-500)!important;-webkit-text-fill-color:var(--watt-color-neutral-grey-500)}watt-datepicker watt-button .mat-button{background:transparent}watt-datepicker:has(.watt-datepicker-single__step-through){align-items:flex-start}watt-datepicker:has(.watt-datepicker-single__step-through) .watt-datepicker-single__step-through{display:flex;margin-top:1px}watt-datepicker:has(.watt-datepicker-single__has-label) .watt-datepicker-single__step-through{margin-top:28px}.watt-datepicker-range__panel--month-only .mat-calendar-period-button{pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i1.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i1.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i1.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i1.MatStartDate, selector: "input[matStartDate]", outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i1.MatEndDate, selector: "input[matEndDate]", outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i1.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: WattButtonComponent, selector: "watt-button", inputs: ["icon", "variant", "size", "type", "formId", "disabled", "loading"] }, { kind: "component", type: WattFieldComponent, selector: "watt-field", inputs: ["control", "label", "id", "chipMode", "tooltip", "placeholder", "anchorName"] }, { kind: "component", type: WattPlaceholderMaskComponent, selector: "watt-placeholder-mask", inputs: ["primaryInputElement", "secondaryInputElement", "mask", "placeholder"], outputs: ["maskApplied"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
355
276
|
}
|
|
356
277
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: WattDatepickerComponent, decorators: [{
|
|
357
278
|
type: Component,
|
|
@@ -362,32 +283,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImpor
|
|
|
362
283
|
WattFieldComponent,
|
|
363
284
|
WattPlaceholderMaskComponent,
|
|
364
285
|
], template: "<!--\n@license\nCopyright 2020 Energinet DataHub A/S\n\nLicensed under the Apache License, Version 2.0 (the \"License2\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n<watt-field [control]=\"control\" [label]=\"label()\">\n @if (range) {\n <mat-date-range-input\n [disabled]=\"disabled\"\n [rangePicker]=\"rangeDatepicker\"\n [min]=\"min() ?? null\"\n [max]=\"max() ?? null\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut($event)\"\n >\n <input\n inert\n aria-label=\"start-date-input\"\n matStartDate\n #startDateInput\n [readOnly]=\"rangeMonthOnlyMode()\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [hidden]=\"true\"\n />\n\n <input\n inert\n aria-label=\"end-date-input\"\n matEndDate\n #endDateInput\n [readOnly]=\"rangeMonthOnlyMode()\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [hidden]=\"true\"\n />\n </mat-date-range-input>\n <input #actualInput class=\"mask-input\" [disabled]=\"disabled\" />\n <watt-placeholder-mask\n [primaryInputElement]=\"actualInput\"\n [mask]=\"rangeInputMask()\"\n [placeholder]=\"rangePlaceholder\"\n (maskApplied)=\"rangeInputChanged($event)\"\n />\n\n <watt-button\n variant=\"icon\"\n icon=\"date\"\n [disabled]=\"disabled\"\n [attr.aria-pressed]=\"false\"\n (click)=\"rangeDatepicker.open()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut($event)\"\n />\n\n <mat-date-range-picker\n [panelClass]=\"rangeMonthOnlyMode() ? 'watt-datepicker-range__panel--month-only' : ''\"\n [startView]=\"rangeMonthOnlyMode() ? 'multi-year' : 'month'\"\n [startAt]=\"startAt()\"\n (monthSelected)=\"onMonthSelected($event)\"\n (closed)=\"rangePickerClosed()\"\n #rangeDatepicker\n />\n } @else {\n <input\n inert\n matInput\n tabindex=\"-1\"\n aria-label=\"date-input\"\n #dateInput\n autocomplete=\"off\"\n spellcheck=\"false\"\n [disabled]=\"disabled\"\n [min]=\"min()\"\n [max]=\"max()\"\n [matDatepicker]=\"singleDatepicker\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut($event)\"\n />\n <input #actualInput class=\"mask-input\" [disabled]=\"disabled\" />\n <watt-placeholder-mask\n [primaryInputElement]=\"actualInput\"\n [mask]=\"inputMask()\"\n [placeholder]=\"placeholder\"\n (maskApplied)=\"inputChanged($event)\"\n />\n\n <watt-button\n wattSuffix\n variant=\"icon\"\n icon=\"date\"\n [disabled]=\"disabled\"\n (click)=\"singleDatepicker.open()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut($event)\"\n />\n\n <mat-datepicker\n #singleDatepicker\n panelClass=\"watt-datepicker-single__panel\"\n [dateClass]=\"dateClass()\"\n [startAt]=\"startAt()\"\n (closed)=\"datepickerClosed()\"\n />\n }\n\n <ng-content />\n <ng-content ngProjectAs=\"watt-field-hint\" select=\"watt-field-hint\" />\n <ng-content ngProjectAs=\"watt-field-error\" select=\"watt-field-error\" />\n</watt-field>\n\n@if (!range && canStepThroughDays()) {\n <span\n class=\"watt-datepicker-single__step-through\"\n [class.watt-datepicker-single__has-label]=\"!!label()\"\n >\n <watt-button\n variant=\"icon\"\n icon=\"left\"\n (click)=\"prevDay()\"\n [disabled]=\"disabled || isPrevDayButtonDisabled()\"\n />\n <watt-button\n variant=\"icon\"\n icon=\"right\"\n (click)=\"nextDay()\"\n [disabled]=\"disabled || isNextDayButtonDisabled()\"\n />\n </span>\n}\n", styles: ["watt-datepicker{display:flex;align-items:center;width:100%}watt-datepicker watt-button[variant=icon]{margin-left:auto}watt-datepicker watt-button[variant=icon] .watt-button--icon{height:42px}watt-datepicker mat-datepicker,watt-datepicker mat-date-range-picker{display:none}watt-datepicker input.mat-date-range-input-inner,watt-datepicker input.mat-mdc-input-element,watt-datepicker .mat-date-range-input-mirror,watt-datepicker input.mask-input{font-family:Droid Sans Mono,monospace}watt-datepicker input.mat-date-range-input-inner,watt-datepicker input.mat-mdc-input-element,watt-datepicker input.mask-input{border:none;caret-color:var(--watt-color-neutral-black);letter-spacing:-.03em;-webkit-background-clip:text;-moz-background-clip:text;background-clip:text;color:transparent}watt-datepicker input.mask-input{color:#000}watt-datepicker input.mask-input{position:absolute;min-width:100%;padding:2px 1px}watt-datepicker input.mask-input:focus-visible{outline:none}watt-datepicker .mat-date-range-input-container{align-items:initial}watt-datepicker .mat-date-range-input-start-wrapper,watt-datepicker .mat-date-range-input-end-wrapper{max-width:calc(50% - var(--watt-space-s));overflow:visible;position:relative}watt-datepicker .mat-date-range-input-separator{display:flex;align-items:center}watt-datepicker .mat-date-range-input-separator-hidden,watt-datepicker .mat-date-range-input-separator{opacity:0!important}watt-datepicker .mat-date-range-input-inner::-webkit-input-placeholder{color:var(--watt-color-neutral-grey-500)!important;-webkit-text-fill-color:var(--watt-color-neutral-grey-500)}watt-datepicker watt-button .mat-button{background:transparent}watt-datepicker:has(.watt-datepicker-single__step-through){align-items:flex-start}watt-datepicker:has(.watt-datepicker-single__step-through) .watt-datepicker-single__step-through{display:flex;margin-top:1px}watt-datepicker:has(.watt-datepicker-single__has-label) .watt-datepicker-single__step-through{margin-top:28px}.watt-datepicker-range__panel--month-only .mat-calendar-period-button{pointer-events:none}\n"] }]
|
|
365
|
-
}], ctorParameters: () => []
|
|
366
|
-
type: ViewChild,
|
|
367
|
-
args: [MatDatepickerInput]
|
|
368
|
-
}], matDateRangePicker: [{
|
|
369
|
-
type: ViewChild,
|
|
370
|
-
args: [MatDateRangePicker]
|
|
371
|
-
}], matDateRangeInput: [{
|
|
372
|
-
type: ViewChild,
|
|
373
|
-
args: [MatDateRangeInput]
|
|
374
|
-
}], matStartDate: [{
|
|
375
|
-
type: ViewChild,
|
|
376
|
-
args: [MatStartDate]
|
|
377
|
-
}], matEndDate: [{
|
|
378
|
-
type: ViewChild,
|
|
379
|
-
args: [MatEndDate]
|
|
380
|
-
}], actualInput: [{
|
|
381
|
-
type: ViewChild,
|
|
382
|
-
args: ['actualInput']
|
|
383
|
-
}], input: [{
|
|
384
|
-
type: ViewChild,
|
|
385
|
-
args: ['dateInput']
|
|
386
|
-
}], startInput: [{
|
|
387
|
-
type: ViewChild,
|
|
388
|
-
args: ['startDateInput']
|
|
389
|
-
}], endInput: [{
|
|
390
|
-
type: ViewChild,
|
|
391
|
-
args: ['endDateInput']
|
|
392
|
-
}] } });
|
|
393
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0dC1kYXRlcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd2F0dC9wYWNrYWdlL3BpY2tlci9kYXRlcGlja2VyL3dhdHQtZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzL3dhdHQvcGFja2FnZS9waWNrZXIvZGF0ZXBpY2tlci93YXR0LWRhdGVwaWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCO0FBQ2pCOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFlBQVk7QUFDWixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLFlBQVksRUFDWixnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFtQixTQUFTLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLFVBQVUsRUFDVixZQUFZLEdBQ2IsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLGdDQUFnQyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNELE9BQU8sRUFFTCxpQkFBaUIsRUFHakIsS0FBSyxHQUNOLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0s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QUE0QjtxQkFDN0I7d0RBcUJELGtCQUFrQjtzQkFEakIsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBSTdCLGtCQUFrQjtzQkFEakIsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBSTdCLGlCQUFpQjtzQkFEaEIsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBTzVCLFlBQVk7c0JBRFgsU0FBUzt1QkFBQyxZQUFZO2dCQU92QixVQUFVO3NCQURULFNBQVM7dUJBQUMsVUFBVTtnQkFPckIsV0FBVztzQkFEVixTQUFTO3VCQUFDLGFBQWE7Z0JBT3hCLEtBQUs7c0JBREosU0FBUzt1QkFBQyxXQUFXO2dCQU90QixVQUFVO3NCQURULFNBQVM7dUJBQUMsZ0JBQWdCO2dCQU8zQixRQUFRO3NCQURQLFNBQVM7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbIi8vI3JlZ2lvbiBMaWNlbnNlXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBFbmVyZ2luZXQgRGF0YUh1YiBBL1NcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlMlwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyNlbmRyZWdpb25cbmltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIExPQ0FMRV9JRCxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIGVmZmVjdCxcbiAgbGlua2VkU2lnbmFsLFxuICBib29sZWFuQXR0cmlidXRlLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgTmdDb250cm9sLCBWYWxpZGF0b3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBNYXRDYWxlbmRhckNlbGxDbGFzc0Z1bmN0aW9uLFxuICBNYXREYXRlUmFuZ2VJbnB1dCxcbiAgTWF0RGF0ZVJhbmdlUGlja2VyLFxuICBNYXREYXRlcGlja2VySW5wdXQsXG4gIE1hdERhdGVwaWNrZXJNb2R1bGUsXG4gIE1hdEVuZERhdGUsXG4gIE1hdFN0YXJ0RGF0ZSxcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IG1hc2tpdG9EYXRlT3B0aW9uc0dlbmVyYXRvciwgbWFza2l0b0RhdGVSYW5nZU9wdGlvbnNHZW5lcmF0b3IgfSBmcm9tICdAbWFza2l0by9raXQnO1xuXG5pbXBvcnQgeyBXYXR0RmllbGRDb21wb25lbnQgfSBmcm9tICdAZW5lcmdpbmV0L3dhdHQvZmllbGQnO1xuaW1wb3J0IHtcbiAgV2F0dERhdGVSYW5nZSxcbiAgV2F0dExvY2FsZVNlcnZpY2UsXG4gIFdhdHRSYW5nZSxcbiAgV2F0dFN1cHBvcnRlZExvY2FsZXMsXG4gIGRheWpzLFxufSBmcm9tICdAZW5lcmdpbmV0L3dhdHQvY29yZS9kYXRlJztcbmltcG9ydCB7IFdhdHRCdXR0b25Db21wb25lbnQgfSBmcm9tICdAZW5lcmdpbmV0L3dhdHQvYnV0dG9uJztcblxuaW1wb3J0IHtcbiAgV2F0dFBpY2tlckJhc2UsXG4gIFdhdHRQaWNrZXJWYWx1ZSxcbiAgV2F0dFBsYWNlaG9sZGVyTWFza0NvbXBvbmVudCxcbn0gZnJvbSAnQGVuZXJnaW5ldC93YXR0L3BpY2tlci9fX3NoYXJlZCc7XG5cbmNvbnN0IGRhdGVTaG9ydEZvcm1hdCA9ICdERC1NTS1ZWVlZJztcbmV4cG9ydCBjb25zdCBkYW5pc2hUaW1lWm9uZUlkZW50aWZpZXIgPSAnRXVyb3BlL0NvcGVuaGFnZW4nO1xuXG4vKipcbiAqIFVzYWdlOlxuICogYGltcG9ydCB7IFdhdHREYXRlcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnQGVuZXJnaW5ldC1kYXRhaHViL3dhdHQvZGF0ZXBpY2tlcic7YFxuICpcbiAqIElNUE9SVEFOVDpcbiAqIFRoZSBzdHlsaW5nIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gb3VyIG1vbm9zcGFjZWQgZm9udC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd2F0dC1kYXRlcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dhdHQtZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3dhdHQtZGF0ZXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE1hdEZvcm1GaWVsZENvbnRyb2wsIHVzZUV4aXN0aW5nOiBXYXR0RGF0ZXBpY2tlckNvbXBvbmVudCB9XSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdERhdGVwaWNrZXJNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgV2F0dEJ1dHRvbkNvbXBvbmVudCxcbiAgICBXYXR0RmllbGRDb21wb25lbnQsXG4gICAgV2F0dFBsYWNlaG9sZGVyTWFza0NvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgV2F0dERhdGVwaWNrZXJDb21wb25lbnQgZXh0ZW5kcyBXYXR0UGlja2VyQmFzZSBpbXBsZW1lbnRzIFZhbGlkYXRvciwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBlbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNoYW5nZURldGVjdGlvblJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBuZ0NvbnRyb2wgPSBpbmplY3QoTmdDb250cm9sLCB7IG9wdGlvbmFsOiB0cnVlLCBzZWxmOiB0cnVlIH0pO1xuICBwcml2YXRlIGxvY2FsZVNlcnZpY2UgPSBpbmplY3QoV2F0dExvY2FsZVNlcnZpY2UpO1xuICBwcml2YXRlIGxvY2FsZSA9IGluamVjdDxXYXR0U3VwcG9ydGVkTG9jYWxlcz4oTE9DQUxFX0lEKTtcblxuICBtYXggPSBpbnB1dDxEYXRlPigpO1xuICBtaW4gPSBpbnB1dDxEYXRlPigpO1xuICByYW5nZU1vbnRoT25seU1vZGUgPSBpbnB1dChmYWxzZSk7XG4gIHN0YXJ0QXQgPSBpbnB1dDxEYXRlIHwgbnVsbD4obnVsbCk7XG4gIGxhYmVsID0gaW5wdXQ8c3RyaW5nPignJyk7XG4gIGRhdGVDbGFzcyA9IGlucHV0PE1hdENhbGVuZGFyQ2VsbENsYXNzRnVuY3Rpb248RGF0ZT4+KCgpID0+ICcnKTtcbiAgY2FuU3RlcFRocm91Z2hEYXlzID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBAVmlld0NoaWxkKE1hdERhdGVwaWNrZXJJbnB1dClcbiAgbWF0RGF0ZXBpY2tlcklucHV0ITogTWF0RGF0ZXBpY2tlcklucHV0PERhdGUgfCBudWxsPjtcblxuICBAVmlld0NoaWxkKE1hdERhdGVSYW5nZVBpY2tlcilcbiAgbWF0RGF0ZVJhbmdlUGlja2VyITogTWF0RGF0ZVJhbmdlUGlja2VyPERhdGUgfCBudWxsPjtcblxuICBAVmlld0NoaWxkKE1hdERhdGVSYW5nZUlucHV0KVxuICBtYXREYXRlUmFuZ2VJbnB1dCE6IE1hdERhdGVSYW5nZUlucHV0PERhdGUgfCBudWxsPjtcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgQFZpZXdDaGlsZChNYXRTdGFydERhdGUpXG4gIG1hdFN0YXJ0RGF0ZSE6IE1hdFN0YXJ0RGF0ZTxEYXRlIHwgbnVsbD47XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEBWaWV3Q2hpbGQoTWF0RW5kRGF0ZSlcbiAgbWF0RW5kRGF0ZSE6IE1hdEVuZERhdGU8RGF0ZSB8IG51bGw+O1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBAVmlld0NoaWxkKCdhY3R1YWxJbnB1dCcpXG4gIGFjdHVhbElucHV0ITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgQFZpZXdDaGlsZCgnZGF0ZUlucHV0JylcbiAgaW5wdXQhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBAVmlld0NoaWxkKCdzdGFydERhdGVJbnB1dCcpXG4gIHN0YXJ0SW5wdXQhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBAVmlld0NoaWxkKCdlbmREYXRlSW5wdXQnKVxuICBlbmRJbnB1dCE6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgX3BsYWNlaG9sZGVyID0gdGhpcy5nZXRQbGFjZWhvbGRlckJ5TG9jYWxlKHRoaXMubG9jYWxlKTtcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcmFuZ2VTZXBhcmF0b3IgPSAnIC0gJztcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcmFuZ2VQbGFjZWhvbGRlciA9IHRoaXMuZ2V0UmFuZ2VQbGFjZWhvbGRlcigpO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBpbnB1dE1hc2sgPSBjb21wdXRlZCgoKSA9PlxuICAgIG1hc2tpdG9EYXRlT3B0aW9uc0dlbmVyYXRvcih7XG4gICAgICBtb2RlOiAnZGQvbW0veXl5eScsXG4gICAgICBzZXBhcmF0b3I6ICctJyxcbiAgICAgIG1heDogdGhpcy5tYXgoKSxcbiAgICAgIG1pbjogdGhpcy5taW4oKSxcbiAgICB9KVxuICApO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICByYW5nZUlucHV0TWFzayA9IGNvbXB1dGVkKCgpID0+XG4gICAgbWFza2l0b0RhdGVSYW5nZU9wdGlvbnNHZW5lcmF0b3Ioe1xuICAgICAgbW9kZTogJ2RkL21tL3l5eXknLFxuICAgICAgZGF0ZVNlcGFyYXRvcjogJy0nLFxuICAgICAgbWF4OiB0aGlzLm1heCgpLFxuICAgICAgbWluOiB0aGlzLm1pbigpLFxuICAgIH0pXG4gICk7XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGdldFBsYWNlaG9sZGVyQnlMb2NhbGUobG9jYWxlOiBXYXR0U3VwcG9ydGVkTG9jYWxlcyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxvY2FsZSA9PT0gJ2RhJyA/ICdkZC1tbS3DpcOlw6XDpScgOiAnZGQtbW0teXl5eSc7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZ2V0UmFuZ2VQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBsYWNlaG9sZGVyICsgdGhpcy5yYW5nZVNlcGFyYXRvciArIHRoaXMucGxhY2Vob2xkZXI7XG4gIH1cblxuICBpc1ByZXZEYXlCdXR0b25EaXNhYmxlZCA9IGxpbmtlZFNpZ25hbCgoKSA9PiB0aGlzLmlzUHJldkRheUJlZm9yZU9yRXF1YWxUb01pbkRhdGUoKSk7XG4gIGlzTmV4dERheUJ1dHRvbkRpc2FibGVkID0gbGlua2VkU2lnbmFsKCgpID0+IHRoaXMuaXNOZXh0RGF5QWZ0ZXJPckVxdWFsVG9NYXhEYXRlKCkpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGB3YXR0LWRhdGVwaWNrZXItJHtXYXR0RGF0ZXBpY2tlckNvbXBvbmVudC5uZXh0SWQrK31gKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmxvY2FsZVNlcnZpY2UubG9jYWxlKCk7XG4gICAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5nZXRQbGFjZWhvbGRlckJ5TG9jYWxlKGxvY2FsZSk7XG4gICAgICB0aGlzLnJhbmdlUGxhY2Vob2xkZXIgPSB0aGlzLmdldFJhbmdlUGxhY2Vob2xkZXIoKTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0aGlzLnJhbmdlTW9udGhPbmx5TW9kZSgpO1xuICAgICAgdGhpcy5uZ0NvbnRyb2w/LmNvbnRyb2w/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcblxuICAgIHRoaXMubmdDb250cm9sPy5jb250cm9sPy5hZGRWYWxpZGF0b3JzKHRoaXMudmFsaWRhdGUuYmluZCh0aGlzKSk7XG4gIH1cblxuICB2YWxpZGF0ZSh7IHZhbHVlIH06IEFic3RyYWN0Q29udHJvbDxXYXR0UmFuZ2U8c3RyaW5nPj4pIHtcbiAgICBpZiAoIXZhbHVlPy5lbmQgfHwgIXZhbHVlPy5zdGFydCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLnJhbmdlTW9udGhPbmx5TW9kZSgpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzdGFydCA9IGRheWpzKHZhbHVlLnN0YXJ0KTtcbiAgICBjb25zdCBlbmQgPSBkYXlqcyh2YWx1ZS5lbmQpO1xuICAgIHJldHVybiBzdGFydC5pc1NhbWUoc3RhcnQuc3RhcnRPZignbW9udGgnKSkgJiYgZW5kLmlzU2FtZShzdGFydC5lbmRPZignbW9udGgnKSlcbiAgICAgID8gbnVsbFxuICAgICAgOiB7IG1vbnRoT25seTogdHJ1ZSB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRTaW5nbGVJbnB1dCgpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsVmFsdWUpIHtcbiAgICAgIHRoaXMubWF0RGF0ZXBpY2tlcklucHV0LnZhbHVlID0gdGhpcy5pbml0aWFsVmFsdWU7XG4gICAgICB0aGlzLmRhdGVwaWNrZXJDbG9zZWQoKTtcbiAgICB9XG4gIH1cblxuICBpbnB1dENoYW5nZWQodmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IGRhdGVTdHJpbmcgPSB2YWx1ZS5zbGljZSgwLCB0aGlzLnBsYWNlaG9sZGVyLmxlbmd0aCk7XG5cbiAgICBpZiAoZGF0ZVN0cmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY29udHJvbD8uc2V0VmFsdWUobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGVTdHJpbmcubGVuZ3RoICE9PSB0aGlzLnBsYWNlaG9sZGVyLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGUgPSB0aGlzLnBhcnNlRGF0ZVNob3J0Rm9ybWF0KGRhdGVTdHJpbmcpO1xuICAgIHRoaXMuY29udHJvbD8uc2V0VmFsdWUodGhpcy5mb3JtYXREYXRlRnJvbVZpZXdUb01vZGVsKGRhdGUpKTtcbiAgfVxuXG4gIGRhdGVwaWNrZXJDbG9zZWQoKSB7XG4gICAgaWYgKHRoaXMubWF0RGF0ZXBpY2tlcklucHV0LnZhbHVlKSB7XG4gICAgICB0aGlzLmNvbnRyb2w/LnNldFZhbHVlKHRoaXMubWF0RGF0ZXBpY2tlcklucHV0LnZhbHVlKTtcblxuICAgICAgdGhpcy5hY3R1YWxJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5mb3JtYXREYXRlVGltZUZyb21Nb2RlbFRvVmlldyhcbiAgICAgICAgdGhpcy5mb3JtYXREYXRlRnJvbVZpZXdUb01vZGVsKHRoaXMubWF0RGF0ZXBpY2tlcklucHV0LnZhbHVlKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3R1YWxJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICB0aGlzLmNvbnRyb2w/LnNldFZhbHVlKG51bGwpO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcmV2RGF5QnV0dG9uRGlzYWJsZWQuc2V0KHRoaXMuaXNQcmV2RGF5QmVmb3JlT3JFcXVhbFRvTWluRGF0ZSgpKTtcbiAgICB0aGlzLmlzTmV4dERheUJ1dHRvbkRpc2FibGVkLnNldCh0aGlzLmlzTmV4dERheUFmdGVyT3JFcXVhbFRvTWF4RGF0ZSgpKTtcblxuICAgIHRoaXMuYWN0dWFsSW5wdXQubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBJbnB1dEV2ZW50KCdpbnB1dCcpKTtcbiAgfVxuXG4gIG9uTW9udGhTZWxlY3RlZChkYXRlOiBEYXRlKSB7XG4gICAgaWYgKHRoaXMucmFuZ2VNb250aE9ubHlNb2RlKCkgJiYgZGF0ZSkge1xuICAgICAgdGhpcy5tYXREYXRlUmFuZ2VQaWNrZXIuc2VsZWN0KGRheWpzKGRhdGUpLnN0YXJ0T2YoJ21vbnRoJykudG9EYXRlKCkpO1xuICAgICAgdGhpcy5tYXREYXRlUmFuZ2VQaWNrZXIuc2VsZWN0KGRheWpzKGRhdGUpLmVuZE9mKCdtb250aCcpLnRvRGF0ZSgpKTtcbiAgICAgIHRoaXMubWF0RGF0ZVJhbmdlUGlja2VyLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBpbml0UmFuZ2VJbnB1dCgpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsVmFsdWUpIHtcbiAgICAgIHRoaXMubWF0U3RhcnREYXRlLnZhbHVlID0gKHRoaXMuaW5pdGlhbFZhbHVlIGFzIFdhdHREYXRlUmFuZ2UpLnN0YXJ0O1xuICAgICAgdGhpcy5tYXRFbmREYXRlLnZhbHVlID0gKHRoaXMuaW5pdGlhbFZhbHVlIGFzIFdhdHREYXRlUmFuZ2UpLmVuZDtcbiAgICAgIHRoaXMucmFuZ2VQaWNrZXJDbG9zZWQoKTtcbiAgICB9XG4gIH1cblxuICBjbGVhclJhbmdlUGlja2VyKCkge1xuICAgIHRoaXMuY29udHJvbD8uc2V0VmFsdWUobnVsbCk7XG4gICAgdGhpcy5hY3R1YWxJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgdGhpcy5hY3R1YWxJbnB1dC5uYXRpdmVFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IElucHV0RXZlbnQoJ2lucHV0JykpO1xuICB9XG5cbiAgcmFuZ2VJbnB1dENoYW5nZWQodmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IHN0YXJ0RGF0ZVN0cmluZyA9IHZhbHVlLnNsaWNlKDAsIHRoaXMucGxhY2Vob2xkZXIubGVuZ3RoKTtcblxuICAgIGlmIChzdGFydERhdGVTdHJpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmNvbnRyb2w/LnNldFZhbHVlKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzdGFydERhdGVTdHJpbmcubGVuZ3RoICE9PSB0aGlzLnBsYWNlaG9sZGVyLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5wYXJzZURhdGVTaG9ydEZvcm1hdChzdGFydERhdGVTdHJpbmcpO1xuICAgIGNvbnN0IGVuZERhdGVTdHJpbmcgPSB2YWx1ZS5zbGljZSh0aGlzLnBsYWNlaG9sZGVyLmxlbmd0aCArIHRoaXMucmFuZ2VTZXBhcmF0b3IubGVuZ3RoKTtcbiAgICBsZXQgZW5kID0gdGhpcy5zZXRFbmREYXRlVG9EYW5pc2hUaW1lWm9uZShlbmREYXRlU3RyaW5nKTtcblxuICAgIGlmIChlbmQgIT09IG51bGwpIHtcbiAgICAgIGVuZCA9IHRoaXMuc2V0VG9FbmRPZkRheShlbmQpO1xuICAgICAgdGhpcy5jb250cm9sPy5zZXRWYWx1ZSh7IHN0YXJ0LCBlbmQgfSk7XG4gICAgfVxuICB9XG5cbiAgcmFuZ2VQaWNrZXJDbG9zZWQoKSB7XG4gICAgaWYgKHRoaXMubWF0RGF0ZVJhbmdlSW5wdXQudmFsdWU/LnN0YXJ0ICYmIHRoaXMubWF0RGF0ZVJhbmdlSW5wdXQudmFsdWUuZW5kKSB7XG4gICAgICB0aGlzLmFjdHVhbElucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPVxuICAgICAgICB0aGlzLmZvcm1hdERhdGVUaW1lRnJvbU1vZGVsVG9WaWV3KFxuICAgICAgICAgIHRoaXMuZm9ybWF0RGF0ZUZyb21WaWV3VG9Nb2RlbCh0aGlzLm1hdERhdGVSYW5nZUlucHV0LnZhbHVlPy5zdGFydClcbiAgICAgICAgKSArXG4gICAgICAgICctJyArXG4gICAgICAgIHRoaXMuZm9ybWF0RGF0ZVRpbWVGcm9tTW9kZWxUb1ZpZXcoXG4gICAgICAgICAgdGhpcy5mb3JtYXREYXRlRnJvbVZpZXdUb01vZGVsKHRoaXMubWF0RGF0ZVJhbmdlSW5wdXQudmFsdWUuZW5kKVxuICAgICAgICApO1xuXG4gICAgICB0aGlzLmNvbnRyb2w/LnNldFZhbHVlKHtcbiAgICAgICAgc3RhcnQ6IHRoaXMuZm9ybWF0RGF0ZUZyb21WaWV3VG9Nb2RlbCh0aGlzLm1hdERhdGVSYW5nZUlucHV0LnZhbHVlLnN0YXJ0KSxcbiAgICAgICAgZW5kOiB0aGlzLmZvcm1hdERhdGVGcm9tVmlld1RvTW9kZWwodGhpcy5tYXREYXRlUmFuZ2VJbnB1dC52YWx1ZS5lbmQpLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWN0dWFsSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgdGhpcy5jb250cm9sPy5zZXRWYWx1ZShudWxsKTtcbiAgICB9XG5cbiAgICB0aGlzLmFjdHVhbElucHV0Lm5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgSW5wdXRFdmVudCgnaW5wdXQnKSk7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIHNldFNpbmdsZVZhbHVlKFxuICAgIHZhbHVlOiBFeGNsdWRlPFdhdHRQaWNrZXJWYWx1ZSwgV2F0dERhdGVSYW5nZT4sXG4gICAgaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnRcbiAgKSB7XG4gICAgdGhpcy5zZXRWYWx1ZVRvSW5wdXQodmFsdWUsIGlucHV0LCB0aGlzLm1hdERhdGVwaWNrZXJJbnB1dCk7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIHNldFJhbmdlVmFsdWUoXG4gICAgdmFsdWU6IFdhdHREYXRlUmFuZ2UgfCBudWxsLFxuICAgIHN0YXJ0SW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsXG4gICAgZW5kSW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnRcbiAgKSB7XG4gICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB2YWx1ZSA/PyB7fTtcblxuICAgIHRoaXMuc2V0VmFsdWVUb0lucHV0KHN0YXJ0LCBzdGFydElucHV0LCB0aGlzLm1hdFN0YXJ0RGF0ZSk7XG4gICAgdGhpcy5zZXRWYWx1ZVRvSW5wdXQoZW5kLCBlbmRJbnB1dCwgdGhpcy5tYXRFbmREYXRlKTtcbiAgfVxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHJldkRheSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZURheSgtMSk7XG4gIH1cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG5leHREYXkoKTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2VEYXkoMSk7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGFuZ2VEYXkodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gdGhpcy5tYXREYXRlcGlja2VySW5wdXQudmFsdWU7XG5cbiAgICBpZiAoY3VycmVudERhdGUpIHtcbiAgICAgIGNvbnN0IG5ld0RhdGUgPSBkYXlqcyhjdXJyZW50RGF0ZSkuYWRkKHZhbHVlLCAnZGF5JykudG9JU09TdHJpbmcoKTtcbiAgICAgIGNvbnN0IG5ld0RhdGVGb3JtYXR0ZWQgPSB0aGlzLmZvcm1hdERhdGVUaW1lRnJvbU1vZGVsVG9WaWV3KG5ld0RhdGUpO1xuXG4gICAgICB0aGlzLmlucHV0Q2hhbmdlZChuZXdEYXRlRm9ybWF0dGVkKTtcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNsb3NlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIGlzUHJldkRheUJlZm9yZU9yRXF1YWxUb01pbkRhdGUoKSB7XG4gICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICBjb25zdCBzZWxlY3RlZERhdGUgPSB0aGlzLm1hdERhdGVwaWNrZXJJbnB1dD8udmFsdWU7XG5cbiAgICBpZiAoIW1pbiB8fCAhc2VsZWN0ZWREYXRlKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBpc0JlZm9yZSA9IGRheWpzKHNlbGVjdGVkRGF0ZSkuaXNCZWZvcmUobWluLCAnZGF5Jyk7XG4gICAgY29uc3QgaXNTYW1lID0gZGF5anMoc2VsZWN0ZWREYXRlKS5pc1NhbWUobWluLCAnZGF5Jyk7XG5cbiAgICByZXR1cm4gaXNTYW1lIHx8IGlzQmVmb3JlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHByaXZhdGUgaXNOZXh0RGF5QWZ0ZXJPckVxdWFsVG9NYXhEYXRlKCkge1xuICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgY29uc3Qgc2VsZWN0ZWREYXRlID0gdGhpcy5tYXREYXRlcGlja2VySW5wdXQ/LnZhbHVlO1xuXG4gICAgaWYgKCFtYXggfHwgIXNlbGVjdGVkRGF0ZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgaXNBZnRlciA9IGRheWpzKHNlbGVjdGVkRGF0ZSkuaXNBZnRlcihtYXgsICdkYXknKTtcbiAgICBjb25zdCBpc1NhbWUgPSBkYXlqcyhzZWxlY3RlZERhdGUpLmlzU2FtZShtYXgsICdkYXknKTtcblxuICAgIHJldHVybiBpc1NhbWUgfHwgaXNBZnRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIHBhcnNlRGF0ZVNob3J0Rm9ybWF0KHZhbHVlOiBzdHJpbmcpOiBEYXRlIHtcbiAgICByZXR1cm4gZGF5anModmFsdWUsIGRhdGVTaG9ydEZvcm1hdCkudG9EYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBzZXRWYWx1ZVRvSW5wdXQ8RCBleHRlbmRzIHsgdmFsdWU6IERhdGUgfCBudWxsIH0+KFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgIG5hdGl2ZUlucHV0OiBIVE1MSW5wdXRFbGVtZW50LFxuICAgIG1hdERhdGVJbnB1dDogRFxuICApOiB2b2lkIHtcbiAgICBuYXRpdmVJbnB1dC52YWx1ZSA9IHZhbHVlID8gdGhpcy5mb3JtYXREYXRlVGltZUZyb21Nb2RlbFRvVmlldyh2YWx1ZSkgOiAnJztcbiAgICBtYXREYXRlSW5wdXQudmFsdWUgPSB2YWx1ZSA/IGRheWpzKHZhbHVlKS51dGMoKS50b0RhdGUoKSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKiBGb3JtYXRzIERhdGUgdG8gZnVsbCBJU08gODYwMSBmb3JtYXQgKGUuZy4gYDIwMjItMDgtMzFUMjI6MDA6MDAuMDAwWmApXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdERhdGVGcm9tVmlld1RvTW9kZWwodmFsdWU6IERhdGUpOiBzdHJpbmcge1xuICAgIHJldHVybiBkYXlqcyh2YWx1ZSkudXRjKCkudG9JU09TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdERhdGVUaW1lRnJvbU1vZGVsVG9WaWV3KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkYXlqcyh2YWx1ZSkudHooZGFuaXNoVGltZVpvbmVJZGVudGlmaWVyKS5mb3JtYXQoZGF0ZVNob3J0Rm9ybWF0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIHRvRGFuaXNoVGltZVpvbmUodmFsdWU6IERhdGUpOiBEYXRlIHtcbiAgICByZXR1cm4gZGF5anModmFsdWUudG9JU09TdHJpbmcoKSkudHooZGFuaXNoVGltZVpvbmVJZGVudGlmaWVyKS50b0RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIHNldFRvRW5kT2ZEYXkodmFsdWU6IERhdGUpOiBEYXRlIHtcbiAgICByZXR1cm4gZGF5anModmFsdWUpLmVuZE9mKCdkYXknKS50b0RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIHNldEVuZERhdGVUb0RhbmlzaFRpbWVab25lKHZhbHVlOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgY29uc3QgZGF0ZUJhc2VkT25TaG9ydEZvcm1hdCA9IHRoaXMucGFyc2VEYXRlU2hvcnRGb3JtYXQodmFsdWUpO1xuXG4gICAgbGV0IG1heWJlRGF0ZUluRGFuaXNoVGltZVpvbmU6IERhdGUgfCBudWxsID0gbnVsbDtcblxuICAgIGlmIChkYXlqcyhkYXRlQmFzZWRPblNob3J0Rm9ybWF0KS5pc1ZhbGlkKCkpIHtcbiAgICAgIG1heWJlRGF0ZUluRGFuaXNoVGltZVpvbmUgPSB0aGlzLnRvRGFuaXNoVGltZVpvbmUoZGF0ZUJhc2VkT25TaG9ydEZvcm1hdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1heWJlRGF0ZUluRGFuaXNoVGltZVpvbmU7XG4gIH1cbn1cbiIsIjwhLS1cbkBsaWNlbnNlXG5Db3B5cmlnaHQgMjAyMCBFbmVyZ2luZXQgRGF0YUh1YiBBL1NcblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZTJcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuLS0+XG48d2F0dC1maWVsZCBbY29udHJvbF09XCJjb250cm9sXCIgW2xhYmVsXT1cImxhYmVsKClcIj5cbiAgQGlmIChyYW5nZSkge1xuICAgIDxtYXQtZGF0ZS1yYW5nZS1pbnB1dFxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtyYW5nZVBpY2tlcl09XCJyYW5nZURhdGVwaWNrZXJcIlxuICAgICAgW21pbl09XCJtaW4oKSA/PyBudWxsXCJcbiAgICAgIFttYXhdPVwibWF4KCkgPz8gbnVsbFwiXG4gICAgICAoZm9jdXNpbik9XCJvbkZvY3VzSW4oKVwiXG4gICAgICAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgkZXZlbnQpXCJcbiAgICA+XG4gICAgICA8aW5wdXRcbiAgICAgICAgaW5lcnRcbiAgICAgICAgYXJpYS1sYWJlbD1cInN0YXJ0LWRhdGUtaW5wdXRcIlxuICAgICAgICBtYXRTdGFydERhdGVcbiAgICAgICAgI3N0YXJ0RGF0ZUlucHV0XG4gICAgICAgIFtyZWFkT25seV09XCJyYW5nZU1vbnRoT25seU1vZGUoKVwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgIFtoaWRkZW5dPVwidHJ1ZVwiXG4gICAgICAvPlxuXG4gICAgICA8aW5wdXRcbiAgICAgICAgaW5lcnRcbiAgICAgICAgYXJpYS1sYWJlbD1cImVuZC1kYXRlLWlucHV0XCJcbiAgICAgICAgbWF0RW5kRGF0ZVxuICAgICAgICAjZW5kRGF0ZUlucHV0XG4gICAgICAgIFtyZWFkT25seV09XCJyYW5nZU1vbnRoT25seU1vZGUoKVwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgIFtoaWRkZW5dPVwidHJ1ZVwiXG4gICAgICAvPlxuICAgIDwvbWF0LWRhdGUtcmFuZ2UtaW5wdXQ+XG4gICAgPGlucHV0ICNhY3R1YWxJbnB1dCBjbGFzcz1cIm1hc2staW5wdXRcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAvPlxuICAgIDx3YXR0LXBsYWNlaG9sZGVyLW1hc2tcbiAgICAgIFtwcmltYXJ5SW5wdXRFbGVtZW50XT1cImFjdHVhbElucHV0XCJcbiAgICAgIFttYXNrXT1cInJhbmdlSW5wdXRNYXNrKClcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cInJhbmdlUGxhY2Vob2xkZXJcIlxuICAgICAgKG1hc2tBcHBsaWVkKT1cInJhbmdlSW5wdXRDaGFuZ2VkKCRldmVudClcIlxuICAgIC8+XG5cbiAgICA8d2F0dC1idXR0b25cbiAgICAgIHZhcmlhbnQ9XCJpY29uXCJcbiAgICAgIGljb249XCJkYXRlXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwiZmFsc2VcIlxuICAgICAgKGNsaWNrKT1cInJhbmdlRGF0ZXBpY2tlci5vcGVuKClcIlxuICAgICAgKGZvY3VzaW4pPVwib25Gb2N1c0luKClcIlxuICAgICAgKGZvY3Vzb3V0KT1cIm9uRm9jdXNPdXQoJGV2ZW50KVwiXG4gICAgLz5cblxuICAgIDxtYXQtZGF0ZS1yYW5nZS1waWNrZXJcbiAgICAgIFtwYW5lbENsYXNzXT1cInJhbmdlTW9udGhPbmx5TW9kZSgpID8gJ3dhdHQtZGF0ZXBpY2tlci1yYW5nZV9fcGFuZWwtLW1vbnRoLW9ubHknIDogJydcIlxuICAgICAgW3N0YXJ0Vmlld109XCJyYW5nZU1vbnRoT25seU1vZGUoKSA/ICdtdWx0aS15ZWFyJyA6ICdtb250aCdcIlxuICAgICAgW3N0YXJ0QXRdPVwic3RhcnRBdCgpXCJcbiAgICAgIChtb250aFNlbGVjdGVkKT1cIm9uTW9udGhTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgIChjbG9zZWQpPVwicmFuZ2VQaWNrZXJDbG9zZWQoKVwiXG4gICAgICAjcmFuZ2VEYXRlcGlja2VyXG4gICAgLz5cbiAgfSBAZWxzZSB7XG4gICAgPGlucHV0XG4gICAgICBpbmVydFxuICAgICAgbWF0SW5wdXRcbiAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgYXJpYS1sYWJlbD1cImRhdGUtaW5wdXRcIlxuICAgICAgI2RhdGVJbnB1dFxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW21pbl09XCJtaW4oKVwiXG4gICAgICBbbWF4XT1cIm1heCgpXCJcbiAgICAgIFttYXREYXRlcGlja2VyXT1cInNpbmdsZURhdGVwaWNrZXJcIlxuICAgICAgKGZvY3VzaW4pPVwib25Gb2N1c0luKClcIlxuICAgICAgKGZvY3Vzb3V0KT1cIm9uRm9jdXNPdXQoJGV2ZW50KVwiXG4gICAgLz5cbiAgICA8aW5wdXQgI2FjdHVhbElucHV0IGNsYXNzPVwibWFzay1pbnB1dFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIC8+XG4gICAgPHdhdHQtcGxhY2Vob2xkZXItbWFza1xuICAgICAgW3ByaW1hcnlJbnB1dEVsZW1lbnRdPVwiYWN0dWFsSW5wdXRcIlxuICAgICAgW21hc2tdPVwiaW5wdXRNYXNrKClcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgIChtYXNrQXBwbGllZCk9XCJpbnB1dENoYW5nZWQoJGV2ZW50KVwiXG4gICAgLz5cblxuICAgIDx3YXR0LWJ1dHRvblxuICAgICAgd2F0dFN1ZmZpeFxuICAgICAgdmFyaWFudD1cImljb25cIlxuICAgICAgaWNvbj1cImRhdGVcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIChjbGljayk9XCJzaW5nbGVEYXRlcGlja2VyLm9wZW4oKVwiXG4gICAgICAoZm9jdXNpbik9XCJvbkZvY3VzSW4oKVwiXG4gICAgICAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgkZXZlbnQpXCJcbiAgICAvPlxuXG4gICAgPG1hdC1kYXRlcGlja2VyXG4gICAgICAjc2luZ2xlRGF0ZXBpY2tlclxuICAgICAgcGFuZWxDbGFzcz1cIndhdHQtZGF0ZXBpY2tlci1zaW5nbGVfX3BhbmVsXCJcbiAgICAgIFtkYXRlQ2xhc3NdPVwiZGF0ZUNsYXNzKClcIlxuICAgICAgW3N0YXJ0QXRdPVwic3RhcnRBdCgpXCJcbiAgICAgIChjbG9zZWQpPVwiZGF0ZXBpY2tlckNsb3NlZCgpXCJcbiAgICAvPlxuICB9XG5cbiAgPG5nLWNvbnRlbnQgLz5cbiAgPG5nLWNvbnRlbnQgbmdQcm9qZWN0QXM9XCJ3YXR0LWZpZWxkLWhpbnRcIiBzZWxlY3Q9XCJ3YXR0LWZpZWxkLWhpbnRcIiAvPlxuICA8bmctY29udGVudCBuZ1Byb2plY3RBcz1cIndhdHQtZmllbGQtZXJyb3JcIiBzZWxlY3Q9XCJ3YXR0LWZpZWxkLWVycm9yXCIgLz5cbjwvd2F0dC1maWVsZD5cblxuQGlmICghcmFuZ2UgJiYgY2FuU3RlcFRocm91Z2hEYXlzKCkpIHtcbiAgPHNwYW5cbiAgICBjbGFzcz1cIndhdHQtZGF0ZXBpY2tlci1zaW5nbGVfX3N0ZXAtdGhyb3VnaFwiXG4gICAgW2NsYXNzLndhdHQtZGF0ZXBpY2tlci1zaW5nbGVfX2hhcy1sYWJlbF09XCIhIWxhYmVsKClcIlxuICA+XG4gICAgPHdhdHQtYnV0dG9uXG4gICAgICB2YXJpYW50PVwiaWNvblwiXG4gICAgICBpY29uPVwibGVmdFwiXG4gICAgICAoY2xpY2spPVwicHJldkRheSgpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBpc1ByZXZEYXlCdXR0b25EaXNhYmxlZCgpXCJcbiAgICAvPlxuICAgIDx3YXR0LWJ1dHRvblxuICAgICAgdmFyaWFudD1cImljb25cIlxuICAgICAgaWNvbj1cInJpZ2h0XCJcbiAgICAgIChjbGljayk9XCJuZXh0RGF5KClcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IGlzTmV4dERheUJ1dHRvbkRpc2FibGVkKClcIlxuICAgIC8+XG4gIDwvc3Bhbj5cbn1cbiJdfQ==
|
|
286
|
+
}], ctorParameters: () => [] });
|
|
287
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0dC1kYXRlcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd2F0dC9wYWNrYWdlL3BpY2tlci9kYXRlcGlja2VyL3dhdHQtZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzL3dhdHQvcGFja2FnZS9waWNrZXIvZGF0ZXBpY2tlci93YXR0LWRhdGVwaWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCO0FBQ2pCOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFlBQVk7QUFDWixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsU0FBUyxFQUNULGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sWUFBWSxFQUNaLGdCQUFnQixFQUNoQixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFtQixTQUFTLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLFVBQVUsRUFDVixZQUFZLEdBQ2IsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLGdDQUFnQyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNELE9BQU8sRUFFTCxpQkFBaUIsRUFHakIsS0FBSyxHQUNOLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0s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QixFQUFFLFdBQVcseUJBQXlCLEVBQUUsQ0FBQyxpQkFDcEUsaUJBQWlCLENBQUMsSUFBSSxXQUM1Qjt3QkFDUCxtQkFBbUI7d0JBQ25CLGNBQWM7d0JBQ2QsbUJBQW1CO3dCQUNuQixrQkFBa0I7d0JBQ2xCLDRCQUE0QjtxQkFDN0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyNyZWdpb24gTGljZW5zZVxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgRW5lcmdpbmV0IERhdGFIdWIgQS9TXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZTJcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8jZW5kcmVnaW9uXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBMT0NBTEVfSUQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgZWZmZWN0LFxuICBsaW5rZWRTaWduYWwsXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIE5nQ29udHJvbCwgVmFsaWRhdG9yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgTWF0Q2FsZW5kYXJDZWxsQ2xhc3NGdW5jdGlvbixcbiAgTWF0RGF0ZVJhbmdlSW5wdXQsXG4gIE1hdERhdGVSYW5nZVBpY2tlcixcbiAgTWF0RGF0ZXBpY2tlcklucHV0LFxuICBNYXREYXRlcGlja2VyTW9kdWxlLFxuICBNYXRFbmREYXRlLFxuICBNYXRTdGFydERhdGUsXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBtYXNraXRvRGF0ZU9wdGlvbnNHZW5lcmF0b3IsIG1hc2tpdG9EYXRlUmFuZ2VPcHRpb25zR2VuZXJhdG9yIH0gZnJvbSAnQG1hc2tpdG8va2l0JztcblxuaW1wb3J0IHsgV2F0dEZpZWxkQ29tcG9uZW50IH0gZnJvbSAnQGVuZXJnaW5ldC93YXR0L2ZpZWxkJztcbmltcG9ydCB7XG4gIFdhdHREYXRlUmFuZ2UsXG4gIFdhdHRMb2NhbGVTZXJ2aWNlLFxuICBXYXR0UmFuZ2UsXG4gIFdhdHRTdXBwb3J0ZWRMb2NhbGVzLFxuICBkYXlqcyxcbn0gZnJvbSAnQGVuZXJnaW5ldC93YXR0L2NvcmUvZGF0ZSc7XG5pbXBvcnQgeyBXYXR0QnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGVuZXJnaW5ldC93YXR0L2J1dHRvbic7XG5cbmltcG9ydCB7XG4gIFdhdHRQaWNrZXJCYXNlLFxuICBXYXR0UGlja2VyVmFsdWUsXG4gIFdhdHRQbGFjZWhvbGRlck1hc2tDb21wb25lbnQsXG59IGZyb20gJ0BlbmVyZ2luZXQvd2F0dC9waWNrZXIvX19zaGFyZWQnO1xuXG5jb25zdCBkYXRlU2hvcnRGb3JtYXQgPSAnREQtTU0tWVlZWSc7XG5leHBvcnQgY29uc3QgZGFuaXNoVGltZVpvbmVJZGVudGlmaWVyID0gJ0V1cm9wZS9Db3BlbmhhZ2VuJztcblxuLyoqXG4gKiBVc2FnZTpcbiAqIGBpbXBvcnQgeyBXYXR0RGF0ZXBpY2tlckNvbXBvbmVudCB9IGZyb20gJ0BlbmVyZ2luZXQtZGF0YWh1Yi93YXR0L2RhdGVwaWNrZXInO2BcbiAqXG4gKiBJTVBPUlRBTlQ6XG4gKiBUaGUgc3R5bGluZyBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIG91ciBtb25vc3BhY2VkIGZvbnQuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dhdHQtZGF0ZXBpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi93YXR0LWRhdGVwaWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi93YXR0LWRhdGVwaWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBNYXRGb3JtRmllbGRDb250cm9sLCB1c2VFeGlzdGluZzogV2F0dERhdGVwaWNrZXJDb21wb25lbnQgfV0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXREYXRlcGlja2VyTW9kdWxlLFxuICAgIE1hdElucHV0TW9kdWxlLFxuICAgIFdhdHRCdXR0b25Db21wb25lbnQsXG4gICAgV2F0dEZpZWxkQ29tcG9uZW50LFxuICAgIFdhdHRQbGFjZWhvbGRlck1hc2tDb21wb25lbnQsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFdhdHREYXRlcGlja2VyQ29tcG9uZW50IGV4dGVuZHMgV2F0dFBpY2tlckJhc2UgaW1wbGVtZW50cyBWYWxpZGF0b3IsIEFmdGVyVmlld0luaXQge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZWxlbWVudFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBjaGFuZ2VEZXRlY3Rpb25SZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbmdDb250cm9sID0gaW5qZWN0KE5nQ29udHJvbCwgeyBvcHRpb25hbDogdHJ1ZSwgc2VsZjogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSBsb2NhbGVTZXJ2aWNlID0gaW5qZWN0KFdhdHRMb2NhbGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBsb2NhbGUgPSBpbmplY3Q8V2F0dFN1cHBvcnRlZExvY2FsZXM+KExPQ0FMRV9JRCk7XG5cbiAgbWF4ID0gaW5wdXQ8RGF0ZT4oKTtcbiAgbWluID0gaW5wdXQ8RGF0ZT4oKTtcbiAgcmFuZ2VNb250aE9ubHlNb2RlID0gaW5wdXQoZmFsc2UpO1xuICBzdGFydEF0ID0gaW5wdXQ8RGF0ZSB8IG51bGw+KG51bGwpO1xuICBsYWJlbCA9IGlucHV0PHN0cmluZz4oJycpO1xuICBkYXRlQ2xhc3MgPSBpbnB1dDxNYXRDYWxlbmRhckNlbGxDbGFzc0Z1bmN0aW9uPERhdGU+PigoKSA9PiAnJyk7XG4gIGNhblN0ZXBUaHJvdWdoRGF5cyA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblxuICBwcm90ZWN0ZWQgbWF0RGF0ZXBpY2tlcklucHV0ID1cbiAgICB2aWV3Q2hpbGQucmVxdWlyZWQ8TWF0RGF0ZXBpY2tlcklucHV0PERhdGUgfCBudWxsPj4oTWF0RGF0ZXBpY2tlcklucHV0KTtcbiAgcHJvdGVjdGVkIG1hdERhdGVSYW5nZVBpY2tlciA9XG4gICAgdmlld0NoaWxkLnJlcXVpcmVkPE1hdERhdGVSYW5nZVBpY2tlcjxEYXRlIHwgbnVsbD4+KE1hdERhdGVSYW5nZVBpY2tlcik7XG4gIHByb3RlY3RlZCBtYXREYXRlUmFuZ2VJbnB1dCA9XG4gICAgdmlld0NoaWxkLnJlcXVpcmVkPE1hdERhdGVSYW5nZUlucHV0PERhdGUgfCBudWxsPj4oTWF0RGF0ZVJhbmdlSW5wdXQpO1xuXG4gIHByb3RlY3RlZCBtYXRTdGFydERhdGUgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8TWF0U3RhcnREYXRlPERhdGUgfCBudWxsPj4oTWF0U3RhcnREYXRlKTtcbiAgcHJvdGVjdGVkIG1hdEVuZERhdGUgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8TWF0RW5kRGF0ZTxEYXRlIHwgbnVsbD4+KE1hdEVuZERhdGUpO1xuICBwcm90ZWN0ZWQgYWN0dWFsSW5wdXQgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pj4oJ2FjdHVhbElucHV0Jyk7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBpbnB1dCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+PignZGF0ZUlucHV0Jyk7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydElucHV0ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdzdGFydERhdGVJbnB1dCcpO1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZW5kSW5wdXQgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pj4oJ2VuZERhdGVJbnB1dCcpO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBfcGxhY2Vob2xkZXIgPSB0aGlzLmdldFBsYWNlaG9sZGVyQnlMb2NhbGUodGhpcy5sb2NhbGUpO1xuXG4gIHJhbmdlU2VwYXJhdG9yID0gJyAtICc7XG5cbiAgcmFuZ2VQbGFjZWhvbGRlciA9IHRoaXMuZ2V0UmFuZ2VQbGFjZWhvbGRlcigpO1xuXG4gIGlucHV0TWFzayA9IGNvbXB1dGVkKCgpID0+XG4gICAgbWFza2l0b0RhdGVPcHRpb25zR2VuZXJhdG9yKHtcbiAgICAgIG1vZGU6ICdkZC9tbS95eXl5JyxcbiAgICAgIHNlcGFyYXRvcjogJy0nLFxuICAgICAgbWF4OiB0aGlzLm1heCgpLFxuICAgICAgbWluOiB0aGlzLm1pbigpLFxuICAgIH0pXG4gICk7XG5cbiAgcmFuZ2VJbnB1dE1hc2sgPSBjb21wdXRlZCgoKSA9PlxuICAgIG1hc2tpdG9EYXRlUmFuZ2VPcHRpb25zR2VuZXJhdG9yKHtcbiAgICAgIG1vZGU6ICdkZC9tbS95eXl5JyxcbiAgICAgIGRhdGVTZXBhcmF0b3I6ICctJyxcbiAgICAgIG1heDogdGhpcy5tYXgoKSxcbiAgICAgIG1pbjogdGhpcy5taW4oKSxcbiAgICB9KVxuICApO1xuXG4gIGdldFBsYWNlaG9sZGVyQnlMb2NhbGUobG9jYWxlOiBXYXR0U3VwcG9ydGVkTG9jYWxlcyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxvY2FsZSA9PT0gJ2RhJyA/ICdkZC1tbS3DpcOlw6XDpScgOiAnZGQtbW0teXl5eSc7XG4gIH1cblxuICBnZXRSYW5nZVBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGxhY2Vob2xkZXIgKyB0aGlzLnJhbmdlU2VwYXJhdG9yICsgdGhpcy5wbGFjZWhvbGRlcjtcbiAgfVxuXG4gIGlzUHJldkRheUJ1dHRvbkRpc2FibGVkID0gbGlua2VkU2lnbmFsKCgpID0+IHRoaXMuaXNQcmV2RGF5QmVmb3JlT3JFcXVhbFRvTWluRGF0ZSgpKTtcbiAgaXNOZXh0RGF5QnV0dG9uRGlzYWJsZWQgPSBsaW5rZWRTaWduYWwoKCkgPT4gdGhpcy5pc05leHREYXlBZnRlck9yRXF1YWxUb01heERhdGUoKSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoYHdhdHQtZGF0ZXBpY2tlci0ke1dhdHREYXRlcGlja2VyQ29tcG9uZW50Lm5leHRJZCsrfWApO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMubG9jYWxlU2VydmljZS5sb2NhbGUoKTtcbiAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSB0aGlzLmdldFBsYWNlaG9sZGVyQnlMb2NhbGUobG9jYWxlKTtcbiAgICAgIHRoaXMucmFuZ2VQbGFjZWhvbGRlciA9IHRoaXMuZ2V0UmFuZ2VQbGFjZWhvbGRlcigpO1xuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMucmFuZ2VNb250aE9ubHlNb2RlKCk7XG4gICAgICB0aGlzLm5nQ29udHJvbD8uY29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuXG4gICAgdGhpcy5uZ0NvbnRyb2w/LmNvbnRyb2w/LmFkZFZhbGlkYXRvcnModGhpcy52YWxpZGF0ZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHZhbGlkYXRlKHsgdmFsdWUgfTogQWJzdHJhY3RDb250cm9sPFdhdHRSYW5nZTxzdHJpbmc+Pikge1xuICAgIGlmICghdmFsdWU/LmVuZCB8fCAhdmFsdWU/LnN0YXJ0KSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMucmFuZ2VNb250aE9ubHlNb2RlKCkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHN0YXJ0ID0gZGF5anModmFsdWUuc3RhcnQpO1xuICAgIGNvbnN0IGVuZCA9IGRheWpzKHZhbHVlLmVuZCk7XG4gICAgcmV0dXJuIHN0YXJ0LmlzU2FtZShzdGFydC5zdGFydE9mKCdtb250aCcpKSAmJiBlbmQuaXNTYW1lKHN0YXJ0LmVuZE9mKCdtb250aCcpKVxuICAgICAgPyBudWxsXG4gICAgICA6IHsgbW9udGhPbmx5OiB0cnVlIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdFNpbmdsZUlucHV0KCkge1xuICAgIGlmICh0aGlzLmluaXRpYWxWYWx1ZSkge1xuICAgICAgdGhpcy5tYXREYXRlcGlja2VySW5wdXQoKS52YWx1ZSA9IHRoaXMuaW5pdGlhbFZhbHVlO1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ2xvc2VkKCk7XG4gICAgfVxuICB9XG5cbiAgaW5wdXRDaGFuZ2VkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkYXRlU3RyaW5nID0gdmFsdWUuc2xpY2UoMCwgdGhpcy5wbGFjZWhvbGRlci5sZW5ndGgpO1xuXG4gICAgaWYgKGRhdGVTdHJpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmNvbnRyb2w/LnNldFZhbHVlKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkYXRlU3RyaW5nLmxlbmd0aCAhPT0gdGhpcy5wbGFjZWhvbGRlci5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRlID0gdGhpcy5wYXJzZURhdGVTaG9ydEZvcm1hdChkYXRlU3RyaW5nKTtcbiAgICB0aGlzLmNvbnRyb2w/LnNldFZhbHVlKHRoaXMuZm9ybWF0RGF0ZUZyb21WaWV3VG9Nb2RlbChkYXRlKSk7XG4gIH1cblxuICBkYXRlcGlja2VyQ2xvc2VkKCkge1xuICAgIGNvbnN0IG1hdERhdGVwaWNrZXJJbnB1dCA9IHRoaXMubWF0RGF0ZXBpY2tlcklucHV0KCk7XG4gICAgY29uc3QgYWN0dWFsSW5wdXQgPSB0aGlzLmFjdHVhbElucHV0KCk7XG4gICAgaWYgKG1hdERhdGVwaWNrZXJJbnB1dC52YWx1ZSkge1xuICAgICAgdGhpcy5jb250cm9sPy5zZXRWYWx1ZShtYXREYXRlcGlja2VySW5wdXQudmFsdWUpO1xuXG4gICAgICBhY3R1YWxJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5mb3JtYXREYXRlVGltZUZyb21Nb2RlbFRvVmlldyhcbiAgICAgICAgdGhpcy5mb3JtYXREYXRlRnJvbVZpZXdUb01vZGVsKG1hdERhdGVwaWNrZXJJbnB1dC52YWx1ZSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdHVhbElucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgIHRoaXMuY29udHJvbD8uc2V0VmFsdWUobnVsbCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc1ByZXZEYXlCdXR0b25EaXNhYmxlZC5zZXQodGhpcy5pc1ByZXZEYXlCZWZvcmVPckVxdWFsVG9NaW5EYXRlKCkpO1xuICAgIHRoaXMuaXNOZXh0RGF5QnV0dG9uRGlzYWJsZWQuc2V0KHRoaXMuaXNOZXh0RGF5QWZ0ZXJPckVxdWFsVG9NYXhEYXRlKCkpO1xuXG4gICAgYWN0dWFsSW5wdXQubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBJbnB1dEV2ZW50KCdpbnB1dCcpKTtcbiAgfVxuXG4gIG9uTW9udGhTZWxlY3RlZChkYXRlOiBEYXRlKSB7XG4gICAgaWYgKHRoaXMucmFuZ2VNb250aE9ubHlNb2RlKCkgJiYgZGF0ZSkge1xuICAgICAgdGhpcy5tYXREYXRlUmFuZ2VQaWNrZXIoKS5zZWxlY3QoZGF5anMoZGF0ZSkuc3RhcnRPZignbW9udGgnKS50b0RhdGUoKSk7XG4gICAgICB0aGlzLm1hdERhdGVSYW5nZVBpY2tlcigpLnNlbGVjdChkYXlqcyhkYXRlKS5lbmRPZignbW9udGgnKS50b0RhdGUoKSk7XG4gICAgICB0aGlzLm1hdERhdGVSYW5nZVBpY2tlcigpLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRSYW5nZUlucHV0KCkge1xuICAgIGlmICh0aGlzLmluaXRpYWxWYWx1ZSkge1xuICAgICAgdGhpcy5tYXRTdGFydERhdGUoKS52YWx1ZSA9ICh0aGlzLmluaXRpYWxWYWx1ZSBhcyBXYXR0RGF0ZVJhbmdlKS5zdGFydDtcbiAgICAgIHRoaXMubWF0RW5kRGF0ZSgpLnZhbHVlID0gKHRoaXMuaW5pdGlhbFZhbHVlIGFzIFdhdHREYXRlUmFuZ2UpLmVuZDtcbiAgICAgIHRoaXMucmFuZ2VQaWNrZXJDbG9zZWQoKTtcbiAgICB9XG4gIH1cblxuICBjbGVhclJhbmdlUGlja2VyKCkge1xuICAgIHRoaXMuY29udHJvbD8uc2V0VmFsdWUobnVsbCk7XG4gICAgY29uc3QgYWN0dWFsSW5wdXQgPSB0aGlzLmFjdHVhbElucHV0KCk7XG4gICAgYWN0dWFsSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgIGFjdHVhbElucHV0Lm5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgSW5wdXRFdmVudCgnaW5wdXQnKSk7XG4gIH1cblxuICByYW5nZUlucHV0Q2hhbmdlZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3RhcnREYXRlU3RyaW5nID0gdmFsdWUuc2xpY2UoMCwgdGhpcy5wbGFjZWhvbGRlci5sZW5ndGgpO1xuXG4gICAgaWYgKHN0YXJ0RGF0ZVN0cmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY29udHJvbD8uc2V0VmFsdWUobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0RGF0ZVN0cmluZy5sZW5ndGggIT09IHRoaXMucGxhY2Vob2xkZXIubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnBhcnNlRGF0ZVNob3J0Rm9ybWF0KHN0YXJ0RGF0ZVN0cmluZyk7XG4gICAgY29uc3QgZW5kRGF0ZVN0cmluZyA9IHZhbHVlLnNsaWNlKHRoaXMucGxhY2Vob2xkZXIubGVuZ3RoICsgdGhpcy5yYW5nZVNlcGFyYXRvci5sZW5ndGgpO1xuICAgIGxldCBlbmQgPSB0aGlzLnNldEVuZERhdGVUb0RhbmlzaFRpbWVab25lKGVuZERhdGVTdHJpbmcpO1xuXG4gICAgaWYgKGVuZCAhPT0gbnVsbCkge1xuICAgICAgZW5kID0gdGhpcy5zZXRUb0VuZE9mRGF5KGVuZCk7XG4gICAgICB0aGlzLmNvbnRyb2w/LnNldFZhbHVlKHsgc3RhcnQsIGVuZCB9KTtcbiAgICB9XG4gIH1cblxuICByYW5nZVBpY2tlckNsb3NlZCgpIHtcbiAgICBjb25zdCBtYXREYXRlUmFuZ2VJbnB1dCA9IHRoaXMubWF0RGF0ZVJhbmdlSW5wdXQoKTtcbiAgICBjb25zdCBhY3R1YWxJbnB1dCA9IHRoaXMuYWN0dWFsSW5wdXQoKTtcbiAgICBpZiAobWF0RGF0ZVJhbmdlSW5wdXQudmFsdWU/LnN0YXJ0ICYmIG1hdERhdGVSYW5nZUlucHV0LnZhbHVlLmVuZCkge1xuICAgICAgYWN0dWFsSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9XG4gICAgICAgIHRoaXMuZm9ybWF0RGF0ZVRpbWVGcm9tTW9kZWxUb1ZpZXcoXG4gICAgICAgICAgdGhpcy5mb3JtYXREYXRlRnJvbVZpZXdUb01vZGVsKG1hdERhdGVSYW5nZUlucHV0LnZhbHVlPy5zdGFydClcbiAgICAgICAgKSArXG4gICAgICAgICctJyArXG4gICAgICAgIHRoaXMuZm9ybWF0RGF0ZVRpbWVGcm9tTW9kZWxUb1ZpZXcoXG4gICAgICAgICAgdGhpcy5mb3JtYXREYXRlRnJvbVZpZXdUb01vZGVsKG1hdERhdGVSYW5nZUlucHV0LnZhbHVlLmVuZClcbiAgICAgICAgKTtcblxuICAgICAgdGhpcy5jb250cm9sPy5zZXRWYWx1ZSh7XG4gICAgICAgIHN0YXJ0OiB0aGlzLmZvcm1hdERhdGVGcm9tVmlld1RvTW9kZWwobWF0RGF0ZVJhbmdlSW5wdXQudmFsdWUuc3RhcnQpLFxuICAgICAgICBlbmQ6IHRoaXMuZm9ybWF0RGF0ZUZyb21WaWV3VG9Nb2RlbChtYXREYXRlUmFuZ2VJbnB1dC52YWx1ZS5lbmQpLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdHVhbElucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgIHRoaXMuY29udHJvbD8uc2V0VmFsdWUobnVsbCk7XG4gICAgfVxuXG4gICAgYWN0dWFsSW5wdXQubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBJbnB1dEV2ZW50KCdpbnB1dCcpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRTaW5nbGVWYWx1ZShcbiAgICB2YWx1ZTogRXhjbHVkZTxXYXR0UGlja2VyVmFsdWUsIFdhdHREYXRlUmFuZ2U+LFxuICAgIGlucHV0OiBIVE1MSW5wdXRFbGVtZW50XG4gICkge1xuICAgIHRoaXMuc2V0VmFsdWVUb0lucHV0KHZhbHVlLCBpbnB1dCwgdGhpcy5tYXREYXRlcGlja2VySW5wdXQoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0UmFuZ2VWYWx1ZShcbiAgICB2YWx1ZTogV2F0dERhdGVSYW5nZSB8IG51bGwsXG4gICAgc3RhcnRJbnB1dDogSFRNTElucHV0RWxlbWVudCxcbiAgICBlbmRJbnB1dDogSFRNTElucHV0RWxlbWVudFxuICApIHtcbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHZhbHVlID8/IHt9O1xuXG4gICAgdGhpcy5zZXRWYWx1ZVRvSW5wdXQoc3RhcnQsIHN0YXJ0SW5wdXQsIHRoaXMubWF0U3RhcnREYXRlKCkpO1xuICAgIHRoaXMuc2V0VmFsdWVUb0lucHV0KGVuZCwgZW5kSW5wdXQsIHRoaXMubWF0RW5kRGF0ZSgpKTtcbiAgfVxuICBwcmV2RGF5KCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlRGF5KC0xKTtcbiAgfVxuICBuZXh0RGF5KCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlRGF5KDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VEYXkodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gdGhpcy5tYXREYXRlcGlja2VySW5wdXQoKS52YWx1ZTtcblxuICAgIGlmIChjdXJyZW50RGF0ZSkge1xuICAgICAgY29uc3QgbmV3RGF0ZSA9IGRheWpzKGN1cnJlbnREYXRlKS5hZGQodmFsdWUsICdkYXknKS50b0lTT1N0cmluZygpO1xuICAgICAgY29uc3QgbmV3RGF0ZUZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0RGF0ZVRpbWVGcm9tTW9kZWxUb1ZpZXcobmV3RGF0ZSk7XG5cbiAgICAgIHRoaXMuaW5wdXRDaGFuZ2VkKG5ld0RhdGVGb3JtYXR0ZWQpO1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ2xvc2VkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1ByZXZEYXlCZWZvcmVPckVxdWFsVG9NaW5EYXRlKCkge1xuICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgY29uc3Qgc2VsZWN0ZWREYXRlID0gdGhpcy5tYXREYXRlcGlja2VySW5wdXQoKT8udmFsdWU7XG5cbiAgICBpZiAoIW1pbiB8fCAhc2VsZWN0ZWREYXRlKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBpc0JlZm9yZSA9IGRheWpzKHNlbGVjdGVkRGF0ZSkuaXNCZWZvcmUobWluLCAnZGF5Jyk7XG4gICAgY29uc3QgaXNTYW1lID0gZGF5anMoc2VsZWN0ZWREYXRlKS5pc1NhbWUobWluLCAnZGF5Jyk7XG5cbiAgICByZXR1cm4gaXNTYW1lIHx8IGlzQmVmb3JlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc05leHREYXlBZnRlck9yRXF1YWxUb01heERhdGUoKSB7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICBjb25zdCBzZWxlY3RlZERhdGUgPSB0aGlzLm1hdERhdGVwaWNrZXJJbnB1dCgpPy52YWx1ZTtcblxuICAgIGlmICghbWF4IHx8ICFzZWxlY3RlZERhdGUpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGlzQWZ0ZXIgPSBkYXlqcyhzZWxlY3RlZERhdGUpLmlzQWZ0ZXIobWF4LCAnZGF5Jyk7XG4gICAgY29uc3QgaXNTYW1lID0gZGF5anMoc2VsZWN0ZWREYXRlKS5pc1NhbWUobWF4LCAnZGF5Jyk7XG5cbiAgICByZXR1cm4gaXNTYW1lIHx8IGlzQWZ0ZXI7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlRGF0ZVNob3J0Rm9ybWF0KHZhbHVlOiBzdHJpbmcpOiBEYXRlIHtcbiAgICByZXR1cm4gZGF5anModmFsdWUsIGRhdGVTaG9ydEZvcm1hdCkudG9EYXRlKCk7XG4gIH1cblxuICBwcml2YXRlIHNldFZhbHVlVG9JbnB1dDxEIGV4dGVuZHMgeyB2YWx1ZTogRGF0ZSB8IG51bGwgfT4oXG4gICAgdmFsdWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgbmF0aXZlSW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsXG4gICAgbWF0RGF0ZUlucHV0OiBEXG4gICk6IHZvaWQge1xuICAgIG5hdGl2ZUlucHV0LnZhbHVlID0gdmFsdWUgPyB0aGlzLmZvcm1hdERhdGVUaW1lRnJvbU1vZGVsVG9WaWV3KHZhbHVlKSA6ICcnO1xuICAgIG1hdERhdGVJbnB1dC52YWx1ZSA9IHZhbHVlID8gZGF5anModmFsdWUpLnV0YygpLnRvRGF0ZSgpIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqIEZvcm1hdHMgRGF0ZSB0byBmdWxsIElTTyA4NjAxIGZvcm1hdCAoZS5nLiBgMjAyMi0wOC0zMVQyMjowMDowMC4wMDBaYClcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0RGF0ZUZyb21WaWV3VG9Nb2RlbCh2YWx1ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRheWpzKHZhbHVlKS51dGMoKS50b0lTT1N0cmluZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXREYXRlVGltZUZyb21Nb2RlbFRvVmlldyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGF5anModmFsdWUpLnR6KGRhbmlzaFRpbWVab25lSWRlbnRpZmllcikuZm9ybWF0KGRhdGVTaG9ydEZvcm1hdCk7XG4gIH1cblxuICBwcml2YXRlIHRvRGFuaXNoVGltZVpvbmUodmFsdWU6IERhdGUpOiBEYXRlIHtcbiAgICByZXR1cm4gZGF5anModmFsdWUudG9JU09TdHJpbmcoKSkudHooZGFuaXNoVGltZVpvbmVJZGVudGlmaWVyKS50b0RhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VG9FbmRPZkRheSh2YWx1ZTogRGF0ZSk6IERhdGUge1xuICAgIHJldHVybiBkYXlqcyh2YWx1ZSkuZW5kT2YoJ2RheScpLnRvRGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRFbmREYXRlVG9EYW5pc2hUaW1lWm9uZSh2YWx1ZTogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIGNvbnN0IGRhdGVCYXNlZE9uU2hvcnRGb3JtYXQgPSB0aGlzLnBhcnNlRGF0ZVNob3J0Rm9ybWF0KHZhbHVlKTtcblxuICAgIGxldCBtYXliZURhdGVJbkRhbmlzaFRpbWVab25lOiBEYXRlIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpZiAoZGF5anMoZGF0ZUJhc2VkT25TaG9ydEZvcm1hdCkuaXNWYWxpZCgpKSB7XG4gICAgICBtYXliZURhdGVJbkRhbmlzaFRpbWVab25lID0gdGhpcy50b0RhbmlzaFRpbWVab25lKGRhdGVCYXNlZE9uU2hvcnRGb3JtYXQpO1xuICAgIH1cblxuICAgIHJldHVybiBtYXliZURhdGVJbkRhbmlzaFRpbWVab25lO1xuICB9XG59XG4iLCI8IS0tXG5AbGljZW5zZVxuQ29weXJpZ2h0IDIwMjAgRW5lcmdpbmV0IERhdGFIdWIgQS9TXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2UyXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbi0tPlxuPHdhdHQtZmllbGQgW2NvbnRyb2xdPVwiY29udHJvbFwiIFtsYWJlbF09XCJsYWJlbCgpXCI+XG4gIEBpZiAocmFuZ2UpIHtcbiAgICA8bWF0LWRhdGUtcmFuZ2UtaW5wdXRcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbcmFuZ2VQaWNrZXJdPVwicmFuZ2VEYXRlcGlja2VyXCJcbiAgICAgIFttaW5dPVwibWluKCkgPz8gbnVsbFwiXG4gICAgICBbbWF4XT1cIm1heCgpID8/IG51bGxcIlxuICAgICAgKGZvY3VzaW4pPVwib25Gb2N1c0luKClcIlxuICAgICAgKGZvY3Vzb3V0KT1cIm9uRm9jdXNPdXQoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGlucHV0XG4gICAgICAgIGluZXJ0XG4gICAgICAgIGFyaWEtbGFiZWw9XCJzdGFydC1kYXRlLWlucHV0XCJcbiAgICAgICAgbWF0U3RhcnREYXRlXG4gICAgICAgICNzdGFydERhdGVJbnB1dFxuICAgICAgICBbcmVhZE9ubHldPVwicmFuZ2VNb250aE9ubHlNb2RlKClcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICBbaGlkZGVuXT1cInRydWVcIlxuICAgICAgLz5cblxuICAgICAgPGlucHV0XG4gICAgICAgIGluZXJ0XG4gICAgICAgIGFyaWEtbGFiZWw9XCJlbmQtZGF0ZS1pbnB1dFwiXG4gICAgICAgIG1hdEVuZERhdGVcbiAgICAgICAgI2VuZERhdGVJbnB1dFxuICAgICAgICBbcmVhZE9ubHldPVwicmFuZ2VNb250aE9ubHlNb2RlKClcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICBbaGlkZGVuXT1cInRydWVcIlxuICAgICAgLz5cbiAgICA8L21hdC1kYXRlLXJhbmdlLWlucHV0PlxuICAgIDxpbnB1dCAjYWN0dWFsSW5wdXQgY2xhc3M9XCJtYXNrLWlucHV0XCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgLz5cbiAgICA8d2F0dC1wbGFjZWhvbGRlci1tYXNrXG4gICAgICBbcHJpbWFyeUlucHV0RWxlbWVudF09XCJhY3R1YWxJbnB1dFwiXG4gICAgICBbbWFza109XCJyYW5nZUlucHV0TWFzaygpXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJyYW5nZVBsYWNlaG9sZGVyXCJcbiAgICAgIChtYXNrQXBwbGllZCk9XCJyYW5nZUlucHV0Q2hhbmdlZCgkZXZlbnQpXCJcbiAgICAvPlxuXG4gICAgPHdhdHQtYnV0dG9uXG4gICAgICB2YXJpYW50PVwiaWNvblwiXG4gICAgICBpY29uPVwiZGF0ZVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImZhbHNlXCJcbiAgICAgIChjbGljayk9XCJyYW5nZURhdGVwaWNrZXIub3BlbigpXCJcbiAgICAgIChmb2N1c2luKT1cIm9uRm9jdXNJbigpXCJcbiAgICAgIChmb2N1c291dCk9XCJvbkZvY3VzT3V0KCRldmVudClcIlxuICAgIC8+XG5cbiAgICA8bWF0LWRhdGUtcmFuZ2UtcGlja2VyXG4gICAgICBbcGFuZWxDbGFzc109XCJyYW5nZU1vbnRoT25seU1vZGUoKSA/ICd3YXR0LWRhdGVwaWNrZXItcmFuZ2VfX3BhbmVsLS1tb250aC1vbmx5JyA6ICcnXCJcbiAgICAgIFtzdGFydFZpZXddPVwicmFuZ2VNb250aE9ubHlNb2RlKCkgPyAnbXVsdGkteWVhcicgOiAnbW9udGgnXCJcbiAgICAgIFtzdGFydEF0XT1cInN0YXJ0QXQoKVwiXG4gICAgICAobW9udGhTZWxlY3RlZCk9XCJvbk1vbnRoU2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAoY2xvc2VkKT1cInJhbmdlUGlja2VyQ2xvc2VkKClcIlxuICAgICAgI3JhbmdlRGF0ZXBpY2tlclxuICAgIC8+XG4gIH0gQGVsc2Uge1xuICAgIDxpbnB1dFxuICAgICAgaW5lcnRcbiAgICAgIG1hdElucHV0XG4gICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJkYXRlLWlucHV0XCJcbiAgICAgICNkYXRlSW5wdXRcbiAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFttaW5dPVwibWluKClcIlxuICAgICAgW21heF09XCJtYXgoKVwiXG4gICAgICBbbWF0RGF0ZXBpY2tlcl09XCJzaW5nbGVEYXRlcGlja2VyXCJcbiAgICAgIChmb2N1c2luKT1cIm9uRm9jdXNJbigpXCJcbiAgICAgIChmb2N1c291dCk9XCJvbkZvY3VzT3V0KCRldmVudClcIlxuICAgIC8+XG4gICAgPGlucHV0ICNhY3R1YWxJbnB1dCBjbGFzcz1cIm1hc2staW5wdXRcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAvPlxuICAgIDx3YXR0LXBsYWNlaG9sZGVyLW1hc2tcbiAgICAgIFtwcmltYXJ5SW5wdXRFbGVtZW50XT1cImFjdHVhbElucHV0XCJcbiAgICAgIFttYXNrXT1cImlucHV0TWFzaygpXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAobWFza0FwcGxpZWQpPVwiaW5wdXRDaGFuZ2VkKCRldmVudClcIlxuICAgIC8+XG5cbiAgICA8d2F0dC1idXR0b25cbiAgICAgIHdhdHRTdWZmaXhcbiAgICAgIHZhcmlhbnQ9XCJpY29uXCJcbiAgICAgIGljb249XCJkYXRlXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAoY2xpY2spPVwic2luZ2xlRGF0ZXBpY2tlci5vcGVuKClcIlxuICAgICAgKGZvY3VzaW4pPVwib25Gb2N1c0luKClcIlxuICAgICAgKGZvY3Vzb3V0KT1cIm9uRm9jdXNPdXQoJGV2ZW50KVwiXG4gICAgLz5cblxuICAgIDxtYXQtZGF0ZXBpY2tlclxuICAgICAgI3NpbmdsZURhdGVwaWNrZXJcbiAgICAgIHBhbmVsQ2xhc3M9XCJ3YXR0LWRhdGVwaWNrZXItc2luZ2xlX19wYW5lbFwiXG4gICAgICBbZGF0ZUNsYXNzXT1cImRhdGVDbGFzcygpXCJcbiAgICAgIFtzdGFydEF0XT1cInN0YXJ0QXQoKVwiXG4gICAgICAoY2xvc2VkKT1cImRhdGVwaWNrZXJDbG9zZWQoKVwiXG4gICAgLz5cbiAgfVxuXG4gIDxuZy1jb250ZW50IC8+XG4gIDxuZy1jb250ZW50IG5nUHJvamVjdEFzPVwid2F0dC1maWVsZC1oaW50XCIgc2VsZWN0PVwid2F0dC1maWVsZC1oaW50XCIgLz5cbiAgPG5nLWNvbnRlbnQgbmdQcm9qZWN0QXM9XCJ3YXR0LWZpZWxkLWVycm9yXCIgc2VsZWN0PVwid2F0dC1maWVsZC1lcnJvclwiIC8+XG48L3dhdHQtZmllbGQ+XG5cbkBpZiAoIXJhbmdlICYmIGNhblN0ZXBUaHJvdWdoRGF5cygpKSB7XG4gIDxzcGFuXG4gICAgY2xhc3M9XCJ3YXR0LWRhdGVwaWNrZXItc2luZ2xlX19zdGVwLXRocm91Z2hcIlxuICAgIFtjbGFzcy53YXR0LWRhdGVwaWNrZXItc2luZ2xlX19oYXMtbGFiZWxdPVwiISFsYWJlbCgpXCJcbiAgPlxuICAgIDx3YXR0LWJ1dHRvblxuICAgICAgdmFyaWFudD1cImljb25cIlxuICAgICAgaWNvbj1cImxlZnRcIlxuICAgICAgKGNsaWNrKT1cInByZXZEYXkoKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgaXNQcmV2RGF5QnV0dG9uRGlzYWJsZWQoKVwiXG4gICAgLz5cbiAgICA8d2F0dC1idXR0b25cbiAgICAgIHZhcmlhbnQ9XCJpY29uXCJcbiAgICAgIGljb249XCJyaWdodFwiXG4gICAgICAoY2xpY2spPVwibmV4dERheSgpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBpc05leHREYXlCdXR0b25EaXNhYmxlZCgpXCJcbiAgICAvPlxuICA8L3NwYW4+XG59XG4iXX0=
|