@wkly/datetime-picker 12.1.0 → 13.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/cdk-overlay/package.json +5 -6
  2. package/cdk-overlay/public-api.d.ts +10 -0
  3. package/cdk-overlay/wkly-datetime-picker-cdk-overlay.d.ts +1 -0
  4. package/config.d.ts +3 -0
  5. package/esm2020/cdk-overlay/public-api.mjs +137 -0
  6. package/{esm2015/cdk-overlay/wkly-datetime-picker-cdk-overlay.js → esm2020/cdk-overlay/wkly-datetime-picker-cdk-overlay.mjs} +1 -1
  7. package/esm2020/config.mjs +100 -0
  8. package/esm2020/field.component.mjs +253 -0
  9. package/esm2020/picker.component.mjs +960 -0
  10. package/esm2020/presentation.mjs +303 -0
  11. package/esm2020/public-api.mjs +31 -0
  12. package/{esm2015/wkly-datetime-picker.js → esm2020/wkly-datetime-picker.mjs} +1 -1
  13. package/fesm2015/wkly-datetime-picker-cdk-overlay.mjs +143 -0
  14. package/fesm2015/wkly-datetime-picker-cdk-overlay.mjs.map +1 -0
  15. package/fesm2015/wkly-datetime-picker.mjs +1629 -0
  16. package/fesm2015/wkly-datetime-picker.mjs.map +1 -0
  17. package/fesm2020/wkly-datetime-picker-cdk-overlay.mjs +143 -0
  18. package/fesm2020/wkly-datetime-picker-cdk-overlay.mjs.map +1 -0
  19. package/fesm2020/wkly-datetime-picker.mjs +1627 -0
  20. package/fesm2020/wkly-datetime-picker.mjs.map +1 -0
  21. package/field.component.d.ts +3 -0
  22. package/package.json +34 -14
  23. package/picker.component.d.ts +3 -0
  24. package/presentation.d.ts +7 -0
  25. package/public-api.d.ts +8 -0
  26. package/wkly-datetime-picker.d.ts +1 -1
  27. package/bundles/wkly-datetime-picker-cdk-overlay.umd.js +0 -675
  28. package/bundles/wkly-datetime-picker-cdk-overlay.umd.js.map +0 -1
  29. package/bundles/wkly-datetime-picker.umd.js +0 -2378
  30. package/bundles/wkly-datetime-picker.umd.js.map +0 -1
  31. package/cdk-overlay/public-api.ngfactory.d.ts +0 -3
  32. package/cdk-overlay/wkly-datetime-picker-cdk-overlay.metadata.json +0 -1
  33. package/esm2015/cdk-overlay/public-api.js +0 -127
  34. package/esm2015/cdk-overlay/public-api.ngfactory.js +0 -19
  35. package/esm2015/cdk-overlay/public-api.ngsummary.json +0 -1
  36. package/esm2015/cdk-overlay/wkly-datetime-picker-cdk-overlay.ngsummary.json +0 -1
  37. package/esm2015/config.js +0 -241
  38. package/esm2015/config.ngsummary.json +0 -1
  39. package/esm2015/field.component.css.shim.ngstyle.js +0 -9
  40. package/esm2015/field.component.js +0 -240
  41. package/esm2015/field.component.ngfactory.js +0 -52
  42. package/esm2015/field.component.ngsummary.json +0 -1
  43. package/esm2015/picker.component.js +0 -934
  44. package/esm2015/picker.component.ngfactory.js +0 -137
  45. package/esm2015/picker.component.ngsummary.json +0 -1
  46. package/esm2015/presentation.js +0 -295
  47. package/esm2015/presentation.ngsummary.json +0 -1
  48. package/esm2015/public-api.js +0 -24
  49. package/esm2015/public-api.ngfactory.js +0 -13
  50. package/esm2015/public-api.ngsummary.json +0 -1
  51. package/esm2015/wkly-datetime-picker.ngsummary.json +0 -1
  52. package/fesm2015/wkly-datetime-picker-cdk-overlay.js +0 -134
  53. package/fesm2015/wkly-datetime-picker-cdk-overlay.js.map +0 -1
  54. package/fesm2015/wkly-datetime-picker.js +0 -1720
  55. package/fesm2015/wkly-datetime-picker.js.map +0 -1
  56. package/field.component.css.shim.ngstyle.d.ts +0 -1
  57. package/field.component.ngfactory.d.ts +0 -1
  58. package/picker.component.ngfactory.d.ts +0 -1
  59. package/public-api.ngfactory.d.ts +0 -3
  60. package/wkly-datetime-picker.metadata.json +0 -1
@@ -0,0 +1,960 @@
1
+ import { ChangeDetectorRef, Component, ElementRef, forwardRef, Inject, LOCALE_ID, PLATFORM_ID, ViewChild, } from "@angular/core";
2
+ import { getLocaleFirstDayOfWeek, isPlatformBrowser } from "@angular/common";
3
+ import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from "@angular/forms";
4
+ import { absoluteWeekOf, createWeekGenerator, firstEpochDayOf, integer, } from "@wkly/core";
5
+ import { decodeIso, error, resolveWeekOffset, validateSelection, WklyGregorianCalendarAdapter, } from "@wkly/adapters";
6
+ import { draftDayDifference, setDraftDayDifference, calendarMonthBounds, resolveWklyTranslation, createWeekRows, validateDrafts, } from "@wkly/presentation";
7
+ import { coerceBoolean, WKLY_CLOCK, WKLY_CONFIG, WKLY_LOCALIZATION, WKLY_TRANSLATIONS, WklyPickerInputs, WklyPickerInputsPropertyKeys, WklyPickerOutputsPropertyKeys, } from "./config";
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "./field.component";
10
+ import * as i2 from "@angular/common";
11
+ export class WklyDateTimePickerComponent extends WklyPickerInputs {
12
+ constructor(defaultLocale, defaults, clock, strings, defaultTranslations, platform, host, changeDetector) {
13
+ super();
14
+ this.defaultLocale = defaultLocale;
15
+ this.defaults = defaults;
16
+ this.clock = clock;
17
+ this.strings = strings;
18
+ this.defaultTranslations = defaultTranslations;
19
+ this.host = host;
20
+ this.changeDetector = changeDetector;
21
+ this.presentation = "inline";
22
+ this.viewMode = "calendar";
23
+ this.endView = "date";
24
+ this.effectiveLocale = "en-US";
25
+ this.effectiveOffset = 0;
26
+ this.effectiveHourCycle = "h24";
27
+ this.direction = "ltr";
28
+ this.rows = [];
29
+ this.weekdays = [];
30
+ this.drafts = [];
31
+ this.errors = [];
32
+ this.today = 0;
33
+ this.focused = 0;
34
+ this.anchorWeek = 0;
35
+ this.firstWeek = 0;
36
+ this.visibleCount = 6;
37
+ this.rowHeight = 76;
38
+ this.scrollHeight = 152076;
39
+ this.paddingTop = 0;
40
+ this.initialized = false;
41
+ this.compact = false;
42
+ this.WklyPickerInputsPropertyKeys = WklyPickerInputsPropertyKeys;
43
+ this.baseWeek = 0;
44
+ this.firstSupportedDay = 0;
45
+ this.lastSupportedDay = 0;
46
+ this.firstSupportedWeek = 0;
47
+ this.lastSupportedWeek = 0;
48
+ this.initialMonth = "";
49
+ this.clipMonth = false;
50
+ this.browser = false;
51
+ this.destroyed = false;
52
+ this.snapPending = false;
53
+ this.onChange = () => { };
54
+ this.onTouched = () => { };
55
+ this.validatorChanged = () => { };
56
+ this.configErrors = [];
57
+ this.pendingValue = null;
58
+ this.emittedValue = null;
59
+ this.manualDateEndpoint = 0;
60
+ this.browser = isPlatformBrowser(platform);
61
+ }
62
+ ngOnInit() {
63
+ this.initialize();
64
+ }
65
+ ngOnChanges(changes) {
66
+ if (this.initialized) {
67
+ if (Object.keys(changes).length === 1 &&
68
+ changes[WklyPickerInputsPropertyKeys.Value] &&
69
+ this.emittedValue ===
70
+ JSON.stringify(this[WklyPickerInputsPropertyKeys.Value])) {
71
+ this.emittedValue = null;
72
+ return;
73
+ }
74
+ const focus = this.focused;
75
+ this.configure();
76
+ if (changes[WklyPickerInputsPropertyKeys.Value] ||
77
+ changes[WklyPickerInputsPropertyKeys.Mode] ||
78
+ changes[WklyPickerInputsPropertyKeys.CalendarAdapter]) {
79
+ this.load(this[WklyPickerInputsPropertyKeys.Value]);
80
+ this.position(this.focused, true);
81
+ }
82
+ else {
83
+ this.check();
84
+ if (changes[WklyPickerInputsPropertyKeys.ViewportPreset])
85
+ this.position(focus, true);
86
+ else
87
+ this.scrollToEpochDay(focus);
88
+ }
89
+ }
90
+ }
91
+ initialize() {
92
+ if (this.initialized)
93
+ return;
94
+ this.configure();
95
+ const initialEpochDay = this[WklyPickerInputsPropertyKeys.InitialEpochDay];
96
+ this.today = this.browser
97
+ ? Math.floor(this.clock.now().getTime() / 86400000)
98
+ : initialEpochDay === null
99
+ ? 0
100
+ : initialEpochDay;
101
+ this.focused =
102
+ initialEpochDay === null
103
+ ? this.defaults.initialEpochDay === undefined
104
+ ? this.today
105
+ : this.defaults.initialEpochDay
106
+ : initialEpochDay;
107
+ this.load(this[WklyPickerInputsPropertyKeys.Value]);
108
+ this.initialized = true;
109
+ this.position(this.focused, true);
110
+ }
111
+ configure() {
112
+ this.configErrors = [];
113
+ [
114
+ WklyPickerInputsPropertyKeys.ShowSeconds,
115
+ WklyPickerInputsPropertyKeys.AllowRangeAcrossDisabled,
116
+ WklyPickerInputsPropertyKeys.Required,
117
+ WklyPickerInputsPropertyKeys.Disabled,
118
+ WklyPickerInputsPropertyKeys.CloseOnBackdrop,
119
+ ].forEach((key) => (this[key] = coerceBoolean(this[key])));
120
+ this.effectiveLocale =
121
+ this[WklyPickerInputsPropertyKeys.Locale] ||
122
+ this.defaults.locale ||
123
+ this.defaultLocale;
124
+ this.direction = /^(ar|he|fa|ur)(-|$)/.test(this.effectiveLocale)
125
+ ? "rtl"
126
+ : "ltr";
127
+ this.adapter =
128
+ this[WklyPickerInputsPropertyKeys.CalendarAdapter] ||
129
+ new WklyGregorianCalendarAdapter(this.effectiveLocale);
130
+ try {
131
+ let firstDay;
132
+ try {
133
+ firstDay = getLocaleFirstDayOfWeek(this.effectiveLocale);
134
+ }
135
+ catch (_) { }
136
+ this.effectiveOffset = resolveWeekOffset(this.effectiveLocale, this[WklyPickerInputsPropertyKeys.WeekOffset], this.defaults.weekOffset, firstDay);
137
+ integer(this[WklyPickerInputsPropertyKeys.WeekCacheSize]);
138
+ integer(this[WklyPickerInputsPropertyKeys.OverscanWeeks]);
139
+ if (this[WklyPickerInputsPropertyKeys.WeekCacheSize] < 0 ||
140
+ this[WklyPickerInputsPropertyKeys.OverscanWeeks] < 0 ||
141
+ this[WklyPickerInputsPropertyKeys.OverscanWeeks] > 50)
142
+ throw new RangeError();
143
+ if (![
144
+ "datetime",
145
+ "date",
146
+ "time",
147
+ "datetime-range",
148
+ "date-range",
149
+ "time-range",
150
+ ].includes(this[WklyPickerInputsPropertyKeys.Mode]))
151
+ throw new RangeError();
152
+ const preset = this[WklyPickerInputsPropertyKeys.ViewportPreset];
153
+ if (preset.kind === "weeks") {
154
+ integer(preset.visibleWeekCount);
155
+ if (preset.visibleWeekCount < 1 || preset.visibleWeekCount > 52)
156
+ throw new RangeError();
157
+ }
158
+ if (preset.kind === "full-month-and-around")
159
+ for (const n of [
160
+ preset.extraWeeksBefore || 0,
161
+ preset.extraWeeksAfter || 0,
162
+ ]) {
163
+ integer(n);
164
+ if (n < 0 || n > 52)
165
+ throw new RangeError();
166
+ }
167
+ this.generator = createWeekGenerator({
168
+ weekOffset: this.effectiveOffset,
169
+ cacheSize: this[WklyPickerInputsPropertyKeys.WeekCacheSize],
170
+ });
171
+ }
172
+ catch (_) {
173
+ this.configErrors.push(error("configuration-error", this[WklyPickerInputsPropertyKeys.WeekOffset]));
174
+ this.generator = createWeekGenerator();
175
+ this.effectiveOffset = 0;
176
+ }
177
+ this.setSupportedScrollRange();
178
+ const hourCycle = this[WklyPickerInputsPropertyKeys.HourCycle];
179
+ // Host value/configuration feedback must retain the user's switchable format.
180
+ if (hourCycle !== "switchable" || this.configuredHourCycle !== hourCycle) {
181
+ this.effectiveHourCycle =
182
+ hourCycle === "h12"
183
+ ? "h12"
184
+ : hourCycle === "locale"
185
+ ? new Intl.DateTimeFormat(this.effectiveLocale, {
186
+ hour: "numeric",
187
+ timeZone: "UTC",
188
+ }).resolvedOptions().hour12
189
+ ? "h12"
190
+ : "h24"
191
+ : "h24";
192
+ }
193
+ this.configuredHourCycle = hourCycle;
194
+ this.weekdays = Array.from({ length: 7 }, (_, i) => this.adapter.formatWeekday(this.effectiveOffset + i, "short"));
195
+ }
196
+ setSupportedScrollRange() {
197
+ let [first, last] = this.adapter.supportedEpochDayRange;
198
+ const [firstYear, lastYear] = this.adapter.supportedYearRange;
199
+ const yearOf = (day) => this.adapter.epochDayToDate(day).year;
200
+ if (yearOf(first) < firstYear) {
201
+ let low = first, high = last;
202
+ while (low < high) {
203
+ const mid = Math.floor((low + high) / 2);
204
+ if (yearOf(mid) < firstYear)
205
+ low = mid + 1;
206
+ else
207
+ high = mid;
208
+ }
209
+ first = low;
210
+ }
211
+ if (yearOf(last) > lastYear) {
212
+ let low = first, high = last;
213
+ while (low < high) {
214
+ const mid = Math.ceil((low + high) / 2);
215
+ if (yearOf(mid) > lastYear)
216
+ high = mid - 1;
217
+ else
218
+ low = mid;
219
+ }
220
+ last = low;
221
+ }
222
+ if (first > last ||
223
+ yearOf(first) < firstYear ||
224
+ yearOf(first) > lastYear ||
225
+ yearOf(last) < firstYear ||
226
+ yearOf(last) > lastYear)
227
+ throw new RangeError("No supported days within the calendar year range");
228
+ this.firstSupportedDay = first;
229
+ this.lastSupportedDay = last;
230
+ this.firstSupportedWeek = absoluteWeekOf(first, this.effectiveOffset);
231
+ this.lastSupportedWeek = absoluteWeekOf(last, this.effectiveOffset);
232
+ }
233
+ clampFirstWeek(week) {
234
+ // Keep supported weeks inside the viewport; renderRows adds the buffer rows.
235
+ const last = Math.max(this.firstSupportedWeek, this.lastSupportedWeek - this.visibleCount + 1);
236
+ return Math.max(this.firstSupportedWeek, Math.min(last, week));
237
+ }
238
+ ngAfterViewInit() {
239
+ this.resetScroll();
240
+ if (this.browser && typeof ResizeObserver !== "undefined") {
241
+ this.observer = new ResizeObserver(() => {
242
+ this.compact = this.host.nativeElement.clientWidth < 338;
243
+ const row = this.host.nativeElement.querySelector(".week-row");
244
+ // CSS heights and scrollTop use layout pixels; client rectangles include zoom.
245
+ const height = row ? parseFloat(getComputedStyle(row).height) : 0;
246
+ if (height && height !== this.rowHeight) {
247
+ this.rowHeight = height;
248
+ this.scrollHeight = this.rowHeight * 2001;
249
+ this.renderRows();
250
+ this.resetScroll();
251
+ }
252
+ });
253
+ this.observer.observe(this.host.nativeElement);
254
+ }
255
+ }
256
+ ngOnDestroy() {
257
+ this.destroyed = true;
258
+ if (this.observer)
259
+ this.observer.disconnect();
260
+ if (this.scrollEndTimer)
261
+ clearTimeout(this.scrollEndTimer);
262
+ if (this.generator)
263
+ this.generator.clearCache();
264
+ }
265
+ t(key) {
266
+ return resolveWklyTranslation(key, this.effectiveLocale, this[WklyPickerInputsPropertyKeys.Translations] ||
267
+ this.defaultTranslations, this.strings);
268
+ }
269
+ get isRange() {
270
+ return this[WklyPickerInputsPropertyKeys.Mode].endsWith("-range");
271
+ }
272
+ get hasDate() {
273
+ return !this[WklyPickerInputsPropertyKeys.Mode].startsWith("time");
274
+ }
275
+ get hasTime() {
276
+ return (this[WklyPickerInputsPropertyKeys.Mode] !== "date" &&
277
+ this[WklyPickerInputsPropertyKeys.Mode] !== "date-range");
278
+ }
279
+ get submitVisible() {
280
+ return (this.presentation === "transient" &&
281
+ (this[WklyPickerInputsPropertyKeys.Mode] !== "date" ||
282
+ this.viewMode === "manual"));
283
+ }
284
+ get title() {
285
+ try {
286
+ const d = this.adapter.epochDayToDate(Math.max(this.firstSupportedDay, Math.min(this.lastSupportedDay, firstEpochDayOf(this.anchorWeek, this.effectiveOffset))));
287
+ return this.adapter.formatMonth(d) + " " + this.adapter.formatYear(d);
288
+ }
289
+ catch (_) {
290
+ return "";
291
+ }
292
+ }
293
+ get canSubmit() {
294
+ return (!this[WklyPickerInputsPropertyKeys.Disabled] &&
295
+ !this.errors.length &&
296
+ this.pendingValue !== null);
297
+ }
298
+ blank(day) {
299
+ const safe = Math.max(this.firstSupportedDay, Math.min(this.lastSupportedDay, day));
300
+ return {
301
+ date: this.adapter.epochDayToDate(safe),
302
+ hour: 0,
303
+ minute: 0,
304
+ second: 0,
305
+ present: false,
306
+ };
307
+ }
308
+ load(value) {
309
+ this.drafts = [this.blank(this.focused), this.blank(this.focused)];
310
+ const validation = validateSelection(value, this, this.adapter);
311
+ if (value !== null && !validation.length) {
312
+ const values = typeof value === "string" ? [value] : value;
313
+ values.forEach((v, i) => {
314
+ const d = decodeIso(v);
315
+ this.drafts[i] = {
316
+ date: this.hasDate
317
+ ? this.adapter.epochDayToDate(d.epochDay)
318
+ : this.blank(this.today).date,
319
+ hour: d.hour,
320
+ minute: d.minute,
321
+ second: d.second,
322
+ present: true,
323
+ };
324
+ if (i === 0 && this.hasDate)
325
+ this.focused = d.epochDay;
326
+ });
327
+ }
328
+ if (validation.length) {
329
+ this.pendingValue = null;
330
+ this.report(validation);
331
+ }
332
+ else
333
+ this.check();
334
+ }
335
+ writeValue(value) {
336
+ this[WklyPickerInputsPropertyKeys.Value] = value;
337
+ if (this.initialized) {
338
+ this.load(value);
339
+ this.position(this.focused, true);
340
+ }
341
+ }
342
+ registerOnChange(fn) {
343
+ this.onChange = fn;
344
+ }
345
+ registerOnTouched(fn) {
346
+ this.onTouched = fn;
347
+ }
348
+ setDisabledState(disabled) {
349
+ this[WklyPickerInputsPropertyKeys.Disabled] = disabled;
350
+ }
351
+ validate(_control) {
352
+ return this.errors.length ? { wkly: this.errors } : null;
353
+ }
354
+ registerOnValidatorChange(fn) {
355
+ this.validatorChanged = fn;
356
+ }
357
+ touched() {
358
+ Promise.resolve().then(() => this.onTouched());
359
+ }
360
+ report(errors) {
361
+ const changed = JSON.stringify(this.errors) !== JSON.stringify(errors);
362
+ this.errors = errors;
363
+ if (changed) {
364
+ this[WklyPickerOutputsPropertyKeys.ValidationChange].emit(errors);
365
+ this.validatorChanged();
366
+ }
367
+ }
368
+ check() {
369
+ const result = validateDrafts({
370
+ drafts: this.drafts,
371
+ configErrors: this.configErrors,
372
+ adapter: this.adapter,
373
+ selection: this,
374
+ mode: this[WklyPickerInputsPropertyKeys.Mode],
375
+ isRange: this.isRange,
376
+ hasDate: this.hasDate,
377
+ hasTime: this.hasTime,
378
+ showSeconds: this[WklyPickerInputsPropertyKeys.ShowSeconds],
379
+ required: this[WklyPickerInputsPropertyKeys.Required],
380
+ });
381
+ this.pendingValue = result.pendingValue;
382
+ this.report(result.errors);
383
+ }
384
+ trackDraft(index) {
385
+ // Endpoint controls keep their identity and focus when draft objects swap.
386
+ return index;
387
+ }
388
+ orderDrafts() {
389
+ if (!this.isRange || !this.drafts.every((draft) => draft.present))
390
+ return;
391
+ if (this.drafts.some((draft) => draft.unsupportedEpochDay !== undefined))
392
+ return;
393
+ try {
394
+ const a = this.drafts[0], b = this.drafts[1];
395
+ const key = (d) => this.adapter.dateToEpochDay(d.date) * 86400 +
396
+ (d.hour || 0) * 3600 +
397
+ (d.minute || 0) * 60 +
398
+ (d.second || 0);
399
+ if (key(a) > key(b))
400
+ this.drafts = [b, a];
401
+ }
402
+ catch (_) {
403
+ // Impossible or incomplete dates remain editable until corrected.
404
+ }
405
+ }
406
+ finish() {
407
+ if (this[WklyPickerInputsPropertyKeys.Disabled])
408
+ return;
409
+ this.orderDrafts();
410
+ if (this.viewMode === "manual" && this.hasDate)
411
+ this.positionOnManualDate();
412
+ this.check();
413
+ if (this.presentation === "inline" && this.canSubmit)
414
+ this.commit();
415
+ }
416
+ commit() {
417
+ if (!this.canSubmit)
418
+ return;
419
+ const next = this.pendingValue;
420
+ if (JSON.stringify(next) !==
421
+ JSON.stringify(this[WklyPickerInputsPropertyKeys.Value])) {
422
+ this[WklyPickerInputsPropertyKeys.Value] = next;
423
+ this.emittedValue = JSON.stringify(next);
424
+ this.onChange(next);
425
+ this[WklyPickerOutputsPropertyKeys.ValueChange].emit(next);
426
+ }
427
+ this.onTouched();
428
+ }
429
+ submit(reason = "submit") {
430
+ this.check();
431
+ if (!this.canSubmit)
432
+ return;
433
+ this.commit();
434
+ if (this.presentation === "transient")
435
+ this[WklyPickerOutputsPropertyKeys.Closed].emit(reason);
436
+ }
437
+ cancel(reason = "close-button") {
438
+ if (this[WklyPickerInputsPropertyKeys.Disabled])
439
+ return;
440
+ this.load(this[WklyPickerInputsPropertyKeys.Value]);
441
+ this.onTouched();
442
+ this[WklyPickerOutputsPropertyKeys.Closed].emit(reason);
443
+ }
444
+ now() {
445
+ if (this[WklyPickerInputsPropertyKeys.Disabled])
446
+ return;
447
+ const n = this.clock.now();
448
+ const day = Math.floor(n.getTime() / 86400000);
449
+ this.drafts = [0, 1].map((index) => ({
450
+ ...this.clockDraft(day, n),
451
+ present: index === 0 || this.isRange,
452
+ }));
453
+ if (this.hasDate &&
454
+ (day < this.firstSupportedDay || day > this.lastSupportedDay)) {
455
+ this.report([error("unsupported-adapter-date", day)]);
456
+ return;
457
+ }
458
+ this.focused = day;
459
+ this.position(day, true);
460
+ this.check();
461
+ this.submit("now");
462
+ }
463
+ clockDraft(day, now) {
464
+ return {
465
+ ...this.blank(day),
466
+ hour: now.getUTCHours(),
467
+ minute: Math.floor(now.getUTCMinutes() / this[WklyPickerInputsPropertyKeys.MinuteStep]) * this[WklyPickerInputsPropertyKeys.MinuteStep],
468
+ second: this[WklyPickerInputsPropertyKeys.ShowSeconds]
469
+ ? Math.floor(now.getUTCSeconds() / this[WklyPickerInputsPropertyKeys.SecondStep]) * this[WklyPickerInputsPropertyKeys.SecondStep]
470
+ : 0,
471
+ };
472
+ }
473
+ initializeManualRange() {
474
+ if (!this.isRange ||
475
+ !this.hasDate ||
476
+ this.drafts.every((draft) => draft.present))
477
+ return;
478
+ let seed = this.drafts.find((draft) => draft.present);
479
+ if (!seed) {
480
+ if (this[WklyPickerInputsPropertyKeys.Value] !== null)
481
+ return;
482
+ const now = this.clock.now();
483
+ const initialEpochDay = this[WklyPickerInputsPropertyKeys.InitialEpochDay];
484
+ const day = initialEpochDay === null
485
+ ? this.defaults.initialEpochDay === undefined
486
+ ? Math.floor(now.getTime() / 86400000)
487
+ : this.defaults.initialEpochDay
488
+ : initialEpochDay;
489
+ seed = { ...this.clockDraft(day, now), present: true };
490
+ }
491
+ // Complete missing endpoints without replacing selected or invalid drafts.
492
+ const initial = seed;
493
+ this.drafts = this.drafts.map((draft) => draft.present ? draft : { ...initial, date: { ...initial.date } });
494
+ this.finish();
495
+ // Positioning renders before validation; refresh completion controls afterward.
496
+ this.changeDetector.markForCheck();
497
+ }
498
+ toggleView() {
499
+ if (this[WklyPickerInputsPropertyKeys.Disabled] || !this.hasDate)
500
+ return;
501
+ this.viewMode = this.viewMode === "calendar" ? "manual" : "calendar";
502
+ if (this.viewMode === "manual")
503
+ this.initializeManualRange();
504
+ if (this.viewMode === "calendar")
505
+ this.positionOnManualDate();
506
+ this[WklyPickerOutputsPropertyKeys.ViewModeChange].emit(this.viewMode);
507
+ if (this.viewMode === "calendar")
508
+ setTimeout(() => this.resetScroll());
509
+ }
510
+ positionOnManualDate() {
511
+ const draft = this.drafts[this.manualDateEndpoint];
512
+ if (!draft || !draft.present)
513
+ return;
514
+ try {
515
+ // A valid day follows the selection. An impossible day keeps its draft
516
+ // fields but still shows the chosen month in the calendar.
517
+ const target = this.adapter.dateToEpochDay(draft.date);
518
+ this.focused = target;
519
+ this.position(target, true);
520
+ }
521
+ catch (_) {
522
+ try {
523
+ const first = this.adapter.dateToEpochDay({ ...draft.date, day: 1 });
524
+ this.focused = first;
525
+ this.position(first, true);
526
+ }
527
+ catch (_) { }
528
+ }
529
+ }
530
+ months(draft) {
531
+ try {
532
+ return this.adapter.getMonths(draft.date.year).map((m) => m.label);
533
+ }
534
+ catch (_) {
535
+ return [];
536
+ }
537
+ }
538
+ monthCount(draft) {
539
+ return this.months(draft).length || 12;
540
+ }
541
+ get inDays() {
542
+ return draftDayDifference(this.drafts, this.adapter);
543
+ }
544
+ get inDaysLabel() {
545
+ const days = this.inDays;
546
+ return this.t("inDays").replace(/{{\s*days\s*}}/g, days === null
547
+ ? this.t("daysUnavailable")
548
+ : new Intl.NumberFormat(this.effectiveLocale, {
549
+ useGrouping: false,
550
+ }).format(days));
551
+ }
552
+ get resultingEndDate() {
553
+ try {
554
+ const draft = this.drafts[1];
555
+ if (draft.unsupportedEpochDay !== undefined ||
556
+ this.adapter.validateDate(draft.date).length)
557
+ return "";
558
+ return [
559
+ this.adapter.formatDay(draft.date),
560
+ this.adapter.formatMonth(draft.date),
561
+ this.adapter.formatYear(draft.date),
562
+ ].join(" ");
563
+ }
564
+ catch (_) {
565
+ return "";
566
+ }
567
+ }
568
+ toggleEndView(view) {
569
+ if (this[WklyPickerInputsPropertyKeys.Disabled])
570
+ return;
571
+ this.endView = view;
572
+ }
573
+ days(value) {
574
+ if (this[WklyPickerInputsPropertyKeys.Disabled])
575
+ return;
576
+ this.manualDateEndpoint = 1;
577
+ setDraftDayDifference(this.drafts, this.adapter, value);
578
+ this.check();
579
+ }
580
+ field(index, field, value) {
581
+ if (this[WklyPickerInputsPropertyKeys.Disabled])
582
+ return;
583
+ const draft = this.drafts[index];
584
+ draft.present = true;
585
+ if (field === "day" || field === "year" || field === "month") {
586
+ this.manualDateEndpoint = index;
587
+ delete draft.unsupportedEpochDay;
588
+ let date = { ...draft.date, [field]: value };
589
+ if (field === "month") {
590
+ let month;
591
+ try {
592
+ month = this.adapter
593
+ .getMonths(date.year)
594
+ .find((m) => m.month === value);
595
+ }
596
+ catch (_) { }
597
+ date = { ...date, monthCode: month ? month.monthCode : "" };
598
+ }
599
+ if (field === "year" && value !== null) {
600
+ try {
601
+ const months = this.adapter.getMonths(value);
602
+ const month = months.find((m) => m.monthCode === date.monthCode);
603
+ if (month)
604
+ date = { ...date, month: month.month };
605
+ }
606
+ catch (_) { }
607
+ }
608
+ draft.date = date;
609
+ }
610
+ else if (field === "hour" && this.effectiveHourCycle === "h12")
611
+ draft.hour =
612
+ value === null
613
+ ? null
614
+ : value >= 1 && value <= 12
615
+ ? (value % 12) + ((draft.hour || 0) >= 12 ? 12 : 0)
616
+ : 24 + value;
617
+ else
618
+ draft[field] = value;
619
+ this.check();
620
+ }
621
+ displayHour(draft) {
622
+ return draft.hour === null
623
+ ? null
624
+ : this.effectiveHourCycle === "h12"
625
+ ? draft.hour % 12 || 12
626
+ : draft.hour;
627
+ }
628
+ period(index, period) {
629
+ if (this[WklyPickerInputsPropertyKeys.Disabled])
630
+ return;
631
+ if (period === "24")
632
+ this.effectiveHourCycle = "h24";
633
+ else {
634
+ this.effectiveHourCycle = "h12";
635
+ this.drafts[index].hour =
636
+ ((this.drafts[index].hour || 0) % 12) + (period === "pm" ? 12 : 0);
637
+ this.drafts[index].present = true;
638
+ this.finish();
639
+ }
640
+ }
641
+ selected(day) {
642
+ return this.drafts.some((d) => {
643
+ try {
644
+ return d.present && this.adapter.dateToEpochDay(d.date) === day;
645
+ }
646
+ catch (_) {
647
+ return false;
648
+ }
649
+ });
650
+ }
651
+ inRange(day) {
652
+ if (!this.isRange || !this.drafts.every((d) => d.present))
653
+ return false;
654
+ try {
655
+ const a = this.adapter.dateToEpochDay(this.drafts[0].date), b = this.adapter.dateToEpochDay(this.drafts[1].date);
656
+ return day > Math.min(a, b) && day < Math.max(a, b);
657
+ }
658
+ catch (_) {
659
+ return false;
660
+ }
661
+ }
662
+ dayDisabled(day) {
663
+ if (day < this.firstSupportedDay || day > this.lastSupportedDay)
664
+ return true;
665
+ try {
666
+ const date = this.adapter.epochDayToDate(day);
667
+ const isDateDisabled = this[WklyPickerInputsPropertyKeys.IsDateDisabled];
668
+ if (isDateDisabled &&
669
+ isDateDisabled(day, {
670
+ mode: this[WklyPickerInputsPropertyKeys.Mode],
671
+ endpoint: this.isRange
672
+ ? this.drafts[0]?.present && !this.drafts[1]?.present
673
+ ? "end"
674
+ : "start"
675
+ : "single",
676
+ calendarDate: date,
677
+ }))
678
+ return true;
679
+ const min = this[WklyPickerInputsPropertyKeys.Min];
680
+ const max = this[WklyPickerInputsPropertyKeys.Max];
681
+ if (min && day < decodeIso(min).epochDay)
682
+ return true;
683
+ if (max && day > decodeIso(max).epochDay)
684
+ return true;
685
+ return false;
686
+ }
687
+ catch (_) {
688
+ return true;
689
+ }
690
+ }
691
+ select(day) {
692
+ if (this[WklyPickerInputsPropertyKeys.Disabled] || this.dayDisabled(day))
693
+ return;
694
+ this.focused = day;
695
+ const index = this.isRange && this.drafts[0].present && !this.drafts[1].present ? 1 : 0;
696
+ if (this.isRange && index === 0)
697
+ this.drafts[1].present = false;
698
+ delete this.drafts[index].unsupportedEpochDay;
699
+ this.drafts[index].date = this.adapter.epochDayToDate(day);
700
+ this.drafts[index].present = true;
701
+ this.orderDrafts();
702
+ this.renderRows();
703
+ this.finish();
704
+ if (this.presentation === "transient" &&
705
+ this[WklyPickerInputsPropertyKeys.Mode] === "date" &&
706
+ this.viewMode === "calendar")
707
+ this.submit("auto-submit");
708
+ }
709
+ key(event, day) {
710
+ let delta = 0;
711
+ if (event.key === "ArrowLeft")
712
+ delta = -1;
713
+ if (event.key === "ArrowRight")
714
+ delta = 1;
715
+ if (event.key === "ArrowUp")
716
+ delta = -7;
717
+ if (event.key === "ArrowDown")
718
+ delta = 7;
719
+ if (event.key === "PageUp")
720
+ delta = -7 * (event.shiftKey ? this.visibleCount : 1);
721
+ if (event.key === "PageDown")
722
+ delta = 7 * (event.shiftKey ? this.visibleCount : 1);
723
+ if (event.key === "Home") {
724
+ event.preventDefault();
725
+ this.scrollToEpochDay(this.today, { focus: true });
726
+ }
727
+ if (delta) {
728
+ event.preventDefault();
729
+ const target = day + delta;
730
+ if (target >= this.firstSupportedDay && target <= this.lastSupportedDay)
731
+ this.scrollToEpochDay(target, { focus: true });
732
+ }
733
+ }
734
+ position(day, preset = false, options = {}) {
735
+ day = Math.max(this.firstSupportedDay, Math.min(this.lastSupportedDay, day));
736
+ this.anchorWeek = absoluteWeekOf(day, this.effectiveOffset);
737
+ const viewportPreset = this[WklyPickerInputsPropertyKeys.ViewportPreset];
738
+ this.clipMonth = preset && viewportPreset.kind === "full-month";
739
+ if (preset && viewportPreset.kind !== "weeks") {
740
+ const d = this.adapter.epochDayToDate(day);
741
+ this.initialMonth = d.year + "/" + d.monthCode;
742
+ const [start, end] = calendarMonthBounds(this.adapter, day);
743
+ this.firstWeek = absoluteWeekOf(start, this.effectiveOffset);
744
+ this.visibleCount =
745
+ absoluteWeekOf(end, this.effectiveOffset) - this.firstWeek + 1;
746
+ if (viewportPreset.kind === "full-month-and-around" &&
747
+ !this.configErrors.length) {
748
+ const before = viewportPreset.extraWeeksBefore || 0, after = viewportPreset.extraWeeksAfter || 0;
749
+ this.firstWeek -= before;
750
+ this.visibleCount += before + after;
751
+ }
752
+ }
753
+ else {
754
+ if (viewportPreset.kind === "weeks")
755
+ this.visibleCount = this.configErrors.length
756
+ ? 6
757
+ : viewportPreset.visibleWeekCount;
758
+ this.firstWeek =
759
+ this.anchorWeek -
760
+ (options.align === "start"
761
+ ? 0
762
+ : options.align === "end"
763
+ ? this.visibleCount - 1
764
+ : Math.floor(this.visibleCount / 2));
765
+ }
766
+ this.firstWeek = this.clampFirstWeek(this.firstWeek);
767
+ this.baseWeek = this.firstWeek - 1000;
768
+ this.renderRows();
769
+ // Apply the new runway before writing scrollTop or locating a focus target.
770
+ this.changeDetector.detectChanges();
771
+ this.resetScroll();
772
+ }
773
+ resetScroll() {
774
+ // Round week boundaries to avoid scrollTop truncation under CSS zoom.
775
+ if (this.scroller)
776
+ this.scroller.nativeElement.scrollTop = Math.round(1000 * this.rowHeight);
777
+ }
778
+ scroll(event) {
779
+ const element = event.target;
780
+ this.snapPending = true;
781
+ this.scheduleSnap();
782
+ // Quantize displacement around the reset point, equally in both directions.
783
+ const relativeRows = element.scrollTop / this.rowHeight - 1000;
784
+ const index = 1000 + Math.sign(relativeRows) * Math.round(Math.abs(relativeRows));
785
+ const requestedFirst = this.baseWeek + index;
786
+ const first = this.clampFirstWeek(requestedFirst);
787
+ if (requestedFirst !== first) {
788
+ element.scrollTop = Math.round((first - this.baseWeek) * this.rowHeight);
789
+ }
790
+ if (first === this.firstWeek)
791
+ return;
792
+ this.clipMonth = false;
793
+ this.firstWeek = first;
794
+ this.anchorWeek = first + Math.floor(this.visibleCount / 2);
795
+ if (index < 100 || index > 1900) {
796
+ // Preserve signed displacement from this week; modulo turns fractional
797
+ // rounding just below a boundary into almost a full row after rebasing.
798
+ const offset = element.scrollTop - (first - this.baseWeek) * this.rowHeight;
799
+ this.baseWeek = first - 1000;
800
+ element.scrollTop = Math.round(1000 * this.rowHeight + offset);
801
+ }
802
+ this.renderRows();
803
+ }
804
+ scheduleSnap() {
805
+ if (this.scrollEndTimer)
806
+ clearTimeout(this.scrollEndTimer);
807
+ this.scrollEndTimer = setTimeout(() => this.snapWeek(), 200);
808
+ }
809
+ snapWeek() {
810
+ if (this.scrollEndTimer)
811
+ clearTimeout(this.scrollEndTimer);
812
+ this.scrollEndTimer = undefined;
813
+ if (!this.snapPending || !this.scroller)
814
+ return;
815
+ this.snapPending = false;
816
+ // Align the current virtual week without rebuilding or rebasing its rows.
817
+ const element = this.scroller.nativeElement;
818
+ const target = Math.round((this.firstWeek - this.baseWeek) * this.rowHeight);
819
+ if (element.scrollTop !== target)
820
+ element.scrollTop = target;
821
+ }
822
+ showFirstWeek(week) {
823
+ const first = this.clampFirstWeek(week);
824
+ if (first === this.firstWeek)
825
+ return;
826
+ this.clipMonth = false;
827
+ this.firstWeek = first;
828
+ this.anchorWeek = first + Math.floor(this.visibleCount / 2);
829
+ this.baseWeek = first - 1000;
830
+ this.renderRows();
831
+ this.resetScroll();
832
+ }
833
+ canMoveWeek(delta) {
834
+ return this.clampFirstWeek(this.firstWeek + delta) !== this.firstWeek;
835
+ }
836
+ moveWeek(delta) {
837
+ if (!this[WklyPickerInputsPropertyKeys.Disabled])
838
+ this.showFirstWeek(this.firstWeek + delta);
839
+ }
840
+ renderRows() {
841
+ // Keep the virtual scroll offset here; row data is shared across Angular versions.
842
+ const overscan = Math.max(0, Math.min(50, this[WklyPickerInputsPropertyKeys.OverscanWeeks] || 0));
843
+ const start = this.firstWeek - overscan;
844
+ this.paddingTop = (start - this.baseWeek) * this.rowHeight;
845
+ this.rows = createWeekRows({
846
+ generator: this.generator,
847
+ adapter: this.adapter,
848
+ startWeek: start,
849
+ count: this.visibleCount + 2 * overscan,
850
+ firstVisibleWeek: this.firstWeek,
851
+ firstSupportedDay: this.firstSupportedDay,
852
+ lastSupportedDay: this.lastSupportedDay,
853
+ clipMonth: this.clipMonth,
854
+ initialMonth: this.initialMonth,
855
+ weekLabelMode: this[WklyPickerInputsPropertyKeys.WeekLabelMode],
856
+ weekLabelFormatter: this[WklyPickerInputsPropertyKeys.WeekLabelFormatter] || null,
857
+ isDayDisabled: (day) => this.dayDisabled(day),
858
+ });
859
+ this[WklyPickerOutputsPropertyKeys.ViewportChange].emit({
860
+ firstVisibleAbsoluteWeek: this.firstWeek,
861
+ lastVisibleAbsoluteWeek: this.firstWeek + this.visibleCount - 1,
862
+ anchorAbsoluteWeek: this.anchorWeek,
863
+ });
864
+ }
865
+ // Retain day DOM nodes and keyboard focus when row metadata is regenerated.
866
+ trackCell(_i, cell) {
867
+ return cell.epochDay;
868
+ }
869
+ trackRow(_i, row) {
870
+ return row.week.absoluteWeek;
871
+ }
872
+ scrollToEpochDay(day, options = {}) {
873
+ integer(day);
874
+ this.adapter.epochDayToDate(day);
875
+ day = Math.max(this.firstSupportedDay, Math.min(this.lastSupportedDay, day));
876
+ // position renders synchronously; publish the tab stop before that render.
877
+ if (options.focus)
878
+ this.focused = day;
879
+ this.position(day, false, options);
880
+ if (options.select)
881
+ this.select(day);
882
+ if (options.focus)
883
+ this.focusDay();
884
+ }
885
+ scrollToAbsoluteWeek(week, options = {}) {
886
+ // A boundary week can start before the adapter's first supported day.
887
+ const first = firstEpochDayOf(week, this.effectiveOffset);
888
+ this.scrollToEpochDay(week === this.firstSupportedWeek
889
+ ? Math.max(first, this.firstSupportedDay)
890
+ : first, options);
891
+ }
892
+ scrollToCalendarDate(date, options = {}) {
893
+ this.scrollToEpochDay(this.adapter.dateToEpochDay(date), options);
894
+ }
895
+ scrollToValue(value, options = {}) {
896
+ this.scrollToEpochDay(decodeIso(value).epochDay, options);
897
+ }
898
+ focusDay() {
899
+ if (!this.browser)
900
+ return;
901
+ setTimeout(() => {
902
+ if (this.destroyed)
903
+ return;
904
+ this.changeDetector.detectChanges();
905
+ const day = this.host.nativeElement.querySelector('[data-day="' + this.focused + '"]');
906
+ const fallback = this.host.nativeElement.querySelector("button:not(:disabled),input:not(:disabled)");
907
+ (day || fallback)?.focus({ preventScroll: true });
908
+ });
909
+ }
910
+ }
911
+ WklyDateTimePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: WklyDateTimePickerComponent, deps: [{ token: LOCALE_ID }, { token: WKLY_CONFIG }, { token: WKLY_CLOCK }, { token: WKLY_LOCALIZATION }, { token: WKLY_TRANSLATIONS }, { token: PLATFORM_ID }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
912
+ WklyDateTimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: WklyDateTimePickerComponent, selector: "wkly-datetime-picker", providers: [
913
+ {
914
+ provide: NG_VALUE_ACCESSOR,
915
+ useExisting: forwardRef(() => WklyDateTimePickerComponent),
916
+ multi: true,
917
+ },
918
+ {
919
+ provide: NG_VALIDATORS,
920
+ useExisting: forwardRef(() => WklyDateTimePickerComponent),
921
+ multi: true,
922
+ },
923
+ ], viewQueries: [{ propertyName: "scroller", first: true, predicate: ["scroller"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<section\n class=\"wkly\"\n [attr.dir]=\"direction\"\n [attr.aria-label]=\"\n this[WklyPickerInputsPropertyKeys.AriaLabel] || 'Date and time picker'\n \"\n [attr.aria-describedby]=\"this[WklyPickerInputsPropertyKeys.AriaDescribedBy]\"\n (focusout)=\"touched()\"\n>\n <header class=\"toolbar\">\n <button\n *ngIf=\"hasDate\"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-label]=\"t(viewMode === 'calendar' ? 'manual' : 'calendar')\"\n (click)=\"toggleView()\"\n >\n {{ viewMode === \"calendar\" ? \"\u2637\" : \"\u25A6\" }}\n </button>\n <span *ngIf=\"hasDate\" class=\"year-control\">{{ title }}</span>\n <span class=\"spacer\"></span\n ><button\n type=\"button\"\n class=\"now\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n (click)=\"now()\"\n >\n {{ t(\"now\") }}\n </button>\n <button\n *ngIf=\"presentation === 'transient'\"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-label]=\"t('close')\"\n (click)=\"cancel()\"\n >\n \u00D7\n </button>\n </header>\n <ng-container *ngIf=\"hasDate && viewMode === 'calendar'\">\n <div\n role=\"grid\"\n [attr.aria-label]=\"\n this[WklyPickerInputsPropertyKeys.AriaLabel] || 'Calendar'\n \"\n [attr.aria-multiselectable]=\"isRange\"\n >\n <div\n role=\"row\"\n class=\"week-head\"\n [class.no-label]=\"\n compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] === 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n >\n <span\n *ngIf=\"\n !compact &&\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] !== 'hidden' ||\n this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n role=\"columnheader\"\n aria-label=\"Week\"\n ></span\n ><span *ngFor=\"let day of weekdays\" role=\"columnheader\">{{ day }}</span>\n </div>\n <div\n #scroller\n class=\"week-scroll\"\n [style.height.px]=\"visibleCount * rowHeight\"\n (scroll)=\"scroll($event)\"\n (scrollend)=\"snapWeek()\"\n >\n <div [style.height.px]=\"scrollHeight\" class=\"scroll-space\">\n <div class=\"rows\" [style.top.px]=\"paddingTop\">\n <div\n *ngFor=\"let row of rows; trackBy: trackRow\"\n role=\"row\"\n class=\"week-row\"\n [class.no-label]=\"\n compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] ===\n 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n >\n <span\n *ngIf=\"\n !compact &&\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] !==\n 'hidden' ||\n this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n role=\"rowheader\"\n class=\"week-number\"\n >{{ row.label }}</span\n >\n <div\n *ngFor=\"\n let cell of row.cells;\n let dayIndex = index;\n trackBy: trackCell\n \"\n role=\"gridcell\"\n [attr.data-weekday-index]=\"dayIndex\"\n [attr.aria-colindex]=\"\n dayIndex +\n (compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] ===\n 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n ? 1\n : 2)\n \"\n [attr.aria-selected]=\"selected(cell.epochDay)\"\n [attr.aria-disabled]=\"\n cell.disabled || this[WklyPickerInputsPropertyKeys.Disabled]\n \"\n [class.range]=\"inRange(cell.epochDay)\"\n [class.hidden]=\"cell.hidden\"\n [class.odd-month]=\"cell.date && cell.date.month % 2 === 1\"\n >\n <span [class]=\"'annotation annotation--' + dayIndex\">{{\n cell.annotation\n }}</span>\n <button\n type=\"button\"\n class=\"day\"\n [attr.data-day]=\"cell.epochDay\"\n [attr.aria-label]=\"cell.accessible\"\n [attr.aria-current]=\"cell.epochDay === today ? 'date' : null\"\n [attr.aria-disabled]=\"\n cell.disabled || this[WklyPickerInputsPropertyKeys.Disabled]\n \"\n [attr.tabindex]=\"\n !cell.hidden && cell.epochDay === focused ? 0 : -1\n \"\n [class.selected]=\"selected(cell.epochDay)\"\n [class.today]=\"cell.epochDay === today\"\n (focus)=\"focused = cell.epochDay\"\n (click)=\"select(cell.epochDay)\"\n (keydown)=\"key($event, cell.epochDay)\"\n >\n {{ cell.label }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"week-navigation\">\n <button\n type=\"button\"\n [disabled]=\"\n this[WklyPickerInputsPropertyKeys.Disabled] || !canMoveWeek(-1)\n \"\n [attr.aria-label]=\"t('previous')\"\n (click)=\"moveWeek(-1)\"\n >\n \u2191</button\n ><span>{{ title }}</span\n ><button\n type=\"button\"\n [disabled]=\"\n this[WklyPickerInputsPropertyKeys.Disabled] || !canMoveWeek(1)\n \"\n [attr.aria-label]=\"t('next')\"\n (click)=\"moveWeek(1)\"\n >\n \u2193\n </button>\n </div>\n </ng-container>\n <ng-container\n *ngFor=\"let draft of drafts; let i = index; trackBy: trackDraft\"\n >\n <fieldset\n *ngIf=\"(i === 0 || isRange) && (hasTime || viewMode === 'manual')\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-label]=\"isRange ? t(i === 0 ? 'start' : 'end') : null\"\n >\n <legend *ngIf=\"isRange\">\n <ng-container\n *ngIf=\"\n i === 1 && hasDate && viewMode === 'manual';\n else endpointLabel\n \"\n >\n <span class=\"end-view-toggle\">\n <button\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"endView === 'date'\"\n (click)=\"toggleEndView('date')\"\n >\n {{ t(\"end\") }}\n </button>\n <button\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"endView === 'days'\"\n (click)=\"toggleEndView('days')\"\n >\n {{ inDaysLabel }}\n </button>\n </span>\n </ng-container>\n <ng-template #endpointLabel>{{\n t(i === 0 ? \"start\" : \"end\")\n }}</ng-template>\n </legend>\n <div\n *ngIf=\"\n i === 1 && hasDate && viewMode === 'manual' && endView === 'days'\n \"\n class=\"date-fields in-days-fields\"\n >\n <span class=\"resulting-end-date\" [attr.aria-label]=\"t('endDate')\">{{\n resultingEndDate\n }}</span>\n <wkly-field\n [label]=\"t('days')\"\n [hideLabel]=\"true\"\n [previousLabel]=\"t('daysPrevious')\"\n [nextLabel]=\"t('daysNext')\"\n [locale]=\"effectiveLocale\"\n [value]=\"inDays\"\n [min]=\"-9999\"\n [max]=\"9999\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"days($event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n </div>\n <div\n *ngIf=\"\n hasDate && viewMode === 'manual' && (i === 0 || endView === 'date')\n \"\n class=\"date-fields\"\n >\n <wkly-field\n [label]=\"t('day')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.day\"\n [min]=\"1\"\n [max]=\"31\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'day', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('month')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.month\"\n [min]=\"1\"\n [max]=\"monthCount(draft)\"\n [labels]=\"months(draft)\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'month', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('year')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.year\"\n [min]=\"adapter.supportedYearRange[0]\"\n [max]=\"adapter.supportedYearRange[1]\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'year', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n </div>\n <div\n *ngIf=\"hasTime\"\n class=\"time-fields\"\n [class.seconds]=\"this[WklyPickerInputsPropertyKeys.ShowSeconds]\"\n >\n <wkly-field\n [label]=\"t('hour')\"\n [locale]=\"effectiveLocale\"\n [value]=\"displayHour(draft)\"\n [min]=\"effectiveHourCycle === 'h12' ? 1 : 0\"\n [max]=\"effectiveHourCycle === 'h12' ? 12 : 23\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'hour', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('minute')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.minute\"\n [max]=\"59\"\n [step]=\"\n this[WklyPickerInputsPropertyKeys.MinuteStep] > 0 &&\n 60 % this[WklyPickerInputsPropertyKeys.MinuteStep] === 0\n ? this[WklyPickerInputsPropertyKeys.MinuteStep]\n : 1\n \"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'minute', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n *ngIf=\"this[WklyPickerInputsPropertyKeys.ShowSeconds]\"\n [label]=\"t('second')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.second\"\n [max]=\"59\"\n [step]=\"\n this[WklyPickerInputsPropertyKeys.SecondStep] > 0 &&\n 60 % this[WklyPickerInputsPropertyKeys.SecondStep] === 0\n ? this[WklyPickerInputsPropertyKeys.SecondStep]\n : 1\n \"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'second', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <div class=\"period\">\n <button\n *ngIf=\"\n effectiveHourCycle === 'h12' ||\n this[WklyPickerInputsPropertyKeys.HourCycle] === 'switchable'\n \"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"\n effectiveHourCycle === 'h12' && (draft.hour || 0) < 12\n \"\n (click)=\"period(i, 'am')\"\n >\n {{ t(\"am\") }}</button\n ><button\n type=\"button\"\n [disabled]=\"\n this[WklyPickerInputsPropertyKeys.Disabled] ||\n this[WklyPickerInputsPropertyKeys.HourCycle] !== 'switchable'\n \"\n [attr.aria-pressed]=\"effectiveHourCycle === 'h24'\"\n (click)=\"period(i, '24')\"\n >\n 24</button\n ><button\n *ngIf=\"\n effectiveHourCycle === 'h12' ||\n this[WklyPickerInputsPropertyKeys.HourCycle] === 'switchable'\n \"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"\n effectiveHourCycle === 'h12' && (draft.hour || 0) >= 12\n \"\n (click)=\"period(i, 'pm')\"\n >\n {{ t(\"pm\") }}\n </button>\n </div>\n </div>\n </fieldset>\n </ng-container>\n <div class=\"validation\" role=\"status\" aria-live=\"polite\">\n <p *ngFor=\"let err of errors\">! {{ t(err.messageKey) }}</p>\n </div>\n <footer *ngIf=\"submitVisible\">\n <button\n type=\"button\"\n class=\"confirm\"\n [disabled]=\"!canSubmit\"\n (click)=\"submit()\"\n >\n {{ t(\"confirm\") }}\n </button>\n </footer>\n</section>\n", styles: [":host{display:block;width:100%;box-sizing:border-box;--wkly-background-color: #fff;--wkly-background-color-alternate: #fafafa;--wkly-text-color: #192c28;--wkly-muted-color: #52635e;--wkly-border-color: #dce5e1;--wkly-accent-color: #176c55;--wkly-accent-color-alternate: #6ea494;--wkly-accent-text-color: #fff;--wkly-range-color: #e5f1ee;--wkly-error-color: #b42318;--wkly-focus-color: #245bd6;--wkly-size-multiplier: 1;--wkly-size-unit: 3.5em;color:var(--wkly-text-color);font:14px/1.4 system-ui,sans-serif;container-type:inline-size}.wkly{background:var(--wkly-background-color);border:1px solid var(--wkly-border-color);border-radius:14px;overflow:hidden;min-width:0;font-size:calc(14px*clamp(1,var(--wkly-size-multiplier),1.5))}button{font:inherit;color:inherit;min-width:var(--wkly-size-unit);min-height:var(--wkly-size-unit);border:0;background:transparent;border-radius:8px;cursor:pointer}@media (hover: hover) and (pointer: fine){button:hover:not(:disabled):not([aria-disabled=\"true\"]):not(.selected){background:var(--wkly-accent-color-alternate)}}button:disabled,button[aria-disabled=true]{opacity:.4;cursor:default}button:focus-visible{outline:2px solid var(--wkly-focus-color);outline-offset:-2px}.toolbar{display:flex;align-items:center;padding:8px;gap:3px;border-bottom:1px solid var(--wkly-border-color)}.spacer{flex:1}.year-control{padding:0 6px;font-weight:650;text-align:start;line-height:1.2}.now{color:var(--wkly-accent-color);font-weight:650}.week-head,.week-row{display:grid;grid-template-columns:28px repeat(7,minmax(0,1fr))}.week-head{font-size:.85em;color:var(--wkly-muted-color);height:34px;align-items:center;text-align:center}.week-row{height:calc(var(--wkly-size-unit) * clamp(1,var(--wkly-size-multiplier),1));align-items:end}.no-label{grid-template-columns:repeat(7,minmax(0,1fr))}.week-scroll{overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;overflow-anchor:none;scrollbar-width:thin;max-height:65vh;touch-action:pan-y}.scroll-space{position:relative}.rows{position:absolute;left:0;right:0}.week-number{font-size:.85em;text-align:center;align-self:end;line-height:var(--wkly-size-unit);color:var(--wkly-muted-color)}[role=gridcell]{position:relative;min-width:0;height:var(--wkly-size-unit);text-align:center}[role=gridcell].odd-month:not(.range):not(.today){background:var(--wkly-background-color-alternate)}.day{width:100%;min-width:0;height:var(--wkly-size-unit);padding:0;border-radius:8px}.annotation{position:absolute;bottom:.25em;white-space:nowrap;font-size:1.25em;font-weight:650;line-height:1;pointer-events:none;z-index:1;color:var(--wkly-muted-color);color:color-mix(in srgb,var(--wkly-muted-color) 50%,transparent);text-shadow:0 0 2px --wkly-background-color,0 0 4px --wkly-background-color}.odd-month .annotation{text-shadow:0 0 2px --wkly-background-color-alternate,0 0 4px --wkly-background-color-alternate}.annotation:empty{display:none}.annotation--0{inset-inline-start:10%;bottom:1.75em}.annotation--1{inset-inline-start:-5%}.annotation--2{inset-inline-start:-20%}.annotation--3{inset-inline-start:-50%;inset-inline-end:-50%}.annotation--4{inset-inline-end:-20%}.annotation--5{inset-inline-end:-5%}.annotation--6{inset-inline-end:10%}.range{background:var(--wkly-range-color)}.day.selected{background:var(--wkly-accent-color);color:var(--wkly-accent-text-color);font-weight:700}.today:after{content:\"\";display:block;width:5px;height:5px;background:currentColor;border-radius:50%;position:absolute;bottom:2px;left:calc(50% - 2px)}.today{font-weight:750;box-shadow:inset 0 0 0 1px var(--wkly-accent-color)}.hidden{visibility:hidden}.week-navigation{display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--wkly-border-color);font-size:.85em;color:var(--wkly-muted-color)}fieldset{border:0;padding:0 12px;margin:0;min-width:0}legend{padding-top:.85em;font-weight:650;color:var(--wkly-accent-color)}.date-fields{display:grid;grid-template-columns:1fr 2fr 1.4fr;grid-gap:7px;gap:7px;padding:12px 0}.end-view-toggle{display:inline-flex}.end-view-toggle button{min-height:0;min-width:0;padding:0 6px;border-radius:0;line-height:inherit}.end-view-toggle button:first-child{padding-inline-start:0}.end-view-toggle button+button{border-inline-start:1px solid var(--wkly-text-color)}.end-view-toggle button[aria-pressed=false]{color:var(--wkly-muted-color);font-weight:400}.in-days-fields{grid-template-columns:minmax(0,1fr);gap:0;text-align:center}.resulting-end-date{font-size:11px;color:var(--wkly-muted-color);height:1.4em;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.time-fields{display:grid;grid-template-columns:1fr 1fr 52px;grid-gap:8px;gap:8px;padding:14px 0;border-top:1px solid var(--wkly-border-color)}.time-fields.seconds{grid-template-columns:1fr 1fr 1fr 48px}.period{display:flex;flex-direction:column;justify-content:center;gap:2px;padding-top:1.25em}.period button{font-size:.85em}.period [aria-pressed=true]{background:var(--wkly-range-color);box-shadow:inset 0 0 0 1px var(--wkly-accent-color);font-weight:700}.validation{color:var(--wkly-error-color);font-size:.85em}.validation p{margin:.5em .85em}footer{padding:12px;border-top:1px solid var(--wkly-border-color)}.confirm{background:var(--wkly-accent-color);color:var(--wkly-accent-text-color);width:100%;font-weight:650}@media (forced-colors: active){.day.selected{outline:2px solid Highlight}.range{border-bottom:2px solid Highlight}.today{outline:1px dashed CanvasText}}@media (prefers-reduced-motion: reduce){*{scroll-behavior:auto!important;animation:none!important}}\n"], components: [{ type: i1.WklyFieldComponent, selector: "wkly-field", inputs: ["value", "label", "hideLabel", "previousLabel", "nextLabel", "min", "max", "step", "locale", "disabled", "invalid", "labels"], outputs: ["valueChange", "complete"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
924
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: WklyDateTimePickerComponent, decorators: [{
925
+ type: Component,
926
+ args: [{ selector: "wkly-datetime-picker", providers: [
927
+ {
928
+ provide: NG_VALUE_ACCESSOR,
929
+ useExisting: forwardRef(() => WklyDateTimePickerComponent),
930
+ multi: true,
931
+ },
932
+ {
933
+ provide: NG_VALIDATORS,
934
+ useExisting: forwardRef(() => WklyDateTimePickerComponent),
935
+ multi: true,
936
+ },
937
+ ], template: "<section\n class=\"wkly\"\n [attr.dir]=\"direction\"\n [attr.aria-label]=\"\n this[WklyPickerInputsPropertyKeys.AriaLabel] || 'Date and time picker'\n \"\n [attr.aria-describedby]=\"this[WklyPickerInputsPropertyKeys.AriaDescribedBy]\"\n (focusout)=\"touched()\"\n>\n <header class=\"toolbar\">\n <button\n *ngIf=\"hasDate\"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-label]=\"t(viewMode === 'calendar' ? 'manual' : 'calendar')\"\n (click)=\"toggleView()\"\n >\n {{ viewMode === \"calendar\" ? \"\u2637\" : \"\u25A6\" }}\n </button>\n <span *ngIf=\"hasDate\" class=\"year-control\">{{ title }}</span>\n <span class=\"spacer\"></span\n ><button\n type=\"button\"\n class=\"now\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n (click)=\"now()\"\n >\n {{ t(\"now\") }}\n </button>\n <button\n *ngIf=\"presentation === 'transient'\"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-label]=\"t('close')\"\n (click)=\"cancel()\"\n >\n \u00D7\n </button>\n </header>\n <ng-container *ngIf=\"hasDate && viewMode === 'calendar'\">\n <div\n role=\"grid\"\n [attr.aria-label]=\"\n this[WklyPickerInputsPropertyKeys.AriaLabel] || 'Calendar'\n \"\n [attr.aria-multiselectable]=\"isRange\"\n >\n <div\n role=\"row\"\n class=\"week-head\"\n [class.no-label]=\"\n compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] === 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n >\n <span\n *ngIf=\"\n !compact &&\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] !== 'hidden' ||\n this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n role=\"columnheader\"\n aria-label=\"Week\"\n ></span\n ><span *ngFor=\"let day of weekdays\" role=\"columnheader\">{{ day }}</span>\n </div>\n <div\n #scroller\n class=\"week-scroll\"\n [style.height.px]=\"visibleCount * rowHeight\"\n (scroll)=\"scroll($event)\"\n (scrollend)=\"snapWeek()\"\n >\n <div [style.height.px]=\"scrollHeight\" class=\"scroll-space\">\n <div class=\"rows\" [style.top.px]=\"paddingTop\">\n <div\n *ngFor=\"let row of rows; trackBy: trackRow\"\n role=\"row\"\n class=\"week-row\"\n [class.no-label]=\"\n compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] ===\n 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n >\n <span\n *ngIf=\"\n !compact &&\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] !==\n 'hidden' ||\n this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n role=\"rowheader\"\n class=\"week-number\"\n >{{ row.label }}</span\n >\n <div\n *ngFor=\"\n let cell of row.cells;\n let dayIndex = index;\n trackBy: trackCell\n \"\n role=\"gridcell\"\n [attr.data-weekday-index]=\"dayIndex\"\n [attr.aria-colindex]=\"\n dayIndex +\n (compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] ===\n 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n ? 1\n : 2)\n \"\n [attr.aria-selected]=\"selected(cell.epochDay)\"\n [attr.aria-disabled]=\"\n cell.disabled || this[WklyPickerInputsPropertyKeys.Disabled]\n \"\n [class.range]=\"inRange(cell.epochDay)\"\n [class.hidden]=\"cell.hidden\"\n [class.odd-month]=\"cell.date && cell.date.month % 2 === 1\"\n >\n <span [class]=\"'annotation annotation--' + dayIndex\">{{\n cell.annotation\n }}</span>\n <button\n type=\"button\"\n class=\"day\"\n [attr.data-day]=\"cell.epochDay\"\n [attr.aria-label]=\"cell.accessible\"\n [attr.aria-current]=\"cell.epochDay === today ? 'date' : null\"\n [attr.aria-disabled]=\"\n cell.disabled || this[WklyPickerInputsPropertyKeys.Disabled]\n \"\n [attr.tabindex]=\"\n !cell.hidden && cell.epochDay === focused ? 0 : -1\n \"\n [class.selected]=\"selected(cell.epochDay)\"\n [class.today]=\"cell.epochDay === today\"\n (focus)=\"focused = cell.epochDay\"\n (click)=\"select(cell.epochDay)\"\n (keydown)=\"key($event, cell.epochDay)\"\n >\n {{ cell.label }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"week-navigation\">\n <button\n type=\"button\"\n [disabled]=\"\n this[WklyPickerInputsPropertyKeys.Disabled] || !canMoveWeek(-1)\n \"\n [attr.aria-label]=\"t('previous')\"\n (click)=\"moveWeek(-1)\"\n >\n \u2191</button\n ><span>{{ title }}</span\n ><button\n type=\"button\"\n [disabled]=\"\n this[WklyPickerInputsPropertyKeys.Disabled] || !canMoveWeek(1)\n \"\n [attr.aria-label]=\"t('next')\"\n (click)=\"moveWeek(1)\"\n >\n \u2193\n </button>\n </div>\n </ng-container>\n <ng-container\n *ngFor=\"let draft of drafts; let i = index; trackBy: trackDraft\"\n >\n <fieldset\n *ngIf=\"(i === 0 || isRange) && (hasTime || viewMode === 'manual')\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-label]=\"isRange ? t(i === 0 ? 'start' : 'end') : null\"\n >\n <legend *ngIf=\"isRange\">\n <ng-container\n *ngIf=\"\n i === 1 && hasDate && viewMode === 'manual';\n else endpointLabel\n \"\n >\n <span class=\"end-view-toggle\">\n <button\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"endView === 'date'\"\n (click)=\"toggleEndView('date')\"\n >\n {{ t(\"end\") }}\n </button>\n <button\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"endView === 'days'\"\n (click)=\"toggleEndView('days')\"\n >\n {{ inDaysLabel }}\n </button>\n </span>\n </ng-container>\n <ng-template #endpointLabel>{{\n t(i === 0 ? \"start\" : \"end\")\n }}</ng-template>\n </legend>\n <div\n *ngIf=\"\n i === 1 && hasDate && viewMode === 'manual' && endView === 'days'\n \"\n class=\"date-fields in-days-fields\"\n >\n <span class=\"resulting-end-date\" [attr.aria-label]=\"t('endDate')\">{{\n resultingEndDate\n }}</span>\n <wkly-field\n [label]=\"t('days')\"\n [hideLabel]=\"true\"\n [previousLabel]=\"t('daysPrevious')\"\n [nextLabel]=\"t('daysNext')\"\n [locale]=\"effectiveLocale\"\n [value]=\"inDays\"\n [min]=\"-9999\"\n [max]=\"9999\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"days($event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n </div>\n <div\n *ngIf=\"\n hasDate && viewMode === 'manual' && (i === 0 || endView === 'date')\n \"\n class=\"date-fields\"\n >\n <wkly-field\n [label]=\"t('day')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.day\"\n [min]=\"1\"\n [max]=\"31\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'day', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('month')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.month\"\n [min]=\"1\"\n [max]=\"monthCount(draft)\"\n [labels]=\"months(draft)\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'month', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('year')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.year\"\n [min]=\"adapter.supportedYearRange[0]\"\n [max]=\"adapter.supportedYearRange[1]\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'year', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n </div>\n <div\n *ngIf=\"hasTime\"\n class=\"time-fields\"\n [class.seconds]=\"this[WklyPickerInputsPropertyKeys.ShowSeconds]\"\n >\n <wkly-field\n [label]=\"t('hour')\"\n [locale]=\"effectiveLocale\"\n [value]=\"displayHour(draft)\"\n [min]=\"effectiveHourCycle === 'h12' ? 1 : 0\"\n [max]=\"effectiveHourCycle === 'h12' ? 12 : 23\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'hour', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('minute')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.minute\"\n [max]=\"59\"\n [step]=\"\n this[WklyPickerInputsPropertyKeys.MinuteStep] > 0 &&\n 60 % this[WklyPickerInputsPropertyKeys.MinuteStep] === 0\n ? this[WklyPickerInputsPropertyKeys.MinuteStep]\n : 1\n \"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'minute', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n *ngIf=\"this[WklyPickerInputsPropertyKeys.ShowSeconds]\"\n [label]=\"t('second')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.second\"\n [max]=\"59\"\n [step]=\"\n this[WklyPickerInputsPropertyKeys.SecondStep] > 0 &&\n 60 % this[WklyPickerInputsPropertyKeys.SecondStep] === 0\n ? this[WklyPickerInputsPropertyKeys.SecondStep]\n : 1\n \"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'second', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <div class=\"period\">\n <button\n *ngIf=\"\n effectiveHourCycle === 'h12' ||\n this[WklyPickerInputsPropertyKeys.HourCycle] === 'switchable'\n \"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"\n effectiveHourCycle === 'h12' && (draft.hour || 0) < 12\n \"\n (click)=\"period(i, 'am')\"\n >\n {{ t(\"am\") }}</button\n ><button\n type=\"button\"\n [disabled]=\"\n this[WklyPickerInputsPropertyKeys.Disabled] ||\n this[WklyPickerInputsPropertyKeys.HourCycle] !== 'switchable'\n \"\n [attr.aria-pressed]=\"effectiveHourCycle === 'h24'\"\n (click)=\"period(i, '24')\"\n >\n 24</button\n ><button\n *ngIf=\"\n effectiveHourCycle === 'h12' ||\n this[WklyPickerInputsPropertyKeys.HourCycle] === 'switchable'\n \"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"\n effectiveHourCycle === 'h12' && (draft.hour || 0) >= 12\n \"\n (click)=\"period(i, 'pm')\"\n >\n {{ t(\"pm\") }}\n </button>\n </div>\n </div>\n </fieldset>\n </ng-container>\n <div class=\"validation\" role=\"status\" aria-live=\"polite\">\n <p *ngFor=\"let err of errors\">! {{ t(err.messageKey) }}</p>\n </div>\n <footer *ngIf=\"submitVisible\">\n <button\n type=\"button\"\n class=\"confirm\"\n [disabled]=\"!canSubmit\"\n (click)=\"submit()\"\n >\n {{ t(\"confirm\") }}\n </button>\n </footer>\n</section>\n", styles: [":host{display:block;width:100%;box-sizing:border-box;--wkly-background-color: #fff;--wkly-background-color-alternate: #fafafa;--wkly-text-color: #192c28;--wkly-muted-color: #52635e;--wkly-border-color: #dce5e1;--wkly-accent-color: #176c55;--wkly-accent-color-alternate: #6ea494;--wkly-accent-text-color: #fff;--wkly-range-color: #e5f1ee;--wkly-error-color: #b42318;--wkly-focus-color: #245bd6;--wkly-size-multiplier: 1;--wkly-size-unit: 3.5em;color:var(--wkly-text-color);font:14px/1.4 system-ui,sans-serif;container-type:inline-size}.wkly{background:var(--wkly-background-color);border:1px solid var(--wkly-border-color);border-radius:14px;overflow:hidden;min-width:0;font-size:calc(14px*clamp(1,var(--wkly-size-multiplier),1.5))}button{font:inherit;color:inherit;min-width:var(--wkly-size-unit);min-height:var(--wkly-size-unit);border:0;background:transparent;border-radius:8px;cursor:pointer}@media (hover: hover) and (pointer: fine){button:hover:not(:disabled):not([aria-disabled=\"true\"]):not(.selected){background:var(--wkly-accent-color-alternate)}}button:disabled,button[aria-disabled=true]{opacity:.4;cursor:default}button:focus-visible{outline:2px solid var(--wkly-focus-color);outline-offset:-2px}.toolbar{display:flex;align-items:center;padding:8px;gap:3px;border-bottom:1px solid var(--wkly-border-color)}.spacer{flex:1}.year-control{padding:0 6px;font-weight:650;text-align:start;line-height:1.2}.now{color:var(--wkly-accent-color);font-weight:650}.week-head,.week-row{display:grid;grid-template-columns:28px repeat(7,minmax(0,1fr))}.week-head{font-size:.85em;color:var(--wkly-muted-color);height:34px;align-items:center;text-align:center}.week-row{height:calc(var(--wkly-size-unit) * clamp(1,var(--wkly-size-multiplier),1));align-items:end}.no-label{grid-template-columns:repeat(7,minmax(0,1fr))}.week-scroll{overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;overflow-anchor:none;scrollbar-width:thin;max-height:65vh;touch-action:pan-y}.scroll-space{position:relative}.rows{position:absolute;left:0;right:0}.week-number{font-size:.85em;text-align:center;align-self:end;line-height:var(--wkly-size-unit);color:var(--wkly-muted-color)}[role=gridcell]{position:relative;min-width:0;height:var(--wkly-size-unit);text-align:center}[role=gridcell].odd-month:not(.range):not(.today){background:var(--wkly-background-color-alternate)}.day{width:100%;min-width:0;height:var(--wkly-size-unit);padding:0;border-radius:8px}.annotation{position:absolute;bottom:.25em;white-space:nowrap;font-size:1.25em;font-weight:650;line-height:1;pointer-events:none;z-index:1;color:var(--wkly-muted-color);color:color-mix(in srgb,var(--wkly-muted-color) 50%,transparent);text-shadow:0 0 2px --wkly-background-color,0 0 4px --wkly-background-color}.odd-month .annotation{text-shadow:0 0 2px --wkly-background-color-alternate,0 0 4px --wkly-background-color-alternate}.annotation:empty{display:none}.annotation--0{inset-inline-start:10%;bottom:1.75em}.annotation--1{inset-inline-start:-5%}.annotation--2{inset-inline-start:-20%}.annotation--3{inset-inline-start:-50%;inset-inline-end:-50%}.annotation--4{inset-inline-end:-20%}.annotation--5{inset-inline-end:-5%}.annotation--6{inset-inline-end:10%}.range{background:var(--wkly-range-color)}.day.selected{background:var(--wkly-accent-color);color:var(--wkly-accent-text-color);font-weight:700}.today:after{content:\"\";display:block;width:5px;height:5px;background:currentColor;border-radius:50%;position:absolute;bottom:2px;left:calc(50% - 2px)}.today{font-weight:750;box-shadow:inset 0 0 0 1px var(--wkly-accent-color)}.hidden{visibility:hidden}.week-navigation{display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--wkly-border-color);font-size:.85em;color:var(--wkly-muted-color)}fieldset{border:0;padding:0 12px;margin:0;min-width:0}legend{padding-top:.85em;font-weight:650;color:var(--wkly-accent-color)}.date-fields{display:grid;grid-template-columns:1fr 2fr 1.4fr;grid-gap:7px;gap:7px;padding:12px 0}.end-view-toggle{display:inline-flex}.end-view-toggle button{min-height:0;min-width:0;padding:0 6px;border-radius:0;line-height:inherit}.end-view-toggle button:first-child{padding-inline-start:0}.end-view-toggle button+button{border-inline-start:1px solid var(--wkly-text-color)}.end-view-toggle button[aria-pressed=false]{color:var(--wkly-muted-color);font-weight:400}.in-days-fields{grid-template-columns:minmax(0,1fr);gap:0;text-align:center}.resulting-end-date{font-size:11px;color:var(--wkly-muted-color);height:1.4em;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.time-fields{display:grid;grid-template-columns:1fr 1fr 52px;grid-gap:8px;gap:8px;padding:14px 0;border-top:1px solid var(--wkly-border-color)}.time-fields.seconds{grid-template-columns:1fr 1fr 1fr 48px}.period{display:flex;flex-direction:column;justify-content:center;gap:2px;padding-top:1.25em}.period button{font-size:.85em}.period [aria-pressed=true]{background:var(--wkly-range-color);box-shadow:inset 0 0 0 1px var(--wkly-accent-color);font-weight:700}.validation{color:var(--wkly-error-color);font-size:.85em}.validation p{margin:.5em .85em}footer{padding:12px;border-top:1px solid var(--wkly-border-color)}.confirm{background:var(--wkly-accent-color);color:var(--wkly-accent-text-color);width:100%;font-weight:650}@media (forced-colors: active){.day.selected{outline:2px solid Highlight}.range{border-bottom:2px solid Highlight}.today{outline:1px dashed CanvasText}}@media (prefers-reduced-motion: reduce){*{scroll-behavior:auto!important;animation:none!important}}\n"] }]
938
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
939
+ type: Inject,
940
+ args: [LOCALE_ID]
941
+ }] }, { type: undefined, decorators: [{
942
+ type: Inject,
943
+ args: [WKLY_CONFIG]
944
+ }] }, { type: undefined, decorators: [{
945
+ type: Inject,
946
+ args: [WKLY_CLOCK]
947
+ }] }, { type: undefined, decorators: [{
948
+ type: Inject,
949
+ args: [WKLY_LOCALIZATION]
950
+ }] }, { type: undefined, decorators: [{
951
+ type: Inject,
952
+ args: [WKLY_TRANSLATIONS]
953
+ }] }, { type: Object, decorators: [{
954
+ type: Inject,
955
+ args: [PLATFORM_ID]
956
+ }] }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { scroller: [{
957
+ type: ViewChild,
958
+ args: ["scroller"]
959
+ }] } });
960
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3drbHktZGF0ZXRpbWUtcGlja2VyLjEzL3NyYy9waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vcHJvamVjdHMvd2tseS1kYXRldGltZS1waWNrZXIuMTMvc3JjL3BpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixTQUFTLEVBSVQsV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RSxPQUFPLEVBR0wsYUFBYSxFQUNiLGlCQUFpQixHQUdsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxjQUFjLEVBQ2QsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixPQUFPLEdBR1IsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUlqQiw0QkFBNEIsR0FHN0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLGNBQWMsRUFDZCxjQUFjLEdBR2YsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsYUFBYSxFQUNiLFVBQVUsRUFDVixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUtqQixnQkFBZ0IsRUFDaEIsNEJBQTRCLEVBQzVCLDZCQUE2QixHQUc5QixNQUFNLFVBQVUsQ0FBQzs7OztBQXVCbEIsTUFBTSxPQUFPLDJCQUNYLFNBQVEsZ0JBQWdCO0lBc0R4QixZ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MkIsa0JBd0Q1QixTQUFTLGFBQ1QsV0FBVyxhQUNYLFVBQVUsYUFDVixpQkFBaUIsYUFDakIsaUJBQWlCLGFBQ2pCLFdBQVc7NEdBN0RWLDJCQUEyQiwrQ0FiM0I7UUFDVDtZQUNFLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztZQUMxRCxLQUFLLEVBQUUsSUFBSTtTQUNaO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsYUFBYTtZQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDO1lBQzFELEtBQUssRUFBRSxJQUFJO1NBQ1o7S0FDRiw0S0MxRkgsNjBhQStYQTsyRkRuU2EsMkJBQTJCO2tCQWpCdkMsU0FBUzsrQkFDRSxzQkFBc0IsYUFHckI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsNEJBQTRCLENBQUM7NEJBQzFELEtBQUssRUFBRSxJQUFJO3lCQUNaO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSxhQUFhOzRCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSw0QkFBNEIsQ0FBQzs0QkFDMUQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7OzBCQTBERSxNQUFNOzJCQUFDLFNBQVM7OzBCQUNoQixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixNQUFNOzJCQUFDLFVBQVU7OzBCQUNqQixNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQ3hCLE1BQU07MkJBQUMsaUJBQWlCOzhCQUNNLE1BQU07MEJBQXBDLE1BQU07MkJBQUMsV0FBVztxR0FuREUsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBXa2x5SG91ckN5Y2xlIH0gZnJvbSBcIkB3a2x5L2FkYXB0ZXJzXCI7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmLFxuICBJbmplY3QsXG4gIExPQ0FMRV9JRCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgUExBVEZPUk1fSUQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrLCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3IsXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHtcbiAgYWJzb2x1dGVXZWVrT2YsXG4gIGNyZWF0ZVdlZWtHZW5lcmF0b3IsXG4gIGZpcnN0RXBvY2hEYXlPZixcbiAgaW50ZWdlcixcbiAgV2tseVdlZWtHZW5lcmF0b3IsXG4gIFdrbHlXZWVrT2Zmc2V0LFxufSBmcm9tIFwiQHdrbHkvY29yZVwiO1xuaW1wb3J0IHtcbiAgZGVjb2RlSXNvLFxuICBlcnJvcixcbiAgcmVzb2x2ZVdlZWtPZmZzZXQsXG4gIHZhbGlkYXRlU2VsZWN0aW9uLFxuICBXa2x5Q2FsZW5kYXJBZGFwdGVyLFxuICBXa2x5Q2FsZW5kYXJEYXRlLFxuICBXa2x5RGF0ZVRpbWUsXG4gIFdrbHlHcmVnb3JpYW5DYWxlbmRhckFkYXB0ZXIsXG4gIFdrbHlQaWNrZXJWYWx1ZSxcbiAgV2tseVZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkB3a2x5L2FkYXB0ZXJzXCI7XG5pbXBvcnQge1xuICBkcmFmdERheURpZmZlcmVuY2UsXG4gIHNldERyYWZ0RGF5RGlmZmVyZW5jZSxcbiAgY2FsZW5kYXJNb250aEJvdW5kcyxcbiAgcmVzb2x2ZVdrbHlUcmFuc2xhdGlvbixcbiAgY3JlYXRlV2Vla1Jvd3MsXG4gIHZhbGlkYXRlRHJhZnRzLFxuICBXa2x5RHJhZnQgYXMgRHJhZnQsXG4gIFdrbHlXZWVrUm93IGFzIFJvdyxcbn0gZnJvbSBcIkB3a2x5L3ByZXNlbnRhdGlvblwiO1xuaW1wb3J0IHtcbiAgY29lcmNlQm9vbGVhbixcbiAgV0tMWV9DTE9DSyxcbiAgV0tMWV9DT05GSUcsXG4gIFdLTFlfTE9DQUxJWkFUSU9OLFxuICBXS0xZX1RSQU5TTEFUSU9OUyxcbiAgV2tseUNsb2NrLFxuICBXa2x5Q2xvc2VSZWFzb24sXG4gIFdrbHlDb25maWd1cmF0aW9uLFxuICBXa2x5SnVtcE9wdGlvbnMsXG4gIFdrbHlQaWNrZXJJbnB1dHMsXG4gIFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMsXG4gIFdrbHlQaWNrZXJPdXRwdXRzUHJvcGVydHlLZXlzLFxuICBXa2x5U3RyaW5ncyxcbiAgV2tseVRyYW5zbGF0aW9ucyxcbn0gZnJvbSBcIi4vY29uZmlnXCI7XG5kZWNsYXJlIGNsYXNzIFJlc2l6ZU9ic2VydmVyIHtcbiAgY29uc3RydWN0b3IoY2FsbGJhY2s6ICgpID0+IHZvaWQpO1xuICBvYnNlcnZlKGVsZW1lbnQ6IEVsZW1lbnQpOiB2b2lkO1xuICBkaXNjb25uZWN0KCk6IHZvaWQ7XG59XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwid2tseS1kYXRldGltZS1waWNrZXJcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9waWNrZXIuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuLi8uLi93a2x5LWRhdGV0aW1lLXBpY2tlci9zcmMvcGlja2VyLmNvbXBvbmVudC5jc3NcIl0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gV2tseURhdGVUaW1lUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFdrbHlEYXRlVGltZVBpY2tlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBXa2x5RGF0ZVRpbWVQaWNrZXJDb21wb25lbnRcbiAgZXh0ZW5kcyBXa2x5UGlja2VySW5wdXRzXG4gIGltcGxlbWVudHNcbiAgICBPbkluaXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgT25EZXN0cm95LFxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIFZhbGlkYXRvclxue1xuICBAVmlld0NoaWxkKFwic2Nyb2xsZXJcIikgc2Nyb2xsZXI/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgcHJlc2VudGF0aW9uOiBcImlubGluZVwiIHwgXCJ0cmFuc2llbnRcIiA9IFwiaW5saW5lXCI7XG4gIHZpZXdNb2RlOiBcImNhbGVuZGFyXCIgfCBcIm1hbnVhbFwiID0gXCJjYWxlbmRhclwiO1xuICBlbmRWaWV3OiBcImRhdGVcIiB8IFwiZGF5c1wiID0gXCJkYXRlXCI7XG4gIGFkYXB0ZXIhOiBXa2x5Q2FsZW5kYXJBZGFwdGVyO1xuICBlZmZlY3RpdmVMb2NhbGUgPSBcImVuLVVTXCI7XG4gIGVmZmVjdGl2ZU9mZnNldDogV2tseVdlZWtPZmZzZXQgPSAwO1xuICBlZmZlY3RpdmVIb3VyQ3ljbGU6IFwiaDEyXCIgfCBcImgyNFwiID0gXCJoMjRcIjtcbiAgcHJpdmF0ZSBjb25maWd1cmVkSG91ckN5Y2xlPzogV2tseUhvdXJDeWNsZTtcbiAgZGlyZWN0aW9uID0gXCJsdHJcIjtcbiAgcm93czogUm93W10gPSBbXTtcbiAgd2Vla2RheXM6IHN0cmluZ1tdID0gW107XG4gIGRyYWZ0czogRHJhZnRbXSA9IFtdO1xuICBlcnJvcnM6IHJlYWRvbmx5IFdrbHlWYWxpZGF0aW9uRXJyb3JbXSA9IFtdO1xuICB0b2RheSA9IDA7XG4gIGZvY3VzZWQgPSAwO1xuICBhbmNob3JXZWVrID0gMDtcbiAgZmlyc3RXZWVrID0gMDtcbiAgdmlzaWJsZUNvdW50ID0gNjtcbiAgcm93SGVpZ2h0ID0gNzY7XG4gIHNjcm9sbEhlaWdodCA9IDE1MjA3NjtcbiAgcGFkZGluZ1RvcCA9IDA7XG4gIGluaXRpYWxpemVkID0gZmFsc2U7XG4gIGNvbXBhY3QgPSBmYWxzZTtcbiAgcmVhZG9ubHkgV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cyA9IFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXM7XG4gIHByaXZhdGUgYmFzZVdlZWsgPSAwO1xuICBwcml2YXRlIGZpcnN0U3VwcG9ydGVkRGF5ID0gMDtcbiAgcHJpdmF0ZSBsYXN0U3VwcG9ydGVkRGF5ID0gMDtcbiAgcHJpdmF0ZSBmaXJzdFN1cHBvcnRlZFdlZWsgPSAwO1xuICBwcml2YXRlIGxhc3RTdXBwb3J0ZWRXZWVrID0gMDtcbiAgcHJpdmF0ZSBnZW5lcmF0b3IhOiBXa2x5V2Vla0dlbmVyYXRvcjtcbiAgcHJpdmF0ZSBpbml0aWFsTW9udGggPSBcIlwiO1xuICBwcml2YXRlIGNsaXBNb250aCA9IGZhbHNlO1xuICBwcml2YXRlIGJyb3dzZXIgPSBmYWxzZTtcbiAgcHJpdmF0ZSBvYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xuICBwcml2YXRlIHNjcm9sbEVuZFRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgc25hcFBlbmRpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBXa2x5UGlja2VyVmFsdWUpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSB2YWxpZGF0b3JDaGFuZ2VkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgY29uZmlnRXJyb3JzOiBXa2x5VmFsaWRhdGlvbkVycm9yW10gPSBbXTtcbiAgcHJpdmF0ZSBwZW5kaW5nVmFsdWU6IFdrbHlQaWNrZXJWYWx1ZSA9IG51bGw7XG4gIHByaXZhdGUgZW1pdHRlZFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtYW51YWxEYXRlRW5kcG9pbnQgPSAwO1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KExPQ0FMRV9JRCkgcHJpdmF0ZSBkZWZhdWx0TG9jYWxlOiBzdHJpbmcsXG4gICAgQEluamVjdChXS0xZX0NPTkZJRykgcHJpdmF0ZSBkZWZhdWx0czogV2tseUNvbmZpZ3VyYXRpb24sXG4gICAgQEluamVjdChXS0xZX0NMT0NLKSBwcml2YXRlIGNsb2NrOiBXa2x5Q2xvY2ssXG4gICAgQEluamVjdChXS0xZX0xPQ0FMSVpBVElPTikgcHJpdmF0ZSBzdHJpbmdzOiBXa2x5U3RyaW5ncyxcbiAgICBASW5qZWN0KFdLTFlfVFJBTlNMQVRJT05TKSBwcml2YXRlIGRlZmF1bHRUcmFuc2xhdGlvbnM6IFdrbHlUcmFuc2xhdGlvbnMsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm06IE9iamVjdCxcbiAgICBwcml2YXRlIGhvc3Q6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtKTtcbiAgfVxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgfVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgaWYgKFxuICAgICAgICBPYmplY3Qua2V5cyhjaGFuZ2VzKS5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgY2hhbmdlc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZhbHVlXSAmJlxuICAgICAgICB0aGlzLmVtaXR0ZWRWYWx1ZSA9PT1cbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWVdKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlZFZhbHVlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9jdXMgPSB0aGlzLmZvY3VzZWQ7XG4gICAgICB0aGlzLmNvbmZpZ3VyZSgpO1xuICAgICAgaWYgKFxuICAgICAgICBjaGFuZ2VzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWVdIHx8XG4gICAgICAgIGNoYW5nZXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXSB8fFxuICAgICAgICBjaGFuZ2VzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuQ2FsZW5kYXJBZGFwdGVyXVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubG9hZCh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWVdKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbih0aGlzLmZvY3VzZWQsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jaGVjaygpO1xuICAgICAgICBpZiAoY2hhbmdlc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZpZXdwb3J0UHJlc2V0XSlcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uKGZvY3VzLCB0cnVlKTtcbiAgICAgICAgZWxzZSB0aGlzLnNjcm9sbFRvRXBvY2hEYXkoZm9jdXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSByZXR1cm47XG4gICAgdGhpcy5jb25maWd1cmUoKTtcbiAgICBjb25zdCBpbml0aWFsRXBvY2hEYXkgPSB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuSW5pdGlhbEVwb2NoRGF5XTtcbiAgICB0aGlzLnRvZGF5ID0gdGhpcy5icm93c2VyXG4gICAgICA/IE1hdGguZmxvb3IodGhpcy5jbG9jay5ub3coKS5nZXRUaW1lKCkgLyA4NjQwMDAwMClcbiAgICAgIDogaW5pdGlhbEVwb2NoRGF5ID09PSBudWxsXG4gICAgICAgID8gMFxuICAgICAgICA6IGluaXRpYWxFcG9jaERheTtcbiAgICB0aGlzLmZvY3VzZWQgPVxuICAgICAgaW5pdGlhbEVwb2NoRGF5ID09PSBudWxsXG4gICAgICAgID8gdGhpcy5kZWZhdWx0cy5pbml0aWFsRXBvY2hEYXkgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdGhpcy50b2RheVxuICAgICAgICAgIDogdGhpcy5kZWZhdWx0cy5pbml0aWFsRXBvY2hEYXlcbiAgICAgICAgOiBpbml0aWFsRXBvY2hEYXk7XG4gICAgdGhpcy5sb2FkKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WYWx1ZV0pO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMucG9zaXRpb24odGhpcy5mb2N1c2VkLCB0cnVlKTtcbiAgfVxuICBjb25maWd1cmUoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWdFcnJvcnMgPSBbXTtcbiAgICBbXG4gICAgICBXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNob3dTZWNvbmRzLFxuICAgICAgV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5BbGxvd1JhbmdlQWNyb3NzRGlzYWJsZWQsXG4gICAgICBXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlJlcXVpcmVkLFxuICAgICAgV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZCxcbiAgICAgIFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuQ2xvc2VPbkJhY2tkcm9wLFxuICAgIF0uZm9yRWFjaChcbiAgICAgIChrZXkpID0+ICgodGhpcyBhcyBhbnkpW2tleV0gPSBjb2VyY2VCb29sZWFuKCh0aGlzIGFzIGFueSlba2V5XSkpLFxuICAgICk7XG4gICAgdGhpcy5lZmZlY3RpdmVMb2NhbGUgPVxuICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkxvY2FsZV0gfHxcbiAgICAgIHRoaXMuZGVmYXVsdHMubG9jYWxlIHx8XG4gICAgICB0aGlzLmRlZmF1bHRMb2NhbGU7XG4gICAgdGhpcy5kaXJlY3Rpb24gPSAvXihhcnxoZXxmYXx1cikoLXwkKS8udGVzdCh0aGlzLmVmZmVjdGl2ZUxvY2FsZSlcbiAgICAgID8gXCJydGxcIlxuICAgICAgOiBcImx0clwiO1xuICAgIHRoaXMuYWRhcHRlciA9XG4gICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuQ2FsZW5kYXJBZGFwdGVyXSB8fFxuICAgICAgbmV3IFdrbHlHcmVnb3JpYW5DYWxlbmRhckFkYXB0ZXIodGhpcy5lZmZlY3RpdmVMb2NhbGUpO1xuICAgIHRyeSB7XG4gICAgICBsZXQgZmlyc3REYXk6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZpcnN0RGF5ID0gZ2V0TG9jYWxlRmlyc3REYXlPZldlZWsodGhpcy5lZmZlY3RpdmVMb2NhbGUpO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIHRoaXMuZWZmZWN0aXZlT2Zmc2V0ID0gcmVzb2x2ZVdlZWtPZmZzZXQoXG4gICAgICAgIHRoaXMuZWZmZWN0aXZlTG9jYWxlLFxuICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla09mZnNldF0sXG4gICAgICAgIHRoaXMuZGVmYXVsdHMud2Vla09mZnNldCxcbiAgICAgICAgZmlyc3REYXksXG4gICAgICApO1xuICAgICAgaW50ZWdlcih0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0NhY2hlU2l6ZV0pO1xuICAgICAgaW50ZWdlcih0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuT3ZlcnNjYW5XZWVrc10pO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0NhY2hlU2l6ZV0gPCAwIHx8XG4gICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5PdmVyc2NhbldlZWtzXSA8IDAgfHxcbiAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk92ZXJzY2FuV2Vla3NdID4gNTBcbiAgICAgIClcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoKTtcbiAgICAgIGlmIChcbiAgICAgICAgIVtcbiAgICAgICAgICBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgXCJkYXRlXCIsXG4gICAgICAgICAgXCJ0aW1lXCIsXG4gICAgICAgICAgXCJkYXRldGltZS1yYW5nZVwiLFxuICAgICAgICAgIFwiZGF0ZS1yYW5nZVwiLFxuICAgICAgICAgIFwidGltZS1yYW5nZVwiLFxuICAgICAgICBdLmluY2x1ZGVzKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXSlcbiAgICAgIClcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoKTtcbiAgICAgIGNvbnN0IHByZXNldCA9IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WaWV3cG9ydFByZXNldF07XG4gICAgICBpZiAocHJlc2V0LmtpbmQgPT09IFwid2Vla3NcIikge1xuICAgICAgICBpbnRlZ2VyKHByZXNldC52aXNpYmxlV2Vla0NvdW50KTtcbiAgICAgICAgaWYgKHByZXNldC52aXNpYmxlV2Vla0NvdW50IDwgMSB8fCBwcmVzZXQudmlzaWJsZVdlZWtDb3VudCA+IDUyKVxuICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCk7XG4gICAgICB9XG4gICAgICBpZiAocHJlc2V0LmtpbmQgPT09IFwiZnVsbC1tb250aC1hbmQtYXJvdW5kXCIpXG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBbXG4gICAgICAgICAgcHJlc2V0LmV4dHJhV2Vla3NCZWZvcmUgfHwgMCxcbiAgICAgICAgICBwcmVzZXQuZXh0cmFXZWVrc0FmdGVyIHx8IDAsXG4gICAgICAgIF0pIHtcbiAgICAgICAgICBpbnRlZ2VyKG4pO1xuICAgICAgICAgIGlmIChuIDwgMCB8fCBuID4gNTIpIHRocm93IG5ldyBSYW5nZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIHRoaXMuZ2VuZXJhdG9yID0gY3JlYXRlV2Vla0dlbmVyYXRvcih7XG4gICAgICAgIHdlZWtPZmZzZXQ6IHRoaXMuZWZmZWN0aXZlT2Zmc2V0LFxuICAgICAgICBjYWNoZVNpemU6IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrQ2FjaGVTaXplXSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHRoaXMuY29uZmlnRXJyb3JzLnB1c2goXG4gICAgICAgIGVycm9yKFxuICAgICAgICAgIFwiY29uZmlndXJhdGlvbi1lcnJvclwiLFxuICAgICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrT2Zmc2V0XSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmdlbmVyYXRvciA9IGNyZWF0ZVdlZWtHZW5lcmF0b3IoKTtcbiAgICAgIHRoaXMuZWZmZWN0aXZlT2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgdGhpcy5zZXRTdXBwb3J0ZWRTY3JvbGxSYW5nZSgpO1xuICAgIGNvbnN0IGhvdXJDeWNsZSA9IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Ib3VyQ3ljbGVdO1xuICAgIC8vIEhvc3QgdmFsdWUvY29uZmlndXJhdGlvbiBmZWVkYmFjayBtdXN0IHJldGFpbiB0aGUgdXNlcidzIHN3aXRjaGFibGUgZm9ybWF0LlxuICAgIGlmIChob3VyQ3ljbGUgIT09IFwic3dpdGNoYWJsZVwiIHx8IHRoaXMuY29uZmlndXJlZEhvdXJDeWNsZSAhPT0gaG91ckN5Y2xlKSB7XG4gICAgICB0aGlzLmVmZmVjdGl2ZUhvdXJDeWNsZSA9XG4gICAgICAgIGhvdXJDeWNsZSA9PT0gXCJoMTJcIlxuICAgICAgICAgID8gXCJoMTJcIlxuICAgICAgICAgIDogaG91ckN5Y2xlID09PSBcImxvY2FsZVwiXG4gICAgICAgICAgICA/IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMuZWZmZWN0aXZlTG9jYWxlLCB7XG4gICAgICAgICAgICAgICAgaG91cjogXCJudW1lcmljXCIsXG4gICAgICAgICAgICAgICAgdGltZVpvbmU6IFwiVVRDXCIsXG4gICAgICAgICAgICAgIH0pLnJlc29sdmVkT3B0aW9ucygpLmhvdXIxMlxuICAgICAgICAgICAgICA/IFwiaDEyXCJcbiAgICAgICAgICAgICAgOiBcImgyNFwiXG4gICAgICAgICAgICA6IFwiaDI0XCI7XG4gICAgfVxuICAgIHRoaXMuY29uZmlndXJlZEhvdXJDeWNsZSA9IGhvdXJDeWNsZTtcbiAgICB0aGlzLndlZWtkYXlzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogNyB9LCAoXywgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5mb3JtYXRXZWVrZGF5KHRoaXMuZWZmZWN0aXZlT2Zmc2V0ICsgaSwgXCJzaG9ydFwiKSxcbiAgICApO1xuICB9XG4gIHByaXZhdGUgc2V0U3VwcG9ydGVkU2Nyb2xsUmFuZ2UoKTogdm9pZCB7XG4gICAgbGV0IFtmaXJzdCwgbGFzdF0gPSB0aGlzLmFkYXB0ZXIuc3VwcG9ydGVkRXBvY2hEYXlSYW5nZTtcbiAgICBjb25zdCBbZmlyc3RZZWFyLCBsYXN0WWVhcl0gPSB0aGlzLmFkYXB0ZXIuc3VwcG9ydGVkWWVhclJhbmdlO1xuICAgIGNvbnN0IHllYXJPZiA9IChkYXk6IG51bWJlcikgPT4gdGhpcy5hZGFwdGVyLmVwb2NoRGF5VG9EYXRlKGRheSkueWVhcjtcbiAgICBpZiAoeWVhck9mKGZpcnN0KSA8IGZpcnN0WWVhcikge1xuICAgICAgbGV0IGxvdyA9IGZpcnN0LFxuICAgICAgICBoaWdoID0gbGFzdDtcbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IE1hdGguZmxvb3IoKGxvdyArIGhpZ2gpIC8gMik7XG4gICAgICAgIGlmICh5ZWFyT2YobWlkKSA8IGZpcnN0WWVhcikgbG93ID0gbWlkICsgMTtcbiAgICAgICAgZWxzZSBoaWdoID0gbWlkO1xuICAgICAgfVxuICAgICAgZmlyc3QgPSBsb3c7XG4gICAgfVxuICAgIGlmICh5ZWFyT2YobGFzdCkgPiBsYXN0WWVhcikge1xuICAgICAgbGV0IGxvdyA9IGZpcnN0LFxuICAgICAgICBoaWdoID0gbGFzdDtcbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IE1hdGguY2VpbCgobG93ICsgaGlnaCkgLyAyKTtcbiAgICAgICAgaWYgKHllYXJPZihtaWQpID4gbGFzdFllYXIpIGhpZ2ggPSBtaWQgLSAxO1xuICAgICAgICBlbHNlIGxvdyA9IG1pZDtcbiAgICAgIH1cbiAgICAgIGxhc3QgPSBsb3c7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGZpcnN0ID4gbGFzdCB8fFxuICAgICAgeWVhck9mKGZpcnN0KSA8IGZpcnN0WWVhciB8fFxuICAgICAgeWVhck9mKGZpcnN0KSA+IGxhc3RZZWFyIHx8XG4gICAgICB5ZWFyT2YobGFzdCkgPCBmaXJzdFllYXIgfHxcbiAgICAgIHllYXJPZihsYXN0KSA+IGxhc3RZZWFyXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJObyBzdXBwb3J0ZWQgZGF5cyB3aXRoaW4gdGhlIGNhbGVuZGFyIHllYXIgcmFuZ2VcIik7XG4gICAgdGhpcy5maXJzdFN1cHBvcnRlZERheSA9IGZpcnN0O1xuICAgIHRoaXMubGFzdFN1cHBvcnRlZERheSA9IGxhc3Q7XG4gICAgdGhpcy5maXJzdFN1cHBvcnRlZFdlZWsgPSBhYnNvbHV0ZVdlZWtPZihmaXJzdCwgdGhpcy5lZmZlY3RpdmVPZmZzZXQpO1xuICAgIHRoaXMubGFzdFN1cHBvcnRlZFdlZWsgPSBhYnNvbHV0ZVdlZWtPZihsYXN0LCB0aGlzLmVmZmVjdGl2ZU9mZnNldCk7XG4gIH1cbiAgcHJpdmF0ZSBjbGFtcEZpcnN0V2Vlayh3ZWVrOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIEtlZXAgc3VwcG9ydGVkIHdlZWtzIGluc2lkZSB0aGUgdmlld3BvcnQ7IHJlbmRlclJvd3MgYWRkcyB0aGUgYnVmZmVyIHJvd3MuXG4gICAgY29uc3QgbGFzdCA9IE1hdGgubWF4KFxuICAgICAgdGhpcy5maXJzdFN1cHBvcnRlZFdlZWssXG4gICAgICB0aGlzLmxhc3RTdXBwb3J0ZWRXZWVrIC0gdGhpcy52aXNpYmxlQ291bnQgKyAxLFxuICAgICk7XG4gICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuZmlyc3RTdXBwb3J0ZWRXZWVrLCBNYXRoLm1pbihsYXN0LCB3ZWVrKSk7XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRTY3JvbGwoKTtcbiAgICBpZiAodGhpcy5icm93c2VyICYmIHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgIHRoaXMuY29tcGFjdCA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIDwgMzM4O1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIFwiLndlZWstcm93XCIsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIC8vIENTUyBoZWlnaHRzIGFuZCBzY3JvbGxUb3AgdXNlIGxheW91dCBwaXhlbHM7IGNsaWVudCByZWN0YW5nbGVzIGluY2x1ZGUgem9vbS5cbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcm93ID8gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKHJvdykuaGVpZ2h0KSA6IDA7XG4gICAgICAgIGlmIChoZWlnaHQgJiYgaGVpZ2h0ICE9PSB0aGlzLnJvd0hlaWdodCkge1xuICAgICAgICAgIHRoaXMucm93SGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICAgIHRoaXMuc2Nyb2xsSGVpZ2h0ID0gdGhpcy5yb3dIZWlnaHQgKiAyMDAxO1xuICAgICAgICAgIHRoaXMucmVuZGVyUm93cygpO1xuICAgICAgICAgIHRoaXMucmVzZXRTY3JvbGwoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgfVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIGlmICh0aGlzLnNjcm9sbEVuZFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxFbmRUaW1lcik7XG4gICAgaWYgKHRoaXMuZ2VuZXJhdG9yKSB0aGlzLmdlbmVyYXRvci5jbGVhckNhY2hlKCk7XG4gIH1cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVXa2x5VHJhbnNsYXRpb24oXG4gICAgICBrZXksXG4gICAgICB0aGlzLmVmZmVjdGl2ZUxvY2FsZSxcbiAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5UcmFuc2xhdGlvbnNdIHx8XG4gICAgICAgIHRoaXMuZGVmYXVsdFRyYW5zbGF0aW9ucyxcbiAgICAgIHRoaXMuc3RyaW5ncyxcbiAgICApO1xuICB9XG4gIGdldCBpc1JhbmdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0uZW5kc1dpdGgoXCItcmFuZ2VcIik7XG4gIH1cbiAgZ2V0IGhhc0RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0uc3RhcnRzV2l0aChcInRpbWVcIik7XG4gIH1cbiAgZ2V0IGhhc1RpbWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXSAhPT0gXCJkYXRlXCIgJiZcbiAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXSAhPT0gXCJkYXRlLXJhbmdlXCJcbiAgICApO1xuICB9XG4gIGdldCBzdWJtaXRWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnByZXNlbnRhdGlvbiA9PT0gXCJ0cmFuc2llbnRcIiAmJlxuICAgICAgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXSAhPT0gXCJkYXRlXCIgfHxcbiAgICAgICAgdGhpcy52aWV3TW9kZSA9PT0gXCJtYW51YWxcIilcbiAgICApO1xuICB9XG4gIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkID0gdGhpcy5hZGFwdGVyLmVwb2NoRGF5VG9EYXRlKFxuICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5LFxuICAgICAgICAgIE1hdGgubWluKFxuICAgICAgICAgICAgdGhpcy5sYXN0U3VwcG9ydGVkRGF5LFxuICAgICAgICAgICAgZmlyc3RFcG9jaERheU9mKHRoaXMuYW5jaG9yV2VlaywgdGhpcy5lZmZlY3RpdmVPZmZzZXQpLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5mb3JtYXRNb250aChkKSArIFwiIFwiICsgdGhpcy5hZGFwdGVyLmZvcm1hdFllYXIoZCk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICB9XG4gIGdldCBjYW5TdWJtaXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICF0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdICYmXG4gICAgICAhdGhpcy5lcnJvcnMubGVuZ3RoICYmXG4gICAgICB0aGlzLnBlbmRpbmdWYWx1ZSAhPT0gbnVsbFxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBibGFuayhkYXk6IG51bWJlcik6IERyYWZ0IHtcbiAgICBjb25zdCBzYWZlID0gTWF0aC5tYXgoXG4gICAgICB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5LFxuICAgICAgTWF0aC5taW4odGhpcy5sYXN0U3VwcG9ydGVkRGF5LCBkYXkpLFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGU6IHRoaXMuYWRhcHRlci5lcG9jaERheVRvRGF0ZShzYWZlKSxcbiAgICAgIGhvdXI6IDAsXG4gICAgICBtaW51dGU6IDAsXG4gICAgICBzZWNvbmQ6IDAsXG4gICAgICBwcmVzZW50OiBmYWxzZSxcbiAgICB9O1xuICB9XG4gIGxvYWQodmFsdWU6IFdrbHlQaWNrZXJWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuZHJhZnRzID0gW3RoaXMuYmxhbmsodGhpcy5mb2N1c2VkKSwgdGhpcy5ibGFuayh0aGlzLmZvY3VzZWQpXTtcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gdmFsaWRhdGVTZWxlY3Rpb24odmFsdWUsIHRoaXMsIHRoaXMuYWRhcHRlcik7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmICF2YWxpZGF0aW9uLmxlbmd0aCkge1xuICAgICAgY29uc3QgdmFsdWVzID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gW3ZhbHVlXSA6IHZhbHVlO1xuICAgICAgdmFsdWVzLmZvckVhY2goKHYsIGkpID0+IHtcbiAgICAgICAgY29uc3QgZCA9IGRlY29kZUlzbyh2KTtcbiAgICAgICAgdGhpcy5kcmFmdHNbaV0gPSB7XG4gICAgICAgICAgZGF0ZTogdGhpcy5oYXNEYXRlXG4gICAgICAgICAgICA/IHRoaXMuYWRhcHRlci5lcG9jaERheVRvRGF0ZShkLmVwb2NoRGF5KVxuICAgICAgICAgICAgOiB0aGlzLmJsYW5rKHRoaXMudG9kYXkpLmRhdGUsXG4gICAgICAgICAgaG91cjogZC5ob3VyLFxuICAgICAgICAgIG1pbnV0ZTogZC5taW51dGUsXG4gICAgICAgICAgc2Vjb25kOiBkLnNlY29uZCxcbiAgICAgICAgICBwcmVzZW50OiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoaSA9PT0gMCAmJiB0aGlzLmhhc0RhdGUpIHRoaXMuZm9jdXNlZCA9IGQuZXBvY2hEYXk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHZhbGlkYXRpb24ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnBlbmRpbmdWYWx1ZSA9IG51bGw7XG4gICAgICB0aGlzLnJlcG9ydCh2YWxpZGF0aW9uKTtcbiAgICB9IGVsc2UgdGhpcy5jaGVjaygpO1xuICB9XG4gIHdyaXRlVmFsdWUodmFsdWU6IFdrbHlQaWNrZXJWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WYWx1ZV0gPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5sb2FkKHZhbHVlKTtcbiAgICAgIHRoaXMucG9zaXRpb24odGhpcy5mb2N1c2VkLCB0cnVlKTtcbiAgICB9XG4gIH1cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBXa2x5UGlja2VyVmFsdWUpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG4gIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdID0gZGlzYWJsZWQ7XG4gIH1cbiAgdmFsaWRhdGUoX2NvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMubGVuZ3RoID8geyB3a2x5OiB0aGlzLmVycm9ycyB9IDogbnVsbDtcbiAgfVxuICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0b3JDaGFuZ2VkID0gZm47XG4gIH1cbiAgdG91Y2hlZCgpOiB2b2lkIHtcbiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHRoaXMub25Ub3VjaGVkKCkpO1xuICB9XG4gIHByaXZhdGUgcmVwb3J0KGVycm9yczogcmVhZG9ubHkgV2tseVZhbGlkYXRpb25FcnJvcltdKTogdm9pZCB7XG4gICAgY29uc3QgY2hhbmdlZCA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZXJyb3JzKSAhPT0gSlNPTi5zdHJpbmdpZnkoZXJyb3JzKTtcbiAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgdGhpc1tXa2x5UGlja2VyT3V0cHV0c1Byb3BlcnR5S2V5cy5WYWxpZGF0aW9uQ2hhbmdlXS5lbWl0KGVycm9ycyk7XG4gICAgICB0aGlzLnZhbGlkYXRvckNoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgY2hlY2soKTogdm9pZCB7XG4gICAgY29uc3QgcmVzdWx0ID0gdmFsaWRhdGVEcmFmdHMoe1xuICAgICAgZHJhZnRzOiB0aGlzLmRyYWZ0cyxcbiAgICAgIGNvbmZpZ0Vycm9yczogdGhpcy5jb25maWdFcnJvcnMsXG4gICAgICBhZGFwdGVyOiB0aGlzLmFkYXB0ZXIsXG4gICAgICBzZWxlY3Rpb246IHRoaXMsXG4gICAgICBtb2RlOiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0sXG4gICAgICBpc1JhbmdlOiB0aGlzLmlzUmFuZ2UsXG4gICAgICBoYXNEYXRlOiB0aGlzLmhhc0RhdGUsXG4gICAgICBoYXNUaW1lOiB0aGlzLmhhc1RpbWUsXG4gICAgICBzaG93U2Vjb25kczogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNob3dTZWNvbmRzXSxcbiAgICAgIHJlcXVpcmVkOiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuUmVxdWlyZWRdLFxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZ1ZhbHVlID0gcmVzdWx0LnBlbmRpbmdWYWx1ZTtcbiAgICB0aGlzLnJlcG9ydChyZXN1bHQuZXJyb3JzKTtcbiAgfVxuICB0cmFja0RyYWZ0KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIEVuZHBvaW50IGNvbnRyb2xzIGtlZXAgdGhlaXIgaWRlbnRpdHkgYW5kIGZvY3VzIHdoZW4gZHJhZnQgb2JqZWN0cyBzd2FwLlxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuICBwcml2YXRlIG9yZGVyRHJhZnRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1JhbmdlIHx8ICF0aGlzLmRyYWZ0cy5ldmVyeSgoZHJhZnQpID0+IGRyYWZ0LnByZXNlbnQpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuZHJhZnRzLnNvbWUoKGRyYWZ0KSA9PiBkcmFmdC51bnN1cHBvcnRlZEVwb2NoRGF5ICE9PSB1bmRlZmluZWQpKVxuICAgICAgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhID0gdGhpcy5kcmFmdHNbMF0sXG4gICAgICAgIGIgPSB0aGlzLmRyYWZ0c1sxXTtcbiAgICAgIGNvbnN0IGtleSA9IChkOiBEcmFmdCkgPT5cbiAgICAgICAgdGhpcy5hZGFwdGVyLmRhdGVUb0Vwb2NoRGF5KGQuZGF0ZSkgKiA4NjQwMCArXG4gICAgICAgIChkLmhvdXIgfHwgMCkgKiAzNjAwICtcbiAgICAgICAgKGQubWludXRlIHx8IDApICogNjAgK1xuICAgICAgICAoZC5zZWNvbmQgfHwgMCk7XG4gICAgICBpZiAoa2V5KGEpID4ga2V5KGIpKSB0aGlzLmRyYWZ0cyA9IFtiLCBhXTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICAvLyBJbXBvc3NpYmxlIG9yIGluY29tcGxldGUgZGF0ZXMgcmVtYWluIGVkaXRhYmxlIHVudGlsIGNvcnJlY3RlZC5cbiAgICB9XG4gIH1cbiAgZmluaXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdKSByZXR1cm47XG4gICAgdGhpcy5vcmRlckRyYWZ0cygpO1xuICAgIGlmICh0aGlzLnZpZXdNb2RlID09PSBcIm1hbnVhbFwiICYmIHRoaXMuaGFzRGF0ZSkgdGhpcy5wb3NpdGlvbk9uTWFudWFsRGF0ZSgpO1xuICAgIHRoaXMuY2hlY2soKTtcbiAgICBpZiAodGhpcy5wcmVzZW50YXRpb24gPT09IFwiaW5saW5lXCIgJiYgdGhpcy5jYW5TdWJtaXQpIHRoaXMuY29tbWl0KCk7XG4gIH1cbiAgcHJpdmF0ZSBjb21taXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhblN1Ym1pdCkgcmV0dXJuO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLnBlbmRpbmdWYWx1ZTtcbiAgICBpZiAoXG4gICAgICBKU09OLnN0cmluZ2lmeShuZXh0KSAhPT1cbiAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WYWx1ZV0pXG4gICAgKSB7XG4gICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWVdID0gbmV4dDtcbiAgICAgIHRoaXMuZW1pdHRlZFZhbHVlID0gSlNPTi5zdHJpbmdpZnkobmV4dCk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKG5leHQpO1xuICAgICAgdGhpc1tXa2x5UGlja2VyT3V0cHV0c1Byb3BlcnR5S2V5cy5WYWx1ZUNoYW5nZV0uZW1pdChuZXh0KTtcbiAgICB9XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuICBzdWJtaXQocmVhc29uOiBXa2x5Q2xvc2VSZWFzb24gPSBcInN1Ym1pdFwiKTogdm9pZCB7XG4gICAgdGhpcy5jaGVjaygpO1xuICAgIGlmICghdGhpcy5jYW5TdWJtaXQpIHJldHVybjtcbiAgICB0aGlzLmNvbW1pdCgpO1xuICAgIGlmICh0aGlzLnByZXNlbnRhdGlvbiA9PT0gXCJ0cmFuc2llbnRcIilcbiAgICAgIHRoaXNbV2tseVBpY2tlck91dHB1dHNQcm9wZXJ0eUtleXMuQ2xvc2VkXS5lbWl0KHJlYXNvbik7XG4gIH1cbiAgY2FuY2VsKHJlYXNvbjogV2tseUNsb3NlUmVhc29uID0gXCJjbG9zZS1idXR0b25cIik6IHZvaWQge1xuICAgIGlmICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdKSByZXR1cm47XG4gICAgdGhpcy5sb2FkKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WYWx1ZV0pO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpc1tXa2x5UGlja2VyT3V0cHV0c1Byb3BlcnR5S2V5cy5DbG9zZWRdLmVtaXQocmVhc29uKTtcbiAgfVxuICBub3coKTogdm9pZCB7XG4gICAgaWYgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF0pIHJldHVybjtcbiAgICBjb25zdCBuID0gdGhpcy5jbG9jay5ub3coKTtcbiAgICBjb25zdCBkYXkgPSBNYXRoLmZsb29yKG4uZ2V0VGltZSgpIC8gODY0MDAwMDApO1xuICAgIHRoaXMuZHJhZnRzID0gWzAsIDFdLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAuLi50aGlzLmNsb2NrRHJhZnQoZGF5LCBuKSxcbiAgICAgIHByZXNlbnQ6IGluZGV4ID09PSAwIHx8IHRoaXMuaXNSYW5nZSxcbiAgICB9KSk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5oYXNEYXRlICYmXG4gICAgICAoZGF5IDwgdGhpcy5maXJzdFN1cHBvcnRlZERheSB8fCBkYXkgPiB0aGlzLmxhc3RTdXBwb3J0ZWREYXkpXG4gICAgKSB7XG4gICAgICB0aGlzLnJlcG9ydChbZXJyb3IoXCJ1bnN1cHBvcnRlZC1hZGFwdGVyLWRhdGVcIiwgZGF5KV0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZvY3VzZWQgPSBkYXk7XG4gICAgdGhpcy5wb3NpdGlvbihkYXksIHRydWUpO1xuICAgIHRoaXMuY2hlY2soKTtcbiAgICB0aGlzLnN1Ym1pdChcIm5vd1wiKTtcbiAgfVxuICBwcml2YXRlIGNsb2NrRHJhZnQoZGF5OiBudW1iZXIsIG5vdzogRGF0ZSk6IERyYWZ0IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5ibGFuayhkYXkpLFxuICAgICAgaG91cjogbm93LmdldFVUQ0hvdXJzKCksXG4gICAgICBtaW51dGU6XG4gICAgICAgIE1hdGguZmxvb3IoXG4gICAgICAgICAgbm93LmdldFVUQ01pbnV0ZXMoKSAvIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5NaW51dGVTdGVwXSxcbiAgICAgICAgKSAqIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5NaW51dGVTdGVwXSxcbiAgICAgIHNlY29uZDogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNob3dTZWNvbmRzXVxuICAgICAgICA/IE1hdGguZmxvb3IoXG4gICAgICAgICAgICBub3cuZ2V0VVRDU2Vjb25kcygpIC8gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNlY29uZFN0ZXBdLFxuICAgICAgICAgICkgKiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuU2Vjb25kU3RlcF1cbiAgICAgICAgOiAwLFxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBpbml0aWFsaXplTWFudWFsUmFuZ2UoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNSYW5nZSB8fFxuICAgICAgIXRoaXMuaGFzRGF0ZSB8fFxuICAgICAgdGhpcy5kcmFmdHMuZXZlcnkoKGRyYWZ0KSA9PiBkcmFmdC5wcmVzZW50KVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBsZXQgc2VlZCA9IHRoaXMuZHJhZnRzLmZpbmQoKGRyYWZ0KSA9PiBkcmFmdC5wcmVzZW50KTtcbiAgICBpZiAoIXNlZWQpIHtcbiAgICAgIGlmICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWVdICE9PSBudWxsKSByZXR1cm47XG4gICAgICBjb25zdCBub3cgPSB0aGlzLmNsb2NrLm5vdygpO1xuICAgICAgY29uc3QgaW5pdGlhbEVwb2NoRGF5ID1cbiAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkluaXRpYWxFcG9jaERheV07XG4gICAgICBjb25zdCBkYXkgPVxuICAgICAgICBpbml0aWFsRXBvY2hEYXkgPT09IG51bGxcbiAgICAgICAgICA/IHRoaXMuZGVmYXVsdHMuaW5pdGlhbEVwb2NoRGF5ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gTWF0aC5mbG9vcihub3cuZ2V0VGltZSgpIC8gODY0MDAwMDApXG4gICAgICAgICAgICA6IHRoaXMuZGVmYXVsdHMuaW5pdGlhbEVwb2NoRGF5XG4gICAgICAgICAgOiBpbml0aWFsRXBvY2hEYXk7XG4gICAgICBzZWVkID0geyAuLi50aGlzLmNsb2NrRHJhZnQoZGF5LCBub3cpLCBwcmVzZW50OiB0cnVlIH07XG4gICAgfVxuICAgIC8vIENvbXBsZXRlIG1pc3NpbmcgZW5kcG9pbnRzIHdpdGhvdXQgcmVwbGFjaW5nIHNlbGVjdGVkIG9yIGludmFsaWQgZHJhZnRzLlxuICAgIGNvbnN0IGluaXRpYWwgPSBzZWVkO1xuICAgIHRoaXMuZHJhZnRzID0gdGhpcy5kcmFmdHMubWFwKChkcmFmdCkgPT5cbiAgICAgIGRyYWZ0LnByZXNlbnQgPyBkcmFmdCA6IHsgLi4uaW5pdGlhbCwgZGF0ZTogeyAuLi5pbml0aWFsLmRhdGUgfSB9LFxuICAgICk7XG4gICAgdGhpcy5maW5pc2goKTtcbiAgICAvLyBQb3NpdGlvbmluZyByZW5kZXJzIGJlZm9yZSB2YWxpZGF0aW9uOyByZWZyZXNoIGNvbXBsZXRpb24gY29udHJvbHMgYWZ0ZXJ3YXJkLlxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgdG9nZ2xlVmlldygpOiB2b2lkIHtcbiAgICBpZiAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSB8fCAhdGhpcy5oYXNEYXRlKSByZXR1cm47XG4gICAgdGhpcy52aWV3TW9kZSA9IHRoaXMudmlld01vZGUgPT09IFwiY2FsZW5kYXJcIiA/IFwibWFudWFsXCIgOiBcImNhbGVuZGFyXCI7XG4gICAgaWYgKHRoaXMudmlld01vZGUgPT09IFwibWFudWFsXCIpIHRoaXMuaW5pdGlhbGl6ZU1hbnVhbFJhbmdlKCk7XG4gICAgaWYgKHRoaXMudmlld01vZGUgPT09IFwiY2FsZW5kYXJcIikgdGhpcy5wb3NpdGlvbk9uTWFudWFsRGF0ZSgpO1xuICAgIHRoaXNbV2tseVBpY2tlck91dHB1dHNQcm9wZXJ0eUtleXMuVmlld01vZGVDaGFuZ2VdLmVtaXQodGhpcy52aWV3TW9kZSk7XG4gICAgaWYgKHRoaXMudmlld01vZGUgPT09IFwiY2FsZW5kYXJcIikgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlc2V0U2Nyb2xsKCkpO1xuICB9XG4gIHByaXZhdGUgcG9zaXRpb25Pbk1hbnVhbERhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgZHJhZnQgPSB0aGlzLmRyYWZ0c1t0aGlzLm1hbnVhbERhdGVFbmRwb2ludF07XG4gICAgaWYgKCFkcmFmdCB8fCAhZHJhZnQucHJlc2VudCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICAvLyBBIHZhbGlkIGRheSBmb2xsb3dzIHRoZSBzZWxlY3Rpb24uIEFuIGltcG9zc2libGUgZGF5IGtlZXBzIGl0cyBkcmFmdFxuICAgICAgLy8gZmllbGRzIGJ1dCBzdGlsbCBzaG93cyB0aGUgY2hvc2VuIG1vbnRoIGluIHRoZSBjYWxlbmRhci5cbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuYWRhcHRlci5kYXRlVG9FcG9jaERheShkcmFmdC5kYXRlKTtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IHRhcmdldDtcbiAgICAgIHRoaXMucG9zaXRpb24odGFyZ2V0LCB0cnVlKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmaXJzdCA9IHRoaXMuYWRhcHRlci5kYXRlVG9FcG9jaERheSh7IC4uLmRyYWZ0LmRhdGUsIGRheTogMSB9KTtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmlyc3Q7XG4gICAgICAgIHRoaXMucG9zaXRpb24oZmlyc3QsIHRydWUpO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9XG4gIH1cbiAgbW9udGhzKGRyYWZ0OiBEcmFmdCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRNb250aHMoZHJhZnQuZGF0ZS55ZWFyKS5tYXAoKG0pID0+IG0ubGFiZWwpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgbW9udGhDb3VudChkcmFmdDogRHJhZnQpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1vbnRocyhkcmFmdCkubGVuZ3RoIHx8IDEyO1xuICB9XG4gIGdldCBpbkRheXMoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIGRyYWZ0RGF5RGlmZmVyZW5jZSh0aGlzLmRyYWZ0cywgdGhpcy5hZGFwdGVyKTtcbiAgfVxuICBnZXQgaW5EYXlzTGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXlzID0gdGhpcy5pbkRheXM7XG4gICAgcmV0dXJuIHRoaXMudChcImluRGF5c1wiKS5yZXBsYWNlKFxuICAgICAgL3t7XFxzKmRheXNcXHMqfX0vZyxcbiAgICAgIGRheXMgPT09IG51bGxcbiAgICAgICAgPyB0aGlzLnQoXCJkYXlzVW5hdmFpbGFibGVcIilcbiAgICAgICAgOiBuZXcgSW50bC5OdW1iZXJGb3JtYXQodGhpcy5lZmZlY3RpdmVMb2NhbGUsIHtcbiAgICAgICAgICAgIHVzZUdyb3VwaW5nOiBmYWxzZSxcbiAgICAgICAgICB9KS5mb3JtYXQoZGF5cyksXG4gICAgKTtcbiAgfVxuICBnZXQgcmVzdWx0aW5nRW5kRGF0ZSgpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkcmFmdCA9IHRoaXMuZHJhZnRzWzFdO1xuICAgICAgaWYgKFxuICAgICAgICBkcmFmdC51bnN1cHBvcnRlZEVwb2NoRGF5ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgdGhpcy5hZGFwdGVyLnZhbGlkYXRlRGF0ZShkcmFmdC5kYXRlKS5sZW5ndGhcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLmFkYXB0ZXIuZm9ybWF0RGF5KGRyYWZ0LmRhdGUpLFxuICAgICAgICB0aGlzLmFkYXB0ZXIuZm9ybWF0TW9udGgoZHJhZnQuZGF0ZSksXG4gICAgICAgIHRoaXMuYWRhcHRlci5mb3JtYXRZZWFyKGRyYWZ0LmRhdGUpLFxuICAgICAgXS5qb2luKFwiIFwiKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH1cbiAgdG9nZ2xlRW5kVmlldyh2aWV3OiBcImRhdGVcIiB8IFwiZGF5c1wiKTogdm9pZCB7XG4gICAgaWYgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF0pIHJldHVybjtcbiAgICB0aGlzLmVuZFZpZXcgPSB2aWV3O1xuICB9XG4gIGRheXModmFsdWU6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSkgcmV0dXJuO1xuICAgIHRoaXMubWFudWFsRGF0ZUVuZHBvaW50ID0gMTtcbiAgICBzZXREcmFmdERheURpZmZlcmVuY2UodGhpcy5kcmFmdHMsIHRoaXMuYWRhcHRlciwgdmFsdWUpO1xuICAgIHRoaXMuY2hlY2soKTtcbiAgfVxuICBmaWVsZChpbmRleDogbnVtYmVyLCBmaWVsZDogc3RyaW5nLCB2YWx1ZTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdKSByZXR1cm47XG4gICAgY29uc3QgZHJhZnQgPSB0aGlzLmRyYWZ0c1tpbmRleF07XG4gICAgZHJhZnQucHJlc2VudCA9IHRydWU7XG4gICAgaWYgKGZpZWxkID09PSBcImRheVwiIHx8IGZpZWxkID09PSBcInllYXJcIiB8fCBmaWVsZCA9PT0gXCJtb250aFwiKSB7XG4gICAgICB0aGlzLm1hbnVhbERhdGVFbmRwb2ludCA9IGluZGV4O1xuICAgICAgZGVsZXRlIGRyYWZ0LnVuc3VwcG9ydGVkRXBvY2hEYXk7XG4gICAgICBsZXQgZGF0ZSA9IHsgLi4uZHJhZnQuZGF0ZSwgW2ZpZWxkXTogdmFsdWUgfSBhcyBXa2x5Q2FsZW5kYXJEYXRlO1xuICAgICAgaWYgKGZpZWxkID09PSBcIm1vbnRoXCIpIHtcbiAgICAgICAgbGV0IG1vbnRoO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1vbnRoID0gdGhpcy5hZGFwdGVyXG4gICAgICAgICAgICAuZ2V0TW9udGhzKGRhdGUueWVhcilcbiAgICAgICAgICAgIC5maW5kKChtKSA9PiBtLm1vbnRoID09PSB2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIGRhdGUgPSB7IC4uLmRhdGUsIG1vbnRoQ29kZTogbW9udGggPyBtb250aC5tb250aENvZGUgOiBcIlwiIH07XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQgPT09IFwieWVhclwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbW9udGhzID0gdGhpcy5hZGFwdGVyLmdldE1vbnRocyh2YWx1ZSk7XG4gICAgICAgICAgY29uc3QgbW9udGggPSBtb250aHMuZmluZCgobSkgPT4gbS5tb250aENvZGUgPT09IGRhdGUubW9udGhDb2RlKTtcbiAgICAgICAgICBpZiAobW9udGgpIGRhdGUgPSB7IC4uLmRhdGUsIG1vbnRoOiBtb250aC5tb250aCB9O1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgfVxuICAgICAgZHJhZnQuZGF0ZSA9IGRhdGU7XG4gICAgfSBlbHNlIGlmIChmaWVsZCA9PT0gXCJob3VyXCIgJiYgdGhpcy5lZmZlY3RpdmVIb3VyQ3ljbGUgPT09IFwiaDEyXCIpXG4gICAgICBkcmFmdC5ob3VyID1cbiAgICAgICAgdmFsdWUgPT09IG51bGxcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IHZhbHVlID49IDEgJiYgdmFsdWUgPD0gMTJcbiAgICAgICAgICAgID8gKHZhbHVlICUgMTIpICsgKChkcmFmdC5ob3VyIHx8IDApID49IDEyID8gMTIgOiAwKVxuICAgICAgICAgICAgOiAyNCArIHZhbHVlO1xuICAgIGVsc2UgKGRyYWZ0IGFzIGFueSlbZmllbGRdID0gdmFsdWU7XG4gICAgdGhpcy5jaGVjaygpO1xuICB9XG4gIGRpc3BsYXlIb3VyKGRyYWZ0OiBEcmFmdCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiBkcmFmdC5ob3VyID09PSBudWxsXG4gICAgICA/IG51bGxcbiAgICAgIDogdGhpcy5lZmZlY3RpdmVIb3VyQ3ljbGUgPT09IFwiaDEyXCJcbiAgICAgICAgPyBkcmFmdC5ob3VyICUgMTIgfHwgMTJcbiAgICAgICAgOiBkcmFmdC5ob3VyO1xuICB9XG4gIHBlcmlvZChpbmRleDogbnVtYmVyLCBwZXJpb2Q6IFwiYW1cIiB8IFwicG1cIiB8IFwiMjRcIik6IHZvaWQge1xuICAgIGlmICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdKSByZXR1cm47XG4gICAgaWYgKHBlcmlvZCA9PT0gXCIyNFwiKSB0aGlzLmVmZmVjdGl2ZUhvdXJDeWNsZSA9IFwiaDI0XCI7XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmVmZmVjdGl2ZUhvdXJDeWNsZSA9IFwiaDEyXCI7XG4gICAgICB0aGlzLmRyYWZ0c1tpbmRleF0uaG91ciA9XG4gICAgICAgICgodGhpcy5kcmFmdHNbaW5kZXhdLmhvdXIgfHwgMCkgJSAxMikgKyAocGVyaW9kID09PSBcInBtXCIgPyAxMiA6IDApO1xuICAgICAgdGhpcy5kcmFmdHNbaW5kZXhdLnByZXNlbnQgPSB0cnVlO1xuICAgICAgdGhpcy5maW5pc2goKTtcbiAgICB9XG4gIH1cbiAgc2VsZWN0ZWQoZGF5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kcmFmdHMuc29tZSgoZCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGQucHJlc2VudCAmJiB0aGlzLmFkYXB0ZXIuZGF0ZVRvRXBvY2hEYXkoZC5kYXRlKSA9PT0gZGF5O1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgaW5SYW5nZShkYXk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc1JhbmdlIHx8ICF0aGlzLmRyYWZ0cy5ldmVyeSgoZCkgPT4gZC5wcmVzZW50KSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhID0gdGhpcy5hZGFwdGVyLmRhdGVUb0Vwb2NoRGF5KHRoaXMuZHJhZnRzWzBdLmRhdGUpLFxuICAgICAgICBiID0gdGhpcy5hZGFwdGVyLmRhdGVUb0Vwb2NoRGF5KHRoaXMuZHJhZnRzWzFdLmRhdGUpO1xuICAgICAgcmV0dXJuIGRheSA+IE1hdGgubWluKGEsIGIpICYmIGRheSA8IE1hdGgubWF4KGEsIGIpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgZGF5RGlzYWJsZWQoZGF5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoZGF5IDwgdGhpcy5maXJzdFN1cHBvcnRlZERheSB8fCBkYXkgPiB0aGlzLmxhc3RTdXBwb3J0ZWREYXkpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuYWRhcHRlci5lcG9jaERheVRvRGF0ZShkYXkpO1xuICAgICAgY29uc3QgaXNEYXRlRGlzYWJsZWQgPSB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuSXNEYXRlRGlzYWJsZWRdO1xuICAgICAgaWYgKFxuICAgICAgICBpc0RhdGVEaXNhYmxlZCAmJlxuICAgICAgICBpc0RhdGVEaXNhYmxlZChkYXksIHtcbiAgICAgICAgICBtb2RlOiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0sXG4gICAgICAgICAgZW5kcG9pbnQ6IHRoaXMuaXNSYW5nZVxuICAgICAgICAgICAgPyB0aGlzLmRyYWZ0c1swXT8ucHJlc2VudCAmJiAhdGhpcy5kcmFmdHNbMV0/LnByZXNlbnRcbiAgICAgICAgICAgICAgPyBcImVuZFwiXG4gICAgICAgICAgICAgIDogXCJzdGFydFwiXG4gICAgICAgICAgICA6IFwic2luZ2xlXCIsXG4gICAgICAgICAgY2FsZW5kYXJEYXRlOiBkYXRlLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNvbnN0IG1pbiA9IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5NaW5dO1xuICAgICAgY29uc3QgbWF4ID0gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1heF07XG4gICAgICBpZiAobWluICYmIGRheSA8IGRlY29kZUlzbyhtaW4pLmVwb2NoRGF5KSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChtYXggJiYgZGF5ID4gZGVjb2RlSXNvKG1heCkuZXBvY2hEYXkpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICBzZWxlY3QoZGF5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSB8fCB0aGlzLmRheURpc2FibGVkKGRheSkpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5mb2N1c2VkID0gZGF5O1xuICAgIGNvbnN0IGluZGV4ID1cbiAgICAgIHRoaXMuaXNSYW5nZSAmJiB0aGlzLmRyYWZ0c1swXS5wcmVzZW50ICYmICF0aGlzLmRyYWZ0c1sxXS5wcmVzZW50ID8gMSA6IDA7XG4gICAgaWYgKHRoaXMuaXNSYW5nZSAmJiBpbmRleCA9PT0gMCkgdGhpcy5kcmFmdHNbMV0ucHJlc2VudCA9IGZhbHNlO1xuICAgIGRlbGV0ZSB0aGlzLmRyYWZ0c1tpbmRleF0udW5zdXBwb3J0ZWRFcG9jaERheTtcbiAgICB0aGlzLmRyYWZ0c1tpbmRleF0uZGF0ZSA9IHRoaXMuYWRhcHRlci5lcG9jaERheVRvRGF0ZShkYXkpO1xuICAgIHRoaXMuZHJhZnRzW2luZGV4XS5wcmVzZW50ID0gdHJ1ZTtcbiAgICB0aGlzLm9yZGVyRHJhZnRzKCk7XG4gICAgdGhpcy5yZW5kZXJSb3dzKCk7XG4gICAgdGhpcy5maW5pc2goKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLnByZXNlbnRhdGlvbiA9PT0gXCJ0cmFuc2llbnRcIiAmJlxuICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1vZGVdID09PSBcImRhdGVcIiAmJlxuICAgICAgdGhpcy52aWV3TW9kZSA9PT0gXCJjYWxlbmRhclwiXG4gICAgKVxuICAgICAgdGhpcy5zdWJtaXQoXCJhdXRvLXN1Ym1pdFwiKTtcbiAgfVxuICBrZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGRheTogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IGRlbHRhID0gMDtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIkFycm93TGVmdFwiKSBkZWx0YSA9IC0xO1xuICAgIGlmIChldmVudC5rZXkgPT09IFwiQXJyb3dSaWdodFwiKSBkZWx0YSA9IDE7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd1VwXCIpIGRlbHRhID0gLTc7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd0Rvd25cIikgZGVsdGEgPSA3O1xuICAgIGlmIChldmVudC5rZXkgPT09IFwiUGFnZVVwXCIpXG4gICAgICBkZWx0YSA9IC03ICogKGV2ZW50LnNoaWZ0S2V5ID8gdGhpcy52aXNpYmxlQ291bnQgOiAxKTtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIlBhZ2VEb3duXCIpXG4gICAgICBkZWx0YSA9IDcgKiAoZXZlbnQuc2hpZnRLZXkgPyB0aGlzLnZpc2libGVDb3VudCA6IDEpO1xuICAgIGlmIChldmVudC5rZXkgPT09IFwiSG9tZVwiKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zY3JvbGxUb0Vwb2NoRGF5KHRoaXMudG9kYXksIHsgZm9jdXM6IHRydWUgfSk7XG4gICAgfVxuICAgIGlmIChkZWx0YSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGRheSArIGRlbHRhO1xuICAgICAgaWYgKHRhcmdldCA+PSB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5ICYmIHRhcmdldCA8PSB0aGlzLmxhc3RTdXBwb3J0ZWREYXkpXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9FcG9jaERheSh0YXJnZXQsIHsgZm9jdXM6IHRydWUgfSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcG9zaXRpb24oXG4gICAgZGF5OiBudW1iZXIsXG4gICAgcHJlc2V0ID0gZmFsc2UsXG4gICAgb3B0aW9uczogV2tseUp1bXBPcHRpb25zID0ge30sXG4gICk6IHZvaWQge1xuICAgIGRheSA9IE1hdGgubWF4KFxuICAgICAgdGhpcy5maXJzdFN1cHBvcnRlZERheSxcbiAgICAgIE1hdGgubWluKHRoaXMubGFzdFN1cHBvcnRlZERheSwgZGF5KSxcbiAgICApO1xuICAgIHRoaXMuYW5jaG9yV2VlayA9IGFic29sdXRlV2Vla09mKGRheSwgdGhpcy5lZmZlY3RpdmVPZmZzZXQpO1xuICAgIGNvbnN0IHZpZXdwb3J0UHJlc2V0ID0gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZpZXdwb3J0UHJlc2V0XTtcbiAgICB0aGlzLmNsaXBNb250aCA9IHByZXNldCAmJiB2aWV3cG9ydFByZXNldC5raW5kID09PSBcImZ1bGwtbW9udGhcIjtcbiAgICBpZiAocHJlc2V0ICYmIHZpZXdwb3J0UHJlc2V0LmtpbmQgIT09IFwid2Vla3NcIikge1xuICAgICAgY29uc3QgZCA9IHRoaXMuYWRhcHRlci5lcG9jaERheVRvRGF0ZShkYXkpO1xuICAgICAgdGhpcy5pbml0aWFsTW9udGggPSBkLnllYXIgKyBcIi9cIiArIGQubW9udGhDb2RlO1xuICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gY2FsZW5kYXJNb250aEJvdW5kcyh0aGlzLmFkYXB0ZXIsIGRheSk7XG4gICAgICB0aGlzLmZpcnN0V2VlayA9IGFic29sdXRlV2Vla09mKHN0YXJ0LCB0aGlzLmVmZmVjdGl2ZU9mZnNldCk7XG4gICAgICB0aGlzLnZpc2libGVDb3VudCA9XG4gICAgICAgIGFic29sdXRlV2Vla09mKGVuZCwgdGhpcy5lZmZlY3RpdmVPZmZzZXQpIC0gdGhpcy5maXJzdFdlZWsgKyAxO1xuICAgICAgaWYgKFxuICAgICAgICB2aWV3cG9ydFByZXNldC5raW5kID09PSBcImZ1bGwtbW9udGgtYW5kLWFyb3VuZFwiICYmXG4gICAgICAgICF0aGlzLmNvbmZpZ0Vycm9ycy5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICBjb25zdCBiZWZvcmUgPSB2aWV3cG9ydFByZXNldC5leHRyYVdlZWtzQmVmb3JlIHx8IDAsXG4gICAgICAgICAgYWZ0ZXIgPSB2aWV3cG9ydFByZXNldC5leHRyYVdlZWtzQWZ0ZXIgfHwgMDtcbiAgICAgICAgdGhpcy5maXJzdFdlZWsgLT0gYmVmb3JlO1xuICAgICAgICB0aGlzLnZpc2libGVDb3VudCArPSBiZWZvcmUgKyBhZnRlcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZpZXdwb3J0UHJlc2V0LmtpbmQgPT09IFwid2Vla3NcIilcbiAgICAgICAgdGhpcy52aXNpYmxlQ291bnQgPSB0aGlzLmNvbmZpZ0Vycm9ycy5sZW5ndGhcbiAgICAgICAgICA/IDZcbiAgICAgICAgICA6IHZpZXdwb3J0UHJlc2V0LnZpc2libGVXZWVrQ291bnQ7XG4gICAgICB0aGlzLmZpcnN0V2VlayA9XG4gICAgICAgIHRoaXMuYW5jaG9yV2VlayAtXG4gICAgICAgIChvcHRpb25zLmFsaWduID09PSBcInN0YXJ0XCJcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IG9wdGlvbnMuYWxpZ24gPT09IFwiZW5kXCJcbiAgICAgICAgICAgID8gdGhpcy52aXNpYmxlQ291bnQgLSAxXG4gICAgICAgICAgICA6IE1hdGguZmxvb3IodGhpcy52aXNpYmxlQ291bnQgLyAyKSk7XG4gICAgfVxuICAgIHRoaXMuZmlyc3RXZWVrID0gdGhpcy5jbGFtcEZpcnN0V2Vlayh0aGlzLmZpcnN0V2Vlayk7XG4gICAgdGhpcy5iYXNlV2VlayA9IHRoaXMuZmlyc3RXZWVrIC0gMTAwMDtcbiAgICB0aGlzLnJlbmRlclJvd3MoKTtcbiAgICAvLyBBcHBseSB0aGUgbmV3IHJ1bndheSBiZWZvcmUgd3JpdGluZyBzY3JvbGxUb3Agb3IgbG9jYXRpbmcgYSBmb2N1cyB0YXJnZXQuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5yZXNldFNjcm9sbCgpO1xuICB9XG4gIHByaXZhdGUgcmVzZXRTY3JvbGwoKTogdm9pZCB7XG4gICAgLy8gUm91bmQgd2VlayBib3VuZGFyaWVzIHRvIGF2b2lkIHNjcm9sbFRvcCB0cnVuY2F0aW9uIHVuZGVyIENTUyB6b29tLlxuICAgIGlmICh0aGlzLnNjcm9sbGVyKVxuICAgICAgdGhpcy5zY3JvbGxlci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IE1hdGgucm91bmQoMTAwMCAqIHRoaXMucm93SGVpZ2h0KTtcbiAgfVxuICBzY3JvbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLnNuYXBQZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNjaGVkdWxlU25hcCgpO1xuICAgIC8vIFF1YW50aXplIGRpc3BsYWNlbWVudCBhcm91bmQgdGhlIHJlc2V0IHBvaW50LCBlcXVhbGx5IGluIGJvdGggZGlyZWN0aW9ucy5cbiAgICBjb25zdCByZWxhdGl2ZVJvd3MgPSBlbGVtZW50LnNjcm9sbFRvcCAvIHRoaXMucm93SGVpZ2h0IC0gMTAwMDtcbiAgICBjb25zdCBpbmRleCA9XG4gICAgICAxMDAwICsgTWF0aC5zaWduKHJlbGF0aXZlUm93cykgKiBNYXRoLnJvdW5kKE1hdGguYWJzKHJlbGF0aXZlUm93cykpO1xuICAgIGNvbnN0IHJlcXVlc3RlZEZpcnN0ID0gdGhpcy5iYXNlV2VlayArIGluZGV4O1xuICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5jbGFtcEZpcnN0V2VlayhyZXF1ZXN0ZWRGaXJzdCk7XG4gICAgaWYgKHJlcXVlc3RlZEZpcnN0ICE9PSBmaXJzdCkge1xuICAgICAgZWxlbWVudC5zY3JvbGxUb3AgPSBNYXRoLnJvdW5kKChmaXJzdCAtIHRoaXMuYmFzZVdlZWspICogdGhpcy5yb3dIZWlnaHQpO1xuICAgIH1cbiAgICBpZiAoZmlyc3QgPT09IHRoaXMuZmlyc3RXZWVrKSByZXR1cm47XG4gICAgdGhpcy5jbGlwTW9udGggPSBmYWxzZTtcbiAgICB0aGlzLmZpcnN0V2VlayA9IGZpcnN0O1xuICAgIHRoaXMuYW5jaG9yV2VlayA9IGZpcnN0ICsgTWF0aC5mbG9vcih0aGlzLnZpc2libGVDb3VudCAvIDIpO1xuICAgIGlmIChpbmRleCA8IDEwMCB8fCBpbmRleCA+IDE5MDApIHtcbiAgICAgIC8vIFByZXNlcnZlIHNpZ25lZCBkaXNwbGFjZW1lbnQgZnJvbSB0aGlzIHdlZWs7IG1vZHVsbyB0dXJucyBmcmFjdGlvbmFsXG4gICAgICAvLyByb3VuZGluZyBqdXN0IGJlbG93IGEgYm91bmRhcnkgaW50byBhbG1vc3QgYSBmdWxsIHJvdyBhZnRlciByZWJhc2luZy5cbiAgICAgIGNvbnN0IG9mZnNldCA9XG4gICAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wIC0gKGZpcnN0IC0gdGhpcy5iYXNlV2VlaykgKiB0aGlzLnJvd0hlaWdodDtcbiAgICAgIHRoaXMuYmFzZVdlZWsgPSBmaXJzdCAtIDEwMDA7XG4gICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IE1hdGgucm91bmQoMTAwMCAqIHRoaXMucm93SGVpZ2h0ICsgb2Zmc2V0KTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJSb3dzKCk7XG4gIH1cbiAgcHJpdmF0ZSBzY2hlZHVsZVNuYXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2Nyb2xsRW5kVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbEVuZFRpbWVyKTtcbiAgICB0aGlzLnNjcm9sbEVuZFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNuYXBXZWVrKCksIDIwMCk7XG4gIH1cbiAgc25hcFdlZWsoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2Nyb2xsRW5kVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbEVuZFRpbWVyKTtcbiAgICB0aGlzLnNjcm9sbEVuZFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIGlmICghdGhpcy5zbmFwUGVuZGluZyB8fCAhdGhpcy5zY3JvbGxlcikgcmV0dXJuO1xuICAgIHRoaXMuc25hcFBlbmRpbmcgPSBmYWxzZTtcbiAgICAvLyBBbGlnbiB0aGUgY3VycmVudCB2aXJ0dWFsIHdlZWsgd2l0aG91dCByZWJ1aWxkaW5nIG9yIHJlYmFzaW5nIGl0cyByb3dzLlxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnNjcm9sbGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgdGFyZ2V0ID0gTWF0aC5yb3VuZChcbiAgICAgICh0aGlzLmZpcnN0V2VlayAtIHRoaXMuYmFzZVdlZWspICogdGhpcy5yb3dIZWlnaHQsXG4gICAgKTtcbiAgICBpZiAoZWxlbWVudC5zY3JvbGxUb3AgIT09IHRhcmdldCkgZWxlbWVudC5zY3JvbGxUb3AgPSB0YXJnZXQ7XG4gIH1cbiAgcHJpdmF0ZSBzaG93Rmlyc3RXZWVrKHdlZWs6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5jbGFtcEZpcnN0V2Vlayh3ZWVrKTtcbiAgICBpZiAoZmlyc3QgPT09IHRoaXMuZmlyc3RXZWVrKSByZXR1cm47XG4gICAgdGhpcy5jbGlwTW9udGggPSBmYWxzZTtcbiAgICB0aGlzLmZpcnN0V2VlayA9IGZpcnN0O1xuICAgIHRoaXMuYW5jaG9yV2VlayA9IGZpcnN0ICsgTWF0aC5mbG9vcih0aGlzLnZpc2libGVDb3VudCAvIDIpO1xuICAgIHRoaXMuYmFzZVdlZWsgPSBmaXJzdCAtIDEwMDA7XG4gICAgdGhpcy5yZW5kZXJSb3dzKCk7XG4gICAgdGhpcy5yZXNldFNjcm9sbCgpO1xuICB9XG4gIGNhbk1vdmVXZWVrKGRlbHRhOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jbGFtcEZpcnN0V2Vlayh0aGlzLmZpcnN0V2VlayArIGRlbHRhKSAhPT0gdGhpcy5maXJzdFdlZWs7XG4gIH1cbiAgbW92ZVdlZWsoZGVsdGE6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSlcbiAgICAgIHRoaXMuc2hvd0ZpcnN0V2Vlayh0aGlzLmZpcnN0V2VlayArIGRlbHRhKTtcbiAgfVxuICBwcml2YXRlIHJlbmRlclJvd3MoKTogdm9pZCB7XG4gICAgLy8gS2VlcCB0aGUgdmlydHVhbCBzY3JvbGwgb2Zmc2V0IGhlcmU7IHJvdyBkYXRhIGlzIHNoYXJlZCBhY3Jvc3MgQW5ndWxhciB2ZXJzaW9ucy5cbiAgICBjb25zdCBvdmVyc2NhbiA9IE1hdGgubWF4KFxuICAgICAgMCxcbiAgICAgIE1hdGgubWluKDUwLCB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuT3ZlcnNjYW5XZWVrc10gfHwgMCksXG4gICAgKTtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuZmlyc3RXZWVrIC0gb3ZlcnNjYW47XG4gICAgdGhpcy5wYWRkaW5nVG9wID0gKHN0YXJ0IC0gdGhpcy5iYXNlV2VlaykgKiB0aGlzLnJvd0hlaWdodDtcbiAgICB0aGlzLnJvd3MgPSBjcmVhdGVXZWVrUm93cyh7XG4gICAgICBnZW5lcmF0b3I6IHRoaXMuZ2VuZXJhdG9yLFxuICAgICAgYWRhcHRlcjogdGhpcy5hZGFwdGVyLFxuICAgICAgc3RhcnRXZWVrOiBzdGFydCxcbiAgICAgIGNvdW50OiB0aGlzLnZpc2libGVDb3VudCArIDIgKiBvdmVyc2NhbixcbiAgICAgIGZpcnN0VmlzaWJsZVdlZWs6IHRoaXMuZmlyc3RXZWVrLFxuICAgICAgZmlyc3RTdXBwb3J0ZWREYXk6IHRoaXMuZmlyc3RTdXBwb3J0ZWREYXksXG4gICAgICBsYXN0U3VwcG9ydGVkRGF5OiB0aGlzLmxhc3RTdXBwb3J0ZWREYXksXG4gICAgICBjbGlwTW9udGg6IHRoaXMuY2xpcE1vbnRoLFxuICAgICAgaW5pdGlhbE1vbnRoOiB0aGlzLmluaXRpYWxNb250aCxcbiAgICAgIHdlZWtMYWJlbE1vZGU6IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrTGFiZWxNb2RlXSxcbiAgICAgIHdlZWtMYWJlbEZvcm1hdHRlcjpcbiAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtMYWJlbEZvcm1hdHRlcl0gfHwgbnVsbCxcbiAgICAgIGlzRGF5RGlzYWJsZWQ6IChkYXkpID0+IHRoaXMuZGF5RGlzYWJsZWQoZGF5KSxcbiAgICB9KTtcbiAgICB0aGlzW1drbHlQaWNrZXJPdXRwdXRzUHJvcGVydHlLZXlzLlZpZXdwb3J0Q2hhbmdlXS5lbWl0KHtcbiAgICAgIGZpcnN0VmlzaWJsZUFic29sdXRlV2VlazogdGhpcy5maXJzdFdlZWssXG4gICAgICBsYXN0VmlzaWJsZUFic29sdXRlV2VlazogdGhpcy5maXJzdFdlZWsgKyB0aGlzLnZpc2libGVDb3VudCAtIDEsXG4gICAgICBhbmNob3JBYnNvbHV0ZVdlZWs6IHRoaXMuYW5jaG9yV2VlayxcbiAgICB9KTtcbiAgfVxuICAvLyBSZXRhaW4gZGF5IERPTSBub2RlcyBhbmQga2V5Ym9hcmQgZm9jdXMgd2hlbiByb3cgbWV0YWRhdGEgaXMgcmVnZW5lcmF0ZWQuXG4gIHRyYWNrQ2VsbChfaTogbnVtYmVyLCBjZWxsOiB7IGVwb2NoRGF5OiBudW1iZXIgfSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGNlbGwuZXBvY2hEYXk7XG4gIH1cbiAgdHJhY2tSb3coX2k6IG51bWJlciwgcm93OiBSb3cpOiBudW1iZXIge1xuICAgIHJldHVybiByb3cud2Vlay5hYnNvbHV0ZVdlZWs7XG4gIH1cbiAgc2Nyb2xsVG9FcG9jaERheShkYXk6IG51bWJlciwgb3B0aW9uczogV2tseUp1bXBPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBpbnRlZ2VyKGRheSk7XG4gICAgdGhpcy5hZGFwdGVyLmVwb2NoRGF5VG9EYXRlKGRheSk7XG4gICAgZGF5ID0gTWF0aC5tYXgoXG4gICAgICB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5LFxuICAgICAgTWF0aC5taW4odGhpcy5sYXN0U3VwcG9ydGVkRGF5LCBkYXkpLFxuICAgICk7XG4gICAgLy8gcG9zaXRpb24gcmVuZGVycyBzeW5jaHJvbm91c2x5OyBwdWJsaXNoIHRoZSB0YWIgc3RvcCBiZWZvcmUgdGhhdCByZW5kZXIuXG4gICAgaWYgKG9wdGlvbnMuZm9jdXMpIHRoaXMuZm9jdXNlZCA9IGRheTtcbiAgICB0aGlzLnBvc2l0aW9uKGRheSwgZmFsc2UsIG9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25zLnNlbGVjdCkgdGhpcy5zZWxlY3QoZGF5KTtcbiAgICBpZiAob3B0aW9ucy5mb2N1cykgdGhpcy5mb2N1c0RheSgpO1xuICB9XG4gIHNjcm9sbFRvQWJzb2x1dGVXZWVrKHdlZWs6IG51bWJlciwgb3B0aW9uczogV2tseUp1bXBPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICAvLyBBIGJvdW5kYXJ5IHdlZWsgY2FuIHN0YXJ0IGJlZm9yZSB0aGUgYWRhcHRlcidzIGZpcnN0IHN1cHBvcnRlZCBkYXkuXG4gICAgY29uc3QgZmlyc3QgPSBmaXJzdEVwb2NoRGF5T2Yod2VlaywgdGhpcy5lZmZlY3RpdmVPZmZzZXQpO1xuICAgIHRoaXMuc2Nyb2xsVG9FcG9jaERheShcbiAgICAgIHdlZWsgPT09IHRoaXMuZmlyc3RTdXBwb3J0ZWRXZWVrXG4gICAgICAgID8gTWF0aC5tYXgoZmlyc3QsIHRoaXMuZmlyc3RTdXBwb3J0ZWREYXkpXG4gICAgICAgIDogZmlyc3QsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIH1cbiAgc2Nyb2xsVG9DYWxlbmRhckRhdGUoXG4gICAgZGF0ZTogV2tseUNhbGVuZGFyRGF0ZSxcbiAgICBvcHRpb25zOiBXa2x5SnVtcE9wdGlvbnMgPSB7fSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zY3JvbGxUb0Vwb2NoRGF5KHRoaXMuYWRhcHRlci5kYXRlVG9FcG9jaERheShkYXRlKSwgb3B0aW9ucyk7XG4gIH1cbiAgc2Nyb2xsVG9WYWx1ZSh2YWx1ZTogc3RyaW5nLCBvcHRpb25zOiBXa2x5SnVtcE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsVG9FcG9jaERheShkZWNvZGVJc28odmFsdWUpLmVwb2NoRGF5LCBvcHRpb25zKTtcbiAgfVxuICBmb2N1c0RheSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYnJvd3NlcikgcmV0dXJuO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIGNvbnN0IGRheSA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICdbZGF0YS1kYXk9XCInICsgdGhpcy5mb2N1c2VkICsgJ1wiXScsXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgZmFsbGJhY2sgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBcImJ1dHRvbjpub3QoOmRpc2FibGVkKSxpbnB1dDpub3QoOmRpc2FibGVkKVwiLFxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIChkYXkgfHwgZmFsbGJhY2spPy5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxzZWN0aW9uXG4gIGNsYXNzPVwid2tseVwiXG4gIFthdHRyLmRpcl09XCJkaXJlY3Rpb25cIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5BcmlhTGFiZWxdIHx8ICdEYXRlIGFuZCB0aW1lIHBpY2tlcidcbiAgXCJcbiAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJ0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuQXJpYURlc2NyaWJlZEJ5XVwiXG4gIChmb2N1c291dCk9XCJ0b3VjaGVkKClcIlxuPlxuICA8aGVhZGVyIGNsYXNzPVwidG9vbGJhclwiPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiaGFzRGF0ZVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFtkaXNhYmxlZF09XCJ0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidCh2aWV3TW9kZSA9PT0gJ2NhbGVuZGFyJyA/ICdtYW51YWwnIDogJ2NhbGVuZGFyJylcIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZVZpZXcoKVwiXG4gICAgPlxuICAgICAge3sgdmlld01vZGUgPT09IFwiY2FsZW5kYXJcIiA/IFwi4pi3XCIgOiBcIuKWplwiIH19XG4gICAgPC9idXR0b24+XG4gICAgPHNwYW4gKm5nSWY9XCJoYXNEYXRlXCIgY2xhc3M9XCJ5ZWFyLWNvbnRyb2xcIj57eyB0aXRsZSB9fTwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cInNwYWNlclwiPjwvc3BhblxuICAgID48YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwibm93XCJcbiAgICAgIFtkaXNhYmxlZF09XCJ0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdXCJcbiAgICAgIChjbGljayk9XCJub3coKVwiXG4gICAgPlxuICAgICAge3sgdChcIm5vd1wiKSB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwicHJlc2VudGF0aW9uID09PSAndHJhbnNpZW50J1wiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFtkaXNhYmxlZF09XCJ0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidCgnY2xvc2UnKVwiXG4gICAgICAoY2xpY2spPVwiY2FuY2VsKClcIlxuICAgID5cbiAgICAgIMOXXG4gICAgPC9idXR0b24+XG4gIDwvaGVhZGVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRGF0ZSAmJiB2aWV3TW9kZSA9PT0gJ2NhbGVuZGFyJ1wiPlxuICAgIDxkaXZcbiAgICAgIHJvbGU9XCJncmlkXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5BcmlhTGFiZWxdIHx8ICdDYWxlbmRhcidcbiAgICAgIFwiXG4gICAgICBbYXR0ci5hcmlhLW11bHRpc2VsZWN0YWJsZV09XCJpc1JhbmdlXCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICBjbGFzcz1cIndlZWstaGVhZFwiXG4gICAgICAgIFtjbGFzcy5uby1sYWJlbF09XCJcbiAgICAgICAgICBjb21wYWN0IHx8XG4gICAgICAgICAgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrTGFiZWxNb2RlXSA9PT0gJ2hpZGRlbicgJiZcbiAgICAgICAgICAgICF0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0xhYmVsRm9ybWF0dGVyXSlcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgIWNvbXBhY3QgJiZcbiAgICAgICAgICAgICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0xhYmVsTW9kZV0gIT09ICdoaWRkZW4nIHx8XG4gICAgICAgICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrTGFiZWxGb3JtYXR0ZXJdKVxuICAgICAgICAgIFwiXG4gICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIldlZWtcIlxuICAgICAgICA+PC9zcGFuXG4gICAgICAgID48c3BhbiAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtkYXlzXCIgcm9sZT1cImNvbHVtbmhlYWRlclwiPnt7IGRheSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAjc2Nyb2xsZXJcbiAgICAgICAgY2xhc3M9XCJ3ZWVrLXNjcm9sbFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwidmlzaWJsZUNvdW50ICogcm93SGVpZ2h0XCJcbiAgICAgICAgKHNjcm9sbCk9XCJzY3JvbGwoJGV2ZW50KVwiXG4gICAgICAgIChzY3JvbGxlbmQpPVwic25hcFdlZWsoKVwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgW3N0eWxlLmhlaWdodC5weF09XCJzY3JvbGxIZWlnaHRcIiBjbGFzcz1cInNjcm9sbC1zcGFjZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dzXCIgW3N0eWxlLnRvcC5weF09XCJwYWRkaW5nVG9wXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2Ygcm93czsgdHJhY2tCeTogdHJhY2tSb3dcIlxuICAgICAgICAgICAgICByb2xlPVwicm93XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ3ZWVrLXJvd1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5uby1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICBjb21wYWN0IHx8XG4gICAgICAgICAgICAgICAgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrTGFiZWxNb2RlXSA9PT1cbiAgICAgICAgICAgICAgICAgICdoaWRkZW4nICYmXG4gICAgICAgICAgICAgICAgICAhdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtMYWJlbEZvcm1hdHRlcl0pXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICFjb21wYWN0ICYmXG4gICAgICAgICAgICAgICAgICAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtMYWJlbE1vZGVdICE9PVxuICAgICAgICAgICAgICAgICAgICAnaGlkZGVuJyB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0xhYmVsRm9ybWF0dGVyXSlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJyb3doZWFkZXJcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwid2Vlay1udW1iZXJcIlxuICAgICAgICAgICAgICAgID57eyByb3cubGFiZWwgfX08L3NwYW5cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICBsZXQgY2VsbCBvZiByb3cuY2VsbHM7XG4gICAgICAgICAgICAgICAgICBsZXQgZGF5SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQ2VsbFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXdlZWtkYXktaW5kZXhdPVwiZGF5SW5kZXhcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY29saW5kZXhdPVwiXG4gICAgICAgICAgICAgICAgICBkYXlJbmRleCArXG4gICAgICAgICAgICAgICAgICAoY29tcGFjdCB8fFxuICAgICAgICAgICAgICAgICAgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrTGFiZWxNb2RlXSA9PT1cbiAgICAgICAgICAgICAgICAgICAgJ2hpZGRlbicgJiZcbiAgICAgICAgICAgICAgICAgICAgIXRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrTGFiZWxGb3JtYXR0ZXJdKVxuICAgICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgICAgOiAyKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJzZWxlY3RlZChjZWxsLmVwb2NoRGF5KVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgIGNlbGwuZGlzYWJsZWQgfHwgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnJhbmdlXT1cImluUmFuZ2UoY2VsbC5lcG9jaERheSlcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiY2VsbC5oaWRkZW5cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5vZGQtbW9udGhdPVwiY2VsbC5kYXRlICYmIGNlbGwuZGF0ZS5tb250aCAlIDIgPT09IDFcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cIidhbm5vdGF0aW9uIGFubm90YXRpb24tLScgKyBkYXlJbmRleFwiPnt7XG4gICAgICAgICAgICAgICAgICBjZWxsLmFubm90YXRpb25cbiAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF5XCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGF5XT1cImNlbGwuZXBvY2hEYXlcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjZWxsLmFjY2Vzc2libGVcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImNlbGwuZXBvY2hEYXkgPT09IHRvZGF5ID8gJ2RhdGUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICBjZWxsLmRpc2FibGVkIHx8IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF1cbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJcbiAgICAgICAgICAgICAgICAgICAgIWNlbGwuaGlkZGVuICYmIGNlbGwuZXBvY2hEYXkgPT09IGZvY3VzZWQgPyAwIDogLTFcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwic2VsZWN0ZWQoY2VsbC5lcG9jaERheSlcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnRvZGF5XT1cImNlbGwuZXBvY2hEYXkgPT09IHRvZGF5XCJcbiAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJmb2N1c2VkID0gY2VsbC5lcG9jaERheVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0KGNlbGwuZXBvY2hEYXkpXCJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImtleSgkZXZlbnQsIGNlbGwuZXBvY2hEYXkpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBjZWxsLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIndlZWstbmF2aWdhdGlvblwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF0gfHwgIWNhbk1vdmVXZWVrKC0xKVxuICAgICAgICBcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ3ByZXZpb3VzJylcIlxuICAgICAgICAoY2xpY2spPVwibW92ZVdlZWsoLTEpXCJcbiAgICAgID5cbiAgICAgICAg4oaRPC9idXR0b25cbiAgICAgID48c3Bhbj57eyB0aXRsZSB9fTwvc3BhblxuICAgICAgPjxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdIHx8ICFjYW5Nb3ZlV2VlaygxKVxuICAgICAgICBcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ25leHQnKVwiXG4gICAgICAgIChjbGljayk9XCJtb3ZlV2VlaygxKVwiXG4gICAgICA+XG4gICAgICAgIOKGk1xuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nRm9yPVwibGV0IGRyYWZ0IG9mIGRyYWZ0czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tEcmFmdFwiXG4gID5cbiAgICA8ZmllbGRzZXRcbiAgICAgICpuZ0lmPVwiKGkgPT09IDAgfHwgaXNSYW5nZSkgJiYgKGhhc1RpbWUgfHwgdmlld01vZGUgPT09ICdtYW51YWwnKVwiXG4gICAgICBbZGlzYWJsZWRdPVwidGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXVwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImlzUmFuZ2UgPyB0KGkgPT09IDAgPyAnc3RhcnQnIDogJ2VuZCcpIDogbnVsbFwiXG4gICAgPlxuICAgICAgPGxlZ2VuZCAqbmdJZj1cImlzUmFuZ2VcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICBpID09PSAxICYmIGhhc0RhdGUgJiYgdmlld01vZGUgPT09ICdtYW51YWwnO1xuICAgICAgICAgICAgZWxzZSBlbmRwb2ludExhYmVsXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW5kLXZpZXctdG9nZ2xlXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJlbmRWaWV3ID09PSAnZGF0ZSdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRW5kVmlldygnZGF0ZScpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgdChcImVuZFwiKSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJlbmRWaWV3ID09PSAnZGF5cydcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRW5kVmlldygnZGF5cycpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgaW5EYXlzTGFiZWwgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZW5kcG9pbnRMYWJlbD57e1xuICAgICAgICAgIHQoaSA9PT0gMCA/IFwic3RhcnRcIiA6IFwiZW5kXCIpXG4gICAgICAgIH19PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbGVnZW5kPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIGkgPT09IDEgJiYgaGFzRGF0ZSAmJiB2aWV3TW9kZSA9PT0gJ21hbnVhbCcgJiYgZW5kVmlldyA9PT0gJ2RheXMnXG4gICAgICAgIFwiXG4gICAgICAgIGNsYXNzPVwiZGF0ZS1maWVsZHMgaW4tZGF5cy1maWVsZHNcIlxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInJlc3VsdGluZy1lbmQtZGF0ZVwiIFthdHRyLmFyaWEtbGFiZWxdPVwidCgnZW5kRGF0ZScpXCI+e3tcbiAgICAgICAgICByZXN1bHRpbmdFbmREYXRlXG4gICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8d2tseS1maWVsZFxuICAgICAgICAgIFtsYWJlbF09XCJ0KCdkYXlzJylcIlxuICAgICAgICAgIFtoaWRlTGFiZWxdPVwidHJ1ZVwiXG4gICAgICAgICAgW3ByZXZpb3VzTGFiZWxdPVwidCgnZGF5c1ByZXZpb3VzJylcIlxuICAgICAgICAgIFtuZXh0TGFiZWxdPVwidCgnZGF5c05leHQnKVwiXG4gICAgICAgICAgW2xvY2FsZV09XCJlZmZlY3RpdmVMb2NhbGVcIlxuICAgICAgICAgIFt2YWx1ZV09XCJpbkRheXNcIlxuICAgICAgICAgIFttaW5dPVwiLTk5OTlcIlxuICAgICAgICAgIFttYXhdPVwiOTk5OVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF1cIlxuICAgICAgICAgIFtpbnZhbGlkXT1cIiEhZXJyb3JzLmxlbmd0aFwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImRheXMoJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbXBsZXRlKT1cImZpbmlzaCgpXCJcbiAgICAgICAgPjwvd2tseS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIGhhc0RhdGUgJiYgdmlld01vZGUgPT09ICdtYW51YWwnICYmIChpID09PSAwIHx8IGVuZFZpZXcgPT09ICdkYXRlJylcbiAgICAgICAgXCJcbiAgICAgICAgY2xhc3M9XCJkYXRlLWZpZWxkc1wiXG4gICAgICA+XG4gICAgICAgIDx3a2x5LWZpZWxkXG4gICAgICAgICAgW2xhYmVsXT1cInQoJ2RheScpXCJcbiAgICAgICAgICBbbG9jYWxlXT1cImVmZmVjdGl2ZUxvY2FsZVwiXG4gICAgICAgICAgW3ZhbHVlXT1cImRyYWZ0LmRhdGUuZGF5XCJcbiAgICAgICAgICBbbWluXT1cIjFcIlxuICAgICAgICAgIFttYXhdPVwiMzFcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJ0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdXCJcbiAgICAgICAgICBbaW52YWxpZF09XCIhIWVycm9ycy5sZW5ndGhcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmaWVsZChpLCAnZGF5JywgJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbXBsZXRlKT1cImZpbmlzaCgpXCJcbiAgICAgICAgPjwvd2tseS1maWVsZD5cbiAgICAgICAgPHdrbHktZmllbGRcbiAgICAgICAgICBbbGFiZWxdPVwidCgnbW9udGgnKVwiXG4gICAgICAgICAgW2xvY2FsZV09XCJlZmZlY3RpdmVMb2NhbGVcIlxuICAgICAgICAgIFt2YWx1ZV09XCJkcmFmdC5kYXRlLm1vbnRoXCJcbiAgICAgICAgICBbbWluXT1cIjFcIlxuICAgICAgICAgIFttYXhdPVwibW9udGhDb3VudChkcmFmdClcIlxuICAgICAgICAgIFtsYWJlbHNdPVwibW9udGhzKGRyYWZ0KVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF1cIlxuICAgICAgICAgIFtpbnZhbGlkXT1cIiEhZXJyb3JzLmxlbmd0aFwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZpZWxkKGksICdtb250aCcsICRldmVudClcIlxuICAgICAgICAgIChjb21wbGV0ZSk9XCJmaW5pc2goKVwiXG4gICAgICAgID48L3drbHktZmllbGQ+XG4gICAgICAgIDx3a2x5LWZpZWxkXG4gICAgICAgICAgW2xhYmVsXT1cInQoJ3llYXInKVwiXG4gICAgICAgICAgW2xvY2FsZV09XCJlZmZlY3RpdmVMb2NhbGVcIlxuICAgICAgICAgIFt2YWx1ZV09XCJkcmFmdC5kYXRlLnllYXJcIlxuICAgICAgICAgIFttaW5dPVwiYWRhcHRlci5zdXBwb3J0ZWRZZWFyUmFuZ2VbMF1cIlxuICAgICAgICAgIFttYXhdPVwiYWRhcHRlci5zdXBwb3J0ZWRZZWFyUmFuZ2VbMV1cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJ0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdXCJcbiAgICAgICAgICBbaW52YWxpZF09XCIhIWVycm9ycy5sZW5ndGhcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmaWVsZChpLCAneWVhcicsICRldmVudClcIlxuICAgICAgICAgIChjb21wbGV0ZSk9XCJmaW5pc2goKVwiXG4gICAgICAgID48L3drbHktZmllbGQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJoYXNUaW1lXCJcbiAgICAgICAgY2xhc3M9XCJ0aW1lLWZpZWxkc1wiXG4gICAgICAgIFtjbGFzcy5zZWNvbmRzXT1cInRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5TaG93U2Vjb25kc11cIlxuICAgICAgPlxuICAgICAgICA8d2tseS1maWVsZFxuICAgICAgICAgIFtsYWJlbF09XCJ0KCdob3VyJylcIlxuICAgICAgICAgIFtsb2NhbGVdPVwiZWZmZWN0aXZlTG9jYWxlXCJcbiAgICAgICAgICBbdmFsdWVdPVwiZGlzcGxheUhvdXIoZHJhZnQpXCJcbiAgICAgICAgICBbbWluXT1cImVmZmVjdGl2ZUhvdXJDeWNsZSA9PT0gJ2gxMicgPyAxIDogMFwiXG4gICAgICAgICAgW21heF09XCJlZmZlY3RpdmVIb3VyQ3ljbGUgPT09ICdoMTInID8gMTIgOiAyM1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF1cIlxuICAgICAgICAgIFtpbnZhbGlkXT1cIiEhZXJyb3JzLmxlbmd0aFwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZpZWxkKGksICdob3VyJywgJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbXBsZXRlKT1cImZpbmlzaCgpXCJcbiAgICAgICAgPjwvd2tseS1maWVsZD5cbiAgICAgICAgPHdrbHktZmllbGRcbiAgICAgICAgICBbbGFiZWxdPVwidCgnbWludXRlJylcIlxuICAgICAgICAgIFtsb2NhbGVdPVwiZWZmZWN0aXZlTG9jYWxlXCJcbiAgICAgICAgICBbdmFsdWVdPVwiZHJhZnQubWludXRlXCJcbiAgICAgICAgICBbbWF4XT1cIjU5XCJcbiAgICAgICAgICBbc3RlcF09XCJcbiAgICAgICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5NaW51dGVTdGVwXSA+IDAgJiZcbiAgICAgICAgICAgIDYwICUgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1pbnV0ZVN0ZXBdID09PSAwXG4gICAgICAgICAgICAgID8gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1pbnV0ZVN0ZXBdXG4gICAgICAgICAgICAgIDogMVxuICAgICAgICAgIFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF1cIlxuICAgICAgICAgIFtpbnZhbGlkXT1cIiEhZXJyb3JzLmxlbmd0aFwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZpZWxkKGksICdtaW51dGUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAoY29tcGxldGUpPVwiZmluaXNoKClcIlxuICAgICAgICA+PC93a2x5LWZpZWxkPlxuICAgICAgICA8d2tseS1maWVsZFxuICAgICAgICAgICpuZ0lmPVwidGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNob3dTZWNvbmRzXVwiXG4gICAgICAgICAgW2xhYmVsXT1cInQoJ3NlY29uZCcpXCJcbiAgICAgICAgICBbbG9jYWxlXT1cImVmZmVjdGl2ZUxvY2FsZVwiXG4gICAgICAgICAgW3ZhbHVlXT1cImRyYWZ0LnNlY29uZFwiXG4gICAgICAgICAgW21heF09XCI1OVwiXG4gICAgICAgICAgW3N0ZXBdPVwiXG4gICAgICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuU2Vjb25kU3RlcF0gPiAwICYmXG4gICAgICAgICAgICA2MCAlIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5TZWNvbmRTdGVwXSA9PT0gMFxuICAgICAgICAgICAgICA/IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5TZWNvbmRTdGVwXVxuICAgICAgICAgICAgICA6IDFcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJ0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdXCJcbiAgICAgICAgICBbaW52YWxpZF09XCIhIWVycm9ycy5sZW5ndGhcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmaWVsZChpLCAnc2Vjb25kJywgJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbXBsZXRlKT1cImZpbmlzaCgpXCJcbiAgICAgICAgPjwvd2tseS1maWVsZD5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBlcmlvZFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZUhvdXJDeWNsZSA9PT0gJ2gxMicgfHxcbiAgICAgICAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkhvdXJDeWNsZV0gPT09ICdzd2l0Y2hhYmxlJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF1cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cIlxuICAgICAgICAgICAgICBlZmZlY3RpdmVIb3VyQ3ljbGUgPT09ICdoMTInICYmIChkcmFmdC5ob3VyIHx8IDApIDwgMTJcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAoY2xpY2spPVwicGVyaW9kKGksICdhbScpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB0KFwiYW1cIikgfX08L2J1dHRvblxuICAgICAgICAgID48YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSB8fFxuICAgICAgICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuSG91ckN5Y2xlXSAhPT0gJ3N3aXRjaGFibGUnXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImVmZmVjdGl2ZUhvdXJDeWNsZSA9PT0gJ2gyNCdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInBlcmlvZChpLCAnMjQnKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgMjQ8L2J1dHRvblxuICAgICAgICAgID48YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICBlZmZlY3RpdmVIb3VyQ3ljbGUgPT09ICdoMTInIHx8XG4gICAgICAgICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Ib3VyQ3ljbGVdID09PSAnc3dpdGNoYWJsZSdcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJcbiAgICAgICAgICAgICAgZWZmZWN0aXZlSG91ckN5Y2xlID09PSAnaDEyJyAmJiAoZHJhZnQuaG91ciB8fCAwKSA+PSAxMlxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIChjbGljayk9XCJwZXJpb2QoaSwgJ3BtJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHQoXCJwbVwiKSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZmllbGRzZXQ+XG4gIDwvbmctY29udGFpbmVyPlxuICA8ZGl2IGNsYXNzPVwidmFsaWRhdGlvblwiIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICA8cCAqbmdGb3I9XCJsZXQgZXJyIG9mIGVycm9yc1wiPiEge3sgdChlcnIubWVzc2FnZUtleSkgfX08L3A+XG4gIDwvZGl2PlxuICA8Zm9vdGVyICpuZ0lmPVwic3VibWl0VmlzaWJsZVwiPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJjb25maXJtXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhY2FuU3VibWl0XCJcbiAgICAgIChjbGljayk9XCJzdWJtaXQoKVwiXG4gICAgPlxuICAgICAge3sgdChcImNvbmZpcm1cIikgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9mb290ZXI+XG48L3NlY3Rpb24+XG4iXX0=